㈠ 時間花在什麼上最有價值
時間和財力、物力一樣,是一種生產成本,而付出一切成本,是為了更好的收益。
用較少的時間成本,來實現時間的效用最大化,是我們每一個人的目標和期待,而在生活當中,效用最大化具有很大的主觀性,因而在現實中很難量化。
但對時間花在什麼上最有價值提出幾點建議:
1.無論是何種工作、擔任何種崗位,學習知識、豐富內涵、開拓視野是走向成功的必經之路,也是時間可利用的重要價值之一。
2.在生活當中,會有形形色色的人和事,成為一個有度量的人,養成良好品行,為人真誠,學會一些社交技巧,珍惜身邊的夥伴,是走向強大的必要條件之一。
3.充滿自信,交一些互相欣賞的朋友,進行可以提升自信心的工作和社會活動,對自己的個性和心理與社會角色進行一種積極評價,成功的道路也並非只有一兩條,條條大路通羅馬,希望樓主可以獲得自己價值體現和一份成功。
㈡ 翻譯∶中國學生把他們絕大部分時間花在學習上
中國學生把他們絕大部分時間花在學習上
Chinese students spend most of their time on their study.
Chinese students spend most of their time in studying their lessons.
Chinese students spend most of their time studying.
三個方式都可以。
寶貝勤學好問,天天快樂!
㈢ MyEclipse保存頁面時編譯總是很慢(時間全浪費在這上面了)
優化一下,下面內容都是CTRL+C得到的,感謝原作者:
1 、關閉MyEclipse的自動validation
windows > perferences > myeclipse > validation
將Build下全部勾取消
如果你需要驗證某個文件的時候,我們可以單獨去驗證它。方法是:
在需要驗證的文件上( 右鍵 -> MyEclipse -> Run Validation 。
2、 啟動優化,關閉不需要使用的模塊
所以可以將一些不使用的模塊禁止 載入啟動。
Window > Preferences > General > Startup andy Shutdown 在這里列出的是MyEclipse啟動時載入的模塊
我這里只讓它載入tomcat6 勾選 MyEclipse EASIE Tomcat 6 。
WTP :一個跟myeclipse差不多的東西,主要差別是 WTP 是免費的,如果使用myeclipse,這個可以取消
Mylyn:組隊任務管理工具,類似於 CVS ,以任務為單位管理項目進度,沒用到的可以取消
Derby:一種保存成 jar 形式的資料庫,我沒用到,取消
一大排以 MyEclipse EASIE 打頭的啟動項:myeclipse 支持的伺服器,只選自己用的,其他取消,
比如我只選了 tomcat 。
3 、去掉MyEclipse的拼寫檢查(如果你覺的有用可以不去)
拼寫檢查會給我們帶來不少的麻煩,我們的方法命名都會是單詞的縮寫,他也會提示有錯,
所以最好去掉,沒有多大的用處
Window > perferences > General > Editors > Text Editors > Spelling > 將Enable spell checking復選框的勾選去掉。
4 、修改MyEclipse編輯JSP頁面時的編輯工具
Window > perferences > General > Editors > File Associations >
在File types 中選擇 *.jsp > 在Associated editors 中將"MyEclipse JSP Editor"設置為默認。
還有XML文件的默認編輯器
5 、修改MyEclipse安裝目錄的myeclipse.ini文件,加大JVM的非堆內存
具體內容如下:
-configuration
configuration
-vmargs
-Xms256m
-Xmx512m
-XX:PermSize=128M
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=64m
6、使用JRockit作為Eclipse的java VM
Eclipse啟動參數,指定eclipse啟動時使用的jre
"E:\MyEclipse8.0\MyEclipse Blue Edition 8.0 GA\myeclipse-blue.exe" -vm E:\JRockit\jrrt-3.1.2-1.6.0\bin\javaw.exe -vmargs -Xms256m -Xmx512m
在Eclipse裡面,Window > Preferences,然後選擇Java > Installed JREs添加JRockit,並設置為默認。 這樣,就可以用JRockit來編譯項目了。
7. 關閉自動更新
1.window->Perferences->General->Startup and Shutdown 勾掉 Automatic Updates Scheler(自動更新調度程序)
2.window->Perferences->MyEclipse->Maven4MyEclipse 勾上 Enable Maven4MyEclipse featrures ;確定關閉窗口;該步驟是為了顯示第3步中的Maven節點
3.window->Perferences->MyEclipse->Maven4MyEclipse –>Maven 勾掉 Download repository index updates on startup
㈣ 編譯原理試題
習題一、單項選擇題
1、將編譯程序分成若干個「遍」是為了 。
a.提高程序的執行效率
b.使程序的結構更加清晰
c.利用有限的機器內存並提高機器的執行效率
d.利用有限的機器內存但降低了機器的執行效率
2、構造編譯程序應掌握 。
a.源程序 b.目標語言
c.編譯方法 d.以上三項都是
3、變數應當 。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4、編譯程序絕大多數時間花在 上。
a.出錯處理 b.詞法分析
c.目標代碼生成 d.管理表格
5、 不可能是目標代碼。
a.匯編指令代碼 b.可重定位指令代碼
c.絕對指令代碼 d.中間代碼
6、使用 可以定義一個程序的意義。
a.語義規則 b.詞法規則
c.產生規則 d.詞法規則
7、詞法分析器的輸入是 。
a.單詞符號串 b.源程序
c.語法單位 d.目標程序
8、中間代碼生成時所遵循的是- 。
a.語法規則 b.詞法規則
c.語義規則 d.等價變換規則
9、編譯程序是對 。
a.匯編程序的翻譯 b.高級語言程序的解釋執行
c.機器語言的執行 d.高級語言的翻譯
10、語法分析應遵循 。
a.語義規則 b.語法規則
c.構詞規則 d.等價變換規則
解答
1、將編譯程序分成若干個「遍」是為了使編譯程序的結構更加清晰,故選b。
2、構造編譯程序應掌握源程序、目標語言及編譯方法等三方面的知識,故選d。
3、對編譯而言,變數既持有左值又持有右值,故選c。
4、編譯程序打交道最多的就是各種表格,因此選d。
5、目標代碼包括匯編指令代碼、可重定位指令代碼和絕對指令代碼3種,因此不是目標代碼的只能選d。
6、詞法分析遵循的是構詞規則,語法分析遵循的是語法規則,中間代碼生成遵循的是語義規則,並且語義規則可以定義一個程序的意義。因此選a。
7、b 8、c 9、d 10、c
二、多項選擇題
1、編譯程序各階段的工作都涉及到 。
a.語法分析 b.表格管理 c.出錯處理
d.語義分析 e.詞法分析
2、編譯程序工作時,通常有 階段。
a.詞法分析 b.語法分析 c.中間代碼生成
d.語義檢查 e.目標代碼生成
解答
1.b、c 2. a、b、c、e
三、填空題
1、解釋程序和編譯程序的區別在於 。
2、編譯過程通常可分為5個階段,分別是 、語法分析 、代碼優化和目標代碼生成。 3、編譯程序工作過程中,第一段輸入是 ,最後階段的輸出為 程序。
4、編譯程序是指將 程序翻譯成 程序的程序。 解答
是否生成目標程序 2、詞法分析 中間代碼生成 3、源程序 目標代碼生成 4、源程序 目標語言
一、單項選擇題
1、文法G:S→xSx|y所識別的語言是 。
a. xyx b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法G描述的語言L(G)是指 。
a. L(G)={α|S+ ⇒α , α∈VT*} b. L(G)={α|S*⇒α, α∈VT*}
c. L(G)={α|S*⇒α,α∈(VT∪VN*)} d. L(G)={α|S+ ⇒α, α∈(VT∪VN*)}
3、有限狀態自動機能識別 。
a. 上下文無關文法 b. 上下文有關文法
c.正規文法 d. 短語文法
4、設G為算符優先文法,G的任意終結符對a、b有以下關系成立 。
a. 若f(a)>g(b),則a>b b.若f(a)<g(b),則a<b
c. a~b都不一定成立 d. a~b一定成立
5、如果文法G是無二義的,則它的任何句子α 。
a. 最左推導和最右推導對應的語法樹必定相同
b. 最左推導和最右推導對應的語法樹可能不同
c. 最左推導和最右推導必定相同
d. 可能存在兩個不同的最左推導,但它們對應的語法樹相同
6、由文法的開始符經0步或多步推導產生的文法符號序列是 。
a. 短語 b.句柄 c. 句型 d. 句子
7、文法G:E→E+T|T
T→T*P|P
P→(E)|I
則句型P+T+i的句柄和最左素短語為 。
a.P+T和i b. P和P+T c. i和P+T+i d.P和T
8、設文法為:S→SA|A
A→a|b
則對句子aba,下面 是規范推導。
a. SÞSAÞSAAÞAAAÞaAAÞabAÞaba
b. SÞSAÞSAAÞAAAÞAAaÞAbaÞaba
c. SÞSAÞSAAÞSAaÞSbaÞAbaÞaba
d. SÞSAÞSaÞSAaÞSbaÞAbaÞaba
9、文法G:S→b|∧(T)
T→T,S|S
則FIRSTVT(T) 。
a. {b,∧,(} b. {b,∧,)} c.{b,∧,(,,} d.{b,∧,),,}
10、產生正規語言的文法為 。
a. 0型 b. 1型 c. 2型 d. 3型
11、採用自上而下分析,必須 。
a. 消除左遞歸 b. 消除右遞歸 c. 消除回溯 d. 提取公共左因子
12、在規范歸約中,用 來刻畫可歸約串。
a. 直接短語 b. 句柄 c. 最左素短語 d. 素短語
13、有文法G:E→E*T|T
T→T+i|i
句子1+2*8+6按該文法G歸約,其值為 。
a. 23 B. 42 c. 30 d. 17
14、規范歸約指 。
a. 最左推導的逆過程 b. 最右推導的逆過程
c. 規范推導 d. 最左歸約的逆過程
[解答]
1、選c。
2、選a。
3、選c。
4、雖然a與b沒有優先關系,但構造優先函數後,a與b就一定存在優先關系了。所以,由f(a)>g)(b)或f(a)<g(b)並不能判定原來的a與b之間是否存在優先關系:故選c。
5、如果文法G無二義性,則最左推導是先生長右邊的枝葉:對於d,如果有兩個不同的是了左推導,則必然有二義性。故選a。
6、選c。
7、由圖2-8-1的語法樹和優先關系可以看出應選b。
8、規范推導是最左推導,故選d。
9、由T→T,…和T→(… 得FIRSTVT(T))={(,,)};
由T→S得FIRSTVT(S)⊂FIRSTVT(T),而FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,}; 因此選c。
10、d 11、c 12、b 13、b 14、b
二、多項選擇題
1、下面哪些說法是錯誤的 。
a. 有向圖是一個狀態轉換圖 b. 狀態轉換圖是一個有向圖
c.有向圖是一個DFA d.DFA可以用狀態轉換圖表示
2、對無二義性文法來說,一棵語法樹往往代表了 。
a. 多種推導過程 b. 多種最左推導過程 c.一種最左推導過程
d.僅一種推導過程 e.一種最左推導過程
3、如果文法G存在一個句子,滿足下列條件 之一時,則稱該文法是二義文法。
a. 該句子的最左推導與最右推導相同
b. 該句子有兩個不同的最左推導
c. 該句子有兩棵不同的最右推導
d. 該句子有兩棵不同的語法樹
e.該句子的語法樹只有一個
4、有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不產生下面 集合。
a. {anbmcndm|n,m≥0} b. {anbncmdm|n,m>0}
c. {anbmcmdn|n,m≥0} d. {anbncmdm|n,m≥0}
e. {anbncndn|n≥0}
5、自下而上的語法分析中,應從 開始分析。
a. 句型 b. 句子 c. 以單詞為單位的程序
d. 文法的開始符 e. 句柄
6、對正規文法描述的語言,以下 有能力描述它。
a.0型文法 b.1型文法 c.上下文無關文法 d.右線性文法 e.左線性文法
解答 1、e、a、c 2、a、c、e 3、b、c、d 4、a、c 5、b、c 6、a、b、c、d、e
三、填空題
1、文法中的終結符和非終結符的交集是 。詞法分析器交給語法分析器的文法符號一定是 ,它一定只出現在產生式的 部。
2、最左推導是指每次都對句型中的 非終結符進行擴展。
3、在語法分析中,最常見的兩種方法一定是 分析法,另一是 分析法。
4、採用 語法分析時,必須消除文法的左遞歸。
5、 樹代表推導過程, 樹代表歸約過程。
6、自下而上分析法採用 、歸約、錯誤處理、 等四種操作。
7、Chomsky把文法分為 種類型,編譯器構造中採用 和 文法,它們分別產生 和 語言,並分別用 和 自動機識別所產生的語言。
解答 1、空集 終結符 右
2、最左
3、自上而上 自下而上
4、自上而上
5、語法 分析
6、移進 接受
7、4 2 型 3型 上下文無關語言 正規語言 下推自動機 有限
四、判斷題
1、文法 S→aS|bR|ε描述的語言是(a|bc)* ( )
R→cS
2、在自下而上的語法分析中,語法樹與分析樹一定相同。 ( )
3、二義文法不是上下文無關文法。 ( )
4、語法分析時必須先消除文法中的左遞歸。 ( )
5、規范歸約和規范推導是互逆的兩個過程。 ( )
6、一個文法所有句型的集合形成該文法所能接受的語言。 ( )
解答 1、對 2、錯 3、錯 4、錯 5、錯 6、錯
五、簡答題
1、句柄 2、素短語 3、語法樹 4、歸約 5、推導
[解答]
1、句柄:一個句型的最左直接短語稱為該句型的句柄。
2、素短語:至少含有一個終結符的素短語,並且除它自身之外不再含任何更小的素短語。
3、語法樹:滿足下面4個條件的樹稱之為文法G[S]的一棵語法樹。
①每一終結均有一標記,此標記為VN∪VT中的一個符號;
②樹的根結點以文法G[S]的開始符S標記;
③若一結點至少有一個直接後繼,則此結點上的標記為VN中的一個符號;
④若一個以A為標記的結點有K個直接後繼,且按從左至右的順序,這些結點的標記分別為X1,X2,…,XK,則A→X1,X2,…,XK,必然是G的一個產生式。
4、歸約:我們稱αγβ直接歸約出αAβ,僅當A→γ 是一個產生式,且α、β∈(VN∪VT)*。歸約過程就是從輸入串開始,反復用產生式右部的符號替換成產生式左部符號,直至文法開始符。
5、推導:我們稱αAβ直接推出αγβ,即αAβÞαγβ,僅當A→ γ 是一個產生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,則我們稱這個序列是從α1至α2的一個推導。若存在一個從α1αn的推導,則稱α1可推導出αn。推導是歸約的逆過程。
六、問答題
1、給出上下文無關文法的定義。
[解答]
一個上下文無關文法G是一個四元式(VT,VN,S, P),其中:
●VT是一個非空有限集,它的每個元素稱為終結符號;
●VN是一個非空有限集,它的每個元素稱為非終結符號,VT∩VN=Φ;
●S是一個非終結符號,稱為開始符號;
●P是一個產生式集合(有限),每個產生式的形式是P→α,其中,P∈VN,
α∈(VT∪VN)*。開始符號S至少必須在某個產生式的左部出現一次。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的語言是什麼?
[解答]
(1)由於產生式左部存在終結符號,且所有產生式左部符號的長度均小於等於產生式右部的符號長度,所以文法G[S]是Chomsky1型文法,即上下文有關文法。
(2)按產生式出現的順序規定優先順序由高到低(否則無法推出句子),我們可以得到:
SÞabQÞabc
SÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbcc
SÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞ
aaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc
……
於是得到文法G[S]生成的語言L={anbncn|n≥1}
3、按指定類型,給出語言的文法。
L={aibj|j>i≥1}的上下文無關文法。
【解答】
(1)由L={aibj|j>i≥1}知,所求該語言對應的上下文無關文法首先應有S→aSb型產生式,以保證b的個數不少於a的個數;其次,還需有S→Sb或S→bS型的產生式,用以保證b的個數多於a的個數;也即所求上下文無關文法G[S]為:
G[S]:S→aSb|Sb|b
4、有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)試求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)寫出句子acabcbbdcc的最左推導過程。
【解答】(1)分別畫出對應兩句型的語法樹,如圖2-8-2所示
句柄:AaB Bd
圖2-8-2 語法樹
(2)句子acabcbbdcc的最左推導如下:
SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcA
ÞacabcbbdcAÞacabcbbdcc
5、對於文法G[S]:
S→(L)|aS|a L→L, S|S
(1)畫出句型(S,(a))的語法樹。(2)寫出上述句型的所有短語、直接短語、句柄和素短語。
【解答】
(1)句型(S,(a))的語法樹如圖2-8-3所示
(2)由圖2-8-3可知:
①短語:S、a、(a)、S,(a)、(S,(a));
②直接短語:a、S;
③句柄:S;
④素短語:素短語可由圖2-8-3中相鄰終結符之間的優先關系求得,即;
因此素短語為a。
6、考慮文法G[T]:
T→T*F|F
F→F↑P|P
P→(T)|i
證明T*P↑(T*F)是該文法的一個句型,並指出直接短語和句柄。
【解答】
首先構造T*P↑(T*F)的語法樹如圖2-8-4所示。
由圖2-8-4可知,T*P↑(T*F)是文法G[T]的一個句型。
直接短語有兩個,即P和T*F;句柄為P。
一、單項選擇題
1、詞法分析所依據的是 。
a. 語義規則 b. 構詞規則 c. 語法規則 d. 等價變換規則
2、詞法分析器的輸出結果是 。
a. 單詞的種別編碼 b. 單詞在符號表中的位置
c. 單詞的種別編碼和自身值 d. 單詞自身值
3、正規式M1和M2等價是指 。
a. M1和M2的狀態數相等 b. M1和M2的有向弧條數相等
c. M1和M2所識別的語言集相等 d. M1和M2狀態數和有向弧條數相等
4、狀態轉換圖(見圖3-6-1)接受的字集為 。
a. 以 0開頭的二進制數組成的集合 b. 以0結尾的二進制數組成的集合
c. 含奇數個0的二進制數組成的集合 d. 含偶數個0的二進制數組成的集合
5、詞法分析器作為獨立的階段使整個編譯程序結構更加簡潔、明確,因此, 。
a. 詞法分析器應作為獨立的一遍 b. 詞法分析器作為子程序較好
c. 詞法分析器分解為多個過程,由語法分析器選擇使用 d. 詞法分析器並不作為一個獨立的階段
解答 1、b 2、c 3、c 4、d 5、b
二、多項選擇題
1、在詞法分析中,能識別出 。
a. 基本字 b. 四元式 c. 運算符
d. 逆波蘭式 e. 常數
2、令∑={a,b},則∑上所有以b開頭,後跟若干個ab的字的全體對應的正規式為 。
a. b(ab)* b. b(ab)+ c.(ba)*b
d. (ba)+b e. b(a|b)
解答 1、a、c、e 2、a、b、d
三、填空題
1、確定有限自動機DFA是 的一個特例。
2、若二個正規式所表示的 相同,則認為二者是等價的。
3、一個字集是正規的,當且僅當它可由 所 。
解答 1、NFA 2、正規集 3、DFA(NFA)所識別
四、判斷題
1、一個有限狀態自動機中,有且僅有一個唯一終態。 ( )
2、設r和s分別是正規式,則有L(r|s)=L(r)|L(s)。 ( )
3、自動機M和M′的狀態數不同,則二者必不等價。 ( )
4、確定的自動機以及不確定的自動機都能正確地識別正規集。 ( )
5、對任意一個右線性文法G,都存在一個NFA M,滿足L(G)=L(M)。 ( )
6、對任意一個右線性文法G,都存在一個DFA M,滿足L(G)=L(M)。 ( )
7、對任何正規表達式e,都存在一個NFA M,滿足L(G)=L(e)。 ( )
8、對任何正規表達式e,都存在一個DFA M,滿足L(G)=L(e)。 ( )
解答 1 、2、3、錯 4、5、6、7、8、正確
五、基本題
1、設M=({x,y}, {a,b}, f,x,{y})為一非確定的有限自動機,其中f定義如下:
f(x,a)={x,y} f(x,b)={y}
f(y,a)=φ f(y,b)={x,y}
試構造相應的確定有限自動機M′。
解答:對照自動機的定義M=(S,Σ,f,S0,Z),由f的定義可知f(x,a)、f(y,b)均為多值函數,所以是一非確定有限自動機,先畫出NFA M相應的狀態圖,如圖3-6-2所示。
用子集法構造狀態轉換矩陣表3-6-3所示。
I Ia Ib
{x} {x,y} {y}
{y} — {x,y}
{x,y} {x,y} {x,y}
將轉換矩陣中的所有子集重新命名而形成表3-6-4所示的狀態轉換矩陣。
表3-6-4 狀態轉換矩陣
a b
0 2 1
1 — 2
2 2 2
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其狀態轉換圖如圖3-6-5所示。
將圖3-6-5的DFA M′最小化。首先,將M′的狀態分成終態組{1,2}與非終態組{0};其次,考察{1,2}。由於{1,2}a={1,2}b={2}⊂{1,2},所以不再將其劃分了,也即整個劃分只有兩組{0},{1,2}:令狀態1代表{1,2},即把原來到達2的弧都導向1,並刪除狀態2。最後,得到如圖3-6-6所示化簡DFA M′。
2、對給定正規式b*(d|ad)(b|ab)+,構造其NFA M;
解答:首先用A+=AA*改造正規式得:b*(d|ad)(b|ab)(b|ab)*;其次,構造該正規式的NFA M,如圖3-6-7所示。
㈤ as=bbb,a=bc,s=cc,asb=( )c.
習題一、單項選擇題1、將編譯程序分成若干個「遍」是為了。a.提高程序的執行效率b.使程序的結構更加清晰c.利用有限的機器內存並提高機器的執行效率d.利用有限的機器內存但降低了機器的執行效率2、構造編譯程序應掌握。a.源程序b.目標語言c.編譯方法d.以上三項都是3、變數應當。a.持有左值b.持有右值c.既持有左值又持有右值d.既不持有左值也不持有右值4、編譯程序絕大多數時間花在上。a.出錯處理b.詞法分析c.目標代碼生成d.管理表格5、不可能是目標代碼。a.匯編指令代碼b.可重定位指令代碼c.絕對指令代碼d.中間代碼6、使用可以定義一個程序的意義。a.語義規則b.詞法規則c.產生規則d.詞法規則7、詞法分析器的輸入是。a.單詞符號串b.源程序c.語法單位d.目標程序8、中間代碼生成時所遵循的是-。a.語法規則b.詞法規則c.語義規則d.等價變換規則9、編譯程序是對。a.匯編程序的翻譯b.高級語言程序的解釋執行c.機器語言的執行d.高級語言的翻譯10、語法分析應遵循。a.語義規則b.語法規則c.構詞規則d.等價變換規則解答1、將編譯程序分成若干個「遍」是為了使編譯程序的結構更加清晰,故選b。2、構造編譯程序應掌握源程序、目標語言及編譯方法等三方面的知識,故選d。3、對編譯而言,變數既持有左值又持有右值,故選c。4、編譯程序打交道最多的就是各種表格,因此選d。5、目標代碼包括匯編指令代碼、可重定位指令代碼和絕對指令代碼3種,因此不是目標代碼的只能選d。6、詞法分析遵循的是構詞規則,語法分析遵循的是語法規則,中間代碼生成遵循的是語義規則,並且語義規則可以定義一個程序的意義。因此選a。7、b8、c9、d10、c二、多項選擇題1、編譯程序各階段的工作都涉及到。a.語法分析b.表格管理c.出錯處理d.語義分析e.詞法分析2、編譯程序工作時,通常有階段。a.詞法分析b.語法分析c.中間代碼生成d.語義檢查e.目標代碼生成解答1.b、c2.a、b、c、e三、填空題1、解釋程序和編譯程序的區別在於。2、編譯過程通常可分為5個階段,分別是、語法分析、代碼優化和目標代碼生成。3、編譯程序工作過程中,第一段輸入是,最後階段的輸出為程序。4、編譯程序是指將程序翻譯成程序的程序。解答是否生成目標程序2、詞法分析中間代碼生成3、源程序目標代碼生成4、源程序目標語言一、單項選擇題1、文法G:S→xSx|y所識別的語言是。a.xyxb.(xyx)*c.xnyxn(n≥0)d.x*yx*2、文法G描述的語言L(G)是指。a.L(G)={α|S+⇒α,α∈VT*}b.L(G)={α|S*⇒α,α∈VT*}c.L(G)={α|S*⇒α,α∈(VT∪VN*)}d.L(G)={α|S+⇒α,α∈(VT∪VN*)}3、有限狀態自動機能識別。a.上下文無關文法b.上下文有關文法c.正規文法d.短語文法4、設G為算符優先文法,G的任意終結符對a、b有以下關系成立。a.若f(a)>g(b),則a>bb.若f(a)g)(b)或f(a)0}c.{anbmcmdn|n,m≥0}d.{anbncmdm|n,m≥0}e.{anbncndn|n≥0}5、自下而上的語法分析中,應從開始分析。a.句型b.句子c.以單詞為單位的程序d.文法的開始符e.句柄6、對正規文法描述的語言,以下有能力描述它。a.0型文法b.1型文法c.上下文無關文法d.右線性文法e.左線性文法解答1、e、a、c2、a、c、e3、b、c、d4、a、c5、b、c6、a、b、c、d、e三、填空題1、文法中的終結符和非終結符的交集是。詞法分析器交給語法分析器的文法符號一定是,它一定只出現在產生式的部。2、最左推導是指每次都對句型中的非終結符進行擴展。3、在語法分析中,最常見的兩種方法一定是分析法,另一是分析法。4、採用語法分析時,必須消除文法的左遞歸。5、樹代表推導過程,樹代表歸約過程。6、自下而上分析法採用、歸約、錯誤處理、等四種操作。7、Chomsky把文法分為種類型,編譯器構造中採用和文法,它們分別產生和語言,並分別用和自動機識別所產生的語言。解答1、空集終結符右2、最左3、自上而上自下而上4、自上而上5、語法分析6、移進接受7、42型3型上下文無關語言正規語言下推自動機有限四、判斷題1、文法S→aS|bR|ε描述的語言是(a|bc)*()R→cS2、在自下而上的語法分析中,語法樹與分析樹一定相同。()3、二義文法不是上下文無關文法。()4、語法分析時必須先消除文法中的左遞歸。()5、規范歸約和規范推導是互逆的兩個過程。()6、一個文法所有句型的集合形成該文法所能接受的語言。()解答1、對2、錯3、錯4、錯5、錯6、錯五、簡答題1、句柄2、素短語3、語法樹4、歸約5、推導[解答]1、句柄:一個句型的最左直接短語稱為該句型的句柄。2、素短語:至少含有一個終結符的素短語,並且除它自身之外不再含任何更小的素短語。3、語法樹:滿足下面4個條件的樹稱之為文法G[S]的一棵語法樹。①每一終結均有一標記,此標記為VN∪VT中的一個符號;②樹的根結點以文法G[S]的開始符S標記;③若一結點至少有一個直接後繼,則此結點上的標記為VN中的一個符號;④若一個以A為標記的結點有K個直接後繼,且按從左至右的順序,這些結點的標記分別為X1,X2,…,XK,則A→X1,X2,…,XK,必然是G的一個產生式。4、歸約:我們稱αγβ直接歸約出αAβ,僅當A→γ是一個產生式,且α、β∈(VN∪VT)*。歸約過程就是從輸入串開始,反復用產生式右部的符號替換成產生式左部符號,直至文法開始符。5、推導:我們稱αAβ直接推出αγβ,即αAβÞαγβ,僅當A→γ是一個產生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,則我們稱這個序列是從α1至α2的一個推導。若存在一個從α1αn的推導,則稱α1可推導出αn。推導是歸約的逆過程。六、問答題1、給出上下文無關文法的定義。[解答]一個上下文無關文法G是一個四元式(VT,VN,S,P),其中:●VT是一個非空有限集,它的每個元素稱為終結符號;●VN是一個非空有限集,它的每個元素稱為非終結符號,VT∩VN=Φ;●S是一個非終結符號,稱為開始符號;●P是一個產生式集合(有限),每個產生式的形式是P→α,其中,P∈VN,α∈(VT∪VN)*。開始符號S至少必須在某個產生式的左部出現一次。2、文法G[S]:S→aSPQ|abQQP→PQbP→bbbQ→bccQ→cc(1)它是Chomsky哪一型文法?(2)它生成的語言是什麼?[解答](1)由於產生式左部存在終結符號,且所有產生式左部符號的長度均小於等於產生式右部的符號長度,所以文法G[S]是Chomsky1型文法,即上下文有關文法。(2)按產生式出現的順序規定優先順序由高到低(否則無法推出句子),我們可以得到:SÞabQÞabcSÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbccSÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞaaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc……於是得到文法G[S]生成的語言L={anbncn|n≥1}3、按指定類型,給出語言的文法。L={aibj|j>i≥1}的上下文無關文法。【解答】(1)由L={aibj|j>i≥1}知,所求該語言對應的上下文無關文法首先應有S→aSb型產生式,以保證b的個數不少於a的個數;其次,還需有S→Sb或S→bS型的產生式,用以保證b的個數多於a的個數;也即所求上下文無關文法G[S]為:G[S]:S→aSb|Sb|b4、有文法G:S→aAcB|BdA→AaB|cB→bScA|b(1)試求句型aAaBcbbdcc和aAcbBdcc的句柄;(2)寫出句子acabcbbdcc的最左推導過程。【解答】(1)分別畫出對應兩句型的語法樹,如圖2-8-2所示句柄:AaBBd圖2-8-2語法樹(2)句子acabcbbdcc的最左推導如下:SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcAÞacabcbbdcAÞacabcbbdcc5、對於文法G[S]:S→(L)|aS|aL→L,S|S(1)畫出句型(S,(a))的語法樹。(2)寫出上述句型的所有短語、直接短語、句柄和素短語。【解答】(1)句型(S,(a))的語法樹如圖2-8-3所示(2)由圖2-8-3可知:①短語:S、a、(a)、S,(a)、(S,(a));②直接短語:a、S;③句柄:S;④素短語:素短語可由圖2-8-3中相鄰終結符之間的優先關系求得,即;因此素短語為a。6、考慮文法G[T]:T→T*F|FF→F↑P|PP→(T)|i證明T*P↑(T*F)是該文法的一個句型,並指出直接短語和句柄。【解答】首先構造T*P↑(T*F)的語法樹如圖2-8-4所示。由圖2-8-4可知,T*P↑(T*F)是文法G[T]的一個句型。直接短語有兩個,即P和T*F;句柄為P。一、單項選擇題1、詞法分析所依據的是。a.語義規則b.構詞規則c.語法規則d.等價變換規則2、詞法分析器的輸出結果是。a.單詞的種別編碼b.單詞在符號表中的位置c.單詞的種別編碼和自身值d.單詞自身值3、正規式M1和M2等價是指。a.M1和M2的狀態數相等b.M1和M2的有向弧條數相等c.M1和M2所識別的語言集相等d.M1和M2狀態數和有向弧條數相等4、狀態轉換圖(見圖3-6-1)接受的字集為。a.以0開頭的二進制數組成的集合b.以0結尾的二進制數組成的集合c.含奇數個0的二進制數組成的集合d.含偶數個0的二進制數組成的集合5、詞法分析器作為獨立的階段使整個編譯程序結構更加簡潔、明確,因此,。a.詞法分析器應作為獨立的一遍b.詞法分析器作為子程序較好c.詞法分析器分解為多個過程,由語法分析器選擇使用d.詞法分析器並不作為一個獨立的階段解答1、b2、c3、c4、d5、b二、多項選擇題1、在詞法分析中,能識別出。a.基本字b.四元式c.運算符d.逆波蘭式e.常數2、令∑={a,b},則∑上所有以b開頭,後跟若干個ab的字的全體對應的正規式為。a.b(ab)*b.b(ab)+c.(ba)*bd.(ba)+be.b(a|b)解答1、a、c、e2、a、b、d三、填空題1、確定有限自動機DFA是的一個特例。2、若二個正規式所表示的相同,則認為二者是等價的。3、一個字集是正規的,當且僅當它可由所。解答1、NFA2、正規集3、DFA(NFA)所識別四、判斷題1、一個有限狀態自動機中,有且僅有一個唯一終態。()2、設r和s分別是正規式,則有L(r|s)=L(r)|L(s)。()3、自動機M和M′的狀態數不同,則二者必不等價。()4、確定的自動機以及不確定的自動機都能正確地識別正規集。()5、對任意一個右線性文法G,都存在一個NFAM,滿足L(G)=L(M)。()6、對任意一個右線性文法G,都存在一個DFAM,滿足L(G)=L(M)。()7、對任何正規表達式e,都存在一個NFAM,滿足L(G)=L(e)。()8、對任何正規表達式e,都存在一個DFAM,滿足L(G)=L(e)。()解答1、2、3、錯4、5、6、7、8、正確五、基本題1、設M=({x,y},{a,b},f,x,{y})為一非確定的有限自動機,其中f定義如下:f(x,a)={x,y}f(x,b)={y}f(y,a)=φf(y,b)={x,y}試構造相應的確定有限自動機M′。解答:對照自動機的定義M=(S,Σ,f,S0,Z),由f的定義可知f(x,a)、f(y,b)均為多值函數,所以是一非確定有限自動機,先畫出NFAM相應的狀態圖,如圖3-6-2所示。用子集法構造狀態轉換矩陣表3-6-3所示。IIaIb{x}{x,y}{y}{y}—{x,y}{x,y}{x,y}{x,y}將轉換矩陣中的所有子集重新命名而形成表3-6-4所示的狀態轉換矩陣。表3-6-4狀態轉換矩陣ab0211—2222即得到M′=({0,1,2},{a,b},f,0,{1,2}),其狀態轉換圖如圖3-6-5所示。將圖3-6-5的DFAM′最小化。首先,將M′的狀態分成終態組{1,2}與非終態組{0};其次,考察{1,2}。由於{1,2}a={1,2}b={2}⊂{1,2},所以不再將其劃分了,也即整個劃分只有兩組{0},{1,2}:令狀態1代表{1,2},即把原來到達2的弧都導向1,並刪除狀態2。最後,得到如圖3-6-6所示化簡DFAM′。2、對給定正規式b*(d|ad)(b|ab)+,構造其NFAM;解答:首先用A+=AA*改造正規式得:b*(d|ad)(b|ab)(b|ab)*;其次,構造該正規式的NFAM,如圖3-6-7所示。求採納為滿意回答。希望能解決您的問題。
㈥ 什麼是編譯時間
用戶使用編譯程序對其個人編制的源程序進行編譯的過程稱為程序編譯。編譯時間(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三個文件夾),然後運行這個批處理文件就相當於把從更新源碼到編譯源碼這一系列動作都執行了。
㈦ 編譯程序大多數時間花在什麼上
編譯程序大多數時間花在目標代碼生成。
編譯程序把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。編譯程序屬於採用生成性實現途徑實現的翻譯程序。
它以高級程序設計語言書寫的源程序作為輸入,而以匯編語言或機器語言表示的目標程序作為輸出。編譯出的目標程序通常還要經歷運行階段,以便在運行程序的支持下運行,加工初始數據,算出所需的計算結果。
編譯程序的基本功能是把源程序(高級語言)翻譯成目標程序。但是,作為一個具有實際應用價值的編譯系統,除了基本功能之外,還應具備語法檢查、調試措施、修改手段、覆蓋處理、目標程序優化、不同語言合用以及人-機聯系等重要功能。
編譯程序的實現演算法較為復雜。這是因為它所翻譯的語句與目標語言的指令不是一一對應關系,而是一多對應關系;同時也因為它要處理遞歸調用、動態存儲分配、多種數據類型,以及語句間的緊密依賴關系。
但是,由於高級程序設計語言書寫的程序具有易讀、易移植和表達能力強等特點,編譯程序廣泛地用於翻譯規模較大、復雜性較高、且需要高效運行的高級語言書寫的源程序。
㈧ JAVA 高手請進
這個是我原來的筆記整理,送你了!
貌似有點長,刪掉一些無關緊要的
第一課
HelloJava
1、Java開發工具JDK的安裝
2、 JDK的命令工具
JDK的最重要命令行工具:
java: 啟動JVM執行class
javac: Java編譯器
jar: Java打包工具
javadoc: Java文檔生成器
這些命令行必須要非常非常熟悉,對於每個參數都要很精通才行。對於這些命令的學習,JDK Documentation上有詳細的文檔。
二、 JDK Documentation
Documentation在JDK的下載頁面也有下載連接,建議同時下載Documentation。Documentation是最最重要的編程手冊,涵蓋了整個Java所有方面的內容的描述。可以這樣說,學習Java編程,大部分時間都是花在看這個Documentation上面的。我是隨身攜帶的,寫Java代碼的時候,隨時查看,須臾不離手。
四、 Java應用的運行環境
Java Learning Path(三)過程篇
學習Java的第一步是安裝好JDK,寫一個Hello World,? 其實JDK的學習沒有那幺簡單,關於JDK有兩個問題是很容易一直困擾Java程序員的地方:一個是CLASSPATH的問題,其實從原理上來說,是要搞清楚JRE的ClassLoader是如何載入Class的;另一個問題是package和import問題,如何來尋找類的路徑問題。把這兩個問題摸索清楚了,就掃除了學習Java和使用JDK的最大障礙。推薦看一下王森的《Java深度歷險》,對這兩個問題進行了深入的探討。
第二步是學習Java的語法。Java的語法是類C++的,基本上主流的編程語言不是類C,就是類C++的,沒有什幺新東西,所以語法的學習,大概就是半天的時間足夠了。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什幺時候用,為什幺要用,怎幺用,這可能需要有人來指點一下,我當初是完全自己琢磨出來的,花了很久的時間。不過後來我看到《Thinking in Java》這本書上面是講了這些概念的。
第三步是學習Java的面向對象的編程語言的特性的地方。比如繼承,構造器,抽象類,介面,方法的多態,重載,覆蓋,Java的異常處理機制。對於一個沒有面向對象語言背景的人來說,我覺得這個過程需要花很長很長時間,因為學習Java之前沒有C++的經驗,只有C的經驗,我是大概花了一個月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反復的揣摩,修改,嘗試,把那幾章內容反復的看過來,看過去,看了不下5遍,才徹底領悟了。不過我想如果有C++經驗的話,應該一兩天時間足夠了。那幺在這個過程中,可以多看看《Thinking in Java》這本書,對面向對象的講解非常透徹。可惜的是我學習的時候,並沒有看到這本書,所以自己花了大量的時間,通過自己的嘗試和揣摩來學會的。
第四步就是開始熟悉Java的類庫。Java的基礎類庫其實就是JDK安裝目錄下面jrelibrt.jar這個包。學習基礎類庫就是學習rt.jar。基礎類庫裡面的類非常非常多。據說有3000多個,我沒有統計過。但是真正對於我們來說最核心的只有4個,分別是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;
這四個包的學習,每個包的學習都可以寫成一本厚厚的教材,而O'reilly也確實是這樣做的。我覺得如果時間比較緊,是不可能通過讀四本書來學習。我覺得比較好的學習方法是這樣的:
首先要通讀整個package的框架,了解整個package的class,interface,exception的構成,最好是能夠找到介紹整個包框架的文章。這些專門介紹包的書籍的前幾章應該就是這些總體的框架內容介紹。
對包整體框架的把握並不是要熟悉每個類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構成的,這些類的用途是什幺,最核心的幾個類分別是完成什幺功能的。我在給人培訓的時候一般是一次課講一個包,所以不可能詳細的介紹每個類的用法,但是我反復強調,我給你們講這些包的不是要告訴你們類的方法是怎幺調用的,也不要求你們記住類的方法調用,而是要你們了解,Java給我們提供了哪些類,每個類是用在什幺場合,當我遇到問題的時候,我知道哪個類,或者哪幾個類的組合可以解決我的問題,That'all!,當我們具體寫程序的時候,只要你知道該用哪個類來完成你的工作就足夠了。編碼的時候,具體的方法調用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation裡面,不要求你一定記住,實際你也記不住3000多個類的總共將近10萬個方法調用。所以對每個包的總體框架的把握就變得極為重要。
第五步,通過上面的學習,如果學的比較扎實的話,就打好了Java的基礎了,剩下要做的工作是掃清Documentation裡面除了上面4個包之外的其它一些比較有用處的類。相信進展到這一步,Java的自學能力已經被培養出來了,可以到了直接學習Documentation的水平了。除了要做GUI編程之外,JDK裡面其它會有用處的包是這些:
java.text.*;
java.net.*;
javax.naming.*;
這些包裡面真正用的比較多的類其實很少,只有幾個,所以不需要花很多時間。
第六步,Java Web 編程,Web編程的核心是HTTP協議,HTTP協議和Java無關,如果不熟悉HTTP協議的話,雖然也可以學好Servlet/JSP編程,但是達不到舉一反三,一通百通的境界。所以HTTP協議的學習是必備的。如果熟悉了HTTP協議的話,又有了Java編程的良好的基礎,學習Servlet/JSP簡直易如反掌,我學習Servlet/JSP就用了不到一周的時間,然後就開始用JSP來做項目了。
在Servlet/JSP的學習中,重頭仍然是Servlet Documentation。Servlet API最常用的類很少,花比較少的時間就可以掌握了。把這些類都看一遍,多寫幾個例子試試。Servlet/JSP編程本質就是在反復調用這些類來通過HTTP協議在Web Server和Brower之間交談。另外對JSP,還需要熟悉幾個常用JSP的標記,具體的寫法記不住的話,臨時查就是了。
此外Java Web編程學習的重點要放在Web Application的設計模式上,如何進行業務邏輯的分析,並且進行合理的設計,按照MVC設計模式的要求,運用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進行流程的控制和數據的共享,以及Web Application應該如何配置和部署。
第七步,J2EE編程
以上的學習過程如果是比較順利的話,進行到這一步,難度又陡然提高。因為上面的知識內容都是只涉及一個方面,而像EJB,JMS,JTA等核心的J2EE規范往往是幾種Java技術的綜合運用的結晶,所以掌握起來難度比較大。
首先一定要學習好JNDI,JNDI是App Server定位伺服器資源(EJB組件,Datasouce,JMS)查找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學不下去。JNDI其實就是javax.naming.*這個包,運用起來很簡單。難點在於伺服器資源文件的配置。對於伺服器資源文件的配置,就需要看看專門的文檔規范了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的App Server,還有自己的服務資源配置文件,也是需要熟悉的。
然後可以學習JTA,主要是要理解JTA對於事務的控制的方法,以及該在什幺場合使用JTA。這里可以簡單的舉個例子,我們知道一般情況可以對於一個資料庫連接進行事務控制(conn.setAutoCommit(false),....,conn.commit()),做為一個原子操作,但是假設我的業務需求是要把對兩個不同資料庫的操作做為一個原子操作,你能做的到嗎?這時候只能用JTA了。假設操作過程是先往A資料庫插一條記錄,然後刪除B資料庫另一個記錄,我們自己寫代碼是控制不了把整個操作做為一個原子操作的。用JTA的話,由App Server來完成控制。
在學習EJB之前要學習對象序列化和RMI,RMI是EJB的基礎。接著學習JMS和EJB,對於EJB來說,最關鍵是要理解EJB是如何通過RMI來實現對遠端對象的調用的,以及在什幺情況下要用到EJB。
在學習完EJB,JMS這些東西之後,你可能會意識到要急不可待學習兩個領域的知識,一個是UML,另一個是Design Pattern。Java企業軟體的設計非常重視框架(Framework)的設計,一個好的軟體框架是軟體開發成功的必要條件。在這個時候,應該開始把學習的重點放在設計模式和框架的學習上,通過學習和實際的編程經驗來掌握EJB的設計模式和J2EE的核心模式。
J2EE規范裡面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業技術,這里不一一進行介紹了。
另外還有一個最新領域Web Services。Web Services也完全沒有任何新東西,它像是一種粘合劑,可以把不同的服務統一起來提供一個統一的調用介面,作為使用者來說,我只要獲得服務提供者給我的WSDL(對服務的描述),就夠了,我完全不知道伺服器提供者提供的服務究竟是EJB組件,還是.Net組件,還是什幺CORBA組件,還是其它的什幺實現,我也不需要知道。Web Services最偉大的地方就在於通過統一的服務提供方式和調用方式,實現了整個Internet服務的共享,是一個非常令人激動的技術領域。Web Services好象目前還沒有什幺很好的書籍,但是可以通過在網路上面查資料的方式來學習。
所以我覺得其實不是特別需要常式的,自己寫的破壞常式就是最好的例子,如果你實在對自己寫的代碼不放心的話,我強烈推薦你看看JDK基礎類庫的Java源代碼。在JDK安裝目錄下面會有一個src.zip,解開來就可以完整的看到整個JDK基礎類庫,也就是rt.jar的Java源代碼,你可以參考一下Sun是怎幺寫Java程序的,規范是什幺樣子的。我自己在學習Java的類庫的時候,當有些地方理解的不是很清楚的時候,或者想更加清晰的理解運作的細節的時候,往往會打開相應的類的源代碼,通過看源代碼,所有的問題都會一掃而空。
2、Java環境變數配置
1. 預備知識1.1安裝JDK到http://java.sun.com 根據不同的操作系統,下載相應的J2SE JDK 版本 (寫這篇文章時最新的JDK 為1.5 update 7)。假定我們把JDK安裝到D:\JDK\1507 ,不安裝public JRE.
1.2 設置path在[我的電腦]上右擊,選擇[屬性].再選擇[高級]-[環境變數],在[系統變數]中添加一個新的變數JAVA_HOME=D:\JDK\1507,然後再編輯path變數,在原來的path前面添加[ %JAVA_HOME%\BIN; ](方框中的文字)。這樣就完成了JAVA的基本設置。(windows 98 下如何在autoexec.bat 中設置,請自己找資料)
1.3 演示程序
為了幫助理解,我寫了一個JavaBootTest.java 的小程序來顯示。
public class JavaBootTest {
public static void main(String[] args) {
System.out.println(" The Classpath are: ");
System.out.println(System.getProperty("java.class.path"));
//other program lines
}
}
用下面的兩條命令分別編譯和運行。
javac JavaBootTest.java
java JavaBootTest
2. JAVA程序運行時如何查找類文件======================================================================
根據JDK 文檔說明, JAVA 程序以以下3種順序查找運行的類文件。
1.Bootstrap classes (*)
2.Extension classes
3.Users classes
如何設置CLASSPATH,是初學者常提出的問題。網上有很多文章提到了許多如何設置的方法,但是都沒有講為什麼要這樣設置(令人感到悲哀的是:絕大部分的人的觀點是不正確的)。
為了幫助大家更好的學習JAVA的基本知識,同時也是鍛煉自己的Type水平,於是有了這篇文章的誕生。主要參考資料來自來自官方JDK文檔,希望對大家有用(所說的觀點針對1.4.2 and 5.0版本)。
------------------------------------------------------------------------------------------------------------------------------
1. 預備知識1.1安裝JDK到http://java.sun.com 根據不同的操作系統,下載相應的J2SE JDK 版本 (寫這篇文章時最新的JDK 為1.5 update 7)。假定我們把JDK安裝到D:\JDK\1507 ,不安裝public JRE.
1.2 設置path在[我的電腦]上右擊,選擇[屬性].再選擇[高級]-[環境變數],在[系統變數]中添加一個新的變數JAVA_HOME=D:\JDK\1507,然後再編輯path變數,在原來的path前面添加[ %JAVA_HOME%\BIN; ](方框中的文字)。這樣就完成了JAVA的基本設置。(windows 98 下如何在autoexec.bat 中設置,請自己找資料)
1.3 演示程序
為了幫助理解,我寫了一個JavaBootTest.java 的小程序來顯示。
public class JavaBootTest { public static void main(String[] args) { System.out.println(" The Classpath are: ");System.out.println(System.getProperty("java.class.path"));//other program lines }
用下面的兩條命令分別編譯和運行。
javac JavaBootTest.java java JavaBootTest
2. JAVA程序運行時如何查找類文件======================================================================根據JDK 文檔說明, JAVA 程序以以下3種順序查找運行的類文件。
1.Bootstrap classes (*)
2.Extension classes 3.Users classes
2.1 Bootstrap classes就是JAVA在啟動時載入的類文件,這些類文件主要是rt.jar 和 jre/lib 目錄下的一些類文件。Bootstrap過程中的class path是保存在 sun.boot.class.path 系統屬性中的。可以通過System.out.println(System.getProperty("sun.boot.class.path")); 來顯示。同時Bootstrap classes 可以通過 -Xbootclasspath 命令行參數來指定。
下面列出了系統中默認的Bootstrap classes:
<< >>
* Bootstrap bootstrap是皮鞋後部的一條小帶子或一個小環,它可以使你方便地把鞋子穿起來。在計算機中,是指使用一個很小的程序將某個特定的程序(通常是指操作系統)載入計算機中。
2.2 Extension classes (擴展類文件)
Extension classes 主要是指的jre/lib/ext 目錄下的類文件,這些文件必須在jar 文件或 zip 文件中。如果不同名字的jar 文件包含有相同的類文件,那麼哪一個類文件被載入是不確定的。
2.3 User classes (用戶自定義的類文件)
現在到了最重要的地方了,我們常說的設置CLASSPATH 其實就是指定 User classes.JAVA 按照以下四種順序查找User classes. 2.3.1. 默認的User classes . (dot) 就是指當前目錄。
2.3.2. 系統變數 CLASSPATH 所指定的類庫,該變數覆蓋(override)默認的User classes. 2.3.3. 用命令行參數 -cp 或 -classpath指定的類庫。這個時候覆蓋默認的User classes 和CLASSPATH變數。
2.3.4. 通過-jar 參數指定的jar文件。此時覆蓋上面的三種情況,如果使用這種情況,所有的類文件必須來自指定的jar 文件。
了解了java如何查找User classes,我們接下來將要學習如何設置 CLASSPATH變數。
3 如何正確設置CLASSPATH如果只是一般運用java,只是用到java的基本庫文件,練練手而已,則不需要設置CLASSPATH .但是在一般開發情況下,這是很少遇到的。所以我們要自己設置CLASSPATH .我們一般的方法就是按照2.3.2 來設置CLASSPATH 系統變數,像開始設置path一樣,我們可以添加一個CLASSPATH的系統變數。網上有些文章所提到的添加rt.jar 和 tools.jar 等等是不需要的,因為這些類庫是屬於Bootstrap classes的。我們只要定義User classes ,如果我們要編譯servlet 那麼只要servlet-api.jar 和 jsp-api.jar 就可以實現基本的需要了。
另外要注意的是2.3.2 override 2.3.1.我們設置CLASSPATH 時要將 .(dot)[表示當前目錄]放在CLASSPATH中,然後用 ;(semicolon)分隔開來。由於其他提供的類文件都是放在jar文件中,我們設置時一定要將完整的jar 文件包含在CLASSPATH 中,而不是將其目錄添加到CLASSPATH 中(很重要的一點,我以前就是理解錯誤了)。
這個時候又一個問題出現了,當需要添加的jar 文件過多時,管理java 類庫變得很麻煩。所以我認為在基礎學習時用命令行編譯調試,有利於JAVA的學習,但是到開發時則一定要用到 IDE 工具(現在比較流行的是eclipse 和 netbeans ,還有些人喜歡 jcreator) .在eclipse 中通過 [windows][Preferences][Java][Build Path]來指定。其中有兩部分Classpath Variables & User Libraries.如何設置在這里就不詳細說明了,自己試一下就可以了,比較簡單。在新建項目時,把自己定義的變數添加到Build Path 中就可以了。
3、HelloWorld的編寫
Public Welcome
{
Public Static Void main(String[] args)
{
System.out.println("Hello Java");
}
}
4、Javac Java工具的使用
5、HelloJava中存在的問題:(網路轉載)
* 錯誤1:
'javac' 不是內部或外部命令,也不是可運行的程序或批處理文件。
(javac: Command not found)
產生的原因是沒有設置好環境變數path。Win98下在autoexce.bat中加入
path=%path%;c:jdk1.2in,Win2000下則控制面板->系統->高級->環境變數->系統變
量...看到了?雙擊Path,在後面加上c:jdk1.2in。當然我們假設JDK安裝在了
c:jdk1.2目錄下(有點唐僧了?)...好像還要重啟系統才起作用...(//知道了!//西
紅柿)
好,再試試!javac HelloWorld
* 錯誤2:
HelloWorld is an invalid option or argument.
拜託,給點專業精神,java的源程序是一定要存成.java文件的,而且編譯時要寫全
.java呀。
OK, javac HelloWorld.java (這回總該成了吧?)
* 錯誤3:
HelloWorld.java:1: Public class helloworld must be defined in a file called
"HelloWorld.java".
public class helloworld{
^
這個問題嘛,是因為你的類的名字與文件的名字不一致。(誰說的,明明看到人家都有
這樣寫的 ;( ) OK,准確地說,一個Java源程序中可以定義多個類,但是,具有public
屬性的類只能有一個,而且要與文件名相一致。還有,main方法一定要放在這個public
的類之中,這樣才能java(運行)這個類。另外一點是Java語言裡面是嚴格區分大小寫
的,初學者要注意呀。像上例中 helloworld 與 HelloWorld 就認為是不一樣,因而...
oh... 好,改好了,嘻嘻... javac HelloWorld.java
...(咦,怎麼什麼也沒有呀?)//faint 這就是編譯通過了!看看是不是多了一個
HelloWorld.class ?
(hehe..按書上教的:) java HelloWorld (!! 這個我知道,不是java HelloWorld.class
喲)
* 錯誤4:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
呵呵,這個嘛,就是著名的類路徑(classpath)問題啦。實際上,類路徑是在編譯過程就
涉及的Java中的概念。classpath就是指明去哪裡找用到的類,就這么簡單。由於我們的
HelloWorld沒用到其它的(非java.lang包中的)類,所以編譯時沒遇到這個問題。運行
時呢,就要指明你的類在哪裡了。解決方法嘛,可以用下面的命令運行:
java -classpath . HelloWorld
「.」就代表當前目錄。當然這樣做有點麻煩(是「太麻煩」!),我們可以在環境變數
中設置默認的classpath。方法就照上述設置path那樣。將classpath設為:
classpath=.;c:jdk1.2libdt.jar;c:jdk1.2lib ools.jar 後面的兩個建議也設上
,以後開發用的著。
java -classpath . HelloWorld(再不出來我就不學java了)
* 錯誤5:
Exception in thread "main" java.lang.NoSuchMethodError: main
(//咣當)別,堅持住。看看你的代碼,問題出在main方法的定義上,寫對地方了嗎,
是這樣寫的嗎:
public static void main(String args[]) { //一個字都不要差,先別問為什麼了...
對,包括大小寫!
java -classpath . HelloWorld (聽天由命了!)
Hello World!
(faint!終於...)
歡迎來到Java世界!所以說,無法運行HelloWorld 真的並不是一個「最簡單的問題」。
附:HelloWorld.java
// HelloWorld.java
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!") ;
}
}
㈨ iOS開發中可以節省50%編譯等待時間的幾個措施
修改一些源文件。
按下Xcode中的運行程序按鈕。
觀察在phone或者模擬器上的效果(我的例子中使用的是模擬器)。
跳到第一步。在我修改了一個Spotify的iOS客戶端中相對較小的 Objective C 源文件之後,我記錄了一下步驟(2)到步驟(3)花費的時間,直到模擬器載入完應用程序:我的家用iMac(說實話,已經很舊了)花費了82秒(平均值)。通過觀察Xcode的編譯流程我意識到大部分時間花費在「Linking」和「Generating dSYM file」階段。
Linking花費了29秒
生成dSYM 花費了25秒這兩個階段佔用了等待時間的(29 + 25) / 82 * 100 = 62 % 。但是,畢竟,Spotify的iOS客戶端代碼庫是非常大的(鏈接器要把大約2000個目標文件組合起來),花費這么多時間或許也有些道理。然而,並非完全如此……