Yin 語言:學習設計和實現一門編程語言

Yin 但願能讓程序員天然而然地表達他們的想法,它嘗試解決以下問題:git

  • 大多數語言沒能吸收歷史教訓
  • 大多數語言受到宗教性的推崇,擁有一個過於狂熱的社區,所以難以改正本身的錯誤
  • 有些語言爲程序員作得太少,有些語言爲程序員作得太多
  • 有些語言提供了太少的抽象,有些語言提供了太多的抽象
  • 有些語言太不顧及可用性,遊戲語言過於重視可用性而忽視了可用性以外的東西
  • 有些語言從數學和邏輯那裏學得太少,有些語言學得太多
  • 有些語言太不顧及類型,有些語言對類型考慮過多

解決這些問題須要不少程序員的經驗。所以 Yin 歡迎程序員貢獻經驗和觀點,以便作出最好的決策。程序員

狀態

目前 Yin 語言處於設計階段,不少設計上的決定已經作了,不少還沒作。若是你但願學習如何設計和實現一門語言,那麼 Yin 語言值得一看。github

已實現的特性

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

已實現的工具

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

等待實現

  • 測試框架
  • 編譯器
  • 運行時環境

示例

數組

[1 2 3 4 5]

表達式

(* (+ 2 3) 4)

yin 語言採用了 lisp 所使用的基於 S 表達式的語法,這是由於做者認爲 lisp 的基於 S 表達式的語法是最簡單、最好看的語法segmentfault

  • 避免「歧義」,無需記憶運算符優先級
  • 基本算術操做和函數調用在語法上達成完美統一
  • 前綴表達式和括號,更容易對齊,於是更美觀

類型系統

(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
  (fun ([x Int] [-> Bool])
    (if (= x 0)
        false
        (if (= x 1)
            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 許可。

相關連接


原文 The Yin Programming Language
編譯 SegmentFault

相關文章
相關標籤/搜索