新言語にできることはまだあるかい
なんとかWIMPS
最近(1ヶ月くらい前)、こんな記事が出ました:
Kotlin, TypeScript, Rust, Swift以降にみんなが話題にするような新しい言語が出てこない、それはなぜか、みたいな趣旨です。客観的に見れば「新しい言語は常に出続けている」わけですが、「みんなが話題にするような」というのが多分曲者なんでしょうね。
例え話をすると、新しい若木は常に生えてきているんだけど、大木に成長するには時間がかかるので、大木にしか興味のない人には「この8年間で新しい大木は登場していない」と判断してしまうのかもしれません。
まあ私としても、Web (HTTP) APIを書く言語とか、JSON色付け係が使う言語はもう出揃ってしまったのかもしれないという気はしなくもないですが、それでも新しい言語が登場して話題を集め(新しい物好きの集団に絞れば「みんなが話題にする」かもしれません)、一定の地位を占める余地はあると考えています。そして、そういう「これから流行る言語」がすでに登場している可能性は十分あります。
(もちろん、どこかの組織または個人が裏でこっそり開発している言語の場合はまだ表には出ていないでしょう。Rustの場合は開発開始は2006年らしいですが、一般公開されたのは2011年で、「裏で開発している」期間が5年ほどあります。)
この記事では、私が独断と偏見で選んだ、「これから流行るかもしれない、(比較的)新しい言語」を紹介してみます。流行の可能性よりも「見るべきところがあるか」という観点で選んだものも含まれます。
なお、ここで紹介する言語は私の情報網に引っかかったというだけであって、必ずしも私自身が試しているわけではありません。不正確なことを書いていたら申し訳ありません。
目次
システムプログラミング言語
モダンなシステムプログラミング言語と言えばRustですが、他にもこの分野を目指す新興言語はあります。
Zig
ZigはCの代替を目指す言語のようです。知っている人も多いでしょうから、ここでは詳しい説明はしません。
お披露目は2016年、0.1.0は2017年リリースのようです。
V
- The V Programming Language
- vlang/v: Simple, fast, safe, compiled language for developing maintainable software. Compiles itself in <1s with zero library dependencies. Supports automatic C => V translation. https://vlang.io
2019年3月頃に話題になったV言語なんてのもあります。一時的にせよ「みんなが話題にするような」という条件は満たしているのではないかと思います。当時は謳い文句の割に未完成な機能も多かったのですが、4年経った今はどこまで完成度が高まったのでしょうか。
Carbon
- carbon-language/carbon-lang: Carbon Language’s main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README)
- Carbon Language: An experimental successor to C++ – Chandler Carruth – CppNorth 2022 – YouTube
C++の置き換えを目指す言語はいろいろありますが、CarbonはC++との相互運用性を特に重視するようです。2022年7月に発表されました。作者はGoogleの人らしいです。
代数的エフェクト (algebraic effects)
代数的エフェクト (algebraic effects) についてはここでは詳しく紹介しません。ざっくり言うと例外やコルーチンやasync / awaitをより一般化したもの、となるでしょうか。これ以上はググるなりして他の記事を参照してください:
現在メインストリームの言語には代数的エフェクトは載っていないので、今後出てくる言語がアピールする新規性の中に代数的エフェクトが入っている可能性は十分あります。もちろん、代数的エフェクトを備えた現在マイナーな言語が今後メジャーになっていく可能性もあるでしょう。
ここでは、代数的エフェクトを備えた言語をいくつか紹介します。
Eff
- Eff Programming Language
- matijapretnar/eff: A functional programming language based on algebraic effect handlers
文法はOCaml寄りで、OCamlで実装されているようです。
Gitコミット履歴は2012年頃まで遡ることができますが、それが「Initial import」なのでもっと昔から開発されていたようです。
公式ページはWayback Machineで2014年頃まで遡ることができます。
Koka
- The Koka Programming Language
- koka-lang/koka: Koka language compiler and interpreter
- [1406.2061] Koka: Programming with Row Polymorphic Effect Types(2014年)
- Algebraic Effects for Functional Programming – Microsoft Research(2016年)
インデントベースの文法で、Haskellで実装されているようです。
2012年頃に登場したようです(Twitter検索すると2012年ごろのツイートが見つかる)。
作者はMicrosoft Researchの人です。
関数型データ並列言語
最近のコンピューターで性能を引き出すには、並列処理が重要です。SIMD、マルチコア、GPUなど。こういう命令やハードウェアを活用できる言語機能の重要性が高まっているということです。
そういう言語機能としてはcompiler intrinsicsやらOpenMPやらCUDAやらいろいろあり、EDSLとしてもC++に対するHalideやHaskellに対するAccelerateなど色々あるわけですが、ここでは単体の関数型言語に注目してみます。
Futhark
MLライクな言語からCUDA / OpenCL、それにマルチコアCPU向けコードを生成できるようです。
純粋な言語ですが一意型によって配列の破壊的変更もできるそうです。自動微分もできるようです。
コペンハーゲン大学で開発されているようです。Haskellで実装されているようです。
Dex
- google-research/dex-lang: Research language for array processing in the Haskell/ML family
- [2104.05372] Getting to the Point. Index Sets and Parallelism-Preserving Autodiff for Pointful Array Programming
Dex言語もFutharkと似ていますが、配列のインデックスの型が配列の長さを表すところがポイントです。一種の依存型です。
「引数を受け取って値を返す、関数」と「インデックスに対して値が割り当てられている、配列」を類似のものとして考え、型の表記(->
と =>
)や式の表記(\x. y
と for x. y
)を似せているのが面白いです。
これも自動微分をサポートしているようです。また、エフェクトシステムで状態を扱うことができます。無敵か?
作っているのはGoogle Researchの人たちで、Haskellで実装されているようです。
依存型と定理証明
よくある静的型言語では、項に依存する項(普通の関数)、型に依存する型(パラメーター化された型)、型に依存する項(多相な値)は書けますが、項に依存する型は書けないものが多いです。項に依存する型のことを依存型と呼びます。
依存型があると、型で表せる情報が豊かになります。「長さの情報を型レベルで持ったリスト」とか「shapeの情報を型レベルで持った多次元配列」は依存型の例です。身近なところでは、C言語の可変長配列も依存型の例と言えるでしょう。ただ、C言語は依存型と言っても整数に依存する配列型が書けるだけだし、そもそも型検査が甘いので脇に置いておきます。
依存型(や、他のリッチな型の機能)があると関数の仕様を型で表現することができます。そうすると形式的な証明を書いて関数の性質を保証したくなるよね、ということで依存型を備えていて定理証明ができる言語があります。Coq, Agda, Idrisなどです。
この手の言語の中で比較的新しいのがLeanです。人気もそれなりにあるようで、数学系の人が多い「code for math」というDiscordサーバーでは依存型言語の中でLeanの話題が一番活発です。
Lean
LeanはMicrosoft Researchで2013年から開発されているそうです。最新バージョンはLean 4で、数学ライブラリーはまだLean 3のようです。
Python代替
Pythonは時代の寵児とも言える言語です。特に、主流のAIフレームワークはPython向けのものが多いです。
ですが、Pythonのエコシステムは素晴らしくても、Pythonという言語(というか、標準的な処理系であるCPython)自体は普通のスクリプト言語で、これまでは高速化に重きを置いてこなかったし(これからはFaster CPythonで変わるのかもしれませんが)、並列処理を妨げるGILという足枷がついていたりします。
静的型に関しては型ヒントを書けるようになっていますが、処理系からしたら所詮飾りで、実行時に「list型の注釈が付いている変数にdictが入っている」なんてことは平気で起こります。
そこで、Pythonの文法やエコシステムを使えるようにしつつ、高速化できたり、堅牢なプログラムを書けるようにしたりする新言語が登場する余地があります。
(この話題に関連して、この記事とは別にPython風の言語からネイティブコードを生成するやつというメモを書いています。)
Codon
- exaloop/codon: A high-performance, zero-overhead, extensible Python compiler using LLVM
- Codon: A Compiler for High-Performance Pythonic Applications and DSLs | Proceedings of the 32nd ACM SIGPLAN International Conference on Compiler Construction
Pythonのサブセット+専用のデコレーターをネイティブコードにコンパイルするコンパイラーのようです。
日本語圏でバズったのは2023年2月頃ですが、公開されたのは2022年12月ごろでしょうか。
Mojo
- Mojo 🔥: Programming language for all of AI
- Modular: A unified, extensible platform to superpower your AI
- modularml/mojo: The Mojo Programming Language
MojoはPythonのスーパーセットで、MLIRを経由してCPUやAIアクセラレーターの能力を引き出すことを目指すようです。
生ポインターを扱えるなど、システムプログラミング言語としての側面もありそうです。
LLVMやSwiftの生みの親であるChris Lattner(がCEOの会社)が作っているようです。
2023年5月2日(日本時間だと3日?)に発表され、今まさにバズっています。ただ、この記事の執筆時点(2023年5月7日)ではまだ手元で動かせるブツは出ていなくて、登録するとMojo Playgroundへのアクセス権が得られる、という形のようです。
Erg
- Erg Programming Language
- erg-lang/erg: A statically typed language that can deeply improve the Python ecosystem
ErgはPythonのバイトコードを出力する静的型付き言語です。文法はPythonとの互換性はありません。
Rustで開発されています。
その他
Verse
- Beyond Functional Programming: The Verse Programming Language (Simon Peyton Jones) – YouTube
- Verse Language Reference | Epic Developer Community
VerseはEpic Gamesが作っている言語です。Haskellで有名なSimon Peyton Jonesらが参加しているようです。
宣言的で、かなり尖っていて、メタバースと何の関係が……?という印象を個人的には受けましたが、大企業パワーで流行ると面白いですね。
新言語はどういう時に生まれるか
ここからは新言語が登場しやすい状況をいくつか挙げてみます。
実行環境と新言語
一般論として、新しい実行環境・新種のハードウェアが出てきたらそれに特化した(能力を引き出せる)言語も登場しがちです。
例:
- JavaScriptに対するCoffeeScriptやTypeScript
- WebAssemblyに対するAssemblyScript
- MLIRに対するMojo
- 量子計算機に対するQ#
- 言語拡張という意味では、SIMDやGPUに対するOpenMP/OpenACCみたいなやつもあります。
最近のCPUは行列乗算などの専用命令を持つものが増えてきており、これからはそういう専用命令にアクセスしやすい言語が流行るかもしれません(そういう命令はBLAS等の専用ルーチンから触ればいいという考えもあると思いますが)。というか、数日前に出てきたMojoがまさにそういう謳い文句ですね。
より良い代替言語
既存の言語がイマイチな時に、既存の言語との相互運用性を維持しつつ元の言語よりマシな代替言語を作るモチベーションが生まれます。
- Cに対するC++, Objective-C
- JavaScriptに対するCoffeeScriptやTypeScript、その他altJS
- Javaに対するScala, Kotlin, その他JVM言語
- Erlangに対するElixir
- Objective-Cに対するSwift
- C++に対するCarbon
- Pythonに対するCodon, Mojo, Erg
逆に、本命の言語が貪欲に新機能を取り込んでいく場合、「マシな代替言語」は生まれにくいでしょう。例えば、昔のJavaやJavaScriptは進化が遅かったので「代替する言語」が生まれましたが、C#は割と新機能を実装する方なので「C#を代替する言語」はあまり聞きません(F#は別枠と考える)。
おまけ:既存の言語に対する革新
以前からある言語にどでかい新機能が入ったら実質新言語と言えるかもしれません(ほんまか?)。ここではそういう「革新」が期待される言語を2つ挙げます。
OCaml with algebraic effects
OCamlの並行並列対応はMulticore OCamlの名の下に進められてきて、2022年12月にリリースされたOCaml 5.0に搭載されました。
他の言語では非同期処理を書くのに「関数に色をつける」つまりasyncやawaitで関数とその呼び出しをマークしたりしますが、OCamlの場合はそういう「非同期関数の特別扱い」が必要ありません。これは(さっきも書いた)代数的エフェクトを利用するためです。
(Rustの人に言うと、keyword genericsの問題のうちasyncに関するものはOCamlでは発生しないということです。)
と言いつつ、OCaml 5.0では代数的エフェクトは実験的な機能で、専用の構文はまだ用意されていないようです。今後はもっと使いやすくなるよ、ということでしょうか。
Dependent Haskell
- Why Dependent Haskell is the Future of Software Development
- dependent haskell · Wiki · Glasgow Haskell Compiler / GHC · GitLab
- ghc-proposals/0378-dependent-type-design.rst at master · ghc-proposals/ghc-proposals
静的型付き純粋関数型言語であるHaskellに依存型を入れようという構想があります。もちろんHaskellは停止しない関数を書けるし、unsafeCoerce Refl
で型システムを騙すことができてしまうので先述の依存型言語のような定理証明はできなさそう(意味がなさそう)ですが、それでも依存型の表現力は魅力的です。
Dependent Haskellの実現がいつになるかは分かりませんが、最近のGHC(Haskellの処理系)では型とカインドが統合されて型に依存するカインドを書けるようになるなど、地ならしとも言える作業が進められています。次に来るのは項の位置に型引数を書ける拡張でしょうか。
なお、今日のHaskellで依存型っぽいことをするには、singletonsを使うやり方があります。詳しくは私の書いた
を参照してください。
まとめと宣伝
TypeScriptやRustやSwift以降にも、新しいプログラミング言語は色々登場しています。この中からメインストリームになる言語が現れるのかはわかりませんが、それでも「多くの人が知っている」程度に普及する言語は現れるでしょう。願わくは、これまで主流の言語が持たなかった機能を持つ言語が新たに普及して欲しいものです。
新しく登場する言語をいち早く知りたい場合は、そういう情報を取りに行くことが大切です。Twitterのタイムラインを構築するとか、Hacker NewsやRedditを巡回するとか。私の観測範囲にない面白い言語が出ているかもしれません。
もちろん、既存の言語にはないすごいアイディアがあって、自分の手でそれを実現する新言語を作るんだ、というのも良いでしょう。普及レベルまで持っていくのは困難な道ですが、頑張ってください。
最後に宣伝です。まず、プログラミング言語処理系に関する日本語のコミュニティーとして「プログラミング言語処理系が好きな人の集まり」というのがあるので紹介しておきます(以前はSlackでしたが今はほぼZulipに移行しています)。
このコミュニティーにいる人が作った言語が「次に流行る言語」になるかもしれません(ほんまか)。
次に、私が作っている言語処理系「LunarML」を紹介しておきます。これは新言語ではなくてStandard MLのコンパイラーです。何が新しいのかというと、ターゲットとしてLuaコードを出力するという点で、Luaに対する「より良い代替言語」を意図しています。
LunarMLの進捗報告は随時このブログで行なっています。リリースはまだですが、今年中には出したいです。