機械語にコンパイルできるにもかかわらず、使用可能な対話型インタプリタを備えたプログラミング言語はありますか?
16 に答える
コンパイルと「解釈」は本質的に実装の問題であり、言語自体ではありません。たとえば、MRI Ruby 1.8は解釈されますが、MacRubyはネイティブマシンコードにコンパイルされます。どちらにもインタラクティブREPLが含まれています。私が知っているすべての言語で、少なくとも1つのマシンコードコンパイラと少なくとも1つのREPLがあります。
- ルビー
- Python
- ほとんどすべてのLisp(Lispはこの技術を開拓した言語、AFAIKでした)
- OCaml
- Haskell
- 前方へ
コンパイルをマシンコードだけでなくバイトコードにも数える場合、一般的なバイトコードコンパイル言語の大部分に当てはまります。
- Java
- Scala
- Groovy
- Erlang
- C#
- F#
- Smalltalk
Haskell、GHCiと呼ばれるインタラクティブな「シェル」を備えたGlasgowHaskellコンパイラを使用。
Lispの多くのフレーバーは、Clojureを含む両方のオプションを提供します。
ocamlとscala(〜= java)の2つが頭に浮かびますが、もっとたくさんあるはずです。
そして、ここにあなたの家を焼き払うためのもう一つがあります:
x86アセンブリ
うん、これにも通訳がいる。
この時点で、あなたは本当にエミュレーターの世界にいますが、それはあなたが述べた要件を満たしています。
誰かが実用的なインタプリタを作成していないコンパイル型言語に名前を付ける方が簡単かどうか疑問に思います。:-)
Luaには、ワンライナーと実験のためのインタラクティブモードがあります。通常、VMを実行するためにバイトコードにコンパイルされます。LuaJITは、Lua VMの独立した実装であり、32ビットx86へのジャストインタイムコンパイルも実行します。64ビットのサポートが進行中であり、ARMのサポートが頻繁に要求されます。
バイトコードへのコンパイルは、多くの場合、純粋なインタプリタと純粋なコンパイラの間の妥当な妥協点です。VMは言語のニーズに合わせて調整でき、JIT技術は、実行時にVMコードを分析し、頻繁に実行されるコードパスと内部ループに集中できます。
他の人が言っているように、OCaml。
マネージコード(.NET CLI)がマシンコードに十分近い場合は、F#も候補になります。要件を満たす他の.NET/Mono言語もおそらくあります。
多くの言語が、相互作用してマシンコードにコンパイルする実装を提供していますが、両方を同時に実行することはめったにありません。 ニュージャージーの標準MLは、インタラクティブループはあるが、バイトコードはないものです。メモリ内のマシンコードにコンパイルしてから分岐するだけです。
正確にはマシンコードではありませんが、JavaをコンパイルしてBeanShellを介して使用することもできます。
私はインタプリタでRubyを使用しましたが、ここにコンパイラがあるようです。
アイコンには以前はコンパイラがありましたが、メンテナンスの内外にあります。それでも動作する可能性があります。
PythonはWindows実行可能ファイルにコンパイルできます。
C#はSnippetCompilerを使用してコンパイルできますが、これはインタラクティブなインタープリターとして機能しますか?
あなたの質問は少し曖昧です。Javaでさえそれに適合します:
インタラクティブインタプリタとは、ランタイムでインタラクティブに作業できるシェルのような環境を意味します。
Javaにはこれがあります。たとえば、Eclipseの「スクラップブックページ」では、Java式を入力して、すぐに評価することができます。もちろん、Javaはコンパイル言語でもあります(通常はバイトコードにコンパイルされますが、マシンコードを出力するさまざまなコンパイラがあります)。
そう何を探してるんですか?多分あなたはあなたの問題や興味を説明することができます。
mono / .netを少し使ってみたところ、ランダムなGCの一時停止が不快であることがわかりました(少なくとも私の無愛想な古いラップトップでは)。私はgambit-cを使用して、Cにコンパイルできるスキームの実装を検討しましたが、ドキュメントがいくらか制限されていて、パッケージのインストールと使用が非常に簡単ではなかったため、操作が難しいようでした。
私は通常、Pythonなどのインタプリタ言語をC / C ++にバインドすることに固執しますが、これはより苦痛ですが、少なくとも私は自分が何を求めているのかを知っています。