除了C语言以外,还有哪些没有运行时的编程语言适合编写编程语言?

6

我正考虑写一个玩具编程语言作为兴趣爱好,部分原因是对其他编程语言的小烦恼,部分原因是想了解它的使用感受,但主要还是为了随便玩玩。

如果这个玩具编程语言真的变得非常有用,我不希望它依赖于另一个编程语言的运行时才能运行。也就是说,我希望解释器/编译器本身就是一个编译成目标操作系统的本地程序(语言本身可以是解释的/提供运行时)。

除了C之外,有没有其他替代方案?每种方法都有哪些优缺点?

澄清1:我不打算降到足以编写内核、文件系统、设备驱动程序、引导加载程序的低级别。然而,我希望能够管理自己的内存。

澄清2:由于术语错误/误解,并且我已经习惯了在各种操作系统上运行的C运行时,所以我说C没有运行时/或者我不感兴趣运行时。更好的说法是,我的程序可以原生编译成目标(桌面)操作系统,而不需要从引导语言安装其他软件。

2.1:如果我用python编写编译器/解释器,我不希望生成的可执行文件依赖于python程序。

2.2:如果我使用编译步骤,例如使用perl编译程序,我不希望生成的可执行文件依赖于libperl.dll / so。

2.3:例外是C运行时,因为C运行时通常安装在几乎所有桌面操作系统上,许多核心操作系统工具都依赖于它。


1
多好的想法啊!太好了。我的选择是 C,因为你对编写编译器/解释器感兴趣,而不是一大堆库:这也很有趣,但我认为它不符合你的想法范围。此外,编写一堆库比编写(仅仅 :-))一个编译器要多花几个数量级的工作量。 - Pete Wilson
5
您的要求几乎与任何可以编译为本机代码的语言相匹配……您具体在寻找什么? - Mat
http://en.wikipedia.org/wiki/Compiled_language - pmg
@Mat,你说得对,我忘记了很多语言可以被编译。然而,我不想要一个运行时环境,而且我觉得很多这些语言都有运行时环境,这让我感到困惑。比如,我看到了Java和Basic...也许更好的要求是对内存的低级访问权限。 - madumlao
6个回答

4
您可以使用任何具有现有编译器且无依赖关系的本地代码的语言。C和C++是很好的选择,因为它们的运行时几乎在任何地方都可用(尤其是C语言)。
在您的语言构建中,值得一试的方法之一是:使您的编译器输出C(或C++)。然后,您可以使用这些语言及其运行时周围的所有现有生态系统(链接器、对象转储器、调试器等),甚至计划与现有代码集成。
这些工具对于您的语言用户以及在玩具语言上进行实验时显然都非常有用。
一旦您的语言达到“自托管”的程度(即您的编译器是用您自己的语言编写的),您就可以开始考虑摆脱整个C部分并编写一个本地代码编译器及其运行时。
祝你好运 :-)
还要确保查看 LLVM。这是一个“编译器基础架构”。这可能是实现新语言的最佳起点。文档非常好,教程包括构建玩具语言。

哇,那是一个非常有趣的方法,我之前没想到过!例如,我可以编写一个Perl解析器将我的语言转换为C语言进行编译。但是这种方法的一个问题是,我基本上必须考虑所有结构“如果用C语言编写,我会怎么写?”这样做是否真的比最初就用C语言编写语言更好还不确定。 - madumlao
你的编译器一开始必须用C、Perl或者其他你更熟悉的语言来编写,以便开始发出C代码。它发出C(或其他语言)的事实对于你的语言来说完全无关紧要,只与你的编译器有关。随着进展,你将能够直接在你的语言中实现越来越多的东西,而你的编译器将把它们翻译成C代码。在某个时候,你将能够用你的语言编写编译器本身。那时,你可以考虑编写一个本地代码编译器后端,而不是你的C后端。 - Mat
2
有一件事我没有提到:编写一门语言是非常困难的。 - Mat

2

C语言有一个运行时... C++的最小运行时比C稍微大一些。Ada的一些实现具有编译指示语句,允许检查是否使用了强制使用运行时的某些特性(我想知道它们是否后来被标准化了,在90年代末我停止了关注Ada标准化),这使得它可能具有与C相同复杂度的最小运行时。


C语言不“需要”运行时 =D。 - Hassan Syed
2
@madumlao:printf()getchar()malloc()等函数都是C运行时库的一部分。C99独立程序只能使用<float.h><iso646.h><limits.h><stdarg.h><stdbool.h><stddef.h><stdint.h>等标准头文件中指定的特性,以及扩展功能。 - pmg
感谢您澄清这个问题 - 我一直误用“运行时”这个词来表示“一个表现为程序并提供像垃圾回收、内存管理等 x 和 y 特性的进程”。由于我习惯于 C 运行时作为操作系统的一部分运行,因此我没有将标准库称为运行时。在这个问题的背景下,我认为一个更好的问题是:“什么编程语言,在最多只依赖 C 运行时(已经在大多数桌面操作系统中可用)的情况下,适合编写编程语言?” - madumlao

0

PyPy使用RPython实现Python语言。这对您有用吗?


还有其他一些要点:http://morepypy.blogspot.com/2011/04/tutorial-writing-interpreter-with-pypy.html 和 http://morepypy.blogspot.com/2011/04/tutorial-part-2-adding-jit.html - fijal

-1

-2
如果你要编写引导程序和内核,那么C语言是你的选择,否则你可以使用任何语言来开发你的语言。仅仅因为你的主机语言有一个运行时,并不意味着你的目标语言必须也有一个。
但是当然,玩具语言需要一个运行时,例如JVM/LLVM/.NET CLR或解释器。如果你不选择这些选项,你需要生成符合ABI的机器代码,这非常痛苦。
我建议你看一下llvm并从那里生成机器代码,dalvik也可能适合你的需求(因为它非常轻量级)。

3
你好!我对编写内核和引导程序不是特别感兴趣,但我希望能够定义我的语言默认结构所使用的内存量并编写垃圾回收程序。 - madumlao

-3

我认为Python最适合你。Python是一种编程语言,可以让你更快地工作并更有效地集成系统。学习使用Python后,你几乎可以立即提高生产力并降低维护成本。

最近,Python已被移植到Java和.NET虚拟机上。

最重要的是,Python是免费的。


2
问题是关于不需要运行时的编程语言。你提到的所有语言都不仅需要运行时,还需要整个虚拟机或解释器。 - CodeWarrior

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