4

與C/Java相比,在許多情況下,如果沒有顯着的性能損失,是否可以設計類似Ruby或Clojure的東西?硬件設計是否起作用?有沒有可能設計一種動態語言而不會造成顯着的性能損失?

編輯:隨着顯著我的意思是按照量值的次序,而不是短短十procent

編輯:我懷疑delnan是我的意思動態語言正確的,所以我改變了標題

+1

「顯著」是一個主觀的術語,使得它不可能客觀地回答你的問題。 – meriton 2010-09-18 13:09:19

回答

8

性能取決於很多事情。當然,即使我們正在編譯它,語言的語義也必須被保留下來 - 你不能從Ruby中移除動態分派,它會以乾的方式加快速度,但它會完全打破世界上所有Ruby代碼的95%。但是,性能的大部分依賴於實施的智能程度。

我假設,「高級」是指「動態」? Haskell和OCaml是非常高級的,但它們是本地編譯的,在某些特定情況下可以勝過C#或Java,甚至C和C++ - 特別是在並行性發揮作用時。他們當然沒有將表現設計爲排名第一的目標。但編譯器編寫者,特別是那些專注於功能語言的編寫者,是一位非常聰明的人。如果您或我開始使用高級語言,即使我們使用了例如LLVM作爲本地編譯的後端,我們無法獲得任何接近此性能的地方。

讓動態語言快速運行更加困難 - 它們將許多決定(類型,類/對象的成員,...)延遲到運行時而不是編譯時,並且靜態代碼分析有時可能證明它不可行n和m,你仍然需要攜帶一個高級運行時,並且執行靜態語言的編譯器在編譯時可以完成的一些事情。即使是動態調度也可以通過更智能的虛擬機(Inline Cache任何人?)進行優化,但這需要很多工作。這不僅僅是一種小型的新語言可以做到的,也就是說。

另見Steve Yegge's Dynamic Languages Strike Back

當然,什麼是顯着的性能損失?比C讀取速度慢100倍,但是衆所周知,80%的執行時間花費在20%的代碼中= 80%的代碼不會對整個程序的percieved性能產生顯着的影響。對於剩下的20%,你總是可以用C或C++重寫它,並從動態語言中調用它。對於許多應用程序來說,這足夠了(對於某些應用程序,您甚至不需要優化)。對於其餘的......好吧,如果性能是至關重要的,那麼你應該用一種專門用於性能的語言寫出它。

+1

*感謝您編寫「C或C++」而不是「C/C++」。 – 2010-09-18 13:06:50

+0

我永遠無法理解的C/C++術語的仇恨,因爲我總是把它讀作「C或C++」,同爲我讀到「你可以用這樣的Tcl/Python的/ Ruby的動態語言」作爲一個OR聲明也。 – RHSeeger 2010-10-01 19:05:52

1

不要混淆用它運行的平臺進行語言設計。

例如,Java是一種高級語言。它運行在JVM上(就像上面提到的Clojure和JRuby-- Ruby的Java版本一樣)。 JVM將執行字節碼分析並優化代碼的運行方式(利用轉義分析,即時編譯等)。因此,該平臺對性能的影響很大程度上與語言本身無關(請參閱here瞭解有關Java性能和與C/C++比較的更多信息)

+0

我試圖更準確地陳述我的問題 – 2010-09-18 09:27:33

+0

-1,不回答問題。 – 2010-09-18 10:09:46

+1

我看到問題已經被修改,因爲我通過在條件中添加'Java'來回答它。無論如何,我認爲區分語言和平臺很重要。 – 2010-09-18 11:32:30

1

損失與什麼相比?如果你需要一個垃圾收集器或關閉,那麼你需要它們,而且你要付出代價。如果一種語言讓他們容易理解,那並不意味着當你不需要它們時你必須使用它們。

如果一種語言被解釋而不是被編譯,那會導致一個數量級的放緩。但是這樣的語言可能具有補償優勢,如易用性,平臺獨立性,而不必編譯。而且,您在其中編寫的程序可能無法運行足夠長的時間以避免速度成爲問題。

可能有語言實現,沒有充分的理由推出緩慢,但那些沒有被使用。

0

你可能想看看DARPA HPCS倡議想出。有3種編程語言被提出:Sun的Fortress,IBM的X10和Cray的教堂。後兩者仍在開發中。這些是否符合您的定義高級我不知道。

是的,硬件設計肯定是扮演一個角色。所有這三種語言的目標都是具有非常多處理器的超級計算機,並展示適合該領域的功能。

0

這當然是可能的。例如,Objective-C是一種動態類型的語言,其性能可與C++相媲美(儘管速度稍慢,一般而言,但仍大致相當)。

+0

您認爲使用Objective-C進行Web開發是一個好主意嗎? – 2010-09-18 16:42:01

+0

不是。它沒有任何好的網頁框架。 – mipadi 2010-09-18 18:29:33

相關問題