当前位置:首页 » 编程软件 » 编译器的runtime

编译器的runtime

发布时间: 2023-01-15 20:21:10

‘壹’ 编译器不会强制程序员处理哪种异常

java编译器中,是不会强制要求程序员进行处理Runtime异常的。

RuntimeException类及其子类的实例被称为运行时异常,即UnChecked Exception。

我们较为常见的NullPointerException(空指针异常)和 IndexOutOfBoundsException(数组越界异常),对于这些Runtime异常。

在java编译器中是不会强制要求程序员进行处理或声明的(有些IDE可能会给可能出现Runtime异常问题的提示,但不会报错)。

常见的RunTime异常几种如下:

NullPointerException - 空指针引用异常。

ClassCastException - 类型强制转换异常。

IllegalArgumentException - 传递非法参数异常。

ArithmeticException - 算术运算异常。

ArrayStoreException - 向数组中存放与声明类型不兼容对象异常。

IndexOutOfBoundsException - 下标越界异常。

NegativeArraySizeException - 创建一个大小为负数的数组错误异常。

NumberFormatException - 数字格式异常。

SecurityException - 安全异常。

UnsupportedOperationException - 不支持的操作异常。

‘贰’ C语言问题,编译器上自己调试没问题,但在线提交时总显示Runtime error,怎么解决

Microsoft Visual C++ Runtime Library Runtime Error!这个出错的原因基本上都是以下几个造成的:
一、系统Microsoft Visual C++运行库版本旧,而软件或网站所需要的运行库需要较新的版本,尤其是玩新游戏的时候。
二、系统Microsoft Visual C++运行库被病毒或木马损坏了。
三、软件所需要的运行库跟系统自带的Microsoft Visual C++运行库不一致。

可以重新下载Microsoft Visual C++安装试试

‘叁’ 什么是Runtime

runtime就是程序运行时的状态
还有一个compiletime,就是编译时代状态
程序设计中要避免runtime的错误,compiletime的错误由编译器检测。

‘肆’ iOS Runtime理解

 runtime

概述: runtime又叫运行时,是一套底层C语言API,是iOS系统的核心之一。开发者在编码过程中,可以给任意一个对象发送消息,在编译阶段只是确定了要向接受着发送这条消息,而接受者如何响应和处理这条消息,就要看运行时来决定了

 C语言中,在编译器就确定要调用哪个函数,而OC的函数,属于动态调用过程,在编译器并不能真正决定调用哪个函数,只有在真正的运行时才会根据函数的名称找到对应的函数来调用。OC是一个动态语言,这意味着它不仅要一个编译器,也需要一个运行时系统来动态创建类和对象、进行消息传递和发送

1.消息转发

Runtime的特性主要是消息传递,如果消息在对象中找不到,就进行转发。Objective-C是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态创建类和对象、进行消息传递和转发。Runtime的核心是消息传递。

(1)消息传递的过程

一个对象的方法[obj test],编译器转成消息发送objc_msgSend(obj,test),Runtime执行的流程是这样的

a.首先通过obj的isa指针找到它的class

b.在class的method list找test

c.如果class中没找到test,继续往它的superclass中找

d.一旦找到test这个函数,就去执行它的IMP

由于效率问题,每个消息都遍历一次objc_method_list并不合理,所以需要把经常被调用的函数缓存下来,去提高函数查询的效率。这也就是objc_class中另一个重要的成员objc_cache做的事情。找到test之后,将test的method_name作为key,method_imp作为value。当再次收到test消息的时候,可以直接在cache里找。

类对象(objc_class)

Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。struct objc_class结构体里面定义了很多变量。结构体里保存了指向父类的指针、类的名字(name)、版本、实例变量列表(ivars)、方法列表(methodLists)、缓存(cache)、遵守的协议列表(protocols),由此可见,类对象就是一个结构体struct objc_class,这个结构体存放的数据就是元数据

理解Runtime就是理解iOS在运行时他的数据存储以及他的类、实例、类对象、元类她们之间的关系和作用。

(2)消息转发机制

归根到底,Objective-C中所有的方法调用本质就是向对象发送消息

1.类中创建方法-(void)test

2.iOS系统为这个方法创建一个编号,SEL(test)并添加到方法列表里面

3.当调用这个方法的时候系统去方法列表里查找这个方法,找到了就执行

所以,调用一个方法就会进行一次发送消息也就是在这个类的方法列表里找,如果在该类中找不到就到该类的父类里找,如果父类还找不到就一直搜索到继承树的根部,如果找不到或者消息转发不成功那就会报unrecognized selector错。

1.动态方法解析

Objective-C运行时会调用+resolveInstanceMethod:或者 +resolveClassMethod:让你有机会提供一个函数实现,如果你添加了函数并且返回YES,那么运行时就会重新启动一次消息发送的过程。如下图:

虽然没有foo:的实现函数,但是通过class_addMethod()动态添加了fooMethod函数,并执行了这个函数并且打印成功。如果reslove返回NO运行时就会移到下一步:forwardingTargetSelector

2.直接消息转发

如果目标对象实现了forwardingTargetSelector,Runtime这时就会调用这个方法,给你把这个消息转发给其他对象的机会

从图中可以看出我们通过forwardingTargetForSelector方法将当前类的方法转给Father类实现了,打印成功。

3.完整消息转发

如果在上一步还不能处理未知消息,那唯一能做的就是启动消息转发机制。首先它会发送methodSignatureForSelector消息获得函数的参数和返回值类型。如果methodSignatureForSelector返回nil,Runtime则会发出doesNotRecognizeSelector。如果返回一个签名函数,Runtime就会创建一个NSInvocation对象并发送forwardInvocation消息给目标对象。

Runtime的实际应用

1.使用Runtime交换方法

2.动态添加方法(目前不是很懂)

3.给分类添加属性

4.消息转发(热更新)解决Bug(JSPatch)

‘伍’ runtime error 怎么解决啊

由于时代的发展,电脑不断地更新换代,速度也越来越快了。可是一些网友们升级了自己的电脑,在体验电脑更快的速度的同时,却发现原来可以正常运行的程序无法运行了,比如NeoSoft Phantom,WWPack等,启动的时候只显示一行“Runtime error 200”错误信息就退出了。这是怎么回事?该如何解决呢?

原来,这是编译程序的编译器中存在的问题。大家知道,没有任何的程序是完美无缺的,而关键只在于这些程序中的问题是否严重,以及发生的几率等等。如果里面 存在一个问题,但它很少发生,以至于没有人发现,那么它就影响不大。然而,如果一个问题出现后就经常发生,而且比较严重,那么情况就不一样了;而有些问题 在刚出现的时候并没有发生,也没有人察觉到,但是由于毕竟是一个隐患,可能在以后才会表现出来以造成后果。上面提到的“Runtime error 200”就是后一种情况。

那么这个问题是怎么回事呢?那些发现了此问题的网友由于知道在以前的电脑上并不会出现此问题,于是猜想此问题中电脑的速度(主要是指CPU频率)是使问题出现的一个很重要因素,事实确实如此。经过观察发现,在PII 200MHz左右及以上的电脑下运行这些程序就会出现问题,只出现一条错误信息就停止了启动,而根本无法运行。而这些程序在低于PII 200MHz的电脑下运行则没有问题。

引起此问题的编译器就是Borland (Turbo) Pascal 7.0/7.01(以下简称BP7)。这个问题并不存在于BP7以前的版本(如BP5)中,而仅仅存在于BP7中,这是为什么呢?原来,在BP5中有着另 一个问题,那就是用这个编译器编译出来的程序无法在386-33以下电脑下运行。Borland公司为了解决这个问题,进行了一些修复,并增加了一些新的 功能,推出了7.0版本。然而此修复却产生了一个更严重的问题的隐患,那就是以上所提到的问题。只不过当时由于电脑的CPU频率还远未达到200MHz, 所以无论是Borland公司还是普通的用户或是程序员都没有发现,直到后来随着PII等较快电脑的大量出现,此问题才暴露了出来并造成了影响。经过研 究,人们发现此问题产生的根本原因是使用TP7编译器编译出来的程序中的CRT单元中存在错误的时间等待,所以此问题又叫CRT单元问题。

既然如此,要怎样解决这个问题呢?大家知道,由于CRT单元问题产生的条件就是CPU主频要大于200MHz,所以自然会使人联想到用降速的方法来使这些 程序来正常运行。不错,这确实是个好办法。因此,许多人推出了这样的降速程序,如CPU Killer等。不过,其中最好的一个是叫作SLOWDOWN的程序(可在“DOS软件”中下载),它是一个现在仍在不断升级中的软件,目前最高的版本是 3.0版。它的功能十分强大,命令行选项也非常多,可输入SLOWDOWN /?查看帮助。它不仅可以降DOS的速度,还可以降Windows的速度,当然也可以降Windows中的各个DOS窗口中的速度。一旦用它使速度降到低 于200MHz左右,那些程序就可以运行了。而且SLOWDOWN软件运行十分稳定,可以将它加入到AUTOEXEC.BAT中。那么,该如何使用它呢?

其实,它的操作十分简便,有两种操作方式,一种是命令行方式,一种是TSR即内存驻留方式。如果想用前一种方法,例如用SLOWDOWN /P:55 WWPACK命令就可以以55%的速度来运行WWPACK程序。如果想用后一种方法,就直接输入(LH) SLOWDOWN命令将其加载到内存,然后在任何时候按热键就可以调整系统的运行速度,如Ctrl+Alt+4就是40%的速度,Ctrl+Alt+0就 是恢复原来的速度。而且这两种方法还可以混合使用,比如在使用TSR方式的同时使用命令行方式以起到临时降速而运行完后即恢复的目的。其实,这些用TP7 编译的程序只是在启动的时候会由于速度而无法运行,一旦开始运行就没有问题了,所以可以仅仅在刚开始运行程序的时候降一下速,一开始运行即恢复系统的原速 度,以发挥电脑的最大效率,这时仅需按Ctrl+Alt+0组合键。另外,每按一次Ctrl+Alt+加号键可以增加10%的速度,每按一次Ctrl+ Alt+减号键可以减少10%的速度等等。可见,一切都可以进行人工控制,多么方便啊!

当然,除了使用降速软件以外,还有另一种很实用的方法。上文提到了CRT单元问题是由TP7产生的有问题的CRT单元引起的,所以如果能用软件将CRT单 元修复,那么就可以使这些程序永久性的正常运行。因此,一些人推出了这样的修复工具,如TPP,BP7PAT等,其中BP7PAT可以在“DOS软件”的 “文件工具”中下载。例如使用TPP INSTALL.EXE就可以修复INSTALL.EXE文件中的CRT单元,使这个程序可以正常运行。不过,因为有些程序是用一些压缩软件压缩过的,所 以需要先对这些软件进行解压(如用UNP,CUP386等工具),然后再进行修复。显然,如果有些软件经过了特殊加密(如WWPack等),无法解开的 话,那么这些一次性的修复工具就不适用了。不过还有另一种方法,那就是使用TSR即内存驻留方法,就是先运行一些专门修复此问题的修复工具(如PROT 200),再运行有CRT单元问题的程序。因为那些驻留内存的修复工具能够自动使后面的有CRT单元问题的程序正常运行,而不需修改文件本身。这也不失为 一个很好的方法。

不过,解决CRT单元问题的最根本办法就是修复BP7软件本身,这样用它编译的程序就不再会有此问题了。可以修复BP7本身的程序也有一些,这里就不再详细介绍了。

总之,如果用合适的方法,“Runtime error 200”是完全可以解决的。如果您也遇到了“Runtime error 200”的错误信息的话,以上介绍的方法不妨一试。

‘陆’ 我的C语言程序在编译器上运行正确,但作业提交上去却是runtime error这是什么原因

runtime error是运行时错误。你自己可以成功编译运行,但是提交上去之后报错的原因是你的程序在特定输入的时候出现错误。

‘柒’ Runtime(5)--字节对齐原理

在NSObject中我们可以看到

通过打印NSObject的实例对象obj的内存大小

可以看到给 NSObject 的实例对象分配了 16个字节(byte) 的空间, NSObject内只有一个属性 isa ,其实也只是用到了 8个字节 的内存空间,剩余的 8个字节 在空闲.

发现一个是8,一个16这是为什么。 malloc_size 我扒拉了一下 libmalloc 源码,还是对对象分配至少是16的倍数,那 class_getInstanceSize 呢,我又扒拉了一下objc源码,找到下图的返回方法

为啥obj的内存会分配到16个字节?明明只需要8个字节。
我们通过runtime的底层去搜索:

每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

内存对齐的规则

OC中每个属性的字节大小

这次例子是结构体嵌套结构体,他的是多少呢?我们开始:a-【0】,b-【4-7】,c-【8-9】,下面进BCStruct2,a-【12-15】,b-【16-23】,c-【24】,d-【26-27】,那是不是可以认为这个struct需要大小为28了,28跟8的倍数对比,应该是32

由上面可知:结构体的内存对齐是按照属性排下来,但对象的内存对齐却不是的,这是因为编译器对对象内存做了优化,至于怎么优化的,上面开始的时候我们已经讲过了。

通过上面我们了解到这些,对象属性在存储的时候是按照属性中最大值得倍数对齐(一般为8),而16字节对齐则是针对整个对象,为什么会这样呢?因为系统开辟的内存如果按照属性大小来分配,可能会导致内存溢出。从测试我们知道结构体内部的属性排列不同,所需要的内存大小也不同。我们在日常开发中,对属性的排列顺序是否可以注意一下,然后使其申请的内存最少,积少成多,整个项目的下来,就会优化不少。

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:648
制作脚本网站 发布:2025-10-20 08:17:34 浏览:939
python中的init方法 发布:2025-10-20 08:17:33 浏览:634
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:823
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:734
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1069
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:302
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:163
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:855
python股票数据获取 发布:2025-10-20 07:39:44 浏览:765