亚洲综合在线一区二区三区-日韩超碰人人爽人人做人人添-麻豆国产精品久久人妻-无码人妻丰满熟妇啪啪-天堂精品一区二区三区-99久久综合狠狠综合久久aⅴ

×

高效動(dòng)態(tài)語言虛擬機(jī)的設(shè)計(jì)(一)

  • 作者:新網(wǎng)
  • 來源:新網(wǎng)
  • 瀏覽:100
  • 2018-05-09 14:43:06

最近在做Python相關(guān)的一些東西,發(fā)現(xiàn)Python的性能實(shí)在是非常差,所以就深入到Python內(nèi)部,看了一下它的實(shí)現(xiàn),并對比了幾個(gè)比較流行的虛擬機(jī)的實(shí)現(xiàn),包括:

   最近在做Python相關(guān)的一些東西,發(fā)現(xiàn)Python的性能實(shí)在是非常差,所以就深入到Python內(nèi)部,看了一下它的實(shí)現(xiàn),并對比了幾個(gè)比較流行的虛擬機(jī)的實(shí)現(xiàn),包括:

1a9e54a8-08e6-4532-9197-5b2e9bbd47ce.jpg

<div>  V8 (Javascript)
  Tamarin (ActionScript 3)
  Lua 5.0
  CPython (Python 2.7.2)
  做了一定分析和比對,獲得了一些靈感,在這里寫下來作一個(gè)分享的討論。
  Ok,先從計(jì)算機(jī)是如何將一個(gè)高級語言的代碼,轉(zhuǎn)變成可以執(zhí)行的程序說起。
  計(jì)算機(jī)程序語言的機(jī)制
  眾所周知,計(jì)算機(jī)能夠執(zhí)行的代碼是機(jī)器碼,也就是所謂的二進(jìn)制。那么一段高級語言的代碼要想能夠被計(jì)算機(jī)執(zhí)行,必須經(jīng)過這樣的一個(gè)過程:
  編譯 (將源代碼編譯成目標(biāo)代碼:目標(biāo)代碼是機(jī)器碼片段的集合,每一段機(jī)器碼都有一個(gè)名字,也就是這段代碼的符號(hào))
  連接 (將多個(gè)目標(biāo)文件中的符號(hào)連接在一起,形成一個(gè)大的可執(zhí)行機(jī)器碼,這樣計(jì)算機(jī)(大部分時(shí)候是操作系統(tǒng))就可以加載、執(zhí)行代碼了)
  編譯器的設(shè)計(jì)
  在早期,編譯的過程是直譯式的,編譯器直接將源代碼解析成Token流,再將Token流分析成AST(抽象語法樹),然后直接根據(jù)抽象語法樹中的語法元素生成目標(biāo)機(jī)器的匯編代碼,最后再通過匯編器(Assembler)匯編成目標(biāo)文件。
  然而現(xiàn)代的編譯器都會(huì)有一種中間代碼,然后將編譯器分成兩半(前端和后端)。
  前端是語言相關(guān)的,負(fù)責(zé)將原始的語言編譯成中間代碼;
  后端是目標(biāo)機(jī)器相關(guān)的,負(fù)責(zé)將中間代碼翻譯成目標(biāo)機(jī)器的機(jī)器碼。
  這樣做的好處就在于,編譯器變得更加可移植了。
  當(dāng)出現(xiàn)一種新的語言時(shí),只要實(shí)現(xiàn)一個(gè)這個(gè)語言的前端,就可以工作在不同的平臺(tái)和cpu上;
  當(dāng)出現(xiàn)一個(gè)新的平臺(tái)時(shí),只要實(shí)現(xiàn)一個(gè)后端,就可以支持所有的語言。
  GCC就是這樣設(shè)計(jì)的一個(gè)范例。
  從上一節(jié)的內(nèi)容,我們可以看出,假設(shè)語言都實(shí)現(xiàn)到了生成中間語言這一步,那么虛擬機(jī)的實(shí)現(xiàn)可以有2種方式:
  Interpreting (解釋執(zhí)行)
  也就是通過類似while() { switch() {} }的循環(huán),分析中間語言的每條指令,動(dòng)態(tài)解釋執(zhí)行
  Binary Translation (這個(gè)名詞大家可能比較陌生,它還有一個(gè)大家更加熟知的名字:JIT)
  顧名思義,就是虛擬機(jī)實(shí)現(xiàn)了從中間語言,到可執(zhí)行文件的轉(zhuǎn)換的功能,在運(yùn)行時(shí),將中間語言轉(zhuǎn)換成了可執(zhí)行文件,最終執(zhí)行
  這兩種方式各有特色:
  Interpreting
  啟動(dòng)非??焖伲瑘?zhí)行性能相對較差,通常應(yīng)用于一些對性能本身不是很敏感的語言
  Binary Translation
  有一個(gè)翻譯的過程,啟動(dòng)的時(shí)候會(huì)相對比較慢,但是執(zhí)行的性能非常好,有時(shí)甚至比c代碼還要快速(聽起來很科幻?)
  我們來橫向比較一下這幾個(gè)虛擬機(jī)的實(shí)現(xiàn)方式:
  虛擬機(jī)語言語言特性虛擬機(jī)實(shí)現(xiàn)方式速度
  V8JavaScript較豐富Binary Translation非???/div>
  TamarinActionScript 3(EcmaScript 4)較豐富Interpreting + Binary Translation非常快
  Lua 5.0Lua 5.0較少Interpreting較快
  CPythonPython 2.7很豐富Interpreting較慢
  從這里,我們可以看到使用Jit方式執(zhí)行的虛擬機(jī)明顯比較快,而采用解釋執(zhí)行的虛擬機(jī)明顯較慢。
  然而同樣是采用解釋執(zhí)行的虛擬機(jī),lua也要比python更快,這不僅僅是由于語言更簡單導(dǎo)致的,同時(shí)也跟lua虛擬機(jī)的實(shí)現(xiàn)有關(guān)。
  V8是一朵奇葩
  V8虛擬機(jī)可以說是所有的虛擬機(jī)里面設(shè)計(jì)最特別的一款,所有其他的虛擬機(jī)都會(huì)首先將源代碼編譯成一種中間代碼,如:
  虛擬機(jī)中間代碼指令數(shù)
  Tamarinabc (Adobe Byte Code)200+
  LuaLua Byte Code35
  PythonPython Byte Code100+
  然而,v8虛擬機(jī)的方式很特別,它在進(jìn)行jit的時(shí)候直接從ast生成目標(biāo)平臺(tái)的匯編代碼,并使用內(nèi)置的宏匯編器生成可執(zhí)行代碼,這樣就大大減少了jit過程所消耗的時(shí)間。
  Lua的指令為什么那么少?
  細(xì)心的讀者一定發(fā)現(xiàn)了,Lua虛擬機(jī)的指令要比其他的虛擬機(jī)少很多,甚至不再同一個(gè)數(shù)量級上,那為什么那么設(shè)計(jì)呢?  最近在做Python相關(guān)的一些東西,發(fā)現(xiàn)Python的性能實(shí)在是非常差,所以就深入到Python內(nèi)部,看了一下它的實(shí)現(xiàn),并對比了幾個(gè)比較流行的虛擬機(jī)的實(shí)現(xiàn),包括:
  V8 (Javascript)
  Tamarin (ActionScript 3)
  Lua 5.0
  CPython (Python 2.7.2)
  做了一定分析和比對,獲得了一些靈感,在這里寫下來作一個(gè)分享的討論。
  Ok,先從計(jì)算機(jī)是如何將一個(gè)高級語言的代碼,轉(zhuǎn)變成可以執(zhí)行的程序說起。
  計(jì)算機(jī)程序語言的機(jī)制
  眾所周知,計(jì)算機(jī)能夠執(zhí)行的代碼是機(jī)器碼,也就是所謂的二進(jìn)制。那么一段高級語言的代碼要想能夠被計(jì)算機(jī)執(zhí)行,必須經(jīng)過這樣的一個(gè)過程:
  編譯 (將源代碼編譯成目標(biāo)代碼:目標(biāo)代碼是機(jī)器碼片段的集合,每一段機(jī)器碼都有一個(gè)名字,也就是這段代碼的符號(hào))
  連接 (將多個(gè)目標(biāo)文件中的符號(hào)連接在一起,形成一個(gè)大的可執(zhí)行機(jī)器碼,這樣計(jì)算機(jī)(大部分時(shí)候是操作系統(tǒng))就可以加載、執(zhí)行代碼了)
  編譯器的設(shè)計(jì)
  在早期,編譯的過程是直譯式的,編譯器直接將源代碼解析成Token流,再將Token流分析成AST(抽象語法樹),然后直接根據(jù)抽象語法樹中的語法元素生成目標(biāo)機(jī)器的匯編代碼,最后再通過匯編器(Assembler)匯編成目標(biāo)文件。
  然而現(xiàn)代的編譯器都會(huì)有一種中間代碼,然后將編譯器分成兩半(前端和后端)。
  前端是語言相關(guān)的,負(fù)責(zé)將原始的語言編譯成中間代碼;
  后端是目標(biāo)機(jī)器相關(guān)的,負(fù)責(zé)將中間代碼翻譯成目標(biāo)機(jī)器的機(jī)器碼。
  這樣做的好處就在于,編譯器變得更加可移植了。
  當(dāng)出現(xiàn)一種新的語言時(shí),只要實(shí)現(xiàn)一個(gè)這個(gè)語言的前端,就可以工作在不同的平臺(tái)和cpu上;
  當(dāng)出現(xiàn)一個(gè)新的平臺(tái)時(shí),只要實(shí)現(xiàn)一個(gè)后端,就可以支持所有的語言。
  GCC就是這樣設(shè)計(jì)的一個(gè)范例。
  從上一節(jié)的內(nèi)容,我們可以看出,假設(shè)語言都實(shí)現(xiàn)到了生成中間語言這一步,那么虛擬機(jī)的實(shí)現(xiàn)可以有2種方式:
  Interpreting (解釋執(zhí)行)
  也就是通過類似while() { switch() {} }的循環(huán),分析中間語言的每條指令,動(dòng)態(tài)解釋執(zhí)行
  Binary Translation (這個(gè)名詞大家可能比較陌生,它還有一個(gè)大家更加熟知的名字:JIT)
  顧名思義,就是虛擬機(jī)實(shí)現(xiàn)了從中間語言,到可執(zhí)行文件的轉(zhuǎn)換的功能,在運(yùn)行時(shí),將中間語言轉(zhuǎn)換成了可執(zhí)行文件,最終執(zhí)行
  這兩種方式各有特色:
  Interpreting
  啟動(dòng)非??焖?,執(zhí)行性能相對較差,通常應(yīng)用于一些對性能本身不是很敏感的語言
  Binary Translation
  有一個(gè)翻譯的過程,啟動(dòng)的時(shí)候會(huì)相對比較慢,但是執(zhí)行的性能非常好,有時(shí)甚至比c代碼還要快速(聽起來很科幻?)
  我們來橫向比較一下這幾個(gè)虛擬機(jī)的實(shí)現(xiàn)方式:
  虛擬機(jī)語言語言特性虛擬機(jī)實(shí)現(xiàn)方式速度
  V8JavaScript較豐富Binary Translation非常快
  TamarinActionScript 3(EcmaScript 4)較豐富Interpreting + Binary Translation非常快
  Lua 5.0Lua 5.0較少Interpreting較快
  CPythonPython 2.7很豐富Interpreting較慢
  從這里,我們可以看到使用Jit方式執(zhí)行的虛擬機(jī)明顯比較快,而采用解釋執(zhí)行的虛擬機(jī)明顯較慢。
  然而同樣是采用解釋執(zhí)行的虛擬機(jī),lua也要比python更快,這不僅僅是由于語言更簡單導(dǎo)致的,同時(shí)也跟lua虛擬機(jī)的實(shí)現(xiàn)有關(guān)。
  V8是一朵奇葩
  V8虛擬機(jī)可以說是所有的虛擬機(jī)里面設(shè)計(jì)最特別的一款,所有其他的虛擬機(jī)都會(huì)首先將源代碼編譯成一種中間代碼,如:
  虛擬機(jī)中間代碼指令數(shù)
  Tamarinabc (Adobe Byte Code)200+
  LuaLua Byte Code35
  PythonPython Byte Code100+
  然而,v8虛擬機(jī)的方式很特別,它在進(jìn)行jit的時(shí)候直接從ast生成目標(biāo)平臺(tái)的匯編代碼,并使用內(nèi)置的宏匯編器生成可執(zhí)行代碼,這樣就大大減少了jit過程所消耗的時(shí)間。
  Lua的指令為什么那么少?
  細(xì)心的讀者一定發(fā)現(xiàn)了,Lua虛擬機(jī)的指令要比其他的虛擬機(jī)少很多,甚至不再同一個(gè)數(shù)量級上,那為什么那么設(shè)計(jì)呢?

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費(fèi)咨詢獲取折扣

Loading
主站蜘蛛池模板: 韩国的无码av看免费大片在线| 久久久久久亚洲精品不卡| 日韩午夜一区二区体验区| 欧美国产亚洲日韩在线二区| 精品人妻少妇一区二区老女人| 粗大的内捧猛烈进出看视频| 日韩经典午夜福利发布| 久久成人国产精品一区二区| 97无码免费人妻超级碰碰夜夜| 精品人妻码一区二区三区| 一本一本久久a久久精品综合| 无码人妻久久一区二区三区免费 | 久久精品免费观看国产| 久久亚洲精品无码aⅴ大香| 狠狠干狠狠爱| 国产成人无码aⅴ片在线观看| 综合久久—本道中文字幕| 亚洲精品国产成人精品| 欧美激情一区二区成人| 国产精品边做奶水狂喷| 久久久久亚洲av无码专区电影| 丰满少妇女裸体bbw| 精品人妻系列无码人妻漫画| 亚洲一区二区三区韩| 青青草在久久免费久久免费| 裸体在线观看一区二区| 韩国亚洲精品a在线无码| 中国老熟妇自拍hd发布| 欧洲美妇乱人伦视频网站| 欧美性受xxxxzooz乱毛| 精品黑人一区二区三区| 亚洲欧美日韩成人一区 | 尤物在线精品视频| 人人妻人人澡人人爽国产一区| 精品偷拍被偷拍在线观看| 亚洲午夜未满十八勿入| 视频一区二区三区不卡| 国产香蕉97碰碰久久人人| 久久综合狠狠综合久久| 久久久久久av无码免费网站下载| 国产成人精品一区二区在线小狼|