Skip to main content

设计和开发 Yin 语言

现在的计算机太复杂,太不可靠,太费事了,建立在一堆历史遗留的,摇摇欲坠的基础之上。我有一个梦想,那就是从头设计出一套完整的,简单的,强大 的,高可靠的计算机软件系统。从程序语言,操作系统,数据库,一直到各种应用。而这其中,程序语言的设计又是至关重要的。在过去的很多年里,我饱尝了程序 语言设计的各种思路,并且把它们延展到我曾经熟悉的操作系统数据库。我发现一个良好的程序语言,可以让操作系统和数据库变得“透明”。程序员和用户不需要知道很多系统底层细节就能编程和使用。Yin 语言就是为这个目标而诞生的,我希望它能让每一个有正常智力的人都能编程。
在过去的几个月里由于工作太忙,我只抽出几天时间来开发 Yin。虽然它目前的状况貌似只是万里长征的第一步,然而因为它彻底的丢弃了历史的包袱,没有做很多不必要的事情,再加上我多年研究和实现语言的经验,在 那短短几天的时间里,它的设计已经达到了比较深入的地步。举个例子,由于我的语法设计极其简单,所以我实现 parser 只花了两个小时,500 行 Java 代码,并且没有依靠任何 LEX,YACC 一类的工具。Yin 目前的代码已经具有一个具有精确报错定位能力的 parser,一个基本的解释器,一个带有 union type 的类型系统。目前语言的大方向已定,但还有很多小的设计决策没有定下来(比如是否需要 keyword argument 之类),也有少许 over-engineering(差点做成了 dependent type),而且还需要一个编译器和运行时系统。
从来没有一个项目可以让我如此兴奋。虽然总是受到生活的各种牵绊和限制,然而这个梦想是不可磨灭的。我希望 Yin 语言可以让用它的人翻身做语言的主人。过去的程序语言,操作系统和数据库,都把程序员甚至用户当成奴仆,把自己的设计,自己的“哲学”强加于他们之上。让 程序员和用户去“学习”,而其实很大程度上是学习绕过它们自己的设计失误。这样的作法造就了 IT 业今天的心理状况,形成了不尊重人,不人性化的所谓“黑客精神”。我希望 Yin 语言及其相关系统的出现,能够打破这种局面。为此,我决定做出以下一些改进。

开放的知识系统

Yin 语言从设计一直到实现,不仅完全开源,而且完全开放其知识系统。Yin 不使用工业界采用的含混复杂的概念,也不采用 PL 学术界过度逻辑化,符号化,不考虑实际效率的的理论。Yin 的设计,理论和实现细节,都从最根本的“第一原则”(first principles)出发,从而容易被程序员自己掌握。我试图从直觉上告诉人们每一个地方为何那样设计的理由,而不只是像某些语言那样告诉程序员:“我 就是这么决定的!”
这样的做法使得程序员真正的成为语言的主人,而不是它的奴隶。任何掌握了这些设计和实现技巧的人,都能够实现出自己的语言。没有到这一步的人,也能 基本的理解语言的实现原理,从而帮助他们写出更好的程序。这样一来,程序员成为了自己的上帝,就让他们完全摆脱了通常语言和系统给他们造成的思想枷锁和不 安全感,消灭了非此即彼的宗教思想,消灭了他们对各种“大师”的膜拜心理。而且由于大家都会做语言,也消灭了他们显示自己是“牛人”的倾向。

技术无神论

IT 技术的社区往往具有太多宗教性质和膜拜心理,我认为这是非常不好的现象,所以 Yin 语言没有所谓的“社区”,“支持者”或者“热心分子”,也不进行“推广”。我们应该把所有的设计和实现作为“东西”来对待,就像手工课的时候用木头做一些 小板凳。所有的东西都是为人服务的,在地位上是低于所有人的。我们应该把对人的尊重放在高于一切东西之上,不管那个东西是谁设计的。
我个人其实完全不把自己的设计和代码当回事,因为我以后肯定要经常改动它,所以我完全不在乎有人批评这设计,因为它根本就不是“我的”,它没有长在 我身上,也永远不会是我最后的设计。最近接触了一些无人飞行器的设计者之后,我很高兴的发现,挺多设计机械硬件的人也是类似的心理,抱着一种“做小玩意” 的态度。我希望软件设计者也是这种态度。
Yin 就是这样一个“小玩意”,然而在以前的很多年里,我已经做出了其它一打各种穷形尽相的小玩意。我基本上已经知道哪些部件是管用的,所以我现在要做的,只是 把这些部件合理的组合在一起。Yin 大概不会给你带来什么很炫的新特性,也不会有让你感到很诧异的地方。我只希望它能让程序员自然而然的表达他们的想法。

代码

Yin 语言目前的代码已经开源,放在了我的 GitHub:
https://github.com/yinwang0/yin
由于我只花了几天时间来实现它,其实不完整也比较乱,还不能投入实用,有很多地方还需要修改和重写,而且没有文档。其实,现在把这么不完善的代码放 出来只是为了给我自己一些 peer pressure,免得我贪玩不去改进代码 :P 我也不指望你能看懂目前的代码或者做出“贡献”。其实 Yin 的最终实现代码应该全部或者绝大部分是我自己写的。开放这些代码只是为想要学习设计语言的人提供一个学习的机会,可以看到一个语言从头开始发展的情境。当 然我也会酌情接受特别好的修改建议,不过在做大的改动之前请一定事先通知,因为也许你做的并不是正确的改动。
为了方便实现和调试,Yin 的解释器目前使用 Java 作为实现语言。之前的一个版本使用了 Typed Racket,然而由于 Racket 系统报错信息的不精确,造成比较低的开发效率,所以我后来换成了 Java。很多人对 Java 有逆反心理,然而你会发现,我的 Java 代码其实跟普通 Java 程序员的代码有很大不同,所以会比较容易读懂。
在不久的将来,Yin 语言应该能够解释自己,从而使得编译器能够使用它自己来写。在那以后,Yin 的实现将独立于其它语言而存在。

讨论区

为了讨论各种设计的利弊,我建立了一个讨论区:
https://groups.google.com/forum/#!forum/yin-lang
我不喜欢太热闹的地方,所以这应该是一个流量比较低的讨论区。仅当有些拿不定主意的设计的时候,用于参考人们的意见。我希望加入的人有良好的的态度,所以请在加入的时候介绍你的背景和动机等等。
http://gengwg.blogspot.com/

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into /opt/course/1/context_default_no_kubectl.sh , but without the use of k

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checking a shared sec