Answers:
编译时间和运行时间之间的差异是尖锐的理论家称之为相位区别的一个例子。这是最难学习的概念之一,特别是对于那些没有太多编程语言背景的人而言。为了解决这个问题,我觉得问一下很有帮助
可能出错的是运行时错误:
此外,程序本身也可能检测到错误:
我从错误以及何时发现错误的角度来考虑它。
编译时间:
string my_value = Console.ReadLine();
int i = my_value;
不能为字符串值分配int类型的变量,因此编译器在编译时肯定知道此代码有问题。
运行:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
这里的结果取决于ReadLine()返回的字符串。某些值可以解析为int,而其他则不能。这只能在运行时确定
.app
扩展时的编译时间吗?还是在每次用户启动应用时启动时发生?
编译时间:您(开发人员)用来编译代码的时间段。
运行时间:用户运行您的软件的时间段。
您需要更清晰的定义吗?
int x = 3/0
该怎么办,可以说,但是您对此变量不做任何事情。我们不打印它或任何东西。仍将其视为运行时错误吗?
(编辑:以下内容适用于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
将源代码转换为发生在[screen | disk | network]上的东西有两种方法(大致)。称他们为编译和解释。
在已编译的程序中(示例为c和fortran):
第一步中发生的事情据说是在“编译时”发生的,第二步中发生的事情是据说在“运行时”发生的。
在解释程序中(示例MicroSoft basic(在dos上)和python(我认为)):
在这种情况下,编译时间和运行时间之间的差异很难确定,并且与程序员或用户无关。
Java是一种混合程序,其中代码被编译为字节码,然后在虚拟机上运行,该虚拟机通常是字节码的解释器。
还有一种中间情况,其中程序被编译为字节码并立即运行(如在awk或perl中)。
基本上,如果您的编译器可以弄清楚您的意思或“编译时”的值,则可以将其硬编码为运行时代码。显然,如果您的运行时代码每次都必须执行一次计算时,运行速度就会变慢,因此,如果您可以在编译时确定某些内容,那就更好了。
例如。
恒定折叠:
如果我写:
int i = 2;
i += MY_CONSTANT;
编译器可以在编译时执行此计算,因为它知道2是什么,什么是MY_CONSTANT。这样,它可以避免每次执行都执行计算。
在运行结果程序时,在编译时完成的事情几乎不会产生任何费用,但是在生成程序时可能会产生很大的费用。
恰恰相反。构建时成本很小,运行程序时成本更高。
从另一面看 如果某件事在编译时完成,则仅在您的计算机上运行,如果某事在运行时,则在您的用户计算机上运行。
一个重要的例子是单位运载类型。最终,编译时版本(例如Boost.Units或D中的我的版本)的运行速度与解决本机浮点代码的问题一样快,而运行时版本最终不得不打包有关值的单位的信息并在每个操作旁边对它们进行检查。另一方面,编译时版本要求值的单位在编译时是已知的,并且不能处理它们来自运行时输入的情况。
从前面类似的问题答案中可以得出以下结论:运行时错误和编译器错误有什么区别?
编译/编译时间/语法/语义错误:编译或编译时间错误是由于键入错误而引起的错误,如果我们未遵循任何编程语言的正确语法和语义,则编译器将抛出编译时间错误。在删除所有语法错误或调试编译时错误之前,它们不会让您的程序执行一行。
示例:缺少C的分号或错误int
地输入Int
。
运行时错误:运行时错误是程序处于运行状态时生成的错误。这些类型的错误将导致您的程序表现异常,甚至可能导致您的程序死亡。它们通常称为异常。
示例:假设您正在读取一个不存在的文件,将导致运行时错误。
在此处详细了解所有编程错误
作为其他答案的补充,这是我向外行解释的方式:
您的源代码就像一艘船的蓝图。它定义了船只的制造方式。
如果您将蓝图交给造船厂,而他们在造船时发现有缺陷,他们将停止造船,并在船舶离开船坞或接触水之前立即向您报告。这是一个编译时错误。该船甚至从未真正漂浮或使用其引擎。发现该错误是因为它甚至阻止了该船的制造。
当您的代码编译时,就好像飞船已经完成了。已建成并准备就绪。当您执行代码时,就像在远航中发射飞船一样。登上乘客,发动机在运转,船体在水上,所以这是运行时间。如果您的船有致命的缺陷使它在首次航行中沉没(或者可能在以后的航行中感到头疼),那么它将遭受运行时错误。
这是“ JAVA编程简介”一书的作者Daniel Liang关于编译的引文:
“用高级语言编写的程序称为源程序或源代码。由于计算机无法执行源程序,因此必须将源程序转换为机器代码以执行。可以使用另一种编程工具来完成该转换。解释器或编译器。” (Daniel Liang,“ JAVA编程简介”,第8页)。
...他继续...
“编译器将整个源代码转换为机器代码文件,然后执行机器代码文件”
首先,当我们打入高级/人类可读的代码时,这毫无用处!它必须在您的小CPU上转换为一系列“电子事件”!第一步是编译。
简而言之:在此阶段会发生编译时错误,而稍后会发生运行时错误。
切记:仅仅因为程序编译没有错误并不意味着它会正确运行。
在程序生命周期的就绪,运行或等待部分中将发生运行时错误,而在生命周期的“新”阶段之前将发生编译时错误。
编译时错误的示例:
语法错误-如果代码不明确,如何将它们编译为机器级指令?您的代码需要100%符合该语言的语法规则,否则无法将其编译为有效的机器代码。
运行时错误的示例:
内存不足-给定特定程度的变量,例如调用递归函数可能会导致堆栈溢出!编译器如何预料到这一点!这不可以。
那就是编译时错误和运行时错误之间的区别
编译时间: 将源代码转换为机器代码以使其成为可执行文件所花费的时间称为编译时间。
运行时: 当应用程序运行时,称为运行时。
编译时错误是那些语法错误,缺少文件引用错误。在将源代码编译成可执行程序之后,并且在程序运行时会发生运行时错误。例如程序崩溃,程序意外行为或功能不起作用。
这是对“运行时与编译时之间的差异?”问题的答案的扩展。- 管理费用差异与运行时和编译时相关的?
产品的运行时性能可通过更快地交付结果来提高其质量。该产品的编译时性能通过缩短编辑-编译-调试周期来提高其及时性。但是,运行时性能和编译时性能都是获得及时质量的次要因素。因此,只有在整体产品质量和及时性得到改善的情况下,才应考虑运行时和编译时性能的改善。
在这里进一步阅读的好资料:
这是一个非常简单的答案:
运行时和编译时是编程术语,指的是软件程序开发的不同阶段。为了创建程序,开发人员首先编写源代码,该源代码定义了程序将如何运行。小型程序可能仅包含几百行源代码,而大型程序可能包含数十万行源代码。必须将源代码编译为机器代码才能成为可执行程序。此编译过程称为编译时间。(将编译器视为翻译器)
编译的程序可以由用户打开和运行。当应用程序正在运行时,它称为运行时。
程序员经常使用术语“运行时”和“编译时”来指代不同类型的错误。编译时错误是诸如语法错误或文件引用丢失之类的问题,它们阻止程序成功进行编译。编译器会产生编译时错误,并且通常会指出导致问题的源代码行。
如果程序的源代码已经被编译为可执行程序,则在程序运行时它可能仍然会出现错误。示例包括无法使用的功能,程序意外行为或程序崩溃。这些类型的问题称为运行时错误,因为它们在运行时发生。
恕我直言,您需要阅读许多链接和资源,以了解运行时与编译时之间的时差,因为这是一个非常复杂的主题。我在下面列出了一些我推荐的图片/链接。
除了上面所说的,我想补充一点,有时一张价值1000字的图片:
CLR_diag编译时间,然后运行时2
from Wiki
https://zh.wikipedia.org/wiki/运行时间 https://zh.wikipedia.org/wiki/运行时间(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安装程序中。
看这个例子:
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)
就像在编译时检查了某些情况一样,在运行时间过后,一旦程序满足所有条件,您就已经检查了某些情况,您将获得输出。否则,您将获得编译时或运行时错误。
公共类RuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
对于SO来说,这不是一个好问题(这不是一个特定的编程问题),但总的来说,这不是一个坏问题。
如果您认为这很琐碎:那么读取时间与编译时间又如何呢?什么时候才是有用的区分呢?在运行时可以使用编译器的语言呢?盖伊·斯蒂尔(Guy Steele,他不是虚拟人)在CLTL2中写了7页关于EVAL-WHEN的页面,CL程序员可以用它来控制此情况。2个句子几乎不足以给出一个定义,而定义本身远远不够解释。
通常,语言设计师似乎一直在努力避免这个难题。他们经常说“这是一个编译器,它可以完成编译时的事情;在此之后的所有事情都可以在运行时玩得开心”。C被设计为易于实现,而不是最灵活的计算环境。如果您在运行时没有可用的编译器,或者无法轻松控制对表达式进行评估的能力,则您最终会遭受该语言的黑客攻击,以伪造宏的常用用法,或者用户想出了设计模式来进行仿真具有更强大的结构。易于实现的语言绝对是一个值得追求的目标,但这并不意味着它就是编程语言设计的全部。(我很少使用EVAL-WHEN,但是如果没有它,我无法想象生活。)
而且,围绕编译时和运行时的问题空间很大,并且仍在很大程度上未被开发。这并不是说SO是进行讨论的合适地点,但我鼓励人们进一步探索这个领域,尤其是那些对应该做什么应该有先入为主的概念的人们。这个问题既不简单也不愚蠢,我们至少可以将调查者指向正确的方向。
不幸的是,我对此没有任何好的参考。CLTL2讨论了一下,但是对于学习它并不是很好。