运行时与编译时间

Runtime vs Compile time

有人能给我一个很好的理解运行时和编译时之间的区别吗?


编译时间和运行时间之间的差异就是尖头的理论家称之为阶段差异的一个例子。它是最难学习的概念之一,尤其是对于没有太多编程语言背景的人来说。为了解决这个问题,我觉得问

  • 程序满足什么不变量?
  • 在这个阶段会出什么问题?
  • 如果阶段成功,后置条件是什么(我们知道什么)?
  • 输入和输出是什么,如果有的话?
  • 编译时间

  • 程序不需要满足任何不变量。实际上,它根本不需要是一个格式良好的程序。你可以把这个HTML输入编译器,然后看着它死掉…
  • 编译时会出现什么问题:
    • 语法错误
    • 类型检查错误
    • (很少)编译器崩溃
  • 如果编译器成功了,我们知道什么?
    • 这个节目的形式很好,无论用什么语言,都是一个有意义的节目。
    • 可以开始运行程序。(程序可能会立即失败,但至少我们可以尝试。)
  • 输入和输出是什么?
    • 输入是正在编译的程序,加上任何头文件、接口、库或其他voodoo,它需要导入才能编译。
    • 希望输出是汇编代码或可重定位的对象代码,甚至是可执行程序。或者如果出了问题,输出就是一堆错误消息。
  • 运行时间

  • 我们对程序的不变量一无所知——它们是程序员放进去的任何东西。运行时不变量很少由编译器单独执行;它需要程序员的帮助。
  • 可能出错的是运行时错误:

    • 除以零
    • 取消对空指针的引用
    • 内存不足

    此外,程序本身也可能检测到错误:

    • 试图打开不存在的文件
    • 尝试查找网页并发现所谓的URL格式不正确
  • 如果运行时成功,程序将完成(或继续运行)而不会崩溃。
  • 输入和输出完全由程序员决定。文件,屏幕上的窗口,网络数据包,发送到打印机的作业,你命名它。如果程序发射导弹,这是一个输出,它只在运行时发生。

  • 我从错误的角度来考虑,以及什么时候可以发现错误。

    编译时间:

    1
    2
    string my_value = Console.ReadLine();
    int i = my_value;

    不能为字符串值分配int类型的变量,因此编译器在编译时确信此代码有问题

    运行时间:

    1
    2
    string my_value = Console.ReadLine();
    int i = int.Parse(my_value);

    这里的结果取决于readline()返回的字符串。有些值可以解析为int,而另一些则不能。这只能在运行时确定。


    编译时间:开发人员编译代码的时间段。

    运行时间:用户运行软件的时间段。

    你需要更清楚的定义吗?


    (编辑:以下内容适用于C语言和类似的强类型编程语言。我不确定这是否对你有帮助)。

    例如,在运行程序之前,编译器将检测到以下错误(在编译时),并将导致编译错误:

    1
    int i ="string"; --> error at compile-time

    另一方面,编译器无法检测到如下错误。您将在运行时(运行程序时)收到一个错误/异常。

    1
    2
    3
    4
    5
    Hashtable ht = new Hashtable();
    ht.Add("key","string");
    // the compiler does not know what is stored in the hashtable
    // under the key"key"
    int i = (int)ht["key"];  // --> exception at run-time


    将源代码翻译成发生在-[屏幕磁盘网络]上的东西可以(大致)两种方式发生;称之为编译和解释。

    在编译的程序中(例如C和Fortran):

  • 源代码被输入另一个程序(通常称为编译器--go-figure),它产生一个可执行程序(或一个错误)。
  • 运行可执行文件(双击它,或在命令行上键入它的名称)
  • 第一步发生的事情被称为发生在"编译时",第二步发生的事情被称为发生在"运行时"。

    在解释程序中(例如Microsoft Basic(在DOS上)和Python(我认为)):

  • 源代码被输入另一个直接"运行"它的程序(通常称为解释器)。在这里,解释器充当程序和操作系统(或简单计算机中的硬件)之间的中间层。
  • 在这种情况下,编译时间和运行时间之间的差异很难确定,而且与程序员或用户的关系要小得多。

    Java是一种混合,其中代码被编译成字节码,然后在虚拟机上运行,虚拟机通常是字节码的解释器。

    还有一种中间情况,在这种情况下,程序被编译成字节码并立即运行(如在awk或perl中)。


    基本上,如果编译器能够计算出您的意思或"编译时"值是什么,它就可以将其硬编码到运行时代码中。显然,如果运行时代码每次都必须进行计算,那么它的运行速度会变慢,因此如果您可以在编译时确定一些内容,那么它会更好。

    如。

    持续折叠:

    如果我写:

    1
    2
    int i = 2;
    i += MY_CONSTANT;

    编译器可以在编译时执行这个计算,因为它知道2是什么,我的常数是什么。因此,它可以避免每次执行计算。


    根据前面类似的问题回答,运行时错误和编译器错误之间的区别是什么?

    编译/编译时/语法/语义错误:编译或编译时错误是由于键入错误而发生的错误,如果我们不遵循任何编程语言的正确语法和语义,则编译器将抛出编译时错误。在您删除所有语法错误或调试编译时错误之前,它们不会让您的程序执行一行。示例:在C中缺少分号,或错误地将int输入int

    运行时错误:运行时错误是程序处于运行状态时生成的错误。这些类型的错误将导致程序行为异常,甚至可能导致程序终止。它们通常被称为例外。示例:假设您正在读取不存在的文件,将导致运行时错误。

    阅读此处有关所有编程错误的更多信息


    嗯,好吧,运行时用来描述程序运行时发生的事情。

    编译时用来描述在编译程序时发生的事情(通常由编译器)。


    编译时间:

    在编译时所做的事情在运行结果程序时几乎不会产生任何成本,但在构建程序时可能会产生很大的成本。

    运行时间:

    或多或少恰恰相反。构建时成本低,运行程序时成本高。

    另一方面,如果在编译时做了一些事情,它只在您的机器上运行;如果是运行时的,它在您的用户机器上运行。

    关联

    这一点很重要的一个例子是一种单元承载类型。编译时版本(如Boost.Units或我在D中的版本)的速度与用本机浮点代码解决问题的速度一样快,而运行时版本最终不得不打包有关某个值所在的单元的信息,并在每次操作时对其执行检查。另一方面,编译时版本要求在编译时知道值的单位,并且不能处理它们来自运行时输入的情况。


    例如:在强类型语言中,可以在编译时或运行时检查类型。在编译时,这意味着编译器会抱怨类型是否兼容。在运行时意味着,可以很好地编译程序,但在运行时,它会抛出一个异常。


    以下是《编译Java编程入门》的作者Daniel Liang对编译主题的引用:

    "A program written in a high-level language is called a source program or source code. Because a computer cannot execute a source program, a source program must be translated into machine code for execution. The translation can be done using another programming tool called an interpreter or a compiler." (Daniel Liang,"Introduction to JAVA programming", p8).

    …他继续说…

    "A compiler translates the entire source code into a machine-code file, and the machine-code file is then executed"

    当我们输入高级/人类可读的代码时,首先这是无用的!它必须被翻译成一系列的"电子事件"在你的小CPU!实现这一目标的第一步是编译。

    简单地说:编译时错误在这个阶段发生,而运行时错误在后面发生。

    记住:仅仅因为一个程序是没有错误地编译的,并不意味着它将无错误地运行。

    运行时错误将发生在程序生命周期的就绪、运行或等待部分,而编译时错误将发生在生命周期的"新"阶段之前。

    编译时错误示例:

    语法错误-如果代码不明确,如何将其编译为机器级指令??您的代码需要100%符合语言的语法规则,否则它无法编译成工作机器代码。

    运行时错误示例:

    内存不足-例如,对递归函数的调用可能导致给定特定程度的变量的堆栈溢出!编译器怎么能预料到这一点呢!它不能。

    这就是编译时错误和运行时错误之间的区别


    作为其他答案的补充,以下是我如何向外行解释:

    你的源代码就像一艘船的蓝图。它定义了该如何制造这艘船。

    如果你把你的蓝图交给造船厂,他们在造船时发现了一个缺陷,他们会在船离开干船坞或接触到水之前立即停止建造并报告给你。这是编译时错误。这艘船甚至从未真正漂浮或使用过它的引擎。这个错误被发现是因为它阻止了这艘船的制造。

    当你的代码编译时,就像船被完成了一样。已建成并准备就绪。当你执行你的代码时,就像是在航行中发射飞船。乘客上船,发动机运转,船体在水上,所以这是运行时间。如果你的船有致命的缺陷,在它的处女航(或可能是以后的某次航行,因为额外的头痛)时沉没,那么它会遇到一个运行时错误。


    简而言之,b/w编译时和运行时的差异。

    编译时间:开发人员将.java格式和转换程序写入Bytecode,它是一个类文件,在编译过程中,任何错误都可以被定义为编译时错误。

    运行时:生成的.class文件被应用程序用于其附加功能和逻辑错误,并引发一个错误,这是一个运行时错误。


    编译时间:

    在编译时所做的事情在运行结果程序时几乎不会产生任何成本,但在构建程序时可能会产生很大的成本。运行时间:

    或多或少恰恰相反。构建时成本低,运行程序时成本高。

    另一方面,如果在编译时做了一些事情,它只在您的机器上运行;如果是运行时的,它在您的用户机器上运行。


    运行时间意味着运行程序时会发生一些事情。

    编译时间意味着编译程序时会发生一些事情。


    编译时间:将源代码转换为机器代码以使其成为可执行文件所需的时间称为编译时间。

    运行时间:当应用程序运行时,它被称为运行时。

    编译时错误是那些语法错误,缺少文件引用错误。运行时错误发生在源代码编译成可执行程序之后,并且程序正在运行时。例如程序崩溃、意外的程序行为或功能不起作用。


    我一直在考虑它与程序处理开销以及它如何影响执行的关系,如前所述。一个简单的例子是,要么在代码中定义对象所需的绝对内存,要么不定义。

    一个已定义的布尔值占用X内存,这在编译程序中,不能更改。当程序运行时,它确切地知道要为X分配多少内存。

    另一方面,如果我只是定义了一个通用对象类型(例如,某种未定义的占位符或指向某个巨大blob的指针),那么直到程序运行并分配给它,我的对象所需的实际内存才会知道,因此必须对它进行评估,然后在运行时动态处理内存分配等。(更多的运行时间开销)。

    它的动态处理方式将取决于语言、编译器、操作系统、代码等。

    然而,这实际上取决于您使用运行时与编译时的上下文。


    假设你是一个老板,你有一个助手和一个女佣,你给他们一份要做的任务清单,助手(编译时)会抓住这个清单,做一个检查,看看这些任务是否可以理解,你没有用任何笨拙的语言或语法来写,所以他知道你想为一个工作指派一个人,所以他会指派一个H。我为你和他明白你想要一些咖啡,所以他的角色结束了,女仆(运行时间)开始运行这些任务,所以她去给你做一些咖啡,但突然她找不到任何咖啡来做,所以她停止做,或她采取不同的行动,让你喝点茶(当程序采取不同的行动,因为他发现一个错误)。


    我们可以把它们分为两大类:静态结合和动态结合。它基于何时使用相应的值进行绑定。如果在编译时解析引用,则它是静态绑定;如果在运行时解析引用,则它是动态绑定。静态绑定和动态绑定也称为早期绑定和后期绑定。有时也称为静态多态和动态多态。

    约瑟夫库兰戴?.


    运行时和编译时的主要区别是:

  • 如果代码中有语法错误和类型检查,那么它将抛出编译时错误,其中作为运行时:它在执行代码之后进行检查。例如:
  • int a = 1
    int b = a/0;

    在这里,第一行末尾没有分号--->在执行操作B时执行程序后出现编译时错误,结果是无限--->运行时错误。

  • 编译时不会查找代码提供的功能输出,而运行时会查找。

  • 下面是一个非常简单的答案:

    运行时和编译时是指软件程序开发的不同阶段的编程术语。为了创建一个程序,开发人员首先编写源代码,它定义了程序的运行方式。小程序可能只包含几百行源代码,而大程序可能包含数十万行源代码。源代码必须编译成机器代码才能成为可执行程序。这个编译过程称为编译时(把编译器看作是一个转换器)。

    编译后的程序可以由用户打开和运行。当应用程序运行时,它被称为运行时。

    程序员经常使用术语"运行时"和"编译时"来指代不同类型的错误。编译时错误是一个问题,例如语法错误或缺少文件引用,这会阻止程序成功编译。编译器会产生编译时错误,通常会指示源代码的哪一行导致了该问题。

    如果一个程序的源代码已经编译成一个可执行程序,那么在程序运行时,它可能仍然会出现错误。示例包括不起作用的特性、意外的程序行为或程序崩溃。这些类型的问题称为运行时错误,因为它们发生在运行时。

    参考文献


    看看这个例子:

    1
    2
    3
    4
    5
    6
    public class Test {

        public static void main(String[] args) {
            int[] x=new int[-5];//compile time no error
            System.out.println(x.length);
        }}

    以上代码编译成功,没有语法错误,完全有效。但在运行时,它会抛出以下错误。

    1
    2
    Exception in thread"main" java.lang.NegativeArraySizeException
        at Test.main(Test.java:5)

    就像在编译时检查某些情况一样,在运行时之后,一旦程序满足所有条件,就会检查某些情况,从而得到一个输出。否则,您将得到编译时或运行时错误。


    下面是对"运行时和编译时的区别"问题的答案的扩展。--与运行时和编译时相关的管理费用差异?

    产品的运行时性能通过更快地交付结果来提高质量。产品的编译时性能通过缩短编辑-编译-调试周期来提高其及时性。然而,运行时性能和编译时性能都是实现及时质量的次要因素。因此,只有在总体产品质量和及时性得到改善时,才应该考虑运行时和编译时性能的改进。

    这是一个很好的参考资料:


    imho您需要阅读许多链接、资源来了解运行时与编译时之间的区别,因为这是一个非常复杂的主题。我在下面列出了一些我推荐的图片/链接。

    除了上面所说的以外,我想补充一点,有时一张图片值1000字:

  • 这两个命令的顺序是:首先是编译时,然后运行编译后的程序可以由用户打开和运行。当应用程序运行时,称为运行时:编译时,然后运行时1compile time and then runtime1
  • clr_diag编译时,然后运行时2 CLR_diag compile time and then runtime2

    1
     from Wiki

    https://en.wikipedia.org/wiki/runu时间https://en.wikipedia.org/wiki/run_-time_uu(程序_-lifecycle_阶段)

    运行时、运行时或运行时可能指:

    计算

    运行时间(程序生命周期阶段),计算机程序执行期间

    运行库,一种程序库,设计用来实现程序语言中内置的函数。

    运行时系统,设计用于支持计算机程序执行的软件

    软件执行,在运行时阶段逐个执行指令的过程。

    enter image description hereenter image description here

    enter image description hereenter image description hereenter image description hereenter image description hereenter image description here编译器列表enter image description hereenter image description herehttps://en.wikipedia.org/wiki/list_编译器

    • 在Google上搜索并比较运行时错误与编译错误:

    runtime errors

    compile errors

  • 在我看来,要知道一件非常重要的事情:3.1构建与编译与构建生命周期的区别https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
  • 3.2这三件事之间的区别:编译vs构建vs运行时

    https://www.quora.com/what-is-the-difference-between-build-run-and-compile费尔南多·帕多安,一个对语言设计有点好奇的开发人员2月23日回答我在回顾其他答案:

    运行就是让一些二进制可执行文件(或者解释语言的脚本)作为一个新进程在计算机上执行;编译是对用某种高级语言编写的程序进行分析(如果与机器代码相比,则更高),检查其语法、语义、链接库,或者进行一些优化,然后创建一个二进制可执行程序作为输出的过程。这个可执行文件可以是机器代码的形式,或者是某种字节代码——也就是说,针对某种虚拟机的指令;构建通常包括检查和提供依赖项、检查代码、将代码编译成二进制文件、运行自动测试以及将生成的二进制文件和其他资产(映像、配置文件、库等)打包成某种特定的可部署文件格式。请注意,大多数流程都是可选的,有些依赖于为其构建的目标平台。例如,为Tomcat打包Java应用程序将输出.WAR文件。用C++代码构建Win32可执行文件可以只输出.exe程序,也可以将它封装在.MSI安装程序中。


    对于S.O.来说,这不是一个好问题(这不是一个特定的编程问题),但一般来说,这不是一个坏问题。

    如果你认为这是微不足道的:那么读时间和编译时间呢,这是一个什么时候有用的区别呢?编译器在运行时可用的语言呢?盖伊·斯蒂尔(不是傻瓜,他)在cltl2中写了7页关于eval-when的文章,cl程序员可以用它来控制这一点。两句话对于一个定义来说几乎是不够的,而这个定义本身就缺少解释。

    总的来说,语言设计者似乎试图避免一个棘手的问题。他们经常说:"这里有一个编译器,它确实是编译时的东西;之后的一切都是运行时的,玩得开心。"C被设计为易于实现,而不是最灵活的计算环境。如果在运行时没有可用的编译器,或者在计算表达式时无法轻松控制,那么最终会出现语言中的黑客行为,以伪造宏的常用用法,或者用户会想出设计模式来模拟具有更强大的构造。一个简单的语言实现肯定是一个有价值的目标,但这并不意味着它是所有编程语言设计的终点。(我不经常使用eval,但我无法想象没有它的生活。)

    编译时和运行时周围的问题空间是巨大的,而且仍然很大程度上没有被探索。这并不是说S.O.是进行讨论的正确地点,但我鼓励人们进一步探索这个领域,尤其是那些对它应该是什么没有先入为主想法的人。这个问题既不简单也不愚蠢,我们至少可以把审问者指向正确的方向。

    不幸的是,我不知道这方面有什么好的参考资料。CLTL2谈了一点,但对学习它并不好。