天天看點

Yin 語言:學習設計和實作一門程式設計語言

Yin

希望能讓程式員自然而然地表達他們的想法,它嘗試解決如下問題:

  • 大多數語言沒能吸取曆史教訓
  • 大多數語言受到宗教性的推崇,擁有一個過于狂熱的社群,是以難以改正自己的錯誤
  • 有些語言為程式員做得太少,有些語言為程式員做得太多
  • 有些語言提供了太少的抽象,有些語言提供了太多的抽象
  • 有些語言太不顧及可用性,遊戲語言過于重視可用性而忽視了可用性之外的東西
  • 有些語言從數學和邏輯那裡學得太少,有些語言學得太多
  • 有些語言太不顧及類型,有些語言對類型考慮過多

解決這些問題需要很多程式員的經驗。是以 Yin 歡迎程式員貢獻經驗和觀點,以便做出最好的決策。

Yin 語言:學習設計和實作一門程式設計語言

狀态

目前 Yin 語言處于設計階段,很多設計上的決定已經做了,很多還沒做。如果你希望學習如何設計和實作一門語言,那麼 Yin 語言值得一看。

已實作的特性

  • 基本類型(整型、浮點、數組、記錄)
  • 基本操作符(算術)
  • 作為一等公民的函數(閉包)
  • 類型系統(不完整,union type)

已實作的工具

  • 解析器
  • 解釋器
  • 類型檢測

等待實作

  • 測試架構
  • 編譯器
  • 運作時環境

示例

數組

[1 2 3 4 5]

表達式

(* (+ 2 3) 4)

yin 語言采用了 lisp 所使用的基于 S 表達式的文法,這是因為作者認為 lisp 的基于 S 表達式的文法是

最簡單、最好看的文法

  • 避免“歧義”,無需記憶運算符優先級
  • 基本算術操作和函數調用在文法上達成完美統一
  • 字首表達式和括号,更容易對齊,因而更美觀

類型系統

(define fact

  (fun ([x Int] [-> Int])

    (if (= x 0) 1 (* x (fact (- x 1))))))

(fact 5)                                -- 120

--

表示注釋。

if 同樣是函數,第一個參數是條件,第二個參數是條件成立時的表達式,第三個參數是條件不成立時的表達式。

函數采用如下格式:

(fun ([x 輸入類型] [-> 輸出類型]) 函數體)

使用

define

綁定函數的名字。

交替遞歸

判斷奇偶性的函數:

(define even

  (fun ([x Int] [-> Bool])

    (if (= x 0)

        true

        (if (= x 1)

            false

            (odd (- x 1))))))

(define odd

        false

            true

            (even (- x 1))))))

(even 10)  -- true

(even 11)  -- false

(odd 10)   -- false

(odd 11)   -- true

實作

Yin 最初使用 Typed Racket 實作,然而由于 Racket 系統報錯資訊的不精确,造成比較低的開發效率,是以後來換成了 Java。得益于簡單的文法設計,Yin 的具有精确報錯定位能力的解析器,實作隻花了 2 小時,500 行 Java,且不依賴 Lex、Yacc 類工具。以後,Yin 語言将能夠解釋自己,進而能使用自身實作編譯器,也就是自舉。

許可

Yin 語言是開源的,使用 AGPLv3 許可。

相關連結