资讯专栏INFORMATION COLUMN

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

afishhhhh / 2259人阅读

摘要:状态目前语言处于设计阶段,很多设计上的决定已经做了,很多还没做。如果你希望学习如何设计和实现一门语言,那么语言值得一看。以后,语言将能够解释自己,从而能使用自身实现编译器,也就是自举。

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

大多数语言没能吸取历史教训

大多数语言受到宗教性的推崇,拥有一个过于狂热的社区,因此难以改正自己的错误

有些语言为程序员做得太少,有些语言为程序员做得太多

有些语言提供了太少的抽象,有些语言提供了太多的抽象

有些语言太不顾及可用性,游戏语言过于重视可用性而忽视了可用性之外的东西

有些语言从数学和逻辑那里学得太少,有些语言学得太多

有些语言太不顾及类型,有些语言对类型考虑过多

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

状态

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

已实现的特性

基本类型(整型、浮点、数组、记录)

基本操作符(算术)

作为一等公民的函数(闭包)

类型系统(不完整,union type)

已实现的工具

解析器

解释器

类型检测

等待实现

测试框架

编译器

运行时环境

示例 数组
[1 2 3 4 5]
表达式
(* (+ 2 3) 4)

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

避免“歧义”,无需记忆运算符优先级

基本算术操作和函数调用在语法上达成完美统一

前缀表达式和括号,更容易对齐,因而更美观

类型系统
(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 许可。

相关链接

GitHub主页

Google groups 讨论组

Yin 语言的缘起

原文 The Yin Programming Language
编译 SegmentFault

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64086.html

相关文章

  • 软件开发入门学习的个人看法。

    摘要:兴趣最后该说说的就是兴趣问题如果你能对它真正感兴趣如果要从事软件开发又没兴趣的话赶紧先培养兴趣去对看技术资料就想别人看武侠小说看球赛一样的话再配合上面提到的几点踏实先专后广基础扎实相信在这一行多少是可以做点东西出来的   踏实   偶然在网上看到《由C#风潮想起的-给初学编程者的忠告》一文. 其中一个角度:避免浮躁,倡导踏实的学习方法,我是很认同的,但总觉该文作者标题-给初学编程者的忠...

    wh469012917 评论0 收藏0
  • 软件开发入门学习的个人看法。

    摘要:兴趣最后该说说的就是兴趣问题如果你能对它真正感兴趣如果要从事软件开发又没兴趣的话赶紧先培养兴趣去对看技术资料就想别人看武侠小说看球赛一样的话再配合上面提到的几点踏实先专后广基础扎实相信在这一行多少是可以做点东西出来的   踏实   偶然在网上看到《由C#风潮想起的-给初学编程者的忠告》一文. 其中一个角度:避免浮躁,倡导踏实的学习方法,我是很认同的,但总觉该文作者标题-给初学编程者的忠...

    AlexTuan 评论0 收藏0
  • 如何系统地自学 Python?

    摘要:这里推荐一本书源码剖析源码剖析豆瓣这本书把源码中最核心的部分,给出了详细的阐释,不过阅读此书需要对语言内存模型和指针有着很好的理解。   是否非常想学好 Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓?   幸运的是,Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。   Python 的设计哲学之一就是...

    zgbgx 评论0 收藏0
  • 《JavaScript设计模式与开发实践》 —— <阅读小札·一>

    摘要:阅读小札一阅读前自大学课上,就开始接触设计模式,但对设计模式却鲜有研究与实践。第二部分是核心部分,由浅到深讲解个设计模式。设计模式遵循的原则所有设计模式罪训的一条原则就是找出程序中变化的地方,并将变化封装起来。 阅读小札 · 阅读前 自大学Java课上,就开始接触设计模式,但对设计模式却鲜有研究与实践。最近向公司反映和游说技术提升,得以获得公司提供购书机会,借此认真学习前端学习之路的...

    Yangder 评论0 收藏0
  • 如何成为一名优秀的web前端工程师(前端攻城师)?

    摘要:我从没有听到有人问如何做一名优秀甚至卓越的前端工程师。作为一个优秀的前端工程师还需要深入了解以及学会处理的这些缺陷。再者,优秀的前端工程师需要具备良好的沟通能力,因为前端工程师至少都要满足四类客户的需求。   我所遇到的前端程序员分两种:   第一种一直在问:如何学习前端?   第二种总说:前端很简单,就那么一点东西。   我从没有听到有人问:如何做一名优秀、甚至卓越的WEB前端工程师...

    Turbo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<