运行时和编译时的区别是什么?
本文关键字:区别 是什么 编译 运行时 | 更新日期: 2023-09-27 18:08:09
那么什么是运行时呢?它是一个虚拟机,执行不能在特定处理器上运行的半编译代码。如果是这样,那么什么是虚拟机呢?是另一种软件将半编译代码进一步翻译为特定于机器的代码吗?那么,如果我们谈论的是一种不编译成中间代码而是直接翻译/编译成机器码的语言呢?这种情况下的运行时间是什么?是硬件(CPU和RAM)吗?
还有,编译时和运行时的区别是什么?它们是软件生命周期的各个阶段吗?我是说程序最初是一堆文本文件,对吧?所以你编译或翻译这些数据,然后可以加载到内存中,由处理器执行,或者如果它是一种"托管"语言,那么它需要进一步编译才能在硬件上运行。托管语言到底是什么?
最后,有没有所谓的调试时间,它是什么?
我学的是计算机科学,这是我的第一学期,它真的让我很困惑,为什么不合乎逻辑的东西教。"信息"被塞进我的喉咙,但每当我试图通过将所有相关的东西组织成一个定义良好的组件和关系的单一系统来理解所有事情时,我就会陷入困境。
提前感谢,Garrett
适合人类推理的代码(我们称之为"源代码")需要经过几个翻译阶段,才能由底层硬件(如CPU或GPU)物理执行:
- 源代码。
- [可选]中间代码(如。net MSIL或Java字节码)。
- 符合目标指令集体系结构的机器码。
- 实际翻转硅逻辑门的微码。
这些翻译可以在程序"生命周期"的各个阶段完成。例如,当开发人员"构建"时,特定的编程语言或工具可能会选择从1转换为2。当用户"运行"时,将程序从2转换为3;它(这通常是由一个叫做"虚拟机"的软件来完成的,这个软件需要预先安装在用户的计算机上)。这个场景是典型的"管理"场景。如c#和Java。
或者它可以在构建时直接从1转换为3,就像"native"如C和c++。
3 和4之间的转换几乎总是由底层硬件完成的。从技术上讲,它是"运行时"的一部分。但通常是抽象出来的,对开发人员来说基本上是不可见的。术语"编译时间"通常表示翻译从 1 2 或 3 )。在程序实际运行之前,可以在编译时进行某些检查,例如确保传递给方法的参数类型与声明的方法参数类型匹配(假设语言是"静态类型")。越早发现错误,就越容易修复,但这必须与灵活性相平衡,这就是为什么一些"脚本";语言缺乏全面的编译时检查。
术语"运行时"通常表示从2(或3)一直到4的转换。甚至可以在运行时直接从1进行翻译,正如所谓的"解释语言"所做的那样。
有某些类型的问题是不能在编译时被捕获的,你必须使用适当的调试技术(如调试器、日志、分析器等)来在运行时识别它们。运行时错误的典型例子是,当您试图访问不存在的集合元素时,这可能会在运行时表现为异常,并且是执行流过于复杂而导致编译器无法"预测"的结果。
调试时间当调试器连接到正在运行的程序(或者您正在监视调试日志等)时,它只是一个运行时。
1不要将此与设计用于运行本机代码的虚拟机混淆,例如VMware或Oracle VirtualBox
编译时和运行时通常指发生检查或可能发生错误的时间。例如,在c#这样的静态类型语言中,静态类型检查是在编译时进行的。这意味着,如果您尝试将字符串赋值给int变量,则无法编译应用程序。另一方面,运行时指的是代码实际执行的时间。例如,异常总是在运行时抛出。
对于虚拟机等;c#是一种编译成公共中间语言(CIL,或IL)的语言。无论使用哪种。net语言(c#还是VB),结果都是相同的代码。NET都产生IL)。然后,. net框架在运行时使用即时编译执行该语言。所以,是的,你可以把。net框架看作是一个针对目标机器码运行一种特殊子语言的虚拟机。
至于调试时间,我认为没有这样的事情,因为在调试时你仍然在运行程序。因此,如果有的话,调试时间应该是带有附加调试器的运行时。但你不会用这样的术语。
编译时间-编译器尝试编译某些代码的时间。示例:"编译器在编译时发现了3个类型错误,导致程序无法编译。"
Runtime—程序正在执行的时间段。示例:"我们直到运行时才发现错误,因为这是一个逻辑错误。"
运行时和虚拟机是两个不同的概念——你的第一个问题对我来说没有意义。
虚拟机实际上是将"对象"[Java, c#等]代码转换成可以在机器上运行的字节码的软件程序。如果一种语言使用虚拟机,它也经常使用即时编译——这意味着编译时和运行时本质上是同时发生的。
相反,像C、c++这样的编译语言通常在机器上执行之前被编译成字节码,因此编译时和运行时是完全分开的。
一般"托管"语言有垃圾收集(你不直接操作内存分配和取消分配[Java和c#都是例子]),并运行在某种类型的虚拟机上。