任何人都可以让我很好地理解运行时和编译时的区别是什么?
编译时间和运行时间之间的差异是一个尖头理论家称之为phase distinction的例子。这是最难学习的概念之一,特别是对于没有很多编程语言背景的人。为了解决这个问题,我觉得提问很有帮助
例如:在强类型语言中,可以在编译时或运行时检查类型。在编译时,这意味着,如果类型不兼容,编译器会抱怨。在运行时意味着,您可以编译您的程序,但在运行时,它会抛出异常。
编译时:开发人员以.java格式编写程序并转换为类文件字节码,在编译期间,任何错误都可以定义为编译时错误。
运行时:生成的.class文件由应用程序用于其附加功能,逻辑结果是错误的并抛出错误,这是一个运行时错误
以下是关于编译主题的“JAVA编程简介”一书的作者Daniel Liang的引用:
“用高级语言编写的程序称为源程序或源代码。由于计算机无法执行源程序,因此必须将源程序转换为机器代码才能执行。可以使用另一种编程工具完成转换。翻译或编译器。“ (Daniel Liang,"Introduction to JAVA programming",第8页)。
...他继续...
“编译器将整个源代码转换为机器代码文件,然后执行机器代码文件”
当我们打入高级/人类可读的代码时,这首先是无用的!它必须在你的小CPU中翻译成一系列“电子事件”!迈向此的第一步是编译。
简单地说:在此阶段发生编译时错误,而稍后发生运行时错误。
请记住:仅仅因为程序编译时没有错误并不意味着它会毫无错误地运行。
运行时错误将发生在程序生命周期的就绪,运行或等待部分,而编译时错误将发生在生命周期的“新”阶段之前。
编译时错误的示例:
语法错误 - 如果代码不明确,如何将代码编译成机器级指令?您的代码需要100%符合语言的语法规则,否则无法编译成工作的machine code。
运行时错误的示例:
内存不足 - 例如,对递归函数的调用可能会导致堆栈溢出给定特定程度的变量!如何通过编译器预测到这一点!?这不可以。
这就是编译时错误和运行时错误之间的区别
作为其他答案的附加内容,以下是我向外行人解释的方法:
您的源代码就像船的蓝图。它定义了如何制造船舶。
如果你把你的蓝图交给造船厂,并且他们在建造船舶时发现了缺陷,他们将在船离开干船坞或接触水之前立即停止建造并立即报告给你。这是编译时错误。这艘船甚至从未真正浮动或使用其发动机。发现错误是因为它阻止了船舶的制造。
当您的代码编译时,就像船只完成一样。建成并准备好了。当您执行代码时,就像在航行中启动船舶一样。乘客登机,发动机正在运行,船体在水面上,所以这是运行时间。如果你的船有一个致命的缺陷,在它的处女航中沉没它(或者可能是因为额外的头痛之后的一些航行),那么它会遇到运行时错误。
运行时意味着运行程序时会发生某些事情。
编译时间意味着编译程序时会发生某些事情。
编译时间:
在生成程序时,在编译时完成的事情(几乎)不会产生任何成本,但在构建程序时可能会产生很大的成本。运行:
或多或少恰恰相反。构建时成本很低,程序运行时成本更高。
从另一边;如果在编译时完成某些操作,它只在您的计算机上运行,如果某些内容是运行时,它将在您的用户计算机上运行。
编译时间:将源代码转换为机器代码以使其成为可执行文件所花费的时间称为编译时间。
运行时:当应用程序运行时,它被称为运行时。
编译时错误是那些语法错误,缺少文件引用错误。源代码编译成可执行程序并且程序运行时发生运行时错误。例如程序崩溃,意外的程序行为或功能不起作用。
这是对“运行时和编译时之间的差异?”这一问题的答案的扩展。 - 与运行时和编译时相关的开销差异?
产品的运行时性能通过更快地提供结果来提高其质量。产品的编译时性能通过缩短编辑 - 编译 - 调试周期来提高其及时性。但是,运行时性能和编译时性能都是实现及时质量的次要因素。因此,只有通过改进整体产品质量和及时性,才能考虑运行时和编译时性能改进。
进一步阅读here的重要来源:
我一直认为它与程序处理开销有关,以及它如何影响前面所述的性能。一个简单的例子是,或者在代码中定义我的对象所需的绝对内存。
定义的布尔值占用x内存,然后在编译的程序中,不能更改。当程序运行时,它确切地知道为x分配多少内存。
另一方面,如果我只是定义一个通用对象类型(即一种未定义的占位符或者可能是指向某个巨型blob的指针),我的对象所需的实际内存在程序运行之前是不可知的,我为它分配了一些内容因此必须对其进行评估,然后在运行时动态处理内存分配等(更多的运行时间开销)。
它的动态处理方式取决于语言,编译器,操作系统,代码等。
但是,在这方面,它实际上取决于您使用运行时间与编译时间的上下文。
我们可以根据不同的两大类静态绑定和动态绑定对这些进行分类。它基于何时使用相应的值进行绑定。如果在编译时解析引用,则它是静态绑定,如果在运行时解析引用,则它是动态绑定。静态绑定和动态绑定也称为早期绑定和后期绑定。有时它们也被称为静态多态和动态多态。
约瑟夫库兰代。
我从错误的角度考虑它,何时可以捕获它们。
编译时间:
string my_value = Console.ReadLine();
int i = my_value;
无法为字符串值分配int类型的变量,因此编译器在编译时确定该代码存在问题
运行:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
这里的结果取决于ReadLine()返回的字符串。有些值可以解析为int,有些则不能。这只能在运行时确定
运行时和编译时的主要区别是:
int a = 1
int b = a/0;
这里第一行末尾没有分号--->执行程序b执行程序后编译时错误,结果是无限--->运行时错误。
这是一个非常简单的答案:
运行时和编译时是编程术语,指的是软件程序开发的不同阶段。为了创建程序,开发人员首先编写源代码,该代码定义程序的运行方式。小程序可能只包含几百行源代码,而大程序可能包含数十万行源代码。源代码必须编译成机器代码才能成为可执行程序。这个编译过程称为编译时间。(将编译器视为翻译器)
编译的程序可以由用户打开和运行。当应用程序运行时,它被称为运行时。
程序员经常使用术语“运行时”和“编译时间”来指代不同类型的错误。编译时错误是一个问题,例如语法错误或缺少文件引用,导致程序无法成功编译。编译器产生编译时错误,通常指示导致问题的源代码行。
如果程序的源代码已经编译成可执行程序,则程序运行时可能仍会出现错误。示例包括不起作用的功能,意外的程序行为或程序崩溃。这些类型的问题称为运行时错误,因为它们在运行时发生。
看看这个例子:
public class Test {
public static void main(String[] args) {
int[] x=new int[-5];//compile time no error
System.out.println(x.length);
}}
上面的代码编译成功,没有语法错误,完全有效。但是在运行时,它会抛出以下错误。
Exception in thread "main" java.lang.NegativeArraySizeException
at Test.main(Test.java:5)
就像在编译时检查某些情况一样,在该运行时间之后,一旦程序满足所有条件就会检查某些情况,您将获得输出。否则,您将收到编译时或运行时错误。
想象一下,你是一个老板,你有一个助手和一个女仆,你给他们一个要完成的任务列表,助理(编译时)将抓住这个列表并进行检查,看看这些任务是否可理解,你没有写任何尴尬的语言或语法,所以他明白你想指派一个人为一个工作,所以他为你指派他,他明白你想要一些咖啡,所以他的角色已经结束,女仆(运行时间)开始运行这些任务,所以她去给你做一些咖啡,但突然她没有找到任何咖啡,所以她停止制作它或她的行为不同,让你喝点茶(当程序行为不同,因为他发现一个错误)。
恕我直言,你需要阅读许多链接,资源,以了解运行时与编译时间之间的区别,因为它是一个非常复杂的主题。我在下面列出了一些我推荐的图片/链接。
除了上面所说的我想补充一点,有时候一张价值1000字的图片:
CLR_diag编译时间然后运行时2
from Wiki
https://en.wikipedia.org/wiki/Run_time https://en.wikipedia.org/wiki/Run_time_(program_lifecycle_phase)
运行时,运行时或运行时可以参考:
计算
运行时间(程序生命周期阶段),计算机程序执行的时间段
运行时库,一个程序库,用于实现编程语言中内置的函数
运行时系统,旨在支持计算机程序执行的软件
软件执行,在运行时阶段逐个执行指令的过程
编译器列表 https://en.wikipedia.org/wiki/List_of_compilers
;
3.2这三件事之间的区别:编译vs构建vs运行时
https://www.quora.com/What-is-the-difference-between-build-run-and-compile Fernando Padoan,一位对语言设计有点好奇的开发人员回答2月23日我将回归其他答案:
运行是获得一些二进制可执行文件(或脚本,用于解释语言),以及...作为计算机上的新进程执行;编译是解析用某种高级语言编写的程序的过程(与机器代码相比更高),检查它的语法,语义,链接库,可能做一些优化,然后创建一个二进制可执行程序作为输出。此可执行文件可以是机器代码或某种字节代码的形式 - 即针对某种虚拟机的指令;构建通常涉及检查和提供依赖关系,检查代码,将代码编译为二进制文件,运行自动化测试以及将生成的二进制文件和其他资产(图像,配置文件,库等)打包成某种特定格式的可部署文件。请注意,大多数流程都是可选的,有些流程取决于您要构建的目标平台。例如,为Tomcat打包Java应用程序将输出.war文件。使用C ++代码构建Win32可执行文件只能输出.exe程序,或者也可以将其打包到.msi安装程序中。
这对S.O.来说不是一个好问题。 (这不是一个具体的编程问题),但总的来说这不是一个糟糕的问题。
如果你认为它是微不足道的:那么读取时间与编译时间有什么关系呢?何时这是一个有用的区别?那些编译器在运行时可用的语言呢? Guy Steele(没有假人,他)在CLTL2中写了7页关于EVAL-WHEN的内容,CL程序员可以使用它来控制它。 2个句子对于定义来说勉强够用,这个定义本身远远没有解释。
总的来说,语言设计者似乎试图避免这是一个棘手的问题。他们经常只说“这是一个编译器,它确实是编译时间的东西;之后的所有东西都是运行时,玩得开心”。 C旨在实现简单,而不是最灵活的计算环境。如果您没有在运行时使用编译器,或者能够轻松控制何时评估表达式,那么您最终会使用语言中的黑客来伪造宏的常见用法,或者用户想出了设计模式来模拟拥有更强大的结构。一个易于实现的语言绝对是一个有价值的目标,但这并不意味着它是最终所有的编程语言设计。 (我不使用EVAL-WHEN,但我无法想象没有它的生活。)
编译时和运行时的问题空间很大,而且很大程度上尚未开发。那不是说S.O.是进行讨论的合适场所,但我鼓励人们进一步探索这片领域,特别是那些对此应该没有先入为主的观念的人。这个问题既不简单也不愚蠢,我们至少可以指望审讯者朝着正确的方向前进。
不幸的是,我不知道有什么好的参考。 CLTL2稍微讨论了一下,但要了解它并不是很好。
编译时:您(开发人员)编译代码的时间段。
运行时间:用户运行您的软件的时间段。
你需要更明确的定义吗?
(编辑:以下内容适用于C#和类似的强类型编程语言。我不确定这对你有帮助)。
例如,在运行程序之前,编译器将检测到以下错误(在编译时),并将导致编译错误:
int i = "string"; --> error at compile-time
另一方面,编译器无法检测到如下错误。您将在运行时(程序运行时)收到错误/异常。
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):
在第一步中发生的事情据说发生在“编译时”,在第二步中发生的事情据说发生在“运行时”。
在解释程序中(例如MicroSoft basic(在dos上)和python(我认为)):
在这种情况下,编译时间和运行时间之间的差异很难确定,并且与程序员或用户的相关性更低。
Java是一种混合体,其中代码被编译为字节码,然后在虚拟机上运行,该虚拟机通常是字节码的解释器。
还有一个中间案例,其中程序被编译为字节码并立即运行(如在awk或perl中)。
基本上,如果您的编译器可以解决您的意思或“编译时”值是什么,它可以将其硬编码到运行时代码中。显然,如果运行时代码必须在每次运行速度较慢时进行计算,那么如果您可以在编译时确定某些内容,那就更好了。
例如。
恒定折叠:
如果我写:
int i = 2;
i += MY_CONSTANT;
编译器可以在编译时执行此计算,因为它知道2是什么,以及MY_CONSTANT是什么。因此,它不会在每次执行时执行计算。
嗯,好吧,运行时用于描述程序运行时发生的事情。
编译时用于描述在构建程序时(通常由编译器)发生的事情。
以下类似的问题What is the difference between run-time error and compiler error?回答
编译/编译时间/语法/语义错误:编译或编译时错误是由于输入错误而发生的错误,如果我们不遵循任何编程语言的正确语法和语义,则编译器会抛出编译时错误。在删除所有语法错误或调试编译时错误之前,它们不会让程序执行单行。
示例:在C中缺少分号或将int
错误分类为Int
。
运行时错误:运行时错误是程序处于运行状态时生成的错误。这些类型的错误会导致程序出现异常行为,甚至可能导致程序中断。它们通常被称为例外。 示例:假设您正在读取不存在的文件,将导致运行时错误。
在这里阅读更多关于所有programming errors的信息
在生成程序时,在编译时完成的事情(几乎)不会产生任何成本,但在构建程序时可能会产生很大的成本。
或多或少恰恰相反。构建时成本很低,程序运行时成本更高。
从另一边;如果在编译时完成某些操作,它只在您的计算机上运行,如果某些内容是运行时,它将在您的用户计算机上运行。
这很重要的一个例子是单位携带类型。编译时版本(如Boost.Units或my version in D)最终与使用本机浮点代码解决问题的速度一样快,而运行时版本最终必须打包有关值所在单位的信息并执行检查他们和每一次行动一起。另一方面,编译时版本要求在编译时知道值的单位,并且不能处理它们来自运行时输入的情况。