自己亲手编写一门新的语言,即使是糟糕的,你也会有不一样的发现。
原文地址:https://ntietz.com/blog/you-should-make-a-new-terrible-programming-language/
作者 | ntietz 责编 | 苏宓
出品 | CSDN(ID:CSDNnews)
以下为译文:
每个软件工程师都会使用编程语言,通常还不止一种。但我们当中很少有人会去创造一门编程语言。这是有道理的,因为我们需要完成的工作通常可以通过现有的语言很好地完成。这些语言已经有其他人在不断改进。我们应该专注于手头的任务。
然而,这也意味着我们错过了一些学习的机会。在我偶然间基于一个看似荒唐的前提去选择开发一门语言:只通过异常来控制流程,没有其他方式。这本来是个玩笑,但在这个过程中我意外地学到了很多东西。
我们自己开发工具,那种感觉很特别
每个认真的木工都会制作一些自己的设备。有些人会制作他们的工作台,可能还会制作锯木架,或者为各种工具和工作环境制作夹具。这些都是木工可以用木头制作的东西。但我们通常无法获得制造所有工具所需的机器:例如制作凿子和刨子的部分,或者想要使用任何电动工具时,这意味着你需要一个金属加工车间。
作为程序员,我们处于不同的境地。我们几乎可以完全控制机器,理论上我们有能力从头开始构建一切。由于我们使用的工具都是基于软件的,而我们编写软件,因此我们可以从操作系统开始,创建我们自己的所有工具。
这是一个少数领域才享有的特权。我能想到的最接近的其他领域是机械师,他们也有可能自己制造很多工具。就像我们假设 CPU 和内存存在一样,他们可以假设电机和控制板存在。然后,他们可以将这些组件构建到其余的工具中。因此,像机械师一样,我们能够非常接近我们的工具。
通过创造编程语言学到的东西
我们最常接触的工具之一就是编程语言。我们使用编程语言来完成任何编程工作,它们也塑造了我们思考问题的方式。即使在远离键盘时,你也会把编程语言作为一种思维工具使用。这使它成为学习的绝佳机会。如果你创造一种新的编程语言,你将学到很多东西。
你将学习语法和语言设计。在实现编程语言之前,你必须决定你想要的语言是什么样的。它是一种命令式语言,还是函数式语言,或者其他类型?它是面向对象的吗?它的语法是从另一种语言借鉴而来的,还是你在尝试一些新的和奇怪的东西?这些问题,以及许多其他问题,都是你在设计语言时会遇到的。
在这个过程中,你将了解为什么其他语言会以某种方式设计。如果你幸运的话,你会在初步设计过程中学到一些东西。例如,在我开发下一个语言 Lilac 时,我学到了为什么分号如此常见,因为我尝试过其他语言。与朋友讨论时,揭示了其他语言中的许多潜在缺陷!如果你不那么幸运,你会在实现阶段学到这些教训,这些教训会深深烙印在你的脑海中。
你将学习解析。这是你开始实现语言时首先会遇到的事情之一。如果不解析语言,你几乎无法进行其他工作。要开始编写解析器前,你必须选择编写哪种解析器。当你刚开始时,不要过度思考这个问题。不过,如果你对解析器特别感兴趣,它会是一个非常值得深入研究的主题。
你将学习运行时执行。运行代码意味着你必须编写运行时(或编译器),这意味着要深入思考它在运行时如何工作。当抛出异常时,它实际上是如何工作的?当你引用一个变量时,你如何知道在哪个内存位置找到它?如果你运行一个递归函数,递归的深度是否有限制?为什么会有这样的限制?这些是你将要回答的一些问题。
这个清单可以一直列下去。你可以根据自己想学习的内容来定制你的语言。我的第一种语言——Hurl,教会了我关于创建解释器、设计语言和编写语法的基本知识。我的第二种语言——Lilac,将让我更深入地了解类型系统、运行时和工具化。
当你开始创建一种语言时,你会对其他语言有更深的直觉和理解。当我实现 Hurl 时,遇到解析错误时,它会向我输出原始的标记名称。这让我想起以前在 Neovim 的 Rust LSP 集成中偶尔看到的一些错误,并使这些错误更容易理解。你做出的每一个语言和实现决策都会加深你对所使用语言的理解,你也会因此成为更好的用户。
这将是一个糟糕的语言,但这没关系
为学习而编写自己的语言的一大优点是,它很可能是一个糟糕的语言。当然,创造新的、好的语言是可能的,那是很棒的!但根据我的经验,最好将学习如何做某件事与非常出色地完成它分开。
当你知道它将会是一个糟糕的语言时,这反而会让你感到非常自由!糟糕并不意味着它对你没有用,因为它仍然可能对你有用。大多数情况下,这意味着它将缺乏“真实”语言的精致和完整性,并且它在某些方面有缺陷,限制了其广泛的使用。但你可以制作一个解决你特定问题的东西,帮助你完成 Advent of Code 的谜题,或者让你在朋友中赢得极客的声誉。这些都是有用的东西。
因为你不会创造下一个 Python,所以你可以专注于那些有趣的、引人入胜的、对学习有益的事情。你可以摒弃所有那些枯燥但对现实世界使用来说必要的东西。你的学习可以是有针对性的,并且可以保持有趣,这样你更有可能完成这个项目。而且,任意地破坏规则或做出荒唐的语言选择也没关系,只要它能让你开心。因为,嘿,反正它会是个糟糕的语言,对吧?
开始创建编程语言
坐在空白编辑器前,想着“创建一种新语言”确实让人感到畏惧。很长一段时间里,即使作为首席软件工程师,我也觉得这是某种超出我能力范围的神秘技艺。但事实并非如此,所有程序员都可以做到。每年开始变得更容易,因为有很多资源可以学习。
我推荐的第一步是通过有指导的方式实现他人的语言。我跟随《Crafting Interpreters》做了这个,并且效果非常好。我也听说《Writing An Interpreter In Go》和《Build Your Own Lisp》不错。这些资源中的任何一个都能让你初步了解语言的工作原理,并让有经验的人指导你完成。
不过,有一点我要提醒:我发现选择一种与书中使用的实现语言不同的语言是个好主意。《Crafting Interpreters》使用的是 Java 和 C,而我使用的是 Rust。通过选择不同的语言,你被迫处理这些概念并将它们翻译过来。你不能简单地重新输入代码,而是应该在更深层次上学习它。
之后,你的方向完全取决于你自己。我是通过设计并不断尝试各种方法来开始 Hurl 的。这种方法起作用了,并让我将《Crafting Interpreters》中的许多知识具体化。对于 Lilac,我目前只读了一本书,还有几本在我的短期阅读清单中。当我向朋友寻求推荐时,他们推荐了以下几本书:
-
《Introduction to Compilers and Language Design》:我读过并非常喜欢这本书。
-
《Engineering a Compiler》
-
《Programming Languages: Application and Interpretation》
-
《Compilers: Principles, Techniques, and Tools》也被称为《龙书》。
你读哪本书将取决于你接下来想要走的方向和想要学习的内容。
勇往直前,创造一些有趣的东西
我认为我们都应该去创造一种新的语言。这是一种很好的学习方式,新的想法总得有个出处。最终,这也是一种在电脑上享受乐趣的绝佳方式。
推荐阅读:
▶引发全球Windows蓝屏,CrowdStrike获“史诗级失败”奖!
▶黑客声称窃取海量腾讯数据,高达14亿条记录、500GB;美国司法部考虑推动分拆谷歌;Go 1.23版本正式发布 | 极客头条
能学习到新知识、产生共鸣,解答久困于心的困惑,这是《新程序员》的核心价值。欢迎扫描下方二维码订阅纸书和电子书。