五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

六星源課堂:Python 編程語言的核心是什么?

2022-04-19 10:09 作者:六星源課堂  | 我要投稿

為什么要問這個問題?

我想要用Python實現(xiàn)WebAssembly,這并不是什么秘密。這不僅可以讓Python進入瀏覽器,而且由于iOS和Android都支持將JavaScript作為應(yīng)用的一部分運行,因此Python也可以進入移動開發(fā)。想到這些我就覺得興奮。

但是每當(dāng)想到創(chuàng)建一個新Python實現(xiàn)的艱巨任務(wù)時,我就會不斷地問自己:

“Python究竟是什么?”

我們使用CPython已經(jīng)很長時間了,以至于我懷疑我們大多數(shù)人都認(rèn)為“ Python == CPython”。PyPy試圖將兼容做到極致,所以他們打算實現(xiàn)CPython的實現(xiàn)細(xì)節(jié)?;旧?,我所知道的大多數(shù)Python實現(xiàn)都會為通過CPython的測試套件而努力,并盡可能與CPython兼容。

這就有點可怕了。

CPython實現(xiàn)的Python非常動態(tài),它公開了許多東西,只有當(dāng)你以某種方式使用解釋器實現(xiàn)Python才有意義。例如,PyPy有一個基本的解釋器使用JIT,但是你可以通過Python中的很多東西來迫使PyPy關(guān)閉JIT并堅持使用字節(jié)碼。僅憑REPL就讓Python變得十分動態(tài),因為輸入到REPL的所有內(nèi)容都會由解釋器動態(tài)地解析、編譯和執(zhí)行。

因此我開始思考:Python到底是什么的問題?這門語言的核心究竟是什么?究竟Python實現(xiàn)需要覆蓋到哪些基本功能,才能成為人們心目中認(rèn)可的Python實現(xiàn)?還有以我來看,將Python直接編譯成WebAssembly的實現(xiàn)需要付出多少代價?

Python是否需要REPL?

我真正開始思考這個問題是當(dāng)我開始思考將Python編譯成WebAssembly都需要什么的時候。這并不是要實現(xiàn)另一個解釋器,而是從Python源代碼產(chǎn)生靜態(tài)的WebAssembly,并且它依然可以稱為“Python”。

我知道的,通過eva或compile進行動態(tài)編譯可能不容易實現(xiàn),因為WebAssembly的安全模型會在加載時驗證模塊。這意味著沒有辦法在其他代碼的內(nèi)存空間內(nèi)運行任意代碼,這可能會加劇實現(xiàn)REPL的難度。

但這讓我思考:Python真的需要REPL嗎?別誤會我的意思,它非常方便,但是我的意思是,如果某個實現(xiàn)不包含REPL,那么它還是Python嗎?我認(rèn)為無REPL的Python仍然是Python,只是缺少(可能是關(guān)鍵的)功能。

這不禁讓我思考必須將Python的哪些部分視為“ Python”的想法。

沒有l(wèi)ocals行不行?能夠?qū)⒍x的所有局部變量及其值都收集到一個字典中,這是非常動態(tài)的東西。如果你使用像CPython這種解釋器,那么只需要從當(dāng)前的執(zhí)行幀里取一些東西就能獲得locals。但在編譯語言中,實現(xiàn)這一點需要大量工作,因為你必須知道應(yīng)當(dāng)何時收集這些信息,因為調(diào)用locals的時候并不一定所有信息都存在。

如果有人重載了locals怎么辦?同樣,在CPython中這也不是什么問題,因為builtins模塊有一個__dict__屬性,只需要重載它,就會向下傳遞到以后的調(diào)用中。但在編譯語言中,做類似的檢測需要大量的工作,最終會影響性能。

那么sys.settrace呢?它會觸發(fā)每個字節(jié)的回調(diào),而如果代碼已經(jīng)編譯,這一點是無法實現(xiàn)的。盡管你可以通過檢查每行末尾是否設(shè)置了跟蹤函數(shù)來模仿這一行為,但這似乎有點過了,因為絕大多數(shù)情況下這種鉤子并不存在(盡管可以實現(xiàn)為編譯器開關(guān))。

那么sys._getframe呢?編譯語言并不一定能夠直接訪問每個執(zhí)行幀,那么你還要不要模擬這一行為?由于任何函數(shù)都可以請求執(zhí)行幀,你必須時刻準(zhǔn)備著提供執(zhí)行幀。

可見,Python中有很多東西加劇了編譯的難度(因此Nuitka擁有更大的能力來應(yīng)對這一挑戰(zhàn))。但是我敢打賭,上面提到的內(nèi)容在99.9%的情況下都不會使用,因此,如果這些功能沒有實現(xiàn),那么是否仍可以將其視為“Python”?

具備多少兼容性才有意義?

這個問題我沒有很好的答案。但是這個問題的答案標(biāo)志著實現(xiàn)Python的難度以及與現(xiàn)有軟件的兼容性。我會說,我認(rèn)為WebAssembly不需要支持大量的Python軟件。WebAssembly可以訪問Rust和JavaScript等其他語言生態(tài)系統(tǒng),因此你需要的某個東西完全有可能在其他語言中已經(jīng)實現(xiàn)了。

我沒有答案

也許我們可以開發(fā)一個將Python代碼直接轉(zhuǎn)換為WebAssembly并犧牲性能兼容性的編譯器。也許我們可以開發(fā)針對WebAssembly設(shè)計的解釋器,同時與先前已有的代碼保持兼容性。也許可以僅在其WebAssembly工作中支持RustPython。也許Pyodide可以實現(xiàn)這一點。我認(rèn)為這些都有可能,這些都有可能激發(fā)人們的興趣,進而產(chǎn)生更好的結(jié)果。


六星源課堂:Python 編程語言的核心是什么?的評論 (共 條)

分享到微博請遵守國家法律
仪陇县| 独山县| 吴桥县| 大兴区| 视频| 汕尾市| 都昌县| 卢龙县| 宜州市| 长泰县| 天门市| 西丰县| 乐陵市| 和平区| 商河县| 河曲县| 安溪县| 定襄县| 阜新| 常德市| 达孜县| 阜新| 婺源县| 永顺县| 九龙城区| 慈溪市| 兴义市| 苏尼特左旗| 江川县| 方山县| 油尖旺区| 兰州市| 三原县| 基隆市| 垦利县| 遂宁市| 宁安市| 高邑县| 钟祥市| 和顺县| 甘泉县|