Nor*_*sey 445
编译时间和运行时间之间的差异是尖头理论家称之为阶段区分的一个例子.这是最难学习的概念之一,特别是对于没有很多编程语言背景的人.为了解决这个问题,我觉得提问很有帮助
可能出现的错误是运行时错误:
此外,程序本身可能会检测到错误:
puf*_*ish 164
我从错误的角度考虑它,何时可以捕获它们.
编译时间:
string my_value = Console.ReadLine();
int i = my_value;
Run Code Online (Sandbox Code Playgroud)
无法为字符串值分配int类型的变量,因此编译器在编译时确定该代码存在问题
运行:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
Run Code Online (Sandbox Code Playgroud)
这里的结果取决于ReadLine()返回的字符串.有些值可以解析为int,有些则不能.这只能在运行时确定
Yuv*_*dam 64
编译时:您(开发人员)编译代码的时间段.
运行时间:用户运行您的软件的时间段.
你需要更明确的定义吗?
M4N*_*M4N 21
(编辑:以下内容适用于C#和类似的强类型编程语言.我不确定这对你有帮助).
例如,在运行程序之前,编译器将检测到以下错误(在编译时),并将导致编译错误:
int i = "string"; --> error at compile-time
Run Code Online (Sandbox Code Playgroud)
另一方面,编译器无法检测到如下错误.您将在运行时(程序运行时)收到错误/异常.
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
Run Code Online (Sandbox Code Playgroud)
dmc*_*kee 18
将源代码翻译成[发生在[屏幕|磁盘|网络]上的东西)可以(大致)以两种方式进行; 叫他们编译和解释.
在编译的程序中(例子是c和fortran):
在第一步中发生的事情据说发生在"编译时",在第二步中发生的事情据说发生在"运行时".
在解释程序中(例如MicroSoft basic(在dos上)和python(我认为)):
在这种情况下,编译时间和运行时间之间的差异很难确定,并且与程序员或用户的相关性更低.
Java是一种混合体,其中代码被编译为字节码,然后在虚拟机上运行,该虚拟机通常是字节码的解释器.
还有一个中间案例,其中程序被编译为字节码并立即运行(如在awk或perl中).
Spe*_*nce 11
基本上,如果您的编译器可以解决您的意思或"编译时"值是什么,它可以将其硬编码到运行时代码中.显然,如果运行时代码必须在每次运行速度较慢时进行计算,那么如果您可以在编译时确定某些内容,那就更好了.
例如.
恒定折叠:
如果我写:
int i = 2;
i += MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)
编译器可以在编译时执行此计算,因为它知道2是什么,以及MY_CONSTANT是什么.因此,它不会在每次执行时执行计算.
在生成程序时,在编译时完成的事情(几乎)不会产生任何成本,但在构建程序时可能会产生很大的成本.
或多或少恰恰相反.构建时成本很低,程序运行时成本更高.
从另一边; 如果在编译时完成某些操作,它只在您的计算机上运行,如果某些内容是运行时,它将在您的用户计算机上运行.
这很重要的一个例子是单位携带类型.编译时版本(如Boost.Units或我在D中的版本)的结果与使用本机浮点代码解决问题的速度一样快,而运行时版本最终不得不打包有关值的单位的信息.并在每次操作中对它们进行检查.另一方面,编译时版本要求在编译时知道值的单位,并且不能处理它们来自运行时输入的情况.
以前类似的问题回答以下是运行时错误和编译器错误之间的区别?
编译/编译时间/语法/语义错误:编译或编译时错误是由于输入错误而发生的错误,如果我们不遵循任何编程语言的正确语法和语义,则编译器会抛出编译时错误.在删除所有语法错误或调试编译时错误之前,它们不会让程序执行单行.
示例:在C中缺少分号或错误输入int为Int.
运行时错误:运行时错误是程序处于运行状态时生成的错误.这些类型的错误会导致程序出现异常行为,甚至可能导致程序中断.它们通常被称为例外.
示例:假设您正在读取不存在的文件,将导致运行时错误.
阅读更多有关所有编程错误的信息
小智 6
以下是《Java 编程简介》的作者 Daniel Liang 关于编译主题的引用:
“用高级语言编写的程序称为源程序或源代码。由于计算机无法执行源程序,因此必须将源程序翻译成机器代码才能执行。翻译可以使用另一种称为解释器或编译器。” (Daniel Liang,“JAVA 编程简介”,第 8 页)。
...他继续...
“编译器将整个源代码翻译成机器代码文件,然后执行机器代码文件”
当我们输入高级/人类可读的代码时,这起初是无用的!它必须在您小小的 CPU 中转化为一系列“电子事件”!实现这一目标的第一步是编译。
简单地说:编译时错误发生在这个阶段,而运行时错误发生在后面。
请记住:仅仅因为程序编译没有错误并不意味着它会运行没有错误。
运行时错误将发生在程序生命周期的准备、运行或等待部分,而编译时错误将发生在生命周期的“新建”阶段之前。
编译时错误示例:
语法错误 - 如果您的代码有歧义,如何将它们编译成机器级指令?您的代码需要 100% 符合语言的语法规则,否则无法编译为工作机器代码。
运行时错误示例:
内存不足 - 例如,给定特定程度的变量,对递归函数的调用可能会导致堆栈溢出!编译器怎么能预料到这一点!?这不可以。
这就是编译时错误和运行时错误之间的区别
小智 6
作为其他答案的补充,这是我向外行解释的方式:
您的源代码就像一艘船的蓝图。它定义了船只的制造方式。
如果您将蓝图交给造船厂,而他们在造船时发现有缺陷,他们将停止造船,并在船舶离开船坞或接触水之前立即向您报告。这是一个编译时错误。该船甚至从未真正漂浮或使用其引擎。发现该错误是因为它甚至阻止了该船的制造。
当您的代码编译时,就好像飞船已经完成了。已建成并准备就绪。当您执行代码时,就像在远航中发射飞船一样。登上乘客,发动机在运转,船体在水上,所以这是运行时间。如果您的船有致命缺陷,使它在首次航行中沉没(或者可能为额外的麻烦而航行),则它会遇到运行时错误。
小智 5
编译时:开发者以.java格式编写程序并转换成字节码,这是一个类文件,在这个编译过程中发生的任何错误都可以定义为编译时错误。
运行时:应用程序将生成的 .class 文件用于其附加功能,结果逻辑错误并引发错误,这是运行时错误
编译时间: 将源代码转换为机器代码以使其成为可执行文件所需的时间称为编译时间。
运行时: 当应用程序运行时,称为运行时。
编译时错误是那些语法错误、缺少文件引用错误。运行时错误发生在源代码编译成可执行程序之后以及程序运行时。例如程序崩溃、意外的程序行为或功能不起作用。
小智 5
想象一下,你是一个老板,你有一个助手和一个女仆,你给他们一个任务清单,助手(编译时)会抓取这个清单并进行检查,看看任务是否可以理解,你没有用任何笨拙的语言或语法写作,所以他明白你想为一个工作分配某人所以他为你分配他并且他明白你想要一些咖啡,所以他的角色结束了女仆(运行时间)开始运行这些任务,所以她去给你泡咖啡,但突然间她没有找到任何可以煮的咖啡,所以她停止制作,或者她的行为不同并为你泡茶(当程序行为不同时,因为他发现了一个错误)。
| 归档时间: |
|
| 查看次数: |
275204 次 |
| 最近记录: |