为什么引入运行时?

Why Was The Runtime Introduced?

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

嗯,不,C 或 C++ 没有 'runtime',因为它们是完全编译的语言。 其他语言是 interpreted - 本质上,你所说的 运行time 就像处理器中的超级微码,它解释 Java、PHP 中的语句, BASIC,或者你有什么,并在 运行 时间将它们翻译成机器代码。

至于为什么这样做 - 好吧,我想是为了加快代码开发速度。我不确定这在今天和 4MHz z80 时代一样重要!!!

我希望其他人补充评论,因为这实际上是一个有趣的问题

编程语言是规范,因此是书面文档。对于 C11,阅读 n1570 standard. For Scheme, read R5RS.

一种编程语言可能有多种实现。对于 Linux 上的 C,请参阅 GCC, Clang, TinyCC, nwcc etc.... It has several C runtime libraries (GNU glibc, musl-libc 等)。

并非所有实现都有运行时库,因为某些语言实现是纯解释器。例如 GNU Guile (actually having a bytecode 表示 Scheme)。

阅读 Dragon book 了解更多。

研究几个实现的源代码,例如SBCL for Common Lisp. Or GNU Guile or Bigloo or Chicken/Scheme 方案。

了解 Quine 个程序。

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

写 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 指令 - 在这种情况下 不会 运行时 - 但编译器编写者更愿意将其定义为普通函数,当您调用它时不会生成特殊指令。