どの言語が動的に型付けおよびコンパイルされますか (そしてどの言語が静的に型付けおよび解釈されますか)?

StackOverflow https://stackoverflow.com/questions/2329460

質問

動的型付けと静的型付けについて読んでいると、静的に型付けされた言語はコンパイルされ、動的に型付けされた言語は解釈されるという前提に何度も遭遇します。一般的にはこれが真実であることはわかっていますが、私は例外に興味があります。

誰かにこれらの例外の例をいくつか挙げるだけでなく、なぜこれらの言語がこのように機能することが決定されたのかを説明してもらいたいと思っています。

役に立ちましたか?

解決

ここでは、いくつかの興味深いシステムのリストを示します。それは ない 網羅的!

動的に型付けされコンパイルされる

  1. ガンビット スキーム コンパイラー、 シェ・スキーム, 、Will Clinger の Larceny Scheme コンパイラ、 ビッグルー Scheme コンパイラー、およびおそらく他の多くのコンパイラー。

    なぜ?

    Scheme が好きな人はたくさんいます。データとしてのプログラム、優れたマクロ システム、35 年間の開発、大きなコミュニティ。しかし、彼らはパフォーマンスを求めています。したがって、多くの優れたネイティブ コード コンパイラー、Chez Scheme は商業製品として成功しています (解釈されるバイトコードは無料です。ネイティブ コードは料金を支払います)。

  2. LuaJIT ジャストインタイム コンパイラ ルア.

    なぜ?

    それができることを示すために。そして、人々はこうし始めました。 のように Lua プログラムの速度が 3 倍向上しました。Lua はパフォーマンスが重要な多くのゲームに採用されており、さらに他の製品にも浸透しつつあります。Adobe Lightroom のコードの 70% は Lua です。

  3. iconc アイコン-to-C コンパイラ。

    なぜ?

    利用した50人は 愛された アイコン。まったく珍しい評価モデルで、これまでに設計された中で最も革新的な (私の意見では最高の) 文字列処理システムです。しかし、その評価モデルは、特に 1980 年代後半のコンピューターでは非常に高価でした。Icon プロジェクトは、Icon を C にコンパイルすることにより、大きな Icon プログラムをより少ない時間で実行できるようにしました。

結論:人々はまず、動的に型付けされた言語、そしておそらく重要なコード ベースに愛着を抱きます。最終的に、コミュニティはネイティブ コード コンパイラーを吐き出し、パフォーマンスを向上させ、より大きな問題を解決できるようにします。

静的に型付けおよび解釈される

このカテゴリーはあまり一般的ではありませんが...

  1. 対物レンズ. 。MLの方言、車両用 たくさん 言語設計における革新的な実験の数々。

    なぜ?

    非常に移植性の高いシステムであり、コンパイル時間は非常に高速です。人々は両方の特性を好むため、新しい言語設計のアイデアは広く普及します。

  2. モスクワML.モジュール システムのいくつかの追加機能を備えた標準 ML。

    なぜ?

    移植可能でコンパイル時間が短く、対話型の読み取り/評価/印刷ループを簡単に作成できます。人気の教育コンパイラになりました。

  3. C-テルプ。おそらく Gimpel Software 製の古い製品だと思います。セイバーC――もう買えないと思う製品。

    なぜ?

    デバッグ中。特に、MS-DOS での 1980 年代のハードウェアのデバッグ。リソースが非常に少ない場合、非常に限られたハードウェア上で C コードをデバッグするための非常に優れた支援が得られます (次のように考えてください)。8 ビット バスを備えた 4.77MHz プロセッサ、640K の RAM がフルロードされています)。ネイティブ コンパイル コード用の優れたビジュアル デバッガを入手するのはほぼ不可能ですが、インタプリタを使用すればかなり簡単です。

  4. UCSD Pascal - 「P コード」を一般的な言葉にしたシステム。

    なぜ?

    教師たちは Niklaus Wirth の言語設計を気に入っており、コンパイラーは次の言語で実行できました。 とても 小さな機械。Wirth のクリーンなデザインと UCSD P システムは無敵の組み合わせを実現し、Pascal は 1970年代の標準的な教育言語。若い人たちは、1970 年代にこんなことがあったことを理解するのは難しいかもしれません。 いいえ 最初のコースでどの言語を教えるかについて議論します。現在、私は C、C++、Haskell、Java、ML、および Scheme を使用するプログラムについて知っています。1970 年代には常に Pascal が使用されており、UCSD P システムが大きな理由でした。

    ご参考までに、P は ポータブル.

まとめ:静的に型付けされた言語を解釈することは、実装を誰でもすぐに手に入れるための優れた方法です。(青銅器時代のハードウェアでのデバッグにも利点がありました。)

他のヒント

のObjective-Cはコンパイルされ、動的型付け([target doSomething]構文を経由して、確かに呼び出すメソッド)をサポートしています。それは、あなたが(リフレクションAPIに対してプログラミングすることなく、通常の言語の構文を使用して)ターゲットに任意のメッセージを送信することができ、あるそれは扱われない可能性がありますことを、コンパイル時に警告のみを受信し、ターゲットのdoesn場合にのみ、実行時に例外が発生します(メソッドのシグネチャと同様である)、そのセレクタに「Tが応答。そしてあなたはそれがその機能を調べるためにidかどうか(あなたのコードは、任意のより良い知らないか、気にしない場合は、すべての静的な型respondsToSelector:のものとすることができる)任意のオブジェクトを求めることができます。

それが今のマシンコードが実行時に生成されることを意味、ジャスト・タイム(JIT)コンパイルを使用し、一方、

のJava(静的型付け言語)は、JVMの古いバージョンに解釈されたJVMバイトコードにコンパイルされます。私はまた、MLとその方言を解釈することができ、およびMLは間違いなく静的に型付けされると信じています。

のActionScriptバイトコードへの動的な型付けとコンパイルされています。

そして、あなたはiPhone上のFlashアプリをリリースしたい場合はそれもネイティブマシンコードに右のダウンをコンパイルします。

Pythonはコンパイラを持っている動的な言語です。

を参照してください、このSOの質問をhref="https://stackoverflow.com/questions/471191/python-why-compile"> Python - why compile?を、例えば

一般的には、コンパイルするプログラムがはるかに高速に実行できます。

scroll top