コンピュータ概論B ー ソフトウェアを中心に ー #12 コンパイラとインタプリタ

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 知能情報学部 新田直也. 講義概要  私の研究室: 13 号館 2 階 (13-206)  講義資料について :  参考図書 : 河西朝雄 : 「原理がわかる プログラムの法則」,
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
連続系アルゴリズム演習 第2回 OpenMPによる課題.
Java I 第2回 (4/18)
プログラミング入門 (教科書1~3章) 2005/04/14(Thu.).
FORTRAN 科学技術計算用 数値演算精度を重視したシステム K=0 DO 10 I=0,N,1 K=K+I 10 CONTINUE
計算機システムⅡ 主記憶装置とALU,レジスタの制御
数値計算及び実習 第3回 プログラミングの基礎(1).
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
オブジェクト指向言語論 知能情報学部 新田直也.
2012年度 計算機システム演習 第4回 白幡 晃一.
§3.3 プログラミング 第10回 今日の目標 高級言語のプログラムを実行するまでの過程を示せる インタープリタの仕組みを説明できる
プログラミング言語論 理工学部 情報システム工学科 新田直也.
プログラミング言語論 理工学部 情報システム工学科 新田直也.
情報科学1(G1) 2016年度.
データ構造と アルゴリズム 知能情報学部 新田直也.
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
①データ構造 ②アルゴリズム ③プログラム言語 ④マークアップ言語
オブジェクト指向 プログラミング 第一回 知能情報学部 新田直也.
心理学情報処理法Ⅰ コンピュータ言語の歴史.
「ソフトウェアのしくみ」.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
二分探索木によるサーチ.
コンピュータの原理 1E17M053-9 奈良 皐佑 1E17M070-7 師尾 直希        1E17M078-6 渡邊 惇.
コンピュータ概論B ー ソフトウェアを中心に ー #10 プログラミング・言語
プログラミング言語入門 手続き型言語としてのJava
高速剰余算アルゴリズムとそのハードウェア実装についての研究
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
1.コンピュータと情報処理 p.18 第1章第1節 2.コンピュータの動作のしくみ CPUと論理回路
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
プログラミング言語入門.
コンピュータに計算させる命令を確かめよう!
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
コンピュータ概論B ー ソフトウェアを中心に ー #02 システムソフトウェアと アプリケーションソフトウェア
プログラミング基礎a 第1回 ハードウェアとソフトウェア プログラミング総論 ~プログラミング言語とは~
動的データ依存関係解析を用いた Javaプログラムスライス手法
プログラム言語 プログラム言語の体系を学ぶ.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
プログラミング基礎a 第1回 ハードウェアとソフトウェア プログラミング総論 ~プログラミング言語とは~
C言語を用いたマシン非依存な JITコンパイラ作成フレームワーク
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
情報とコンピュータ 静岡大学工学部 安藤和敏
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
コンピュータの仕組み 〜ハードウェア〜 1E15M009-3 伊藤佳樹 1E15M035-2 柴田将馬 1E15M061-1 花岡沙紀
2010年度 情報科学序論 ~ 内部構造と動作の仕組み(2) ~.
JAVAバイトコードにおける データ依存解析手法の提案と実装
プログラミング言語入門 2013 (C言語 初級) 演習期間 担当 参考資料 採点 10/24 - 1/23 (全10回) 松澤,鈴木,児玉
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
コンパイラ 2012年10月1日
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
ガイダンス 電子計算機 電気工学科 山本昌志 1E
「マイグレーションを支援する分散集合オブジェクト」
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語 1.
コンピュータ概論B ー ソフトウェアを中心に ー #00 概要説明
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
第2回 Webサーバ.
第6回放送授業.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
2008年度 情報科学序論 ~ 内部構造と動作の仕組み(2) ~.
C#プログラミング実習 第1回.
1.2 言語処理の諸観点 (1)言語処理の利用分野
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
Presentation transcript:

コンピュータ概論B ー ソフトウェアを中心に ー #12 コンパイラとインタプリタ 京都産業大学 安田豊

プログラミング言語 低水準プログラミング言語と 高水準(高級)プログラミング言語 低水準言語の使い道 例えばアセンブリ言語 例えば C など 家電製品など極限まで効率を高めたい場合 参考:Internet Week での非接触カード 組み込み機械など

変数とアルゴリズム 教科書 pp.117- 手続き型言語と非手続き型言語 K=0 FOR I=0 TO N K=K+I NEXT I 処理手順を書き下すタイプ 処理手順を意識しないタイプ 変数の概念 ノイマン型コンピュータの本質 問題の「導出を可能にする解法」をアルゴリズムと呼ぶ 手続き型プログラムとはアルゴリズムを「手順重視」で、文法に従い記述したもの K=0 FOR I=0 TO N K=K+I NEXT I 変数K (ある位置のメモリ) の内容をゼロに ラベル10までを変数 I を 1 から N までひとつずつ変化させながら繰り返し K に K の内容と I の内容を足したものを記入

FORTRAN 科学技術計算用 数値演算精度を重視したシステム K=0 DO 10 I=0,N,1 K=K+I 10 CONTINUE 事務処理計算に(文法上も)特化したCOBOLの対極 1955以来長く使われ、多数の数値演算ライブラリが用意されている K=0 DO 10 I=0,N,1 K=K+I 10 CONTINUE

BASIC Beginner’s All porpose Symbolic Instruction Code 初心者向け汎用記号命令列(?) 1964年から 学習が容易 簡易な記述 長いプログラムをわかりやすく書く仕組みがない 8bit マイクロコンピュータと簡易なインタプリタ(後述)とともに 1980 頃大きく普及 K=0 FOR I=0 TO N K=K+I NEXT I

COBOL 事務処理向け 自然言語に近く、冗長な記述 レコード定義が自然に可能 1-Nまでの加算も冗長だが普通に書ける ビジネスロジックをそのまま記述しバグを減らす レコード定義が自然に可能 1-Nまでの加算も冗長だが普通に書ける 01 INPUT-RECORD. 10 ID PICTURE X(6). 20 YEAR PICTURE 9(2). 20 SEQ PICTURE 9(4). 10 LENGTH PICTURE 9(3)V99. 10 NAME PICTURE X(20). 01 OUTPUT-RECORD. 10 FILLER PICTURE 9(3)V99. 10 FILLER PICTURE X(20). .... MOVE ID TO WORKID. ADD 1 TO SEQ OF WORKID. WRITE OUTPUT-RECORD. MOVE ZERO TO K. PERFORM LOOP-ADD UNTIL I EQUAL TO N. .... LOOP-ADD. ADD I TO K. ADD 1 TO I.

C システム記述向け 1972年に開発(これでも後発) 下例が一般的手法 右例が再帰呼び出しを利用した記述 0の累計は0と定義 0以上のNの累計はN-1の累計にNを足したものと定義 int sub(i) { if(i==0) { return(0); } else { return(sub(i-1)+i); }; } main() { int k,n; n=10; k=sub(n); printf("%d¥n",k); main() { int i,k,n; n=10; k=0; for(i=0;i<=n;i++) { k+=i; }; printf("%d¥n",k);

非手続き型言語 データの処理手順を書くのではなく データ間の関係を記述する(など) 例:論理型言語 Prolog 例:データフロー 計算機が自動処理する内容はそこから導き出す アルゴリズムの別の視点からの記述でもある 例:論理型言語 Prolog 論理(二者間の関係)を記述すれば 自動的に解を導出することができる 例:データフロー 処理するべきデータ間の演算方法を書けば データが揃い次第先へ進み解が出る

Prologによるプログラム例 手続きを書くのではなくデータの関係を記述 そこからシステムが解を導出する 実際は文頭から手続き的に解く、、、 grand(X,Y) :- parent(X,Z), parent(Z,Y). parent(amy,bob). parent(amy,jane). parent(bob,carol). parent(bob,will). % sbprolog SB-Prolog Version 3.1 | ?- consult('a.pro'). yes | ?- parent(amy,bob). | ?- parent(amy,X). X = bob X = jane no | ?- grand(amy,X). X = carol X = will | ?- grand(X,will). X = amy 手続きを書くのではなくデータの関係を記述 そこからシステムが解を導出する 実際は文頭から手続き的に解く、、、 例: amyの親はbobとjane bob の親はcarolとwill 事実を入力すると yes と答え 変数を与えると、あり得る解を返す amyの祖父母は?willが祖父母なのは?

Prolog による1-Nまでの和 0の累計は0と定義 0以上のNの累計はN-1の累計にNを足したものと定義 再帰的定義 kei(0,0). kei(N,K) :- N > 0, N1 is N - 1,   kei(N1,Kn), K is Kn + N. 0の累計は0と定義 0以上のNの累計はN-1の累計にNを足したものと定義 再帰的定義 Nを指定し、kei(N,K)を評価することでKを導出 再帰的手順 | ?- kei(0,0). yes | ?- kei(0,100). no | ?- kei(0,N). N = 0 | ?- kei(1,N). N = 1 | ?- kei(4,N). N = 10 | ?- kei(1000,N). N = 500500

データフロー * 関数型言語の一つ 実行順序は指示されない + {x=2*4, y=x+5} という計算をフローグラフで表現 処理をデータ間の関係として定義 データが揃った関数から実行 ループは再帰的実行で処理 実行順序は指示されない 値が上書きされるようなメモリの使い方ができない ノイマン型である必要がなくなるポイント 4 2 + 5 x * y

データフロー 並列処理に有利 ハードウェアとの親和性 並列動作可能な構成 順序による制約はノイマン型の致命的弱点 処理の並列度が上がらない そのままプログラムを回路化できる可能性 演算素子を並列に用意できる 並列動作可能な構成 ノイマン型では複数用意しても同時に使えない CPU (ノイマン型処理装置)は一点注視タイプ

まとめ 低水準言語と高水準言語 手続き型言語と非手続き型言語 目的に合わせて多様な言語が存在する CPU 依存と非依存 自然言語との距離 手続き型:ノイマン型そのもの 非手続き型=非ノイマン型システムの可能性 非手続き型言語のノイマン型システムによる処理は効率が上がらない場合が多い いずれにしてもアルゴリズムの記述である 目的に合わせて多様な言語が存在する データフローチップも画像処理などで実用化

コンパイラとインタプリタ プログラミング言語から機械語へ 二つの方法 コンパイラ インタプリタ CPUは機械語しか実行できない 機械語によって等価な振舞いをさせなければ どうやって? 二つの方法 コンパイラ 機械語に変換する インタプリタ 変換せず真似て動作させる

コンパイラ Compiler = 編集、編纂 機械語に変換して実行 変換前:原始プログラム (Source program) 変換後:目的プログラム (Object program) 多くの OS では目的プログラムをリンク (link) と呼ばれる処理を通してライブラリと結合し、実行可能プログラム (executable program) とし、これを実行する

コンパイラ 最適化の可能性 変換一回、実行多数回、では高効率 秘密保持 ループの中の無駄な演算をループの外に 最近の CPU では並列度を上げるためにも使われる (Itanium などでは CPU 中の並列動作可能な演算命令を同時に投入することが可能) 変換一回、実行多数回、では高効率 秘密保持 ソースが得られない場合が多い(逆変換不可)

コンパイラ Source Object Exec. Compiler linker Exec. OS Hardware 高級言語 (≒)機械語 機械語 Source Object Exec. Compiler linker Exec. OS Hardware

コンパイラ Source Object Exec. Compiler linker Exec. OS OS OS Hardware 高級言語 (≒)機械語 機械語 Source Object Exec. Compiler linker Exec. OS OS OS Hardware Hardware Hardware 別々であっても構わない

インタプリタ プログラムの機能ごとに対応し、部分的に実行可能な機械語コードを予め用意しておく 実行したいプログラムを部分的に読み出し、対応する機械語コードを選択して実行 Interpreter = 通訳、ではあるが変換はしていない 逐語的に処理しているため、と理解するべき まるでシミュレーション (simulate : 装う / emulation : 真似る) その言語を直接実行できる CPU をソフトウェアで作ったようなもの

インタプリタ Source Interpreter + - = print OS Hardware 高級言語 A=B+1 print A 高級言語 まるでSource Program を直接解釈実行できるコンピュータが仮想的にあるみたい。 CPUをエミュレートしている。 Interpreter 機械語 + - = print OS Hardware 変換はされていない!

インタプリタ 部分的実行が可能 実行速度が遅い 機械語が異なる環境でも動作する 一行ずつテストしながら開発するような作業が可能 真似るために必要な機械語は等価変換した機械語より処理量が多い 機械語が異なる環境でも動作する Java / iアプリ

Java 教科書 pp.119 まず中間プログラムにコンパイル インタプリタで実行 Sun Microsystems が 1995 年に開発 実行速度を向上させるため バイトコード (Byte Code) と呼ばれる インタプリタで実行 CPU やハードウェアの差を吸収して実行 Java VM (Virtual Machine 仮想計算機) の存在 iAPPLや Web で使われる

Java Source Object Java VM (Interpreter) + - = print Compiler OS OS 中間コード Source Object Java VM (Interpreter) + - = print Compiler OS OS Hardware Hardware

コンパイラとインタプリタ コンパイラ:一括変換して実行 インタプリタ:逐次真似して実行 様々な方式がある Java のような組み合わせ Java 自身、VM 高速化のためにいろいろやっている Just In Time コンパイラ:バイトコード実行前に一括して機械語に変換、実行 Hot Spot :バイトコードの一部分(ループの中など)をコンパイルしながら実行 工夫の産物である 無意味な分類にとらわれないように