创建编程语言
这是一本新指南,可以收集和整理从头开始创建编程语言所需的所有知识 。
创建编程语言是您作为开发人员梦dream以求的最迷人的挑战之一。
问题是,有很多活动部件,很多事情要做正确,而且很难找到一张详尽的地图来向您展示方法。 当然,您可以在其中找到有关编写半个解析器的教程,有关语言设计的半熟建议列表,一个天真的解释器的示例。 要找到这些东西,您将需要花费数小时来浏览论坛和跟踪链接。
我们认为通过收集相关资源,评估和组织资源可以节省一些时间。 因此,您可以花时间使用优质的资源,而不用寻找它们 。
我们围绕编程语言的创建的三个阶段来组织资源:设计,解析和执行。
在创建编程语言时,您需要采取想法并将其转化为决策。 这是您在设计阶段所做的。
在你开始前…
一些不错的资源可以增强您在语言设计上的文化。
文章
- 设计下一种编程语言? 了解人们如何学习! ,有关如何设计易于理解的编程语言的一些注意事项。
- 关于语言设计的五个问题 ,(由Paul Graham撰写的关于编程语言设计的一些笔记,(有些不错,有些是随机的))
图书
- 《编程语言中的设计概念》 ,如果您想在创建编程语言时做出明智的选择,这是您需要的书。 否则,如果您还没有必要的理论背景,那么您可能会冒其他人做事的风险。 开发通用框架以了解不同编程语言的行为方式和原因也很有用。
- 编程语言实用基础 ,这在很大程度上是一本关于学习和分类编程语言的书。 但是,通过了解可用的不同选项,它也可以用于指导编程语言的实现。
- 《 Programming Language Pragmatics,第4版》 ,这是一本最全面的书籍,旨在理解当代编程语言。 它讨论了从C#到OCaml的所有内容的不同方面,甚至包括功能和逻辑语言等不同类型的编程语言。 它还涵盖了实现的几个步骤和部分,例如中间语言,链接,虚拟机等。
- 《计算机程序的结构和解释,第二版》 ,为已经拥有学位的人们介绍计算机科学。 这本书受到了程序员的广泛赞誉,包括直接在Amazon Page上的Paul Graham在内,都可以帮助您开发一种思考编程语言的新方法。 它非常抽象,在Scheme中提供了示例。 它还涵盖了编程语言的许多不同方面,包括诸如垃圾回收之类的高级主题。
类型系统
围绕类型系统进行了长期的讨论和无限的争论。 无论您选择什么,最终都可以知道不同的职位。
文章
- 这是有关类型系统主题的两篇很好的入门文章。 第一个讨论“ 静态/动态 ”二分法,第二个讨论“ 自省” 。
- 在讨论类型系统之前要了解的内容如果您已经了解类型系统的基础知识,那么本文适合您。 通过定义和细节,您可以更好地理解它们。
- 类型系统(PDF) ,有关类型系统形式化的论文,还介绍了不同类型系统的更精确定义。
图书
- 《类型和编程语言》 ,一本有关理解类型系统的综合书籍。 这将影响您设计编程语言和编译器的能力。 它具有强大的理论支持,但也解释了各个概念的实际重要性。
- 功能编程和类型系统 ,一本有趣的大学课程,内容涉及用于功能编程的类型系统。 它用于一所著名的法国大学。 也有注释和演示材料。 它和您期望的一样先进。
- 用于编程语言的类型系统是一门关于(功能)编程语言的类型系统的简单课程。
解析将具体语法转换为更易于由计算机管理的形式。 这通常意味着将人类编写的文本转换为更有用的源代码表示形式,即“抽象语法树”。
解析通常包含两个组件:词法分析器和适当的解析器。 词法分析器(又称为标记器或扫描器)将标记中的各个字符转换为标记,即意义的原子。 解析器改为在程序的适当抽象语法树中组织令牌。 但是,由于它们通常是要一起工作的,因此您可以使用单个工具来完成这两个任务。
工具类
- Flex是词法生成器生成器,而(Berkeley)Yacc或Bison用于生成适当的解析器,是生成完整解析器的古老选择。 它们已有几十年的历史了,仍然保留为开源软件。 它们是为C / C ++编写的,并被认为是C / C ++。 它们仍然有效,但是在功能和对其他语言的支持方面存在局限性。
- ANTLR既是词法分析器又是解析器生成器。 它也更积极地开发为开源软件。 它是用Java编写的,但是它可以用多种语言(例如C#,C ++,Python,Javascript,Go等)生成词法分析器和解析器。
- 您自己的词法分析器和解析器。 如果您需要最佳性能,则可以创建自己的解析器。 您只需要具备必要的计算机科学知识。
讲解
- Flex和Bison教程 ,这是对这两个工具的不错介绍,并附有额外技巧。
- Lex和Yacc教程 ,共40页,是学习如何在几个小时内将lex和yacc组合在一起的理想起点。
- 有关lex / yacc的视频教程分为两个 部分 ,在一个小时的视频中,您可以学习使用lex和yacc的基础知识。
- ANTLR Mega Tutorial ,著名而受人喜爱的教程,它解释了您需要了解的有关ANTLR的所有内容,并提供了额外的技巧和窍门,甚至还有更多的资源。
图书
- lex&yacc尽管是一本写于1992年的书,但它仍然是该主题上最受欢迎的书。 有人说因为缺乏竞争,其他人则因为足够好。
- flex&bison:“文本处理工具” ,这是本世纪撰写的关于该主题的最佳书籍。
- 权威的ANTLR 4参考 ,由该工具的主要作者撰写,实际上是有关ANTLR 4 的权威书籍。它解释了其所有秘密,并且很好地介绍了整个解析过程的工作原理。
- 解析技术,第二版 ,全面,高级且昂贵的书,比您可能需要的解析知识更多。
要实现您的编程语言,也就是说要使某事实际发生,您可以构建以下两种方法之一:编译器或解释器。 如果需要,您也可以同时构建它们。 如果需要,您可以在这里找到良好的概述: 编译语言和口译语言 。
此处的资源专用于解释编译器和/或解释器的构建方式,但出于实际原因,它们通常还解释创建词法分析器和解析器的基础。
编译器
编译器将原始代码转换为其他代码,通常是机器代码,但也可以是任何低级语言,例如C。在后一种情况下,有些人更喜欢使用术语transpiler 。
工具类
文章和教程
- 在CLR上构建域特定语言 ,有关如何在CLR上构建内部DSL的文章。 从2008年开始,它已经有些过时了,但是对于这个主题来说,它仍然是一个很好的演示。
- 2008年2月的《 MSDN杂志 》电子版(CHM格式)包含有关如何为.NET Framework创建语言编译器的文章。 它仍然是整个过程的有效概述。
- 使用LLVM框架( 第1部分和第2 部分)创建工作的编译器,这是由两部分组成的关于IBM创建自定义编译器的系列文章,始于2012年,因此有些过时了。
- LLVM文档中的一些教程系列 ,这是有关如何使用LLVM实现称为Kaleidoscope的语言的三篇教程的链接。 唯一的问题是某些零件并非总是最新的。
- 我的第一个LLVM编译器 ,简短简短地介绍了使用LLVM构建编译器的主题。
- 为Cpu0体系结构创建LLVM后端,这是一个长达600页的教程,以学习如何创建LLVM后端,该版本也以PDF或ePub的形式提供。 内容很棒,但英文却很缺乏。 从积极的方面来说,如果您是学生,他们会感到将理论知识转化为实际应用的痛苦,而这本书是为您准备的。
- 《用于编译器教育的Nanopass框架》 ,该论文提出了一种框架,该框架以一种更简单的方式来教导如何创建编译器,并通过一系列简单的转换来转换传统的单片方法。 如果您已经具有计算机科学的理论背景,这将是一个有趣的阅读。
- 增量式编译器构建方法(PDF) ,该论文也是一种使用简单易学的方法开发基本Scheme编译器的教程。
图书
- 编译器:《原理,技术和工具》第二版 ,这是第二版(紫色龙)中广为人知的《龙书》(由于封面)。 有平装本,价格可能较低,但上面没有龙,因此您无法购买。 这是一本理论书籍,因此不要指望这些技术实际上包含许多可重用的代码。
- 《 Engineering a Compiler,第二版》是另一本采用理论方法的编译器书,但是它涵盖了更现代的方法,并且更具可读性。 它还更加致力于编译器的优化。 因此,如果您需要理论基础和工程方法,这是最好的书。
口译员
解释器直接执行语言,而无需将其转换为另一种形式。
文章和教程
- 一个从头开始使用Python的简单解释器 ,由四部分组成的系列文章,内容涉及如何在Python中创建解释器,既简单又不错。
- 让我们构建一个简单的口译员 ,这个由十二部分组成的系列介绍了如何为Pascal的一个子集创建解释器。 源代码使用Python,但是它具有必要的理论量以适用于另一种语言。 它还有很多有趣的图像。
- 如何编写解释器 (截屏视频)以及可用的源代码,以介绍如何使用Python编写简单语言的解释器。
- 如何使用JavaScript编写简单的解释器 ,这是一篇井井有条的文章,介绍了如何使用JavaScript创建简单的解释器。
图书
- 在Go中编写解释器 ,尽管标题如此,但实际上显示了从解析到创建解释器的所有内容。 这本书是一本当代的书,既有新意(几个月前),又是一本简短的书,具有边干边学的态度,充满了代码,测试并且没有第三方库。 我们采访了作者 Thorsten Ball。
- 手工翻译 ,一本正在进行中的免费书籍,已获得好评。 它着重于使口译员工作得很好,实际上它将建立其中的两个。 它计划拥有适量的理论,以适合编程语言创建者的聚会。
这些资源涵盖了创建编程语言的广泛过程。 它们可能是全面的,也可能只是概述。
工具类
在本节中,我们包括涵盖构建编程语言的整个范围的工具,这些工具通常用作独立工具。
- Xtext是开发编程语言(尤其是领域特定语言)的几种相关技术的框架部分。 它允许您构建从解析器到编辑器再到验证规则的所有内容。 您可以使用它为您的语言构建强大的IDE支持。 通过重用和链接引擎盖下的现有技术(例如ANTLR解析器生成器),它简化了整个语言的构建过程。
- JetBrains MPS是投影语言工作台。 投影表示将抽象语法树保存在磁盘上,并且向用户显示了投影。 投影可以是类似文本的,也可以是表格或图表,也可以是您可以想象的其他任何东西。 这样做的一个副作用是您不需要进行任何解析,因为这是没有必要的。 术语“ 语言工作台”表示Jetbrains MPS是旨在帮助您创建自己的编程语言的整个技术系统:从语言本身到IDE的一切,以及为您的语言设计的支持工具。 您可以使用它来构建各种语言,但是创建所有内容的可能性和需求使其成为创建特定受众使用的特定于域的语言的理想选择。
- Racket被其作者描述为“一种通用编程语言,也是世界上第一个用于开发和部署新语言的生态系统 ”。 这是一种具有实践野心的教学工具,甚至具有宣言意义。 它是一种创建其他语言的语言,包括从库开发GUI应用程序到IDE以及开发逻辑语言的工具。 它是Lisp语言家族的一部分,它告诉您您需要了解的所有内容:全部或全部,并且始终都是Lisp方式。
文章
- 为JVM创建一种编程语言:入门 ,概述如何以及为什么为JVM创建一种语言。
- 如何编写一个非常基础的编译器的答案,一个很好的答案的问题,它概述了所需的步骤以及执行编译器任务的可用选项。
- 在Racket中创建语言 ,它是ACM Journal上Racket的概述和演示,并提供了代码。
- Tractable Scheme Implementation(PDF) ,该论文讨论了以可靠性和易处理性为重点的Scheme实施。 它构建了一个解释器,该解释器将动态生成一种字节码。 然后,该字节码将由VM立即执行。 该名称源于原始版本是在48小时内构建的。 完整的源代码可在该项目的网站上找到 。
讲解
- 创建一种有用的语言和所有支持工具 ,以及一系列文章,从头开始,教您从解析到构建具有自动补全功能的编辑器的所有知识,同时构建针对JVM的编译器。
- 关于Racket的大量文档可以帮助您开始使用它,即使您不了解任何编程语言也是如此。
- 关于Xtext的大量文档可以帮助您开始使用它,其中包括15分钟的教程 。
- 有关JetBrains MPS的大量文档 ,包括专门的指南,例如面向专业语言设计师的指南 。 有一个视频频道,其中包含可帮助您使用该软件的视频,以及有关在JetBrains MPS中创建您的第一语言的介绍。
- 一小时内讲一门语言:stacker ,该教程提供了Racket及其工作流程的介绍。
- 编写自己的编程语言 ,这个由5部分组成的系列文章提供了一个简单的示例,说明使用JavaScript构建的创建编程语言的原理。
- 创建您自己的编程语言 ,这篇文章展示了使用JavaCC创建解析器和Java反射功能的一种简单编程方法。 显然这不是正确的方法,但是它提供了所有步骤,并且很容易遵循。
- 使用Flex,Bison和LLVM编写自己的玩具编译器 ,它使用适当的工具(flex,bison,llvm等)按其说的做,但是自2009年以来它已经有些过时了。如果您想了解一般情况,如何将所有内容融合在一起,这仍然是一个很好的起点。
- 项目:一种编程语言 ,这是Eloquent Javascript一书的一章。 它显示了如何使用JavaScript创建简单的编程语言以及如何使用正则表达式进行解析。 这一切都是错的,但它也异常地好。 作者这样做是为了揭开编程语言的神秘面纱。 您不应该做任何这样的事情,但是您可能会发现阅读它很有用。
- 设计一种编程语言I ,“从头到尾设计一种语言并构建翻译器”。 它不仅仅是一篇文章,还不是一本书。 它很好地融合了理论和实践,并实现了所谓的Duck编程语言(由Duck-Typing启发)。 计划了第二部分 ,该部分解释了如何创建编译器,但从未完成。
- 简介:建立编程语言 ,这是一个100分钟的视频,用JavaScript实现了PHP的子集:这有点麻烦,但也无疑是很酷的。
- 自下而上地用Ruby编写编译器 ,这是由45部分组成的系列文章,内容涉及使用Ruby创建编译器。 由于某种原因,它开始自下而上,也就是说,从代码生成到解析器结束。 这与传统(和逻辑)做事方式相反。 这很独特,但也很扎实。
- 使用C#4.0实现编程语言 ,该方法很简单,并且库已经过时了,但是阅读一篇关于如何在C#中构建解释器的很好的介绍是一篇整洁的文章。
- 如何创建自己的虚拟机! (PDF) ,本教程介绍了如何在C#中创建虚拟机。 这是令人惊讶的有趣,尽管在实际应用中不一定如此。
图书
- 如何创建实用的轻量级语言 ,这里的重点是使这种语言在实践中可行 。 它说明了如何生成字节码,针对LLVM,为您的语言构建编辑器。 阅读本书后,您应该了解制作一种有用的,富有成效的语言所需的一切。 顺便说一句,我们已经写了这本书。
- 如何创建自己的奇妙编程语言 ,这是一个100页的PDF和一个截屏视频,教您如何使用Ruby或JVM创建编程语言。 如果您喜欢快速而又肮脏的方法,那么这本书将使您在短时间内入门。
- 编写《编译器和解释器:软件工程方法》,第3版 ,这是本实用的书,仍然在教导正确的编译器/解释器方法。 只有这一点而不是学术重点,而是工程学。 这意味着它充满了Java代码,并且到处都是UML。 技术和代码都有些过时,但这仍然是最好的书,如果您是一名软件工程师,并且您需要立即做一些可以正常工作的东西,也就是说,在适当的审核过程完成后的几个月内完成。
- 语言实施模式 ,这是ANTLR的作者所写的书,该书也是计算机科学教授。 因此,这是一本集理论和实践于一体的书,可以指导您从头到尾,从解析到编译器和解释器。 顾名思义,它着重于解释用于构建此类软件的已知工作模式,而不是直接解释所有理论以及实际应用。 如果您需要现在就可以真正使用的东西,这是一本好书。 Python的设计师Guido van Rossum甚至建议使用它。
- 构建自己的Lisp ,这是一本非常特别的书,旨在以mini-Lisp作为主要示例,教您如何使用C语言以及如何构建自己的编程语言。 您可以免费在线阅读或购买。 这意味着您要学习C,但是您必须已经熟悉编程。 甚至还有迈克·泰森(Mike Tyson)的照片(因为……口齿不清):太奇怪了,但是很着迷。
- 美丽的球拍:如何使用球拍制作自己的编程语言 ,这是一本不错的在线书,并且不断更新,以介绍如何使用球拍构建编程语言。 本书由一系列教程以及一些解释和参考组成。 这是一本技术上免费的书,但是如果您使用它,则应该付费。
- 编程语言:应用程序和解释 ,一本有趣的书,介绍了如何使用Racket从头开始创建一种编程语言。 作者是一位老师,但善良而不稳定。 实际上,伴侣讲座中也有一系列录音 ,有时会有可疑的音频。
- 对于希望通过示例学习并使用测试驱动方法的人们, 使用Xtext和Xtend(第二版)实现特定领域的语言是一本好书。 它涵盖了设计DSL的所有级别,从类型系统的设计到解析和构建编译器。
- 《实现编程语言 》是对以JVM为主要目标的编译器和解释器的介绍。 专用网页中有相关资料(演示文稿,源代码等)。 它在理论和实践之间具有很好的平衡,但是明确地意味着它是一本教科书。 因此,不要期望太多可重用的代码。 从某种意义上说,它也是典型的教科书,如果您已经具备必要的背景知识(或老师),那将是一本很棒的著作,否则您可能会感到困惑。
- 实现函数式语言:一本教程 ,一本免费的书,介绍了如何从解析到解释器和编译器创建一种简单的函数式编程语言。 另一方面:“本书提供了一种实用的方法来理解使用惰性图归约的非严格功能语言的实现”。 另外,期望很多数学。
- DSL Engineering ,这是一本很棒的书,它解释了使用MPS和Xtext等语言工作台构建DSL的理论和实践。 这意味着除了传统的设计方面(例如,解析和解释器)之外,它还涵盖诸如如何创建IDE或如何测试DSL之类的内容。 这对软件工程师特别有用,因为它还讨论了DSL的软件工程和业务相关方面。 也就是说,它讨论了公司为什么应该构建DSL。
- Lisp in Small Pieces ,一本有趣的书,详细解释了如何设计和实现Lisp系列的语言。 它描述了“ 11个解释器和2个编译器”以及许多高级实现细节,例如编译器的优化。 对于有兴趣创建与Lisp相关的语言的人来说,这显然是最有用的,但是对于每个人来说,这可能都是一个有趣的阅读。
在这里,您可以找到有关创建编程语言的最完整的高质量资源。 您只需要决定要首先阅读的内容。
在这一点上,我们为您提供两个建议:
- 开始吧 我们会向您发送多少惊人的资源都没有关系,如果您不花时间练习,尝试并从错误中学习,您将永远不会创建编程语言
- 如果您对构建编程语言感兴趣,则应订阅我们的新闻通讯 。 您将收到有关新文章的更新,更多资源,想法,建议,并最终成为分享您对建筑语言兴趣的社区的一部分
您应该拥有入门所需的一切。 如果您有任何问题,建议或想法可以分享,请发电子邮件至federico@tomassetti.me 。 我们阅读并回复每封电子邮件。
我们感谢克里希纳的一些好的建议。
翻译自: https://www.javacodegeeks.com/2017/04/68-resources-help-create-programming-languages.html
创建编程语言