長い間、私は必要な機能セットを見つけるためにさまざまな言語を試してきましたが、見つけることができませんでした。私は自分のさまざまなプロジェクトに適切に適合する言語を持っていますが、これらの言語の共通部分を考え出し、プロジェクトの99.9%を単一の言語で実行できるようにします。私は以下が欲しい:
- .NET上に構築されているか、.NET実装があります
- コンパイル時と実行時の両方で.NETランタイムへの依存関係はほとんどありません(主要なユースケースの1つは、.NETランタイムが完全にカスタムである組み込み開発であるため、これは重要です)
- 管理されていない依存関係のない100%.NETコードのコンパイラがあります
- 任意の式のネストをサポートします(以下を参照)
- カスタム演算子定義をサポートします
- 型推論をサポートします
- 末尾呼び出しを最適化します
- 明示的な不変/可変の定義があります(素敵です-私はこれを愛するようになりましたが、それなしで生きることができます)
- 強力なメタプログラミングのための実際のマクロをサポートします(絶対に必要です)
私が使用している主な2つの言語は、BooとNemerleですが、F#でも遊んでいます。
Nemerleに対する主な不満:コンパイラには恐ろしいエラー報告があり、実装は地獄(コンパイラとライブラリ)としてバグがあり、マクロは関数内または属性としてのみ適用でき、依存関係に関してはかなり重いです(十分ではありませんが)ディールブレーカー)。
Booに対する主な不満:任意の式のネスト(ディールブレーカー)、マクロの記述が困難、カスタム演算子の定義(潜在的なディールブレーカー)がありません。
F#に対する主な不満:醜い構文、メタプログラミングを理解するのが難しい、非フリーライセンス(壮大なディールブレーカー)。
ですから、考えれば考えるほど、自分の言語を開発することを考えます。
長所:
- 必要な構文を正確に取得する
- かなり速くなるターンアラウンドタイムを取得します。定量化するのは難しいですが、開発者の生産性が1.5倍になっても驚かないでしょう。特に、これにより特定のプロジェクトで使用できるテストインフラストラクチャが原因です。
- コンパイラにカスタム機能を簡単に追加して、ランタイムでうまく機能させることができます
- 私は自分が望むように設計され、正確に機能するものを手に入れました-これはNIHのように聞こえますが、これは私の人生を楽にしてくれます
短所:
- 人気が出ない限り、メンテナンスの負担に悩まされます。誰もがもっとプロフェッショナルなものを望んでいると思うので、少なくともNemerleの人々を乗り越えることができることは知っていますが、それには村が必要です。
- 最初の欠点のため、私はプロの設定でそれを使用することを警戒しています。とは言うものの、私はすでにNemerleを使用しており、独自のカスタム変更されたコンパイラーを使用しています。
- それが人気を博さなければ、開発者を見つけることははるかに難しくなり、PaulGrahamが容認すらしないかもしれません。
したがって、これらすべてに基づいて、一般的なコンセンサスは何ですか?これは良いアイデアですか、それとも悪いアイデアですか?そしておそらくもっと有益なことに、私は大きな賛否両論を見逃しましたか?
編集:ネストの例を追加するのを忘れました-これがNemerleのケースです:
def foo =
if(bar == 5)
match(baz) { | "foo" => 1 | _ => 0 }
else bar;
編集#2:存在する場合にこの言語に変換されるコードのタイプの例を示すことは害にならないだろうと考えました(S. Lottの答えだけで、私がそれをするのを怖がらせるのに十分かもしれません)。このコードは、カスタム構文(opcode、:=、quoteblockなど)、式のネストなどを多用しています。ここで良い例を確認できます:ここ。