本篇內(nèi)容介紹了“Python編程語(yǔ)言的核心是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)公司始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)十余年累計(jì)超上千家客戶(hù)的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶(hù),其中包括:成都玻璃鋼坐凳等企業(yè),備受客戶(hù)贊許。
為什么問(wèn)這個(gè)問(wèn)題?
我們需要一個(gè)用于WebAssembly的Python實(shí)現(xiàn),這已經(jīng)不是什么秘密了。它不僅將Python引入到瀏覽器中,而且由于iOS和Android都支持將JavaScript作為應(yīng)用的一部分運(yùn)行,它也將Python引入到移動(dòng)端。這一切都讓我興奮。
但是,當(dāng)想到創(chuàng)建一個(gè)新的Python實(shí)現(xiàn)這一令人生畏的任務(wù)時(shí),我的大腦也開(kāi)始問(wèn)這個(gè)問(wèn)題:Python到底是什么?我們與CPython一起生活了這么長(zhǎng)時(shí)間,我懷疑我們中的大多數(shù)人只是簡(jiǎn)單地認(rèn)為“Python == CPython”。PyPy試圖做到兼容,以便實(shí)現(xiàn)CPython的實(shí)現(xiàn)細(xì)節(jié)?;旧?,我所知道的大多數(shù)Python實(shí)現(xiàn)都努力通過(guò)CPython的測(cè)試套件,并盡可能地與CPython兼容。
這是令人生畏的。由CPython實(shí)現(xiàn)的Python是非常動(dòng)態(tài)的,并且暴露了許多只有在使用解釋器實(shí)現(xiàn)Python時(shí)才有意義的東西。例如,PyPy有一個(gè)用于JIT的基線解釋器,但是在Python中可以使用許多東西來(lái)強(qiáng)制PyPy關(guān)閉JIT并堅(jiān)持使用字節(jié)碼。僅靠REPL就可以使事情變得非常動(dòng)態(tài),因?yàn)榻忉屍鲿?huì)立即對(duì)進(jìn)入REPL的所有內(nèi)容進(jìn)行動(dòng)態(tài)解析、編譯和執(zhí)行。
這讓我開(kāi)始思考Python到底是什么?這門(mén)語(yǔ)言的核心是什么?所有的Python實(shí)現(xiàn)需要涵蓋什么樣的基線,才能真正能夠?qū)⒆约悍Q(chēng)為人們?nèi)阅苷J(rèn)出的Python實(shí)現(xiàn)?或者從我的角度來(lái)看,一個(gè)人需要實(shí)現(xiàn)多少才能直接編譯Python到WebAssembly,并且仍然被認(rèn)為是Python實(shí)現(xiàn)?
Python需要REPL嗎?
真正讓我開(kāi)始思考這個(gè)問(wèn)題的是當(dāng)我開(kāi)始思考如何將Python編譯成WebAssembly?沒(méi)有實(shí)現(xiàn)另一個(gè)解釋器,但實(shí)際上發(fā)出靜態(tài)WebAssembly從Python源代碼,并仍然合理地稱(chēng)為“Python”。
我知道的一件事是,通過(guò)eval()或compile()進(jìn)行動(dòng)態(tài)編譯可能不太容易,因?yàn)閃ebAssembly的安全模型在加載時(shí)驗(yàn)證模塊。這就意味著在其他代碼的內(nèi)存空間中并不存在運(yùn)行任意代碼的結(jié)構(gòu),這可能會(huì)使REPL的實(shí)現(xiàn)變得棘手。
但這讓我思考:Python真的需要REPL嗎?不要誤解我的意思,它非常方便,但是如果一個(gè)實(shí)現(xiàn)沒(méi)有REPL,它就不再是Python了嗎?我認(rèn)為沒(méi)有應(yīng)答的Python仍然是Python,它只是缺少一個(gè)(潛在的關(guān)鍵)特性。
這讓我開(kāi)始思考Python的哪些部分需要被認(rèn)為是“Python”?
沒(méi)有當(dāng)?shù)厝四隳苌顔?它是一個(gè)非常動(dòng)態(tài)的事情,能夠任意地收集所有定義的局部變量和它們的值到一個(gè)字典。如果你在一個(gè)像CPython這樣的intepreter中,你只需要從當(dāng)前執(zhí)行框架中獲取一些局部變量。但是在編譯語(yǔ)言中,這需要做更多的工作,因?yàn)槟仨氈篮螘r(shí)收集所有這些信息,因?yàn)檎{(diào)用local()時(shí),這些信息并不一定是到處都有的。
或者人們重寫(xiě)local()本身怎么樣?在CPython中,這不是什么大問(wèn)題,因?yàn)閎uiltins模塊有一個(gè)__dict__,你可以覆蓋它,它將簡(jiǎn)單地傳播到任何未來(lái)的調(diào)用。但是在編譯語(yǔ)言中,進(jìn)行這種檢測(cè)需要花費(fèi)更多的精力,而且這樣的檢查最終會(huì)降低性能。
關(guān)于sys.settrace ()呢 ?它實(shí)際上會(huì)觸發(fā)每個(gè)字節(jié)碼的回調(diào),如果代碼被編譯,它就不能正常工作。您可以通過(guò)檢查是否在每一行后面設(shè)置了跟蹤函數(shù)來(lái)偽造它,但是當(dāng)您大多數(shù)時(shí)候沒(méi)有設(shè)置這樣的鉤子時(shí),這樣做似乎有點(diǎn)過(guò)分(不過(guò),它可能是在這種支持下編譯的編譯器標(biāo)志)。
那么sys._getframe()呢?編譯語(yǔ)言并不一定要直接訪問(wèn)執(zhí)行框架,所以您需要費(fèi)心去模擬它嗎?由于執(zhí)行幀可以被任何函數(shù)請(qǐng)求,所以您需要隨時(shí)準(zhǔn)備按需提供執(zhí)行幀。
正如您所看到的,Python中有很多東西使得編譯變得困難(Nuitka因此更有能力接受這個(gè)挑戰(zhàn))。但我敢打賭,我上面提到的東西你在99.9%的時(shí)間里都不會(huì)用到,所以如果一個(gè)實(shí)現(xiàn)沒(méi)有使用它們,它還能被認(rèn)為是“Python”嗎?
有多少兼容性是有用的?
我對(duì)這個(gè)問(wèn)題沒(méi)有很好的答案。但是它的答案說(shuō)明了實(shí)現(xiàn)Python的難度以及它與現(xiàn)有軟件的兼容性。我想說(shuō)的是,我認(rèn)為WebAssembly不需要支持大量的Python軟件就可以發(fā)揮作用。WebAssembly可以訪問(wèn)其他語(yǔ)言生態(tài)系統(tǒng),比如Rust和JavaScript,所以用其他語(yǔ)言實(shí)現(xiàn)需要的東西的可能性絕對(duì)大于零。
我沒(méi)有答案
開(kāi)發(fā)一個(gè)將Python代碼直接轉(zhuǎn)換為WebAssembly并犧牲一些兼容性以提高性能的編譯器可能是有意義的。開(kāi)發(fā)一個(gè)以WebAssembly的設(shè)計(jì)為目標(biāo),同時(shí)又能保持與現(xiàn)有代碼的兼容性的解釋器可能是有意義的。在他們的WebAssembly努力中,簡(jiǎn)單地支持RustPython可能是有意義的。也許Pyodide能幫我們到達(dá)那里。我不認(rèn)為這些可能性在本質(zhì)上都是錯(cuò)誤的,它可能只會(huì)歸結(jié)為引起人們足夠興趣的那一個(gè),從而看到它對(duì)別人有用。
“Python編程語(yǔ)言的核心是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
分享文章:Python編程語(yǔ)言的核心是什么
路徑分享:http://redsoil1982.com.cn/article6/peehig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、微信小程序、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)