Programming languages 现在如何创造一种语言?

Programming languages 现在如何创造一种语言?,programming-languages,language-design,compiler-construction,Programming Languages,Language Design,Compiler Construction,我需要开始写我一直想写的编程语言。你们这些孩子是怎么做到的?十多年来,我一直没有参与其中;你现在的做法是否与我们在互联网出现之前、windows出现之前的日子有所不同?你知道,当“真正的”程序员用C语言编写代码,使用命令行,质疑哪个shell更优秀的时候 只是想澄清一下,我的意思是,不是说如何设计一种语言(我可以很容易地理解),而是如何构建编译器和标准库等等?你们这些孩子现在用什么工具?我敢肯定,你们做的都是老生常谈的事 编写一些代码,并向全世界展示您的结果 与过去相比,现在有一些工具可以让你的

我需要开始写我一直想写的编程语言。你们这些孩子是怎么做到的?十多年来,我一直没有参与其中;你现在的做法是否与我们在互联网出现之前、windows出现之前的日子有所不同?你知道,当“真正的”程序员用C语言编写代码,使用命令行,质疑哪个shell更优秀的时候


只是想澄清一下,我的意思是,不是说如何设计一种语言(我可以很容易地理解),而是如何构建编译器和标准库等等?你们这些孩子现在用什么工具?

我敢肯定,你们做的都是老生常谈的事

编写一些代码,并向全世界展示您的结果


与过去相比,现在有一些工具可以让你的工作更轻松。我可以建议你解析你的语言语法吗?

真正的程序员仍然使用C语言编写代码。只是它更清晰一些。
六羟甲基三聚氰胺六甲醚。。。语言设计?还是编写编译器?
如果你想编写一个编译器,你可以使用Flex+Bison。(谷歌)

你不应该接受像使用最新工具这样的软弱无力的解决方案。您应该通过使用Visual Basic for Applications或类似语言编写一个最小编译器来引导该语言,然后使用新语言编写所有编译工具,然后仅使用该语言本身对其进行自编译

另外,建议的语言名称是什么


我想最近还没有像COBOL和FORTRAN这样全大写的语言,所以我希望你能像MIKELANG那样全大写。

这不是一个简单的答案,但是

本质上,您需要定义一组以文本(标记)形式编写的规则,然后使用一些解析器检查这些规则并将它们组装成片段


人们可能会为此花费数年时间,上面的文章讨论了使用两种工具(Flex和Bison),它们可以用来将文本转换为代码,并提供给编译器

作为一个刚刚构建了一个非常简单的汇编语言和解释器的人,我会从.NET框架或类似的框架开始。在尝试编写大多数内容时,没有什么能比得上整个.NET社区支持的强大的C++语法。从这里我设计了一个简单的字节码格式和汇编语法,并开始编写我的解释器+汇编程序


正如我所说,它是一种非常简单的语言。

自从穿孔卡片时代以来,一个新的考虑是虚拟机的存在已经提供了大量的“标准库”。将JVM或.NET CLR作为目标,而不是老式的“语言墙花园”,可以节省大量的引导工作。如果您正在创建一种编译语言,您可能会发现Java字节码或MSIL是一种比机器码更容易的编译目标(当然,如果您是为了好玩地创建一个严格优化的编译器,那么您会将其视为一个bug,而不是一个特性)

消极的一面是,JVM或CLR的习惯用法可能不是您想要的语言。因此,您最终可能会构建“标准库”,只是为了通过平台设施提供惯用的接口。(一个例子是,每种语言及其狗似乎都提供了自己的写入控制台的方法,而不是让用户手动调用System.out.println或console.WriteLine。)尽管如此,它还是支持惯用库的增量开发,这意味着,即使以一种难看的方式,您也可以访问那些您从未着手构建惯用接口的更晦涩的库


如果您正在考虑解释语言,.NET还支持通过动态语言运行库(DLR)进行高效解释。(我不知道是否有JVM的等价物。)这将有助于您将精力集中在语言设计上,而不必太担心解释器的优化。

首先,我花了一年左右的时间来思考语言应该是什么样子。同时,我帮助开发了Ioke(www.Ioke.org)来学习语言

我选择Objective-C作为实现平台,因为它快速(足够)、简单且语言丰富。它还提供了测试框架,所以敏捷方法是可行的。它还有一个丰富的标准库,我可以在此基础上构建

因为我的语言在语法层面上很简单(没有关键字,只有文字、运算符和消息),所以我可以使用Ragel()来构建scanner。它的速度和地狱一样快,使用简单


现在我有了一个工作对象模型、扫描器和简单的操作符洗牌以及标准的库引导代码。我甚至可以运行一个简单的程序——只要它们可以放在一个文件中,即:)

我现在已经用Haskell为小型领域特定语言编写了两个编译器,并且发现这是一次非常高效的体验。该库使使用语法变得简单,并且解释程序在Haskell数据结构上编写起来非常简单。这里有一个我觉得有用的描述

如果您对高性能后端感兴趣,我推荐。它有一个简洁优雅的字节码和最好的x86/amd64生成后端,你可以找到。有一个可选的垃圾收集器和一些实验性的后端


您可以用任何语言编写生成LLVM字节码的编译器。如果你有足够的冒险精神去学习Haskell,但是想要LLVM,那么有一组绑定。

与其说是一个实现,不如说是一个影响实现的设计决策——如果你让你的语言的每一条语句都有一个唯一的解析树,而没有上下文,那么你会得到一个很容易手工编写解析器的东西,而这并不需要大量的工作来提供语法高亮显示。类似地,对于模块名称空间和对象名称空间使用不同的符号(不像Java对包和类名称空间都使用
),这意味着您可以解析代码,而无需加载每个modu