你可以一门编写学到语言(语言你可以编写一门微软)「你可以编程吗」

自己亲手编写一门新的语言,即使是糟糕的,你也会有不一样的发现。
原文地址: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》也被称为《龙书》。
你读哪本书将取决于你接下来想要走的方向和想要学习的内容。
勇往直前,创造一些有趣的东西我认为我们都应该去创造一种新的语言。
这是一种很好的学习方式,新的想法总得有个出处。
最终,这也是一种在电脑上享受乐趣的绝佳方式。

联系我们

在线咨询:点击这里给我发消息