讃容日記スマートフォン用の表示で見る讃容日記2019-05-12Cコンパイラ作りはじめましたこんにちは。自分のブログを書くのはものすごく久しぶりのid:rskyです。何年知的便秘だったんだって感じですね。表題のとおりこれからCコンパイラを作っていこうかと思います。同僚のDQNEOさんが<8cc.go>というコンパイラを作られていて、それに触発されて「Rustでやってみよう」ということで、<低レイヤを知りたい人のためのCコンパイラ作成入門>をCでなくRustでやっていきます。Rust自体も初めてなので、それも含めてどんなものになっていくのか、自分でも楽しみです。今後このシリーズでは<低レイヤを知りたい人のためのCコンパイラ作成入門>を二重鉤括弧つきの『入門』と表記します。自分の開発マシンはMacですが、macOSはターゲットとせずLinuxで動くものを作っていきます。『入門』にもmacOSはLinuxとアセンブリのソースレベルでかなり互換性がありますが、完全互換ではありません。この本の内容に従ってmacOS対応のCコンパイラを作成するのは不可能ではないものの、実際に試してみると、細かな点でいろいろな非互換性に悩まされることになるでしょう。Cコンパイラ作成のテクニックと、macOSとLinuxの差異を同時に学ぶというのは、あまりお勧めできることではありません。何かがうまく動かない場合、どちらの理解が間違っているのかよくわからなくなってしまうからです。したがって現時点では、本書ではmacOSは対象外とします。macOSではDockerなどを使ってLinux環境を用意するようにしてください。とあるように、コンパイラ作成の本質に注力するためです。Terminalの出来如何ではいよいよメイン開発環境をWindowsにしてもいいかなと思っています。macOSでの差異Linuxとシンプルかつ最大の違いといえば、macOSでは公開シンボルにアンダースコアのprefixが必要なことでしょうか。main関数はアセンブリでは_mainという名前で宣言しないといけません。macOS環境においてシンボルにアンダースコアのprefixがいる件だけちょっと注意ですかね。2019年5月10日また、これは教えていただいたことですが、レジスタにも違いがあるらしいです。このあたりの知識は今の自分に全く欠けていることもあり、素直にLinuxのみをターゲットにすることにしました。将来的にはクロスコンパイルにもチャレンジしてみたいですね。2019年5月10日Repository既に作成済みの9cc.rustをcloneして作業します。LTSベースのイメージを作ります。それではさっそくプロジェクトを作成しましょう。今まさに読み始めたばかりの<プログラミングRust>に従ってパッケージを作成します。filesしかし既に9cc.rustプロジェクト内で作業しているのでこれではちょっと都合が悪い、ということでリネームしました。Rust!まずは引数も取らず、固定のアセンブリコードを吐くだけのプログラムを書いてみます。僕自身初のRustコードです。ret");}これをビルドします。※ここから先はコンテナ上での作業ですが、そこら辺の説明はざっくり省いています。バイナリが作られたようなので、これを実行、生成物をアセンブルして実行します。引き続き引数として取った数値を返すようにします。Argumentsコマンドライン引数の処理は<プログラミングRust>の第2章序盤に書かれており、そのまま使えました。ret");}ビルドして実行してみます。引数のパースエラーも処理できていてありがたいですね。backtrace.というわけで、引数を指定して出力したコードをアセンブル、実行します。これでようやく『入門』のステップ1の途中、「コンパイラ本体の作成」まで完了しました。次回は「ユニットテストの作成」です。00:31Cコンパイラ作りはじめましたTweetもっと読むコメントを書く2013-07-21ありのままに起こったことを話すぜregularこれは某定年まであと2年になったことだし、おっさんらしくスピリチュアルな文章のひとつでも書こうと思っていた矢先に起こった事件の顛末である。2013最近、自転車をサボっていたので軽く走りに行こう、と思ったのが発端であった。サイクリングコースがあり、以前から行ってみたかった所だ。自宅からもそんなに遠くないし、ほぼ道なりに北に進むだけという分かりやすさが良い。井荻トンネルは軽車両通行禁止—つまり自転車では通れないので降りて地下道を通らねばならないのが少々面倒なものの、サイクリングそのものは順調に進んだ。環八をまっすぐ走ってきた。埼玉県にはいった途端に路肩が悪くなる。2013実はここで小さなミスを犯している。車道をまっすぐ進んで笹目橋に向かうのが正解だったのだが、地図を確認するために停車した所からだと理研の前を通って外環道(の側道)から行くことになった。外環道も地図の上では彩湖に直接行けるから良さそう、と思いきや側道のアップダウンが激しく、鈍った脚にはちょっとしんどかった。橋の上から見る彩湖がきれいだったのでよしとする。母上様ほどではないが、やや方向音痴な僕が目的地にほぼ一発で行けたのは珍しい。出発したのが遅かったし、暗くならないようにと一周だけ回って帰路に就く。転エネルギー切れを感じたのと、TLに1000円マックを食べた人が多かったのを思い出し、マクドナルド笹目通り高松店に入る。いえば現金あったかな、とオーダーする前に財布を確認したら204円しかなかったので回れ右。