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
プログラミング言語を作る
Search
NearMeの技術発表資料です
PRO
February 02, 2024
0
65
プログラミング言語を作る
NearMeの技術発表資料です
PRO
February 02, 2024
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
ガウス過程回帰とベイズ最適化
nearme_tech
PRO
0
34
確率的プログラミング入門
nearme_tech
PRO
2
35
Observability and OpenTelemetry
nearme_tech
PRO
2
29
観察研究における因果推論
nearme_tech
PRO
1
72
React
nearme_tech
PRO
2
33
Architecture Decision Record (ADR)
nearme_tech
PRO
1
820
遺伝的アルゴリズムを実装する
nearme_tech
PRO
1
46
Fractional Derivative!
nearme_tech
PRO
1
37
GitHub Projectsにおける チケットの ステータス更新自動化について
nearme_tech
PRO
1
57
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Gamification - CAS2011
davidbonilla
80
5k
Designing for Performance
lara
604
68k
Git: the NoSQL Database
bkeepers
PRO
427
64k
RailsConf 2023
tenderlove
29
900
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Documentation Writing (for coders)
carmenintech
65
4.4k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
120
The Art of Programming - Codeland 2020
erikaheidi
52
13k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Transcript
0 プログラミング⾔語を作る 2024-02-02 第27回NearMe技術勉強会 Takuma KAKINOUE
1 概要 • インタプリタ型⾔語の動作原理を解説 ◦ 字句解析 ◦ 構⽂解析 • 字句解析および構⽂解析ライブラリのPython
Lex-Yacc (https://github.com/dabeaz/ply)を⽤いて,簡単な⾔語を作成する
2 インタプリタ型⾔語が実⾏される仕組み • Step 1 : プログラムをブロックに分割する ◦ このブロック単位で実⾏される •
Step 2 : 字句解析 ◦ ブロック単位のプログラムをトークンへと分解する • Step 3 : 構⽂解析 ◦ トークンの羅列をBNFに当てはめ関係性を抽出し,構⽂解析⽊を⽣成する • Step 4 : 実⾏ ◦ 構⽂解析⽊をもとに,インタプリタで定義された動作が実⾏される ※ コンパイラ型⾔語の場合は,Step 4以降が異なり,「意味解析」→「コード⽣成」とい う処理が⾏われる。コンパイラは「実⾏」までは⾏わず,あくまで与えられたプログラム を機械語などの別のプログラムに変換することが⽬的である。
3 トークン(終端記号)とは • プログラムの最⼩単位で,それ以上分割することができない記号のこと • トークンの例 ◦ 演算⼦ ▪ +,
-, *, /, = など ◦ 予約語 ▪ if, else, while, for, return など ◦ 数値 ▪ 0, 5, 100 など ◦ 変数名や関数名 ▪ my_var, my_func など
4 BNFとは • プログラムの構⽂を定義するための記法のこと ◦ 正式名称は,バッカス‧ナウア記法(Backus-Naur form) • 記法の例 ◦
<A> ⇨ 記号Aの宣⾔ ◦ <A> ::= <B> ⇨ AはBである(定義) ◦ <A> | <B> ⇨ AまたはBである(選択) • 構⽂の例 ◦ 英数字の定義(<英字>と<数字>は終端記号,<英数字>は⾮終端記号となる) ▪ <英字> ::= [a - z] | [A - Z] ▪ <数字> ::= [0 - 9] ▪ <英数字> ::= <英字> | <英数字> <数字> | <英数字> <英字>
5 ⾜し算と引き算を定義する • トークン(終端記号)の定義 ◦ <整数> ::= ([1 - 9]
| [0 - 9]* ) | 0 ◦ <演算⼦ > ::= + | - • BNFの定義 ◦ <式> ::= <整数> | <式> <演算⼦> <整数> • “1 + 2”という式を解析する流れ ◦ 1 + 2 ◦ <整数> <演算⼦> <整数> → 1 + 2 ◦ <式> <演算⼦> <整数> → 1 + 2 ◦ <式> → 3(演算⼦を読み込み演算を実⾏)
6 問題 • 以下の構⽂に合致するものはどれか?ただし、構⽂解析は最⻑⼀致で⾏われる。 ◦ <動作> ::= ⾷べる | 捨てる
| 投げる ◦ <もの> ::= りんご | 雑草 | ボール ◦ <命令> ::= <動作> | <動作> <もの> | <命令> <動作> | <命令> <動作> <もの> • 選択肢 ◦ (ア)ボール 投げる ⾷べる りんご ◦ (イ)捨てる 雑草 ⾷べる りんご りんご ◦ (ウ)⾷べる 雑草 りんご 捨てる ◦ (エ)投げる ボール 投げる 投げる ボール
7 サンプルコードを動かす • リポジトリをclone ◦ https://github.com/kakky-hacker/algorithm_sandbox/tree/main/my-script • main.pyを実⾏(今回はpip install不要) ◦
インタプリタが⼊⼒待ち状態になるので,sample/code.txtをコピペする ◦ ちゃんとコード通りの出⼒か検算してみる • インタプリタで遊んでみる ◦ 変数宣⾔や”()”を⽤いた四則演算も可能 ◦ 代⼊⽂以外は,コンソールに結果が出⼒される
8 Thank you 解答(エ)