関数型プログラミングの研究・開発において培われてきたゴミ集め,型駆動の最適化,関数閉包などの要素技術は,関数型プログラミングパラダイムの壁を越え,多くのプログラミング言語に取り込まれています.関数型言語のコンパイラを読み解くことによって,高い抽象性を誇りつつも,非効率にも見える関数型のプログラムが,さまざまな技術を経て高効率な機械実行可能なコードに変換される様子を学べます.授業で扱うコンパイラは抽象構文木,K正規形,クロージャ変換,仮想機械命令などの抽象化層を経て段階的に機械命令を生成します.このように設計されたコンパクトで美しいコンパイラの構成より,さらに複雑なソフトウェアを記述するための系統的な方法についても学ぶことができるでしょう.
【到達目標】 本授業の目標は (1) 関数型プログラミング言語の習得,(2) 関数型プログラミングの実践的方法論の理解,(3) 関数型プログラミング言語のコンパイラの理解の三点です.関数型プログラミングができるようになること,そして関数型プログラミング言語のコンパイラのソストウェアアーキテクチャを理解することを到達目標とします.
【テーマ】 関数型プログラミング言語で記述された関数型言語のコンパイラを読み解く経験を通して,大規模なソフトウェアの構成方法,抽象化レベルの高いソフトウェアを段階的に具現化する技術,記述の抽象度と実行時の効率性を両立するための方法論など,一般の情報システム構築における要点を実践的に学びます.
Functional programming, compiler organization, OCaml
✔ 専門力 | 教養力 | コミュニケーション力 | 展開力(探究力又は設定力) | 展開力(実践力又は解決力) |
The first four weeks are lectures.
For the rest, students choose parts of the compiler components and explain the implementation. Each class starts with students' explanation, followed by the instructor's brief overview for next components that are covered on the coming class.
授業計画 | 課題 | |
---|---|---|
第1回 | 概要 | Guidance |
第2回 | OCamlによる関数型プログラミングへの招待 | 基本的なデータ型,複合的なデータ型,代数的データ型について学ぶ |
第3回 | OCamlによる関数型プログラミングへの招待 | 再帰的なデータ構造,再帰的な関数,関数閉包,状態の扱い |
第4回 | OCamlによる関数型プログラミングへの招待 | レコード,例外処理,モジュールシステム,標準ライブラリ,開発環境 |
第5回 | 関数型言語のコンパイラ MinCaml のソフトウェアアーキテクチャ | 関数型言語OCamlで記述された関数型言語MinCamlのソフトウェアアーキテクチャの概要を理解する. |
第6回 | プログラムから抽象構文木へ | 字句解析と構文解析について学ぶ |
第7回 | 型解析 | 型検査と型推論,ユニフィケーション |
第8回 | 抽象構文木からK正規形へ | K正規形,α変換 |
第9回 | 最適化(1) | β簡約,letの入れ子についての簡約,インライン展開 |
第10回 | 最適化(2) | 定数畳み込み,不要定義除去 |
第11回 | 関数閉包の除去 | クロージャ変換 |
第12回 | 仮想機械命令生成 | 仮想機械命令生成 |
第13回 | レジスタ割り当て | レジスタ割り当て |
第14回 | 実行可能コードの生成 | アセンブリ生成,実行時システム |
第15回 | まとめ | まとめ |
特になし
参考資料はGitHubにホスティングする.GitHubの情報はOCW-iに提供する.
授業時間内の発表およびレポート課題で成績を評価する.
アルゴリズムとデータ構造について理解していること.少なくとも一つのプログラミング言語に通じていること.