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