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


相关链接


相关文章
|
存储 Java 测试技术
JAVA-MAVEN初学者教程(配置、pom.xml、依赖管理等)
JAVA-MAVEN初学者教程(配置、pom.xml、依赖管理等)
3844 0
|
消息中间件 存储 NoSQL
一文读懂Kafka Connect核心概念
Kafka Connect 是一种用于在 Apache Kafka 和其他系统之间可扩展且可靠地流式传输数据的工具。 它使快速定义将大量数据移入和移出 Kafka 的连接器变得简单。 Kafka Connect 可以摄取整个数据库或从所有应用程序服务器收集指标到 Kafka 主题中,使数据可用于低延迟的流处理。 导出作业可以将数据从 Kafka 主题传送到二级存储和查询系统或批处理系统进行离线分析。
|
机器学习/深度学习 算法 编译器
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
【C++ 泛型编程 中级篇】深度解析C++:类型模板参数与非类型模板参数
453 0
|
8月前
|
人工智能 自然语言处理 JavaScript
Playwright MCP:AI驱动自动化测试,轻松告别传统脚本编写
本文介绍如何结合Playwright与MCP协议实现对话式UI自动化测试。通过自然语言指令驱动浏览器操作,显著降低脚本编写门槛,提升测试效率。文章涵盖环境配置、核心功能及实战案例,为构建智能自动化测试方案提供完整指南。
|
4月前
|
弹性计算 人工智能 运维
阿里云服务器购买:38元1年200M轻量和99元1年云服务器ECS如何选择?配置全解析
阿里云38元/年200M轻量服务器(新用户秒杀)与99元/年ECS经济型e实例如何选?本文对比核心配置:前者峰值带宽高、一键部署、运维零门槛,适合新手建站;后者固定带宽稳、弹性扩展强、可对接RDS等企业服务,适合长期稳定使用。按场景对号入座,不花冤枉钱。(239字)
523 1
|
5月前
|
弹性计算 Linux 对象存储
如何在阿里云服务器上传或下载文件?Linux和Windows操作指南2026最新
本文详解阿里云ECS服务器文件上传/下载全场景方案:涵盖Linux/Windows系统,分日常小文件、大文件、多实例分发、无公网实例及实例间传输五大场景,对比Workbench、WinSCP、SFTP、远程桌面、对象存储等10+方法,含操作步骤、限制条件与适用建议。
|
编译器 C语言
成功解决“Run-Time Check Failure #2 - Stack around the variable ‘arr‘ was corrupted.“问题
成功解决“Run-Time Check Failure #2 - Stack around the variable ‘arr‘ was corrupted.“问题
1186 1
|
Oracle Java API
虚拟线程:Java的新利器?
作者通过本文梳理了自己对虚拟线程的理解,顺便捋一捋Java线程的过去、现在和未来。ps:写这篇文章的时候,Java 19刚刚发布,而现在Java 21已经正式GA了,不过虚拟线程的API和底层实现并没有什么变化。
|
人工智能 Java API
Java 生态大模型应用开发全流程实战案例与技术路径终极对决
在Java生态中开发大模型应用,Spring AI、LangChain4j和JBoltAI是三大主流框架。本文从架构设计、核心功能、开发体验、性能扩展性、生态社区等维度对比三者特点,并结合实例分析选型建议。Spring AI适合已有Spring技术栈团队,LangChain4j灵活性强适用于学术研究,JBoltAI提供开箱即用的企业级解决方案,助力传统系统快速AI化改造。开发者可根据业务场景和技术背景选择最适合的框架。
2731 2
|
监控 编译器 C++
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
1021 0