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 许可。


相关链接


相关文章
|
编译器 API C语言
深入探究Qt与C++标准的兼容之旅
深入探究Qt与C++标准的兼容之旅
1249 3
|
5月前
|
Linux iOS开发 MacOS
硬盘分区怎么做?这几款分区工具新手也能轻松上手
本文介绍了五款实用的硬盘分区工具,满足不同用户需求。Windows用户可使用内置的磁盘管理器或DiskPart命令行工具,简单易上手;DiskGenius功能全面,适合进阶用户进行复杂操作和数据恢复;Mac用户可借助Disk Utility完成基本磁盘管理任务;Linux用户及高级玩家可选择开源工具GParted,支持多种文件系统并具备高度自由度。根据自身需求和技术水平选择合适的工具,可高效完成硬盘分区与管理。
|
SQL 关系型数据库 MySQL
mysql数据库——连接查询(内连接:自然连接,等值连接。外连接:左连接,右连接,全连接)
mysql数据库——连接查询(内连接:自然连接,等值连接。外连接:左连接,右连接,全连接)
2532 0
mysql数据库——连接查询(内连接:自然连接,等值连接。外连接:左连接,右连接,全连接)
|
Oracle Java API
虚拟线程:Java的新利器?
作者通过本文梳理了自己对虚拟线程的理解,顺便捋一捋Java线程的过去、现在和未来。ps:写这篇文章的时候,Java 19刚刚发布,而现在Java 21已经正式GA了,不过虚拟线程的API和底层实现并没有什么变化。
|
Rust Shell 索引
使用阿里云镜像加速Rust与Cargo安装及更新
使用阿里云镜像加速Rust与Cargo安装及更新
9880 2
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
566 0
|
SQL 算法 API
NiceGui:Python中的轻量级GUI框架初体验
NiceGui:Python中的轻量级GUI框架初体验
1434 0
|
安全 关系型数据库 网络安全
rds公共网络/公网访问
RDS公网访问允许用户通过互联网连接云数据库,但默认关闭以确保安全。需手动开启并配置公网IP或域名,使用时需注意安全风险,如设置严格防火墙规则、启用SSL/TLS加密和强化身份验证。公网访问可能产生带宽、IP及附加服务费用。内网访问是更安全、经济的选择,除非特定场景(如使用Linked Server功能)需公网访问。在实施时,应权衡安全、成本和需求。
717 1
|
XML API 数据格式
【Qt 学习笔记】QWidget的enable属性 | API的介绍
【Qt 学习笔记】QWidget的enable属性 | API的介绍
413 0