組織情報論
第8回 プログラムとプログラム言語
1
講師 佐枝三郎
https://sites.google.com/site/jiusaedasoshikiron2017/
プログラムの前提知識とアセンブラ
2
バイナリ ―データとコンピュータの機械語
• コンピュータメモリ上の記録は2進データであり、その最小
単位は、ON-OFFのいずれかの状態を表すもの。これを
ビット(bit)という。
• 10101010
•
• コンピュータメモリの単位として、英数字が表現できる8ビッ
トを1バイト(byte)がある。漢字を使う日本語では1バイトで
は足りず、2バイト(16ビット)が最小単位となる。
• CPUが処理する記述できる最小単位は、一般的にはコン
ピュータの種類によって、16ビット、32ビット、あるいは64
ビットである。これらを1ワード(word)という単位と呼ぶ。
3
10進法記述と2進法、16進法の記述
• 数値の記述方法 -n進法ー
– 10進法: 0から9まで10種類の記号を使って、数値を表現する。
– 2進法: 0と1の2種類の記号で、数値を表現する。
– 16進法: 0から9にA, B, C, D, E, Fを加え、16個の記号で数値を
表現する。10進法の16になったら繰り上がり「10」となり、10進
法の256になったら繰り上がり「100」となる。以下同様。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 A B C D E F
◎10進法と16進法の対応
◎10進法の 1000 16進法の 3E8
◎16進法の 1000 10進法の 4096
4
数値、英字、特殊記号の16進表現
注)この表では16進数を表現するのに小文字のアルファベットを使用している。
5
16進数による数値とプログラムの表現
**number** 0
1 10 100
**program** SAMP START
XOR GR1,GR1 ; COUNTER XOR GR2,GR2 ; + VALN XOR GR3,GR3 ; SUM LP ADDA GR2,DELTA
ADDA GR3,GR2 ST GR3,ANS ADDA GR1,ONE CPA GR1,STOP JNZ LP
ST GR3,ANS RET
数値とプログラムの文字表現 数値とプログラムの16進数表現
(コンピュータのメモリ上に存在する状態)
6
ITパスポート試験問題 ①
問題: プログラム言語の役割として,適切なもの
はどれか。
A: コンピュータが自動生成するプログラムを,
人間が解読できるようにする。
B: コンピュータに対して処理すべきデータの
件数を記述する。
C: コンピュータに対して処理手続を記述する。
D: 人間が記述した不完全なプログラムを
完全なプログラムにする。
7
最初のプログラム言語-アセンブラ
• 1944年に提案され、1951年に稼働したEDVACというコンピュー
ターの開発で、プログラムをメモリ内に入れる設計が行われた
– プログラムの変更が容易でかつ高速なコンピューターが可能となった
– EDVACが現在のコンピューターの原型であり、メモリに内蔵された命令が
現在のプログラムの原型である
– メモリに内蔵された命令を機械語と呼び、アセンブラはそれに対応する
• すべてのコンピュータは、機械語で稼働し、すべてのコンピュー
タにアセンブラがある
– 大型コンピュータ(例:IBMメインフレーム) IBM S/370 アッセンブラ
– Microsoft Windows MASM (マイクロソフト アッセンブラ)
– iPhone、iPadなどApple系 ARMアッセンブラ
• アセンブラを説明する例として「CASL II」を取り上げる
– CASL IIとは、情報処理技術者試験で使用されるアセンブリ言語
– CASL IIは仮想コンピュータCOMMET IIのアーキテクチャに基づいている
8
COMMET IIのアーキテクチャ
• 記憶装置(メモリ)
– ここにデータやプログラムが格納される
– COMETⅡでは、16ビットを記憶の単位(1ワード)として、65536ワード
記憶できる
• 記憶場所は番地(アドレス)で順序と位置が指定される
– アドレスは0番地から始まり65535番地まである
• 格納できる数値は、整数のみである
– 1つの番地には、正の数値のみを利用する場合は、0から65535まで
格納できる
– マイナスの数値も扱う場合は、補数という考え方を用い、-32768から
32767 までの数値が記憶できる
• 1ワードのビット構成は、次の通り。
9
COMMET IIのアーキテクチャ
• コンピュータはデータを記憶する場所としてのメモリ、計算や比較
などの処理を行うCPU(各種レジスタ)から構成されている
• 制御装置とプログラム(命令語)
– 制御方式は逐次制御(1つずつ順に)であり、メモリ上のプログラム(命 令語)はアドレスの順に実行される
– 命令語は1ワード(16ビット)、2ワード(32ビット)で構成されている
• 1ワードの命令: 命令の種類だけ指定すればよく、メモリのアドレスを使用しないRET などの命令
• 2ワードの命令: 命令の種類と使用するレジスタなどを1ワードに、使用するメモリの 番地などを1ワードに記述する命令
– COMMET IIでは、メモリが65535ワードあるため、2ワードの命令なら約 32000個の命令が格納できる
• レジスタ
– 制御装置の中にあり、計算処理の際にデータを一時的に置く場所 – レジスタに、メモリからデータを取り出して、計算処理を行う
– レジスタは、GR(16ビット)、SP(16ビット)、PR(16ビット)、FR(3ビット)の4
種類がある 10
COMMET IIのアーキテクチャ
• レジスターの種類
– GR(汎用レジスタ :General Register)
• GR0~GR7の8個があり、算術、論理、比較、シフトなどの演算に使用する
• このうち、GR1~GR7のレジスタは、指標レジスタ(index register)としてアド レスの修飾にも使用する
– SP(スタックポインタ : Stack Pointer)
• スタックの最上段のアドレスを保持している。スタック操作命令(PUSH, POP)やコール、リターン命令(CALL, RET)で使用する。
– PR(プログラムレジスタ : Program Register)
• 次に実行すべき命令語の先頭アドレスを保持している。
– FR(フラグレジスタ : Flag Register)
• OF(Overflow Flag)、SF(Sign Flag)、ZF(Zero Flag)と呼ぶ3個のビットからな り、演算命令などの実行によって次の値が設定される
• これらの値は、条件付き分岐命令で参照される
11
COMMET IIのアーキテクチャ
• FR(フラグレジスタ )のフラグの意味
– OF: 算術演算命令の場合は、演算結果が -32768~32767に収まらなく
なった場合1になり、それ以外は0になる。論理演算命令の場合は、演算結
果が0~65535に収まらなくなった場合1になり、それ以外は0になる。
– SF: 演算結果の符号が負(ビット15が1)の場合1、それ以外は0になる
– ZF: 演算結果が0(全部のビットが0)の場合1、それ以外は0になる
COMMET IIのレジスタ構成 16ビット
PR
16ビット SP
16ビット GR0
FR OF
16ビット GR1
16ビット GR2
16ビット GR7
・
・
SF ZF
12
アセンブラの主要な命令
• コンピュータの主要な命令は次の四つである
– メモリのデータとレジスタのデータのやり取り
• ロード(LD): レジスタにメモリのデータを持ってくる
• ストア(ST): レジスタのデータをメモリに格納する
– レジスタ間、レジスタとメモリのデータの計算
• 数値計算(ADDAなど)、論理計算(ADDLなど)
– レジスタ間、レジスタとメモリの内容の比較、及びその結果の
判定
• 二つの値が等しい、どちらかが大きいなど(CPAなど)
– 次に行う命令の指定(命令が置かれている場所の指示)
• 通常は命令を順番にひとつずつ行っていく(JUMP、JPLなど)
• ジャンプという命令は、ある場所を指定し、次にはその場所に飛び、 そこの命令を行う
• 条件付きジャンプは、ある条件が成立したら、指定した場所に飛びそ この命令を行い、成立しなければ次の命令を行うものである
• この四つの要素が、すべてのプログラム言語の基本機能
となっている
13
START :開始
LD (レジスタへの取り込み)
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :答の場所確保
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 0002
10
14
START :開始
ST (レジスタからメモリへ)
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 0011
55
55
15
START :開始
ADDR
(レジスタとメモリを足す)
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 0006
3
4
16
START :開始
通常のプログラムの動き
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 00010002000317
START :開始
JUMP (違う場所にジャンプ)
の時のプログラムの動き
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 0010
55
0005 0006
18
START :開始
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 0008
10
0009 0011
比較(CPA)と結果が0の場合
のジャンプ(JZE) [正]
10
19
START :開始
LD GR1,N :Nをレジ1に設定 LD GR2,ZERO :0をレジ2設定
LOOP :戻り先
ADDA GR2,ONE :レジ2に1足す ADDA GR3,GR2 :レジ3にレジ2足す CPA GR1,GR2 :比較
JZE EXIT :0以下はEXITへ JUMP LOOP :LOOPへ EXIT ST GR3,ANS : ANSにGR3入れる
RET :計算の終わり
(スタックポインタ)
GR1(レジスタ)
GR2(レジスタ)
フラグレジスタ
GR3(レジスタ)
00010002 0003 0004 0005 0006 0007 0008 0009 0010
0012
LD GR3,ZERO : 0をレジ3設定
ONE DC 1 :ONEに1を設定 ZERO DC 1 :ZEROに0を設定 N DC 10 :Nに10を設定 ANS DS 1 :
END :プログラムの終わり
0011
0013 0014 0015 0016 0017
メモリの内容 CPUの中身
負 ゼロ オ
プログラムカウンタ 0008
10
0009 0011
比較(CPA)と結果が0の場合
のジャンプ(JZE) [偽]
20
20
プログラム言語の成立と変遷
21
1950 1960 1970 1980 1990 2000 2010
プログラム言語の発展
アセンブラ アセンブラ アセンブラ アセンブラ
(機械語
(機械語
(機械語
(機械語 対応 対応 対応対応)
COBOL
(事務処理)
(事務処理)
(事務処理)
(事務処理)
FORTRAN
(科学技術
(科学技術(科学技術
(科学技術 計算) 計算) 計算) 計算)
ALGOL
(アルゴリズ
(アルゴリズ
(アルゴリズ
(アルゴリズ ム研究)ム研究)ム研究) ム研究)
PL/I
(汎用処理)
(汎用処理)
(汎用処理)
(汎用処理)
Lisp
(論理計算
(論理計算
(論理計算
(論理計算 研究)研究) 研究)研究)
Simula
(アルゴリズ
(アルゴリズ
(アルゴリズ
(アルゴリズ ム研究) ム研究)ム研究) ム研究) BASIC
(教育用)
(教育用)
(教育用)
(教育用)
Smalltalk(オ(オ(オ(オ ブジェクト指 ブジェクト指 ブジェクト指 ブジェクト指
向) 向)向) 向)
CommonLisp
(論理計算
(論理計算(論理計算
(論理計算 研究)研究) 研究)研究) C
(汎用処理)
(汎用処理)
(汎用処理)
(汎用処理)
C++
(汎用・オブ
(汎用・オブ
(汎用・オブ
(汎用・オブ ジェクト) ジェクト) ジェクト) ジェクト)
Java
(汎用・オブ
(汎用・オブ
(汎用・オブ
(汎用・オブ ジェクト) ジェクト) ジェクト) ジェクト)
C#
(汎用・オブ
(汎用・オブ(汎用・オブ
(汎用・オブ ジェクト) ジェクト) ジェクト) ジェクト)
JavaScript
(
(
((Web・オブ・オブ・オブ・オブ ジェクト) ジェクト) ジェクト) ジェクト)
Ruby
(汎用・オブ
(汎用・オブ
(汎用・オブ
(汎用・オブ ジェクト) ジェクト) ジェクト) ジェクト) Perl
(汎用・オブ
(汎用・オブ
(汎用・オブ
(汎用・オブ ジェクト) ジェクト)ジェクト) ジェクト)
Python
(汎用・オブ
(汎用・オブ
(汎用・オブ
(汎用・オブ ジェクト) ジェクト) ジェクト) ジェクト)
Haskel
(論理計算
(論理計算(論理計算
(論理計算 研究)研究) 研究)研究) Visual BASIC
(汎用・
(汎用・
(汎用・(汎用・MS))))
22
プログラム言語の現在価値
• 各言語に対する現在の需要はどのようなものか
– Googleで、「XX言語 求人」で検索したヒット数をグラフ化したものが以下のグラフ – Ruby言語、C言語、python言語に関する需要が非常に高いと考えられる
– C#, Javaなどの基幹システム向けオブジェクト指向言語がその次に登場 – COBOL、 アセンブラ、 FORTRANも、継続的な需要がある
23 プログラム言語 googleのヒット数
c言語 1910000
Ruby言語 419000
c#言語 387000
Python言語 323000
COBOL言語 291000
Java言語 238000
PL/1言語 60000
FORTRAN言語 47200
Haskel言語 41200
Lisp言語 36700
アセンブラ言語 20700
各言語の求人需要
c言語 Ruby言語 c#言語
Python言語 COBOL言語 Java言語 PL/1言語 FORTRAN言語 Haskel言語
Lisp言語 アセンブラ言語
プログラム言語とは
• プログラム言語は、手続き型プログラミング言語
(Procedural Programming Language)と宣言型プログラミン
グ言語(Declarative Programming Language)に分けられる
– 手続き型言語は、処理を時系列的に(順番に)記述するタイプ
の言語である
• 処理内容を順番に記述していくため、考え方が単純でプロ グラミング が簡単
• 処理の順序を間違えると想定しない結果となり、原因追究が大変に なる
– 宣言型言語は、処理内容をその数学的性質に着目して、数式
を書くように記述するプログラム言語
• 処理内容を数学の公理のように表現できる場合、簡潔でエレガント なプログラムを書くことができる
• 明確な時間順序を含むような処理内容の記述には不向きである
• 宣言型言語は、情報科学の分野の研究で多く利用されて
いるが、企業の実務で利用されるプログラム言語はほとん
どが手続き型言語である
24
主要な手続き型言語
• 1950年代の後半には、現在でも利用されているFORTRAN、COBOL
などの手続き型言語が登場した
• その後、コンピュータの主流が、大型コンピュータ(メインフレーム)
から、サーバやパソコンへ変わっていくに従い、その環境に適したC
言語、Java言語が多く利用されるようになる
• 1980年代後半から、オブジェクト指向プログラミングという手法が普
及し、この手法を実装できるオブジェクト指向言語が登場し、現在は
この種の言語が主流になっている
– コンパイル型:(プログラムのテキストを機械語に翻訳し、機械語になっ
たものを実行する方式) Java、C++、C#など
– スクリプト型:(プログラムのテキストをそのまま読み込み、実行する方
式) Python、Perl、Rubyなど
• これらの主要なプログラム言語の内容を簡単に紹介する
– プログラムのサンプルとして、「1から10までを集計する」プログラムを
しめす
25
FORTRAN(科学技術計算用言語)
• FORTRAN (フォートラン)は、最初にコン
パイラが作られたプログラム言語
– FORTRANは「Formula Translator」 (数式 変換器)の頭の文字を付けたもの
• 1957年に IBM704というコンピュータ上で
稼働する、最初のコンパイラ(翻訳ソフト
ウェア)がリリースされた
• 現在も科学技術系計算分野では、多く
では使用され続け、約50年以上の歴史
がある
• 長く使用されている理由
– 実行性能を重視する設計思想であり、科 学技術計算に焦点を当てた言語仕様で ある
– 言語仕様を時代に合わせ、変更・拡張 し、利用者が他の新しい言語に離れな かった
• FORTRAN仕様の変遷をみると、
FORTRAN Iから始まり、FORTRAN
II/III/IV、 FORTRAN 66, FORTRAN
77,Fortran 90, Fortran 95 等となって現在
に至っている
●FORTRANのプログラム例 SUM = 0
DO 100 I = 1,10 SUM = SUM + I 100 CONTINUE
WRITE(6,1000) SUM 1000 FORMAT(1H ,F10.0)
STOP END
26
COBOL(事務処理用言語)
• FORTRAN が科学技術計算用言語であるの
に対し、COBOL は事務処理用言語である
– COBOL の名称は Common Business Oriented Languageに由来する
– 1960年に最初の言語仕様が策定され、同じ 年に最初のコンパイラが開発された。
• FORTRAN同様に、時代と共に言語仕様を少
しずつ改変しながら、現在まで使用され続
けている
• COBOLのプログラムは、プログラム言語の
中で非常に特徴的な構文を持つ
– プログラムの保守性を高めるため、宣言部 が長い
– 計算式や代入文の代わりに、プログラムの 可読性を高めるため、“MOVE 0 TO WK- SUM.”や “ADD I TO WK-SUM.” が使用される
• COBOL では任意桁数の整数型演算が可能
である
– COBOLが事務処理用言語であるためである
●COBOLのプログラム例 IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE. ENVIRONMENT DIVISION. DATA DIVISION.
WORKING-STORAGE SECTION. 01 I PIC 9(02) VALUE 0. 01 SUM PIC 9(04) VALUE 0. PROCEDURE DIVISION.
PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL I > 10
ADD I TO SUM END-PERFORM DISPLAY SUM STOP RUN.
27
Java(ネットワーク指向言語)
• Java (ジャバ) は、1990 年初めに家電組み込み用言語として開発された
– インターネットの拡大期であったため、言語仕様をネットワーク対応に焦点をあて、全世界的に普及した
– 1995 年に最初の処理系が開発され、その後も改良が続けられている
• Java の構文は、C言語をオブジェクト指向型言語に拡張したC++言語に類似し
ている
– その結果、従来のC, C++プログラマが習得しやすく、Java人口が飛躍的に増加
• Javaの特徴は、いったんバイトコード(中間言語)に変換され、それをJava仮想
マシンが読み込み、プログラムが実行される点である
– その結果、Javaの仮想マシンはどのようなハードウェア、OSにも対応され、プラット フォーム非依存な言語となっている
– WORAがJavaの標語 (Write Once, Run Anywhere)
• Webアプリや様々な分野で、最も使用されるプログラム言語のひとつである
●Javaのプログラム例 class Sample {
public static void main(String[] args){ float sum = 0;
for(int i = 1; i <= 10; i++) sum += i; System.out.println(sum); }
} 28
Python(スクリプト型言語)
• Pythonは,1990年頃にオランダのRossumが
開発したスクリプト型プログラム言語である
– 現在は3.4のバージョンまで公開されている
• Pythonの特徴
– プログラムコードの可読性が高くなるように 言語が設計されており、その構文のおかげ で、Cなどの言語に比べて、より少ないコード 行数でプログラムを表現することができる – Pythonは複数のプログラミングコンセプトを
取り入れており、オブジェクト指向、命令型、 関数型、手続き型などのプログラミングスタ イルが使用できる
– スクリプト言語として使われることが多いが、 スクリプト以外の幅広い領域でも使用されて いる
– Pythonのインタープリタは、さまざまなオペ レーションシステムで使用することができる。
• Pythonは、Google、Yahooなどに代表される
有名企業でも利用され、初心者が習得しや
すい簡潔さと、大手企業でも採用される十
分な奥深さを兼ね備えた言語である
●Pythonのプログラム例 i = 0
sum = 0 while i < 10:
i += 1 sum += i print sum
29
1980 1985 1990 1995 2000 2005 2010
マークアップ言語などの発展
SGML
(Standard Generalized Markup
Language)
XML
(Extensible Markup Language)
HTML
(HyperText Markup Language)
DHTML
( Dynamic HTML)
XHTML
(Extensible HyperText Markup
Language)
XBRL
(Extensible Business Reporting Language)
WSDL
(Web Services Description
Language)
XBRL
(Extensible Business Reporting Language)
XBRL
(Extensible Business Reporting Language)
Javasclipt
VBsclipt
Perl
30主要なマークアップ言語
• SGML (Standard Generalized Markup Language)
– 1979年に発表された「GML」の後継言語として1986年に国際規格として制 定された
– メタ言語であり、文書にマークアップを含める構文や、どんなタグがどこで使 えるのかなどを記述する構文規則を規定できる
– SGMLの文脈におけるタグは、文書の要素について、それの意味を説明する ためのものである
– 文書作成者は文書の構造を、自分の意図に従って構築し、他人がその意 味を理解しやすいものにできる
• HTML (Hyper Text Markup Language)
– HTMLはハイパーテキストによる、WEB上のページ参照のフレームワーク。 マークアップはテキストを要素で括って意味付けし、テキストの特定要素に URIを用いた他ページへのリンクを記載すれば、ユーザエージェントはそれを 解釈して指定された他ページを表示する
– マークアップの種類に、引用や画像の埋め込み、文書のタイトルの指定など を定める要素があり、ユーザエージェントはそれらを解釈しそれに合わせた 表示を行う。HTMLはこれらのマークアップ規則を定めている。現在は HTML5.0が最新バージョン。
31
主要なマークアップ言語
• XML (Extensible Markup Language)
– XMLはSGMLの後継であり、目的に対応したマークアップ言語開発に汎用的に用 いる言語仕様である。
– マークアップ言語とは、コンピュータ言語の一種で、文章の論理的な構造(段落な ど)や見栄え(フォントサイズなど)に関する指定を、文章とともにテキストファイル に記述するための言語である。
– XMLは、拡張可能な言語の一つに分類され、XMLを使うことで使用者は自分たち 自身で複数のタグを定義することができる。
– XMLの最も重要な目的は、異なる情報システムの間で、特にインターネットを介し て、構造化された文書や構造化されたデータの共有を、容易にすることである – 様々な業務や技術分野における、ソフトウェア間の通信・情報交換に用いるデー
タ形式や、様々な種類のデータを保存するためのファイルフォーマットなどの定義 に使われている。現在はXML1.1が最新バージョン
• XMLを利用した個別用途向けマークアップ言語
– MathML: 数式を記述するためのマークアップ言語、数式特有な様々な特殊記号などを WEB上で表現するための言語
– XBRL: 企業の財務諸表などを記述するためのマークアップ言語、日本の上場企業の有価 証券報告書はXBRLで提出することが義務付けられている
– WDSL: Webサービスを記述するための、マークアップ言語、Webサービスがどのような機 能を持つか、利用するためにはどのような要求をすればいいかを記述する言語
32
XMLのサンプル
<表>
<データ record="1">
<日付>5月10日</日付>
<勘定科目>交通費</勘定科目>
<金額>1,260</金額>
<備考>B社まで、タクシー</備考>
</データ>
<データ record="2">
<日付>5月10日</日付>
<勘定科目>交際費</勘定科目>
<金額>15,000</金額>
<備考>B社Aさんを接待</備考>
</データ>
<データ record="3">
<日付>5月13日</日付>
<勘定科目>会議費</勘定科目>
<金額>900 </金額>
<備考>喫茶店で打ち合せ</備考>
</データ>
</表>
<!DOCTYPE 表 [
<!ELEMENT 表 (データ+) >
<!ELEMENT データ (日付,勘定科目,金額,備考) >
<!ATTLIST データ record CDATA #REQUIRED >
<!ELEMENT 日付 (#PCDATA) >
<!ELEMENT 勘定科目 (#PCDATA) >
<!ELEMENT 金額 (#PCDATA) >
<!ELEMENT 備考 (#PCDATA) > ]>
XML/DTD
33
●どのようなデータ構造とデータ項目がある か、それぞれの項目の関係を定義する
●データベースのスキーマに当たる
●XML/DTDのデータ構造に従って、 データを記述する
●この例は会社で使用した交通費を請 求する書類の例
XML データ
コンパイラの仕組み
人が書く言葉から、機械語(CASL II)へ
34
コンパイラ
• コンパイラは言語プロセッサの代表的なもの
• プログラム言語で記述されたソースコード(原始プログラ
ム)をオブジェクトコード(目的プログラム)に翻訳するこ
とを、Compile(コンパイル)という。
– ソースコード (Source Code): 人間が読めるテキスト形式の
プログラム
– オブジェクトコード(Object Code): 機械語形式のコンピュー
タが読めるプログラム
– CASLIIは、機械語と一対一対応をしたもの。機械語と考えて
もよい。
• プログラム言語とは、COBOL、FORTRAN、Java、Pythonな
どの、人間に理解しやすい、コンピュータにさせる仕事の
内容を記述しやすい言語体系のこと
35
コンパイルの手順図
• FORTRANは、数学や物理の式の計算用 に考えられた言語
• 変数は A、B、 CX、 DATなど、最初が 英字の文字列
• 配列は DAT(100) 1次元
BOX(10,10) 2時限などn次元の構造
• 四則演算は X=A+B*(DAT-CX) など
• 分岐は IF
– IF (条件式 ) THEN [ 処理1 ] ELSE
[ 処理2 ] ENDIF
• ループはDO
– DO 100 I = 1,10 [ 処理 ] 100 CONTINUE
コンパイルの手順を技術計算用の高級
言語FORTRANで説明する。
36
例題
• DATという要素が100の配列に格納されたデータ
から、最大値を見つけるプログラム
DIMENSION REAL DAT(100) DIMENSION REAL MAX, KOTAE DIMENSION INTEGER I
C
MAX = -9999 DO 100 I=1, 100
IF ( DAT(I) > MAX ) THEN MAX = DAT(I) ELSE
ENDIF KOTAE = 0 100 CONTINUE C
KOTAE = MAX STOP
END 37
コンパイル手順の詳細 -FORTRANを
• [字句解析]
例として
– ソースコードに含まれる文字列、FORTRANの場合は、「DIMENSION REAL DAT(100)」などを分 解し、「DIMENSION」、「REAL」、「DAT」のように、トークンと呼ばれる単語の単位に分割する。
• [構文解析]
– プログラム(コード)が、文法的に正しいかをチェックする。FORTRANの場合は、「DO 100 I
=1,100 」というソースコードの場合には、「DO」の次には数字の文字列が、その次には変数
(最初が英字の文字列)が来る、その次は数字、カンマ、数字の並びが来るルールである。 構文的に間違っていると判断しエラーとする。この時の文法ルールを記述するのがBNF
(バッカス記法)である。
• [意味解析]
– 対象言語の意味的なルールが守られ実行可能かを判断する。FORTRANの場合は、配列
(DATなど)の添え字は、INTEGER(整数型)でなければならない。意味的にFORTRANのルー ルに適切でないと判断しエラーとする。
• [コード最適化]
– ソースコードレベルで、実行時により速く実行できるよう、冗長な部分や繰り返し部分を整理
し、オブジェクトコードのサイズをできるだけ小さくするよう変換する。
• [コード生成]
– 整理されたソースコードを、ビットパターンに変換しオブジェクトコードを生成する。
38
トークンへの分解
行数 トークン 種別
1 DIMENTION 予約語
1 REAL 予約語
1 DAT 変数
1 ( 演算子
1 100 数値
1 ) 演算子
:
:
5 MAX 変数
5 = 演算子
5 -9999 数値
6 DO 予約語
6 100 数値「
行数 トークン 種別
6 I 変数
6 1 数値
6 100 数値
7 IF 予約語
7 ( 演算子
7 DAT 演算子
7 ( 演算子
7 I 変数
7 ) 演算子
7 > 演算子
7 MAX 変数
7 ) 演算子
7 THEN 予約語
39
構文解析とBNF記法
• 構文解析は、作成されたプログラムが、プログラム言語の文法に
適合しているかを検査することであり、正しいプログラムの文法を
事前にBNF記法で記述する必要がある
• BNF記法とは、正式にはバッカス・ナウア記法(Backus-Naur Form)
であり、文脈自由文法を定義するのに用いられるメタ言語のこと。
• この記法は、1960年ごろJ.バッカス氏とP.ナウア氏が、ALGOL60
という、の文法定義のために考案したものである。
– ALGOL60は、1950年代後半、アメリカのFORTRAN等の言語に対抗して、ヨー ロッパの研究者が開発したプログラミング言語。
– アルゴリズムの研究目的で作成され、アルゴリズム記述の標準言語として普 及し、その後のC言語などのプログラミング言語設計に大きな影響を与えた。
• 現在は最初のBNF記法を拡張した、EBNF (Extended BNF) が使わ
れ、様々なコンパイラの文法定義や、XMLの構文定義にも利用さ
れている。
• EBNF記法はISO/IEC 14977:1996として、国際規格化されている。
BNF記法 1
• BNF記法はプログラム言語の文法を表現する記法
1桁の10進数を表現するBNF記法
<digit> ::= 0|1|2|3|4|5|6|7|8|9
規則2 ・・・・・・・ ① 「1」が来た場合
② 「2」が来た場合
③ 「X」が来た場合
規則0 規則1
12 X
BNF記法 2
• より広い概念に文法を拡張する。
0以上の10進整数を表現する。
二つの定義が必要
<number> ::=<digit>{<digit>}
<digit> ::= 0|1|2|3|4|5|6|7|8|9
①「12」が来た場合
12
N(0) = 1 を見る。 N(1) = 2 を見る。
②「1X」が来た場合 N(0) = 1 を見る。 1X
N(1) = X を見る。
BNF記法 3
• 簡単な四則演算プログラムの文法をBNF記法で書いてみる。
– プログラムは「 main{1+10*5-3} 」のように{}に囲まれた範囲の
計算式(<expression>)を計算する機能を持つ。
– 計算式の中で用いられる要素と要素間の関係が、以下のBNF記法
で記述される。
<program> ::= main '{' <expression> '}'
<expression> ::= <term>{ <opeas> <term> }
<term> ::= <factor>{ <opemd> <factor> }
<factor> ::= <number>|( <expression> )
<number> ::= <digit>{<digit>}
<opeas> ::= + | -
<opemd> ::= * | /
<digit> ::= 0|1|2|3|4|5|6|7|8|9
意味解析とコード最適化
• 意味解析の処理内容
– 記述された内容の整合性のチェック
この例題では
・ 未定義な変数を使って計算していないか
・ 定義した配列(DIMENSION)の次元と、使用している
配列の次元が、対応しているか
・ 配列の添え字に使用する変数はINTEGER型か
• コード最適化
– 重複する、冗長な処理を整理する
この例題では
・ DOループの中で、同じ変数へ同じ値の代入を、繰り返して
いる。
・ 「 KOTAE = 0 」 をループ(繰り返し)の外に出す。
44
機械語への変換
(アセンブラで機械語を表示)
DIMENSION REAL DAT(100) DIMENSION REAL MAX, KOTAE DIMENSION INTEGER I
C
MAX = -9999 DO 100 I=1, 100
IF ( DAT(I) > MAX ) THEN MAX = DAT(I) ELSE
ENDIF KOTAE = 0 100 CONTINUE C
KOTAE = MAX STOP
END
DAT DS 100 MAX DS 1 KOTAE DS 1 I DS 1 M9999 DC -9999 P0 DC 0 P1 DC 1 P100 DC 100
45
機械語への変換
(アセンブラで機械語を表示)
DIMENSION REAL DAT(100) DIMENSION REAL MAX, KOTAE DIMENSION INTEGER I
C
MAX = -9999 DO 100 I=1, 100
IF ( DAT(I) > MAX ) THEN MAX = DAT(I) ELSE
ENDIF 100 CONTINUE C
KOTAE = 0 (最適化で移動) KOTAE = MAX
STOP END
LD GR1, M9999 ST GR1,MAX LD GR2,C0
L100 CPA GR2,P100 JPL E100
LD GR3,DAT, GR2 CPA GR3,GR1 JMI EXIT
ST GR1, MAX EXIT ADDA GR2,P1
JUMP L100 E100 NOP
46
機械語への変換
(アセンブラで機械語を表示)
DIMENTION REAL DAT(100) DIMENSION REAL MAX, KOTAE DIMENSION INTEGER I
C
MAX = -9999 DO 100 I=1, 100
IF ( DAT(I) > MAX ) THEN MAX = DAT(I) ELSE
ENDIF 100 CONTINUE C
KOTAE = 0 (最適化で移動) KOTAE = MAX
STOP END
LD GR1, P0 ST GR1,KOTAE LD GR2,MAX ST GR2, KOTAE
47
機械語への変換
DIMENSION REAL DAT(100) DIMENSION REAL MAX,
KOTAE DIMENSION INTEGER I C
MAX = -9999 DO 100 I=1, 100
IF ( DAT(I) > MAX ) THEN MAX = DAT(I) ELSE
ENDIF 100 CONTINUE C
KOTAE = 0 (最適化で移動) KOTAE = MAX
STOP END
LD GR1, M9999 ST GR1,MAX LD GR2,C0 L100 CPA GR2,P00
JPL E100 LD GR3,DAT, GR2 CPA GR3,GR1 JMI EXIT
ST GR1, MAX EXIT ADDA GR2,P1
JUMP L100 E100 NOP
DAT DS 100 MAX DS 1 KOTAE DS 1 I DS 1 M9999 DC -9999 P0 DC 0 P1 DC 1 P100 DC 100
LD GR1, P0 ST GR1,KOTAE LD GR2,MAX ST GR2, KOTAE MAIN START
END RET
48