1. 導入¶
1.1. この授業について¶
先端科目(3〜4年生向け)
プログラミング言語についての理論的な理解を目指す
2つ以上のプログラミング言語を知っていることが前提
1.2. 成績評価¶
毎週の課題 20点
中間レポート 40点
期末試験 40点
1.2.1. 過去の実績¶
2020年度: S 49名、A 28名、B 27名、C 16名、D 55名
2022年度: S 13名、A 16名、B 5名、C 3名、D 13名
1.3. 根本的な疑問¶
どうしてこんなにたくさんプログラミング言語があるのか?
さらに Go, Swift, Rust など新しい言語が作られている。
これらの言語はお互いに違っているが、どう違うのか?
1.4. プログラミング言語を定義する方法¶
新しい言語をデザインする時、曖昧さがなく、簡潔で、理解しやすい形で定義することはきわめて重要である。
Scheme には数学的に厳密な 定義 があるが、残念ながら理解するのが難しい。
BASIC や C は、最初は厳密な定義がなかったので、微妙に異なるいくつかの処理系ができてしまった。PHPも最近まできちんとした定義がなかった(cf. Announcing a specification for PHP )。
言語を定義するには、次の二つのことを決める必要がある。
構文(syntax) --- どのように書くか、ということ
意味(semantics) --- 実行すると何が起きるか、ということ
1.5. 構文的な違い¶
1.5.1. 文字¶
1.5.2. 文法¶
Esoteric progarmming language というものがある。
1.6. 意味的な違い¶
プログラミング言語におけるパラダイムとは、哲学的に言えば「計算とは、何か」ということ。
- 命令型(手続き型)
計算とは、状態を変化させることである。
- 関数型
計算とは、式を簡約することである。
- 論理型
計算とは、命題を証明することである。
1.7. 良いプログラミング言語¶
「読みやすさ」と「書きやすさ」は一般に両立しない。
「効率が良い」とは?
実行速度が速い
コンパイルが速い
プログラムを書くのが速い
信頼性を高くするには?
強い型付けや例外処理の強制 → 嫌いな人もいる
エコシステム
言語の学習が大変だとあまり使われない
言語処理系の開発が大変だとあまり使われない
ライブラリが揃っていないとあまり使われない
1.8. プログラミング言語の理論を勉強する理由¶
発想の幅が広がる --- 言語は概念を表現する道具に過ぎないのだが、使う言語によって発想が制約されるのも事実。「ハンマーしか持っていなければ、すべての問題は釘に見える」ということわざがある。
新しい言語を容易に学べるようになる --- 技術の進歩についていくには常に勉強しなければならない。
ソフトウェア技術の重要な基礎である --- 基礎をおろそかにしては高度な研究はできない。