======================================
Go言語でつくるインタプリタを写経した話
======================================
.. list-table::
:widths: 20 80
* - 公開日
- 2025-01-10 10:44
* - トピック
- インタープリタ, プログミング
* - Zenn
- https://zenn.dev/fkzwsoftwaredev/articles/e7844d09397564
本
--
- `書籍の紹介サイト `__
- `Amazonのページ `__
レポジトリ
----------
- `私の作業用レポジトリ `__
- `オリジナルのレポジトリ `__
動機
----
- OS、コンパイラ作れるってかっこいい
- 趣味なので、WEB以外のプログミングがしたい
- 2018年\ `プログラミング言語Go `__\ を読んだ直後あたりに発売されて飛びついた。
- その後、仕事が忙しくなったり、途中で理解できなくなって断念。
- 今回は、まず完走することを最優先とした
- 何度かレポジトリを新しくして、2024年年末に完走。
本書でやること
--------------
- Go言語を用いて、C言語風(JS風?)な構文のMonkeyプログミング言語を実行できるインタープリタを作っていく
- Go言語のサードパーティライブラリは使用していない
- テスト駆動で開発を進めていく
- Monkeyプログミング言語の特徴
- C言語風(JS風?)な構文
- 変数束縛
- サポートするデータ型
- 整数
- 真偽値
- 文字列
- 配列
- ハッシュ(辞書)
- 算術式
- 組み込み関数
- 変数に束縛する形での関数定義
- クロージャ
- インタープリタの機能を実装していく
- トークン(データ型、予約語やソースコードの中に出てくる記号(+,-))などの定義
::
const (
ILLEGAL = "ILLEGAL" // 規則違反
EOF = "EOF" // ファイルの終端
// 識別子(変数名・関数名) : ユーザが宣言する名前
IDENT = "IDENT"
// リテラル : 扱うデータの型
INT = "INT"
STRING = "STRING"
// 演算子 : 使用できる演算子
ASSIGN = "="
PLUS = "+"
MINUS = "-"
BANG = "!"
ASTERISK = "*"
SLASH = "/"
// 比較演算子 : 使用できる比較演算子
EQ = "=="
NOT_EQ = "!="
LT = "<"
GT = ">"
// デリミタ(区切り文字) : コード上の区切り文字
COMMA = ","
SEMICOLON = ";"
LPAREN = "("
RPAREN = ")"
LBRACE = "{"
RBRACE = "}"
LBRACKET = "["
RBRACKET = "]"
COLON = ":"
// キーワード : コード上で使用する予約語
FUNCTION = "FUNCTION" // 関数定義
LET = "LET" // 変数定義
TRUE = "TRUE" // 真
FALSE = "FALSE" // 偽
IF = "IF" // 構文構造使用: 条件分岐
ELSE = "ELSE" // 構文構造使用: 条件分岐
RETURN = "RETURN" // 構文構造使用: 関数からの戻り値
)
// トークンを表す構造体
type Token struct {
Type TokenType // トークンの種類
Literal string // トークン文字列( 変数名 や + , - などの文字列 )
}
// 予約語のマップ
// .. 予約語は、言語の構文構造に使用するキーワード
// .. 予約語は、変数名や関数名として使用できない
var keywords = map[string]TokenType{
"fn": FUNCTION,
"let": LET,
"true": TRUE,
"false": FALSE,
"if": IF,
"else": ELSE,
"return": RETURN,
}
- 字句解析器の実装
- 入力 : ソースコード
- 出力 : トークン列
- 構文解析器の実装
- 入力 : トークン列
- 出力 : 抽象構文木
- 評価器の実装
- 入力 : 抽象構文木
- 出力 : ソースコードの命令の実行
.. _2025年2026年-でやりたこと:
2025年〜2026年 でやりたこと
---------------------------
- `低レイヤを知りたい人のためのCコンパイラ作成入門 `__
- `コンパイラ 第2版: 原理・技法・ツール `__
- `ガベージコレクション: 自動的メモリ管理を構成する理論と実装 `__
- Pythonで「Go言語でつくるインタプリタ」を写経する
- Rustで「Go言語でつくるインタプリタ」を写経する
- Python自体のソースコードを読んだみたい