プログラミング言語論教材

服部隆志

December 9, 2016


1. プログラミング言語とは
1.1. 根本的な疑問をいくつか
1.2. ソフトウェア開発の流れ
1.3. 応用分野と言語の関係
1.4. プログラミング言語を特徴づけるもの
1.4.1. 文字
1.4.2. 文法
1.4.3. パラダイム
1.5. プログラミング言語の評価基準
1.6. プログラミング言語の理論を勉強する理由
1.7. プログラミング言語の歴史
2. 構文と意味
2.1. 言語を定義する方法
2.2. 形式言語理論をちょっとだけ
2.2.1. 形式的な言語の定義
2.2.2. BNF 記法
2.2.3. 構文木
2.2.4. 曖昧な文法
2.3. 意味論をちらっと
2.3.1. 操作的意味論
2.3.2. 公理的意味論
2.3.3. 表示的意味論
2.3.4. 手続き型言語以外の意味論
3. 名前と束縛
3.1. 名前について
3.2. 名前空間
3.3. 名前の束縛
3.3.1. 束縛とは
3.3.2. 無名と別名
3.4. スコープ
3.4.1. 静的スコープと動的スコープ
3.4.2. Closure
3.4.3. インスタンス変数のスコープ
4. 変数
4.1. 変数について
4.2. 型
4.3. 記憶領域
4.3.1. 静的データ領域
4.3.2. スタック(stack)
4.3.3. ヒープ(heap)
4.4. 生存期間
5. 型
5.1. 型とは何か
5.1.1. 型を使う理由
5.1.2. 型システムの例
5.2. いろいろな型
5.2.1. 列挙型(enumeration type)
5.2.2. 部分範囲型(subrange type)
5.2.3. 共用体型(union type)
5.2.4. ポインタ型(pointer type)
5.2.5. 関数型
5.3. 型変換(type conversion)
5.3.1. 自動的な型変換
5.3.2. 明示的な型変換
5.4. 型検査(type checking)
5.4.1. 型宣言(type declaration, type annotation)
5.4.2. 型同値(type compatibility)
5.5. 型推論(type inference)
5.6. 多相性
6. 式
6.1. 演算子の優先度と結合性
6.2. 評価の順序
6.3. 短絡評価
6.4. 遅延評価
7. 中間レポート
8. 制御文
8.1. 構造化プログラミング
8.2. ブロック付きメソッド
8.3. 大域脱出
8.4. 例外処理
8.4.1. 例外とは
8.4.2. 例外処理機構
9. 副プログラム
9.1. 副プログラムとは
9.2. 引数
9.3. 引数の受け渡し
9.3.1. 受け渡しの方向
9.3.2. 実現方式
9.4. コルーチン
10. 抽象データ型とオブジェクト指向
10.1. 抽象化とカプセル化
10.2. 抽象データ型とは
10.3. Adaの場合
10.4. オブジェクト指向言語とは
10.5. オブジェクト指向言語のデザイン
10.5.1. どのくらい純粋にオブジェクト指向にするか?
10.5.2. 情報隠蔽はユーザが指定可能か?
10.5.3. 単一継承か、多重継承か?
10.5.4. 実装を継承するか、仕様を継承するか?
10.5.5. 型検査をどうするか?
10.6. Smalltalk の場合
10.7. C++ の場合
10.8. Java の場合
10.9. JavaScript (ECMAScript) の場合
10.10. アスペクト指向
11. 並行プログラミング
11.1. 並行と並列
11.2. 同期
11.3. セマフォ
11.4. モニタ
11.5. チャネル
11.5.1. Occam
11.5.2. Go
12. 関数型言語
12.1. 参照透過性
12.2. Lisp
12.3. Haskell
12.3.1. 静的型検査と型推論
12.3.2. 遅延評価
12.3.3. モナド
12.4. ラムダ計算
12.4.1. 定義
12.4.2. α変換
12.4.3. β変換
12.4.4. 簡約
12.4.5. 簡約戦略
13. 論理型言語
13.1. 理想的な論理型言語の特徴
13.2. Prolog の場合
13.2.1. プログラムの構造
13.2.2. 質問
13.2.3. プログラムの実行
13.3. Prolog の問題点
13.3.1. 導出の順序
13.3.2. 否定

List of Examples

1. 冗談系の言語
2. 変数の値を 1 から 100 まで変化させて繰り返し
3. トークンの例
4. 変数、加算、乗算、括弧を含む式
5. A*(B+C)の構文木
6. 自然言語の場合
7. 四則演算
8. Dangling-else
9. FORTRAN
10. C++
11. TinyBASIC
12. Javaの変数宣言
13. Lispの無名関数の定義
14. Rubyの無名関数の定義
15. PHPのリファレンス
16. FortranのEQUIVALENCE文
17. procedureの重なり(静的)
18. procedureの重なり(動的)
19. Rubyのclosure
20. JavaScriptのclosure
21. Javaの内部クラス
22. 静的なローカル変数
23. Closureから参照されている変数
24. 色を表す列挙型
25. 大文字だけの型
26. 配列の範囲を表す型
27. 図形を表す型
28. Pascal で linked list を作る
29. OCamlでの高階関数の型
30. 四則演算
31. 数値から文字列への変換
32. CやJavaにおける型のキャスト
33. Adaにおける型同値
34. MLにおける型推論の例
35. Javaの + 演算子
36. C++のテンプレート
37. Haskellにおける多相型の関数
38. 優先度の例
39. 結合性の例
40. APLの場合
41. 関数呼び出しの副作用
42. 論理演算子の短絡評価
43. Python3.x の range
44. Ruby の Enumerable#lazy
45. 初期のBasicとPascalでの繰り返し
46. ブロック付きメソッドの例
47. Ruby の Catch and throw
48. PL/I の例外処理
49. Java の例外処理
50. Adaの引数
51. Adaの例
52. Pascalの例
53. 名前渡しと副作用
54. Lua の coroutine
55. Ruby の Fiber
56. 浮動小数点数
57. Adaによるスタック
58. Javaのサブクラスの型検査
59. スタックを実現するクラス Stack
60. スタックを実現するクラス stack_class
61. スタックを実現するクラス StackClass
62. Javascriptで後からプロパティを追加する例
63. AspectJでログを書き出す例
64. 競合の例
65. 食事する哲学者
66. 食事する哲学者改良版
67. セマフォで生産者/消費者問題(協調的同期のみ)
68. セマフォで生産者/消費者問題(排他制御もやる)
69. モニタで生産者/消費者問題
70. 関数を引数として渡す
71. 無限長リスト
72. 簡約の例
73.
74.
75.