如果你不那么幸运,你会在实现阶段学到这些教训,这些教训会深深烙印在你的脑海中。你将学习解析。这是你开始实现语言时首先会遇到的事情之一。如果不解析语言,你几乎无法进行其他工作。要开始编写解析器前,你必须选择编写哪种解析器。当你刚开始时,不要过度思考这个问题。不过,如果你对解析器特别感兴趣,它会是一个非常值得深入研究的主题。你将学习运行时执行。运行代码意味着你必须编写运行时(或编译器),这意味着要深入思考它在运行时如何工作。当抛出异常时,它实际上是如何工作的?当你引用一个变量时,你如何知道在哪个内存位置找到它?如果你运行一个递归函数,递归的深度是否有限制?为什么会有这样的限制?这些是你将要回答的一些问题。这个清单可以一直列下去。你可以根据自己想学习的内容来定制你的语言。我的第一种语言——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》也被称为《龙书》。你读哪本书将取决于你接下来想要走的方向和想要学习的内容。勇往直前,创造一些有趣的东西我认为我们都应该去创造一种新的语言。这是一种很好的学习方式,新的想法总得有个出处。最终,这也是一种在电脑上享受乐趣的绝佳方式。
0 评论