创建自己的编程语言

37

7
这里已经有大量的资源可供使用:https://dev59.com/x3VD5IYBdhLWcg3wXaed。 - user142162
1
忘掉基于文本的“语言”,尝试做一些更具领域特定性的事情,为什么不通过手势或者更自然的面部识别等方式以图形化的方式告诉计算机你想让它做什么呢?http://www.ted.com/talks/peter_molyneux_demos_milo_the_virtual_boy.html - Greg Domjan
我本想将这个作为答案,但因为被关闭了,所以我会在这里放置:这是一本在许多学院作为计算机科学101书籍使用的书。它带领你了解设计计算机硬件、汇编语言、编译器和高级语言的基础知识。它不会让你在任何一个领域成为一夜之间的专家,但它使它们都非常易于接近。你会惊讶于你所学到的东西能做到什么。“计算机系统要素”:http://www1.idc.ac.il/tecs/ - Dinah
4
如果您对那个链接不满意,这里还有一些重复的链接:https://dev59.com/03VC5IYBdhLWcg3wcgmd,https://dev59.com/7EnSa4cB1Zd3GeqPQr4j,https://dev59.com/s0zSa4cB1Zd3GeqPm3di,http://stackoverflow.com/questions/2853412/books-on-creating-interpreted-languages,https://dev59.com/aE7Sa4cB1Zd3GeqP0RHE等。 - gnovice
1
不要急于行动。如果你对C++ "ok",学习这门语言。坐下来做很多(我是说很多)的临时项目,这样你就能理解编程语言的工作原理。PHP是一个不错的前置条件,但它会破坏你的编程思维方式。PHP很好用;他们为你做所有的工作,你从不需要包含文件或使用库等。另一方面,C++则不那么友好,但它有更多的功能(以任何比较基础为基础,因为PHP是一个网络解释语言而C++是首批支持多平台的语言)。无论如何,祝你好运! - RageD
13个回答

50
如果你对编译器设计(“计算机如何理解代码的含义”)感兴趣,我强烈推荐《编译原理》(Dragon Book)。我在大学时使用过它,并成功地为自己创建了一种编程语言。请点击Dragon Book获取更多信息。

37
我不认为我会向一个13岁的孩子推荐龙书。 - Michael Myers
23
如果他已经了解一些C++并且非常擅长PHP...他可能具备理解《龙书》所需的技能和知识。即使没有其他方面的帮助,这也可以帮助他教授他需要先学什么其他内容。 - David Thomas
7
“@mmyers,他只有13岁并不意味着编写编译器更容易。” - Tyler Smith

38

1
+1 鼓吹常识,避免受虐狂……=) - David Thomas
2
13岁时,我正在调试Signetics 2650汇编语言中的汇编器。在学习代数之后,这个项目变得更容易了。经过大学编译器理论与设计课程的学习,我现在完全理解它了。 - Thomas Matthews
鉴于原帖的背景,这不是一个好的答案。自己创建系统的简单版本是非常棒的。这是更好地了解所涉及内容的最佳方式,并且可以更好地判断您的系统可能如何内部工作,因此当您遇到奇怪的错误时,您更有可能知道可能是什么原因导致的。重新发明计算机的某些部分(作为学习练习)会使您成为更好的程序员。 - uliwitness

20
如果想要了解计算机如何理解代码,你可能需要学习一些汇编语言。这是一种更低级别的语言,可以让你更好地感受那些真正被执行的简单指令类型。你还应该能够感受到如何用条件跳转实现高级结构,如循环。
如果想要更深入地了解,你需要学习电子学。数字逻辑可以向你展示如何使用电子“门”来实现一个通用CPU,它可以理解从汇编语言代码生成的机器码。
对于真正的底层知识,你可以学习材料科学,这可以教你如何在原子层面上使门运作。
你听起来是一个有资源的人,你需要寻找针对你的理解水平并侧重于你最感兴趣的内容的书籍和/或网站。一个相当完整的理解需要计算机科学或计算机工程学位,但在你的位置上,对于有动力的人来说,很多东西是可以理解的。

编写高级语言并不需要理解汇编或电子学(尽管它们肯定有帮助)。例如,许多最近创建的语言在JVM中运行:http://en.wikipedia.org/wiki/List_of_JVM_languages - Frank Farmer
3
尽管这些都是很好学的东西,但除了第一个以外,这些东西似乎都不是编写编译器所必需的。如果使用LLVM或类似技术,甚至第一个也不是必需的。 - ergosys
6
“高级”一词在问题中未被具体说明。 - Greg Domjan
1
此外,他还说:“你可能想要这样做。”并不是说他已经这样做了。 - Martin Marconcini
4
问题中没有明确提到“编译器”。他说他想创建一种新语言。设计新语言时,通常不会首先实现机器码编译器。 - Potatoswatter
1
我同意汇编部分的观点:这是你需要了解的最底层的知识,以便有一个好的想法。不过,汇编器无关紧要。你只需要了解堆栈/堆、程序计数器等寄存器,以及大多数汇编器具有的典型指令(条件语句、流程控制、涉及调用函数的内容)。理想情况下,从教学汇编器开始,或者使用像Motorola 68000汇编器这样干净简单的汇编器,如果你能创建一个简单的汇编程序,递归调用一个函数,使用条件语句和循环,并且可能进行一个系统调用,如printf(),那么你就足够了。 - uliwitness

11

是的,可以创建自己的编程语言。可以看看编译器编译器,或者敢于查看一些脚本语言的源代码。一些有用的工具包括yacc、bison和lexx。

其他人已经提到了《龙书》。我在大学时使用过一本叫做“编译原理与实践”的书。

不需要学习汇编语言就能编写一个语言。例如,JavaScript运行在称为解释器的应用程序中,该应用程序执行JavaScript文件。在这种情况下,解释器通常内置在浏览器中。

最简单的起步程序语言可能是编写一个简单的基于文本的计算器。即,将文本文件输入,运行并执行计算。你可以很容易地用C ++来编写它。

我大学项目的第一门语言是在给我们的BNF中定义的。然后,我们必须编写一个解析器,将其解析成内存中的树形结构,然后再转换成称为三地址码(类似汇编语言)的东西。你可以很容易地将三地址码转换成真正的汇编语言,或者为其编写一个解释器。


4
+1 开始编写一个计算器。然而,我会尝试阅读《龙书》之类的书,并使用诸如Bison或ANTLR的编译器编译器。 - Andre Holzner
同意,编写一个简单的表达式解析器和解释器是迈出的好第一步,但可能无法回答原帖提出的有关C++如何工作以及计算机如何运行代码的问题。不确定我是否同意编译器生成器/解析器生成器(在学习东西的特定情况下)。首先手动编写自己的标记器和解析器可能值得一试,以便理解这些工具为您完成了哪些工作。 - uliwitness

8

当然可以。其他人提到了《龙书》(Dragon Book),但是也有很多在线信息可供参考。例如,llvm网站上有一个关于实现编程语言的教程:http://llvm.org/docs/tutorial/


3
我曾经职业地为一些小型领域特定语言编写过几个编译器,最近也做了我的第一个 LLVM 项目,但是发现学习曲线非常陡峭。对于学生来说,最好制作一个非常简单的玩具语言并编写自己的简单递归下降编译器和字节码解释器,而不是试图理解需要使用 LLVM 的所有工业级编译器概念。 - Larry Gritz
@Larry Gritz:这取决于你是否有兴趣编写编译器或设计语言。如果你满足于生成LLVM汇编代码,我认为这可能会很简单(一旦你生成了AST),但这并不意味着你不应该阅读好书。 - Matthieu M.

4

我非常推荐《编程语言实践》。这是一本很棒的书,从语言的概念到编译器的工作原理再到创建自己的语言,全方位地带领读者深入了解。相比于《龙书》,这本书更易懂,并在深入讲解之前先解释了事物的运作方式。


3

这是可能的。您需要了解编译器和/或解释器:它们的作用以及如何制作它们。


3

开始学习汇编语言并深入了解字节码的工作原理,这样你就可能有机会 :)


3
大多数编译器都用它们自己的语言编写,PHP解释器也是主要用C语言编写的——几乎没有汇编参与。 - Frank Farmer
1
哦,你可以用任何其他语言编写任何语言的编译器。我的意思是,在大学里,我们练习使用 Java 创建了 Lisp,然后使用 Lisp 创建了 Java。当然,这些编译器的语法非常准确,但并不特别智能。 - Parris
1
@Frank: @Parris: 我认为Marc的观点并不是编译器应该用汇编语言编写,而是它应该编译成汇编语言。或者他只是回答了问题中“计算机如何理解代码”的部分。 - sepp2k
@sepp2k 有很多编译器不会“编译成汇编语言”。例如javac,任何解释型语言... - Frank Farmer
汇编语言不必是实现语言,也不必是输出格式。然而,了解汇编语言意味着您拥有一个基本模型,用于字节码或解释器在底层提供功能,特别是用于实现递归函数调用。话虽如此,随意摸索也无妨。创建自己的语言,使用std::map来保存变量,然后发现递归不起作用是一种很好的学习经验。 - uliwitness

3
如果你已经了解C语言,那么建议你购买这本古老的书籍:http://www.amazon.com/Craft-Take-Charge-Programming-Book-Disk/dp/0078818826。其中有一章节介绍了如何用C语言创建一个"C"解释器。虽然不像《龙书》那样学术严谨,但我记得它非常简单易懂、实用,并且很容易跟进。对于刚开始学习编程的人来说,这是一个非常好的介绍“语法”和“程序分词”的入门教材。此外,这本书只要0.01美元就能买到二手书,比《龙书》便宜多了。;)

3

首先创建一个解析器。了解EBNF语法规则,这将回答你有关计算机如何读取代码的问题。这是一个非常高级的主题,所以不要期望太多自己,但要享受过程。我用过的一些资源是bison、flex和PLY


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接