成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么動態類型語言相對比較慢?

開發 開發工具
靜態類型語言中,在聲明變量時已經指定了數據類型和表示方法。動態類型語言是在運行期間檢查數據的類型,不得不保持描述變量值的實際類型標記,程序在每次操作變量時,需要執行數據依賴分支。

靜態類型語言中,在聲明變量時已經指定了數據類型和表示方法。動態類型語言是在運行期間檢查數據的類型,不得不保持描述變量值的實際類型標記,程序在每次操作變量時,需要執行數據依賴分支。

 

間接分支(Indirect branch)數據局部性(data locality)對于運行時的性能是致命的。

 

這就是動態語言的JIT編譯器基準測試要強調near-C的內循環速度,以及避免大的數據結構和數據處理問題的原因。

 

我也希望像Python這樣的動態類型語言可以變快。我試過用Python來進行傳統的服務器編程——“系統語言”領域——但是效果真的不好,我現在考慮用Java重寫一個服務器。

 

因此,我花時間思考如何真正靜態地編譯Python。畢竟,那是我夢寐以求的編程語言!但當我思考如何將動態類型代碼與靜態編譯Python結合起來時,我遇到了數據變慢的問題:

 

在動態語言中,通常所有數組中的元素(或其他數據結構)類型各不相同,所以有不同的表示值。因此,這些值都必須被單獨存放為堆,而不是順序地存為數組。這意味著如果對不相鄰的內存執行數據依賴分支,則對緩存有更高的要求。

 

也有一些聰明的技巧,使用變量中的特殊bit,將一些原生類型(像整型)打包成一個類型,類似于指針,但這要求寄存器在操作過程中進行跟蹤,會增加開銷。

 

還有一些方法,比如使用JIT編譯熱路徑(hot path)時,如果你直接插入沒有標類型的值,而不是在堆里分別標記類型, 那么與JIT編譯過的代碼的互操作性會降低,如果其他代碼改變了數組中的一個值的類型,就會出現非常嚴重的后果。

 

我一直在思考,在Python語言中,什么是靜態的,什么不是。通過SSTA(統計靜態分析)和逃逸分析可以判斷,大量正常的程序是靜態的。Paul Biggar給了我信心證實我的猜測是正確的,我的Python代碼90%都是靜態的。

 

有人會問,那另外的10%呢?通常情況下,我可以讓所有的都是靜態的,或者想象它被參數類型的限制范圍特殊化了。除了Python語言的標準模式,其他模式都由Web服務器分配給基于HTTP方法(如果收到GET請求就稱為“get”方法)的Web處理器,這也需要程序員依照switch語句(如elifs的長鏈)來進行修改。

 

Robert Harper對“從單一類型靜態語言方面,動態語言是如何實現的”這個問題作出了很好的解釋,下面這句話是我希望他能進一步進行解釋的:
 

引用

 我深知“編譯器可以優化它”,至少在某些情況下。

 

我確信他說的“某些情況”是指遇到non-escaping的情況,因為和后面的執行代碼進行交互時,你應該要能夠確定escape的類型。

 

一些動態調用是無污染的——編譯器可以從代碼檢查中發現一些變量(或方法)是動態的,但動態的代碼不表示其他變量也是動態的,因為不同類型的變量、方法、成員的存在或缺失都被限制成了可識別的類型(或null)。

 

但通常編譯器是無法從代碼檢查中發現這些情況的,如果無法追蹤到執行的情況,就無法知道代碼如何依賴以及如何改變其他靜態變量的值。因此,工作中斷,所有變量再次變為動態的。

 

我一直在努力尋找把Monkey Patch(不改變初始源代碼來擴展和修改動態語言運行代碼的方法)、Set(屬性或索引器元素賦值的“訪問器”方法)、SetAttr(SetAttr 語句可以為一個文件設置屬性信息)等解決辦法移植到我虛構的Python編譯器里,因為類型標記嚴重地降低了運行性能。

 

快速的數據結構對于內存訪問模式和緩存位置是非常重要的,還可以減少分支和對這些分支的標記工作。

 

Jonathan Shapiro的文章Programming Language Challenges in Systems Codes非常棒,我很贊同文中的觀點。

 

英文原文:Why Dynamic Programming Languages Are Slow

原文鏈接:http://www.iteye.com/news/24615

【編輯推薦】

  1. Go語言寫Web應用程序
  2. 谷歌發布Go編程語言***候選版
  3. 新讀圖時代:編程語言的演化過程
  4. 回顧過去一年中編程語言領域的起起落落
  5. 提交中的罵聲:哪種編程語言最遭罵?
責任編輯:林師授 來源: ITEYE
相關推薦

2014-12-23 09:34:47

動態語言

2011-03-31 11:24:14

數據搜索本文字段

2023-01-28 11:56:33

Linux命令gunzip

2023-04-26 10:21:04

2017-04-26 16:03:20

2021-10-11 13:25:42

語言Go類型

2010-02-02 16:22:37

Python動態類型語

2020-04-07 16:12:56

Go編程語言開發

2017-09-13 00:07:05

Python編程語言動態語言

2017-04-05 18:10:05

R語言開發Ross

2020-09-04 15:34:07

C編程語言開發

2012-06-12 09:47:17

C語言

2019-07-05 13:42:33

Python編程語言JavaScript

2021-06-24 07:40:55

比特幣加密貨幣區塊鏈

2024-03-25 07:30:03

MySQL數據庫SQL日志

2015-04-08 10:46:11

2014-04-09 10:08:06

FacebookHack

2024-01-02 10:38:22

Go語言數組

2025-06-26 02:29:00

C語言void*機制

2010-11-03 09:22:00

C語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 福利视频一区二区 | 粉嫩av久久一区二区三区 | 毛片网站免费观看 | 99在线精品视频 | 亚洲午夜精品一区二区三区他趣 | 成人午夜激情 | 日韩一区二区三区精品 | 国产精品一区在线观看 | h视频在线播放 | 日本三级全黄三级三级三级口周 | 国产综合视频 | 成人欧美一区二区三区在线播放 | 成人性视频在线 | 一级做a| 成人国产在线观看 | 暴草美女 | 成人免费观看视频 | 久久精品国产99国产精品 | 国产高清在线精品 | 欧美日日 | 91在线精品秘密一区二区 | 91免费版在线观看 | 懂色av蜜桃av| 午夜精品影院 | 日韩精品视频一区二区三区 | 亚洲激情综合 | 中文字幕在线视频精品 | 91福利网 | 国产久| 97精品超碰一区二区三区 | 91视频18 | 色性av | 看a网站 | 国产在线资源 | 国产精品久久久久久妇女6080 | 日本电影韩国电影免费观看 | 亚洲欧美一区二区三区视频 | 久久精品欧美视频 | 黄色免费观看网站 | 日日久 | 欧美日韩视频 |