Yin 语言:学习设计和实现一门编程语言

简介: 大多数语言没能吸取历史教训大多数语言受到宗教性的推崇,拥有一个过于狂热的社区,因此难以改正自己的错误有些语言为程序员做得太少,有些语言为程序员做得太多有些语言提供了太少的抽象,有些语言提供了太多的抽象有些语言太不顾及可用性,游戏语言过于重视可用性而忽视了可用性之外的东西有些语言从数学和逻辑那里学得太少,有些语言学得太多有些语言太不顾及类型,有些语言对类型考虑过多

Yin 希望能让程序员自然而然地表达他们的想法,它尝试解决如下问题:

  • 大多数语言没能吸取历史教训
  • 大多数语言受到宗教性的推崇,拥有一个过于狂热的社区,因此难以改正自己的错误
  • 有些语言为程序员做得太少,有些语言为程序员做得太多
  • 有些语言提供了太少的抽象,有些语言提供了太多的抽象
  • 有些语言太不顾及可用性,游戏语言过于重视可用性而忽视了可用性之外的东西
  • 有些语言从数学和逻辑那里学得太少,有些语言学得太多
  • 有些语言太不顾及类型,有些语言对类型考虑过多


解决这些问题需要很多程序员的经验。因此 Yin 欢迎程序员贡献经验和观点,以便做出最好的决策。

image.png


状态

目前 Yin 语言处于设计阶段,很多设计上的决定已经做了,很多还没做。如果你希望学习如何设计和实现一门语言,那么 Yin 语言值得一看。


已实现的特性

  • 基本类型(整型、浮点、数组、记录)
  • 基本操作符(算术)
  • 作为一等公民的函数(闭包)
  • 类型系统(不完整,union type)


已实现的工具

  • 解析器
  • 解释器
  • 类型检测


等待实现

  • 测试框架
  • 编译器
  • 运行时环境


示例

数组

[1 2 3 4 5]

表达式

(* (+23) 4)

yin 语言采用了 lisp 所使用的基于 S 表达式的语法,这是因为作者认为 lisp 的基于 S 表达式的语法是最简单、最好看的语法

  • 避免“歧义”,无需记忆运算符优先级
  • 基本算术操作和函数调用在语法上达成完美统一
  • 前缀表达式和括号,更容易对齐,因而更美观


类型系统

(define fact

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

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

(fact5)                                -- 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))))))

(even10)  -- true

(even11)  -- false

(odd10)   -- false

(odd11)   -- true

实现

Yin 最初使用 Typed Racket 实现,然而由于 Racket 系统报错信息的不精确,造成比较低的开发效率,因此后来换成了 Java。得益于简单的语法设计,Yin 的具有精确报错定位能力的解析器,实现只花了 2 小时,500 行 Java,且不依赖 Lex、Yacc 类工具。以后,Yin 语言将能够解释自己,从而能使用自身实现编译器,也就是自举。


许可

Yin 语言是开源的,使用 AGPLv3 许可。


相关链接


相关文章
|
存储 数据格式
|
存储
第三章:C51 编程语言
第三章:C51 编程语言
62 0
|
4月前
|
JavaScript 前端开发 Java
IT入门知识第二部分《编程语言》(2/10)
IT入门知识第二部分《编程语言》(2/10)
35 0
|
6月前
|
C语言
C 语言解 常见编程题(下)
C 语言解 常见编程题
71 0
|
6月前
|
C语言
C 语言解 常见编程题(上)
C 语言解 常见编程题
72 0
如何更好的学习一门计算机语言
如何更好的学习一门计算机语言
51 1
|
存储 程序员
程序设计语言基础知识
程序设计语言是计算机程序员用来编写计算机程序的语言。它们是由计算机科学家和工程师开发的,用于描述计算机程序的结构、语法和语义。程序设计语言是计算机科学中的核心概念之一,因为它们允许程序员使用抽象概念来描述计算机程序,从而使程序员能够更容易地编写、理解和维护程序。本文将介绍程序设计语言的基础知识,包括语法、语义、数据类型和控制结构等。 1. 语法 程序设计语言的语法是描述程序结构的规则集合。语法规则定义了程序中的元素,如变量、常量、运算符、函数和语句等,并规定了这些元素如何组合成程序。语法规则通常由一组文法规则来描述,这些规则用于指定程序中的符号、终止符号和非终止符号等。例如,下面是一个简单
160 0
让我设计一门编程语言或开发一套解决框架
让我设计一门编程语言或开发一套解决框架
91 2
|
前端开发 JavaScript 数据可视化
一门娴熟灵活的编程语言
JavaScript是一种高级编程语言,是Web开发中不可或缺的核心技术之一。由于其娴熟且灵活的特性,它已成为构建交互式用户界面、开发服务器端应用程序和移动应用的首选语言。本文将深入探讨JavaScript的重要特性和用途,以帮助读者更好地理解和应用这门编程语言。
|
存储 开发框架 Cloud Native
【C#基础】初识编程语言C#
编程语言C#和.NET平台的介绍以及如何写出自己第一个C#程序。
115 0