次に作るもの:地図の縁
これは終わりでなく、一区切りだ。システムは建った —— メモリモデル、エフェクト、四つの backend、セルフホストコンパイラ、安全な並行処理 —— そして残るのは地図の縁だ:エフェクト経由の async、work-stealing スケジューラ、先送りした atomic、特徴的な解析のセルフホスト。そのどれもスケジュール上にない。それぞれが、地図に引き入れる名づけられた条件だ。言語は願望リストでなく、需要で育つから。
七つの Part が、Mere を言語にするシステムを建てた:思想と最小コア、明示的なメモリモデル、エフェクト システム、厳密な一致に保たれた四つの backend へのコード生成、言語自身で書かれブラウザで走るコンパイラ、 公的な存在、そして型安全な並行処理。それは一つの完結したものだ。だが、終わったものではない —— 生きている言語は決して終わらない —— だからこの最後の回は終わりでなく、一区切りだ。地図の現在の縁で 取られ、その少し先にあるものを眺める。
地平は約束でなく、条件のリストだ
こういう連載を閉じる自然なやり方はロードマップだろう:次に何を建てるか。だが連載全体が回ってきた規律が それに反する。feature はスケジュールに向けて建てられたことがない;それぞれ、実の現在の需要がそれを 指したときに建てられ、需要が推測でしかないときは先送りされた —— ときに長く、ときに測られた領収書 つきで。だから「次に来るもの」の正直な形は、約束のリストでなく条件のリストだ:地図の縁にあるもの、 そのそれぞれが、建てられた世界へ引き入れる名づけられたトリガを持つ。以下がそのリストだ、その精神で。
エフェクト経由の async
Part III のエフェクトシステムはケイパビリティ渡しの上に建てられ、扉を開けたままにしている:非同期 実行はエフェクトとして表現でき、プログラムが選ぶところで handle され、言語が残りの副作用にすでに使う のと同じ語彙で。紙の上では魅力的な適合だ。だが並行処理の Part がすでに近い将来の需要を片づけた —— それを始めた pain point、一つのプロセスの二つの loop は、本物のスレッドで解け、I/O 並行はホストで すでに扱われた。だから async-via-effects は、まだ持たない需要を待つ:構造化並行、キャンセル、スレッド とチャネルがぎこちなく仕える形。トリガは、それらを genuine に要し現在の primitive が粗すぎると気づく プログラムだ —— そしてそれが現れたとき、エフェクトが答えを建てる自然な場所だ、下地が三つ前の Part で 敷かれたから。
work-stealing スケジューラ
今日 spawn は一つの OS スレッドで、それは粗い並列性 —— par_map 越しのひと握りの worker —— には
ちょうど正しく、非常に多くの小さなタスク —— スレッドのコストがそれがする仕事を飲み込む —— にはちょうど
間違っている。標準の答えは work-stealing スケジューラだ:小さなスレッドプールが細粒度のタスクを互いに
渡し合う。それは地平の項目の中で最大で、他より長い道で、そのトリガは特定的だ:現在のモデルがすでに
よく仕える粗いデータ並列でなく、多くの小さな並列タスクの実のワークロード。プログラムがその形を欲する
まで、より単純なモデルはプレースホルダでない —— 人が実際に書いている並列性にとって正しい道具だ。
先送りされたもの、その領収書とともに
いくつかは連載の前の方で条件を書き下して先送りされ、綴じられたとおりに地平に座る。前回の atomic と ロックは、branch-and-bound か適応探索が実のターゲットになるのを待つ、API と example はすでに起草済で。 一般的な制約機構 —— qualified types —— は、型を越えて再利用される多相チャネルコンビネータを genuine に要するプログラムを待つ。パッケージマネージャは、それを要するほど大きな adoption を待つ。特徴的な 解析のセルフホスト —— 借用検査器、region、エフェクトシステム、Mere を一般的な ML でなく Mere 自身に するもの —— は、今日セルフホストされた古典的コアの後ろで順番を待つ。そして言語としての固有の認識、 それ自身の構文ハイライトと登録は、それを稼ぐ使用を待つ。そのそれぞれが、欠落でなく、トリガつきの 先送りされた問いだ。
変わらないもの
feature が変数なら、七つの Part を通じて一定であり続けた何かがあり、それは最も持ち越す価値のある部分だ。
決定がなされるやり方は変わらなかった:難しい問いは紙上で精密なサブ問いに絞られ、コミットされる前に
小さな実験で試され、それから rough edges が現れるまで本物に対して dogfood された。新しい問題が現れた
ところでは、最初の手はさらに発明するのでなくすでに建てられた機構に寄りかかることだった —— 四つの
backend を、そして四方向の並行処理を可能にしたクロージャ表現、Send と Sync が拡張した Trivial
規則、ケイパビリティのライフサイクルと判明した with 構文、par_map が desugar した先の primitive。
抑制は怠慢でなく行為として扱われた:何かを作らないと決めることは、その不在のコストを測り、答えを起草し、
トリガを名づけることを意味した。そして保証は両方向に正直に保たれた —— そこに無い健全性を決して主張せず、
そこに無い欠陥も決して診断しない。
それらが定数であり、それらこそ、読者がこの連載から、どの特定の feature よりも長く持ち帰れるものだ: 採用すべき言語でなく、一つを建てるやり方 —— 少ない概念を区別したまま保つことが、多い概念をこっそり 併合するより勝ち、確信できるものが、単に動くものより価値がある、そういうやり方。
地図には縁があり、開発はそれを引き直し続ける。地平の feature の一つがその名づけられたトリガを越えて 建てられたとき、それはここでの新しい章になる、同じやり方で書かれた —— 絞られ、試され、dogfood され、 まっすぐ語られた。それまで、ここが言語の立つところだ:小さく、明示的で、検証可能で、縁で開いている。 それが常に、要点だった。