腳本語言與編譯型語言
阿新 • • 發佈:2018-10-12
匯編 直接 vmware 通過 方式 中間 形式 編譯 沒有
不同
- 編譯型語言:
- 編譯型程序所生成的指令時二進制形式的機器碼和操作數, 就是所謂的二進制流, 二進制程序是CPU可以直接識別執行的
- 解釋性語言:
腳本語言的解釋器是二進制形式的, 可以被CPU直接識別的, 但是腳本解釋器的輸入是腳本語言字符串, CPU執行腳本語言解釋器, 而腳本語言解釋器去執行腳本語言, 中間隔了一層, 腳本程序是通過CPU間接運行的
- 腳本語言的兩大類:
- 一邊解釋一邊執行-->所以不會有opcode生成
- 分析整個文件後創建抽象語法樹生成opcode, 有了指令之後讓解釋器去執行opcode(包括操作碼和操作數), 這就相當於CPU執行匯編語言一樣
- ==== 華麗的分割線 =====
- 解釋器可以理解為一個虛擬機, 虛擬機的有兩類, 一個是類似於Python的虛擬機一樣只模擬CPU; 另一個是類似於VMware一樣, 用來虛擬操作系統的, 使用數組作為寄存器, 文件作為硬件
為什麽腳本語言會慢
- 腳本語言需要兩次IO, 而編譯型則需要一次IO
- 在腳本語言中, CPU將腳本解釋器從硬盤加載到內存中, 腳本解釋器又將腳本程序從硬件中加載到內存中; 而編譯型語言本身就是一個二進制程序, CPU將其加載到內存中, CPU就直接執行了
- 另一個原因還跟腳本語言的解釋方式
- 在一邊解釋一邊執行的腳本語言中:
- CPU操作的是字符串, 沒有編譯的操作, 我們只要比較字符串需要時間復雜度為O(n), 而數字為O(1), 所以需要比較n次才能確定一個操作碼, 太慢了
- 在先編譯再執行中(Python)
- 將文件編譯, 裏面的字符串都轉換為數字, 這樣時間復雜度就是O(1)了, 更快了
- 在一邊解釋一邊執行的腳本語言中:
腳本語言與編譯型語言