動的型付けと静的型付けについて読んでいると、静的に型付けされた言語はコンパイルされ、動的に型付けされた言語は解釈されるという仮定に反し続けます。私は一般的にこれが真実であることを知っていますが、私は例外に興味があります。
これらの例外の例をいくつか挙げるだけでなく、これらの言語がこのように機能することが決定された理由を説明してもらいたいと思います。
動的型付けと静的型付けについて読んでいると、静的に型付けされた言語はコンパイルされ、動的に型付けされた言語は解釈されるという仮定に反し続けます。私は一般的にこれが真実であることを知っていますが、私は例外に興味があります。
これらの例外の例をいくつか挙げるだけでなく、これらの言語がこのように機能することが決定された理由を説明してもらいたいと思います。
これがいくつかの興味深いシステムのリストです。網羅的ではありません!
Gambit Schemeコンパイラ、Chez Scheme、WillClingerのLarcenySchemeコンパイラ、Bigloo Schemeコンパイラ、そしておそらく他の多くのコンパイラ。
なんで?
多くの人がSchemeが本当に好きです。データとしてのプログラム、優れたマクロシステム、35年間の開発、大きなコミュニティ。しかし、彼らはパフォーマンスを求めています。したがって、多くの優れたネイティブコードコンパイラ—Chez Schemeは、成功した商用製品ですらあります(解釈されたバイトコードは無料です。ネイティブコードは有料です)。
Lua用のLuaJITジャストインタイムコンパイラ。
なんで?
それを示すために行うことができます。そして、人々はLuaプログラムで3倍のスピードアップを好むようになりました。Luaは、パフォーマンスが重要な多くのゲームに参加しているだけでなく、他の製品にも忍び寄っています。Adobe Lightroomのコードの70%はLuaです。
iconc
Icon -to-Cコンパイラ。
なんで?
それを使用した50人はIconを愛していました。まったく珍しい評価モデルであり、これまでに設計された中で最も革新的な(そして私の意見では最高の)文字列処理システムです。しかし、その評価モデルは、特に1980年代後半のコンピューターでは、非常に高価でした。IconをCにコンパイルすることにより、Icon Projectは、大きなIconプログラムをより短い時間で実行できるようにしました。
結論:人々は最初に動的に型付けされた言語への愛着を開発し、おそらく重要なコードベースを開発します。最終的に、コミュニティはネイティブコードコンパイラを吐き出し、パフォーマンスを向上させ、より大きな問題を解決できるようにします。
このカテゴリはあまり一般的ではありませんが...
客観的なCaml。MLの方言、言語設計における多くの革新的な実験のための手段。
なんで?
非常にポータブルなシステムと非常に高速なコンパイル時間。人々は両方の特性が好きなので、新しい言語デザインのアイデアは広く普及しています。
モスクワML。モジュールシステムのいくつかの追加機能を備えた標準ML。
なんで?
ポータブルで高速なコンパイル時間、インタラクティブな読み取り/評価/印刷ループを簡単に作成できます。人気の教育コンパイラになりました。
C-Terp。古い製品だと思いますが、おそらくGimpelSoftwareからのものだと思います。セイバーC—これ以上買えないと思う商品。
なんで?
デバッグ。特に、MS-DOSでの1980年代のハードウェアでのデバッグ。非常に少ないリソースで、非常に限られたハードウェアでCコードをデバッグするのに非常に役立ちます(8ビットバスを備えた4.77MHzプロセッサ、640KのRAMが完全にロードされていると考えてください)。ネイティブコンパイルされたコード用の優れたビジュアルデバッガーを入手することはほぼ不可能ですが、インタープリターを使用すると、かなり簡単です。
UCSD Pascal —「Pコード」を一般的な言葉にしたシステム。
なんで?
教師はNiklausWirthの言語設計が好きで、コンパイラは非常に小さなマシンで実行できました。WirthのすっきりとしたデザインとUCSDPシステムは無敵の組み合わせであり、Pascalは1970年代の標準的な教育言語でした。若い人たちは、1970年代には、最初のコースでどの言語を教えるかについての議論がなかったことを理解するのは難しいかもしれません。今日、私はC、C ++、Haskell、Java、ML、Schemeを使用するプログラムを知っています。1970年代には、それは常にPascalであり、UCSDPシステムは大きな理由でした。
ご参考までに、Pはポータブルの略です。
要約:静的に型付けされた言語を解釈することは、実装をすべての人の手にすばやく届けるための優れた方法です。(青銅器時代のハードウェアでのデバッグにも利点がありました。)
Objective-Cはコンパイルされ、動的型付けをサポートします(確かに[target doSomething]
構文を介してメソッドを呼び出す場合)。つまり、任意のメッセージをターゲットに送信し(通常の言語構文を使用し、リフレクションAPIに対してプログラミングせずに)、コンパイル時に処理されない可能性があるという警告のみを受け取り、ターゲットが処理されない場合は実行時にのみ例外を受け取ることができます。そのセレクターに応答しません(これはメソッド署名のようなものです)。また、任意のオブジェクト(id
コードがそれ以上のことを知らないか、気にしない場合はすべて静的タイプにすることができます)にrespondsToSelector:
、その機能をプローブするかどうかを尋ねることができます。
Java(静的に型付けされた言語)は、古いバージョンのJVMで解釈されたJVMバイトコードにコンパイルされますが、現在はJust In Time(JIT)コンパイルを使用しているため、マシンコードは実行時に生成されます。また、MLとその方言は解釈できると思います。また、MLは静的に型指定されています。
Pythonは、コンパイラーを備えた動的言語です。
たとえば、このSOの質問を参照してください。Python - why compile?
一般に、コンパイルするとプログラムの実行速度が大幅に向上します。
Actionscriptには動的型付けがあり、バイトコードにコンパイルされます。
また、iPhoneでFlashアプリをリリースしたい場合は、ネイティブのマシンコードにコンパイルすることもできます。