比較プログラム言語論

比較プログラム言語論
平成16年4月28日
森田 彦
レポート(4/21)総括
< テーマ >
あなたが最も興味・関心のあるプログラミング言語はどのよ
うな言語ですか?どれか一つ挙げて、そう選んだ理由を述べ
て下さい。
<回答結果>
PASCAL
<感想>
<質問>
BASIC
C++ & C
Prolog
Java
Java
Prolog
C++ & C
BASIC
PASCAL
Ada
COBOL
R
機械語
Java言語派
(前略)私は昨年インターンシップに行ったのですがそこは
情報システムに関する部署でした。私が研修させていた
だいた際にJavaを使った新システムの導入のプレゼンを
していたり、職場の方々にお話を伺ったときには必ずと
言っていいほどJavaの有効性や必要性に関しての意見
があったのを覚えています。このような経験から私は現在
興味関心があるのは「Java」言語です。
自分が特に興味・関心があるのはJava言語です。理由は
簡単で,去年自分がはじめて勉強した言語だからです。
Java言語はどんな環境下でもJava対応の仮想記憶装置
があれば動くので、今後の発展が期待できますし、Java
の敬遠される理由の「遅さ」もいずれ解決できるようになる
はずです。最近はライバルにC#言語が出てきたので競走
することでより良い言語になると思っています。
Prolog派
(前略)この言語はどういったものなのでしょうか。 「人間
は死ぬ」「ソクラテスは人間である」→「ソクラテスは死ぬ」
ソクラテス=人間=死ぬ、ゆえにソクラテス=死ぬという
ことを、例えば「人間=1」「死ぬ=2」「ソクラテス=3」と
代入して計算しているのでしょうか? そうなのであれば
以前習ったJavaでもできると思います。 多分違う方法で
解答を出していると思うのでそれが知りたいと思い興味
が沸きました。
今回の講義で紹介されたプログラミング言語の中で、最
も興味関心をもった言語は、Prologでした。理由は、この
言語の基本的な特徴が他の言語とまったく違うように感
じたからです。論理文を入力して、その文からコンピュー
タが推論して新しい論理文を作るというシステムが画期
的な感じがしてとてもおもしろいと思いました。コンピュー
タに人間の論理をたくさん記憶させて、人工知能をつくる
という考えはおもしろいと思います。
C++ & C言語派
私がこの講義を受け始めた現在で興味・関心のある、プロ
グラミング言語を一つだけ選ぶとしたら、そのプログラミン
グ言語は『C++』である。理由としては複雑であるがゆえ
の高度さである。 複雑・難しいと感じるということは、その
プログラミング言語が、深く濃く作られているということであ
る。そう考えるとこれに習熟することで、簡単に効率よく、
複雑な処理ができるのではと思うからである。さらに理由
を加えるならば、複雑であるために一つの結果を出すため
の解がJavaやその他の言語にくらべて、はるかに多くある
ように見えるからだ。
「C言語」や「C++」という言葉自体は何度も聞いたことはあ
りましたが、それを元にしてJAVA言語が作られたというこ
とを今回初めて知りました。プログラミング言語はJAVAし
か触ったことがなかったのですが、「C++」と、それの一部
の機能を排除して開発された「JAVA」とは具体的にはどの
ように違うのかという点に興味を持ちました。
BASIC言語派
私が一番興味深かった言語はBASICです。 (中略)初心者
向けでインタプリタ型の言語ということで、物事を考える時
に、熟考して一から十まで自分の理解速度を守らないと納
得が行かない性格の私に合っている気がしました。 また初
めての、開発者向けではない、初心者も使える言語という
点にも興味があります。元来プログラムはSEが使うもので
他の人々が使用することはなかったと思われます。そのプ
ログラムを一般人も使用することになった背景にコンピュー
タの普及やその後のコンピュータ社会の様子が伺える点が
面白いです。
私が一番興味を持った言語はBASICでした。なぜなら、一
部の専門家しか使うことの出来なかったプログラミング言
語が、一般の人にも比較的易しく扱いやすくなったことで、
大いに普及したという点と、今なおこの言語のファンが多く
いるという話を先生から伺ったからです。 (中略)それまで
手の届かないところにあったプログラミング言語がとっつき
やすくなり、パソコンで色々出来ることの楽しさを知るきっか
けになった人々がたくさんいたのだろうなぁと思いました。
PASCAL(Delphi)派
自分が今回の講義を聞いて興味をもったプログ
ラミング言語はPASCALです。自分はプログラミ
ングを今後も学んでいく上でこれは構造化プログ
ラミング、データ構造系的なプログラミングの教
育に最適ということで、プログラミングの基本的な
ことを学ぶためにある言語だと思ったのでこれに
興味をもちました。また言語仕様を広げすぎない
ように作られ、言語処理の効率もあがり後のC言
語の発展のもとになっているという点で、
PASCALを初めに学んで理解していくことでプロ
グラミングの大体の構造が初めに理解できると
考えたからです。
<感想>
1つの言語が1つあるいは2つの目的のた
めにある。ということは、1つの言語で統一
できないほど、コンピュータに人がたくさん
のことを要求しているからなのだと思いま
す。今はJAVAをやっていますが、きっと
JAVAは万能ではありえないんだろうと思
いました。
<質問Ⅰ>
先生自身はどの言語が最も興味がありますか?またそ
れはなぜですか?
先生が見る言語の中でJAVAの次にブレイクしそうな言
語ってありますか?もしあればそれは何なのか、どうして
次にきそうなのか、JAVAや他の言語とはどう違うのかな
んかを聴いてみたいです。
「prolog」言語は人工知能の開発に適しているのでは?
といった具合に生まれた言語だが実際は適してなかった
という話でしたが、それは論理記述と推論機構で書かれ
たプログラミングは開発に適していた反面、関数を使った
モノに比べソースが長くなりすぎてサイズが大きすぎて使
いづらかったからですか? それとも単にやっぱり関数を
使った言語の方が人工知能の開発に適したからです
か?そこが少し気になりました。
<質問Ⅱ>
なぜ、JavaはJavaの実行環境があれば、どのOSや機種
でも動作するのに、ほかの言語は、特定のOSや機種が
制限されたりしてしまうのですか?プログラミングの言語
の仕組みが違うからなのかな、とは思いますが…よくわ
かりません。
<Java言語>
<通常の言語>
ソース
ソース
翻訳
翻訳
バイトコード
機械語
Windows
機械語
Mac
機械語
Linux
実行
実行
実行
機械語はプラットフォーム毎に異なる。
JVM
Windows
実行
JVM
Mac
実行
JVM
Linux
実行
<本日のテーマ>
プログラミング言語の理論
<内容>
高水準プログラミング言語のルーツは?
プログラミング言語はどのように作られたのか?
プログラミング言語の理論的基盤は?
(プログラミング言語発展の歴史における)
ALGOL60の位置づけとは?
ノイマン型コンピュータの登場
ENIACの限界: 処理(計算の種類)毎にスイッチを切り
替える→膨大な作業→ハードウェアのみの世界
ノイマン:プログラム内蔵型コンピュータを提唱
1949年 モーリス・ウィルクス(英国ケンブリッジ大)
EDSAC完成 世界初のプログラム内蔵型コンピュータ
(ノイマン型コンピュータ)
ウィルクスの苦悩
機械語プログラミングを実行→“恐ろしい考え”「残りの人
生はプログラムのバグ探しで費やされるのでは・・・。」
もっと簡単に(分かりやすく)入力できるプログラミング言
語はできないものか? →アセンブリ言語の開発・利用
→ まだまだ手間のかかる作業
高水準言語の必要性
ウィルクスの苦悩
もっと楽にならないか・・・?
<アセンブリ言語プログラム>
LOAD R1,100
LOAD R2,101
ADD R3,R1,R2
STORE R3,110
メモリ
10
LOAD R1,100
11
LOAD R2,101
12
ADD R3,R1,R2
13
STORE R3,110
命令
・・・
レジスタ
R1
R2
100
R3
101
35
・・・
110
10
25
データ
最初の高級言語A-0の誕生
アセンブリ言語よりも、もっと人間に近い言語
を・・・。例えば
a=10
b=25
c=a+b
のように簡単に計算できるような・・・。
1952年 グレース・ホッパー(レミントン・ランド
社)らがA-0を開発。 ところが・・・
翻訳されたプログラムの性能は、アセンブリ言語
のものの1/5~1/10程度→最適化の不十分さ→
実用には向かず。
FORTRANの誕生
1953年 ジョン・バッカス(IBM社)が、
FORTRAN開発プロジェクトの提案
IBM社(当時は、コンピュータに関しては新興企
業)の社運をかけたプロジェクトに発展
1957年FORTRAN(Formula Translation
system)完成。
数学的計算(科学技術計算)向けに設計→最初
に普及したコンパイラ。 しかし・・・、会計処理な
どの事業用には不向き。
ホッパーらがCOBOLを開発→広汎に普及。
数理言語理論の発展
1956年 チョムスキー(米国の言語学者)が
形式文法理論(言語文法の数学的モデル)
を発表→言語学の革命
形式文法で記述できる形式言語が研究対
象→人工言語の研究が進む→プログラミン
グ言語に反映(プログラミング言語の理論的
基盤を与える)
形式(生成)文法理論
アルファベットの定義
言語の記述に用いる記号を定義する。
英語の場合:{a,b,c,・・・,z}
文法Gの定義
G=(N,T,P,S)
N:非終端記号、T:終端記号(単語)
P:生成規則の組、S:開始記号
Gによって生成される文の集合→言語
Gの例:変数名を規定する文法GN
アルファベット(大文字)と数字で変数名を規定す
る場合
GN=(NN,TN,PN,SN)
NN={<名前>,<文字>,<数字>}∪TN
TN={A,B,・・・,Z,0,1,・・・,9}
PN={<名前>→<名前><文字>,
<名前>→<文字>,
<名前>→<数字>,
<文字>→A,<文字>→B,・・・,<文字>→Z
<数字>→0,<数字>→1,・・・,<数字>→9}
SN=<名前>
文法の種類(チョムスキー階層)
0.句構造文法
生成規則に制約がない
1.文脈依存文法
生成規則:AbC→ABC と表せる文法
A,B,C:終端記号と非終端記号の和
b:非終端記号
※ 書き換えが前後の記号(文脈)に依存
2.文脈自由文法
a→A a:非終端記号
3.正規文法
a→Ab または a→A
プログラミング言語は文脈自由文法が主
構成要素が決まったら文を生成できる。
例:文脈依存文法(日本語)
G=(N,T,P,S)
N={<主部>,<述部>,<名詞>,<動詞>,<助詞>,<文>}
T={私,彼,食べる,飲む,パン,牛乳,は}
P={ <文>→<主部><述部>, <主部>→<名詞><助詞>
<述部>→<名詞>を<動詞>,
<名詞>→私|彼|パン|牛乳, <助詞>→は,
<動詞>→食べる|飲む }
S=<文>
<文の生成>
<文>→<主部><述部> →<名詞><助詞><述部>
→私<助詞><述部>→私は<述部>
→私は<名詞>を<動詞>→私は<名詞>を食べる
→私はパンを食べる
プログラミング言語の構成
プログラム
モジュール
手続きと関数
文
式
語
文字
処理の最小単位。「a=b+c;」など。
演算子と非演算子からなる。a*b、a>bなど。
名前、データ、演算子、予約語(for,ifなど)
英数字、特殊記号等
ALGOL60プロジェクト
1960年IFIP(International Hederation for
Information Processing)「国際情報処理連盟」
により、ALGOL(ALGOrithmic Language)制定
欧米の研究者が共同で開発
形式文法理論による文脈自由文法言語として制
定→当時の言語研究の到達点
ホア(プログラミング言語学者)「ALGOL60こそ
は、偉大な業績であって、それに続く何者も凌駕
できないでいる。」
ALGOL68へ展開→言語規模の巨大化
その後・・・
ALGOL60の構文規則「文の区切りに;を
用いる」、「使用する変数は全て宣言する」
などは、PASCALやC言語など後継言語に
受け継がれる。
プロジェクトの一部メンバーはプログラミン
グ言語の構文解析の精密化、巨大化より
も、プログラミング手法そのものに関心を
移した。→正しい(バグのない)プログラミ
ングとはどういうものか?→プログラミング
手法の研究へ発展
第3回目レポート
< テーマ >
本日の講義で、あなたが最も興味を持った点はどの
ような点ですか?講義の全体的な感想と共に、でき
る限り具体的に、200字~400字程度で記述して下
さい。
なお、上の記述を行った上で,質問や以前のレポー
トに対するコメント等を付加しても結構です。
提出先:[email protected]
件名:学籍番号(半角)+半角空白+氏名を記入して
下さい。
例) s02xxx 学院太郎
プログラミング言語発展の歴史
時間
言語以前
低水準言語
機械語
アセンブリ言語
FORTRAN
COBOL
ALGOL
オブジェクト指向
言語
Delphi
高水準言語
C++Builder
PL/1
ビジュアル開発環境
ALGOL68
PASCAL
BASIC
C言語
Ada
Lisp
超高水準言語
参考:河村一樹、斐品正照
Object PASCAL
C++
Java
Prolog
Smalltalk
ノイマン型コンピュータ
CPU(中央処理装置)
メモリ
プログラム
レジスタ
データ
制御
演算
RAM(読み書き可能)