日韩在线首页I俄罗斯pornI男女猛烈激情XX00高潮动态I超碰免费97I乱人伦99久久I欧美日韩成人一区I最新日韩视频在线观看I粉嫩AV四季AV绯色AVI五月导航

×
新網 > 虛擬主機 > 正文

高效動態語言虛擬機的設計(一)

  • 作者:新網
  • 來源:新網
  • 瀏覽:100
  • 2018-05-09 14:43:06

最近在做Python相關的一些東西,發現Python的性能實在是非常差,所以就深入到Python內部,看了一下它的實現,并對比了幾個比較流行的虛擬機的實現,包括:

   最近在做Python相關的一些東西,發現Python的性能實在是非常差,所以就深入到Python內部,看了一下它的實現,并對比了幾個比較流行的虛擬機的實現,包括:

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

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

免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。

免費咨詢獲取折扣

Loading
主站蜘蛛池模板: av无码中文字幕不卡一区二区三区 | 欧洲吸奶大片在线看 | 成人免费8888在线视频 | 久久久成人999亚洲区美女 | 欧美巨大另类极品videosbest | 亚洲欧美日本国产专区一区 | 日产麻无矿码直接进入 | 亚洲久热无码中文字幕人妖 | 色多多福利网站免费破解 | 看片网址国产福利av中文字幕 | 一级片大片 | 国产精品无码无卡在线播放 | 九九色在线观看 | 少妇又粗又猛又爽又黄的视频 | 免费a级毛片出奶水欧美 | 无码任你躁久久久久久 | 成年轻人电影www无码 | av手机 | 国产毛a片啊久久久久久保和丸 | 国产爆乳成av人在线播放 | 国产二区三区视频 | 国产精品天天在线午夜更新 | 91玉足脚交白嫩脚丫 | 涩涩涩涩涩涩涩涩涩涩 | 精品热99| 欧美黑人xxxx性高清版 | 国产成人无码精品久久二区三区 | 久久亚洲国产精品亚洲老地址 | 奇米影视第四狠狠777 | 成人国产在线观看 | 亚洲精品一区二区三区香 | 中文精品无码中文字幕无码专区 | 99国产精品一区 | 日日躁夜夜躁狠狠躁aⅴ蜜 肉丝美脚视频一区二区 | 国产精品国产三级国产专播品爱网 | 97久久精品人人做人人爽 | 偷窥自拍亚洲色图 | 青草青视频 | 热久久精品免费视频 | 手机午夜电影神马久久 | 真人无码作爱免费视频 | 久久极品视频 | 亚洲少妇网| 中文字幕av中文字无码亚 | 成人午夜亚洲精品无码区毛片 | 久久se精品一区精品二区 | 欧美高清一级 | 成人国产免费观看 | 精品粉嫩超白一线天av | 亚洲国产精品无码久久一线 | 国产人在线成免费视频 | 太粗太深了太紧太爽了动态图 | 天堂俺去俺来也www 少妇淫交裸体视频 | 亚洲影视在线 | 黄色一级视频免费看 | 亚洲精品一区二区三区麻豆 | 香蕉视频免费在线观看 | 亚洲成人手机在线 | 日韩毛片免费无码无毒视频观看 | 人人搞人人插 | 国产精品久久婷婷六月丁香 | 强奷乱码中文字幕熟女导航 | 色频在线| 国产av一区二区精品久久 | 中文字幕亚韩 | 欧美成人综合色 | 成年无码av片在线狼人 | 黄色录像片子 | 色窝窝无码一区二区三区 | 亚洲国产成人久久综合一区77 | 免费无遮挡很爽很污很黄的网站 | 国产成人亚洲精品无码蜜芽 | 日韩精品成人av在线观看 | 日本精品久久 | 国外av片免费看一区二区三区 | 少妇野外性xx老女人野外性xx | av亚洲产国偷v产偷v自拍小说 | 黄色一极片 | 国产一区二区丝袜 | 成人性动漫 | 青青草国产免费久久久下载 | 亚洲精品国偷自产在线99人热 | 国产精品青草久久福利不卡 | 国产性生大片免费观看性 | 成人涩涩软件 | 国产精品3区 | 久草aⅴ | 国产精品星空无限传媒 | 精品国产乱码一区二区三区99 | 精品亚洲国产成人av网站 | 好爽又高潮了毛片 | 日本免费一区二区三区在线播放 | 老子影院午夜伦手机不四虎卡 | 噜啦噜色姑娘综合网 | 99青草| 亚洲第一精品在线观看 | 国产免费极品av吧在线观看 | 东热ca大乱合集 | 无码精品国产d在线观看 |