【问题标题】:Why Was The Runtime Introduced?为什么要引入运行时?
【发布时间】:2020-06-21 10:07:37
【问题描述】:

对于像汇编这样的超低级语言,没有运行时,但对于其他实际经常使用的语言,如 Rust、C、C++、C#、Java、Kotlin、Swift 等,有一个运行时与该语言一起使用。为什么这些语言不是在编译时完成的?是因为它比使用运行时更难,还是因为使用运行时有一些实际好处?

【问题讨论】:

  • 定义“运行时”。有一个运行时 system 与汇编器之上的所有语言相关联,因为所有语言都需要一个库来进行 I/O,除了该语言可能以 API 的方式提供的任何其他内容。一些语言具有解释实现,其中运行时系统包括解释器。你的问题是什么?
  • C 确实在编译时做所有事情,除了实际运行程序和调用库函数,一些 C 实现将其称为“C 运行时库”。您是否在 JIT VM 与动态链接到提前编译的机器代码库之间混淆了?

标签: compiler-construction runtime compile-time low-level


【解决方案1】:

嗯,没有 C 或 C++ 的“运行时”,因为它们是完全编译的语言。 解释了其他语言 - 本质上,您称之为运行时就像处理器中的超级微码,解释 Java、PHP、BASIC 或其他语言中的语句,并在运行时将它们转换为机器代码.

至于为什么这样做 - 好吧,我想是为了加快代码开发速度。我不确定今天的影响因素是否与过去 4MHz z80 时代一样重要!!!

我希望其他人会添加 cmets,因为这实际上是一个有趣的问题

【讨论】:

  • 有一个C运行库,一个C++运行库,一个Fortran运行库,还有一个非常大的Cobol运行时系统,...
  • 我不清楚(对我来说)运行时 library 是什么原始问题。
【解决方案2】:

运行时库的意思是:编译器添加到你的程序中的代码。 通常,它会在操作系统的工作方式和语言希望操作系统的工作方式之间进行调整。

写 C 的人想写 int fd = open("/dev/null", O_RDWR); 来打开一个文件。他们不想写int fd; asm volatile("int 0x80" : "=a" (&fd) : "a" (1), "b" ("/dev/null"), "c" (2));。因此运行时包含一个名为open 的函数,其中包含此汇编代码。

编译器可以将函数调用 open 直接转换为 int 0x80 指令 - 在这种情况下,它不会成为运行时 - 但编译器编写者更愿意将其定义为普通函数,调用时不会产生特殊指令。

【讨论】:

  • 是的,但与 Java 不同的是,C 运行时库完全提前编译为机器代码。我认为 OP 在描述 C 库与描述 VM 环境(如 .NET 和 Java)时使用相同的词(“运行时”)感到困惑。我认为明确指出这一事实会很好。此外,另一个很好的例子是open() 只能移植到 POSIX 系统; C stdio fopen() 必须操作系统提供的任何低级系统调用之上实现。
  • @PeterCordes C 标准库仍然算作“运行时”。它只是比 Java 小得多。
  • 问题是“为什么这些语言没有在编译时完成所有事情?” - 它在 C 和 C++ 的编译时完成的。我确实已经对这个问题发表了评论,也许可以消除这种困惑,但我希望如果有人要回答,他们会将这一点与有关 C 库功能的一些细节结合起来。尽管 IDK 在这一点上值得付出更多努力。我不打算自己回答。
【解决方案3】:

编程语言是一个规范,所以是一个书面文件。对于 C11,请阅读 n1570 标准。对于 Scheme,请阅读 R5RS

一种编程语言可能有多种实现。对于 Linux 上的 C,请参阅GCCClangTinyCCnwcc 等......它有几个 C 运行时库(GNU glibcmusl-libc 等)。

并非所有实现都有运行时库,因为某些语言实现是纯解释器。例如GNU Guile(实际上有一个bytecode 用于Scheme)。

阅读Dragon book了解更多信息。

研究几个实现的源代码,例如SBCLCommon Lisp。或GNU GuileBiglooChicken/Scheme 用于Scheme。

注意Quine 程序。

【讨论】:

    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 2014-08-16
    • 2011-04-17
    • 1970-01-01
    • 2017-10-15
    • 2013-01-03
    • 1970-01-01
    • 2016-04-26
    相关资源
    最近更新 更多