簡體   English   中英

如果將它們都轉換為exe,Python / Java程序的運行速度是否與C一樣快?

[英]Does Python/Java program work as fast as C if I convert both of them into exe?

我想了解解釋語言和編譯語言之間的區別。 可以在網上找到很多解釋,我了解所有這些解釋。

但是問題是,軟件作為最終產品以exe(在Windows上)發行。

因此,如果我用Python / Java編寫程序並將其編譯為exe,是否可以像我用C / C ++編寫和編譯一樣快?

不,不會。 它與文件格式無關,而是語言編譯為此的基本構件的復雜性。

實際上,大多數語言都是經過編譯的。 Java是python,在解釋器內部也是如此。 但是,目標二進制代碼的構造塊執行的復雜程度有所不同。

對於C ++,所有概念都直接映射到CPU理解的底層概念。 缺點是諸如競賽條件之類的事情是不確定的行為。 該代碼根本沒有定義在各種極端情況下應該發生的情況,程序員應負責處理這些情況。 程序員也有責任管理資源,因為沒有收集器等。

對於Java,概念被映射到虛擬機的指令。 這些可能會被解釋(涉及一些開銷解碼),或者可能會在即時(如標准台式機VM所做的)或提前(如當前的Android運行時)的機器指令中進行進一步編譯。確實如此),但每個執行起來仍然會更復雜。 分配將具有鎖前綴,以確保它們在競爭條件下不會生成無效值,內存中運行的垃圾收集器在尋找有效的指針並在周圍復制東西,對象有很多額外的開銷,並且很多事情進行檢查,這樣可以很好,並在錯誤上引發異常,而不是像C ++那樣崩潰。

而且python更加復雜。 由於該語言提供的保證,它實際上根本不會並行運行python代碼(阻止系統調用除外),還有一個收集器,這一次它會更新每個操作中的引用計數,並且對象有很多開銷,因為大多數成員訪問實際上是哈希表查找,這與帶有偏移量的指針的C ++簡單加載相反。 甚至還有更多的檢查功能。 數量級速度差。 實際上,Java和Python之間的差異比C ++和Java之間的差異大得多。

由CPU直接解釋為機器代碼的編譯確實有所幫助。 但是高級語言會增加開銷,這是由於它們的語義而不是由於它們被解釋的事實所致。

就是說, @ linuxuser是正確的,轉換Java或Python代碼實際上不會將其轉換為機器代碼,而只是將解釋器和代碼捆綁在一個程序包中運行,因此沒有收益,僅僅是因為實際上沒有區別。

沒有

編譯的C程序快速運行的原因是因為C代碼被編譯成匯編語言,該語言是專門為您的CPU設計的語言。 Java和Python的運行速度較慢,因為Java需要在JVM中運行,而Python需要由Python解釋器運行,這會降低速度。

有可用的工具可以將Python腳本和Java程序轉換為Windows可執行文件,但是這些可執行文件不會從Java和Python程序中創建匯編語言。 Java代碼必須在JVM上運行,而Python代碼必須通過Python解釋器運行。 您無法“編譯” Python或Java程序,也無法像使用C一樣獲得匯編語言。(您實際上可以將Java編譯為本機代碼,但是我很確定您在此問題中所指的工具不是將Java轉換為本地匯編代碼)

這些將Python代碼和Java代碼轉換為可執行文件的工具實際上只是將Python解釋器捆綁到可執行文件中,然后使用該工具來運行您的Python代碼,或者自動下載JVM,然后使用它來運行您的Java代碼。

這是Jar to exe程序的示例 如您所見,它只是創建一個exe文件,該文件會自動下載最新的JVM,然后使用下載的JVM運行您的Java代碼。

當沒有可用的VM時,包裝器可以自動下載並安裝合適的JVM,或者僅顯示消息或將用戶重定向到網站。

這是將Python腳本轉換為exe的工具。 如您所見,它只是將Python解釋器與您的代碼捆綁在一起,並使用捆綁的Python解釋器運行您的代碼。 向下滾動到“所有那些文件是什么?” 部分。

實際上沒有

C / C ++語言被編寫為更好的匯編程序。 他們的基本操作經過精心設計,非常適合1970年的處理器。

隨后,處理器被驅使快速運行,因此圍繞指令設計它們可以使C / C ++更快。

與語言和語言的語義的緊密聯系為C / C ++社區提供了先機。

C / C ++優勢的一個示例是如何在堆棧上創建簡單的類型和對象。 該堆棧被實現為處理器堆棧,並且對象僅在其調用堆棧為當前時才有效。

Java / python在免費存儲區上實現了所有對象,這些對象具有lambda和closures,它們將對象的生命期擴展到了創建它們的調用堆棧之外。 免費商店是創建對象的一種更為昂貴的方式,並且是該語言所遭受的懲罰之一。

JIT編譯java / python字節碼可以彌補一些差異,並且(理論上)可以擊敗C / C ++代碼的性能。

編譯JIT時,將根據包裝盒上的處理器來編譯語言(其功能可能比編寫代碼時更好),並且知道與代碼一起使用的確切數據。 這意味着Jit編譯器已調整為代碼的確切用法。 而不是編譯器的最佳猜測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM