freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

樹遍歷解釋器,基于棧與基于寄存器,大雜燴-展示頁(yè)

2025-05-19 21:14本頁(yè)面
  

【正文】 它的 指令集 就是樹形的Expression Tree。只不過線性 (相對(duì)于樹形 )的指令序列看 起來更像一般真正機(jī)器會(huì)執(zhí)行的指令序列而已。前面提到解釋器中的編譯器的輸出可能是 AST,也可能是字節(jié)碼之類的指令序列;一般會(huì)把執(zhí)行后者的程序稱為 VM,而執(zhí)行前者的還是籠統(tǒng)稱為解釋器或者樹遍歷式解釋器(treewalking interpreter)。 VM 既然被稱為 機(jī)器 ,一般認(rèn)為輸入是滿足某 種指令集架構(gòu) (instruction set architecture, ISA)的指令序列,中間轉(zhuǎn)換為目標(biāo) ISA 的指令序列并加以執(zhí)行,輸出為程序的執(zhí)行結(jié)果的,就是VM。那么虛擬機(jī) (virtual machine, VM)又是什么 ?在許多不同的場(chǎng)合, VM有著不同的意義。實(shí)際上很多解釋器內(nèi)部是以 編譯器 +虛 擬機(jī) 的方式來實(shí)現(xiàn)的,先通過編譯器將源碼轉(zhuǎn)換為 AST 或者字節(jié)碼,然后由虛擬機(jī)去完成實(shí)際的執(zhí)行。這非常抽象,內(nèi)部是怎么實(shí)現(xiàn)的都沒關(guān)系,只要能實(shí)現(xiàn)語(yǔ)義就行。例如說經(jīng)常被認(rèn)為是 解釋型語(yǔ)言 的 Scheme 就有好幾種編譯器實(shí)現(xiàn),其中率先支持 R6RS 規(guī)范的大部分內(nèi)容的是 Ikarus,支持在 x86 上編譯 Scheme;它最終不是生成某種虛擬機(jī)的字節(jié)碼,而是直接生成 x86機(jī)器碼。同樣, C++也有解釋器版本的實(shí)現(xiàn),例如 Cint。這么說其實(shí)很容易引起誤解:語(yǔ)言一般只會(huì)定義其抽象語(yǔ)義,而不會(huì)強(qiáng)制性要求采用某種實(shí)現(xiàn)方式。算了,我還是不要淌這渾水的好…打住。另外就是 PCH(prepile header)這種用法,把以前的編譯結(jié)果緩存下來稱為 預(yù)編譯 。最近某本引起很多關(guān)注的書便在開篇給讀者們當(dāng)頭一棒,介紹了 JavaScript 解析機(jī)制 。舉例:把同樣的源碼分別輸入到編譯器與解釋器中,得到的輸出不同:值得留意的是,編譯器生成出來的代碼執(zhí)行后的結(jié)果應(yīng)該跟解釋器輸出的結(jié)果一樣 它們都應(yīng)該實(shí)現(xiàn)源碼所指定的語(yǔ)義。它直接實(shí)現(xiàn)程序源碼的語(yǔ)義,輸入是程序源碼,輸出則是執(zhí)行源碼 得到的計(jì)算結(jié)果;編譯器的輸入與解釋器相同,而輸出是用別的語(yǔ)言實(shí)現(xiàn)了輸入源碼的語(yǔ)義的程序。把掃描器和解析器合起來叫解析器總覺得怪怪的,但不少人這么用,這里就將就下吧 =_=不過近來 scannerless parsing也挺流行的:不區(qū)分詞法分析與語(yǔ)法分析,沒有單獨(dú)的掃描器,直接用解析器從源碼生成語(yǔ)法樹。 )舉例:將 i=a+b*c 作為源代碼輸入到解 析器里,則廣義上的解析器的工作流程如下圖:其中詞法分析由掃描器完成,語(yǔ)法分析由狹義的解析器完成。但概念上說解析器就是用來抽取句子結(jié)構(gòu)用的,而語(yǔ)法樹就是表示句子結(jié)構(gòu)的方式。狹義的解析器輸入是單詞的流,經(jīng)過語(yǔ)法分析,輸出是語(yǔ)法樹或者精簡(jiǎn)過的 AST。進(jìn)一步剝開來,廣義的解析器里一般會(huì)有掃描器 (scanner,也叫 tokenizer 或者 lexical analyzer,詞法分析器 ),以及狹義的解析器 (parser,也叫 syntax analyzer,語(yǔ)法分析器 )。前者是編譯器 /解釋器的重要組成部分,也可以用在IDE之類的地方;其主要作用是進(jìn)行語(yǔ)法分析,提取出句子的結(jié)構(gòu)。樹遍歷解釋器,基于棧與基于寄存器,大雜燴 虛擬機(jī)隨談 (一 ):解釋器,樹遍歷解釋器,基于棧與基于寄存器,大雜燴 解析器與解釋器解析器是 parser,而解釋器是 interpreter。兩者不是同一樣?xùn)|西,不應(yīng)該混用。廣義來說輸入一般是程序的源碼,輸出一般是語(yǔ)法樹 (syntax tree,也叫 parse tree 等 )或抽象語(yǔ)法樹 (abstract syntax tree, AST)。掃描器的輸入一般是文本,經(jīng)過詞法分析,輸出是將文本切割為單詞的流。 (在一些編譯器 /解釋器中,解析也可能與后續(xù)的語(yǔ)義分析、代碼生成或解釋執(zhí)行等步驟融合在一起,不一定真的會(huì)構(gòu)造出完整的語(yǔ)法樹。關(guān)于邊解析邊解釋執(zhí)行的例子,可以看看這帖的計(jì)算器。 (嗯,說來其實(shí) 解析器 這詞還是按狹義用法比較準(zhǔn)確。這倒整個(gè)就是解析器了,沒狹不狹義的問題 )后者則是實(shí)現(xiàn)程序執(zhí)行的一種實(shí)現(xiàn)方式,與編譯器相對(duì)。通常編譯器的輸入語(yǔ)言比輸出語(yǔ)言高級(jí),但不一定;也有輸入輸出是同種語(yǔ)言的情況,此時(shí)編譯器很可能主要用于優(yōu)化代碼。在很多地方都看到解析器與解釋器兩個(gè)不同的東西被混為一談,感到十分無奈。 編譯 和 預(yù)處理 也順帶混為一談了,還有 預(yù)編譯 0_0我一直以為 預(yù)編譯 應(yīng)該是 aheadoftime pilation 的翻譯,是與 即時(shí)編譯 (justintime pilation, JIT)相對(duì)的概念。把 AOT、 PCH 跟 預(yù)處理 (preprocess)混為一談?wù)媸窃幃悺? 解釋器 到底是什么 ?解釋型語(yǔ)言 呢 ?很多資料會(huì)說, Python、 Ruby、 JavaScript 都是 解釋型語(yǔ)言 ,是通過解釋器來實(shí)現(xiàn)的。例如說 C 一般被認(rèn)為是 編譯型語(yǔ)言 ,但 C的解釋器也是存在的,例如 Ch。一般被稱為 解釋型語(yǔ)言 的是主流實(shí)現(xiàn)為解釋器的語(yǔ)言,但并不是說它就無法編譯。解釋器就是個(gè)黑箱,輸入是源碼,輸出就是輸入程序的執(zhí)行結(jié)果,對(duì)用戶來說中間沒有獨(dú)立的 編譯步驟。你可以寫一個(gè) C 語(yǔ)言的解釋器,里面只是先用普通的 C 編譯器把源碼編譯為 inmemory image,然后直接調(diào)用那個(gè) image 去得到運(yùn)行結(jié)果;用戶拿過去,發(fā)現(xiàn)直接輸入源碼可以得到源程序?qū)?yīng)的運(yùn)行結(jié)果就滿足需求了,無需在意解釋器這個(gè) 黑箱子 里到底是什么。所謂 解釋型語(yǔ)言 并不是不用編譯,而只是不需要用戶顯式去使用編譯器得到可執(zhí)行代碼而已。如果上下文是 Java、 Python 這類語(yǔ)言,那么一般指的是高級(jí)語(yǔ)言虛擬機(jī) (highlevel language virtual machine,HLL VM),其意義是實(shí)現(xiàn)高級(jí)語(yǔ)言的語(yǔ)義。源與目標(biāo) ISA 可以是同一種,這是所謂 sameISA VM。這只是種習(xí)慣而已,并沒有多少確鑿的依據(jù)。其實(shí)我覺得把執(zhí)行 AST 的也叫 VM也沒啥大問題。 VM并不是神奇的就能執(zhí)行代碼了,它也得采用某種方式去實(shí)現(xiàn)輸入程序的語(yǔ)義,并且同樣有幾種選擇: 編譯 ,例如微軟的 .NET 中的CLR; 解釋 ,例如 CPython、 CRuby ,許多老的 JavaScript 引擎等;也有介于兩者之間的混合式,例如 Sun 的 JVM, HotSpot。換個(gè)角度說,我覺得采用編譯和解釋方式實(shí)現(xiàn)虛擬機(jī)最大的區(qū)別就在于是否存下目標(biāo)代碼:編譯的話會(huì)把輸入的源程序以某種單位 (例如基本塊 /函數(shù) /方法 /trace 等 )翻譯生成為目標(biāo)代碼,并存下來 (無論是存在內(nèi)存中還是磁盤上,無所謂 ),后續(xù)執(zhí)行可以復(fù)用之;解釋的話則把源程序中的指令是逐條解釋,不生成也不存下目標(biāo)代碼,后續(xù)執(zhí)行沒有多少可復(fù)用的信息。后面講到解釋器的演化時(shí)再討論超級(jí)指令吧。如果內(nèi)部用的虛擬機(jī)是用編譯方式實(shí)現(xiàn)的,其實(shí)跟普遍印象中的 解釋器 還是挺不同的…可以舉這樣一個(gè)例子: ActionScript 3,一般都被認(rèn)為是 解釋型語(yǔ)言 對(duì)吧 ?但這種觀點(diǎn)到底是把 FlashPlayer 整體看成一個(gè)解釋 器,因而 AS3是 解釋型語(yǔ)言 呢 ?還是認(rèn)為 FlashPlayer 中的虛擬機(jī)采用解釋執(zhí)行方案,因而 AS3 是 解釋型語(yǔ)言 呢 ?其實(shí) Flash 或 Flex 等從 AS3 生成出來的 SWF 文件里就包含有 AS 字節(jié)碼 (ActionScript Byte Code, ABC)。這種需要讓用戶顯式進(jìn)行編譯步驟的語(yǔ)言,到底是不是 解釋型語(yǔ)言 呢 ?呵呵。有興趣想體驗(yàn)一下從命令行編譯 裸 的 AS3文件得到 ABC文件,再?gòu)拿钚姓{(diào)用 AVM2 去執(zhí)行 ABC 文件的同學(xué),可以從這帖下載我之前從源碼編譯出來的 AVM2,自己玩玩看。接著用: Command prompt 代碼 avmplus 就是用 AVM2 去執(zhí)行程序了。這個(gè) 裸 的 AVM2 沒有帶 Flash 或Flex 的類庫(kù),能用的函數(shù)和類都有限??梢杂胮
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1