• 検索結果がありません。

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 AnalysisType/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 machineregister 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

の実行をサポートするためのフレーム管

理、メソッド呼び出し、ループ実行等の命令セット の特徴

MS の .NET も同じ哲学を持つ

 プログラミング言語と実行のための仮想機械 は「くっついて」いる必要はない。

 言語から仮想機械への「コンパイラ」が提供さ れればよい

 仮想機械の動作仕様が定義されていればよ

関連したドキュメント