欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

超級簡單的虛擬機(Python 實現)

系統 2015 0

我們這次實現的簡單虛擬機,和計算機的 cpu 有點類似。 無非就是取指令,執行指令之類的操作。

常見的虛擬機通常分為兩類,一種是棧式虛擬機,另一種是寄存器虛擬機。比如說 CPython, Jvm 就是基于棧的虛擬機,而 lua 則是基于寄存器的虛擬機。

我們這次實現的“玩具”虛擬機,就是一種基于棧的虛擬機。

虛擬機有三個重要屬性,code 代表要執行的指令列表,stack 用于保存臨時變量,而 addr 代表當前指令的地址。

              
                #?Python高效編程
class?Machine:
????def?__init__(self,?code):
????????self.code?=?code
????????self.stack?=?list()
????????self.addr?=?0

              
            

原理其實很簡單,我們通過不斷獲取當前指令地址,從指令列表中獲取指令和數據,如果是數字或者字符串,就壓入棧中;如果是指令,就執行相應函數。

為了少些幾個字符,我們向 Machine 類中添加幾個方法:

              
                def?push(self,?value):
????self.stack.append(value)

def?pop(self):
????return?self.stack.pop()

@property
def?top(self):
????return?self.stack[-1]

              
            

我們通過 dispatch 方法,來判斷當前從指令列表中取得的片段是指令還是數據:

              
                def?dispatch(self,?opcode):
????dispatch_map?=?{
????????"%":????????self.mod,
????????"*":????????self.mul,
????????"+":????????self.plus,
????????"-":????????self.minus,
????????"/":????????self.div,
????????"==":???????self.eq,
????????"cast_int":?self.cast_int,
????????"cast_str":?self.cast_str,
????????"drop":?????self.drop,
????????"dup":??????self.dup,
????????"exit":?????self.exit,
????????"if":???????self.if_stmt,
????????"jmp":??????self.jmp,
????????"over":?????self.over,
????????"print":????self.print,
????????"println":??self.println,
????????"read":?????self.read,
????????"stack":????self.dump_stack,
????????"swap":?????self.swap,
????????}
????if?opcode?in?dispatch_map:
????????dispatch_map[opcode]()
????elif?isinstance(opcode,?int):
????????self.push(opcode)
????elif?isinstance(opcode,?str)\
????????and?opcode[0]?==?opcode[-1]?==?'"':
????????self.push(opcode[1:-1])

              
            

dispatch_map 就對應我們在 Machine 類中實現的方法。

比如說 plus 方法和 jmp 方法:

              
                def?plus(self):
????v2?=?self.pop()
????v1?=?self.pop()
????self.push(v1?+?v2)


def?jmp(self):
????addr?=?self.pop()
????if?0?<=?addr?<?len(self.code):
????????self.addr?=?addr
????else:
????????raise?RuntimeError("addr?must?be?integer")

              
            

其余方法也很簡單,大家可以直接查看源代碼。

好了,在加入一個 run 函數,我們就可以解釋代碼了。只要當前地址小于指令長度,就不斷取指令,執行指令。

              
                def?run(self):
????while?self.addr?<?len(self.code):
????????opcode?=?self.code[self.addr]
????????self.addr?+=?1
????????self.dispatch(opcode)

              
            

我們創建 Machine 類,并執行 run 函數, 注意字符串要用引號括起來

              
                >>>?from?vm?import?Machine
>>>?Machine([521,?1314,"+",?6,?"*","println"]).run()
11010

              
            

我們還可以給虛擬機加一個交互式界面:

              
                def?repl(prompt="VM>>?"):
????welcome()
????while?True:
????????try:
????????????text?=?read(prompt)
????????????code?=?list(tokenize(text))
????????????code?=?constants_fold(code)
????????????Machine(code).run()
????????except?(RuntimeError,?IndexError):
????????????stdout.write("1表達式不合法\n")
????????except?KeyboardInterrupt:
????????????stdout.write("請使用exit退出程序\n")

              
            

在讀取用戶輸入字符串之后,對字符串處理:

              
                def?parse_word(word):
????try:
????????return?int(word)
????except?ValueError:
????????try:
????????????return?float(word)
????????except?ValueError:
????????????return?word

def?tokenize(text):
????for?word?in?text.split():
????????yield?parse_word(word)

              
            

最后放張效果圖:

超級簡單的虛擬機(Python 實現)_第1張圖片

關注微信公眾號:Python高效編程,在微信后臺回復 201991 獲取源代碼。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人久久 | 三级福利视频 | 国产成人综合95精品视频免费 | 成人日韩在线 | 精品国精品国产自在久国产应用 | 精品欧美一区二区在线观看欧美熟 | 99精品国产免费观看视频 | 亚洲黄色网址大全 | 人人爱人人爽 | 日本aⅴ在线 | 91免费官网 | 波多野结衣中文丝袜字幕 | 国产日韩一区 | 久久久久欧美激情 | 成人福利在线视频 | 精品国产一区三区 | 欧美日韩高清不卡一区二区三区 | 广西美女一级毛片 | 奇米第四色网站 | 亚洲精品国产成人一区二区 | 午夜影院恐怖电影免费看 | 精品国产18久久久久久二百 | 欧美精品在线免费观看 | 欧美成人免费全网站大片 | 中文字幕成人 | 午夜欧美性欧美 | 人人九九精品 | 黄色免费av| 日韩一区二区三区在线 | 日本一级特黄a大片在线 | 国产成人精品福利网站在线观看 | 国产欧美日韩在线 | 久久精品亚洲精品 | 亚洲欧美国产一区二区三区 | 国内精品久久久久影院老司 | 亚洲一区二区三区四区 | 91视频高清 | 侮辱丰满美丽的人妻 | 欧洲免费无线码二区5 | 色哦色哦哦色天天综合 | 日本黄页免费大片在线观看 |