开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
我写了一门编程语言,你也可以! - 技术翻译 - 开源中国社区

我写了一门编程语言,你也可以! 【已翻译100%】

oschina 推荐于 4个月前 (共 18 段, 翻译完成于 07-24) 评论 15
收藏  
88
推荐标签: 待读

在过去六个月,我一直在致力于开发一门叫 Pinecone 的编程语言。我还不能说它已经成熟了,但是它在使用中已经拥有足够多(编程语言)的特征,例如:

  • 变量

  • 函数

  • 用户定义的结构体

如果你有兴趣,可以看看 Pinecone 的引导页(landing page)或者它的 GitHub repo

方征
 翻译得不错哦!

我不是一个专家。当我开始这个工程的时候,我对我所做的事情还没有方向,但我还是没有放弃。我在语言创建上的级别为0,只是读了一点点在线的资料,也没有遵循我给出的那些建议。

不过,我还是制造了一个完整的新语言。并且它能工作。所以我一定做了正确的事情。

在这篇文章中,我将深入展示管线 Pinecone (以及其他编程语言)把源码变成魔法。

我也会谈谈我已经做出的一些权衡,以及为什么我会做出那些决定。

这绝对不是制作编程语言的完整教程,但是如果你对语言开发感到好奇,那么这是一个好的开始。

无若
 翻译得不错哦!

入门

“我都不知道我该从哪里开始”,当我告诉其他开发人员我在写一门语言时,我通常会得到这样的回应。如果听后的反应也是这样,我现在将通过一些已经尝试过的决定和步骤,来告诉你如何开始一门新语言。

编译型 vs 解释型

语言主要有两种类型:编译型和解释型:

编译器会计算出一个程序将执行的操作,将其转换为“机器代码”(计算机可以运行的格式,非常快),然后保存以便稍后执行。

一个解释器逐行逐步执行源代码,弄清楚它在做什么。

技术上,任何语言都可以被编译或解释,但是一种或另一种语言通常对于特定语言更有意义。一般来说,解释往往更加灵活,而编译往往具有更高的性能。但这只是解决复杂问题前的预热。

我高度重视性能,我看到缺乏高性能和简单性的编程语言,所以我去编译了 Pinecone。

这是需要今早确定的重要决定,因为很多语言设计决策受到它影响(例如,静态类型对于编译型语言来说是一个很大的好处,但对于解释型语言而言并不是那么重要)。

尽管 Pinecone 是按照编译型设计,但它也有唯一一个可运行的,功能完整的解释器。原因我稍后会解释。

亚林瓜子
 翻译得不错哦!

选择一门语言

我知道这有点像是一个元数据,但编程语言本身就是一个程序,因此你需要用一种语言编写它。 我选择了 C++ ,因为它的性能和庞大的功能集。此外,我其实很喜欢使用 C ++ 工作。

如果你正在编写一种解释性语言,那么在编译语言(如 C、C ++ 或 Swift )中编写将是非常有意义的,因为你的解释型语言中的性能损失及其对应的解释器将会更加复杂。

如果你打算编译,较慢的语言(如 Python 或 JavaScript )是更为可接受的。编译时间可能很糟糕,但在我看来,运行时间差别不大。

Tocy
 翻译得不错哦!

高级设计

一门编程语言通常被构造为一类管线。也就是说,它通常拥有几个阶段。每个阶段的数据都会以明确的方式被格式化。还具有将数据从这一阶段转换到下一个阶段的功能。

第一个阶段是一串包含了整个输入源文件的字符串。最终阶段是可以被运行的东西。我们逐步完成 Pinecone 管线的时候,这一切就会变得清晰起来。

无若
 翻译得不错哦!

Lexing 词法

大多数编程语言的第一步是词法分析或分词。 “Lex” 是词法分析的缩写,这是一个非常棒的词,是将一大堆文本分解成多个符号。 “tokenizer” 这个词更有意义,但是,“词法分析”说起来很有趣,因此我经常使用它。

Tocy
 翻译得不错哦!

标记

标记或记号是语言的一个单元。标记可能是一个变量或函数名(也叫标识符),也可能是一个操作符或数字。

词法分析器的任务

词法分析器将包含源码的文件作为输入字符串,输出包含标记符号的列表。

流水线(就是编译过程)后面的阶段将不再参考这些字符串源代码,所以词法分析器必须产生所有后面各阶段需要的信息。之所以会有这样相对严格的格式设计,是因为这个阶段词法分析器可以做一些工作,比如移除注释或检测标识符或数字等。如果你将这些逻辑规则放在词法分析器里,那么在构造语言的其它部分时就不必再考虑这些规则了,而且你可以方便地在同一个地方集中修改这些语法规则。

xiaoaiwhc1
 翻译得不错哦!

Flex

我开始开发这个语言,第一件事情就是写了一个简单的词法。不久之后,我开始学习可以让词法更简单正确的工具。

这个小工具就是 Flex ,一个生成词法的程序。你传入一个具有特定格式来描述语言语法的文件。它会生成一个 C 语言语法的程序代码。

ismdeep
 翻译得不错哦!

我的决定

我选择暂时保留最初写的词法分类器。因为到最后我没有看到 Flex 的明显优势,至少不能达到添加依赖和完成复杂构建。 

我的词法分类器只有几百行代码,几乎没有什么问题。迭代我的词法分类器也给了更多的灵活性。例如在不编辑多个文件的情况下向语言添加操作符。

ismdeep
 翻译得不错哦!

语法分析

管线流程的第二阶段就是语法分析器。语法分析器把标识符列表解析为一个带结点的树。用于存储这种数据的树称为抽象语法树,即 AST 。 最后在 Pinecone 的抽象语法树中不会包含任何标识符类型信息,它就是一个简单的结构化的标识符。

卖女孩儿的小酱油
 翻译得不错哦!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
评论(15)
Ctrl/CMD+Enter

求求你们别再发明编程语言了,我工作原因要弄四门语言,烦都烦死了

引用来自“超级大黑猫”的评论

求求你们别再发明编程语言了,我工作原因要弄四门语言,烦都烦死了
这些是自娱自乐的,学习借鉴思想即可
为什么编程语言不能天下一统?

引用来自“超级大黑猫”的评论

求求你们别再发明编程语言了,我工作原因要弄四门语言,烦都烦死了
@超级大黑猫 别人这是在研究和学习,经过了这一步才算是过了一个坎不再是菜鸟。
吐槽一下这垃圾的机器翻译
在我头脑发热也是看各种语言不顺眼,但发现我的生活选择了地狱模式,最后只能在各个大牛发明的语言下求生活。

引用来自“燚_”的评论

为什么编程语言不能天下一统?
不同的场景适合不同的抽象模型,一把锤子干不了所有的活
其他行业,要成为高手,一定是自己造工具的,或大造或小造
翻译的真垃圾,翻译完你自己能看懂吗?
刚毕业进入工业自动化行业的时候,就是干这事的,每天词法分析语法分析,在工业自动化领域有自己的开发语言,除了代码编写的语言,还有比较奇葩的图形编程语言,看起来就像电路图。有做过PLC的同学应该都知道,这些编程语言虽然有工业标准,但真正实现都是各个厂商自己做的,国内国外都有。

引用来自“超级大黑猫”的评论

求求你们别再发明编程语言了,我工作原因要弄四门语言,烦都烦死了

引用来自“sdvdxl”的评论

这些是自娱自乐的,学习借鉴思想即可
客户端 c#,服务端 c、lua,平时写策划工具 python,网页php,偶尔客户端换引擎c++、js,基本上是要4门已上语言。。。
为什么不选择基于C语言呢?

引用来自“燚_”的评论

为什么编程语言不能天下一统?
不能啊 静态、动态 虚拟机、手动管理内存 嵌入式、浏览器 不同的需求需要不同的语言 当然了你也可以把所有这些特性都在一门语言里实现 这样的话只用这一门语言就够了 但是估计没人能学的会 太复杂了
制作编译器,开发一门语言能让自己去了解很多计算机软件工具的使用和各种算法,算是一种学习的方法。但新发明一种语言有什么用处呢?也许是为了让自己快乐,毕竟自己设计的语言,最符合自己的喜好。
但是有一个很让人沮丧的事实:大部分语言的功能是一样的,除了语法上有一些区别。groovy 的作者说,如果他知道有 Scalar 这个项目,他根本不会去开发这个项目。
计算机语言的设计是一个非常复杂和要求非常高的大工程,据说美国航天管理局用于卫星上的代码,平均每行要经历100多次测试。随着计算机技术的普及,很多重要的项目需要用代码来支撑,也许是上百亿的资金管理,任何一点差错,对于一个程序员来说,都是无法负担后果的。所以语言项目通常要经历长时间,高强度,多角度的测试,可以说是千锤百炼。即使这样,我们可以选择的语言还是有很多。
确实有一些计算机语言实现了前所未有的功能,但大部分语言都有与其相类似的其他语言。这样程序员大都有选择恐怖症。

引用来自“超级大黑猫”的评论

求求你们别再发明编程语言了,我工作原因要弄四门语言,烦都烦死了
那更说明你需要知道如何发明语言,这样你才能融会贯通啊,哈哈!
顶部