独自の構文構成を設定でき、コードを選択した言語に変換するプログラミング言語はありますか?
たとえば、「Pythonのインデックス付きブロック」などの特定の構成を選択し、べき乗などのために[a,b,c]
配列を初期化します^
。スクリプトは、選択した言語の同等の言語に変換します。
独自の構文構成を設定でき、コードを選択した言語に変換するプログラミング言語はありますか?
たとえば、「Pythonのインデックス付きブロック」などの特定の構成を選択し、べき乗などのために[a,b,c]
配列を初期化します^
。スクリプトは、選択した言語の同等の言語に変換します。
回答:
はい、しかしおそらくあなたが考えている方法ではないでしょう。
Lispとその親sには、ソースに対して任意の変換を実行できる強力なマクロシステムがあります。したがって、原則として、マクロ(および文字レベルのリーダーマクロ)を使用して、好きな拡張機能を作成できます。連結言語(および関連分野の著者による言語)には、同様のメタプログラミングの可能性があります。これの良い例はForthで、多くの構文構造(コメントなど)をユーザー定義できます。現代的な非難解な例として、Perl 6がユーザー定義構文についてもPerl 5よりも改善されたサポートを提供する努力があります。
operator[]
複数の引数のオーバーロード、またはHaskellのような新しい演算子の導入があればいいでしょう。しかし、私は委員会が解析の問題を過ぎて見るとは思わない。
コンセプトプログラミングのようですね。
私はそれに慣れていませんが、XLはそれ専用に設計された言語です。
XLは、プログラマが再構成可能な構文とセマンティクスを備えています。コンパイラプラグインを使用して、言語に新しい機能を追加できます。
LispとForthもコンセプトプログラミングをサポートしていますが、XLよりは少ないです。Lispは非常に実用的で効果的なので、Lispをお勧めします。最も重要なことは、Lispが提供する表記法ではなく、明確で柔軟な構文です。
たとえば、「Pythonのインデックス付きブロック」、「[a、b、c]」、配列の初期化、「^」などの特定の構成を選択します。
Haskellのような非常に柔軟で統一された構文を持つ言語に興味があるかもしれません。
私の知る限りではありません。
標準的な言語構文の主な利点の1つは、多くの人がそれを読むことができることであり、誰もが独自の構文を発明した場合、だれも他の人のコードを理解できないことです。 ....この言語は、愛好家には楽しいかもしれませんが、実用的なものにはあまり使いません。
おそらく最も近いものはLispでしょう。マクロシステムでは、独自の新しい言語構成を非常に柔軟な方法で記述できます。通常はLisp構文に固執しますが、本当に必要な場合はすべてを効果的に再定義できます。
結果として、LispはDSLの実装に特に人気があります。良い例は、データベースアクセスに必要なすべての定型コードを処理するClojure(Korma)のこのデータアクセスDSLです。
Scalaは、この方法でDSL(ドメイン固有言語)を作成するためによく使用されます。
これは主に、Scalaには演算子がなく、Scalaメソッドを呼び出す構文を短縮できるためです。例えば:
5は整数オブジェクトです。5プラス7を計算するには、次のように書くことができます
val ans = 5.add(7)ただし、追加メソッドの名前は実際には「+」なので、次のように記述します。
val ans = 5。+(7)ただし、Scalaでは、「。」を含める必要はありません。メソッド呼び出しまたは引数の周りの括弧「()」で、オブジェクト5で+メソッドを呼び出すには、次のように記述します。
val ans = 5 + 7これは完璧に機能します。Scalaには賢いメソッドの命名スキームに干渉する演算子がないためです。次に、+などのメソッドを「オーバーライド」できるという事実や、>>>または::!という名前の独自のメソッドを作成できるという事実を含め、そのアイデアを独自のクラスおよびオブジェクトに拡張します。または@ * @またはfancifyなどの単なるテキスト名。
まだほとんど実験的であるため、使用する必要はありませんが、最近の興味深いプログラミングパラダイムの1つは、言語指向プログラミング(LOP)です。
言語指向プログラミングの概念は、ユーザーの用語で要件をキャプチャし、ユーザーの説明と可能な限り同形の実装言語を作成しようとするアプローチを採用しているため、要件と実装との間のマッピングは可能な限り直接です。
それがイデオロギーですが、実際には、あなたが求めている行動をサポートするということです。あなたはできる:
私がこのパラダイムに従うことを知っている最もアクティブなプログラミング環境は、JetBrainsによる無料のメタプログラミングシステム(MPS)です。
実際に商用ソフトウェアでも使用され始めているので、おそらく「実験」段階から抜け出し始めています。
ドメイン固有の言語は、Tclコミュニティで非常に一般的に使用されています。たとえば、CとSQLの両方が埋め込まれたDSLとして含まれているTclプログラムが(CritclおよびSqliteパッケージを介して)表示されることは珍しくありません。組み込みDSLの唯一の制限は、組み込み言語が中括弧のバランスをとる方がはるかに良いということであり、実際にはそれは本当に不必要な要件であることがわかります!
DSLを簡単にするもう1つの言語は、標準MLです。これにより、汎用システムトークナイザーから生のトークンにアクセスできます(識別子がキーワードに変換される前から)。これにより、特にコメント、文字列、トークン境界に関連するSMLの基本的な構文規則に従っている限り、DSLの幅広いクラスを簡単に実行できます。実際、この言語の主要な駆動アプリケーションの多くで頻繁に使用されています(定理証明など)
すべての言語がこれを簡単にするわけではありません。特に、ブレースされた用語の内容を自動的に解析する言語(それらの多くは!)はこれを行うことができないため、演算子をオーバーライドするか、サブ言語を文字列内に配置するか、DSLを構築する必要があります。 DSLをホスト言語内で処理できるものに書き換えるプリプロセッサを使用します。
PPWizardと呼ばれる非常に強力なプリプロセッサがあります。構文を学べば、さまざまな言語をターゲットとするマクロ定義を作成できます-それが絶対確実で楽しいことではなく、便利なツールです。
あなたが探しているのは、コンパイラコンパイラです。コンパイラコンパイラは、正式な言語で記述された言語定義を受け取り、この言語のコンパイラを作成します。