はじめに
みなさん、こんにちは! みなさん元気に過ごしていますか?
今年もあっという間に過ぎていき、いよいよMindshifting Mayです。おそらく私が最も楽しみにしている月で、その一番の理由はPrologが含まれていることです!
Analytical Aprilは楽しんでいただけましたか? 本当にたくさんの方が参加してくださり、今までで最も成功した月のひとつだったと思います。4月には、遅れてのFunctional Februaryインタビューとして、Simon Peyton Jonesとお話しする機会もありました。あれは本当に素晴らしかったので、ぜひ見返すことをおすすめします。あの素敵な言葉のためだけでも:「命令型プログラミングという石灰岩がすり減ってしまえば、その下から関数型プログラミングという花崗岩が現れるだろう」。
さて、それではMindshifting Mayに進みましょう! いつもどおり、Erikと私が、今月のテーマと、これから探っていくさまざまな言語について手短に紹介します。
今月はなんと6つの言語があります。Ballerina、Pharo、Prolog、Red、Tcl(ティクル)、Unisonです。これらの言語はどれも、より「主流」の言語とはかなり違っています。ですから、どこが違うのかを体感するために、いくつか試してみることをおすすめします。私はPrologをぜひおすすめします。私が人生で最も楽しくコードを書いてきた言語のひとつだからです。ErikもUnisonに大いに胸を躍らせているので、こちらも試す価値のある言語です。
バッジ
Mindshifting Mayのバッジを獲得するには、5月の間にこれらの言語のいずれかで演習を5つ完了する必要があります。
年間を通じての12in23バッジもあります。それを獲得するには、その言語で注目の演習を5つ解く必要があります。5月より後にこれを見ている場合でも、この部分は年内いつでも取り組めるので、機会を逃したわけではありません。これらの演習を選ぶのは、言語がどれも大きく異なるため難しい作業でした。そこで、解いていて楽しく、さまざまなアプローチを探るのが面白い、より汎用的な演習を選びました。
- 頭字語:フレーズを頭字語に変換します
- アイソグラム:フレーズに繰り返し現れる文字が含まれているかどうかを調べます
- ローマ数字:10進数をローマ数字に変換します
- 雨粒:数値を雨粒の音に変換します
- 宇宙時代:太陽系の各惑星で、ある人が何歳になるかを計算します
これらの演習と、これまでの月の演習は、すべて#12in23のページで見つけられます。
概要
それでは、それぞれの概要を見ながら、各言語をじっくり探っていきましょう。
Prolog:
- 考え方が異なります。プログラムは関係の集合として定義されます。その後、単一化(パターンマッチング)を使って関係のデータベースに「問い合わせ」、答えを見つけます。ルールベースのシステムに最適です
- 構文がほとんどなく、データ型(項)が1つと言語の構造要素(節)が1つだけです。節はすべて項からできており、事実やルールを定義できます
- 非常に宣言的です。物事がどう計算されるかよりも、何を計算すべきかを気にします。多くの場合、これはコードが少なくて済むことを意味します
- 広範な探索空間への問い合わせに適するよう設計されています。さまざまな探索戦略(深さ優先、幅優先)があり、自動的な枝刈りをサポートします
Unison
- Unisonのコードにはバージョン競合がありません! Unisonの関数は依存関係のハッシュを把握しているので、必要なバージョンのコードを正しく見つけられます。
- Unisonは、ローカル開発UIとホストされたリポジトリでコードのライブ閲覧をサポートしているので、依存しているライブラリのソースコードをいつでもクリックして確認できます。
- Abilitiesは、「エフェクト」(たとえばIO)を純粋関数的に管理する仕組みです
Pharo
- 構文がごくわずかで、構文全体がはがきに収まります(予約語はたったの6つ!)。メッセージ構文は自然言語をまねたもので、主語、動詞、補語からなります(between: 1 and: 2 +)。意味論も単純です(たとえば、きわめて単純な優先順位のルール)。そのため学びやすく、読みやすくなります
- 最初の学習曲線を乗り越えれば、生産性は非常に高いです。その理由はいくつかあり、単純な意味論や少ない構文もありますが、後で触れるPharoならではの優れた機能も挙げられます
- ほとんどのプラットフォーム(Windows、macOS、Linux+ARM対応)で、高速な仮想マシン(OpenSmalltalk)上で動作します
- 単なるSmalltalkの実装にとどまらず、今も活発に開発が続いています(最新のSmalltalkのバージョンは1980年のSmalltalk 80です)
- コミュニティが友好的です
Tcl(発音は「ティクル」)
- 構文がごくわずかで、ルールは12個だけ、紙1枚に収まります。意味論も比較的わかりやすいです。そのためプログラムは読みやすく、学びやすいです
- コルーチンによる単純な並行処理があり、非同期コードを同期コードのように書けます
- ネットワークプログラミングと非同期ファイルI/Oのためのイベントループが組み込まれています
- 成熟していますが、今も進化を続けています
Ballerina
- 言語統合クエリによる、JSON、XML、表形式データの型安全で宣言的な処理をファーストクラスでサポートします
- 構造的部分型付け(ダックタイピング)が広く使われる、柔軟な型があります。クローズド型は部分型付けを行う方法で、オープン型は送られてくるデータが多すぎる場合にもうまく対処します。HTTPリソースで使うと、データバインディングと検証が組み込まれています
- 分散トランザクション、補償、サーキットブレーカーなど、一般的な統合パターンとコネクタを組み込みでサポートします
- すべてのBallerinaプログラムは、あらゆるOpen Telemetryツールから自動的に可観測であり、コードの挙動とパフォーマンスを完全に制御・可視化できます。
- 軽量スレッドであるstrandによる優れた並行処理があります。ノンブロッキングI/O呼び出しは簡単です。コンパイラーがワーカー間の送受信呼び出しのチェックを手助けし、デッドロックを防ぎます。不変性もネットワークに最適です
- 共用体型による明示的なエラーハンドリングと、それを助ける
checkという糖衣構文があります
Red
- 軽量です。ツールチェーン全体が約1.5MBのダウンロードで、単一の実行ファイルです。
- ポータブルです。クロスコンパイルが簡単です。依存関係のない小さなバイナリを生成します。メモリ使用量もわずかです。
- Redは独自のメタ言語であり、独自のデータ形式(LISPのような)を持っています。プログラムはコードを変換したり読み取ったりできます。
- リアクティブ:オブジェクトをリンクさせて、プログラムのサイズと複雑さを減らせます(Excelのシートを思い浮かべてください)
これらの言語はどこで使われているのでしょうか?
Prolog:
- 人工知能(IBMのWatson)
- (自然)言語処理
- 知識ベースのための分散データベース(TerminusDB)
- Java仮想マシンの型ルールを記述するのにも使われています
Unison
- 分散システムを書くために使われています
- 一般的なWebサービス
- バッチ計算ジョブ
Pharo
- インタラクティブなツールに使われています
- 大きく異なる分野で使われています。オンライン取引プラットフォームや、投資管理のクラウドベースツールなどです
- 防衛産業におけるユーザーインターフェースとインタラクションのプロトタイピング
- イベント企画のためのWebベースのアプリケーション
- API、データ、システムを探るための、Moldableな開発環境ツール
Tcl
- グルーコードとして、または組み込みで使われています
- CISCOルーターのGUIで使われています
- さまざまな製造システム
- NASAも何度も使っています
- その他の大企業には、Pixar、Boeing、Intel、NBCなど、まだまだ多くあります。
- ウィンドウツールキットであるTkは、perl/python/rubyのような他の「スクリプト」言語にも採用されています。
- インタラクティブなCLIアプリケーションを自動化するツールであるExpect
Ballerina
- クラウドネイティブなアプリケーションに使われています
- MOSIPで使われています。MOSIPは、政府やその他の組織がデジタルおよび基盤的なアイデンティティシステムを低コストで導入できるよう支援する、基盤的アイデンティティプラットフォームです。
プログラミングの視点から見て、これらの言語はなぜ面白いのでしょうか?
Prolog:
- 論理プログラミング言語(最初期のもののひとつ)で、それ自体が独自のパラダイムです(オブジェクト指向や関数型プログラミングのように)
- 動的型付けです
Unison
- 純粋関数型言語です
- 静的型付けです
Pharo
- オブジェクト指向言語ですが、Smalltalk的な意味でのそれです。「普通の」オブジェクト指向言語とは異なり、コンストラクターも、型宣言も、インターフェースも、プリミティブ型もありません。
- 動的型付けです
Tcl
- マルチパラダイム:オブジェクト指向、命令型、関数型のスタイルをサポートします
- 動的型付けです
Ballerina
- マルチパラダイム:オブジェクト指向、関数型、宣言型
- 静的型付けです
Red
- マルチパラダイム:命令型、関数型、オブジェクト指向、記号型、リアクティブ
- 静的型付けです
それぞれの際立った特徴は何でしょうか?
Prolog:
- 柔軟です。多くの組み込み述語が複数の方向に働きます。同じ構文でデータを問い合わせたり作成したりできます。他の言語では難しい問題があっさり解けることもあります
- DCGは組み込みのパーサーコンビネーターのようなもので、シーケンスの解析、生成、補完、検査に優れています
- CLPは、制約の観点からプログラムを定義する効率的な方法です
Unison
- コードはテキストではなく、(不変の)データです。コードはデータベースに保存され、Unison Codebase Managerを通じてアクセス・更新します。テキストファイルは、コードをデータベースに入れるための手段のひとつにすぎません。不変データであることは、テスト結果をキャッシュでき、型チェックも一度だけ行えばよいということも意味します
- 定義は名前ではなくハッシュで参照されます。これは「内容アドレス指定」のコードと呼ばれます。定義の構文木がそのハッシュを決めます。バージョンの競合はなく、名前の変更も簡単です。
- Unisonのドキュメントは言語のファーストクラスの実体であり、それが説明する関数と常に同期しています。ドキュメントにライブの例を埋め込み、その例のコードがコンパイルされることを保証できます。
- クラウド計算に最適です。ビルドがなく、関数をその場で配布でき、Unisonのサービス間通信のためのエンコーダーとデコーダーを書く時間も減ります。
Pharo
- わかりやすい実行モデル:すべてがオブジェクトで、実行はもっぱらメッセージ(これもオブジェクトです)を通じて行われます。制御フローさえもメッセージで行います。モデルは単純ですが、非常に強力です。他のオブジェクト指向言語とはかなり異なります。
- コードはテキストファイルではなく、Pharoイメージの中にあります。Pharoイメージにはアプリケーションの状態全体が含まれ、Pharo仮想マシンで実行できます。作業を保存すると、Pharoは環境の状態全体をイメージファイルとして保存します。このファイルには、すべてのオブジェクト、それらの関係、実行コンテキストが含まれます。イメージファイルは他の人と共有でき、別のマシンやプラットフォームで読み込めます。これにより、エンジニアはプロジェクトで簡単に共同作業したり、Pharoで作ったアプリケーションを配布したりできます
- ライブで没入感があり、Pharo専用のIDEを通じて実行時に即座にフィードバックが得られます。実行中のままでも、その場でプログラムを実行・変更できます! メソッドの再起動やオンザフライでのバグ修正をサポートする強力なデバッガーもあります
Tcl
- わかりやすい型システム:すべてが文字列です。「すべてが文字列」は、かつてTclが実装されていたときの考え方です。今では内部に堅牢な型システムがあり、Tclの実体(文字列、小数、配列、辞書など)は、文字列表現だけでなく型固有の表現も持ちます。これにより、文字列との間で相互変換する必要がなくなり、Tclコードのパフォーマンスが大幅に向上します。
- 「すべてはコマンドとして実行される」。組み込みコマンドはありません。Tclには
ifやwhileなどを含む「標準ライブラリ」のコマンドが付属しています。新しい制御フローコマンドを追加するのはとても簡単です。たとえば、untilループなどです。Tclのコマンドを上書きするのも簡単です。 - コンパクトで、意味論が単純で、Cライブラリとして実装されているため、埋め込みが簡単です
Ballerina
- クラウドネイティブです。JSONからユーザー定義型への変換が組み込まれています。(マイクロ)サービスを作成するための超軽量な構文があります。サービスの並行実行が組み込まれています。HTTP(1と2)、graphql、gRPCをそのままサポートします
- コードをさまざまなクラウドにデプロイするための成果物を自動生成します。これらの成果物は、Dockerfile、Dockerイメージ、KubernetesのYAMLファイル、サーバーレス関数などです。
- コードをシーケンス図として可視化する機能が組み込まれています。コードの流れを可視化するのに最適です。HTTP呼び出しさえも可視化できます
Red
- ドメイン固有言語/「方言」(Rebolの用語)を構築・解析するのに最適です。いくつかの組み込みの方言があります:
- Red/System:ネイティブコードにコンパイルされる、Cレベルのシステムプログラミング言語
- Parse:強力なPEGパーサー
- VID:シンプルなGUIレイアウト作成用の方言
- Draw:ベクター2D描画用の方言
- Rich-text:リッチテキスト記述用の方言
- 簡単なGUI。完全にクロスプラットフォームでネイティブです。双方向バインディング、ライブ更新、イベントをサポートし、OSの機能へのアクセスも提供します
5月にはどの言語を試すべきでしょうか?
どれもそれ自体が面白い言語なので、どれを選んでも理にかなっています。
- クラウドコンピューティングに興味があるなら、BallerinaとUnisonが良い選択です。Tclも優れた並行処理の機能を持っています
- オブジェクト指向プログラミングに慣れているけれど、別の見方をしてみたいなら、Pharoを試してみてください
- テキストファイルに支えられていない言語でプログラミングするとはどんな感じかを味わいたいなら、独自で強力なIDEを備えたPharoか、Unison Codebase Managerを使うUnisonを試してみてください。
- ミニマリズムが好きなら、Tcl、Prolog、Pharo、Redはいずれも構文がかなり少なく、意味論も比較的単純です
- パラダイムの面白い組み合わせを見たいなら、Ballerina、Tcl、Redはいずれも異なるパラダイムをサポートしています
- もっと変わったパラダイムを試してみたいなら、論理プログラミングにはProlog、リアクティブプログラミングにはRed、宣言型プログラミングにはBallerinaを試してみてください
- 関数型プログラミングが好きなら、Unison、とりわけそのAbilitiesをチェックしてみてください。
- メタプログラミングに興味があるなら、Tcl、Prolog、Pharo、Redはいずれも手厚くサポートしています
もちろん、時間があれば、いくつか試してみることをおすすめします! どれもとても個性的です。注目の言語をいくつか選んで同じ演習を解き、実装がどれほど違うか見てみましょう。