成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

編譯器、虛擬機、操作系統,到底哪個更難?

系統 其他OS
CPU的機器碼就是一種字節碼,它是直接在硬件上跑的,由硬件的數字電路來保證它的運行。

?編譯器、虛擬機、操作系統,到底哪個更難?

實際上,除了MATLAB這樣的數學軟件之外,肯定是編譯器更難!

虛擬機和操作系統更多的是麻煩,工作量大,而不是難。

1、虛擬機

什么是虛擬機?

能夠運行字節碼的程序,就是虛擬機。

CPU的機器碼就是一種字節碼,它是直接在硬件上跑的,由硬件的數字電路來保證它的運行。

但是虛擬機是由軟件程序來保證字節碼的運行的。

軟件程序是高級語言寫的,可以寫非常上層的邏輯,實現起來比數字電路簡單得多。

到了字節碼(機器碼)這個層面,邏輯已經非常簡單了,遠不如高級語言的源代碼復雜。

讓字節碼運行起來,實際上比編譯器生成字節碼更簡單:

因為生成字節碼是編碼,而讓字節碼運行是解碼,任何時候都是編碼比解碼更復雜。

編碼,需要把雜亂的信息整理成有序的。

解碼,只需要把有序的信息順序讀出來就行。

所以,H264編碼的CPU消耗,遠比H264解碼更大!

如果字節碼類似RISC架構的機器碼(例如ARM),那么每4字節就是一條指令,指令里的每一位做什么都是固定的。

所以,虛擬機的代碼就是這樣的:

uint32_t codes[N]; // 程序的字節碼數組
for (i = 0; i < N; i++) {
uint8_t opcode = codes[i] >> 25; // 最高7位是操作碼,可以支持128個指令
uint8_t src = (codes[i] >> 19) & 0x3f; // 接著6位是源操作數的寄存器編號,
uint8_t dst = (codes[i] >> 13) & 0x3f; // 接著6位是目的操作數的寄存器編號,
// 寄存器的編號占6位,可以支持64個寄存器
uint8_t flag = (codes[i] >> 12) & 0x1; // 是否設置跳轉標志,
uint16_t imm = codes[i] & 0xfff; // 可以攜帶12位的立即數,
run(ctx, opcode, src, dst, flag, imm); // 運行字節碼,ctx為進程的上下文
}

這種程序很難嗎?

不難。

機器碼的邏輯是特別簡單的,比高級語言的代碼簡單得多!

尤其是RISC架構的,更是比x64的機器碼還簡單。

x64的機器碼因為長度不固定,解釋起來要一個字節一個字節的分析,稍微復雜一點,但復雜度也遠不如高級語言的源代碼!

qemu復雜,是因為它要模擬多個型號的CPU。

如果只是給字節碼實現一個跨平臺的虛擬機,并不難。

把java源代碼變成字節碼的過程,遠比讓java字節碼運行起來,要難得多:

前者是編譯器,后者是虛擬機。

2、操作系統

如果只是讓OS內核在CPU上跑起來,大概只需要5000-8000行的C代碼!

Linux 0.01版(即第一個Linux版本)的代碼量也就在8000行左右。

Linux 0.11版,大約不到2萬行。

與編譯器比起來,操作系統只是更麻煩!

因為要支持的驅動模塊很多、要支持的文件系統很多、要支持的網絡協議很多,這些模塊的代碼都是工作量?

但是,麻煩不等于難!

8000行代碼的OS內核(例如Linux 0.01),只需要實現進程管理、內存管理、控制臺管理、鍵盤驅動、硬盤驅動,另外支持一種簡單的文件系統,就可以跑得起來。

這樣的OS內核實際上已經很完善了?

剩下的都是在文件系統的底下添加驅動模塊、網絡協議模塊。

按照unix一切皆是文件的設計哲學,外設的驅動模塊和TCP/IP協議,都是隸屬于文件系統的子模塊。

shell(命令解釋器)不屬于OS內核,而是一個用來解釋命令的用戶態程序。

當然,shell對系統的使用來說是必需的。

在文件系統的API基礎上,實現列目錄、創建目錄、創建文件之類的功能并不難。

當然,這些命令實現起來的工作量,比讓一個8000行的OS內核運行起來還大。

3、編譯器

光一個語法分析就可能超過1萬行!

如果語法像C++那么復雜,那語法分析的代碼量更大。

(如果用第三方的正則表達式庫的話,第三方庫的代碼也沒有低于1萬行的)

而且編譯器的實現中有一些非常別扭的地方,例如C++的如下代碼:

vector<vector<A> > vecA;
vector<vector<A>> vecA;

兩個> >之間必須有一個空格,否則g++是會報錯的。

之所以會這樣是鍵盤上的符號太少了,而C++的語法太復雜,在編碼上實在應付不過來了。

另外,編譯器的后端也有一些非常復雜的模塊,例如:指針分析、自動內存管理、循環分析、寄存器分配、goto的處理,等等。

還有一種是并行分析:

for (i = 0; i < N; i++)
a[2*i+1] = a[2*i];

顯然,N個源位置與N個目的位置是不可能相同的,所以它可以并行復制數據。

人一眼就可以看出來源位置與目的位置的數組讀寫是不相關的,但用代碼怎么判斷?

要用整數線性規劃。

運籌學上有這一章,龍書(編譯原理)里也有提到,我也曾經學過但都忘了?

虛擬機和操作系統真只是工作量大,論難度還是編譯器和MATLAB!

我的gitee上也有一個bochs上的內核demo,有興趣的可以看看,實現起來比scf簡單多了。

scf編譯器的后端只加了必需的模塊,都寫了4萬行代碼。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-04-26 07:51:36

虛擬機操作系統進程

2023-02-07 00:24:24

2009-12-22 16:05:05

Linux操作系統

2010-02-06 15:21:34

2022-11-09 08:12:18

操作系統CPU編譯器

2025-02-05 08:38:37

2010-07-02 12:32:42

Meego開發

2019-08-05 14:23:32

虛擬機操作系統軟件

2011-04-13 17:31:33

2015-05-12 10:34:45

2016-09-30 15:40:36

容器虛擬化

2009-09-07 22:01:52

虛擬機安裝Linux系

2009-08-07 11:06:07

虛擬機安裝Vista系統

2022-01-07 17:28:07

操作系統IO 內存

2012-05-18 10:22:23

2021-10-06 19:02:36

Keil編譯器Armclang

2020-06-03 14:43:26

Java虛擬機JVM

2009-09-09 08:05:51

優化VMware Se

2019-01-25 18:28:38

Windows 10VMware雙顯示器

2010-02-04 10:47:29

Dalvik移植技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久精品国产毛片 | 精品乱人伦一区二区三区 | 亚洲精品美女 | 午夜精品一区二区三区免费视频 | 一区二区三区观看视频 | av一二三区 | 久久人人网 | 亚洲免费网站 | 精品国产乱码一区二区三区 | 免费在线观看一区二区三区 | 精彩视频一区二区三区 | 久久噜噜噜精品国产亚洲综合 | 天天碰日日操 | 日韩在线免费 | 精品二区视频 | 一区二区三区免费观看 | 精品91av| 成年人在线观看 | 久久精品免费 | 在线成人免费视频 | 欧美又大粗又爽又黄大片视频 | 国产成人精品一区二 | 国产一区二区三区 | 丁香六月激情 | 雨宫琴音一区二区在线 | av中文在线 | 亚洲国产一 | 欧美一区二区三区在线 | 伊人影院99 | av网站免费观看 | 亚洲国产一区二区三区 | 99久久久久久久久 | 国产成人精品a视频一区www | 日本一区二区三区四区 | 欧美福利| 在线成人免费观看 | 一级毛片网 | 午夜精品一区 | 亚洲精品久久久久久久久久久 | 久久国产精品一区二区三区 | 天天干天天玩天天操 |