首页生活资讯正文

编写一门新的语言,你可以学到什么。

2024-10-05 次浏览


本身亲手编写一门新的语言,纵然是糟糕的,你也会有纷歧样的发现。

原文地址: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》也被称为《龙书》。

你读哪本书将取决于你接下来想要走的偏向和想要进修的内容。


一往无前,发明一些有趣的器械

我以为我们都应该去发明一种新的语言。这是一种很好的进修方式,新的设法主意总得有个出处。终极,这也是一种在电脑上享受乐趣的绝佳方式。

能进修到新常识、发生共识,解答久困于心的迷惑,这是《新法式员》的焦点代价。迎接扫描下方二维码订阅纸书和电子书。

语言进修我们
语言学习技巧专家教你如何掌握一门新语言 “自学一门编程语言,我认为需要10年”
相关内容