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
这很重要的一个例子是单位携带类型 . 编译时版本(如Boost.Units或my version in D)最终与使用本机浮点代码解决问题一样快,而运行时版本最终必须打包有关值所在单位的信息并执行检查他们和每一次行动一起 . 另一方面,编译时版本要求在编译时知道值的单位,并且不能处理它们来自运行时输入的情况 .
25 回答
编译时和运行时之间的差异是一个尖头理论家称之为phase distinction的例子 . 这是最难学习的概念之一,特别是对于没有很多编程语言背景的人 . 为了解决这个问题,我觉得提问很有帮助
程序满足哪些不变量?
这个阶段会出现什么问题?
如果阶段成功,后置条件是什么(我们知道什么)?
有什么输入和输出?
编译时间
该程序不需要满足任何不变量 . 事实上,它根本不需要是一个结构良好的程序 . 您可以将此HTML提供给编译器并观察它barf ...
编译时可能出现的问题:
语法错误
Typechecking错误
(很少)编译器崩溃
如果编译器成功,我们知道什么?
该计划形成良好 - 无论用何种语言都是一个有意义的计划 .
可以开始运行程序 . (该程序可能会立即失败,但至少我们可以尝试 . )
输入和输出是什么?
输入是正在编译的程序,以及为了编译而需要导入的任何头文件,接口,库或其他voodoo .
输出有望是汇编代码或可重定位目标代码,甚至是可执行程序 . 或者如果出现问题,输出就是一堆错误消息 .
运行时间
我们对程序的不变量一无所知 - 它们都是程序员所放入的 . 运行时不变量很少由编译器强制执行;它需要程序员的帮助 .
运行时错误可能出错:
除以零
取消引用空指针
内存不足
此外,程序本身可能会检测到错误:
试图打开不存在的文件
尝试查找网页并发现指称的网址格式不正确
如果运行时成功,程序将完成(或继续)而不会崩溃 .
输入和输出完全取决于程序员 . 文件,屏幕上的窗口,网络数据包,发送到打印机的作业,您的名字 . 如果程序发射导弹,那就是输出,它只在运行时发生:-)
我从错误的角度考虑它,何时可以捕获它们 .
编译时间:
无法为字符串值分配int类型的变量,因此编译器在编译时确定此代码存在问题
运行:
这里的结果取决于ReadLine()返回的字符串 . 有些值可以解析为int,有些则不能 . 这只能在运行时确定
Compile-time: 您(开发人员)正在编译代码的时间段 .
Run-time: 用户运行您的软件的时间段 .
你需要更明确的定义吗?
( edit :以下内容适用于C#和类似的强类型编程语言 . 我不确定这是否对您有所帮助) .
例如,在运行程序之前,编译器(在 compile time )将检测到以下错误,并将导致编译错误:
另一方面,编译器无法检测到如下错误 . 您将在 run-time (程序运行时)收到错误/异常 .
将源代码翻译成[发布在[屏幕|磁盘|网络]上的东西)可以(大致)以两种方式进行;叫他们编译和解释 .
在一个 compiled 程序中(例子是c和fortran):
源代码被送入另一个程序(通常称为编译器 - 图),它产生一个可执行程序(或错误) .
运行可执行文件(通过双击它,或在命令行上输入它的名称)
据说第一步发生的事情发生在"compile time",第二步发生的事情据说发生在"run time" .
在一个 interpreted 程序中(例如MicroSoft basic(在dos上)和python(我认为)):
在这种情况下,编译时间和运行时间之间的差异很难确定,并且与程序员或用户的相关性更低 .
Java是一种混合体,其中代码被编译为字节码,然后在虚拟机上运行,该虚拟机通常是字节码的解释器 .
还有一个中间案例,其中程序被编译为字节码并立即运行(如在awk或perl中) .
基本上,如果您的编译器可以解决您的意思或“在编译时”值是什么,它可以将其硬编码到运行时代码中 . 显然,如果运行时代码每次运行速度较慢时都必须进行计算,那么如果可以在编译时确定某些内容,那就更好了 .
例如 .
恒定折叠:
如果我写:
编译器可以在编译时执行此计算,因为它知道2是什么,以及MY_CONSTANT是什么 . 因此,它不会在每次执行时执行计算 .
嗯,好吧,运行时用于描述程序运行时发生的事情 .
编译时用于描述在构建程序时(通常由编译器)发生的事情 .
看看这个例子:
公共课测试{
上面的代码编译成功,没有语法错误,完全有效 . 但是在运行时它会抛出以下错误 .
就像在编译时检查某些情况一样,在该运行时间之后,一旦程序满足所有条件就会检查某些情况,您将获得输出 . 否则,您将收到编译时或运行时错误 .
以往类似的问题回答What is the difference between run-time error and compiler error?
Compilation/Compile time/Syntax/Semantic errors: 由于输入错误导致编译或编译时错误,如果我们不遵循任何编程语言的正确语法和语义,则编译器会抛出编译时错误 . 在删除所有语法错误或调试编译时错误之前,他们不会让程序执行单行 .
示例:在C中缺少分号或将
int
错误地分类为Int
.Runtime errors: 运行时错误是程序处于运行状态时生成的错误 . 这些类型的错误会导致程序出现异常行为,甚至可能导致程序中断 . 它们通常被称为例外 .
示例:假设您正在读取不存在的文件,将导致运行时错误 .
在这里阅读所有programming errors的更多信息
编译时间:
在生成程序时,在编译时完成的任务(几乎)不会产生任何成本,但在构建程序时可能会产生很大的成本 .
运行时间:
或多或少恰恰相反 . 构建时成本很低,程序运行时成本更高 .
从另一边;如果在编译时完成某些操作,它只在您的计算机上运行,如果某些内容是运行时,它将在您的用户计算机上运行 .
相关性
这很重要的一个例子是单位携带类型 . 编译时版本(如Boost.Units或my version in D)最终与使用本机浮点代码解决问题一样快,而运行时版本最终必须打包有关值所在单位的信息并执行检查他们和每一次行动一起 . 另一方面,编译时版本要求在编译时知道值的单位,并且不能处理它们来自运行时输入的情况 .
例如:在强类型语言中,可以在编译时或运行时检查类型 . 在编译时,这意味着编译器会抱怨类型是否不兼容 . 在运行时意味着,您可以编译您的程序,但在运行时,它会抛出异常 .
简单的字差b / w编译时间和运行时间 .
编译时:开发人员以.java格式编写程序并转换为类文件字节码,在编译期间,任何错误都可以定义为编译时错误 .
运行时:生成的.class文件由应用程序用于其附加功能,逻辑结果是错误的并抛出错误,这是一个运行时错误
以下是关于编译主题的“JAVA编程简介”一书的作者Daniel Liang的引用:
...他继续...
当我们打入高级/人类可读的代码时,这首先是无用的!它必须在你的小CPU中翻译成一系列“电子事件”!迈向这一步的第一步是汇编 .
简单地说:在此阶段发生编译时错误,而稍后发生运行时错误 .
Remember: Just because a program is compiled without error does not mean it will run without error.
运行时错误将发生在程序生命周期的就绪,运行或等待部分,而编译时错误将发生在生命周期的“新”阶段之前 .
Example of a Compile-time error:
语法错误 - 如果代码不明确,如何将代码编译成机器级指令?您的代码需要100%符合该语言的语法规则,否则无法编译成工作machine code .
Example of a run-time error:
耗尽内存 - 例如,对递归函数的调用可能会导致堆栈溢出给定特定程度的变量!如何通过编译器预测到这一点!?这不可以 .
这就是编译时错误和运行时错误之间的区别
作为其他答案的附加内容,以下是我向外行人解释的方法:
您的源代码就像一艘船的蓝图 . 它定义了如何制造船舶 .
如果你把你的蓝图交给造船厂,并且他们在建造船舶时发现了缺陷,他们将在船离开干船坞或接触水之前立即停止建造并立即报告给你 . 这是编译时错误 . 这艘船甚至从未真正浮动或使用其发动机 . 发现错误是因为它阻止了船舶的制造 .
当您的代码编译时,就像船只完成一样 . 建成并准备好了 . 当您执行代码时,就像在航行中启动船舶一样 . 乘客登机,发动机正在运行,船体在水面上,所以这是运行时间 . 如果你的船有一个致命的缺陷,在它的处女航中沉没(或者可能是因为额外的头痛之后的一些航行),那么它会遇到运行时错误 .
运行时意味着运行程序时会发生一些事情 .
编译时间意味着编译程序时会发生某些事情 .
编译时间:
在生成程序时,在编译时完成的任务(几乎)不会产生任何成本,但在构建程序时可能会产生很大的成本 . 运行:
或多或少恰恰相反 . 构建时成本很低,程序运行时成本更高 .
从另一边;如果在编译时完成某些操作,它只在您的计算机上运行,如果某些内容是运行时,它将在您的用户计算机上运行 .
Compile time: 将源代码转换为机器代码以使其成为可执行文件所花费的时间称为编译时间 .
Run time: 应用程序运行时,称为运行时 .
编译时错误是那些语法错误,缺少文件引用错误 . 源代码编译成可执行程序并且程序运行时发生运行时错误 . 例如程序崩溃,意外的程序行为或功能不起作用 .
Runtime vs Compile time
运行时和编译时是编程术语,指的是软件程序开发的不同阶段 .
Compile-time is the instance where the code you entered is converted to executable while Run-time is the instance where the executable is running.
程序员经常使用术语“运行时”和“编译时间”来引用不同类型的错误 .
编译时检查发生在编译期间 . 编译时错误是由于输入错误而发生的错误,如果我们不遵循任何编程语言的正确语法和语义,则编译器会抛出编译时错误 . 在删除所有语法错误或调试编译时错误之前,他们不会让程序执行单行 .
The following are usual compile time errors:
Syntax errors
Typechecking errors
Compiler crashes (Rarely)
在程序运行期间发生运行时类型检查 . 运行时错误是程序处于运行状态时生成的错误 . 这些类型的错误会导致程序出现异常行为,甚至可能导致程序中断 . 它们通常被称为例外 . 该
following are some usual runtime errors:
Division by zero
Dereferencing a null pointer
Running out of memory
这是对问题的答案的扩展"difference between run-time and compile-time?" - 与运行时和编译时相关的 overheads 的差异?
产品的运行时性能通过更快地提供结果来提高其质量 . 产品的编译时性能通过缩短编辑 - 编译 - 调试周期来提高其及时性 . 但是,运行时性能和编译时性能都是实现及时质量的次要因素 . 因此,只有通过改进整体产品质量和及时性,才能考虑运行时和编译时性能改进 .
进一步阅读的一个很好的来源here:
我一直认为它与程序处理开销有关,以及它如何影响前面所述的性能 . 一个简单的例子是,或者在代码中定义我的对象所需的绝对内存 .
定义的布尔值占用x内存,然后在编译的程序中,不能更改 . 当程序运行时,它确切地知道为x分配多少内存 .
另一方面,如果我只定义一个通用对象类型(即一种未定义的占位符或者可能是一个指向某个巨型blob的指针),我的对象所需的实际内存在程序运行之前是不可知的,我会为其分配一些东西因此必须对其进行评估,然后在运行时动态处理内存分配等(更多的运行时间开销) .
它的动态处理方式取决于语言,编译器,操作系统,代码等 .
然而,在这方面,它实际上取决于您使用运行时间与编译时间的上下文 .
我们可以根据不同的两大类静态绑定和动态绑定对这些进行分类 . 它基于何时使用相应的值进行绑定 . 如果在编译时解析引用,则它是静态绑定,如果在运行时解析引用,则它是动态绑定 . 静态绑定和动态绑定也称为早期结合和晚期结合 . 有时它们也被称为静态多态和动态多态 .
约瑟夫库兰代 .
运行时和编译时的主要区别是:
int a = 1 int b = a/0;
这里第一行末尾没有分号--->执行程序执行程序b后编译时错误,结果是无限--->运行时错误 .
这是一个非常简单的答案:
运行时和编译时是编程术语,指的是软件程序开发的不同阶段 . 为了创建程序,开发人员首先编写源代码,该代码定义程序的运行方式 . 小程序可能只包含几百行源代码,而大程序可能包含数十万行源代码 . 源代码必须编译成机器代码才能成为可执行程序 . 这个编译过程称为编译时间 . (将编译器视为翻译器)
编译的程序可以由用户打开和运行 . 当应用程序运行时,它被称为运行时 .
程序员经常使用术语“运行时”和“编译时间”来指代不同类型的错误 . 编译时错误是一个问题,例如语法错误或缺少文件引用,导致程序无法成功编译 . 编译器会产生编译时错误,通常会指示导致问题的源代码行 .
如果程序的源代码已经编译成可执行程序,则程序运行时可能仍会出现错误 . 示例包括不起作用的功能,意外的程序行为或程序崩溃 . 这些类型的问题称为运行时错误,因为它们在运行时发生 .
The reference
除了上面所说的,我想补充一点,有时一张 Value 1000字的图片:
;
CLR_diag编译时间然后运行时2
;
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的设计易于实现,而不是最灵活的计算环境 . 如果您没有在运行时使用编译器,或者能够轻松控制何时评估表达式,那么您最终会使用语言中的黑客来伪造宏的常见用法,或者用户想出了设计模式来模拟拥有更强大的结构 . 一个易于实现的语言绝对是一个有 Value 的目标,但这并不意味着它是最终所有的编程语言设计 . (我不会使用EVAL-WHEN,但我无法想象没有它的生活 . )
编译时和运行时的问题空间很大,而且很大程度上尚未开发 . 那不是说S.O.是进行讨论的合适场所,但我鼓励人们进一步探索这片领域,特别是那些对此应该没有先入为主的观念的人 . 这个问题既不简单也不愚蠢,我们至少可以将审讯者指向正确的方向 .
不幸的是,我不知道有什么好的参考 . CLTL2稍微讨论了一下,但要了解它并不是很好 .