1. 程式人生 > >腳本語言與編譯型語言

腳本語言與編譯型語言

匯編 直接 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)了, 更快了

腳本語言與編譯型語言