コンパイラをつくってみよう
https://gyazo.com/a0459d70ae99ffa8e95c2d930aabb703
DQNEO
環境・定義
Linux
x86-64
アセンブリを吐く
足し算・引き算のコンパイル
結果の数値を出す
素のアセンブリを書く
レジスタ
code:sample.s
.global main
main:
mov $42, %rax
ret
code:main.go
package main
import (
"fmt"
"io/ioutil"
"strconv"
)
func main() {
var source
source , _ = ioutil.ReadFile(filename:"/dev/stdin")
number , err := strconv.Atoi(string(source))
if err != nil {
panic(err)
}
}
ソースコード => コンパイル => アセンブリ
ソースコードを解釈させる
Byte列を読む
トークン列を読む
字句解析
文法構造を分析する
上から順番に変換していく
コンパイラを書くときは泥臭いのを厭わず書くのが大事
条件分岐はswitchで最初にdefaultをpanicで落とすのがコツ
単項式
プラスとマイナスで処理を分ける
expr.operator
+ => operand
- は中身にマイナスを入れたもの
マイナスは256から引いたものが結果
二項式
左辺、右辺を定義
その後計算
コンパイラを書けると何がいいか
言語を動く仕組みがわかる
既存のコンパイラが読めるようになる
コンピュータの動きがチョットワカル
どこから書き始めればいいか?
今日のセッションを見て理解してほしい
つくりながら学ぶ
写経や移植で覚えた
よくある誤解
コンパイラをC言語で書かなくてもいい
拡張・ライブラリは必要ない
コンピュータサイエンスの知識も無くてもいい
構文のテストするよりは 結果をみる形にしてるらしい。E2Eと、単体の機能のテストをしてる