當前位置:首頁 » 編程軟體 » 編譯器的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 瀏覽:705
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:968
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:676
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:828
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:737
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1076
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:308
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:188
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:875
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:829