Releases: Drumato/peachili
Rust実装に以降中
大量の言語機能が追加されている 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
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
Summary
- support addition and subtraction
- lex and parse and codegen
Note in Japanese
これからタグごとに大まかなまとめを書いていくことにした.
あとから参照したときにわかりやすいと思うので.
まず,現状は上記に示した通り加減算のみがコンパイルできるようになっている.
トークナイズ -> AST構築 -> スタックマシンへのコンパイルというシンプルな構成.
スタックマシンにしているのは,とりあえず言語が動くような状態をガンガン作っていきたいというのが大きい.
最適化はあとから考えればいいので,まずはどんどん実装していきたいと思っている為である.
ビルドスクリプトには CMake + Ninja( or GNU make ) を用いている.
これは結構いい方法で,現状の規模だと CMake の管理はかなり簡単でわかりやすい.