能否用COBOL语言编写编译器?

7
这篇博客文章(链接)说:

"你不能用COBOL编写编译器或内核模块"

我不是COBOL的粉丝,也不建议使用它,但由于COBOL是图灵完备的语言,我的理解是你应该能够在COBOL中编写任何其他图灵完备语言所能编写的程序,这意味着从理论上讲,在COBOL中编写编译器应该是可能的,对吧?
也许作者只是简化说法,认为在COBOL中编写编译器不常见或不明智,但这让我想了一下。

2
我相信你是正确的。虽然没有人想这么做。 - 500 - Internal Server Error
这是一个容易做出的断言,但只需要一个用COBOL编写的编译器的例子就可以证明它是错误的。我的COBOL已经很生疏了,但我想不出任何根本性的原因,为什么不可能实现。 - jwh20
值得一提的是,文章在早期曾经说过“你永远不会想用COBOL编写编译器”。因此,这篇文章本身传达了一些混乱的信号。 - TylerH
显然有一个例子(请参见Rick Smith的答案)。 - Ira Baxter
这是可能的,但在经济上不可行,尽管显然MicroFocus提供了一个反例。 - user207421
4个回答

10

Micro Focus成立于1976年。他们的第一个COBOL编译器是使用SNOBOL启动的,直到他们有了用COBOL编写的COBOL编译器。即使是实用程序也是用COBOL编写和编译的。后来他们开始融合C和C++,但有一段时间一切都是COBOL。[我在1984年开始在个人电脑上使用Micro Focus COBOL。]

简单来说,标准的COBOL程序可以一次读取和写入一个字节。在 PROCEDURE DIVISION 中发生的事情决定了它是什么类型的程序:编辑器、编译器、链接器等。


这真是令人印象深刻和惊人的消息,知道它已经完成了。还有一个不错的历史课,谢谢。我以前从未听说过SNOBOL。 - Caltor

7

未被回答的是你是否可以用COBOL编写操作系统内核(OS)。

答案是(鼓声响起...)

当然可以,跟用C语言编写操作系统内核一样。请查看我的Quora文章,了解完成此操作所需的步骤:在不使用汇编语言的情况下编写操作系统内核是否可行?(我不会在这里复制整个答案)。

如果你这样做,可能会被认为是疯了。


真的很有趣。我甚至没有去问那个问题,因为我认为由于其他技术原因它是不可能的。:D - Caltor

3
好的,作为实际的作者,我承认那是一种过度简化的表述,原因很简单,因为COBOL是图灵完备的,因此你可以用它编写任何程序-最终。例如,您可以在COBOL中编写汇编程序,在汇编程序中使用C编译器,然后使用C编写引导程序中的C编译器。内核可加载模块也是如此。最终,无论什么样的程序都能够完成。
这种方法适合那些手头有非常充裕时间的人,但这确实可以做到。

1
很高兴有你的输入(和自白!)Charlie ;) 希望你没有被这个问题冒犯。它只是让我很好奇。也许在“封锁期间”有人喜欢挑战!顺便说一下,COBOL是我在大学二年级退学的主要原因 :D 我无法相信在90年代他们仍然想教我一门需要在每行开头留7个空格以防它被输入打卡机的语言。 - Caltor
1
@Caltor 不要生气,我只是一个脾气暴躁的老家伙。我认为对于现代读者来说,COBOL是我们所谓的领域特定语言 - 尽管这个术语尚未被发明。问题是,我一直在思考什么会成为现代面向业务的语言,而它看起来很像COBOL。嗯...这可能会成为一篇文章。 - Charlie Martin
我会留意现代商业语言MOBOL的!:D 但请不要让我在每行开头留下7个空格。 - Caltor
1
是的。它需要成为一种更传统的块结构和自由格式语言 - 实际上现在你可以用COBOL做到这一点,但大部分遗留代码仍然是卡片图像。@Caltor - Charlie Martin

2
您可以在https://rosettacode.org/wiki/Compiler/AST_interpreter#COBOL上看到实现。
请查看Steve Williams编写的COBOL条目中编译器任务套件解决方案的其他部分。
他完成了以下所有步骤:
- 词法分析器任务 - 语法分析器任务 - 代码生成器任务 - 虚拟机解释器任务 - AST解释器任务
一个迷你C编译器、解释器和虚拟机。非常出色。请访问https://rosettacode.org/wiki/Compiler/syntax_analyzer查看语言语法。包括赋值、字符串、while、if、print、putc、数学表达式和比较。大括号块。我相信编译器任务套件是Rosetta Code的亮点。
测试样例为:
count = 1;
 while (count < 10) {
     print("count is: ", count, "\n");
     count = count + 1;
 }

COBOL源代码使用GnuCOBOL编译后,一切都能按照预期正常工作。您将得到一种易于管理和扩展的编程语言,可以编译或解释运行。Rosetta Code上列出的各种解决方案值得花时间阅读和尝试。

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