他の言語に変換するために使用できるカスタマイズ可能なプログラミング言語はありますか?


13

独自の構文構成を設定でき、コードを選択した言語に変換するプログラミング言語はありますか?

たとえば、「Pythonのインデックス付きブロック」などの特定の構成を選択し、べき乗などのために[a,b,c]配列を初期化します^。スクリプトは、選択した言語の同等の言語に変換します。


1
しないことを願っています。TIMTOWTDIは間違いなく悪いですが、「必要な数だけ互換性のない方法を考案」すると、間違いなく同じマイナス100倍になり、さらに有用性が低くなります。DSLにはそれだけの価値がある場合もありますが、構文の半分を再定義する(またはさらに悪いことに、2つの演算子を交換し、明らかに互換性はあるがセマンティクスが異なる)ために

具体的にはJavaScriptでプログラミングしており、コードにいくつかの構文糖を設定できるようにしたいのですが、言語では許可されないためです。オペレーターのオーバーロードも不可能です。
ドッカット

2
ある程度、あなたが説明しているものはプリプロセッサマクロのように聞こえます。perlに同様の機能を持たせることができたら
...-ヤンニス

5
@Dokkat:質問を更新して、これがJavaScriptに関するものであることを具体的に述べてください。質問-質問通り-はメンテナンスとサポートの悪夢です。既存の言語に新しい構文を追加する(またはプリプロセッサを使用してプライベート言語をパブリック言語に変更する)のは本当にひどいです。しかしながら。特定の JavaScript構文の砂糖の問題をリストすると、特定のヘルプが得られる場合があります。
-S.Lott

3
これらの「パーソナライズされたプログラミング言語」は、通常「ドメイン固有言語」またはDSLと呼ばれます。
マイケルディロン

回答:


14

はい、しかしおそらくあなたが考えている方法ではないでしょう。

Lispとその親sには、ソースに対して任意の変換を実行できる強力なマクロシステムがあります。したがって、原則として、マクロ(および文字レベルのリーダーマクロ)を使用して、好きな拡張機能を作成できます。連結言語(および関連分野の著者による言語)には、同様のメタプログラミングの可能性があります。これの良い例はForthで、多くの構文構造(コメントなど)をユーザー定義できます。現代的な非難解な例として、Perl 6ユーザー定義構文についてもPerl 5よりも改善されたサポートを提供する努力があります。


8
私は何とか Perlが答え(の一部)ことを知っていました。Cプリプロセッサマクロも説明に適合していると思います。
ヤニス

また、C ++での演算子のオーバーロードも便利です。ハローワールドの例が思い浮かびます。cout << "こんにちは";
主Tydus

@LordTydus:実際、オペレーターのオーバーロードだけでも、健全なインターフェースの背後でかなりの魔法をかけることができます。C ++に、より一般的なオーバーロード機能、たとえば、operator[]複数の引数のオーバーロード、またはHaskellのような新しい演算子の導入があればいいでしょう。しかし、私は委員会が解析の問題を過ぎて見るとは思わない。
ジョンパーディ

3

コンセプトプログラミングのようですね。

私はそれに慣れていませんが、XLはそれ専用に設計された言語です。

XLは、プログラマが再構成可能な構文とセマンティクスを備えています。コンパイラプラグインを使用して、言語に新しい機能を追加できます。

LispとForthもコンセプトプログラミングをサポートしていますが、XLよりは少ないです。Lispは非常に実用的で効果的なので、Lispをお勧めします。最も重要なことは、Lispが提供する表記法ではなく、明確で柔軟な構文です。


たとえば、「Pythonのインデックス付きブロック」、「[a、b、c]」、配列の初期化、「^」などの特定の構成を選択します。

Haskellのような非常に柔軟で統一された構文を持つ言語に興味があるかもしれません。


これは私が探していたものです。
-Dokkat

2

私の知る限りではありません。

標準的な言語構文の主な利点の1つは、多くの人がそれを読むことができることであり、誰もが独自の構文を発明した場合、だれも他の人のコードを理解できないことです。 ....この言語は、愛好家には楽しいかもしれませんが、実用的なものにはあまり使いません。

おそらく最も近いものはLispでしょう。マクロシステムでは、独自の新しい言語構成を非常に柔軟な方法で記述できます。通常はLisp構文に固執しますが、本当に必要な場合はすべてを効果的に再定義できます。

結果として、LispはDSLの実装に特に人気があります。良い例は、データベースアクセスに必要なすべての定型コードを処理するClojure(Korma)のこのデータアクセスDSLです。


2

Scalaは、この方法でDSL(ドメイン固有言語)を作成するためによく使用されます。

これは主に、Scalaには演算子がなく、Scalaメソッドを呼び出す構文を短縮できるためです。例えば:

5は整数オブジェクトです。5プラス7を計算するには、次のように書くことができます

val ans = 5.add(7)ただし、追加メソッドの名前は実際には「+」なので、次のように記述します。

val ans = 5。+(7)ただし、Scalaでは、「。」を含める必要はありません。メソッド呼び出しまたは引数の周りの括弧「()」で、オブジェクト5で+メソッドを呼び出すには、次のように記述します。

val ans = 5 + 7これは完璧に機能します。Scalaには賢いメソッドの命名スキームに干渉する演算子がないためです。次に、+などのメソッドを「オーバーライド」できるという事実や、>>>または::!という名前の独自のメソッドを作成できるという事実を含め、そのアイデアを独自のクラスおよびオブジェクトに拡張します。または@ * @またはfancifyなどの単なるテキスト名。


これはすごい。scalaを見てみましょう。
-Dokkat

1

まだほとんど実験的であるため、使用する必要はありませんが、最近の興味深いプログラミングパラダイムの1つは、言語指向プログラミング(LOP)です。

言語指向プログラミングの概念は、ユーザーの用語で要件をキャプチャし、ユーザーの説明と可能な限り同形の実装言語を作成しようとするアプローチを採用しているため、要件と実装との間のマッピングは可能な限り直接です。

セルゲイ・ドミトリエフはそれをより詳細に説明します。

それがイデオロギーですが、実際には、あなたが求めている行動をサポートするということです。あなたはできる:

  • 既存の言語を拡張します。
  • さまざまな言語を作成します。
  • 新しく定義したキーワードをベース言語に変換するには、既存の「変換言語」を使用します。

私がこのパラダイムに従うことを知っている最もアクティブなプログラミング環境は、JetBrainsによる無料のメタプログラミングシステム(MPS)です。

実際に商用ソフトウェアでも使用され始めているので、おそらく「実験」段階から抜け出し始めています。

  • Realaxyは、完全にMPS上に構築されたactionscriptエディターです。LOPのパワーを使用して、AS3のクロージャなどを実装できました。
  • mbeddr Cは、MPSに基づく拡張可能なC言語です。

1

ドメイン固有の言語は、Tclコミュニティで非常に一般的に使用されています。たとえば、CとSQLの両方が埋め込まれたDSLとして含まれているTclプログラムが(CritclおよびSqliteパッケージを介して)表示されることは珍しくありません。組み込みDSLの唯一の制限は、組み込み言語が中括弧のバランスをとる方がはるかに良いということであり、実際にはそれは本当に不必要な要件であることがわかります!

DSLを簡単にするもう1つの言語は、標準MLです。これにより、汎用システムトークナイザーから生のトークンにアクセスできます(識別子がキーワードに変換される前から)。これにより、特にコメント、文字列、トークン境界に関連するSMLの基本的な構文規則に従っている限り、DSLの幅広いクラスを簡単に実行できます。実際、この言語の主要な駆動アプリケーションの多くで頻繁に使用されています(定理証明など)

すべての言語がこれを簡単にするわけではありません。特に、ブレースされた用語の内容を自動的に解析する言語(それらの多くは!)はこれを行うことができないため、演算子をオーバーライドするか、サブ言語を文字列内に配置するか、DSLを構築する必要があります。 DSLをホスト言語内で処理できるものに書き換えるプリプロセッサを使用します。


0

AFAIUは、独自のDSL(ドメイン固有言語)の作成に役立つ言語を探しています。多くの良い候補者がいます。個人的には、RubyまたはIoをお勧めします。1)演算子の簡単なオーバーロード、2)メタプログラミング、3)method_missing独自のAPIの作成に使用できるフォールバックメカニズムを提供するためです。たとえば、Rubyコードを読み取ってSQLを生成するRubyで作成されたDSL であるsqldslを見てください


0

実際に使用したことはありませんが、正しく思い出せば、TXLはソースコードを翻訳するために特別に設計されています。そのため、使用する言語および/または言語拡張機能からターゲットの実際の言語への翻訳方法を指定するために使用できるはずです。

持っているように見えない文法のJavascriptのために利用可能に。しかし、それを以前に使用したことがないので、それがあなたにどのように役立つか正確にはわかりません。


0

PPWizardと呼ばれる非常に強力なプリプロセッサがあります。構文を学べば、さまざまな言語をターゲットとするマクロ定義を作成できます-それが絶対確実で楽しいことではなく、便利なツールです。


ここでいくつかのリンク:PPWIZARD CONTENTS(公式ドキュメント)、PPWizard-EDM2(外部参照)。このツールは強力ですが、そのドキュメントは読みやすいものではありません(おそらくその力のため)。
ウルフ


0

プログラミング言語を部分的にパーソナライズする一般的な方法の1つは、マクロプリプロセッサを使用することです。たとえば、JavaScript環境がダウンロードする場所に結果を置く前に、Cプリプロセッサで「dokkat-lang」を実行できます。

どれだけできるかは、プリプロセッサの高度さに依存します。C ++、Objective C、およびさまざまな実験言語の初期バージョンは、ストックCコンパイラツールチェーンに供給する前にソースコードを前処理することによって行われたことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.