首页 文章

运行时和编译时有什么区别? [关闭]

提问于
浏览
8

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

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

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

我是第一个学习计算机科学的学期,它真的让我感到困惑的是教学的不合逻辑 . “信息”正在被我的喉咙推开,但每当我试图通过将所有相关内容组织成一个明确定义的组件和关系的单一系统来理解所有内容时,我就会陷入困境 .

提前谢谢,加勒特

3 回答

  • 4

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

    • 源代码 .

    • [可选]中间代码(例如.NET MSIL或Java字节码) .

    • 机器代码符合目标instruction set architecture .

    • 实际上翻转硅中逻辑门的微码 .

    这些翻译可以在程序的各个阶段完成"lifecycle" . 例如,某个特定的编程语言或工具可能会选择从 1 转换为 2 ,当开发人员"builds"该程序并从 2 转换为 3 时用户"runs"它(这通常由一个名为"virtual machine"的软件完成,需要预先安装在用户的计算机上) . 这种情况对于C#和Java等"managed"语言来说是典型的 .

    或者它可以在构建时直接从 1 转换为 3 ,这对于C和C等"native"语言来说很常见 .

    34 之间的转换几乎总是由底层硬件完成 . 它在技术上是"run time"的一部分,但通常是抽象的,并且对开发人员来说基本上是不可见的 .

    术语"compile time"通常表示从 12 (或 3 )的转换 . 在程序实际运行之前,可以在编译时执行某些检查,例如确保传递给方法的参数类型与声明的方法参数类型匹配(假设语言为"strongly typed") . 捕获错误越早,修复就越容易,但这必须与灵活性相 balancer ,这就是为什么有些语言缺乏全面的编译时检查 .

    术语"run-time"通常表示从 2 (或 3 )一直到 4 的转换 . 甚至可以在运行时直接从 1 转换,如所谓的"interpreted languages"所做 .

    在编译时无法捕获某些类型的问题,您必须使用适当的调试技术(如调试器,日志记录,分析器等...)在运行时识别它们 . 运行时错误的典型示例是当您尝试访问不存在的集合的元素时,该元素可能在运行时作为异常显示,并且是执行流程对编译器而言过于复杂的结果在编译时“预测” .

    “调试时间”只是一个运行时,而调试器附加到正在运行的程序(或者您正在监视调试日志等) .


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

  • 3

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

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

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

  • 12

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

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

    运行时和虚拟机是两个独立的想法 - 你的第一个问题对我没有意义 .

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

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

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

相关问题