プログラムが言語のセマンティクスを拡張できるほど十分に順応性があるか


15

プログラマーがクラス(Stringなどのクラスを含む)を定義した後、いつでもクラスを拡張/オーバーライドできるようにするruby(およびjavascript)などの言語の機能を参照して、プログラムを後で拡張できる言語を設計することは理論的に実行可能ですか?そのセマンティクス。

例:Rubyは多重継承を許可していませんが、デフォルトの言語動作を拡張/オーバーライドして多重継承の実装を許可できます。

これを許可する他の言語はありますか?これは実際に言語設計者の関心事ですか?Webアプリケーション開発用のRailsフレームワークを構築するためにrubyを使用する選択肢を見ると、このような言語は非常に強力で、さまざまなアプリケーションのフレームワーク(またはDSL)を設計できます。


2
例外をライブラリコードとして実装できるようにするSchemeの衛生マクロまたはニュースピークのリフレクションとして、セマンティック拡張として数えていますか?Perligata:Romanaのような構文拡張機能はどうですか?

これは概念ではなく言語のリストを求める質問のようです。質問の方向を変更する保留中の編集、私は事実上オフトピックとして終了することに投票します。
ラファエル

私の記憶が正しければ、Javaでさえ、プログラムが型システムを拡張できる機能を手に入れることになります。
ラファエル

1
@ラファエル、あなたはJSR 305を考えていますか?Javaアノテーションは、(一部)Gilad Brachaによって設計されました。GiladBrachaは、以下の回答でリンクしたNewspeakを設計し、プラグイン可能なタイプシステムも擁護しました。JSR 305用品のようなシステムの注釈を入力@Nullableし、@NonNullFindBugsのような外部チェッカーによって使用されています。
マイクサミュエル

「そのセマンティクスを拡張する」とはどういう意味かは不明です。Boost.Spiritを見ると、それはすでに「拡張セマンティクス」の私の個人的なしきい値を超えています:C ++の数学演算子は、代わりに言語構文を記述するために使用され、コンパイラはその言語のパーサーになります。これは、研究室のネズミによる「言語セマンティクスの拡張」が意味するものではないことは知っていますが、かなり印象的だと思います。
DevSolar

回答:


12

Convergeには、非常に印象的なメタプログラミング機能があります。

単純なレベルでは、これはマクロに似た機能と見なすことができますが、コンパイル時に任意のコードを実行できるため、既存のほとんどのマクロ機能よりも強力です。これを使用して、コンパイラと対話し、ITree(別名抽象構文ツリー)として安全かつ簡単にコードを生成できます。

これは、参照的に透過的なマクロ定義を可能にするSchemeの衛生的なマクロからのステップアップです。

準リテラルなどのメカニズムにより、他の言語で構文解析ツリーを構築および分解できますが、自己修正ではなく、ドメイン固有言語(DSL)とのやり取りに使用されることが多くなっています。


Newspeakのリフレクションにより、例外をライブラリコードとして実装できます。

7.6例外処理

Newspeakはアクティベーションレコード(3.6)へのリフレクトアクセス(7.2)を提供するため、例外処理は純粋にライブラリの問題です。このプラットフォームは、Smalltalkと同様に、例外のスロー、キャッチ、および再開をサポートする標準ライブラリを提供します。


Perligata:Romanaは、まったく新しい構文を言語に適用する方法を示しています。

このペーパーでは、Perlプログラムをラテン語で記述できるようにするLingua :: Romana :: PerligataというPerlモジュールについて説明します。


セマンティクス的に重要ではないことは間違いありませんが、PyPyは、セマンティクスが高度に静的に解析可能なPythonのサブセットで指定されている言語のインタープリタージェネレーターであり、それを使用して、言語にサンクを追加するようなPythonの新しい言語構成を実験します。


Ometaも興味深いかもしれません。

この論文は、コンピューターサイエンスの実験に焦点を当てています。特に、実験をサポートするために特別に設計された新しいプログラミング言語と構造が、研究者とプログラマの仕事を大幅に簡素化できることを示します。

私は、非常に異なる2種類の実験に対処する作品を発表しています。最初の目的は、プログラミング言語の研究者が新しいプログラミング言語や既存の言語の拡張機能のプロトタイプを簡単に作成できるようにすることで、アイデアを実験するのを支援することです。もう1つは、プログラム自体がさまざまなアクションや可能性を試すことができるようにすることにより、プログラミングパラダイムとして実験を調査します。または可能な世界の推論。

Alex Warthの論文では、Ometaを使用してJavaScript + Ometaで大幅に新しいセマンティクス(世界を介したトランザクションセマンティクス)を定義する方法を示しています。


8

「理論的には実現可能ですか?*

LS

L

SL

実行時モデルが実装言語と大幅に異なる場合、新しい言語の実行はまだ遅い可能性があります。その場合、翻訳されたコードにインタープリターの一部が表示され、引き続き低速で実行されます。ただし、新しい言語が元の言語とほとんど同じで、わずかな調整がある場合は、部分評価を慎重に調整することで、ターゲットコードのインタープリタービットのほとんどを削除できる可能性があります。その後、新しい機能のみでパフォーマンスヒットが発生します。

実際、これはプログラミング言語の「仮想化」テクノロジーです。


6

歴史的に、Lispはメタプログラミング機能を導入した最初の主要なプログラミング言語でした。Lispのマクロシステムにより、プログラマは新しい制御構造、新しいデータテンプレートなどを定義できます。たとえば、Common Lispオブジェクトシステムは、オブジェクトやクラスについて何も知らないコア言語の上のマクロで完全に定義できます。マクロシステムでは、ドメイン固有の言語を定義することもできます。

Rubyは、反射率とメタプログラミングの能力など、Lispから多くのインスピレーションを得ました。多くの動的に型付けされた言語は、この点でLispからインスピレーションを受けています。(静的型付けは、多くの拡張機能が元の型システムに適合しないため、事態を複雑にします。)


4

回答/コメントにはまだ記載されていません:

調査:

要約:拡張可能言語とは、ユーザーが構文を変更または追加し、新しい構文形式をセマンティクスに関連付けることができるプログラミング言語です。これらの言語は何に適していますか?どのような種類の機能を追加するのが簡単ですか?真剣に考えられるほど強力ですか?この調査では、手続き型、オブジェクト指向、関数型、および汎用の拡張可能言語を検討する際に、こうした質問に答えようとします。主に、表現力(規則的、文脈自由)、関連する警告(不衛生、あいまいさ)、およびさまざまなメカニズムの使いやすさに関心があります。

そして

要約:新しい構文形式で言語を拡張する機能は強力なツールです。十分に柔軟なマクロシステムにより、プログラマーは共通の基盤から、問題領域専用に設計された言語に向けて構築できます。しかし、統合され、機能があり、同時に広く使用できるほどシンプルなマクロ機能は、これまでのLispファミリーに限定されていました。この論文では、Lispマクロシステムの優れたパワーと使いやすさを備えたJava Syntactic Extender(JSE)と呼ばれるマクロ機能を紹介しますが、Javaはより一般的な代数構文を備えた言語です。...


1
参照ごとに1つまたは2つの要約文を書いてください。純粋なリンクコレクションは、ほとんど「良い」答えではありません。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.