程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> 瞎侃編譯和解釋

瞎侃編譯和解釋

編輯:VC++

  早上起床無聊,所以寫點什麼來浪費能量。

  從cpu到操作系統
  
  cpu能夠執行的是二進制表示的指令,確切的說是基本指令。然後cpu中有一些微代碼,然後就把一些非基本指令也作為指令一樣能夠用了,而cpu內部會對這些復雜的指令進行解釋。而操作系統架在硬件之上,又提供了一些服務和操作。最常見的是對於磁盤文件,或者進程線程這些東西的支持。其實是又一次擴展了你能夠使用的功能,但是又限制了一些你的權限,比如你不能直接指定地址的進行寫入之類的。而你對於一個磁盤文件讀寫功能的調用,表現出來可能是用unix中的某些強大的系統提供的小工具,然後利用進程間通信的管道之類的東西得到輸出。也可能是利用win32中的一些系統提供的dll,利用裡面的c的函數提供的一些api。還又可能是你直接用匯編調用中斷,直接讓操作系統處理中斷得到結果。可以看到,從系統小工具,到api到系統中斷,之間都有封裝。而封裝其實是一種解釋,也就是你調用的是一些比如是ReadFile的api,然後這個操作並不是靜態的成為二進制代碼在編譯期就成為指令一類的東西,而是在運行的時候由操作系統來解釋,從而執行。所以說常用的封裝其實是一種解釋執行的辦法。當然,就是連系統中斷其實都要認為是解釋了,按照這樣的說法。
  
  從源代碼到可執行文件
    
  另一個要注意解釋的是運行在操作系統上的二進制表達的可執行文件和字符表達的源代碼之間。這個是最常見的解釋和編譯進行辨析的地方。從匯編源代碼到可執行文件是非常著名的編譯了,是的的卻卻的編譯。c的源代碼也是。c++的也是,不過c++的某些東西就不完全是了,比如異常的處理。可以看到是需要運行時支持的功能都是不能完全靜態翻譯的,需要動態的解釋。而最早的basic就是純粹的解釋執行了,你輸入源代碼然後解釋器一行一行的讀,然後給出輸出。
  
  在編譯和解釋之間玩平衡
  
  最好玩的是在解釋和編譯直接玩平衡。python和java這些都是。他們在解釋之前進行了一定的編譯,比如java把源代碼變成byte code的.class文件,python也有類似的pyc文件,其實也就是能夠在運行的時候省去了語法和結構的分析,直接執行的是一種中間的語言。其實是把解釋分成了編譯和解釋兩部分。編譯的結果是另外一種語言,而解釋的就是那種中間語言了。只是中間語言比純粹人類都能夠看懂的源代碼更加適合運行時快速的解釋執行。但是java在真正解釋的時候又弄了一些小花招,那就是所謂的just in time的技術。它預先讀取一些byte code表示的代碼,然後在你執行到那兒之前把那些byte code翻譯成為本地的機器碼,從而使得真正執行到的時候速度很快。奧妙就在於預先讀取和預先編譯。這個是真正有新意的把解釋和編譯進行融合的做法。而使用的技術和cpu的緩存優化技術很像。甚至受到這個啟發,我們還能夠把cpu中的pipeline和數據指令雙緩存的技術給用到對於解釋語言的解釋執行之中。

  總之,解釋和編譯其實都非常有用。而且大家平時並沒有注意到很多東西都非別是什麼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved