Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
自作言語のすすめ - シン・プログラミング自作版 -
Search
soukouki
August 22, 2021
Technology
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
自作言語のすすめ - シン・プログラミング自作版 -
インタプリタの内部実装の紹介と、自作言語yokanの紹介です。
soukouki
August 22, 2021
More Decks by soukouki
See All by soukouki
ローカルLLMバイブコーディングのすすめ
soukouki
0
130
ゲーム画面をブラウザから見られるサイトを作った話
soukouki
0
120
Simutrans CityView (日本語版)
soukouki
0
170
Simutrans CityView (English)
soukouki
0
120
10分で学ぶ すてきなモナド
soukouki
1
220
Misskey自鯖を建ててみた
soukouki
1
130
1年前の日記を要約するツールをローカルLLM&自作MCPサーバーで作った話
soukouki
0
610
自作Cコンパイラ 8時間の奮闘
soukouki
0
2k
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
290
Other Decks in Technology
See All in Technology
1人アドミンな私はAWSアカウント申請をSlackで完結したい!
ysuzuki
0
110
企業の現実世界をグラフで写し取る
sansantech
PRO
0
240
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
160
AI 時代の Azure エンジニアリング ~ 私たちは何を磨き、何を任せるのか ~
chack411
1
360
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1.5k
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
330
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
190
個別開発で終わらせない。 現場の課題をプロダクトの強さに変える StockmarkのFDE
ktkrhr
0
540
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
200
[2026 Oracle Technical Deep Dive] エンタープライズAIエージェントを支えるOCIソリューション。ラインナップと特徴を理解しよう! (2026年9月17日開催)
oracle4engineer
PRO
0
240
2026-10-01_MagicPod_QAハーネスエンジニアリングとQA組織の未来像
ynisqa1988
1
410
『GOエコノミー 』(相乗りサービス) におけるスペック駆動開発
mot_techtalk
1
210
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
430
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Design in an AI World
tapps
1
340
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
30 Presentation Tips
portentint
PRO
1
410
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
How GitHub (no longer) Works
holman
316
150k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Transcript
自作言語のすすめ シン・プログラミング自作版
自己紹介 29期生で学部1年の sou7 / soukouki です。 twitter:@sou7___ (アンダーバーは3つ!) discord:sou7#0094 github:soukouki
atcoder:soukouki 大学入ってからというもの、周りにすごい人が多くて刺 激されてます。 みんなすごい!
かわいい!
すごいかわいい!
自己紹介(おまけ) Goはyokanを実装するまで 未経験でした。未経験言語 で実装するのは大変。 保有資格 ->
えっ?
自作〇〇、といえば? 自作PC 自作OS そのなかでもやっぱり! 自作言語 もうこれ以外ない!(強制)
インタプリタとコンパイラ 言語の処理系を作るには、大まかに インタプリタ コンパイラ に別れます。 コンパイラよりもインタプリタのほうが実装が簡単(構文木を使って実行するだけで済 む)ので、今回はインタプリタを実装しました。
インタプリタの構造 インタプリタは、概ね次の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
参考になる本 「Go言語でつくるインタプリタ」 https://www.oreilly.co.jp/books/9784 873118222/ 基本的な構造はこの本と同じです。 ただ、構文が違ったり、構文解析の アルゴリズムが違ったりと、自分で アレンジした箇所も多くあります。
ありがとうございました!