2019-03-01から1ヶ月間の記事一覧

コンパイラ作成(11) Hello, World!

Hello, World!に挑戦 最近停滞気味だったので一気に行くよ。プログラミング言語と言ったらハロワ。これがコンパイルできたらもう半分はできちゃったようなもんだよね。(そんな分けない) main() { puts("Hello, World!"); } 新しい要素としては文字列リテラ…

コンパイラ作成(10) clang先輩

clangのアセンブラ まずはclangのアセンブラの話。mycで生成したアセンブラコードはclangでアセンブル、リンクしてるんだけど、clangはどうやってアセンブルしてるんだろうか。Gasなりなんなりに処理を投げてる?良く分からないんでちょっと調べてみたよ。 A…

コンパイラ作成(9) 色々整理

ここまで無計画にコンパイラを作成してきたけど、ここらでちょっと整理するよ。まずは開発環境。 ~/myc$ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.2 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.2 LTS" VERSION_ID=…

コンパイラ作成(8) 複数の文

前回の続きで組み込み関数printのチェック。まずはコンパイル結果のアセンブリコードを見てみるよ。 .intel_syntax noprefix .global main main: mov rdi, 42 call print ret うんうん、ちゃんと思った通りのコードが出力されてる。次はもうちょっと複雑なプ…

コンパイラ作成(7) 組み込み関数print

return文一個のプログラムのコンパイルはできるようになったんで、もうちょっと複雑なのに挑戦するよ。さて何にするかな。式の評価?よくあるコンパイラの解説とかだと大体式の評価をやってるけど、式の構文解析とか難しそうだから違うことにしよ。 main() {…

コンパイラ作成(6) 色々修正

コンパイルはできるようになったけど、問題ありありだったんで修正してくよ。まずは構文解析、コード生成をParserクラスに分離した。前回のコードはさぼりだったね。んで、アセンブリコードの出力先もファイルへ変更。この辺は簡単なんでさっくりできたよ。…

コンパイラ作成(5) コンパイル結果の確認

.intel_syntax noprefix .global main main: mov rax, 42 ret ret 前回はコンパイルできて、ちゃんと実行できることまでは確認できた。で、これがコンパイル結果。1行目の.intel_syntax noprefixは表記をIntel形式にするおまじない。x86系のアセンブリにはI…

コンパイラ作成(4) 初めてのコンパイル

字句解析もできたので、いよいよコンパイルしてみるよ。って言っても簡単なプログラムだけど。 main() { return 42; } これが今回用意したテスト用ソース。 早速、プログラミング開始。 fname = ARGV[0] lex = Lexer.new(fname) print ".intel_syntax nopref…

コンパイラ作成(3) Lexerクラス

# 字句解析 class Lexer # コンストラクタ def initialize(fname) @fname = fname # ソースファイルのファイル名 begin @io = File.open(@fname,"r") rescue SystemCallError => e puts %Q(class=[#{e.class}] message=[#{e.message}]) end # 1行先読み @li…

コンパイラ作成(2) rubyのenum

前回の続きで字句解析の中身をちょっとだけ。 # トークンの種類 enumの代わり module TK EOF = 1 # End of file ID = 2 # Identifire NUMBER = 3 # Number SYMBOL = 4 # Operator STRING = 5 # String UNKNOWN = 6 # Unkown token end rubyにはenumに相当す…

コンパイラ作成(1) 字句解析

暇なんで何かプログラムでも作ってみるよ。さて何を作るかってしばらく悩んでコンパイラを作ることにしたよ。どんな言語にするかは今のところ何も決めてないんだけど、C言語っぽいやつにしてみた。言語名はmyc。 開発言語はruby。別になんだって良かったん…

gitの勉強をしてみた(1)

Git

今までプログラミングをしていてソースの管理とかいい加減だったんだけど、一念発起してgitを勉強してみた。まずはインストールから。 ~/myprog$ git --version git version 2.17.1あれ既にインストールされてる。なんでだろ?昔自分でインストールしたのか…

プログラムコードを張り付けてみた

ググって見つけたやつをそのまま貼り付け class Foo def bar'baz' # return baz end end help.hatenablog.com

ブログを始めて見た

さて何を書こうか