11

那么什么是运行时?它是执行无法在特定处理器上运行的半编译代码的虚拟机吗?如果是这样,那么什么是虚拟机?它是另一个将半编译代码进一步转换为机器特定代码的软件吗?那么,如果我们谈论的是一种不编译为中间代码而是直接翻译/编译为机器代码的语言呢?在那种情况下什么是运行时?是硬件(CPU和RAM)吗?

另外,编译时和运行时有什么区别?它们是软件生命周期的阶段吗?我的意思是一个程序本来就是一堆文本文件,对吧?因此,您将它们编译或翻译成一种数据形式,然后可以将其加载到内存并由处理器执行,或者如果它是一种“托管”语言,那么它需要进一步编译才能在硬件上运行。什么是托管语言?

最后,是否有调试时间之类的东西,它是什么?

我在第一个学期学习计算机科学,这真的让我很困惑,教的东西是多么不合逻辑。“信息”被塞进了我的喉咙,但每当我试图通过将所有相关的东西组织到一个定义明确的组件和关系的单一系统中来理解所有事情时,我就会陷入困境。

在此先感谢,加勒特

4

3 回答 3

16

适合人类推理的那种代码(我们称之为“源代码”)需要经过几个阶段的翻译才能被底层硬件(如CPU或GPU)物理执行:

  1. 源代码。
  2. [可选] 中间代码(例如 .NET MSIL 或 Java 字节码)。
  3. 符合目标指令集架构的机器代码。
  4. 实际上翻转硅中逻辑门的微代码。

这些翻译可以在程序“生命周期”的各个阶段完成。例如,一种特定的编程语言或工具可能会选择在开发人员“构建”程序时从1转换为2 ,而在用户“运行”它时选择从2转换为3(这通常由一个名为“虚拟机” 1,需要预先安装在用户的计算机上)。这种情况对于 C# 和 Java 等“托管”语言来说是典型的。

或者它可以在构建时直接从1转换为3,这对于 C 和 C++ 等“本机”语言很常见。

34之间的转换几乎总是由底层硬件完成。从技术上讲,它是“运行时”的一部分,但通常被抽象出来,对开发人员来说基本上是不可见的。

术语“编译时间”通常表示从12(或3)的转换。在程序实际运行之前,可以在编译时进行某些检查,例如确保传递给方法的参数类型与声明的方法参数类型匹配(假设语言是“静态类型的”)。越早发现错误,就越容易修复,但这必须与灵活性相平衡,这就是为什么一些“脚本”语言缺乏全面的编译时检查的原因。

术语“运行时”通常表示从2(或3)一直到4的转换。甚至可以在运行时直接从1进行翻译,就像所谓的“解释语言”所做的那样。

有些问题在编译时无法发现,您必须使用适当的调试技术(如调试器、日志记录、分析器等)在运行时识别它们。运行时错误的典型示例是当您尝试访问不存在的集合元素时,这可能会在运行时表现为异常,并且是编译器执行流程过于复杂的结果在编译时“预测”。

“调试时间”只是调试器连接到正在运行的程序(或者您正在监视调试日志等)时的运行时间。


1不要将此与旨在运行本机代码的虚拟机混淆,例如 VMware 或 Oracle VirtualBox。

于 2013-04-07T22:48:13.570 回答
4

编译时和运行时通常是指何时发生检查或何时可能发生错误。例如,在像 C# 这样的静态类型语言中,静态类型检查是在编译时进行的。这意味着如果您尝试将字符串分配给 int 变量,则无法编译应用程序。另一方面,运行时间是指代码实际执行的时间。例如异常总是在运行时抛出。

至于虚拟机等;C# 是一种编译成通用中间语言(CIL 或 IL)的语言。无论您使用哪种 .NET 语言(C# 和 VB.NET 都产生 IL),结果都是相同的代码。.NET Framework 然后使用即时编译在运行时执行此语言。所以,是的,您可以将 .NET Framework 视为针对目标机器代码运行特殊子语言的虚拟机。

至于调试时,我认为没有这样的事情,因为您在调试时仍在运行程序。因此,如果有的话,调试时将是带有附加调试器的运行时。但你不会使用这样的术语。

于 2013-04-07T22:20:29.223 回答
4

编译时间 - 编译器尝试编译某些代码的时间段。示例:“编译器在编译时发现 3 个类型错误,导致程序无法编译。”

运行时间 - 程序执行的时间段。示例:“我们直到运行时才发现错误,因为它是一个逻辑错误。”

运行时和虚拟机是两个不同的想法——你的第一个问题对我来说没有意义。

虚拟机确实是将“对象”[Java、C# 等] 代码转换为可以在机器上运行的字节码的软件程序。如果一种语言使用虚拟机,它也经常使用即时编译——这意味着编译时和运行时本质上是同时发生的。

相反,像 C、C++ 这样的编译语言通常在机器上执行之前编译成字节码,因此编译时和运行时是完全分开的。

通常,“托管”语言具有垃圾收集(您不直接通过分配和取消分配来操作内存 [Java 和 C# 都是示例])并在某种类型的虚拟机上运行。

于 2013-04-07T22:27:31.530 回答