概要
- 40種類以上のプログラミング言語を列挙し、Bay Area特有の会話を紹介
- Leanが「perfectable(完璧化可能)」な言語である理由を解説
- 型システム・定理証明・メタプログラミングの重要性をLeanを例に説明
- Leanによるカスタム構文とAPI設計の柔軟性をデモ
- Leanのコミュニティと他の定理証明系言語との違いを強調
40種類のプログラミング言語とBay Area文化
- Sydney Von Arxとのパーティで「40個のプログラミング言語を挙げられるか?」という質問
- Bay Areaらしい会話の一例
- Racket、Agda、Clean、Elm、TypeScript、sh、ASP、Verilog、JavaScript、Scheme、Rust、Nim、INTERCAL、sed、Isabelle、Visual Basic、zsh、Alokscript、Coq、Idris、Hack、Prolog、Whitespace、PureScript、Go、Odin、Haskell、Python、tcsh、Unison、Clingo、bash、Java、Zig、Cyclone、PHP、awk、C、ActionScript、C++の列挙
- どの言語にも特徴と進化傾向が存在
Leanが「perfectable」な理由
- Lean は「完璧」ではないが「完璧化可能(perfectable)」な言語
- Lean自身でLeanの性質や事実を記述・証明可能
- コードに関する性質を言語自身で活用できる設計
- 例:常に5を返す関数returnFiveの証明
- TypeScriptや他の多くの言語では型や性質の活用に制約
- Leanでは定理として記述・証明が容易
型システムの進化と定理証明
- 型がない言語も、後に型アノテーションや型システムを導入する傾向
- 例:PHP 7.4、Pythonの型アノテーション、TypeScript、Rust
- 型システムの拡張・活用がプログラミング言語の進化の本質
- C++テンプレートやRustのconstificationなど、コンパイル時計算の重視
- 最も正しい方法は「依存型(dependent types)」の導入
- 依存型は定理証明の基盤
- 型の上で型の等価性を証明するインフラが必要=定理証明器
- 依存型言語は定理証明器に成長可能
- そのためには「theorem proving infrastructure(定理証明インフラ)」の整備が不可欠
Leanのメタプログラミングとカスタム構文
- メタプログラミングやカスタム構文の柔軟性がLeanの大きな特徴
- 多くの言語はメタプログラミングが不便(Rustのプロシージャルマクロ等)
- Leanはシームレスに実現可能
- Tic-tac-toe(○×ゲーム)のカスタム構文例
- 独自の構文カテゴリtttCell, tttRow, tttBoardSyntaxの宣言
- board!構文による視覚的なボード表現
- 構文の解釈を容易に差し替え可能
- 型システムとメタプログラミングの連携
- API設計の階層化とカプセル化が容易
- 将来的には「メタメタプログラミング」も期待
Leanの定理証明とパフォーマンス
- 定理証明能力が言語進化の「収束的進化」の結果
- パフォーマンスの重要性
- LeanはまだRustほど高速ではないが、最適化の余地が大きい
- 証明によるコード等価性で最適化が容易
- 例:returnFive a + 1 = 6の証明
- 証明済みならコンパイラが自由に置換可能
- 開発者(Leo de Moura)も後方互換性より進化を重視
- AI時代にはコードの書き換えが容易
- 定理証明器は究極のリファクタリングツール
Leanコミュニティと他言語との比較
- Leanは同種の言語の中で唯一成長中
- Coq、Idris、Agdaは競争力減少
- Idris、F*はコミュニティ規模でLeanに及ばず
- Leanは定理証明と実用的なプログラミング能力の両立
- 実際にLeanコミュニティが活発に拡大中
コーディングの原点
- Eliza Zhangとの賭けがきっかけでC言語に挑戦
- 「できない」という言葉への反発がコーディング開始の動機
- 初心を忘れず、挑戦し続ける姿勢の重要性