以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了.

编译时

编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.如果你用微软的VS的话,点下build.那就开始编译,如果下面有errors或者warning信息,那都是编译器检查出来的.所谓这时的错误就叫编译时错误,这个过程中做的啥类型检查也就叫编译时类型检查,或静态类型检查(所谓静态嘛就是没把真把代码放内存中运行起来,而只是把代码当作文本来扫描下).所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

运行时

所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.

举例说明

可能光讲概念你还是迷糊.还分别用C++和C#来举个简单点的例子.数组越界检查的例子(开发工具用的微软的VS)

C++中

int arr[] = {1,2,3};

int result = arr[4];

cout<<result<<endl;

上面的代码你一瞧你知道是错误的代码,数组越界了.但用编译器一编译,一点错都没.可见编译器其实还是挺笨的,还没你脑瓜子那么聪明啊.然后开始运行,Start Dubugging.于是报错了,于是你想虽然编译器笨了点,但运行起来时发现了错误也还不算太坏.但实际上运行时做数组的越界检查不是C++里面支持的特性,这里你dubug是VS中的一些工具给你做的检查.你如果点运行时选的是release而不是dubug的话会发现一切正常运行,但得到的结果不确定的.(因为你不知道arr[4]所指的内存里具有有啥数据.反正所以东东在内存中都是0101串嘛,你找到连续4个字节的一串0101来然后当成int数据处理.)我一运行得到个吓人的数字,数了下貌似是十亿多.要是银行计算我的账户中有多少钱时也这样来个数组越界,搞个十多亿那我可发了啊.哎显然是想多了,还是老实敲代码吧.

C#中

int[] arr = { 1, 2, 3 };

int result = arr[4];

Console.WriteLine(result);

一编译还是正常通过.但一运行就报错了啊.C#与C++中不同,它有与运行时类型检查.会检查数组是否越界不.如果越界了不会给你返回个错误的结果,而是直接报错.你如果没有异常处理语句处理的话整个软件就挂掉了啊.

为啥C++不在运行时做数组越界检查呢?

这应该主要是考虑到性能问题吧.C++设计之初为了达到与C差不多的效率.就尽量不会在运行时多做些额外的检查.因为这样无疑会降低性能的. 但有些地方却是必须得做运行时类型检查的.比如多态,你不在运行时做类型检查就没法搞定啊.举个简单例子吧.假如有父类Father,继承自Father的子类Son.这两个类中都有虚函数Fun.

Father fa;

Son so;

fa = so;

fa.Fun();   //在编译时,实际上是把Fun当作Father类中的Fun看待.

//但在运行时实际上这里的Fun是调用的Son中的函数Fun.所以不做运行时类型检查是没法确定的啊.

什么叫编译时和运行时相关推荐

  1. 编译时和运行时、OC中对象的动态编译机制

    编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...

  2. JVM编译时和运行时状态

    1.jvm对成员变量和成员方法和绑定机制只有两种: 一种是:静态绑定,一种是动态绑定.(在子类和父类上才会出现动态和静态的绑定) 2.我们总结:只有实例方法是动态绑定,其他全部是静态绑定

  3. java编译异常和运行时异常_浅谈异常结构图、编译期异常和运行期异常的区别...

    异常处理一般有2种方式,要么捕获异常try-catch,要么抛出异常throws 如果一个方法后面抛出一个运行时期异常(throws RuntimeException),调用者无须处理 如果一个方法后 ...

  4. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

  5. 【iOS沉思录】Objective-C语言的动态性总结(编译时与运行时)

    编译时与运行时 编译时: 即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查报错,包括词法分析.语法分析等等,将程序代码翻译成计算机能够识别的语言(例如汇编等),编译通过并不意味着程序就可以成 ...

  6. java中的编译时异常和运行时异常

    首先区分一下 编译时异常和运行时异常 运行时异常,也就是extends RuntimeException的异常编译时不用try{}catch(){}和throws 编译时异常,也就是extends E ...

  7. 编译时异常和运行时异常的区别

    编译时异常和运行时异常的区别 参考文章: (1)编译时异常和运行时异常的区别 (2)https://www.cnblogs.com/lxl57610/p/6716252.html (3)https:/ ...

  8. C++编译时多态和运行时多态

    C++编译时多态和运行时多态 作者:melonstreet 出处:https://www.cnblogs.com/QG-whz/p/5132745.html 本文版权归作者和博客园共有,欢迎转载,但未 ...

  9. 异常---编译时异常和运行时异常:IO异常、NullPointerException、ArrayIndexOutBoundsException、ClassCastExoeption

    一.概述 1.定义: 程序运行过程中的发生了不正常的情况 2.异常处理机制和作用----JVM虚拟机打印的 java语言时很完善的语言,提供了异常处理方式,出现异常,将异常信息打印到输出控制台,供程序 ...

最新文章

  1. Linux SSH远程文件/文件夹传输命令scp
  2. 成功解决Fatal error in launcher: Unable to create process using ‘“f:\program files\python\python36\pytho
  3. [待总结]各种中文乱码分析与处理:数据库、eclipse、linux to windows、web应用
  4. 【视频】vue指令之v-else-if
  5. JSP引入CSS文件无法生效的问题
  6. 170609、Nginx配置文件详细说明
  7. 查看centos硬件配置
  8. js中不能做变量名的字符
  9. 关于:Table '项目名称..hibernate_sequence' doesn't exist的解决方法
  10. ffmpeg转换进度计算公式
  11. Google earth engine(GEE)——LANDSAT8统计不同点的DN值
  12. 对于路由地址并未切换,但是地址栏发生地址发生变化原因
  13. python多个if_Python之条件判断/if嵌套/如何写嵌套代码
  14. SDEdit一点成画,小白也能是绘画大师!
  15. 你对本岗位的认识PHP,本岗位工作认识
  16. solidworks属性管理器_SOLIDWORKS BOM快捷生成第一步 | 完善产品属性
  17. uni-app 获取移动设备的MAC地址
  18. c3p0连接池的详细配置
  19. Android Studio 3.0+ 新Dex编译器D8 Desugar R8
  20. luogu P2124 奶牛美容

热门文章

  1. php 删除子字符串函数,PHP删除字符串中的任何字符函数
  2. oracle fra空间不足,ORACLE 基础解决方案1_扩大FRA区
  3. FPGA之道(7)时钟网络资源
  4. 【 FPGA 】认识关键BUFFER
  5. 【 压缩感知 】OMP恢复算法
  6. Lintcode132 Word Search || solution 题解
  7. 利用ConfigParser读取配置文件
  8. 文本查找查找命令的grep 、egrep、fgrep用法的详解
  9. 修改zend studio字符集
  10. Google Chrome浏览器必备的20个插件