6.3 インタプリタ (1)インタプリタ(interpreter)とは

Slides:



Advertisements
Similar presentations
5.制御構造と配列 場合分け( If Then Else , Select Case ) 繰返し( Do While ) 繰返しその2( For Next )
Advertisements

7/10 if 文課題 力作が多くて感心! 演習1:キーボードから2つの整数を入力し、小さい方の数字を 表示せよ。
情報基礎実習I (第4回) 木曜4・5限 担当:北川 晃.
FORTRAN 科学技術計算用 数値演算精度を重視したシステム K=0 DO 10 I=0,N,1 K=K+I 10 CONTINUE
計算技術研究会 C言語講座 第3回 Loops (for文 while文).
12.3,E,-15, 12.3,E5,+,=, >,<,…,
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
オブジェクト指向言語論 知能情報学部 新田直也.
プログラミング基礎I(再) 山元進.
情報基礎A 第10週 プログラミング入門 VBAの基本文法2 データ型・If ~Then~Else
コンパイラ 第9回 コード生成 ― スタックマシン ―
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
2012年度 計算機システム演習 第4回 白幡 晃一.
情報基礎A 第7週 プログラミング入門 VBAの基本文法2 データ型・If ~Then~Else
オリジナルなCPUの開発 指導教授:笠原 宏 05IE063 戸塚 雄太 05IE074 橋本 将平 05IE089 牧野 政道
ソフトウェアとのインターフェース.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
Boost.勉強会 #8 大阪 ( ) C++ Tips 3 カンマ演算子編.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
プログラミング言語 作成の実際 しらいゆたか.
計算機基礎Ⅱ,Ⅲ (指導書 pp. 76~94) 改訂:佐竹 純二 (作成:岡本 吉央).
の まとめ 2007/04/02 (Mon) / d;id:hzkr
「ソフトウェアのしくみ」.
情報科学(10-11) 言語処理系と仮想機械.
§3.3 プログラミング 第10回 今日の目標 高級言語のプログラムを実行するまでの過程を示せる インタープリタの仕組みを説明できる
実例で学ぶプログラミング VBAを用いて簡単なゲームを作ろう 徳山 豪 東北大学情報科学研究科 システム情報科学専攻 情報システム評価学分野.
プログラムの制御構造 選択・繰り返し.
本時の目標 「簡単なプログラム言語の意味を理解し、マクロ機能を使って簡単なプログラムを作ることができる。」
DirectX勉強会 第5回.
勉強会その3    2016/5/1 10 8分35秒 データの表現 演算.
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
電気・機械・情報概論 VBAプログラミング 第2回 2018年7月2日
MATLAB測位プログラミングの 基礎とGT (2)
地域情報学演習 VBAプログラミング 第3回 2017年10月24日
アルゴリズムとプログラミング (Algorithms and Programming)
indentについて forやifの「中身」を右に寄せる. forやifの「外枠」は右に寄せない. int x; x = 3;
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
ソフトウェア制作論 平成30年10月10日.
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
情報とコンピュータ 静岡大学工学部 安藤和敏
プログラミング言語入門 2013 (C言語 初級) 演習期間 担当 参考資料 採点 10/24 - 1/23 (全10回) 松澤,鈴木,児玉
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
C++ 構文解析 構文解析器の状態保存と復元
第6回レポート解説 条件1 条件2 条件3 月の入力 月、日、曜日の表示 日の入力 曜日の入力
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 3 回.
コンピュータアーキテクチャ 第 2 回.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語 1.
C#プログラミング実習 第2回.
高度プログラミング演習 (11).
C言語講座 制御(選択) 2006年 計算技術研究会.
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
コンピュータアーキテクチャ 第 3 回.
アルゴリズムの視覚化 この図は左が大きく、 右が小さくなるようにソートしている  この図は左が大きく、  右が小さくなるようにソートしている
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
情報システム基盤学基礎1 コンピュータアーキテクチャ編
ソフトウェア制作論 平成30年10月17日.
場合分け(If Then Else,Select Case) 繰返し(Do While) 繰返しその2(For Next)
1.2 言語処理の諸観点 (1)言語処理の利用分野
プログラミング言語によっては,複素数が使えない。
情報処理Ⅱ 第3回 2004年10月19日(火).
C言語講座 四則演算  if ,  switch 制御文.
計算技術研究会 C言語講座 第二回 制御構文 if , switch.
6.5 最終コード生成 (1)コードの形式 ①絶対2進コード(AB : absolute binary) 命令後のオペランドが絶対番地指定。
Presentation transcript:

6.3 インタプリタ (1)インタプリタ(interpreter)とは ①解釈実行系、直接実行系、通訳系等と呼ばれる。 ②原則的には原始プログラムとデータを入力して結果を出力。 ③中間言語を出力して中間言語を解釈実行する方法もある。 ④仮想的な機械語を設定し、これを解釈実行するタイプもある(これをエミュレータということもある)。 ただし、最後の例は、マクロ定義と組み合わせることで コンパイラとなりうる。

(2)スタックマシンエミュレータの例 初期化 private void Eval_Initialize() { ptrEvalStack=0; ptrNameTable=0; ptrProgStack=0; }

トップレベルのみの概要(1) private void Eval() { NameData P1,P2; int i=0; pushEvalStack(new NameData("*Function*")); while(i<numStatement) { nextIP =i+1; if (AllStatement[i].operation=="end") { MessageBox.Show(“プログラムの終了です。カウンタ=” + i.ToString()); break; } switch (AllStatement[i].operation) case "+" :Eval_add();break; case "-" :Eval_sub();break; case "%" :Eval_mod();break;

トップレベルのみの概要(2) case "*" :Eval_mult();break; case "mod" :Eval_mod();break; case "/" :Eval_dev();break; case "^" :Eval_exp();break; case "=" :Eval_set();break; case "++" :Eval_PPset();break; case "--" :Eval_MMset();break; case "++$" :Eval_BeforPPset();break; case "--$" :Eval_BeforMMset();break; case "-$" :Eval_minus();break; case "+$" :Eval_plus();break; case "+=" :Eval_AsignPset();break; case "-=" :Eval_AsignMset();break; case "*=" :Eval_AsignMultset();break; case "/=" :Eval_AsignDivset();break; case "==" :Eval_equal();break; case "!=" :Eval_not_equal();break; case ">" :Eval_greater_than();break;

トップレベルのみの概要(3) case ">" :Eval_greater_than();break; case ">=" :Eval_greater_than_equal();break; case "<" :Eval_less_than();break; case "<=" :Eval_less_than_equal();break; case "||" :Eval_or();break; case "&&" :Eval_and();break; case "%%" :Eval_exclusive_or();break; case "!" :Eval_not();break; case "ArgEnd" :Eval_Arg();break; case "Func" :Eval_func(AllStatement[i].str); break; case "*dimStart" :Eval_dimStart(AllStatement[i].str); case "dim" :Eval_dim();break; case "*PStart*" :Eval_PStart();break; case "*Parm*" :Eval_Param(AllStatement[i].str); case "return" :Eval_return();break;

トップレベルのみの概要(4) case "StNo"         :StatementNo=int.Parse(AllStatement[i].str);     ptrEvalStack=0;break; case "goto" :P1=Eval(popEvalStack()); nextIP=(int)P1.Val; break; case "then" :P2=Eval(popEvalStack()); P1=Eval(popEvalStack()); if(P1.Type=="Number" && P2.Type=="Number" ) { if(P1.Val ==0) nextIP=(int)P2.Val; } else MessageBox.Show("評価エラーです"); break; default :pushEvalStack(AllStatement[i]);break; i=nextIP;

(3)仮想マシンエミュレータ ①命令取出(命令フェッチ) 実行アドレス(注)の命令を取り出してオペランドに分離する。 ②次のアドレス計算   実行アドレス(注)の命令を取り出してオペランドに分離する。 ②次のアドレス計算   次の実行アドレスを設定。なお、ジャンプ命令は次の実行アドレスを変更することで実現される。 ③命令実行   命令の実行。 ④命令実行後の状態フラグ設定   算術演算等により演算結果の状態フラグを設定する。この状態フラグより、JP, JZ, JM でジャンプするかどうかを判定する。 (注)実行アドレスは、命令カウンタ(instruction counter)、プログラムカウンタ(program counter)とも呼ばれる。 

以下VB6による例 初期化 Private Sub 初期化() SVC_Call = 0 ExecAddress = 0 End Sub

1命令の実行 Private Sub Command2_Click() 命令取出 アドレス計算 命令実行 If SVC_Flag Then  アドレス計算  命令実行  If SVC_Flag Then If SVC_Call = 0 Then CRLF = Chr(13) & Chr(10) Text3.Text = Right(Text3.Text, 5000) & CRLF & _ "プログラムの終了です." ExecAddress = 0 命令表示 End If End Sub

命令取出し Private Sub 命令取出() A = MCode(ExecAddress): MPart(0) = A \ &H100: A2 = A Mod &H100 If MPart(0) >= &H80 Then MPart(1) = A2 \ &H10: MPart(2) = A2 Mod &H10 MPart(3) = MCode(ExecAddress + 1) ExecAddress = ExecAddress + 2 ElseIf MPart(0) = &H50 Then ExecAddress = ExecAddress + 1 Else MPart(1) = 0: MPart(2) = 0: MPart(3) = A2 End If End Sub

アドレス計算 Private Sub アドレス計算() If MPart(0) >= &H80 Then If MPart(2) = 0 Then EffectAddress = MPart(3) Else ID = MPart(2) EffectAddress = Register(ID) + MPart(3) End If End Sub

命令実行直後の状態フラグ設定 Private Sub 状態フラグ設定(Rno) Status(0) = 0: Status(1) = 0: Status(2) = 0 If Register(Rno) > 0 Then Status(0) = 1 ElseIf Register(Rno) = 0 Then Status(1) = 1 Else Status(2) = 1 End If End Sub

命令実行(その1) Private Sub 命令実行() SVC_Flag = False Select Case MPart(0) Case &HA0: Register(MPart(1)) = MCode(EffectAddress) 'Load 状態フラグ設定 MPart(1) Case &HA2: MCode(EffectAddress) = Register(MPart(1)) 'Store Case &HB0: Register(MPart(1)) = EffectAddress 'LI (Load Imediate) Case &H81: Register(MPart(1)) = Register(MPart(1)) + _                      MCode(EffectAddress) 'ADD Case &H82: Register(MPart(1)) = Register(MPart(1)) - _                      MCode(EffectAddress) 'SUB Case &H83: Register(MPart(1)) = Register(MPart(1)) * _                      MCode(EffectAddress) 'MULT

命令実行(その2) Case &H84: Register(MPart(1)) = Register(MPart(1)) \ _ MCode(EffectAddress) 'DIV 状態フラグ設定 MPart(1)  ・   ・  (中略)  ・ Case &HE0: ExecAddress = EffectAddress 'JMP Case &HE1: If Status(0) <> 0 Then ExecAddress = EffectAddress                          'JP (Jump Plus) Case &HE2: If Status(1) <> 0 Then ExecAddress = EffectAddress                          'JZ (Jump Zero) Case &HE3: If Status(2) <> 0 Then ExecAddress = EffectAddress                          'JM (Jump Minus) ・ 

命令実行(その3)  ・   ・  (中略)  ・   Case &H61: Register(MPart(1)) = Val(InputBox("データ入力"))   Case &H1: SVC_Call = MPart(1): SVC_Flag = True 'SVC_Call End Select End Sub