Python でも同様な観察ができる
>>> def myplus(i, j):
... return i+j;
...
>>> dis.dis(myplus)
2 0 LOAD_FAST 0 (i)
3 LOAD_FAST 1 (j)
6 BINARY_ADD
文法要素以降の作業( VM 構築)
High Level Concept
Syntax Design Semantics Design Parsing
Semantic Analysis(Type/Class Check)
Code Generation(codemit.c)
Execution(vm.c)
Optimization Optimization
Interpreter Compiler
VM
stack machine の定義
ISA を定める
Stack
Code segment
Data segment
Special registers/Data Structure
実行エンジンのプログラムを書く (vm.c)
AST から、命令列を生成するプログラムを書く
(codemit.c) eval との相似に注目する
(homomorphic とまではいかないが … )
STACK (Frame)
DATA SEGMENT
(Data) CODE
SEGMENT (Functions) Object
Table
PC SP FP
Alternative to source tree traversal
VM を定義して、その上のコード生成を行う
stack machine
の設計t_codeseg codeseg[CODESEGSIZE];
t_stackseg stackseg[STACKLEN];
int dataseg[DATASEGSIZE];
t_dataseg objectab[128];
int framestack[STACKLEN];
Mnemonic (最小限)
"NOP",
"POP",
"DUP",
"U_NOT",
"B_ADD",
"B_SUB",
"B_MUL",
"B_DIV",
"B_GREATEREQ",
"B_GREATER",
"B_LESS",
"B_LESSEQ",
"B_EQUAL",
"B_NOTEQUAL",
"JMP",
"JMPPOS",
"JMPZ",
"JMPNEG",
"PUSH_CONST",
"PUSH_GVAR",
"PUSH_LVAR",
"PUSH_ADDR",
"STORE_GVAR",
"STORE_LVAR",
"STORE_ADDR",
"CALL",
"RETURN",
"PRINT_TOP ",
VAR ( 変数参照 ) に対応するコード生成
対応する eval の部分
case VAR:
{int varpos = staticvarsearch(cstack[top].val1);
if (varpos == -1) {
codepush2(OP_PUSH_GVAR, cstack[top].val1);
} else {
codepush2(OP_PUSH_LVAR, varpos);
}
break;
}
case VAR: /* 2018 */
{int varpos;
if ((varpos = varsearch(cstack[top].val1)) == -1) { return vars[globalvarsearch(cstack[top].val1)].val;
} else {
return frames[varpos].val;
} }
MOV に対応するコード
case MOV:
codemit(cstack[top].val2);
codepush(OP_DUP); /* added on March 20, 2018 */
{
if (cstack[cstack[top].val1].opcode == VAR) { int varname = cstack[cstack[top].val1].val1;
int varpos = staticvarsearch(varname);
if (varpos == -1) { /* global var */
codepush2(OP_STORE_GVAR, varname);
} else { /* local var */
codepush2(OP_STORE_LVAR, varpos);
VM の ISA のデザインは、哲学の発露(少し大 げさ)
JVM
なぜ、invoke
が複数種類あるのか
なぜ、基本型ごとの命令セットに分離されているのか CPython
なぜ、ループ命令があるのか CALL に対応するコード
VM での実行
case FUNCALL:
{ int alen;
alen = codemitargs(cstack[top].val2);
codepush2(OP_PUSH_CONST, alen);
codepush2(OP_CALL, cstack[top].val1);
break;
}
switch (objectab[gv].typ) { case FUN:
framestack[savedframetop++] = pc+1;
framestack[savedframetop++] = stacktop-objectab[gv].paramlen+1;
pc = objectab[gv].val;
break;
…
Native Code へのコンパイル
Native Code へのコンパイルも、その本質は 変わりません
Assembly code
の出力ができるようにするには プラス少しの文法の勉強で足りる Native Code を相手にするときは、ファイル 形式 , load, link について、少し勉強する必 要があります
次回、おおまかなところについてはふれます仕様
プログラミング言語を定義したら、仕様にまとめてみる。
これができない人が…
概念の説明を最初につける
プログラミング言語を定義するときに必要な(デリケート な)要素は大体以下の通り
プログラム全体の構造
制御構造
データオブジェクト
式
関数(手続き)の扱い
環境、変数のバインディング + 多言語とのインターフェイス、ライブラリ関数
課題 7
自分で言語を定義してみよ
仕様書を書け(これが一番大事) High Level Concept
は「新しい概念のない電卓であ る」でもかまわない
ただし、変数は扱えるようにすること
関数コールをデザインすること Lexical analysis
に関係するコードは自分で書くこと Parse
したら、AST
は生成できるようにすること
評価系(eval)
は書かなくてもよいが…
きっと書きたく なる。(Note)
言語 design と VM の Interface
「値」とは何か?
基本型だけではない Scalar
+Array
(Fortran
) Tuple, list, (Python)
Object (OOP)
計算機械の上での実装(表現)の検討の必要性(
処理系の検討には必須)
Reference
のメカニズムの検討 オブジェクト管理、メモリ管理 (in VM) へつなが
る
ちょっと見てみる
Perl
string
が基本型のひとつとして入る scalar ($x
の形) + array (@x
の形)
Object
は…
厳密に言えばオブジェクト指向のようなプログラミング スタイルをpackage
を導入することで提供 Python
基本型+tuple+
リスト Object
は最初からデザインの中に入っている(Note)
関数コール、フレーム管理の Semantics の例
Javaの規格
15.12.4 Runtime Evaluation of Method Invocation
15.12.4.1 Compute Target Reference (If Necessary)
15.12.4.2 Evaluate Arguments
15.12.4.3 Check Accessibility of Type and Method
15.12.4.4 Locate Method to Invoke
15.12.4.5 Create Frame, Synchronize, Transfer Control
15.12.4.6 Example: Target Reference and Static Methods
15.12.4.7 Example: Evaluation Order
15.12.4.8 Example: Overriding
15.12.4.9 Example: Method Invocation using super
Fortranの規格
実引数、仮引数および引数結合(association)
VM を用いた実行モデルの記述
Virtual Machine
を定義する Operational Semanticsの忠実な表現
ISAを定義する(大別してstack machineとregister machine)
プログラムの意味とは、VM上にコンパイルされたコードのVM上の 意味と定義する
ハードウェアシステムとは薄皮一枚で隔てられている
「状態」の記述 メモリの状態
スレッドの状態
「状態遷移」の記述 主だった命令がマシンの状態をどう変化させるかを記述
VM
で行うのは、計算機械の「実装」だけではない
オブジェクトの生成・GCに係るメモリ管理
関数呼び出しに係るフレーム管理、並列性に係るスレッド管理Java VM
Java VM も Python VM もスタックマシンです
JVM の当初の目的は、安全な形でコードの流通 性を高めることであった(特にアプレット)
コードの流通性の確保が目的の一つに入っていた HTML5
で廃止 Java の Semantics は Java VM の上で定義する ことができる
速度を考えて JIT が出現した
速度はこんな技術で稼ぐんじゃない https://docs.oracle.com/javase/specs /jvms/se10/jvms10.pdf ( 2018 )
(課題 8 )上のドキュメントを以下の観点から要 約せよ
VM
の仮想機械としての構造 Java
の実行をサポートするためのフレーム管理、メソッド呼び出し等、命令セットの特徴
Python VM
どこかの書き込み(2004)
Xavier> Is there any paper describing the instruction set of the Python
Xavier> Virtual Machine or should I learn anything from Python/ceval2.c?
I think right now Python/ceval.c is your only choice. I recently began working on something, but really have nothing more than a crude
outline. If
you start looking at ceval.c and get stuck, drop me a note. I'd be happy to
try and explain things. It might motivate me to work on pyvm.tex a bit more
as well.
ここでしょうか (ceval.c)(泣) https://github.com/certik/python-3.2/blob/master/Python/ceval.c
もしくはdisassemblerの方を見た方がよいでしょうか
https://docs.python.jp/3/library/dis.html#python-bytecode-instructions
(課題 8’ )上のドキュメントを以下の観点から要 約せよ
CPython VM
の仮想機械としての構造 Python
の実行をサポートするためのフレーム管理、メソッド呼び出し、ループ実行等の命令セット の特徴