比較プログラム言語論
平成16年5月12日
森田 彦
レポート(4/28)総括
< テーマ >

本日の講義で、あなたが最も興味を持った点はどのような点です
か?講義の全体的な感想と共に、できる限り具体的に、200字~400
字程度で記述して下さい。
<回答結果>
24%
34%
その他
言語の歴史
形式文法
15%
ALGOL60
27%
高水準言語発展の歴史(経
緯)に最も関心
ALGOL60プロジェクトの位
置づけを再認識
形式文法理論に知的興味
レポート抜粋ー言語発展の歴史①

(前略)プログラミング言語が今日まで発展してきたの
は、プログラマーや言語の開発者達が、常にそれに満
足していなかったためだろう」ということです。一度その
言語に満足してしまえば、そこでプログラミング言語の
歴史は終わってしまったかもしれないということを考え
ると、やはり言語の開発者達やプログラマーは常にシ
ンプルで高性能な言語を求めていたのだろうと考えま
した。(中略) また、昨年習ったJava言語の文の終わ
りには「;」という規則は、ALGOLから発展されている
と知り、プログラミング言語の歴史というものはただ単
に「昔は~であった」というだけでなく、今日にも生かさ
れているのだと改めて知る事が出来ました。
レポート抜粋ー言語発展の歴史②

今日の講義で興味・関心を持ったことはコン
ピュータのプログラムを人間の考えかたに近づ
けるということです。単純にすごいことだと思っ
た。 もし 本当に人間と同じような考えかたで
プログラムできるとしたら、もっと色々なことが
コンピュータによって出来るようなきがします。
私個人としては、プログラム言語がもっと簡単
になり誰にでも操れるようなプログラム言語が
でてくることを期待しています。
レポート抜粋ーALGOL60

今日の講義で興味を持ったことは、ALGOL60につい
てです。このALGOL60によって、PASCALやC言語が
継承されていったことは、この言語世界でも歴史が
ちゃんとあることを感じました。そして今もなお、プログ
ラミング言語のプロジェクトの研究が行われ、さらにハ
グのない、正しいプログラミングを開発しようとしている
のだと思うと、どこまでプログラミング言語が発展して
いくのか、そして進化していくのか予想がつきません。
もっと性能が優れた言語、誰もが使いやすい言語、な
どが今後作られていけばいいと思いました。ウィルクス
の苦悩や、チョムスキーの形式文法論を無駄にしない
ようにするためにも、今後も発展していくべきだと思い
ます。
レポート抜粋ー形式文法理論

今回の講義でプログラミング言語が文法によって構成
されているということがおどろきました。しかも文法にも
種類があること。
今までプログラミングやアルゴリズム論をやってきても
ぜんぜん気づきませんでした。といことは、まったく意
味もわからずやってきたということで、意味を理解して
いてやってたいらもっとわかったのかなとおもいました。
もったいなことをしたと思います。プログラミング言語
は文脈自由文法が主で構成要素が決まったら文を生
成できる。というのは要素を入力すればちゃんと意味
の通る文になるということですよね?それをできるよう
に作った人はすごいと思います。
レポート抜粋ー質問①


(ALGOL60が)形式文法理論による文脈自由
文法言語として制定され、当時の言語研究の
到達点というのは、その時代の時に研究は止
まってしまったということなのですか?なぜ完
全に言語研究は到達したといえたのですか?
「エスペラント」っていう世界標準語を目標とし
て作られた言語、あれもこの「形式文法理論」
にのっとって開発!?されているのかちょっと
疑問に思いました。
補足 エスペラント語
1887年 ポーランドのザメンホフが提唱
 世界共通の言語を目指す
より正確に言うと、目指したのは・・・
諸民族の対等な交流の手段としての中立言語
 背景には、 「諸民族の平和と共存」 というテーマがある
 成立時期は形式文法理論のはるか以前

エスペラント→ザメンホフのペンネーム
「希望しつつあるもの」
という意味
レポート抜粋ー質問②

A-0が上手くいかなかった一方、翌年のFORTRANが
成功したようですが、A-0とFORTRANの違いは何だっ
たのですか?
最適化
またもうひとつ質問なのですが、ALGOL68は規模が
大きくなりすぎて次第に使われなくなっていったとおっ
しゃっていましたが、Javaはどうなのでしょう? Java
はパッケージがむやみに増えないように配慮されてい
るとのことですが、現状ではあまりに重過ぎます。肥大
したプログラム言語と同じように、重たいプログラム言
語も淘汰されていくのではないのですか? Javaは現
状、マイナーOSユーザに優しく面白くはあっても、快
適ではありません。実際、力を入れていたはずの携帯
端末方面では、auがBREWを使い始めています。
レポート抜粋ー4/14の質問への補足
質問: C言語の次にD言語はリリースされるのでしょうか?





1999年12月にDigital Mars社のWalter BrightがD言
語を発表。
C++やJava言語の後継に位置づけられる。
言語理論の完全性よりも、実用性を重視。
現在のコンパイラ理論の蓄積を結集して、とにかく、大
きなシステムを効率よく開発できるように工夫。
日本語版(翻訳)サイト
http://www.kmonos.net/alang/d/
プログラミング言語は分かりにくい!?

自分が気づいた点はプログラム言語の種類はたくさん
ありますがどれも簡単にはプログラムできないということ
です。それぞれの用途や適応により数多くの言語が生
み出されたことは解りますし、簡単になってきていること
も理解できます。しかし、簡単にプログラムできるほど手
軽にはなっていないと思います。自分が理解できていな
いというのもあるかもしれませんが、関数がたくさんある
ことで似たような式も多く、どれを使えばいいのかわから
ないことも多々あります。計算式を自動的に検出してく
れるなどの機能があれば楽になると思いますが、それ
だと逆にプログラミングの楽しみがなくなるのかなとも思
いました。
<本日のテーマ>
プログラミング言語翻訳の仕組み
<内容>




アセンブラとコンパイラ
コンパイラとインタプリタ
プログラム実行までの流れ
コンパイルの過程
① 字句解析、構文解析、意味解析
② 最適化
③ コード生成
アセンブラとコンパイラ
高水準プログラミング言語を実行するには
機械語への翻訳(変換)が必要
 翻訳システムの名称
アセンブリ言語→機械語:アセンブラ
高水準言語→機械語:コンパイラ

コンパイラとインタプリタ
高水準言語プログラム
コンパイラ
翻訳
翻訳・実行
デバッグに
手間がかか
る。
実行速度が
速い。
実行
インタプリタ
デバッグには便利。
実行速度は遅い。
実行結果
プログラム実行までの流れ
原始プログラム
翻訳(コンパイル)
複数のモジュールをリンク
実行結果
実行
目的プログラム
リンケージエディト
実行可能プログラム
第4回目レポートへ
コンパイルの過程
原始プログラム
字句解析、構文解析、意味解析
中間言語1
最適化
中間言語2
コード生成
目的プログラム
プログラム実行までの流れへ
字句(・意味)解析


原始プログラムを字句に分解する。
字句:名前、定数、予約語、区切り記号
・・・
int a,b;
a=4;
b=(a+2)*3;
・・・
int 予約語
a 名前
, 区切り
b 名前
; 区切り
a 名前
b 名前
= 予約語
= 予約語
4 定数
; 区切り
( 区切り記号
+ 予約語
2 定数
) 区切り記号
* 予約語
3 定数
; 区切り
a 名前
構文(・意味)解析
コンパイル過程へ


字句の並びが、文法的に正しいかどうかをチェッ
クする。→ 文脈自由文法に沿って構文解析
構文解析結果を中間言語に表現
ポーランド記法、三つ組み、四つ組などの記法がある。
四つ組の場合:(演算子,被演算子1,被演算子2,結果)と表す。

例: b=(a+2)*3; の場合
(+,a,2,R1)
(*,R1,3,R2)
(=,R2,φ,b)
R1,R2:レジスタ
φ:空値(対応項目なし)
最適化
コンパイル過程へ

構造解析により生成された中間言語プログラム→冗長
な部分を省き、プログラムの時間効率と領域効率を向
上させる。→次のような方法(種類)がある。
① たたみ込み
② 共通式の置換
③ 繰り返し文の再編
④ レジスタ割り付けの再編
⑤ 式評価の変更
⑥ サブルーチンの組み込み
たたみこみ


演算結果の置き換え→事前に計算可能な変数
については、その計算結果で置き換える。
例
a=3;
b=a+8;
b=11;
共通式の置換


複数回現れるが、その演算結果が同じとなる式
→共通式
2度目以降に現れた共通式→最初の式に置換
x=3;
x=3;
y=2*x+4;
y=2*x+4;
・・・
・・・
z=3*(2*x+4);
z=3*y;
繰り返し文の再編

繰り返し文の中で値が変化しない演算式があっ
た場合は、それを繰り返し処理の前に移動する。
for (int i=1; i<=100; i++) {
c=2;
c=2;
for (int i=1; i<=100; i++) {
y[i]=c*i+2;
}
y[i]=c*i+2;
}
レジスタ割付の再編
頻繁に参照あるいは演算される変数の値をレジ
スタに格納しておく。
 式評価の変更
演算順序の入れ換えにより、演算の回数を減ら
す。

c:=a*x+a*y;
c:=a*(x+y);
乗算の回数が1回減少
サブルーチンの組み込み

手続きや関数(Javaではメソッドに対応)を呼び
出す箇所で、直接その処理を組み込む。
double Heikin(int x, int y) {
return (x+y)/2.0;
・・・
}
z=Heikin(x,y);
・・・
呼び出し命令ではなく、直接、
関数の処理を書き込む。
コード生成
コンパイルの過程へ

最適化された中間言語プログラムから目的プロ
グラム(機械語)を生成。
中間言語
(+,a,2,R3)
アセンブリ言語
ADD R3,R1,R2
レジスタ
R1
R2
R3
aの値
2
(a+2)の値
第4回目レポート
< テーマ >
 本日の講義で、あなたが最も興味を持った点はどのよう
な点ですか?講義の全体的な感想と共に、できる限り
具体的に、200字~400字程度で記述して下さい。
 なお、上の記述を行った上で,質問や以前のレポートに
対するコメント等を付加しても結構です。
 提出先:[email protected]
 件名:「学籍番号(半角)+半角空白+氏名」を記入し
て下さい。
例) s02xxx 学院太郎
ダウンロード

講義スライド