質問

C/Java と比較して、多くの状況でパフォーマンスを大幅に低下させることなく、Ruby や Clojure のようなものを設計することは可能でしょうか?ハードウェア設計は役割を果たしますか?

編集:重要とは、単なる 10 パーセントではなく、桁違いのことを意味します

編集:デルナンが動的言語を意味するのは正しいと思うので、タイトルを変更しました

役に立ちましたか?

解決

パフォーマンスは多くのことに依存します。もちろん、言語のセマンティクスはコンパイルしていても保存する必要があります - Rubyから動的なディスパッチを削除することはできません。それは物事を干渉してスピードアップしますが、世界のすべてのRubyコードの95%を完全に壊します。しかし、それでも、パフォーマンスの多くは、実装がどれほど賢いかに依存しています。

「ハイレベル」とは、「ダイナミック」を意味すると思いますか? HaskellとOCAMLは非常に高レベルですが、ネイティブにコンパイルされており、一部のコーナーケースではC#またはJava、さらにはCとC ++を上回ることができます - 特に並列処理が作用する場合。そして、彼らは確かに#1ゴールとしてパフォーマンスで設計されていませんでした。しかし、コンパイラライター、特に焦点を絞った言語に焦点を当てた作家は、非常に賢い人々です。あなたまたは私が高レベルの言語を始めた場合、たとえLLVMをネイティブコンパイルのバックエンドとして使用したとしても、このパフォーマンスの近くには行きません。

ダイナミック言語を高速に実行するのは難しいです - 彼らはコンパイルの代わりに多くの決定(タイプ、クラス/オブジェクトのメンバー、...)をランタイムに遅らせますが、静的コード分析は、線NとMでそれが不可能であることを証明することがありますが、それでも高度なランタイムを持ち歩く必要があり、静的言語のコンパイラがCompiletimeでできることをかなり多く行う必要があります。ダイナミックディスパッチでさえ、よりスマートなVMで最適化できます(インラインキャッシュ 誰でも?)、しかしそれはたくさんの仕事です。つまり、小さな新しい純粋な言語ができる以上のことです。

また、参照してください Steve Yeggeのダイナミックな言語は反撃します.

そしてもちろん、重大なパフォーマンスの損失とは何ですか? Cよりも100倍遅いですが、私たち全員が知っているように、実行時間の80%がコードの20%= 80%で費やされています。残りの20%については、いつでもCまたはC ++で書き換えて、動的言語から呼び出すことができます。多くのアプリケーションでは、これで十分です(一部の場合は、最適化する必要さえありません)。残りの場合...パフォーマンスがそれほど重要である場合は、パフォーマンスのために設計された言語でおそらくそれを書く必要があります。

他のヒント

言語設計とそれが実行されるプラットフォームを混同しないでください。

たとえば、Java は高級言語です。これは JVM 上で実行されます (上記の Clojure や、Ruby の Java バージョンである JRuby と同様)。JVM はバイトコード分析を実行し、コードの実行方法を最適化します (エスケープ分析、ジャストインタイム コンパイルなどを利用して)。したがって、プラットフォームは言語自体からはほとんど独立してパフォーマンスに影響を与えます (「 ここ Java のパフォーマンスと C/C++ との比較の詳細については、こちらをご覧ください)

何と比べて損?ガベージコレクターやクロージャが必要な場合は必要ですが、それに関係なく料金を支払うことになります。言語によって簡単に理解できるとしても、必要のないときに言語を使用する必要があるという意味ではありません。

言語がコンパイルされずに解釈されると、桁違いの速度低下が発生します。しかし、そのような言語には、使いやすさ、プラットフォームに依存しないこと、コンパイルが不要であることなど、それを補う利点がある可能性があります。また、そこに作成したプログラムは、速度が問題になるほど長く実行されない可能性があります。

正当な理由もなく速度を低下させる言語実装が存在する可能性がありますが、それらを使用する必要はありません。

DARPAを見たいと思うかもしれません HPCS イニシアチブが思いつきました。 Sun's Fortress、IBMのX10、Cray's Chapelの3つのプログラミング言語が提案されていました。後者の2つはまだ開発中です。これらのいずれかがあなたの定義を満たしているかどうか 高いレベル 知らない。

そして、はい、ハードウェアのデザインは確かに役割を果たします。これらの3つの言語はすべて、非常に多くのプロセッサを備えたスーパーコンピューターを対象としており、そのドメインに適した機能を示しています。

確かに可能です。たとえば、Objective-Cは動的に型の言語で、C ++に匹敵するパフォーマンスを備えています(ただし、一般的に言えば少し遅くなりますが、それでもほぼ同等です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top