網(wǎng)站首頁 編程語言 正文
python虛擬機(jī)解釋器
我閑來翻了翻幾年前就買的一本python的書,O'REILLY的【python學(xué)習(xí)手冊】,中譯版,很厚。
可惜,我看得非常少,這也是為什么我在簡歷上關(guān)于python頂天也就寫個熟悉,就這都擔(dān)心找虐。雖說java的學(xué)習(xí)價值更大,但是學(xué)了平時用不上,忘得快。再加上做題的時候,感覺還是用python來得更得心應(yīng)手些(廢話,別的你也不熟啊),于是我決定把書看完,記錄出以前不知道的,或者忽視掉的知識細(xì)節(jié)。
什么是python解釋器
1. 解釋性語言和編譯性語言
說到解釋器,大家之前多少都聽過解釋性語言和編譯性語言。首先,不管是這二位其中的誰,源代碼對于計算機(jī)來說,都是讀不懂的,計算機(jī)只認(rèn)識二進(jìn)制指令。所以,想讓程序被執(zhí)行,那么自然要先把源代碼轉(zhuǎn)化為二進(jìn)制指令,也就是機(jī)器碼。
那么,在什么時候進(jìn)行轉(zhuǎn)換呢?
有的語言要求必須提前把代碼一次性轉(zhuǎn)換完畢,這種就是編譯型語言,用的轉(zhuǎn)換工具就叫編譯器,比如C語言、C++。有的語言則可以一邊執(zhí)行一邊轉(zhuǎn)化,用到哪里了就轉(zhuǎn)哪里,這種就是解釋性語言,用的轉(zhuǎn)化工具叫解釋器,比如python、javascript。
java比較特殊,既有編譯又有解釋。但是編譯并沒有直接編譯成機(jī)器碼,而是編譯成字節(jié)碼,然后再拿到虛擬機(jī)中執(zhí)行。這種設(shè)計初衷是在跨平臺的同時兼顧執(zhí)行效率,這里就不展開了。
ok,上面就是鋪墊了。
2. python解釋器
python解釋器是一種讓其他程序運(yùn)行起來的程序,編寫的python代碼必須在解釋器中運(yùn)行,這東東已經(jīng)在我們安裝python的時候都裝上了。
所以,現(xiàn)在我print(hello world)
,就可以運(yùn)行了,控制臺可以看到文本的輸出。
3. python程序運(yùn)行過程
上面的一行代碼雖然簡單,但是python運(yùn)行它還是經(jīng)過了兩步操作:
將源代碼編譯成為“字節(jié)碼”轉(zhuǎn)發(fā)“字節(jié)碼”到“虛擬機(jī)”
字節(jié)碼編譯
可以理解為翻譯,把print(hello world)
翻譯成字節(jié)碼,字節(jié)碼會保存在后綴名是.pyc
的文件里,這文件其實(shí)就是編譯后的.py
源代碼。
這些字節(jié)碼相較于源代碼,運(yùn)行起來速度要快得多。為什么?
因?yàn)樵谙乱淮芜\(yùn)行程序時,如果在上次保存了字節(jié)碼之后沒有修改過源代碼了,Python就會加載.pyc
文件并且跳過編譯這個步驟。
當(dāng)必須要重新編譯時,python會自動檢查源文件和字節(jié)碼文件的時間戳,如果你又保存了源代碼,下次程序運(yùn)行時,字節(jié)碼將自動重新創(chuàng)建。
python虛擬機(jī)
Python Virtual Machine,簡寫為PVM,當(dāng)有字節(jié)碼文件之后,就會被發(fā)送到PVM里來執(zhí)行。
這里注意,PVM并不是指的一個獨(dú)立的程序,是不需要安裝的。可以把PVM理解為Python的運(yùn)行引擎,是一個迭代運(yùn)行字節(jié)碼指令的大循環(huán),一個個的完成操作,直到結(jié)束。
從技術(shù)角度看,PVM才是“解釋器”的最后一步。
關(guān)于python的性能
大家都知道,python的缺點(diǎn)是運(yùn)行慢。但其實(shí)這里的慢也只是相對而言,跟C和C++這類編譯性語言相比,確實(shí)執(zhí)行速度還不夠快。
為什么?
上述也提到了python會把源代碼轉(zhuǎn)成字節(jié)碼,然后再將字節(jié)碼解釋出來。但是為了更好的跨平臺性,這里的字節(jié)碼是一種跟平臺無關(guān)的格式,所以并不是底層的二進(jìn)制代碼。到目前為止,只要不是對運(yùn)行速度有嚴(yán)苛要求的領(lǐng)域,比如數(shù)值計算或動畫這種,經(jīng)常需要核心處理單元至少以C語言的速度執(zhí)行,絕大多數(shù)的應(yīng)用,python還是可以勝任的。
相比于缺點(diǎn),python帶來開發(fā)效率的提升,相信也是很多人喜愛的的重要因素。
原文鏈接:https://blog.csdn.net/wessonlan/article/details/124813050
相關(guān)推薦
- 2022-10-28 Python利用Rows快速操作csv文件_python
- 2022-10-23 C++繼承與菱形繼承詳細(xì)介紹_C 語言
- 2022-06-15 C++詳細(xì)講解繼承與虛繼承實(shí)現(xiàn)_C 語言
- 2022-10-04 Redis分布式鎖之紅鎖的實(shí)現(xiàn)_Redis
- 2023-03-13 Android?BottomNavigationView與Fragment重建與重疊問題解決方法探索
- 2022-04-26 EF?Core通過顯式編譯提高查詢性能_實(shí)用技巧
- 2022-09-06 Golang實(shí)現(xiàn)http重定向https_Golang
- 2021-12-15 CentOS下更新SQLite版本_SQLite
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支