199 Views
July 22, 25
スライド概要
以前内輪で開催したオフラインLT会の発表スライドです。自作プログラミング言語の基礎となる知識をまとめています。
プログラミング言語自作入門 @nuskey8
プログラミング言語を「作る」
プログラミング言語を「作る」 • 皆さんは日々、当たり前のようにC#など言語を書いている • 当然これらの言語を「作っている」人たちがいる • つまり我々にもプログラミング言語は作れる…ということ…!
今回作る言語 • 自然数の四則演算のみをサポートする言語「Dentaku」をC#で作ろう • サンプルはGitHub Gist上で公開しています (nuskey8/dentaku.cs) https://gist.github.com/nuskey8/5c055318ef65ae0c33dd53cd7d0bdd95 • 入力として下のようなソースコードを受け取り、結果を出力する
言語処理系の基礎知識
プログラミング言語が動くまで
プログラミング言語が動くまで • ソースコードはただのテキスト、コンピュータは解釈できない • いくつかの段階に分けて少しずつ機械が読みやすい形に変換していく • 一度機械語に変換する実装を「コンパイラ」 構文解析後や中間言語をそのまま実行する実装を「インタプリタ」と呼ぶ • 実際には最適化や上の二つを組み合わせた実装もあるので、 明確に分類できるものではない
1. ソースコード
1. ソースコード • 人間が書くプログラムのコード • 「Dentaku」では四則演算のテキストがソースコードになる
2. 字句解析
2. 字句解析 • 文字列のまま解析するのは難しい… • ソースコードを「トークン」と呼ばれる 意味のある単位に分割する • ソースコードをトークンに分割する機構を 「Tokenizer」や「Lexer」と呼ぶ • Dentakuでは数字と演算子をトークンとして処理する
3. 構文解析
3. 構文解析 • トークン列だけではソースコードの構造が見えない… • そこで抽象構文木(Abstract Syntax Tree)というものを作る
3. 構文解析 • 抽象構文木とは、コードの中身を木構造で 表現したもの • トークン列から構文木を作る機構を 「Parser」と呼ぶ • Dentakuでは演算子の計算順序に基づいて 構文木を構築する
3. 構文解析 • Parserの実装には色々な種類があるが、今回は再帰降下パーサと呼ばれる 実装が比較的容易なものを採用している • トークン列から構文木を構築する、ということだけ覚えておこう
4. インタプリタ
4. インタプリタ • 処理系の実装によって構文木をどのように使うかは異なる • 機械語にコンパイルしたり、中間言語に翻訳して実行したり… • 今回はTree-Walk Interpreterを採用、構文木を直接評価する
4. インタプリタ • 構文木を再帰的に評価していく • 数値のノードならそのまま値を(intに変換して)返す • 四則演算のノードなら左右のノードの値から計算した結果を返す
完成!
動かしてみよう • 実行して適当な式を打ち込んでみよう • 入力されたソースコード(数式)を 評価した結果が出力されるはず
発展 • Dentakuは現状マイナスの値の入力(-1 + -2)や 括弧による計算順序の変更に対応できない • もう少し高度な計算をするなら、sin()やsqrt()などの組み込みの関数を 呼び出せるようにすると便利 • これらの機能の実装にも挑戦してみよう…!
Thank you for listening!