Haskellは型を消去しますか?もしそうなら、これはJavaで発生する型消去とどのように類似/非類似ですか?
2 に答える
警告:経験+推論。TheTruthについては両方のコンパイラで作業している人に相談してください。
型チェックはコンパイル時に行われ、型システムのいくつかの複雑な機能は、はるかに単純な言語構造に縮小されるという意味で、そうですが、Javaとはかなり異なる方法です。
型シグネチャは実行時のオーバーヘッドを作成しません。Haskellコンパイラはプログラム変換に優れており(実行順序は多くの場合プログラマーによって指定されていないため、より余裕があります)、適切な定義を自動的にインライン化し、haskell-polymorhpic(= java-generic)関数を特定のタイプに特化しますそれが助けになるなら、それが適切であると思うように、等。これはJava型消去に似ていますが、より多くの側面があります。
Haskellはゼロからタイプセーフになるように設計されているため、本質的に、タイプの安全性を確保するためにHaskellに型キャストは必要ありません。ポリモーフィック(ジェネリック)関数は、ポインター型やボックス化されていない整数に関係なく、あらゆるデータ型で真に機能するため、すべてをオブジェクトに変換することはせず、キャストバックもしません。トリックなしで。したがって、Javaとは異なり、キャストはポリモーフィック(ジェネリック)コードをコンパイルする機能ではありません。Haskellの人々は、型キャストをしているのなら、とにかく型安全性に別れを告げたと感じる傾向があります。
コンパイル時にコードの静的な型の正確さを保証することで実行時のオーバーヘッドを回避する方法の素敵な例としてnewtype
、既存の型の型に安全なラッパーであるHaskellの構造があり、完全にコンパイルされています-すべての構築と破棄は単純です実行時には発生しません。型システムは、コンパイル時に正しく使用されることを保証します。(型チェックされた)アクセサー関数を使用する場合を除いて、実行時に取得することはできません。
ポリモーフィック(ジェネリック)関数には、ポリモーフィックオーバーヘッドはありません。Haskellでオーバーロードされた関数(Java-interface-instanceメソッド)には、Javaプログラマーへの遅延バインディングに使用される関数の暗黙の辞書があるという意味でデータのオーバーヘッドがありますが、実際には、コンパイル時に決定されます。
要約:はい、Javaよりもさらにそうです、そしていいえ、とにかく消去するために実行時にそこにいたことはありませんでした。
CとPascalには型消去があります。Javaを使用すると、実行時にクラスを検査できます。動的にロードされたクラスでも検査できます。
Haskellが行うことは、JavaよりもPascalにはるかに近いものです。