请原谅我的无知。我正在尝试使用PHP并且让我的脚湿透浏览,并且不得不问一个我多年来一直在想的问题:

当你编写一种全新的编程语言时,你在中写了什么?

对于你们所有的程序员来说,这听起来真的很愚蠢,对我们来说,我非常尊重,但这是一个令人困惑的鸡和它。鸡蛋给我的东西。你是做什么?自言自语今天我要发明一种新语言!然后开始......记事本?是否所有编译器都是基于以前存在的语言构建的,例如一个人打扰一个,可以将所有编程语言设计成一个怪异的分支树,最终基于......我不知道, old?

凭借我软弱的智慧,我发现这很有趣......请教育我!

有帮助吗?

解决方案

这不是一个愚蠢的问题。这是一个很好的问题。

正如已经回答的那样,简短的回答是“另一种语言”。

那会导致一些有趣的问题吗?如果它是第一种语言写的怎么办?  你特别的硬件?对于使用嵌入式设备的人来说,这是一个非常现实的问已经回答“另一台计算机上的语言”。事实上,一些嵌入式设备永远不会得到编译器,它们的程序将始终在不同的计算机上编译。

但是你可以进一步推迟它。有史以来第一个程序呢?

第一批用于“高级语言”的编译器本来应该写成什么称为“汇编语言”。汇编语言是一种语言,其中语言中的每条指令都对应于CPU的单条指令。它的语言水平非常低,写作非常冗长且劳动强度大。

但即使编写汇编语言也需要一个称为汇编程序的程序来将汇编语言转换为“机器语言”。我们回去吧。最初的汇编程序是用“机器代码”编写的。一个完全由二进制数组成的程序,它与计算机本身的原始语言直接一一对应。

但它仍然没有结束。即使只有原始数字的文件仍然需要翻译。您仍然需要将文件中的原始数字输入计算机。

不管你相信与否,早期的计算机前面都有一排开关。你翻转开关直到它们代表一个二进制数字,然后你轻弹另一个开关并将那个单个数字加载到计算机内存中。然后你继续轻弹切换,直到你加载了一个可以从磁盘文件或打卡读取程序的最小计算机程序。你轻弹另一个开关,它启动程序运行。当我在80年代上大学的时候,我看到了具有这种能力的计算机,但却没有得到装载交换机程序的工作。

甚至早于计算机程序必须与插板

其他提示

最常见的答案是 C 。大多数语言用C语言实现,或者用C语言的混合语言实现回调和“词法分析器”。像 Flex 和解析器生成器,如 YACC 。这些语言用于一个目的 - 描述另一种语言的语法。有时,当涉及到编译语言时,它们首先在C中实现。然后,该语言的第一个版本用于创建新版本,依此类推。 (例如 Haskell 。)

许多语言都是自助式的 - 自己编写。至于为什么要这样做,吃自己的狗食通常是个好主意

我参考的维基百科文章讨论了鸡肉和鸡蛋问题。我想你会发现它非常有趣。

几乎任何语言,虽然使用适合处理图形和其他复杂数据结构的语言会使许多事情变得更容易。出于性能原因,生产编译器通常用C或C ++编写,但OCaml,SML,Prolog和Lisp等语言可以更好地用于语言原型。

还有几种“小语言”。用于语言设计。 Lex和yacc用于指定语法和语法,例如,它们编译为C.(有其他语言的端口,例如ocamllex / ocamlyacc,以及许多其他类似的工具。)

作为一个特例,新的Lisp方言通常建立在现有的Lisp实现上,因为它们可以搭载在大多数相同的基础架构上。编写Scheme解释器可以在一个代码页下的Scheme中完成,此时可以轻松添加新功能。

从根本上说,编译器只是读取内容并将其转换为其他内容的程序 - 将LaTeX源代码转换为DVI,将C代码转换为汇编代码然后转换为机器语言,将语法规范转换为C代码以用于解析器等。它的设计者指定源格式的结构(解析),这些结构的含义,如何简化数据(优化)以及生成的输出类型。口译员阅读源并直接执行。 (解释器通常更容易编写,但速度要慢得多。)

实际上你几乎可以用任何你喜欢的语言写作。没有什么能阻止你在Ruby中编写C编译器。 "所有"您需要做的是解析程序并发出相应的机器代码。如果您可以读/写文件,那么您的编程语言可能就足够了。

如果您是在新平台上从头开始,您可以进行交叉编译:为您的新平台编写一个编译器,该编译器以Java运行或本机运行在x86上。在PC上进行开发,然后将程序转移到新的目标平台。

最基本的编译器可能是Assembler和C.

“编写新的编程语言”从技术上讲,不涉及任何代码。它只是提出了您的语言及其工作原理的规范。一旦你知道你的语言是什么样的,你就可以写译员和口译员来实际让你的语言“工作”。

翻译器以一种语言输入程序并输出另一种语言的等效程序。解释器以某种语言输入程序并运行它。

例如,C编译器通常将C源代码(输入语言)转换为汇编语言程序(输出语言)。汇编程序然后获取汇编语言程序并生成机器语言。获得输出后,您不需要翻译人员来运行您的程序。由于您现在拥有机器语言程序,因此CPU充当解释器。

许多语言的实现方式不同。例如, javac 是将Java源代码转换为JVM字节码的转换器。 JVM是一个运行Java字节码的解释器[1]。运行 javac 并获取字节码后,您不再需要 javac 。但是,只要您想运行程序,就需要JVM。

翻译人员不需要保持运行程序的事实使得“引导程序”成为可能。你的语言没有最终运行“在...之上”其他语言的层和层。

[1]大多数JVM在幕后进行翻译,但它们并不是真正的翻译者,因为JVM的接口不是“输入语言” - >输出语言“。

通常,您可以使用您喜欢的任何语言。例如,PHP是用C语言编写的。如果您无法访问任何编译器,那么您将不得不求助于编写汇编语言并手动将其编译为机器代码。

许多语言最初是用另一种可用的语言编写的,然后重新实现并以这种方式引导(或者只是将实现保留在外语中,如PHP和perl),但是有些语言,比如第一个汇编程序是手工编译的像第一个C编译器那样的机器代码被手工编译成汇编。

自从我读到它以来,我一直对引导感兴趣。要了解更多信息,我自己编写了我自己的BF超集,我称之为 EBF 。 EBF的第一个版本有3个额外的原语,我手工编译了第一个二进制文件。这样做时我发现了两步节奏。我在一个版本中实现了当前语言的一个功能,并且在我重新编写代码以利用实现的功能时有一个很好的版本。该语言表达足以用于制作 LISP口译员

我手动编译的版本与第一个发布标记,代码非常小。最后一个版本的大小和代码大12倍,并允许更紧凑的代码,因此手工编译当前版本将很难正确。

Edmund Grimley Evans与他的HEX语言做了类似的事情

自己做这件事的一个有趣的事情是你理解为什么有些东西是这样的。我的代码是产品,如果进行小的增量调整,它看起来更像是已经发展而不是从头开始设计。我今天在阅读代码时会记住这一点,我觉得这看起来有些偏差。

通常使用适用于系统开发的通用编程语言,例如C,Haskell,ML,Lisp等,但选项列表很长。此外,通常使用一些特定于域的语言实现语言,即解析器和词法分析器生成器,中间语言,如 LLVM 等可能还有一些shell脚本,测试框架和构建配置系统,例如autoconf的。

大多数编译器是wriiten C或者是类似程序,如果不是c那么汇编语言是要走的路但是当从头开始编写一个新的lang并且你没有来自原型语言的宏库或源代码时,你必须定义你自己的功能现在用什么语言?您可以只将一个名为psedocode的源代码表单写入机器,它看起来像面向对象的结构化语言规范中的bnf语法,如Fortran basic algo lisp。因此,图像编写的交叉代码类似于这些语言语法中的任何一种psedo代码

如果你没有源文件可以看到,那么必须将更多的二进制或汇编操作转换为函数,即汇编程序/编译器作业,然后转换为对象,数据和函数。如何在您的语言实现中表示这些对象功能,然后您必须识别“看到”实现,或定义自己的函数,过程和数据结构,这需要大量的知识,你需要问自己什么是函数。然后你的思想成为语言模拟。这将主程序员与其他人分开。

几个月前我也有这个问题。我阅读了一些文章并观看了一些视频,这些视频帮助我开始编写自己的语言,称为soft。它尚未完成,但我从这次旅程中学到了很多东西。

您应该知道的基本事项是编译器在必须执行代码片段时的工作原理。编译器有许多阶段,如词法分析,语义分析器,AST(抽象语法树)等。

我在新语言中的所作所为 - http:/ /www.singhajit.com/writing-a-new-programming-language/

如果你是第一次写一种语言,那么一切都很好,你还有很长的路要走。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top