5

言語設計者 (または単に知識のある人) がいる場合は、インタープリター言語用の標準ライブラリを作成する方法論に興味があります。具体的には、最善のアプローチと思われるものは何ですか? インタープリター言語で標準関数/メソッドを定義するか、インタープリターが記述されているコンパイル済み言語でそれらの呼び出しの処理を実行しますか?

これについて考えさせられたのは、Python の stripslashes() のような関数に関する SO の質問でした。私が最初に考えたのは、「独自の関数を定義して、必要なときに呼び出すだけでよいのでは」ということでした。拡張機能を作成し、コンパイルされた言語をインタープリターの背後で活用しますか?

4

4 に答える 4

6

「解釈された」言語と「コンパイルされた」言語の境界線は、最近では非常にあいまいです。たとえば、Python がソース コードを認識したときに最初に行うことは、Java がクラス ファイルをコンパイルするときに行うことと本質的に同じで、ソース コードをバイトコード表現にコンパイルすることです。これは *.pyc ファイルに含まれるものです。次に、Python ランタイムは元のソースを参照せずにバイトコードを実行します。従来、純粋に解釈された言語は、プログラムの実行時にソース コードを継続的に参照していました。

言語を構築するときは、より高いレベルの機能を実装できる強固な基盤を構築することをお勧めします。堅牢で高速な文字列処理システムがあれば、言語設計者は基本ランタイムの外側で stripslashes() のようなものを実装できます (実装する必要があります)。これは、少なくともいくつかの理由で行われます。

  • 言語設計者は、言語がその種のタスクを処理するのに十分柔軟であることを示すことができます。
  • 言語設計者は実際にその言語で実際のコードを作成します。これにはテストがあり、したがって基盤がしっかりしていることを示しています。
  • 他の人は、言語コアを構築したり理解したりする必要なく、より高いレベルの機能をより簡単に読んだり、借りたり、変更したりすることができます。

Python のような言語がバイトコードにコンパイルされて実行されるからといって、それが遅いというわけではありません。パフォーマンスをさらに向上させるために、Java や .NET が既に行っていることに従って、Python 用の Just-In-Time (JIT) コンパイラを作成できない理由はありません。実際、IronPython は Python を .NET バイトコードに直接コンパイルし、JIT を含む .NET システムを使用して実行します。

あなたの質問に直接答えるために、言語設計者がランタイムの背後にある言語 (たとえば、Python の場合は C) で関数を実装するのは、その関数のパフォーマンスを最大化するときだけです。これが、正規表現パーサーなどのモジュールがネイティブの Python ではなく C で記述されている理由です。一方、getopt.py のようなモジュールはすべて純粋な Python で実装され、対応する C ライブラリを使用するメリットがないためです。

于 2008-08-17T12:39:58.860 に答える
3

JVM や CLR などのプラットフォーム上で従来「解釈される」と見なされてきた言語を再実装し、相互運用性のために「ネイティブ」コードに簡単にアクセスできるようにする傾向も強まっています。したがって、Jython と JRuby からは Java コードに簡単にアクセスでき、IronPython と IronRuby からは .NET コードに簡単にアクセスできます。

このような場合、「コンパイルされた言語をインタープリターの背後で活用する」機能は、新しい実装の主な動機として説明できます。

于 2008-08-17T13:33:17.053 に答える
2

www.lua.orgの「論文」セクションを参照してください。

特にLua 5.0の実装

Lua は、基礎となる (ANSI C) コードですべての標準関数を定義します。これは主にパフォーマンス上の理由によるものだと思います。最近、つまり、'string.*' 関数は純粋な Lua で代替実装されました。これは、Lua が .NET または Java ランタイム (C コードを使用できない場合) の上で実行されるサブプロジェクトにとって重要であることが証明される可能性があります。

于 2008-09-17T19:44:41.070 に答える
1

ANSI C 標準ライブラリやC++ のSTLなど、コンパイルされたコード ベースに移植可能な API を使用している限り、これらの関数を利用することで車輪を再発明する必要がなくなり、より小さくて高速なインタープリターが提供される可能性があります。Luaはこのアプローチを採用しており、他の多くの製品と比較して、間違いなく小さくて高速です。

于 2008-08-17T13:41:11.327 に答える