運行時編譯
㈠ 編譯錯誤和運行時異常怎麼區分
編譯錯誤 一般都是語法錯誤
運行時錯誤一般都是比如數組索引指向空值 4/0 這類錯誤
請參考
㈡ java如何在運行時編譯一個類
你的問題說得太不清楚了。。是不是問把修改後的java類編譯好後,再發布到伺服器上?
重新發布java類,伺服器一般會自動重起,然後載入這個類。
㈢ 請問java程序在編譯和運行時有什麼區別,系統分別都會做什麼
Java程序的編譯
使用命令: javac *.java
編譯時,會將寫的.java文件(高級語言),生成相應的位元組碼文件.class文件(二進制代碼)
Java程序的執行
使用命令:java *
流程: 載入到 -- 連接 ---- 初始化 ...
運行時,首先會由將相應的.class文件,載入到內存中,並驗證.class文件的有效性,將相應類的Class載入到內存中,並對類中的靜態變數進行初始化操作,然後就由 主 類開始執行
具體的可以看一下 JVM 類載入過程,以及jVM的內存分配機制
㈣ C++中什麼是編譯時,什麼是運行時,二者有何區別
編譯階段主要進行語法的檢查,無誤。將程序代碼轉換成目標代碼(二進製表示,打開看不懂),沒有和操作系統進行連接,不能運行。完成連接後,程序能夠進入系統運行。
運行時,一定是編譯過的,沒有語法錯誤。編譯時,沒有生成目標文件,可能有語法錯誤。
㈤ Java編譯時註解和運行時註解有什麼區別
重寫,重載,泛型,分別是在運行時還是編譯時執行的
1. 方法重載是在編譯時執行的,因為,在編譯的時候,如果調用了一個重載的方法,那麼編譯時必須確定他調用的方法是哪個。如:
當調用evaluate("hello")時候,我們在編譯時就可以確定他調用的method #1.
2.
方法的重寫是在運行時進行的。這個也常被稱為運行時多態的體現。編譯器是沒有辦法知道它調用的到底是那個方法,相反的,只有在jvm執行過程中,才知曉到底是父子類中的哪個方法被調用了當有如下一個介面的時候,我們是無法確定到底是調用父類還是子類的方法
3.
泛型(類型檢測),這個發生在編譯時。編譯器會在編譯時對泛型類型進行檢測,並吧他重寫成實際的對象類型(非泛型代碼),這樣就可以被JVM執行了。這個過程被稱為"類型擦除"。
類型擦除的關鍵在於從泛型類型中清除類型參數的相關信息,並且再必要的時候添加類型檢查和類型轉換的方法。
類型擦除可以簡單的理解為將泛型java代碼轉換為普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java位元組碼。類型擦除的主要過程如下:
1). 將所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。
2). 移除所有的類型參數。
在編譯後變成:
4. 註解。註解即有可能是運行時也有可能是編譯時。
如java中的@Override註解就是典型的編譯時註解,他會在編譯時會檢查一些簡單的如拼寫的錯誤(與父類方法不相同)等
同樣的@Test註解是junit框架的註解,他是一個運行時註解,他可以在運行時動態的配置相關信息如timeout等。
5. 異常。異常即有可能是運行時異常,也有可能是編譯時異常。
RuntimeException是一個用於指示編譯器不需要檢查的異常。RuntimeException
是在jvm運行過程中拋出異常的父類。對於運行時異常是不需要再方法中顯示的捕獲或者處理的。
已檢查的異常是被編譯器在編譯時候已經檢查過的異常,這些異常需要在try/catch塊中處理的異常。
6. AOP. Aspects能夠在編譯時,預編譯時以及運行時使用。
1).
編譯時:當你擁有源碼的時候,AOP編譯器(AspectJ編譯器)能夠編譯源碼並生成編織後的class。這些編織進入的額外功能是在編譯時放進去的。
2). 預編譯時:織入過程有時候也叫二進制織入,它是用來織入到哪些已經存在的class文件或者jar中的。
3). 運行時:當被織入的對象已經被載入如jvm中後,可以動態的織入到這些類中一些信息。
7. 繼承:繼承是編譯時執行的,它是靜態的。這個過程編譯後就已經確定
8. 代理(delegate):也稱動態代理,是在運行時執行。
㈥ C代碼咋判斷是「編譯時執行」還是「運行時執行」
如何判斷?其實沒有一個准確的答案。
常量及常量和基本運算符組成的運算表達式,一般是在編譯時做的,
比如,
int a = 3;
int b = 3 + 5;
這里的 3 和 8 通常是由編譯器運算完成後固化到代碼中的,但是a 和 b 兩個變數的位置,則是運行時確定的,由線程棧的地址確定,程序中只有一個偏移的多少個位元組的標記。
sizeof() 編譯運算符,是用於取其內的變數的類型或一個指定的類型 在 線程棧上佔用的 位元組數,比如在32位機上
int* p;
p = (int*)malloc(1000);
sizeof(p) 的值為4 ,因為p的類型就是一個指針,而在32位機里,指針的長度就是4個位元組。
傳給sizeof 編譯運算符號的,必須是一個明確的類型。
一般有函數調用的,都是運行時執行的,通常編譯器不會把函數優化掉。
一般作用於棧上的操作,又沒有函數調用的,是在編譯時優化處理的。
㈦ 如何在程序運行時生成和編譯C ++代碼
在Visual C++6.0編程環境中的步驟如下: 編譯: 方法一:如圖: 打開Visual C++6.0,打開「組建」("Build")菜單, 找到「編譯」(「Compile」)命令,點擊該命令, 隨後顯示編譯結果。 方法二:如圖: 在工具欄中找到編譯圖標(紅色方框所圈處)
㈧ 運行時和編譯時有沒有什麼區別
運行時 編譯連接並運行 大概意思檢查錯誤並運行,如果錯了,則返回重新編譯,通過則運行
編譯時 編譯連接 檢查錯誤,並不運行,不管對錯,都返回編譯狀態.
關於SIZEOF()
SIZEOF() ()里加數據類型,則計算此數據類型所佔的內存位元組數.
如 SIZEOF( int ) 計算int型所佔的內存位元組數.
SIZEOF() ()里還可以加字元串或一個字元串數組,計算這個字元串的長度,即所佔的內存位元組數.
如 SIZEOF(abcd) 計算abcd這個字元串所佔的內存位元組數,
注意:
計算結果為5,字元型每個字元佔一個位元組,還有一個隱藏的\0,用來結束字元串的,所以要多加一個位元組.
㈨ java 運行時調用方法和編譯時調用方法有什麼不同
一個是在編譯時就確定一個是在運行過程調用中才確定的 -- 轉載以前看過的一個解釋,獲取能對你有幫助吧=====運行時類型識別(Run-time Type Identification, RTTI)主要有兩種方式,一種是我們在編譯時和運行時已經知道了所有的類型,另外一種是功能強大的「反射」機制。
要理解RTTI在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由「Class對象」完成的,它包含了與類有關的信息。類是程序的重要組成部分,每個類都有一個Class對象,每當編寫並編譯了一個新類就會產生一個Class對象,它被保存在一個同名的.class文件中。在運行時,當我們想生成這個類的對象時,運行這個程序的Java虛擬機(JVM)會確認這個類的Class對象是否已經載入,如果尚未載入,JVM就會根據類名查找.class文件,並將其載入,一旦這個類的Class對象被載入內存,它就被用來創建這個類的所有對象。一般的RTTI形式包括三種:
1.傳統的類型轉換。如「(Apple)Fruit」,由RTTI確保類型轉換的正確性,如果執行了一個錯誤的類型轉換,就會拋出一個ClassCastException異常。
2.通過Class對象來獲取對象的類型。如
Class c = Class.forName(「Apple」);
Object o = c.newInstance();
3.通過關鍵字instanceof或Class.isInstance()方法來確定對象是否屬於某個特定類型的實例,准確的說,應該是instanceof / Class.isInstance()可以用來確定對象是否屬於某個特定類及其所有基類的實例,這和equals() / ==不一樣,它們用來比較兩個對象是否屬於同一個類的實例,沒有考慮繼承關系。
反射
如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。即在編譯時,編譯器必須知道所有通過RTTI來處理的類。
使用反射機制可以不受這個限制,它主要應用於兩種情況,第一個是「基於構件的編程」,在這種編程方式中,將使用某種基於快速應用開發(RAD)的應用構建工具來構建項目。這是現在最常見的可視化編程方法,通過代表不同組件的圖標拖動到圖板上來創建程序,然後設置構件的屬性值來配置它們。這種配置要求構件都是可實例化的,並且要暴露其部分信息,使得程序員可以讀取和設置構件的值。當處理GUI時間的構件時還必須暴露相關方法的細細,以便RAD環境幫助程序員覆蓋這些處理事件的方法。在這里,就要用到反射的機制來檢查可用的方法並返回方法名。Java通過JavaBeans提供了基於構件的編程架構。
第二種情況,在運行時獲取類的信息的另外一個動機,就是希望能夠提供在跨網路的遠程平台上創建和運行對象的能力。這被成為遠程調用(RMI),它允許一個Java程序將對象分步在多台機器上,這種分步能力將幫助開發人員執行一些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。
Class支持反射,java.lang.reflect中包含了Field/Method/Constructor類,每個類都實現了Member介面。這些類型的對象都是由JVM在運行時創建的,用來表示未知類里對應的成員。如可以用Constructor類創建新的對象,用get()和set()方法讀取和修改與Field對象關聯的欄位,用invoke()方法調用與Method對象關聯的方法。同時,還可以調用getFields()、getMethods()、getConstructors()等方法來返回表示欄位、方法以及構造器的對象數組。這樣,未知的對象的類信息在運行時就能被完全確定下來,而在編譯時不需要知道任何信息。
另外,RTTI有時能解決效率問題。當程序中使用多態給程序的運行帶來負擔的時候,可以使用RTTI編寫一段代碼來提高效率
㈩ 什麼是編譯時和運行時
編譯出錯差不多就是語法不對,比如你寫Stringstr='str';這么寫語法不對編譯就會出錯。運行出錯是指語法沒問題但是邏輯有問題,比如一個方法傳進一個String類型的變數str,方法體中有類似於str.equals("str");的語句,但是傳進的str是個null,那麼那一句就相當於null.equals("str");這肯定會拋空指針異常。用手機做例子,編譯出錯就是手機在生產的時候零件不對,那就肯定不能出廠。運行出錯就是手機組裝完出廠了,到手了你沒用來打電話,直接拿來砸核桃了,那手機肯定報廢(NOKIA除外)。