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、依赖管理等)
3692 0
|
NoSQL 网络协议 数据库
为什么 Lettuce 会带来更长的故障时间
本文详述了阿里云数据库 Tair/Redis 将使用长连接客户端在非预期故障宕机切换场景下的恢复时间从最初的 900s 降到 120s 再到 30s的优化过程,涉及产品优化,开源产品问题修复等诸多方面。
71101 11
为什么 Lettuce 会带来更长的故障时间
|
2月前
|
弹性计算 人工智能 运维
阿里云服务器购买:38元1年200M轻量和99元1年云服务器ECS如何选择?配置全解析
阿里云38元/年200M轻量服务器(新用户秒杀)与99元/年ECS经济型e实例如何选?本文对比核心配置:前者峰值带宽高、一键部署、运维零门槛,适合新手建站;后者固定带宽稳、弹性扩展强、可对接RDS等企业服务,适合长期稳定使用。按场景对号入座,不花冤枉钱。(239字)
370 1
|
11月前
|
机器学习/深度学习 存储 算法
如何判断两张图片的相似度?原来图片对比也可以如此简单!
本文介绍了图片对比技术在多个场景中的应用,如图片去重、内容审核、版权维权及相似图片搜索,并详细解析了两种主流的图片对比方法。第一种是**MD5指纹对比**,适合精确匹配完全相同的图片,具有速度快、简单易用的特点,但对稍作修改的图片无能为力。第二种是**图像哈希对比**,包括平均哈希、感知哈希等算法,能够判断图片的相似程度,适用于处理缩放、旋转或亮度调整后的图片,但在语义相似性上仍有局限。最后提到,随着机器学习和深度神经网络的发展,图片相似度判断技术将有更多可能性,值得进一步探索。
3356 6
如何判断两张图片的相似度?原来图片对比也可以如此简单!
|
Oracle Java API
虚拟线程:Java的新利器?
作者通过本文梳理了自己对虚拟线程的理解,顺便捋一捋Java线程的过去、现在和未来。ps:写这篇文章的时候,Java 19刚刚发布,而现在Java 21已经正式GA了,不过虚拟线程的API和底层实现并没有什么变化。
|
监控 编译器 C++
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
【代码讲解】【C/C++】获取文件最后修改的时间(系统时间)
948 0
|
API Docker 容器
如何免费获取 ChatGPT API Key?
上篇文章介绍了NextChat项目,只需配置ChatGPT API Key即可拥有私人ChatGPT网页应用。本文继续介绍免费获取API Key的来源——GPT_API_free,一个拥有13.6K Star的Github开源项目。需用Github账号绑定领取Key,支持gpt-3.5-turbo、embedding、gpt-4,但gpt-4每天限3次调用。GPT_API_free也提供付费版API,以支持项目持续运营。
10036 0
如何免费获取 ChatGPT API Key?
|
机器学习/深度学习 数据采集 人工智能
深度学习的魔法:用神经网络识别手写数字
本文将引导读者了解如何使用深度学习技术,特别是卷积神经网络(CNN)来识别手写数字。我们将从基础理论出发,逐步深入到实际操作,包括数据的预处理、模型的构建和训练,以及结果的评估。通过本文,读者不仅能掌握使用深度学习进行图像识别的技能,还能理解其背后的原理。让我们一同揭开深度学习的神秘面纱,探索其在图像处理领域的无限可能。
|
存储 缓存 Linux
LDAP学习笔记之一:Centos7安装389-DS(RHDS)
LDAP学习笔记之一:Centos7安装389-DS(RHDS)
|
Web App开发 JSON 小程序
苹果app开发apple-app-site-association文件配置
apple-app-site-association 是苹果的配置文件,用于建立app和网站关联,支持Universal Links,使点击网站链接能直接打开相应app内部页面。配置文件为JSON格式,需上传至服务器`.well-known`目录或根目录。通过检查三个链接来测试配置,确保Content-Type为`application/json`。成功配置后,点击链接能在iPhone备忘录或Safari中直接唤起app,但可能有24-48小时延迟。

热门文章

最新文章