導航:首頁 > 源碼編譯 > 縮短編譯器路徑有什麼用

縮短編譯器路徑有什麼用

發布時間:2022-10-18 20:21:52

⑴ 什麼是編譯時間

用戶使用編譯程序對其個人編制的源程序進行編譯的過程稱為程序編譯。編譯時間(compiling time) 指編譯程序將源程序編譯成目標程序所佔用的時間。

1 如何減少編譯時間
一是執行每日自動構建。每日自動構建的原理很簡單:安裝每日構建工具CCNET(不熟悉該工具的同學可以去搜索下)。然後在源碼伺服器上安裝編譯環境。源碼伺服器每天獲取最新代碼,每天下班後開始編譯最新代碼,經過一個晚上基本上就能把庫和應用程序都編好,到了第二天開發人員只需下載最新的庫文件和代碼文件而不須自己重新編譯。這樣就能大大節省時間了。
二是使用聯合編譯器IncrediBuild。這個工具估計大家都不陌生。最近試驗了一個新想法,寫一個批處理文件,將SVN和IncrediBuild綁在一起,實現了從源碼更新到工程編譯。


2 批處理文件的命令語法
svnupinclude//更新伺服器的include文件夾到本地
BuildConsoleD:\Code\MySolution.sln/prj="MyApp"/build/OpenMonitor/cfg="Debug|Win32"
BuildConsole是IncrediBuild的命令行工具,
D:\Code\MySolution.sln是你的解決方案文件絕對路徑,
/prj參數設置你要編譯的工程,如果你要編譯多個工程,可以這樣設置,/prj="prj1,prj2,prj3",
/prj參數也支持通配符,/prj="*"即為編譯MySolution.sln下的所有工程
/build為編譯工程,若改為/rebuild即是清理重編工程。
/OpenMonitor為打開IncrediBuild的圖形化界面,去掉該參數則不出現圖形界面。
/cfg為編譯設置選項,如要編release版本,可以改為Release|Win32。
把上面的代碼保存為BuildDebug.bat,把文件保存在D:\Code\路徑下(即源碼根目錄,下面有include、src和vs三個文件夾),然後運行這個批處理文件就相當於把從更新源碼到編譯源碼這一系列動作都執行了。

⑵ stm32編譯前為什麼要配置keil中C/C++中的define 和include Paths

這是Keil與編譯器的一個相互通信的過程,准確的來說,是編譯器讀取Keil的配置
ARM系列的有一些公司的庫編譯器,是與Keil的一些配置通信的.
比如你說的那個 Define,include path
一般來說,我們用Keil做51或者STR710等等一些單片機的程序時候,不需要配置剛才的兩個選項,為什麼?
因為C51和ARM7的編譯器不去讀取上述的配置.
而Cortex-M3編譯器,則讀取上述的配置,並轉換成自己的內編譯器配置
比如:你在Define裡面寫:THIS_MY_DEF
那麼,編譯器在編譯的時候,文件里會隱性的定義出這么一句:
#define THIS_MY_DEF
通常,我們寫Define里,都寫USE_STDPERIPH_DRIVER,STM32F10X_HD這兩個
然後,編譯的時候,文件里會隱性定義
#define USE_STDPERIPH_DRIVER
#define STM32F10X_HD
而這兩個宏,決定了STM32的庫函數的一些配置.
如果你把那個Define文本框空閑出來,那麼,編譯器找不到任何配置信息,自然就出錯.
如果你一定要把Define文本框空閑,那麼,你就要在Stm32F10x.h等多個文件裏手工添加
#define USE_STDPERIPH_DRIVER
#define STM32F10X_HD
過程比較繁瑣,如果一旦換了晶元,整個的工程就有多處要修改, 工作量太大,且容易出錯
,就不如在配置的時候操作一次那麼簡便

⑶ 如何修改C++程序編譯器的路徑

不同的編譯工具設置的方法不同,在VC中,你可以打開解決方案的屬性選項,在執行文件路徑里設置,這對整個解決方案有效,如果你是對某個源文件單獨處理,你需要在這個源文件的屬性選項中設置它的自定義處理項。
通常,編譯器的路徑在很多開發工具中是自動設置的,你改變這些設置,你需要非常熟悉你用的工具的編譯過程及需要的各種處理程序。否則,會造成開發工具不能正常工作。

⑷ 編譯程序和解釋程序都是什麼意思

1、編譯程序是把用高級程序設計語言或計算機匯編語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序,屬於採用生成性實現途徑實現的翻譯程序。編譯程序以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出;編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。

2、解釋程序是高級語言翻譯程序的一種,它將源語言書寫的源程序作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程序。就像外語翻譯中的「口譯」一樣,說一句翻一句,不產生全文的翻譯文本。

(4)縮短編譯器路徑有什麼用擴展閱讀:

編譯程序的實現演算法較為復雜。這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系;同時也因為它要處理遞歸調用、動態存儲分配、多種數據類型,以及語句間的緊密依賴關系。但是,由於高級程序設計語言書寫的程序具有易讀、易移植和表達能力強等特點,編譯程序廣泛地用於翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程序。

⑸ VC編譯器中的路徑問題

當VC++出現Compiling... Error spawning cl.exe 錯誤的解決辦法有如下幾種,請樓主嘗試:

方法1:
啟動VC時不要用圖形界面,通過在命令提示符下輸入:Msdev /useenv運行(注意啦/前面有個空格).它會強制使系統環境變數全高設置成正確值.而且,只需要使用一次這樣的方式運行VC,以後再次通過雙擊圖標的方式啟動也不會有問題。

方法2:
使用你的VC安裝盤修復一下。

方法3:
在VC中點擊「Tools」—>「Option」—>「Directories」,發現路徑有誤,重新設置「Excutable Fils,Include Files,Library Files,Source Files」的路徑。

要是顯示「找不到mspdb60.dll」,去能正常運行VC++的電腦中搜索mspdb60.dll文件,拷貝到你的機器上Microsoft Visual Studio\Common\MSDev98\Bin下。缺失其他文件類似操作O(∩_∩)O。

方法4:
可能很多人在安裝VC 6.0後有過點擊「Compile」或者「Build」後被出現的
「Compiling... ,Error spawning cl.exe」錯誤提示給郁悶過。很多人的
選擇是重裝,實際上這個問題很多情況下是由於路徑設置的問題引起的,
「CL.exe」是VC使用真正的編譯器(編譯程序),其路徑在「VC根目錄\VC98\Bin」下面,
你可以到相應的路徑下找到這個應用程序。

因此問題可以按照以下方法解決:打開vc界面 點擊VC「TOOLS(工具)」—>「Option(選擇)」
—>「Directories(目錄)」重新設置「Excutable Fils、Include Files、
Library Files、Source Files」的路徑。很多情況可能就一個盤符的不同
(例如你的VC裝在C,但是這些路徑全部在D),改過來就OK了。

如果你是按照初始路徑安裝vc6.0的,路徑應為:
executatble files:
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
C:\Program Files\Microsoft Visual Studio\VC98\BIN
C:\Program Files\Microsoft Visual Studio\Common\TOOLS
C:\Program Files\Microsoft Visual Studio\Common\TOOLS\WINNT

include files:
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE

library files:
C:\Program Files\Microsoft Visual Studio\VC98\LIB
C:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB

source files:
C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC

如果你裝在其他盤里,則仿照其路徑變通就行。
關鍵是microsoft visual studio\ 後面的東西要相同。
是在是不行就重裝。
vc 6.0里可以做C語言編程,但是不要使用clrscr()和getch()函數。不然會報錯的,同時把頭文件必須加上。

⑹ 了解什麼叫做jit compiling,與傳統的編譯技術有何不同

java 應用程序的性能經常成為開發社區中的討論熱點。因為該語言的設計初衷是使用解釋的方式支持應用程序的可移植性目標,早期
Java 運行時所提供的性能級別遠低於 C 和
C++
之類的編譯語言。盡管這些語言可以提供更高的性能,但是生成的代碼只能在有限的幾種系統上執行。在過去的十年中,Java
運行時供應商開發了一些復雜的動態編譯器,通常稱作即時(Just-in-time,JIT)編譯器。程序運行時,JIT
編譯器選擇將最頻繁執行的方法編譯成本地代碼。運行時才進行本地代碼編譯而不是在程序運行前進行編譯(用 C 或
C++ 編寫的程序正好屬於後一情形),保證了可移植性的需求。有些 JIT 編譯器甚至不使用解釋程序就能編譯所有的代碼,但是這些編譯器仍然通過在程序執行時進行一些操作來保持 Java 應用程序的可移植性。
由於動態編譯技術的多項改進,在很多應用程序中,現代的 JIT 編譯器可以產生與 C 或 C++
靜態編譯相當的應用程序性能。但是,仍然有很多軟體開發人員認為 —— 基於經驗或者傳聞 ——
動態編譯可能嚴重干擾程序操作,因為編譯器必須與應用程序共享 CPU。一些開發人員強烈呼籲對 Java
代碼進行靜態編譯,並且堅信那樣可以解決性能問題。對於某些應用程序和執行環境而言,這種觀點是正確的,靜態編譯可以極大地提高 Java
性能,或者說它是惟一的實用選擇。但是,靜態地編譯 Java 應用程序在獲得高性能的同時也帶來了很多復雜性。一般的
Java 開發人員可能並沒有充分地感受到 JIT 動態編譯器的優點。

本文考察了 Java 語言靜態編譯和動態編譯所涉及的一些問題,重點介紹了實時 (RT) 系統。簡要描述了 Java
語言解釋程序的操作原理並說明了現代 JIT 編譯器執行本地代碼編譯的優缺點。介紹了 IBM 在 WebSphere Real Time 中發布的
AOT 編譯技術和它的一些優缺點。然後比較了這兩種編譯策略並指出了幾種比較適合使用 AOT
編譯的應用程序領域和執行環境。要點在於這兩種編譯技術並不互斥:即使在使用這兩種技術最為有效的各種應用程序中,它們也分別存在一些影響應用程序的優缺
點。

執行 Java 程序

Java 程序最初是通過 Java SDK 的 javac程序編譯成本地的與平台無關的格式(類文件)。可將此格式看作 Java
平台,因為它定義了執行 Java 程序所需的所有信息。Java 程序執行引擎,也稱作 Java 運行時環境(JRE),包含了為特定的本地平台實現
Java 平台的虛擬機。例如,基於 Linux 的 Intel x86 平台、Sun Solaris 平台和 AIX 操作系統上運行的 IBM
System p 平台,每個平台都擁有一個 JRE。這些 JRE 實現實現了所有的本地支持,從而可以正確執行為
Java 平台編寫的程序。

事實上,操作數堆棧的大小有實際限制,但是編程人員極少編寫超出該限制的方法。JVM 提供了安全性檢查,對那些創建出此類方法的編程人員進行通知。

Java 平台程序表示的一個重要部分是位元組碼序列,它描述了 Java
類中每個方法所執行的操作。位元組碼使用一個理論上無限大的操作數堆棧來描述計算。這個基於堆棧的程序表示提供了平台無關性,因為它不依賴任何特定本地平台
的 CPU 中可用寄存器的數目。可在操作數堆棧上執行的操作的定義都獨立於所有本地處理器的指令集。Java
虛擬機(JVM)規范定義了這些位元組碼的執行(參見 參考資料)。執行 Java 程序時,用於任何特定本地平台的任何 JRE 都必須遵守 JVM
規范中列出的規則。

因為基於堆棧的本地平台很少(Intel X87 浮點數協處理器是一個明顯的例外),所以大多數本地平台不能直接執行 Java 位元組碼。為了解決這個問題,早期的 JRE 通過解釋位元組碼來執行 Java 程序。即 JVM 在一個循環中重復操作:

◆獲取待執行的下一個位元組碼;

◆解碼;

◆從操作數堆棧獲取所需的操作數;

◆按照 JVM 規范執行操作;

◆將結果寫回堆棧。

這種方法的優點是其簡單性:JRE 開發人員只需編寫代碼來處理每種位元組碼即可。並且因為用於描述操作的位元組碼少於 255 個,所以實現的成本比較低。當然,缺點是性能:這是一個早期造成很多人對 Java 平台不滿的問題,盡管擁有很多其他優點。

解決與 C 或 C++ 之類的語言之間的性能差距意味著,使用不會犧牲可移植性的方式開發用於 Java 平台的本地代碼編譯。

編譯 Java 代碼

盡管傳聞中 Java 編程的 「一次編寫,隨處運行」
的口號可能並非在所有情況下都嚴格成立,但是對於大量的應用程序來說情況確實如此。另一方面,本地編譯本質上是特定於平台的。那麼 Java
平台如何在不犧牲平台無關性的情況下實現本地編譯的性能?答案就是使用 JIT 編譯器進行動態編譯,這種方法已經使用了十年(參見圖 1):

圖 1. JIT 編譯器

使用 JIT 編譯器時,Java
程序按每次編譯一個方法的形式進行編譯,因為它們在本地處理器指令中執行以獲得更高的性能。此過程將生成方法的一個內部表示,該表示與位元組碼不同但是其級
別要高於目標處理器的本地指令。(IBM JIT
編譯器使用一個表達式樹序列表示方法的操作。)編譯器執行一系列優化以提高質量和效率,最後執行一個代碼生成步驟將優化後的內部表示轉換成目標處理器的本
地指令。生成的代碼依賴運行時環境來執行一些活動,比如確保類型轉換的合法性或者對不能在代碼中直接執行的某些類型的對象進行分配。JIT
編譯器操作的編譯線程與應用程序線程是分開的,因此應用程序不需要等待編譯的執行。

圖 1 中還描述了用於觀察執行程序行為的分析框架,通過周期性地對線程取樣找出頻繁執行的方法。該框架還為專門進行分析的方法提供了工具,用來存儲程序的此次執行中可能不會改變的動態值。

因為這個 JIT 編譯過程在程序執行時發生,所以能夠保持平台無關性:發布的仍然是中立的 Java 平台代碼。C 和 C++ 之類的語言缺乏這種優點,因為它們在程序執行前進行本地編譯;發布給(本地平台)執行環境的是本地代碼。

挑戰

盡管通過 JIT 編譯保持了平台無關性,但是付出了一定代價。因為在程序執行時進行編譯,所以編譯代碼的時間將計入程序的執行時間。任何編寫過大型 C 或 C++ 程序的人都知道,編譯過程往往較慢。

為了克服這個缺點,現代的 JIT
編譯器使用了下面兩種方法的任意一種(某些情況下同時使用了這兩種方法)。第一種方法是:編譯所有的代碼,但是不執行任何耗時多的分析和轉換,因此可以快
速生成代碼。由於生成代碼的速度很快,因此盡管可以明顯觀察到編譯帶來的開銷,但是這很容易就被反復執行本地代碼所帶來的性能改善所掩蓋。第二種方法是:
將編譯資源只分配給少量的頻繁執行的方法(通常稱作熱方法)。低編譯開銷更容易被反復執行熱代碼帶來的性能優勢掩蓋。很多應用程序只執行少量的熱方法,因
此這種方法有效地實現了編譯性能成本的最小化。

動態編譯器的一個主要的復雜性在於權衡了解編譯代碼的預期獲益使方法的執行對整個程序的性能起多大作用。一個極端的例子是,程序執行後,您非常清楚哪些方
法對於這個特定的執行的性能貢獻最大,但是編譯這些方法毫無用處,因為程序已經完成。而在另一個極端,程序執行前無法得知哪些方法重要,但是每種方法的潛
在受益都最大化了。大多數動態編譯器的操作介於這兩個極端之間,方法是權衡了解方法預期獲益的重要程度。

Java 語言需要動態載入類這一事實對 Java
編譯器的設計有著重要的影響。如果待編譯代碼引用的其他類還沒有載入怎麼辦?比如一個方法需要讀取某個尚未載入的類的靜態欄位值。Java
語言要求第一次執行類引用時載入這個類並將其解析到當前的 JVM
中。直到第一次執行時才解析引用,這意味著沒有地址可供從中載入該靜態欄位。編譯器如何處理這種可能性?編譯器生成一些代碼,用於在沒有載入類時載入並解
析類。類一旦被解析,就會以一種線程安全的方式修改原始代碼位置以便直接訪問靜態欄位的地址,因為此時已獲知該地址。

IBM JIT
編譯器中進行了大量的努力以便使用安全而有效率的代碼補丁技術,因此在解析類之後,執行的本地代碼只載入欄位的值,就像編譯時已經解析了欄位一樣。另外一
種方法是生成一些代碼,用於在查明欄位的位置以前一直檢查是否已經解析欄位,然後載入該值。對於那些由未解析變成已解析並被頻繁訪問的欄位來說,這種簡單
的過程可能帶來嚴重的性能問題。

動態編譯的優點

動態地編譯 Java 程序有一些重要的優點,甚至能夠比靜態編譯語言更好地生成代碼,現代的 JIT 編譯器常常向生成的代碼中插入掛鉤以收集有關程序行為的信息,以便如果要選擇方法進行重編譯,就可以更好地優化動態行為。

關於此方法的一個很好的例子是收集一個特定 array操作的長度。如果發現每次執行操作時該長度基本不變,則可以為最頻繁使用的

array長度生成專門的代碼,或者可以調用調整為該長度的代碼序列。由於內存系統和指令集設計的特性,用於復制內存的最佳通用常式的執行速度通
常比用於復制特定長度的代碼慢。例如,復制 8
個位元組的對齊的數據可能需要一到兩條指令直接復制,相比之下,使用可以處理任意位元組數和任意對齊方式的一般復制循環可能需要 10 條指令來復制同樣的 8

個位元組。但是,即使此類專門的代碼是為某個特定的長度生成的,生成的代碼也必須正確地執行其他長度的復制。生成代碼只是為了使常見長度的操作執行得更快,
因此平均下來,性能得到了改進。此類優化對大多數靜態編譯語言通常不實用,因為所有可能的執行中長度恆定的操作比一個特定程序執行中長度恆定的操作要少得
多。

此類優化的另一個重要的例子是基於類層次結構的優化。例如,一個虛方法調用需要查看接收方對象的類調用,以便找出哪個實際目標實現了接收方對象的虛方法。
研究表明:大多數虛調用只有一個目標對應於所有的接收方對象,而 JIT
編譯器可以為直接調用生成比虛調用更有效率的代碼。通過分析代碼編譯後類層次結構的狀態,JIT
編譯器可以為虛調用找到一個目標方法,並且生成直接調用目標方法的代碼而不是執行較慢的虛調用。當然,如果類層次結構發生變化,並且出現另外的目標方法,
則 JIT
編譯器可以更正最初生成的代碼以便執行虛調用。在實踐中,很少需要作出這些更正。另外,由於可能需要作出此類更正,因此靜態地執行這種優化非常麻煩。

因為動態編譯器通常只是集中編譯少量的熱方法,所以可以執行更主動的分析來生成更好的代碼,使編譯的回報更高。事實上,大部分現代的
JIT
編譯器也支持重編譯被認為是熱方法的方法。可以使用靜態編譯器(不太強調編譯時間)中常見的非常主動的優化來分析和轉換這些頻繁執行的方法,以便生成更好
的代碼並獲得更高的性能。

這些改進及其他一些類似的改進所產生的綜合效果是:對於大量的 Java 應用程序來說,動態編譯已經彌補了與 C 和 C++ 之類語言的靜態本地編譯性能之間的差距,在某些情況下,甚至超過了後者的性能。

缺點

但是,動態編譯確實具有一些缺點,這些缺點使它在某些情況下算不上一個理想的解決方案。例如,因為識別頻繁執行的方法以及編譯這些方法需要時間,所以應用
程序通常要經歷一個准備過程,在這個過程中性能無法達到其最高值。在這個准備過程中出現性能問題有幾個原因。首先,大量的初始編譯可能直接影響應用程序的
啟動時間。不僅這些編譯延遲了應用程序達到穩定狀態的時間(想像 Web
伺服器經
歷一個初始階段後才能夠執行實際有用的工作),而且在准備階段中頻繁執行的方法可能對應用程序的穩定狀態的性能所起的作用也不大。如果 JIT
編譯會延遲啟動又不能顯著改善應用程序的長期性能,則執行這種編譯就非常浪費。雖然所有的現代 JVM
都執行調優來減輕啟動延遲,但是並非在所有情況下都能夠完全解決這個問題。

其次,有些應用程序完全不能忍受動態編譯帶來的延遲。如 GUI 介面之類互動式應用程序就是這樣的例子。在這種情況下,編譯活動可能對用戶使用造成不利影響,同時又不能顯著地改善應用程序的性能。

最後,用於實時環境並具有嚴格的任務時限的應用程序可能無法忍受編譯的不確定性性能影響或動態編譯器本身的內存開銷。

因此,雖然 JIT 編譯技術已經能夠提供與靜態語言性能相當(甚至更好)的性能水平,但是動態編譯並不適合於某些應用程序。在這些情況下,Java 代碼的提前(Ahead-of-time,AOT)編譯可能是合適的解決方案。

AOT Java 編譯

大致說來,Java 語言本地編譯應該是為傳統語言(如 C++ 或
Fortran)而開發的編譯技術的一個簡單應用。不幸的是,Java 語言本身的動態特性帶來了額外的復雜性,影響了 Java
程序靜態編譯代碼的質量。但是基本思想仍然是相同的:在程序執行前生成 Java 方法的本地代碼,以便在程序運行時直接使用本地代碼。目的在於避免
JIT 編譯器的運行時性能消耗或內存消耗,或者避免解釋程序的早期性能開銷。

挑戰

動態類載入是動態 JIT 編譯器面臨的一個挑戰,也是 AOT
編譯的一個更重要的問題。只有在執行代碼引用類的時候才載入該類。因為是在程序執行前進行 AOT
編譯的,所以編譯器無法預測載入了哪些類。就是說編譯器無法獲知任何靜態欄位的地址、任何對象的任何實例欄位的偏移量或任何調用的實際目標,甚至對直接調
用(非虛調用)也是如此。在執行代碼時,如果證明對任何這類信息的預測是錯誤的,這意味著代碼是錯誤的並且還犧牲了 Java 的一致性。

因為代碼可以在任何環境中執行,所以類文件可能與代碼編譯時不同。例如,一個 JVM
實例可能從磁碟的某個特定位置載入類,而後面一個實例可能從不同的位置甚至網路載入該類。設想一個正在進行 bug
修復的開發環境:類文件的內容可能隨不同的應用程序的執行而變化。此外,Java 代碼可能在程序執行前根本不存在:比如 Java
反射服務通常在運行時生成新類來支持程序的行為。

缺少關於靜態、欄位、類和方法的信息意味著嚴重限制了 Java 編譯器中優化框架的大部分功能。內聯可能是靜態或動態編譯器應用的最重要的優化,但是由於編譯器無法獲知調用的目標方法,因此無法再使用這種優化。

內聯

內聯是一種用於在運行時生成代碼避免程序開始和結束時開銷的技術,方法是將函數的調用代碼插入到調用方的函數中。但是內聯最大的益處可能是優化方可見的代碼的范圍擴大了,從而能夠生成更高質量的代碼。下面是一個內聯前的代碼示例:

int foo() { int x=2, y=3; return bar(x,y); }final int bar(int a, int b) { return a+b; }

如果編譯器可以證明這個 bar就是 foo()中調用的那個方法,則 bar中的代碼可以取代 foo()中對
bar()的調用。這時,bar()方法是 final類型,因此肯定是 foo()中調用的那個方法。甚至在一些虛調用例子中,動態 JIT
編譯器通常能夠推測性地內聯目標方法的代碼,並且在絕大多數情況下能夠正確使用。編譯器將生成以下代碼:

int foo() { int x=2, y=3; return x+y; }

在這個例子中,簡化前名為值傳播的優化可以生成直接返回
5的代碼。如果不使用內聯,則不能執行這種優化,產生的性能就會低很多。如果沒有解析
bar()方法(例如靜態編譯),則不能執行這種優化,而代碼必須執行虛調用。運行時,實際調用的可能是另外一個執行兩個數字相乘而不是相加的
bar方法。所以不能在 Java 程序的靜態編譯期間直接使用內聯。

AOT
代碼因此必須在沒有解析每個靜態、欄位、類和方法引用的情況下生成。執行時,每個這些引用必須利用當前運行時環境的正確值進行更新。這個過程可能直接影響
第一次執行的性能,因為在第一次執行時將解析所有引用。當然,後續執行將從修補代碼中獲益,從而可以更直接地引用實例、靜態欄位或方法目標。

另外,為 Java 方法生成的本地代碼通常需要使用僅在單個 JVM 實例中使用的值。例如,代碼必須調用 JVM
運行時中的某些運行時常式來執行特定操作,如查找未解析的方法或分配內存。這些運行時常式的地址可能在每次將 JVM 載入到內存時變化。因此 AOT
編譯代碼需要綁定到 JVM 的當前執行環境中,然後才能執行。其他的例子有字元串的地址和常量池入口的內部位置。

在 WebSphere Real Time 中,AOT 本地代碼編譯通過 jxeinajar工具(參見圖 2)來執行。該工具對 JAR 文件中所有類的所有方法應用本地代碼編譯,也可以選擇性地對需要的方法應用本地代碼編譯。結果被存儲到名為 Java eXEcutable (JXE) 的內部格式中,但是也可輕松地存儲到任意的持久性容器中。

您可能認為對所有的代碼進行靜態編譯是最好的方法,因為可以在運行時執行最大數量的本地代碼。但是此處可以作出一些權衡。編譯的方法越多,代碼佔用的內存
就越多。編譯後的本地代碼大概比位元組碼大 10 倍:本地代碼本身的密度比位元組碼小,而且必須包含代碼的附加元數據,以便將代碼綁定到 JVM
中,並且在出現異常或請求堆棧跟蹤時正確執行代碼。構成普通 Java 應用程序的 JAR
文件通常包含許多很少執行的方法。編譯這些方法會消耗內存卻沒有什麼預期收益。相關的內存消耗包括以下過程:將代碼存儲到磁碟上、從磁碟取出代碼並裝入
JVM,以及將代碼綁定到 JVM。除非多次執行代碼,否則這些代價不能由本地代碼相對解釋的性能優勢來彌補。

圖 2. jxeinajar

跟大小問題相違背的一個事實是:在編譯過的方法和解釋過的方法之間進行的調用(即編譯過的方法調用解釋過的方法,或者相反)可能比這兩類方法各自內部之間
進行的調用所需的開銷大。動態編譯器通過最終編譯所有由 JIT
編譯代碼頻繁調用的那些解釋過的方法來減少這項開銷,但是如果不使用動態編譯器,則這項開銷就不可避免。因此如果是選擇性地編譯方法,則必須謹慎操作以使
從已編譯方法到未編譯方法的轉換最小化。為了在所有可能的執行中都避免這個問題而選擇正確的方法會非常困難。
優點
雖然 AOT 編譯代碼具有上述的缺點和挑戰,但是提前編譯 Java 程序可以提高性能,尤其是在不能將動態編譯器作為有效解決方案的環境中。

可以通過謹慎地使用 AOT 編譯代碼加快應用程序啟動,因為雖然這種代碼通常比 JIT
編譯代碼慢,但是卻比解釋代碼快很多倍。此外,因為載入和綁定 AOT
編譯代碼的時間通常比檢測和動態編譯一個重要方法的時間少,所以能夠在程序執行的早期達到那樣的性能。類似地,互動式應用程序可以很快地從本地代碼中獲
益,無需使用引起較差響應能力的動態編譯。

RT 應用程序也能從 AOT 編譯代碼中獲得重要的收益:更具確定性的性能超過了解釋的性能。WebSphere Real Time
使用的動態 JIT 編譯器針對在 RT 系統中的使用進行了專門的調整。使編譯線程以低於 RT
任務的優先順序操作,並且作出了調整以避免生成帶有嚴重的不確定性性能影響的代碼。但是,在一些 RT 環境中,出現 JIT
編譯器是不可接受的。此類環境通常需要最嚴格的時限管理控制。在這些例子中,AOT
編譯代碼可以提供比解釋過的代碼更好的原始性能,又不會影響現有的確定性。消除 JIT
編譯線程甚至消除了啟動更高優先順序 RT 任務時發生的線程搶占所帶來的性能影響。

優缺點統計

動態(JIT)編譯器支持平台中立性,並通過利用應用程序執行的動態行為和關於載入的類及其層次結構的信息來生成高質量的代碼。但是
JIT
編譯器具有一個有限的編譯時預算,而且會影響程序的運行時性能。另一方面,靜態(AOT)編譯器則犧牲了平台無關性和代碼質量,因為它們不能利用程序的動
態行為,也不具有關於載入的類或類層次結構的信息。AOT 編譯擁有有效無限制的編譯時預算,因為 AOT
編譯時間不會影響運行時性能,但是在實踐中開發人員不會長期等待靜態編譯步驟的完成。

表 1 總結了本文討論的 Java 語言動態和靜態編譯器的一些特性:

表 1. 比較編譯技術

兩種技術都需要謹慎選擇編譯的方法以實現最高的性能。對動態編譯器而言,編譯器自身作出決策,而對於靜態編譯器,由開發人員作出選擇。讓
JIT 編譯器選擇編譯的方法是不是優點很難說,取決於編譯器在給定情形中推斷能力的好壞。在大多數情況下,我們認為這是一種優點。

因為它們可以最好地優化運行中的程序,所以 JIT 編譯器在提供穩定狀態性能方面更勝一籌,而這一點在大量的生產 Java
系統中最為重要。靜態編譯可以產生最佳的互動式性能,因為沒有運行時編譯行為來影響用戶預期的響應時間。通過調整動態編譯器可以在某種程度上解決啟動和確
定性性能問題,但是靜態編譯在需要時可提供最快的啟動速度和最高級別的確定性。表 2 在四種不同的執行環境中對這兩種編譯技術進行了比較:

表 2. 使用這些技術的最佳環境

圖 3 展示了啟動性能和穩定狀態性能的總體趨勢:

圖 3. AOT 和 JIT 的性能對比

使用 JIT 編譯器的初始階段性能很低,因為要首先解釋方法。隨著編譯方法的增多及 JIT
執行編譯所需時間的縮短,性能曲線逐漸升高最後達到性能峰值。另一方面,AOT 編譯代碼啟動時的性能比解釋的性能高很多,但是無法達到 JIT
編譯器所能達到的最高性能。將靜態代碼綁定到 JVM 實例中會產生一些開銷,因此開始時的性能比穩定狀態的性能值低,但是能夠比使用 JIT
編譯器更快地達到穩定狀態的性能水平。

沒有一種本地代碼編譯技術能夠適合所有的 Java
執行環境。某種技術所擅長的通常正是其他技術的弱項。出於這個原因,需要同時使用這兩種編譯技術以滿足 Java
應用程序開發人員的要求。事實上,可以結合使用靜態和動態編譯以便提供最大可能的性能提升 —— 但是必須具備平台無關性,它是 Java
語言的主要賣點,因此不成問題。

結束語

本文探討了 Java 語言本地代碼編譯的問題,主要介紹了 JIT 編譯器形式的動態編譯和靜態 AOT 編譯,比較了二者的優缺點。

雖然動態編譯器在過去的十年裡實現了極大的成熟,使大量的各種 Java 應用程序可以趕上或超過靜態編譯語言(如 C++ 或
Fortran)所能夠達到的性能。但是動態編譯在某些類型的應用程序和執行環境中仍然不太合適。雖然 AOT
編譯號稱動態編譯缺點的萬能解決方案,但是由於 Java 語言本身的動態特性,它也面臨著提供本地編譯全部潛能的挑戰。

這兩種技術都不能解決 Java 執行環境中本地代碼編譯的所有需求,但是反過來又可以在最有效的地方作為工具使用。這兩種技術可以相互補充。能夠恰當地使用這兩種編譯模型的運行時系統可以使很大范圍內的應用程序開發環境中的開發人員和用戶受益。

⑺ 請用列舉四種縮短關鍵路徑的方法項目經理

縮短關鍵路徑或者工期的方法,可以考慮以下幾種:

  1. 增加資源,增加資源一般情況下會縮短工期,但一般不是成比例地縮短,有時候甚至增加資源根本不能縮短工期;

  2. 加班。比如每天晚上加班幾個小時,肯定會對縮短工期有幫助;或者每周5天工作制變成6天工作制或者7天工作制,在微軟Project軟體中就可以給特定任務分配不同的日歷,比如6天工作制。

  3. 任務並行,比如通常情況下A任務完成以後B任務才能開始,那麼可不可以讓A還沒完成的時候就讓B開始呢?實際上現實中我們經常採用這種辦法。

  4. 更換資源,比如讓更有效率的資源執行某些任務,比如用更好的設備,或者用更熟練的人員,雖然這個方法在現實中執行起來困難較大,也是可以考慮的。


張連永
Microsoft Project 實戰應用
O2O線上+線下培訓
在線培訓、企業內訓、公開課
清華大學MBA、PMP
Lianyong.zhang@163.com

⑻ Java安裝後JDK/bin目錄下的許多exe文件有什麼用途。

javac:Java編譯器,將Java源代碼換成位元組代
java:Java解釋器,直接從類文件執行Java應用程序代碼
appletviewer(小程序瀏覽器):一種執行HTML文件上的Java小程序類的Java瀏覽器
javadoc:根據Java源代碼及其說明語句生成的HTML文檔
jdb:Java調試器,可以逐行地執行程序、設置斷點和檢查變數
javah:產生可以調用Java過程的C過程,或建立能被Java程序調用的C過程的頭文件
Javap:Java反匯編器,顯示編譯類文件中的可訪問功能和數據,同時顯示位元組代碼含義
jar:多用途的存檔及壓縮工具,是個java應用程序,可將多個文件合並為單個JAR歸檔文件。
htmlConverter——命令轉換工具。
native2ascii——將含有不是Unicode或Latinl字元的的文件轉換為Unicode編碼字元的文件。
serialver——返回serialverUID。語法:serialver [show] 命令選項show是用來顯示一個簡單的界面。輸入完整的類名按Enter鍵或"顯示"按鈕,可顯示serialverUID。

補充詳細:
javac.exe

用法:javac <選項> <源文件>
可能的選項包括:
-g 生成所有調試信息
-g:none 生成無調試信息
-g:{lines,vars,source} 生成只有部分調試信息
-O 優化;可能妨礙調試或者增大類文件
-nowarn 生成無警告
-verbose 輸出關於編譯器正在做的信息
-deprecation 輸出使用了不鼓勵使用的API的源程序位置
-classpath <路徑> 指定用戶類文件的位置
-sourcepath <路徑> 指定輸入源文件的位置
-bootclasspath <路徑> 覆蓋自舉類文件的位置
-extdirs <目錄(多個)> 覆蓋安裝的擴展類的位置
-d <目錄> 指定輸出類文件的位置
-encoding <編碼> 指定源文件中所用的字元集編碼
-target <版本> 生成指定虛擬機版本的類文件
-help Print a synopsis of standard options

appletviewer.exe

用法:appletviewer <options> url

其中,<options> 包括:
-debug 在 Java 調試器中啟動 applet 小程序查看器
-encoding <encoding> 指定由 HTML 文件使用的字元編碼
-J<runtime flag> 向 Java 解釋器傳遞參數

-J 選項不是標准選項,如有更改,不另行通知。

====================
jar.exe

用法:jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ...
選項:
-c 創建新的存檔
-t 列出存檔內容的列表
-x 展開存檔中的命名的(或所有的〕文件
-u 更新已存在的存檔
-v 生成詳細輸出到標准輸出上
-f 指定存檔文件名
-m 包含來自標明文件的標明信息
-0 只存儲方式;未用ZIP壓縮格式
-M 不產生所有項的清單(manifest〕文件
-i 為指定的jar文件產生索引信息
-C 改變到指定的目錄,並且包含下列文件:
如果一個文件名是一個目錄,它將被遞歸處理。
清單(manifest〕文件名和存檔文件名都需要被指定,按'm' 和 'f'標志指定的相同順序。
示例1:將兩個class文件存檔到一個名為 'classes.jar' 的存檔文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一個存在的清單(manifest)文件 'mymanifest' 將 foo/ 目錄下的所有
文件存檔到一個名為 'classes.jar' 的存檔文件中:
jar cvfm classes.jar mymanifest -C foo/ .

javadoc.exe

用法:javadoc [options] [packagenames] [sourcefiles] [classnames] [@files]
-overview <file> 讀取 HTML 格式的概述文檔
-public 僅顯示 public 類和成員
-protected 顯示 protected/public 類和成員(預設)
-package 顯示 package/protected/public 類和成員
-private 顯示所有類和成員
-help 顯示命令行選項
-doclet <class> 通過候選 doclet 生成輸出
-docletpath <path> 指定 doclet 類文件的查找位置
-sourcepath <pathlist> 指定源文件的查找位置
-classpath <pathlist> 指定用戶類文件的查找位置
-exclude <pkglist> Specify a list of packages to exclude
-subpackages <subpkglist> Specify subpackages to recursively load
-breakiterator Compute 1st sentence with BreakIterator
-bootclasspath <pathlist> 覆蓋自舉類載入器所載入的類文件的位置
-source <release> Provide source compatibility with specified release
-extdirs <dirlist> 覆蓋已安裝的擴展的位置
-verbose 有關 Javadoc 所做工作的輸出信息
-locale <name> 所用的 Locale,例如 en_US 或 en_US_WIN
-encoding <name> 源文件編碼名稱
-J<flag> 將 <flag> 直接傳給運行時系統

由標准 doclet 提供:
-d <directory> 輸出文件的目標目錄
-use 創建類和包的用法頁
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs Recursively doc-file subdirectories
-splitindex 將索引分為每個字母對應一個文件
-windowtitle <text> 文檔的瀏覽器窗口標題
-doctitle <html-code> 包含包索引頁(首頁)的標題
-header <html-code> 包含每一頁的頁眉文本
-footer <html-code> 包含每一頁的頁腳文本
-bottom <html-code> 包含每一頁的頁底文本
-link <url> Create links to javadoc output at <url>
-linkoffline <url> <url2> Link to docs at <url> using package list at <url2>
-excludedocfilessubdir <name1>:.. Exclude any doc-files subdirectories with given name.
-group <name> <p1>:<p2>.. Group specified packages together in overview page
-nocomment Supress description and tags, generate only declarations.
-nodeprecated 不包含 @deprecated 信息
-noqualifier <name1>:<name2>:... Exclude the list of qualifiers from the output.
-nosince Do not include @since information
-nodeprecatedlist 不生成不鼓勵使用的列表
-notree 不生成類層次
-noindex 不生成索引
-nohelp 不生成幫助鏈接
-nonavbar 不生成導航欄
-quiet Do not display status messages to screen
-serialwarn Generate warning about @serial tag
-tag <name>:<locations>:<header> Specify single argument custom tags
-taglet The fully qualified name of Taglet to register
-tagletpath The path to Taglets
-charset <charset> Charset for cross-platform viewing of generated documentation.
-helpfile <file> 包含幫助鏈接功能鏈接到目標的文件
-linksource Generate source in HTML
-stylesheetfile <path> 改變所生成文檔的樣式的文件
-docencoding <name> 輸出編碼名稱

javah.exe

用法:javah [options] <classes>

其中 [options] 包括:

-help 列印該幫助信息
-classpath <path> 類的載入路徑
-bootclasspath <path> 自舉類的載入路徑
-d <dir> 輸出目錄
-o <file> 輸出文件(僅能使用 -d 或 -o 之一)
-jni 生成 JNI 風格的頭文件(預設)
-old 生成 JDK1.0 風格的頭文件
-stubs 生成 stubs 文件
-version 列印版本信息
-verbose 輸出有關本命令所做工作的信息
-force 始終寫輸出文件

指定 <classes> 時必須使用全名(例如 java.lang.Object)。

javaw.exe

====================
HtmlConverter.exe

用法:HtmlConverter [-option1 value1 [-option2 value2 [...]]] [-simulate] [filespecs]

其中,選項包括:

-source: 獲取源文件的路徑。 預設值: <userdir>
-dest: 寫入已轉換文件的路徑。 預設值: <userdir>
-backup: 寫備份文件的路徑。 預設值: <dirname>_BAK
-f: 強制覆寫備份文件。
-subdirs: 應處理子目錄中的文件。
-template: 模板文件的路徑。 如果不確定,請使用預設值。
-log: 寫日誌的路徑。 如果沒有提供,則不會寫入任何日誌。
-progress: 轉換時顯示進度。 預設值: true
-simulate: 在沒有進行轉換時顯示特定於轉換的信息。
-latest: 使用最新的 JRE 支持發行版 mimetype。
-gui: 顯示轉換程序的圖形用戶界面。

filespecs: 用空格分開的文件說明列表。 預設值: "*.html *.htm" (需要引號)

orbd.exe

用法:orbd <選項>

其中,<選項> 包括:
-port 啟動 ORBD 的激活埠,預設值為 1049 (可選)
-defaultdb ORBD 文件的目錄,預設值為 "./orb.db" (可選)
-serverid ORBD 的伺服器標識符,預設值為 1 (可選)
-ORBInitialPort 初始埠(必需)
-ORBInitialHost 初始主機名稱(必需)

====================
policytool.exe

用法:policytool [選項]

[-file <file>] 規則文件位置

====================
rmic.exe

用法:rmic <選項> <類名>

其中 <選項> 包括:
-keep 不刪除中間生成的源文件
-keepgenerated (同 "-keep")
-v1.1 為 1.1 stub 協議版本創建 stubs/skeleton
-vcompat (預設)創建與 1.1 和
1.2 stub 協議版本兼容的 stubs/skeleton
-v1.2 僅為 1.2 stub 協議版本創建 stubs
-iiop 為 IIOP 創建 stubs。當使用該選項時,<選項>還應包括:

-always 總創建 stubs (即使在它們同時出現時〕
-alwaysgenerate (同 "-always")
-nolocalstubs 不創建為同一進程優化的 stubs

-idl 創建 IDL。當使用該選項時,<選項>還應包括:

-noValueMethods 不生成值類型的方法
-always 總創建 IDL (即使在它們同時出現時〕
-alwaysgenerate (同 "-always")

-g 一般調試信息
-depend 以遞歸方式重編譯過期的文件
-nowarn 不警告
-nowrite 不將編譯過的類寫入到文件系統
-verbose 輸出有關編譯器所做工作的信息
-classpath <path> 指定輸入源和類文件的查找位置
-sourcepath <path> 指定用戶源文件的查找位置
-bootclasspath <path> 覆蓋自舉類文件的位置
-extdirs <path> 覆蓋安裝擴展類的位置
-d <directory> 指定所生成類文件的放置位置
-J<runtime flag> 將參數傳給 java 解釋程序

====================
rmid.exe

用法:rmid <option>

其中,<option> 包括:
-port <option> 指定供 rmid 使用的埠
-log <directory> 指定 rmid 將日誌寫入的目錄
-stop 停止當前的 rmid 調用(對指定埠)
-C<runtime 標記> 向每個子進程傳遞參數(激活組)
-J<runtime 標記> 向 java 解釋程序傳遞參數

====================
rmiregistry.exe

用法: rmiregistry <選項> <埠>

其中,<選項> 包括:
-J<runtime 標記> 將參數傳遞到 java 解釋程序

====================
serialver.exe

用法:serialver [-classpath classpath] [-show] [classname...]

====================
servertool.exe

歡迎使用 Java IDL 伺服器工具
請在提示處輸入命令

servertool > help

可用命令:
-------------------

register - 注冊一個可激活的伺服器
unregister - 取消伺服器注冊
getserverid - 返回應用程序名稱的伺服器標識符
list - 列舉所有已注冊伺服器
listappnames - 列舉當前定義的應用程序名稱
listactive - 列舉當前活動的伺服器
locate - 將已注冊伺服器定位在特定類型的埠
locateperorb - 為已注冊伺服器的特定對象請求代理程序定位埠。
orblist - 對象請求代理程序 (orb) 名稱及其映射列表
shutdown - 關閉一個已注冊伺服器
startup - 啟動一個已注冊伺服器
help - 取得幫助
quit - 退出此工具
====================
rmic

功能說明:
rmic 為遠程對象生成 stub 和 skeleton。
語法:
rmic [ options ] package-qualified-class-name(s)
補充說明:
rmic 編譯器根據編譯後的 Java 類(含有遠程對象實現)名,為遠程對象生成 stub 和 skeleton(遠程對象是指實現 java.rmi.Remote 介面的對象)。在 rmic 命令中所給的類必須是經 javac 命令成功編譯且是完全包限定的類。
命令選項
-classpath[路徑] 指定 rmic 用於查詢類的路徑。如果設置了該選項,它將覆蓋預設值或 CLASSPATH 環境變數。目錄用冒號分隔。
-d[目錄] 指定類層次的根目錄。此選項可用來指定 stub 和 skeleton 文件的目標目錄。
-depend 使編譯器考慮重新編譯從其它類引用的類。 一般來說,它只重新編譯從源代碼引用的遺漏或過期的類。
-g 允許生成調試表格。調試表格含有行號和局部變數的有關信息,即 Java 調試工具所使用的信息。預設情況下,只生成行號。
-J 與 -D 選項聯用,它將緊跟其後的選項( -J 與 -D 之間無空格)傳給 java 解釋器。
-keepgenerated 為 stub 和 skeleton 文件保留所生成的 .java 源文件,並將這些源文件寫到與 .class 文件相同的目錄中,如果要指定目錄,則使用 -d 選項。
-nowarn 關閉警告。如果使用該選項,則編譯器不輸出任何警告信息。
-show 顯示 rmic 編譯器的 GUI(圖形用戶界面)。輸入一個或多個包限定類名(以空格分隔),並按回車鍵或「顯示」按鈕,創建 stub 和 skeleton。
-vcompat (預設值)創建與 JDK 1.1 和 1.2 stub 協議版本都兼容的 stub 和 skeleton。
-verbose 使編譯器和鏈接器輸出關於正在編譯哪些類和正在載入哪些類文件的信息。
-v1.1 創建 JDK 1.1 stub 協議版本的 stub 和 skeleton。
-v1.2 只創建 JDK 1.2 stub 協議版本的 stub。

=================================

rmid

功能說明:
rmid 啟動激活系統守護進程,以便能夠在 Java 虛擬機上注冊和激活對象。
語法:
rmid [-port port] [-log dir]
補充說明:
rmid 工具啟動激活系統守護進程。必須先啟動激活系統守護進程,才能向激活系統注冊可被激活的對象或在 Java 虛擬機上激活可被激活的對象。
命令選項
-C<某些命令行選項> 指定一個選項,在創建每個 rmid 的子守護進程(激活組)時,該選項以命令行參數的形式傳給該子守護進程。
-log[目錄] 指定目錄的名稱,激活系統守護進程在該目錄中寫入其資料庫及相關信息。預設狀態下,將在執行 rmid 命令的目錄中創建一個 log 目錄。
-port[埠] 指定 rmid 的注冊服務程序所使用的埠。激活系統守護進程將 ActivationSystem 與該注冊服務程序中的名稱java.rmi.activation.ActivationSystem 捆綁在一起。
-stop 停止 -port 選項所指定埠上的當前 rmid 調用。若未指定埠,則將停止在埠 1098 上運行的 rmid。

=============================

rmiregistry

功能說明:
rmiregistry 命令可在當前主機的指定埠上啟動遠程對象注冊服務程序。
語法:
rmiregistry [port]
補充說明:
rmiregistry 命令在當前主機的指定 port 上創建並啟動遠程對象注冊服務程序。如果省略 port,則注冊服務程序將在 1099 埠上啟動。rmiregistry 命令不產生任何輸出而且一般在後台運行。遠程對象注冊服務程序是自舉命名服務。主機上的 RMI 伺服器將利用它將遠程對象綁定到名字上。客戶機即可查詢遠程對象並進行遠程方法調用。注冊服務程序一般用於定位應用程序需調用其方法的第一個遠程對象。該對象反過來對各應用程序提供相應的支持,用於查找其它對象。java.rmi.registry.LocateRegistry 類的方法可用於在某台主機或主機和埠上獲取注冊服務程序操作。java.rmi.Naming 類的基於 URL 的方法將對注冊服務程序進行操作,並可用於查詢遠程對象、將簡單(字元串)名稱綁定到遠程對象、將新名稱重新綁定到遠程對象(覆蓋舊綁定)、取消遠程對象的綁定以及列出綁定在注冊服務程序上的 URL。

=============================

serialver

功能說明:
serialver 命令返回 serialVersionUID。
語法:
serialver [ 命令選項 ]
補充說明:
serialver 以適於復制到演變類的形式返回一個或多個類的 serialVersionUID。不帶參數調用時,它輸出用法行。
命令選項
-show 顯示一個簡單的用戶界面。輸入完整的類名並按回車鍵或「顯示」按鈕可顯示 serialVersionUID。

================================

jarsigner

功能說明:
為 Java 歸檔 (JAR) 文件產生簽名,並校驗已簽名的 JAR 文件的簽名。
語法:
jarsigner [ 命令選項 ] jar-file alias
jarsigner -verify [ 命令選項 ] jar-file
補充說明:
jarsigner 工具用於兩個目的:
1:為 Java 歸檔 (JAR) 文件簽名
2:校驗已簽名的 JAR 文件的簽名和完整性
命令選項
-keystore[url] 指定密鑰倉庫的 URL。預設值是用戶的宿主目錄中的 .keystore 文件,它由系統屬性「user.home」決定。
-storetype[storetype] 指定要被實例化的密鑰倉庫類型。默認的密鑰倉庫類型是安全屬性文件中 "keystore.type" 屬性值所指定的那個類型,由 java.security.KeyStore 中的靜態方法 getDefaultType 返回。
-storepass[password] 指定訪問密鑰倉庫所需的口令。這僅在簽名(不是校驗)JAR 文件時需要。在這種情況下,如果命令行中沒有提供 -storepass 選項,用戶將被提示輸入口令。
-keypass[password] 指定用於保護密鑰倉庫項(由命令行中指定的別名標出)的私鑰的口令。使用 jarsigner 為 JAR 文件簽名時需要該口令。如果命令行中沒有提供口令,且所需的口令與密鑰倉庫的口令不同,則將提示用戶輸入它。
-sigfile[file] 指定用於生成 .SF 和 .DSA 文件的基本文件名。
-signedjar[file] 指定用於已簽名的 JAR 文件的名稱。
-verify 如果它出現在命令行中,則指定的 JAR 文件將被校驗,而不是簽名。如果校驗成功,將顯示「jar verified」。如果試圖校驗未簽名的 JAR 文件,或校驗被不支持的演算法(例如未安裝 RSA 提供者時使用的 RSA)簽名的 JAR 文件,則將有如下顯示: "jar is unsigned. (signatures missing or not parsable)" 。
-certs 如果它與 -verify 和 -verbose 選項一起出現在命令行中,則輸出將包括 JAR 文件的每個簽名人的證書信息。
-verbose 如果它出現在命令行中,則代表「verbose」模式,它使 jarsigner 在 JAR 簽名或校驗過程中輸出額外信息。
-internalsf 過去,JAR 文件被簽名時產生的 .DSA(簽名塊)文件包含一個同時產生的 .SF 文件(簽名文件)的完整編碼副本。這種做法已被更改。為了減小輸出 JAR 文件的整個大小,預設情況下 .DSA 文件不再包含 .SF 文件的副本。但是如果 -internalsf 出現在命令行中,將採用舊的做法。該選項主要在測試時有用;實際上不應使用它,因為這樣將消除有用的優化。
-sectionsonly 如果它出現在命令行中,則 JAR 文件被簽名時生成的 .SF 文件(簽名文件)將不包括含有整個清單文件的散列的頭。它僅包含 與 JAR 中每個單獨的源文件相關的信息和散列。該選項主要在測試時有用;實際上不應使用它,因為這樣將消除有用的優化。
-J[javaoption] 將指定的 javaoption 串直接傳遞到 Java 解釋器。((jarsigner 實際上是解釋器的一個 「wrapper」)。該選項不應含有任何空格。它有助於調整執行環境或內存使用。要獲得可用的解釋器選項的清單,可在命令行鍵入 java -h 或 java -X。

========================

keytool
功能說明:
管理由私鑰和認證相關公鑰的 X.509 證書鏈組成的密鑰倉庫(資料庫)。還管理來自可信任實體的證書。
語法:
keytool [ 命令 ]
補充說明:
keytool 是個密鑰和證書管理工具。它使用戶能夠管理自己的公鑰/私鑰對及相關證書,用於(通過數字簽名)自我認證(用戶向別的用戶/服務認證自己)或數據完整性以及認證服務。它還允許用戶儲存他們的通信對等者的公鑰(以證書形式)。

=======================

native2ascii

功能說明:
將含有本地編碼字元(既非 Latin1 又非 Unicode 字元)的文件轉換為 Unicode 編碼字元的文件。
語法:
native2ascii [options] [inputfile [outputfile]]
補充說明:
Java 編譯器和其它 Java 工具只能處理含有 Latin-1 和/或 Unicode 編碼(udddd 記號)字元的文件。native2ascii 將含有其它字元編碼的文件轉換成含 Latin-1 和/或 Unicode 編碼字元的文件。若省略 outputfile,則使用標准輸出設備輸出。此外,如果也省略 inputfile,則使用標准輸入設備輸入。
命令選項
-reverse 執行相反的操作:將含 Latin-1 和/或 Unicode 編碼字元的文件轉換成含本地編碼字元的文件。
-encoding[encoding_name] 指定轉換過程使用的編碼名稱。預設的編碼從系統屬性 file.encoding 中得到。

=======================

appletviewer

功能說明:
Java applet 瀏覽器。appletviewer 命令可在脫離萬維網瀏覽器環境的情況下運行 applet。
語法:
appletviewer [ threads flag ] [ 命令選項 ] urls ...
補充說明:
appletviewer 命令連接到 url 所指向的文檔或資源上,並在其自身的窗口中顯示文檔引用的每個 applet。注意:如果 url 所指向的文檔不引用任何帶有 OBJECT、EMBED 或 APPLET 標記的 applet,那麼 appletviewer 就不做任何事情。
命令選項
-debug 在 Java 調試器 jdb 中啟動 appletviewer,使您可以調試文檔中的 applet。
-encoding[編碼名稱] 指定輸入 HTML 文件的編碼名稱。
-J[javaoption] 將 javaoption 字元串作為單個參數傳給運行 appletviewer 的 Java 解釋器。參數不能含有空格。由多重參數組成的字元串,其中的每個參數都必須以前綴 -J 開頭,該前綴以後將被除去。這在調整編譯器的執行環境或內存使用時將很有用。

=========================

extcheck

功能說明:
extcheck 檢測目標 jar 文件與當前安裝方式擴展 jar 文件間的版本沖突。
語法:
extcheck [ -verbose ] targetfile.jar
補充說明:
extcheck 實用程序檢查指定 Jar 文件的標題和版本與 JDK TM 軟體中所安裝的擴展是否有沖突。在安裝某個擴展前,可以用該實用程序查看是否已安裝了該擴展的相同版本或更高的版本。
extcheck 實用程序將 targetfile.jar 文件清單的 specification-title 和 specification-version 頭與當前安裝在擴展目錄下所有 Jar 文件的相對應的頭進行比較(預設擴展目錄為 jre/lib/ext)。extcheck 實用程序比較版本號的方式與 java.lang.Package.isCompatibleWith 方法相同。若未檢測到沖突,則返回代碼為 0。如果擴展目錄中任何一個 jar 文件的清單有相同的 specification-title 和相同的或更新的 specification-version 號,則返回非零錯誤代碼。如果 targetfile.jar 的清單中沒有 specification-title 或 specification-version 屬性,則同樣返回非零錯誤代碼。
命令選項
-verbose 對擴展目錄中的 Jar 文件進行檢查時,列出文件。此外,還報告目標 jar 文件的清單屬性及所有沖突的 jar 文件。

=====================

jar

功能說明:
Java歸檔工具
語法:
jar [ 命令選項 ] [manifest] destination input-file [input-files]
補充說明:
jar工具是個java應用程序,可將多個文件合並為單個JAR歸檔文件。jar是個多用途的存檔及壓縮工具,它基於ZIP和ZLIB壓縮格式。然而,設計jar的主要目的是便於將java applet或應用程序打包成單個歸檔文件。將applet或應用程序的組件(.class 文件、圖像和聲音)合並成單個歸檔文件時,可以用java代理(如瀏覽器)在一次HTTP事務處理過程中對它們進行下載,而不是對每個組件都要求一個新連接。這大大縮短了下載時間。jar還能壓縮文件,從而進一步提高了下載速度。此外,它允許applet的作者對文件中的各個項進行簽名,因而可認證其來源。jar工具的語法基本上與tar命令的語法相同。
命令選項
-c 在標准輸出上創建新歸檔或空歸檔。
-t 在標准輸出上列出內容表。
-x[file] 從標准輸入提取所有文件,或只提取指定的文件。如果省略了file,則提取所有文件;否則只提取指定文件。
-f 第二個參數指定要處理的jar文件。在-c(創建)情形中,第二個參數指的是要創建的jar文件的名稱(不是在標准輸出上)。在-t(表(或-x(抽取)這兩種情形中,第二個參數指定要列出或抽取的jar文件。
-v 在標准錯誤輸出設備上生成長格式的輸出結果。
-m 包括指定的現有清單文件中的清單信息。用法舉例:「jar cmf myManifestFile myJarFile *.class」
-0 只儲存,不進行 ZIP 壓縮。
-M 不創建項目的清單文件。
-u 通過添加文件或更改清單來更新現有的 JAR 文件。例如:「jar -uf foo.jar foo.class」將文件 foo.class 添加到現有的JAR文件foo.jar中,而「jar umf manifest foo.jar」則用manifest中的信息更新foo.jar的清單。
-C 在執行 jar 命令期間更改目錄。例如:「jar -uf foo.jar -C classes *」將classes目錄內的所有文件加到foo.jar中,但不添加類目錄本身。
程序示例
1:將當前目錄下所有CLASS文件打包成新的JAR文件:
jar cf file.jar *.class
2:顯示一個JAR文件中的文件列表
jar tf file.jar
3:將當前目錄下的所有文件增加到一個已經存在的JAR文件中
jar cvf file.jar *

========================

javadoc

功能說明
Java API文檔生成器從Java源文件生成API文檔HTML頁。
語法:
javadoc [ 命令選項 ] [ 包名 ] [ 源文件名 ] [ @files ]
其中[ 包名 ]為用空格分隔的一系列包的名字,包名不允許使用通配符,如(*)。[ 源文件名 ]為用空格分

⑼ cmd中使用javac對整個包編譯怎麼辦對包裡面的某幾個java文件編譯怎麼辦

JAVAC 命令詳解

結構
javac [ options ] [ sourcefiles ] [ @files ]
參數可按任意次序排列。
options
命令行選項。
sourcefiles
一個或多個要編譯的源文件(例如 MyClass.java)。
@files
一個或多個對源文件進行列表的文件。
說明
javac
有兩種方法可將源代碼文件名傳遞給 javac:
?如果源文件數量少,在命令行上列出文件名即可。
?如果源文件數量多,則將源文件名列在一個文件中,名稱間用空格或回車行來進行分隔。然後在 javac 命令行中使用該列表文件名,文件名前冠以 @ 字元。
源代碼文件名稱必須含有 .java 後綴,類文件名稱必須含有 .class 後綴,源文件和類文件都必須有識別該類的根名。例如,名為 MyClass 的類將寫在名為 MyClass.java的源文件中,並被編譯為位元組碼類文件 MyClass.class。
內部類定義產生附加的類文件。這些類文件的名稱將內部類和外部類的名稱結合在一起,例如 MyClass$MyInnerClass.class。
應當將源文件安排在反映其包樹結構的目錄樹中。例如,如果將所有的源文件放在 /workspace 中,那麼 com.mysoft.mypack.MyClass 的代碼應該在 \workspace\com\mysoft\mypack\MyClass.java 中。
預設情況下,編譯器將每個類文件與其源文件放在同一目錄中。可用 -d 選項(請參閱後面的選項)指定其它目標目錄。
工具讀取用 Java 編程語言編寫的類和介面定義,並將它們編譯成位元組碼類文件。
查找類型
當編譯源文件時,編譯器常常需要它還沒有識別出的類型的有關信息。對於源文件中使用、擴展或實現的每個類或介面,編譯器都需要其類型信息。這包括在源文件中沒有明確提及、但通過繼承提供信息的類和介面。
例如,當擴展 java.applet.Applet 時還要用到 Applet 的祖先類:java.awt.Panel 、 java.awt.Container、 java.awt.Component 和 java.awt.Object。
當編譯器需要類型信息時,它將查找定義類型的源文件或類文件。編譯器先在自舉類及擴展類中查找,然後在用戶類路徑中查找。用戶類路徑通過兩種途徑來定義:通過設置 CLASSPATH 環境變數或使用 -classpath 命令行選項。(有關詳細資料,請參閱設置類路徑)。如果使用 -sourcepath 選項,則編譯器在 sourcepath 指定的路徑中查找源文件;否則,編譯器將在用戶類路徑中查找類文件和源文件。可用-bootclasspath 和 -extdirs 選項來指定不同的自舉類或擴展類;參閱下面的聯編選項。
成功的類型搜索可能生成類文件、源文件或兩者兼有。以下是 javac 對各種情形所進行的處理:
?搜索結果只生成類文件而沒有源文件: javac 使用類文件。
?搜索結果只生成源文件而沒有類文件: javac 編譯源文件並使用由此生成的類文件。
?搜索結果既生成源文件又生成類文件: 確定類文件是否過時。若類文件已過時,則 javac 重新編譯源文件並使用更新後的類文件。否則, javac 直接使用類文件。
預設情況下,只要類文件比源文件舊, javac 就認為它已過時。( -Xdepend 選項指定相對來說較慢但卻比較可靠的過程。)
javac
注意: javac 可以隱式編譯一些沒有在命令行中提及的源文件。用 -verbose 選項可跟蹤自動編譯。

文件列表
為縮短或簡化 javac 命令,可以指定一個或多個每行含有一個文件名的文件。在命令行中,採用 '@' 字元加上文件名的方法將它指定為文件列表。當 javac 遇到以 `@' 字元開頭的參數時,它對那個文件中所含文件名的操作跟對命令行中文件名的操作是一樣的。這使得 Windows 命令行長度不再受限制。
例如,可以在名為 sourcefiles 的文件中列出所有源文件的名稱。該文件可能形如:
MyClass1.java
MyClass2.java
MyClass3.java
然後可用下列命令運行編譯器:
C:> javac @sourcefiles
選項
編譯器有一批標准選項,目前的開發環境支持這些標准選項,將來的版本也將支持它。還有一批附加的非標准選項是目前的虛擬機實現所特有的,將來可能要有變化。非標准選項以 -X 打頭。
標准選項
-classpath 類路徑
設置用戶類路徑,它將覆蓋 CLASSPATH 環境變數中的用戶類路徑。若既未指定 CLASSPATH 又未指定 -classpath,則用戶類路徑由當前目錄構成。有關詳細信息,請參閱設置類路徑。
若未指定 -sourcepath 選項,則將在用戶類路徑中查找類文件和源文件。
-d 目錄
設置類文件的目標目錄。如果某個類是一個包的組成部分,則 javac 將把該類文件放入反映包名的子目錄中,必要時創建目錄。例如,如果指定 -d c:\myclasses 並且該類名叫 com.mypackage.MyClass,那麼類文件就叫作 c:\myclasses\com\mypackage\MyClass.class。
若未指定 -d 選項,則 javac 將把類文件放到與源文件相同的目錄中。
注意: -d 選項指定的目錄不會被自動添加到用戶類路徑中。
-deprecation
顯示每種不鼓勵使用的成員或類的使用或覆蓋的說明。沒有給出 -deprecation 選項的話, javac 將顯示這類源文件的名稱:這些源文件使用或覆蓋不鼓勵使用的成員或類。
-encoding
設置源文件編碼名稱,例如 EUCJIS/SJIS。若未指定 -encoding 選項,則使用平台預設的轉換器。
-g
生成所有的調試信息,包括局部變數。預設情況下,只生成行號和源文件信息。
-g:none
不生成任何調試信息。
-g:{關鍵字列表}
只生成某些類型的調試信息,這些類型由逗號分隔的關鍵字列表所指定。有效的關鍵字有:
source
源文件調試信息
lines
行號調試信息
vars
局部變數調試信息
-nowarn
禁用警告信息。
-O
優化代碼以縮短執行時間。使用 -O 選項可能使編譯速度下降、生成更大的類文件並使程序難以調試。
在 JDK 1.2 以前的版本中,javac 的 -g 選項和 -O 選項不能一起使用。在 JDK 1.2 中,可以將 -g 和 -O 選項結合起來,但可能會得到意想不到的結果,如丟失變數或重新定位代碼或丟失代碼。-O 選項不再自動打開 -depend 或關閉 -g 選項。同樣, -O 選項也不再允許進行跨類內嵌。
-sourcepath 源路徑
指定用以查找類或介面定義的源代碼路徑。與用戶類路徑一樣,源路徑項用分號 (;) 進行分隔,它們可以是目錄、JAR 歸檔文件或 ZIP 歸檔文件。如果使用包,那麼目錄或歸檔文件中的本地路徑名必須反映包名。
注意:通過類路徑查找的類,如果找到了其源文件,則可能會自動被重新編譯。
-verbose
冗長輸出。它包括了每個所載入的類和每個所編譯的源文件的有關信息。
聯編選項
預設情況下,類是根據與 javac 一起發行的 JDK 自舉類和擴展類來編譯。但 javac 也支持聯編,在聯編中,類是根據其它 Java平台實現的自舉類和擴展類來進行編譯的。聯編時, -bootclasspath 和 -extdirs 的使用很重要;請參閱下面的聯編程序示例。
-target 版本
生成將在指定版本的虛擬機上運行的類文件。預設情況下生成與 1.1 和 1.2 版本的虛擬機都兼容的類文件。JDK 1.2 中的 javac 所支持的版本有:
1.1
保證所產生的類文件與 1.1 和 1.2 版的虛擬機兼容。這是預設狀態。
1.2
生成的類文件可在 1.2 版的虛擬機上運行,但不能在 1.1 版的虛擬機上運行。
-bootclasspath 自舉類路徑
根據指定的自舉類集進行聯編。和用戶類路徑一樣,自舉類路徑項用分號 (;) 進行分隔,它們可以是目錄、JAR 歸檔文件或 ZIP 歸檔文件。
-extdirs 目錄
根據指定的擴展目錄進行聯編。目錄是以分號分隔的目錄列表。在指定目錄的每個 JAR 歸檔文件中查找類文件。
非標准選項
-X
顯示非標准選項的有關信息並退出。
-Xdepend
遞歸地搜索所有可獲得的類,以尋找要重編譯的最新源文件。該選項將更可靠地查找需要編譯的類,但會使編譯進程的速度大為減慢。
-Xstdout
將編譯器信息送到System.out 中。預設情況下,編譯器信息送到 System.err 中。
-Xverbosepath
說明如何搜索路徑和標准擴展以查找源文件和類文件。
-J選項
將選項傳給 javac 調用的 java 啟動器。例如, -J-Xms48m 將啟動內存設為 48 兆位元組。雖然它不以 -X 開頭,但它並不是 javac 的『標准選項』。用 -J 將選項傳給執行用 Java 編寫的應用程序的虛擬機是一種公共約定。
注意: CLASSPATH 、 -classpath 、 -bootclasspath 和 -extdirs 並 不 指定用於運行 javac 的類。如此濫用編譯器的實現通常沒有任何意義而且總是很危險的。如果確實需要這樣做,可用 -J 選項將選項傳給基本的 java 啟動器。
程序示例
編譯簡單程序
一個源文件 Hello.java ,它定義了一個名叫 greetings.Hello 的類。greetings 目錄是源文件和類文件兩者的包目錄,且它不是當前目錄。這讓我們可以使用預設的用戶類路徑。它也使我們沒必要用 -d 選項指定單獨的目標目錄。
C:> dir
greetings/
C:> dir greetings
Hello.java
C:> cat greetings\Hello.java
package greetings;
public class Hello {
public static void main(String[] args) {
for (int i=0; i < args.length; i++) {
System.out.println("Hello " + args[i]);
}
}
}
C:> javac greetings\Hello.java
C:> dir greetings
Hello.class Hello.java
C:> java greetings.Hello World Universe Everyone
Hello World
Hello Universe
Hello Everyone
編譯多個源文件
該示例編譯 greetings 包中的所有源文件。
C:> dir
greetings\
C:> dir greetings
Aloha.java GutenTag.java Hello.java Hi.java
C:> javac greetings\*.java
C:> dir greetings
Aloha.class GutenTag.class Hello.class Hi.class
Aloha.java GutenTag.java Hello.java Hi.java
指定用戶類路徑
對前面示例中的某個源文件進行更改後,重新編譯它:
C:> cd
\examples
C:> javac greetings\Hi.java
由於 greetings.Hi 引用了 greetings 包中其它的類,編譯器需要找到這些其它的類。上面的示例能運行是因為預設的用戶類路徑剛好是含有包目錄的目錄。但是,假設我們想重新編譯該文件並且不關心我們在哪個目錄中的話, 我們需要將 \examples 添加到用戶類路徑中。可以通過設置 CLASSPATH 達到此目的,但這里我們將使用 -classpath 選項來完成。
C:>javac -classpath \examples \examples\greetings\Hi.java
如果再次將 greetings.Hi 改為使用標題實用程序,該實用程序也需要通過用戶類路徑來進行訪問:
C:>javac -classpath \examples:\lib\Banners.jar \
\examples\greetings\Hi.java
要執行 greetings 中的類,需要訪問 greetings 和它所使用的類。
C:>java -classpath \examples:\lib\Banners.jar greetings.Hi
將源文件和類文件分開
將源文件和類文件置於不同的目錄下經常是很有意義的,特別是在大型的項目中。我們用 -d 選項來指明單獨的類文件目標位置。由於源文件不在用戶類路徑中,所以用 -sourcepath 選項來協助編譯器查找它們。
C:> dir
classes\ lib\ src\
C:> dir src
farewells\
C:> dir src\farewells
Base.java GoodBye.java
C:> dir lib
Banners.jar
C:> dir classes
C:> javac -sourcepath src -classpath classes:lib\Banners.jar \
src\farewells\GoodBye.java -d classes
C:> dir classes
farewells\
C:> dir classes\farewells
Base.class GoodBye.class
注意:編譯器也編譯了 src\farewells\Base.java,雖然我們沒有在命令行中指定它。要跟蹤自動編譯,可使用 -verbose 選項。
聯編程序示例
這里我們用 JDK 1.2 的 javac 來編譯將在 1.1 版的虛擬機上運行的代碼。
C:> javac -target 1.1 -bootclasspath jdk1.1.7\lib\classes.zip \
-extdirs "" OldCode.java
-target 1.1
JDK 1.2 javac 在預設狀態下也將根據 1.2 版的自舉類來進行編譯,因此我們需要告訴 javac 讓它根據 JDK 1.1 自舉類來進行編譯。可用 -bootclasspath 和 -extdirs 選項來達到此目的。不這樣做的話,可能會使編譯器根據 1.2 版的 API 來進行編譯。由於 1.1 版的虛擬機上可能沒有該 1.2 版的 API,因此運行時將出錯。
選項可確保生成的類文件與 1.1 版的虛擬機兼容。在 JDK1.2 中, 預設情況下 javac 編譯生成的文件是與 1.1 版的虛擬機兼容的,因此並非嚴格地需要該選項。然而,由於別的編譯器可能採用其它的預設設置,所以提供這一選項將不失為是個好習慣。

⑽ 怎樣設置編譯器路徑

環境變數中設置 bin,或者path路徑
|
我的電腦->屬性->高級->環境變數

閱讀全文

與縮短編譯器路徑有什麼用相關的資料

熱點內容
java編程的培訓機構 瀏覽:565
cas加密工作原理 瀏覽:435
社科pdf 瀏覽:230
怎麼判斷用多大的單片機 瀏覽:396
程序員兩個月還沒找到工作 瀏覽:625
單片機發at命令 瀏覽:390
java方法參數類 瀏覽:61
直螺紋套筒連接加密 瀏覽:150
擒牛決指標源碼 瀏覽:903
python中有哪六種標准數據類型 瀏覽:43
雲伺服器日誌是什麼意思 瀏覽:70
怎麼轉安卓到ios的王者榮耀 瀏覽:433
vapp怎麼下 瀏覽:667
linuxbt命令 瀏覽:284
安卓怎麼注銷蘋果區和平營地 瀏覽:142
怎麼去調整電腦文件夾的桌面 瀏覽:210
解壓汽車綠本可以找代理人嗎 瀏覽:64
我的世界命令方塊在哪 瀏覽:315
linuxzone 瀏覽:746
androidapi版本號 瀏覽:784