ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

compiler

自作コンパイラで演算子の優先順位をつけた

自作コンパイラでC言語の演算子に優先順位をつけました。 これの続き natsutan.hatenablog.com 低レイヤを知りたい人のためのCコンパイラ作成入門には詳しい説明がなく、テキストの範囲ではバイナリオペレータに優先順位はほとんどついてないと思います。足…

自作コンパイラで基本的な演算子が動いた

自作コンパイラでRISC-VのC言語の基本的な演算子が動くようになりました。 これの続き natsutan.hatenablog.com こんなCソースで動作確認しています。 int main(void) { putd(2>=4); return 0; } 低レイヤを知りたい人のためのCコンパイラ作成入門に書いてな…

低レイヤを知りたい人のためのCコンパイラ作成入門の多次元配列

低レイヤを知りたい人のためのCコンパイラ作成入門を、Rustでコツコツとやっている。 www.sigbus.info 今まで苦労しながらもgithubのソースを見ながらまっすぐに来れたが、二次元配列の所で躓いたので整理してみた。 動かしたいソース まだここまでは動かな…

TVMで使われている最適化の探索手法

TVMとは ペーパーはこちらからダウンロードできます。 https://arxiv.org/abs/1802.04799 TVMは、ASICやAPGAの様な組込様CPU等、様々なバックエンドでDeep Learningを動かすことを目的としたコンパイラです。 グラフレベルや演算子レベルの様々な最適化を行…

Writing Compilers and Interpreters まとめ

Writing Compilers and Interpreters A Software Engineering Approach 3rd Editionを5月から読んでました。なかなか面白い本なので紹介します。コンパイラの勉強というとどうしてもパーサーで挫折してしまいがちです。この本は、まずはフロントエンドと、中…

Writing Compilers and Interpreters: その12

定数宣言のパースができるようになった。こういう定数の宣言をパースしてクロスリファレンスをかえると、 CONST epsilon = 10; limit = -epsilon; BEGIN END.こんな感じで、integerということとその値が表示されるところまで来た。 ***Definition.PROGRAM du…

Writing Compilers and Interpreters: その11

chap9は型システム。想像していたより難しい。一歩ずつ行かないと。 PROGRAM Test; CONST epsilon = 1.0e-6; TYPE rec = RECORD a : real; x, y : integer; END;こういうコードに対して、シンボルテーブルをスタックにする。Level 0がInteger等の組込型が定…

Writing Compilers and Interpreters: その10

chap8が終了。 for文などが動くようになった。面白くなってきた。CASE文の処理で caseのラベルをキーにして処理を辞書に入れておくと、caseラベルが増えても一定のコストでジャンプできるハック。その辞書をメモ化するまでがセット。面白いが、いまいち速度…

Writing Compilers and Interpreters: その9

chap6が終了。制御構造とか何にもないけど、変数の代入ができるようになった。 ふと気が付いたんだけど、定数の畳み込みの最適化って、実際にはインタプリタの実装と同じだ。変数のスコープ、演算子の優先順序、型変換等、言語仕様にそって動く物がないと、…

Writing Compilers and Interpreters: その8

手書きパーサー作成中。 BEGIN BEGIN {Temperature conversions.} five := 3; END; END.これのパース結果をxmlで出力できるようになった。こんな単純なのだと良いけど、これから複雑になってきたときにxmlで良いのかは良く分からない。 <COMPOUND line="1"> <COMPOUND line="2"> <ASSIGN line="3"> <VARIABLE id="five" level="0" > <INTEGER_CONSTANT value="3" > </ASSIGN> </COMPOUND> </COMPOUND> あとは…

Writing Compilers and Interpreters: その7

手書きパーサーを作成中。このPascalコードをパースして、 BEGIN BEGIN {Temperature conversions.} five := 3; END; END.fiveを代入先の識別子として認識するところまで来ました。 ====== CROSS-REFERENCE TABLE ====== Identifier Line numbers ----------…

Writing Compilers and Interpreters: その6

シンボルテーブルを作りました。 この本にでてくるのは、スタック型のデータ構造でシンボルを管理しています。ツリーで全部作りきった方が良さそうな気がするのですが、パースしながらネストに沿ってスタックを伸ばしたり縮めたりするようです。ネストの処理…

Writing Compilers and Interpreters: その5

とりあえず3章まで終了してトーカナイザーができた。正直この辺までは僕の人生で10回くらいやってる。 パーサーを突破したのが2回くらい。4章はシンボルテーブル。Cで書くと辛い奴だが、今時の言語なら余裕だと思う。順調だけど油断せずに行こう。

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition その4

2章まで終了。 この本の面白いところは、まずはソースコードを入力して、トーカナイザーとパーサーとコードジェネレータを通すフレームワークを先に作る所です。2章が終わった時点でできるのは、このようなPascalのコードを読み込んで、行番号つけて表示する…

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition その3

いくつかデザインパターンが出てきました。今まで本を読んでもさっぱり分からなかったのに、コキュートスでやった経験が生きていてなるほどと関心しています。こういうのは実際に苦労しないと身につかないですね。 ファクトリーパターン 起動時のオプション…

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition その2

Writing Compilers and Interpretersを読んでる。 Tokenにソース上の位置情報を持たせてあって、あーなるほどーと関心した。 パーサーやスキャナーは抽象クラスを作って、それらを継承して言語固有のパーサーにするという設計が面白い。オブザーバーパターン…

Writing Compilers and Interpreters: A Software Engineering Approach 3rd Edition

手持ちになんちゃってでも良いので、そこそこ動くコンパイラが欲しいので、Writing Compilers and Interpreters: A Software Engineering Approach 3rd Editionを購入して勉強を始めた。ATOMとPlanUMLでUML図を書いている。なかなか思った通りに配置されず、…