Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
自作言語のすすめ(OSC21Aizu版)
Search
soukouki
August 29, 2021
Technology
670
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自作言語のすすめ(OSC21Aizu版)
OSC21Aizuで発表したLTスライドです。
soukouki
August 29, 2021
More Decks by soukouki
See All by soukouki
ローカルLLMバイブコーディングのすすめ
soukouki
0
75
ゲーム画面をブラウザから見られるサイトを作った話
soukouki
0
79
Simutrans CityView (日本語版)
soukouki
0
120
Simutrans CityView (English)
soukouki
0
89
10分で学ぶ すてきなモナド
soukouki
1
190
Misskey自鯖を建ててみた
soukouki
1
100
1年前の日記を要約するツールをローカルLLM&自作MCPサーバーで作った話
soukouki
0
520
自作Cコンパイラ 8時間の奮闘
soukouki
0
1.9k
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
280
Other Decks in Technology
See All in Technology
ルールやカスタム機能、どう使う?理想の出力を引き出すために今知りたいIBM Bob 5つの機能
muehara
1
340
正解のないAIプロダクトをどう導くか?dodaが挑む、ユーザーの『本音』を構造化する評価設計と検証のリアル
techtekt
PRO
0
190
Djangoユーザが知っ得なPostgreSQL機能 - 設計の選択肢を増やす / Djang-use-PostgreSQL
soudai
PRO
0
200
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.8k
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
PHP と TypeScript の型システム比較:AI 時代の「型」は誰のためにあるのか? #frontend_phpcon_do / frontend_phpcon_do_2026
shogogg
1
250
GoとSIMDとWasmの今。
askua
3
510
Agentic ERPをどう設計するか ー 受発注エージェントを動かす、現場の知見と設計思想ー
recerqainc
1
1.7k
MIERUNE JCT 発表資料「宇宙から伊能忠敬ごっこ」
syuchimu
0
190
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
3
160
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.9k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
7
4k
Featured
See All Featured
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
150
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
460
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
400
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.7k
The untapped power of vector embeddings
frankvandijk
2
1.7k
Design in an AI World
tapps
1
220
The Cult of Friendly URLs
andyhume
79
6.9k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
The SEO Collaboration Effect
kristinabergwall1
1
480
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Building an army of robots
kneath
306
46k
Mobile First: as difficult as doing things right
swwweet
225
10k
Transcript
自作言語のすすめ シン・プログラミング自作版
自己紹介 会津大学 学部1年の sou7 / soukouki です。 twitter:@sou7___ (アンダーバーは3つ!) discord:sou7#0094
github:soukouki atcoder:soukouki
かわいい!
すごいかわいい!
自作〇〇、といえば? 自作PC 自作OS そのなかでもやっぱり! 自作言語 これは外せない!
インタプリタとコンパイラ 言語の処理系を作るには、大まかに インタプリタ トランスパイラ コンパイラ のどれかを作ることになります。 この中では、インタプリタの実装が一番簡単(構文木を使って実行するだけで済む)の で、今回はインタプリタを実装しました。
インタプリタの構造 インタプリタは、概ね次の3段階の処理に別れます。 字句解析 ソースコード(文字列)をトークン(後ほど説明します)の列に切り分ける処理 構文解析 トークンの列を木構造の抽象構文木(これも後ほど説明します)に解釈する処理 評価 抽象構文木を使ってプログラムを実行する処理 これら3つの処理の実装方法などについても触れていきます。 余談ですが、実行速度が重要なインタプリタ(RubyやNode.jsなど)は更に何段階かに分
かれているそうです。
トークンとはなんぞや トークンとは、一言で言えばコード上で意味を持つ最小単位の文字の並びです。 具体的にはこんなものです。 予約語 (C言語でいう if とか const とか。yokan言語には予約語はありません。) リテラル
( 123 , "str" のような、プログラム上の数値や文字列) 識別子 (関数名や変数名のような、プログラム上で自由に名前をつけられるもの) 演算子 ( == , < , + ) 括弧 デリミタ (カンマとか)
抽象構文木とはなんぞや 抽象構文木とは、コードの構造を木構造で表したものです。 今回はGoの構造体を組み合わせて表現しました。 具体例 1+2*3 は字句解析で 1 + 2 *
3 のようなトークンの列になり、さらに構文解析で Add(1, Mul(2, 3)) このような抽象構文木になります。
字句解析 字句解析とは、ソースコードの文字列から、トークンの列に変換する処理です。 yokan言語では、その文字と、その次の文字を見ることでトークンを区別できるように なっています。( = と == を考えてみると良いでしょう) たいていの言語では、コメントはこの段階で除去されます。(yokan言語にコメントは ありません...)
実装はそこまで難しくないです。
構文解析 構文解析とは、字句解析で得られたトークンの列から、抽象構文木に変換する処理で す。 この構文解析には幾つもアルゴリズムがあります。今回はその中から再帰下降構文解 析という、比較的素朴な方法を使いました。 ちなみに、構文解析を高速に行うために更に高度な構文解析のアルゴリズムを使うこ とが多いのですが、そのコードは複雑で人には書けないため、ソースコードを生成す るコンパイラ(パーサジェネレータ、コンパイラコンパイラとも)を使うことが多いで す。
再帰下降構文解析 再帰下降構文解析は、相互再帰(複数の関数を組み合わせて作る再帰)で構成される構文 解析のアルゴリズムです。 アルゴリズムを構成する関数(または処理のまとまり)と、解析する言語の文法が1対1に 対応するため、簡単に実装できます。
具体例 Wikipedia「再帰下降構文解析」より引用 void term(void) { factor(); while (sym == times
|| sym == slash) { getsym(); factor(); } } void expression(void) { if (sym == plus || sym == minus) getsym(); term(); while (sym == plus || sym == minus) { getsym(); term(); } } (yokanではもう少しごちゃごちゃした処理を書いています。)
構文木を使った評価 インタプリタなどでは、プログラムを実行することを「評価する」と言うことが多い です。 yokan言語では、構文解析で得られた構文木を使って、直接評価しています。 func evalMinusPrefixOperatorExpression(right object.Object) object.Object { //
型チェック err, ok := checkTypeIsInteger("MinuPrefixOperator", right) if !ok { return err } // 内部の整数を取得 value := right.(*object.Integer).Value // マイナス演算子を適用 return &object.Integer{Value: -value} }
yokan言語の推しポイント yokan言語では無名関数は '(' <カンマ区切りの引数リスト> ')' '{' <文> '}' というかなりシンプルな構文を使います。これによって if(
cond, (){puts(true)}, (){puts(false)} )() という形で、if関数 を使って条件分岐を実装できます。
yokan言語について リポジトリはこちらです。 プルリクエスト歓迎してます! https://github.com/soukouki/yokan
yokan言語でFizzBuzzを実装してみた! remainder=(n,d){n-(n/d)*d} fizzbuzzii=(n){ if( remainder(n,15)==0, (){puts("fizzbuzz\n")}, (){ if( remainder(n,3)==0, (){puts("fizz\n")},
(){ if( remainder(n,5)==0, (){puts("buzz\n")}, (){puts(n)} )() } )() } )() } fizzbuzzi=(max,n){ fizzbuzzii(n) if( max>n, (){fizzbuzzi(max,n+1)}, (){} )() } fizzbuzz=(max){ fizzbuzzi(max,1) } fizzbuzz(15) (改行はうまく読み込めないので、動かすには改行を取り除く必要があります。)
参考図書 「Go言語でつくるインタプリタ」 https://www.oreilly.co.jp/books/9784 873118222/ 基本的な構造はこの本と同じです。 ただ、構文が違ったり、構文解析の アルゴリズムが違ったりと、自分で アレンジした箇所も多くあります。
ありがとうございました!