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