Skip to content
This repository has been archived by the owner on Mar 15, 2022. It is now read-only.

Releases: Drumato/peachili

Rust実装に以降中

11 Apr 11:02
Compare
Choose a tag to compare
Pre-release

大量の言語機能が追加されている master だが,
その前にRust実装に以降することにした.
理由としては,以下の通り.

  • そもそもCとRustで私の習熟度に大きな差がある.
  • Rustのほうが拡張性が高い.

ここでは,現在の実装で留意すべき点を書き並べておく.

bundlerの存在

C実装から既に存在したBundlerだが,
Rustでも実装がほぼ完了している.

  • Module 構造体は src/main.rs で宣言されている typed_arena::Arena<Module> でアロケートされる
    • 相互依存関係を表現するのに適したクレート.

AT&T記法

現在アセンブリはAT&T記法で生成している.
命令とコードが一致する(オペランドサイズなど)のが主な理由.

コンパイラ内部のデータ構造をアセンブラが受け取ることを想定しているが,
もしアセンブリコードを解析する機構を実装するとしても,AT&Tのほうが簡単だからである.

LLVMパス

現在は存在しないLLVMパスだが,
挿入するとすればフロントエンド処理後,

codegen_llvm_ir(&BuildOption, Vec<resource::PFunction>)  -> LLVMFile

な関数を作り,呼び出すといいと思う.

add simple allocating stack frame, and can declare local-variable

03 Mar 14:20
Compare
Choose a tag to compare

Summary

  • multiple and divition
  • unary-expression( - )
  • return-statement
  • declare single funtion
  • support declaration of auto-variable
    • which is allocated in stack (each function has)

Note in Japanese

以前は resource ディレクトリと compiler ディレクトリでビルドターゲットが変わっていたが,
それらすべてをひっくるめて libcompiler.so を作成するように変更.

現在記号表は単なる Vector で実装しているが,
これは後々ハッシュテーブルもしくは平衡二分探索木に変更する必要がある.

意味解析の手続き名を semantic としているが,
中でやっていることは厳密には allocate_stack_frame なのでそのように変えたほうがいい.
型検査とフレーム割付はそもそも別の手続きで行ったほうがいいだろうから,
Goコンパイラと同じように複数回手続きを呼び出す方法で対処しよう.
(意味解析をいくつかのステップに分割する,ということ.)

compile addition and subtraction

28 Feb 12:18
Compare
Choose a tag to compare
Pre-release

Summary

  • support addition and subtraction
  • lex and parse and codegen

Note in Japanese

これからタグごとに大まかなまとめを書いていくことにした.
あとから参照したときにわかりやすいと思うので.

まず,現状は上記に示した通り加減算のみがコンパイルできるようになっている.
トークナイズ -> AST構築 -> スタックマシンへのコンパイルというシンプルな構成.

スタックマシンにしているのは,とりあえず言語が動くような状態をガンガン作っていきたいというのが大きい.
最適化はあとから考えればいいので,まずはどんどん実装していきたいと思っている為である.

ビルドスクリプトには CMake + Ninja( or GNU make ) を用いている.
これは結構いい方法で,現状の規模だと CMake の管理はかなり簡単でわかりやすい.