回 6-3 道 6 言語と処理系
インタプリタは、
読み終えたら自分の
この頁の流れ
木を
書いた プログラムを、 誰が 動かしているのか
インタプリタがprint(1 + 2) と
前の1 + 2 * 3 のような
このset、print、if、while の 4 つの文を
インタプリタは どう動くのか
インタプリタは、
インタプリタとは何か
インタプリタ (interpreter) は、
- 字句解析 (6-1 と
6-2)。 字の 並びを、数、 名前、 記号の 字句に切る - 構文解析 (6-2)。
字句を、 どれが 先に 計算されるかが 分かる 木に 組み立てる - 評価と
実行 (この 回)。 木を たどって、 計算したり、 文を 実行したりする
この
式と文と環境
ちび電卓の木は、Python の
| 種類 | 木の形 | 意味 |
|---|---|---|
| 数 | 3 | 3 そのもの |
| 変数 | "i" | 環境から |
| 2 項の演算 | ("+", "s", "i") | 左と |
| 入れる文 | ("set", "i", 1) | i に |
| 表示する文 | ("print", "s") | s の |
| 分ける文 | ("if", 条件, [文…]) | 条件が |
| くり返す文 | ("while", 条件, [文…]) | 条件が |
演算子は + - * / と、比べる < と == です。/ は// と[文…] の
環境は、("set", "i", 1) を{"i": 1} に"i" は
コンパイラとの違い
いちばんの
| 比べる点 | インタプリタ | コンパイラ |
|---|---|---|
| 訳す時 | 実行しながら | 実行の前に全部 |
| 出来る物 | 何も残さない | 実行ファイル |
| 誤りが | その | 訳す時に |
| 書いて試すまで | すぐ | 訳す |
| 実行の速さ | 遅くなりやすい | 速くなりやすい |
| 代表の言語 | Python、 | C、 |
下の
インタプリタの 長所と短所
長所は、
短所は 2 つです。1 つは遅くなりやすい
Python は インタプリタなのか
Python は.pyc という名前のファイルに残され、
同じ用語集は、
s = s + i の 1 行がどんなdis で
手元の Python 3.14 の dis から抜粋
LOAD_NAME s
LOAD_NAME i
BINARY_OP +
STORE_NAME ss を
動かして確かめる
自分の 言語で 1 から 10 の 合計を出す
1 本目は、ev がex が文を 1 つ実行し、run が
動かす ちび電卓のインタプリタ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
55
11
{'i': 11, 's': 55}1 からi < 11 が
ev はrun を
同じ 木を、 スタックの 機械の 命令に直す
2 本目は、
push と load は数や変数の値を積み、store と print はop は 2 つ取り出してjz はjump は
動かす 木を命令に直して実行する
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
0 push 1
1 store i
2 push 0
3 store s
4 load i
5 push 11
6 op <
7 jz 17
8 load s
9 load i
10 op +
11 store s
12 load i
13 push 1
14 op +
15 store i
16 jump 4
17 load s
18 print
命令 19
55
実行 140 回木は 19 個の命令のdis で見た Python の
機械は 140 回の命令を
インタプリタは どこで 崩れるのか
インタプリタは
終わらない while を、 手順の 上限で止める
i をi < 11 は
次の
動かす 上限と、置いていない変数
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
止めた RuntimeError set
手順 1001
{'i': 1, 's': 997}
---
0
止めた NameError u
手順 4
{'s': 0}1 つ目は、set でset で、
まだ 置いていない 変数は、 実行するまで 分からない
2 つ目は、print u に
もっとs < 0 が
Python もcompile でexec で
動かす Python も先に直してから動かす
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
code
('print', 'y', 'z')
1
NameError
name 'z' is not definedcompile は
先に
インタプリタの 言語を、 仕事で どう 確かめるのか
誤りが
- 試験で
if の 両方の 枝を 通し、 どの 行を 通ったかを 測る 道具 (網羅率の 測り) で、 通っていない行を探す - 構文の誤りは、
python -m py_compile ファイル名でバイトコードに 直すと 実行せずに 見つかる。 名前に 値が あるかは調べない - 型の
注釈を 書き、 型検査の 道具で 実行の 前に調べる - 外から
来た プログラムや 式を 自分の インタプリタで 動かすなら、 手順の 数や 時間に 上限を置く
次の
関わる実例
手順の 上限の 値付けを 直した Ethereum の 分岐 (2016年10月18日)
Ethereum (イーサリアム) は、
ethereum.org の
その
崩れた
出典は Gas and fees (ethereum.org)、The history of Ethereum (ethereum.org)、EIP-150 (Ethereum Improvement Proposals) です。
よくある問い
インタプリタは コンパイラより 必ず 遅いのですか
遅くなりやすいですが、
Python の インタプリタは どこに あるのですか
ふだん打つ python3 という命令が、Python の
JIT コンパイルとは何ですか
JIT (ジャスト・イン・タイム) コンパイルは、
インタプリタの 言語は、 配るのが 簡単なのですか
ソースのまま
確認クイズ
答えだと
1 問目
インタプリタと
2 問目
この
小さなスタックの機械
code = [
("push", 2),
("push", 3),
("op", "*"),
("push", 4),
("op", "+"),
]
st = []
for op, a in code:
if op == "push":
st.append(a)
elif a == "*":
y = st.pop()
st.append(st.pop() * y)
else:
y = st.pop()
st.append(st.pop() + y)
print(st)3 問目
この
4 問目
Python の
説明課題
インタプリタと
自分の
この回の 先の一歩
設定ファイルの
一次資料
どれも 2026年10月27日に開いて、
- Glossary (Python 公式文書、英語)。bytecode、
interpreted、 virtual machine の 項。 バイトコードと 仮想マシン、 .pyc、版の間で 同じとは 限らない こと、 境目が あいまいに なり得ること - dis (Python 公式文書、英語)。バイトコードを
読める 形で 表示する 標準ライブラリであること - Gas and fees (ethereum.org、英語)。無限ループを
避ける ため取引ごとに 計算の 手順の 上限を 決め、 その 単位が gas であること - The history of Ethereum (ethereum.org、英語)。Tangerine Whistle の
日と ブロック番号、2016年9月から10月の DoS 攻撃への 最初の 対応である こと、 EIP-150 を含むこと - EIP-150 (Ethereum Improvement Proposals、英語)。作成の
日、 命令の 値段の 上げ幅、 状態を 読む命令が 安すぎたという理由
次へ
道 6 言語と処理系の回
- 6-1正規表現と
オートマトン後戻りが増える式頁で読む - 6-2字句解析と構文解析電卓の
式を木にする頁で読む - 6-3小さな
インタプリタ変数と if を持つ言語この回 - 6-4型と型検査型が
間違いを 先に止める頁で読む
