适合人类推理的代码(我们称之为“源代码”)需要经过几个阶段的翻译才能被底层硬件(例如CPU或GPU)物理执行:
- 源代码。
- [可选]中间代码(例如.NET MSIL 或 Java 字节码)。
- 与目标一致的机器代码指令集架构 http://en.wikipedia.org/wiki/Instruction_set_architecture.
- 实际上翻转硅中逻辑门的微代码。
These translations can be done in various phases of the program's "lifecycle". For example, a particular programming language or tool might choose to translate from 1 to 2 when the developer "builds" the program and translate from 2 to 3 when the user "runs" it (which is typically done by a piece of software called "virtual machine"1 that needs to be pre-installed on user's computer). This scenario is typical for "managed" languages such as C# and Java.
或者它可以翻译自1 to 3直接在构建时进行,这对于“本机”语言(例如 C 和 C++)很常见。
之间的翻译3 and 4几乎总是由底层硬件完成。从技术上讲,它是“运行时”的一部分,但通常被抽象出来,并且对开发人员来说基本上是不可见的。
术语“编译时”通常表示从1 to 2 (or 3)。在程序实际运行之前,可以在编译时完成某些检查,例如确保传递给方法的参数类型与方法参数的声明类型匹配(假设该语言是“静态类型”)。越早发现错误,就越容易修复,但这必须与灵活性相平衡,这就是为什么某些“脚本”语言缺乏全面的编译时检查的原因。
术语“运行时”通常表示从2 (or 3)一直到4。甚至可以直接翻译1在运行时,正如所谓的“解释语言”所做的那样。
有些问题在编译时无法捕获,您必须使用适当的调试技术(例如调试器、日志记录、分析器等)来在运行时识别它们。运行时错误的典型示例是当您尝试访问不存在的集合中的元素时,该元素可能会在运行时表现为异常,并且是执行流程对于编译器来说过于复杂的结果在编译时“预测”。
“调试时间”只是调试器附加到正在运行的程序(或者您正在监视调试日志等)时的运行时间。
1 Don't confuse this with virtual machines that are designed to run native code, such as VMware or Oracle VirtualBox.