回覆列表
  • 1 # 使用者8712676532695

    回答這個問題之前首先要理清4個概念:靜態語義,動態語義,解釋執行,編譯執行

    01 靜態語義:在程式執行之前就能確定語義,也即是這部分語義與程式的輸入和執行環境無關

    例子:

    Int a

    Int b

    if a > b then True else False

    02 動態語義:在程式執行的時候才能確定的語義,與程式的輸入和執行環境相關

    最極端的例子:eval函式,把程式執行時候的輸入來作為程式碼執行

    更常見但沒那麼極端的例子:if a > b then True else False

    注意這裡的a和b並沒有被宣告為Int型別,它們是整數,浮點數,甚至是字串只能在程式執行的時候才知道,因此這段程式的語義也只能在程式執行的時候才能確定

    03 解釋執行:也即是直譯器的工作方式,直譯器裡面有一系列的小函式(或者小分支)對應目標語言的基礎語義,也即是說,執行這些函式得到的效果和目標語言是完全一樣的。每遇到一個目標語言的語句,就以相應的引數執行對應這些語句語義的函式

    04 編譯執行:編譯器遇到目標語言的語句,將其翻譯成為語義上相等的“低層語言”,交由下層(可能是裸機,也可能是虛擬機器)去執行

    λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ 分割線 λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ

    01 原則上,每一門語言都可以完全由直譯器或者完全由編譯器來實現

    直譯器不必多說,因為直譯器總是執行在程式執行的時候,因此任何語言都可以完全由直譯器來實現。

    編譯器解釋一下:

    第一種編譯器實現策略,是對於一門語言的靜態語義部分,用編譯器在程式執行之前將其編譯,然後,將其動態語義部分留待RTS系統來解釋執行,因此,RTS可以視為一門語言的動態語義的直譯器

    第二種編譯器實現策略,是在程式執行的時候(此時程式語義完全確定),對程式進行“即時編譯”。因此,原則上程式是可以完全編譯執行的,但通常而言並不全部編譯成程式碼,總有一部分動態語義交由RTS來處理

    02 需要認真考慮,具體說就是考慮:你這門語言裡要多少靜態語義,要多少動態語義

    既然所有語言都可以編譯執行和解釋執行,為什麼還需要考慮靜態語義和動態語義的問題

    A 對於程式執行時候的開銷而言,解釋執行的開銷最大,即時編譯次之,如果一門語言大多數是靜態語義,那麼它的效能可以提到很極致,同時程式的開銷可以非常確定(這點對於嵌入式系統很重要);反過來,某些動態語義可以讓程式具備高度的靈活性

    B RTS自身的編寫也是一個微妙的問題,一般來說,RTS總是用匯編語言語義相等(或者是其子集)的語言(比如說C)來編寫,你不會用一個有RTS的語言來寫RTS(原因你懂得)。順便提一句,RUST語言為什麼在新語言裡面獨一無二,就是因為它沒有動態語義,不需要RTS

    λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ 分割線 λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ

  • 中秋節和大豐收的關聯?
  • 去韻如何互換?詞常識中平韻與上?