導航:首頁 > 源碼編譯 > 和代碼優化部分不是每個編譯程序

和代碼優化部分不是每個編譯程序

發布時間:2022-04-28 22:43:56

A. 編譯程序的綜合部分

綜合階段必須根據符號表和中間語言程序產生出目標程序,其主要工作包括代碼優化、存儲分配和代碼生成。代碼優化是通過重排和改變程序中的某些操作,以產生更加有效的目標程序。存儲分配的任務是為程序和數據分配運行時的存儲單元。代碼生成的主要任務是產生與中間語言程序符等價的目標程序,順序加工中間語言程序,並利用符號表和常數表中的信息生成一系列的匯編語言或機器語言指令。 編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。例如,可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。例如,代碼優化可劃分為代碼優化准備工作和實際代碼優化兩遍進行。
一個編譯程序是否分遍,以及如何分遍,根據具體情況而定。其判別標准可以是存儲容量的大小、源語言的繁簡、解題范圍的寬窄,以及設計、編制人員的多少等。分遍的好處是各遍功能獨立單純、相互聯系簡單、邏輯結構清晰、優化准備工作充分。缺點是各遍之中不可避免地要有些重復的部分,而且遍和遍之間要有交接工作,因之增加了編譯程序的長度和編譯時間。
一遍編譯程序是一種極端情況,整個編譯程序同時駐留在內存,彼此之間採用調用轉接方式連接在一起(圖2)。當語法分析程序需要新符號時,它就調用詞法分析程序;當它識別出某一語法結構時,它就調用語義分析程序。語義分析程序對識別出的結構進行語義檢查,並調用「存儲分配」和「代碼生成」程序生成相應的目標語言指令。
隨著程序設計語言在形式化、結構化、直觀化和智能化等方面的發展,作為實現相應語言功能的編譯程序,也正向自動程序設計的目標發展,以便提供理想的程序設計工具。
參考書目
陳火旺、錢家驊、孫永強編:《編譯原理》,國防工業出版社,北京,1980。
A.V.Aho, Principles of Compiler Design,Addison Wes-ley, Reading, Massachusetts, 1977. 20世紀80年代以後,程序設計語言在形式化、結構化、直觀化和智能化等方面有了長足的進步和發展,主要表現在兩個方面:①隨著程序設計理論和方法的發展,相繼推出了一系列新型程序設計語言,如結構化程序設計語言、並發程序設計語言、分布式程序設計語言、函數式程序設計語言、智能化程序設計語言、面向對象程序設計語言等;②基於語法、語義和語用方面的研究成果,從不同的角度和層次上深刻地揭示了程序設計語言的內在規律和外在表現形式。與此相應地,作為實現程序設計語言重要手段之一的編譯程序,在體系結構、設計思想、實現技術和處理內容等方面均有不同程度的發展、變化和擴充。另外,編譯程序已作為實現編程的重要軟體工具,被納入到軟體支援環境的基本層軟體工具之中。因此,規劃編譯程序實現方案時,應從所處的具體軟體支援環境出發,既要遵循整個環境的全局性要求和規定,又要精心考慮與其他諸層軟體 工具之間的相互支援、配合和銜接關系。

B. 編譯程序是什麼意思編譯是什麼意思

編譯程序(Compiler,compiling program)也稱為編譯器,是指把用高級程序設計語言書寫的源程序,翻譯成等價的機器語言格式目標程序的翻譯程序。

解釋程序是一種語言處理程序,在詞法、語法和語義分析方面與編譯程序的工作原理基本相同,但在運行用戶程序時,它直接執行源程序或源程序的內部形式(中間代碼)。

(2)和代碼優化部分不是每個編譯程序擴展閱讀:

結構:

編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。

編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。

可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。

C. C語言文件的編譯與執行的四個階段並分別描述

開發C程序有四個步驟:編輯、編譯、連接和運行。

任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。

1、預處理:導入源程序並保存(C文件)。

2、編譯:將源程序轉換為目標文件(Obj文件)。

3、鏈接:將目標文件生成為可執行文件(EXE文件)。

4、運行:執行,獲取運行結果的EXE文件。

(3)和代碼優化部分不是每個編譯程序擴展閱讀:

將C語言代碼分為程序的幾個階段:

1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。

2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。

3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。

4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。

D. 編譯程序有哪些主要構成成分它們各自的主要功能是什麼

編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。

編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。

例如,可以把詞法分析作為第一遍;語法分析和語義分析作為第二遍;代碼優化和存儲分配作為第三遍;代碼生成作為第四遍。

反之,為了適應較小的存儲空間或提高目標程序質量,也可以把一個邏輯步驟的工作分為幾遍去執行。例如,代碼優化可劃分為代碼優化准備工作和實際代碼優化兩遍進行。

(4)和代碼優化部分不是每個編譯程序擴展閱讀

從左至右逐個字元地對源程序進行掃描,產生一個個的單詞符號,把作為字元串的源程序改造成為單詞符號串的中間程序。執行詞法分析的程序稱為詞法分析程序或掃描器。

源程序中的單詞符號經掃描器分析,一般產生二元式:單詞種別;單詞自身的值。單詞種別通常用整數編碼,如果一個種別只含一個單詞符號,那麼對這個單詞符號,種別編碼就完全代表它自身的值了。若一個種別含有許多個單詞符號,那麼,對於它的每個單詞符號,除了給出種別編碼以外,還應給出自身的值。

詞法分析器一般來說有兩種方法構造:手工構造和自動生成。手工構造可使用狀態圖進行工作,自動生成使用確定的有限自動機來實現。

編譯程序的語法分析器以單詞符號作為輸入,分析單詞符號串是否形成符合語法規則的語法單位,如表達式、賦值、循環等,最後看是否構成一個符合要求的程序,按該語言使用的語法規則分析檢查每條語句是否有正確的邏輯結構,程序是最終的一個語法單位。編譯程序的語法規則可用上下文無關文法來刻畫。

E. 一個典型的編譯程序通常由哪些部分組成各部分的主要功能是什麼

通常由七個部分組成。分別是:詞法分析、語法分析、語義分析和中間代碼生成、優化、目標代碼生成以及表格和表格管理、出錯處理。
各自功能是:
1.詞法分析:輸入源程序,對構成源程序的字元串進行掃描和分解,識別出一個個單詞(也稱單詞符號,或簡稱符號)。在詞法分析階段工作所依循的是語言的詞法規則;描述詞法規則的有效工具是正規式和有限自動機。
2.語法分析:在詞法分析的基礎上,根據語言的語法規則,把單詞符號串組成各類語法單位。具體的說,語法分析是在單詞流的基礎上建立一個層次結構——建立語法樹。
3.語義分析和中間代碼生成:語義分析利用語法分析階段確定的層次結構來識別表達式和語句中的操作信息及類型信息;中間代碼生成階段將產生的源程序的一個顯式中間表示,這種中間表示可以看成是某種抽象程序,通常是與平台無關的,(可用三地址碼和四元式表示)。
4.優化:試圖改進中間代碼,以產生執行速度較快的機器代碼。
5.目標代碼生成:生成可重定位的機器代碼或匯編代碼。
6.表格和表格管理:編譯程序在工作過程中需要保持一系列的表格,以登記源程序的各類信息和編譯各階段的進展情況。
7.出錯處理:編譯程序對源程序中的錯誤進行處理,應最大限度地發現源程序中的各種錯誤,准確地指出錯誤的性質和發生錯誤的地點,並且將錯誤所造成的影響限制在盡可能小的范圍內,使得源程序的其餘部分能繼續被編譯下去,以便進一步發現其他可能的錯誤。通常編譯過程中每個階段都可能檢測出錯誤,其中,絕大多數數錯誤可以在編譯的前三階段檢測出來。且源程序中的錯誤通常分為語法錯誤和語義錯誤兩大類。出錯處理就是為了處理以上的錯誤情況。

F. 如何優化你的C代碼

一、程序結構的優化
1、程序的書寫結構
雖然書寫格式並不會影響生成的代碼質量,但是在實際編寫程序時還是應該尊循一定的書寫規則,一個書寫清晰、明了的程序,有利於以後的維護。在書寫程序時,特別是對於While、for、do…while、if…elst、switch…case等語句或這些語句嵌套組合時,應採用「縮格」的書寫形式,

2、標識符
程序中使用的用戶標識符除要遵循標識符的命名規則以外,一般不要用代數符號(如a、b、x1、y1)作為變數名,應選取具有相關含義的英文單詞(或縮寫)或漢語拼音作為標識符,以增加程序的可讀性,如:count、number1、red、work等。

3、程序結構
C語言是一種高級程序設計語言,提供了十分完備的規范化流程式控制制結構。因此在採用C語言設計單片機應用系統程序時,首先要注意盡可能採用結構化的程序設計方法,這樣可使整個應用系統程序結構清晰,便於調試和維護。於一個較大的應用程序,通常將整個程序按功能分成若干個模塊,不同模塊完成不同的功能。各個模塊可以分別編寫,甚至還可以由不同的程序員編寫,一般單個模塊完成的功能較為簡單,設計和調試也相對容易一些。在C語言中,一個函數就可以認為是一個模塊。所謂程序模塊化,不僅是要將整個程序劃分成若干個功能模塊,更重要的是,還應該注意保持各個模塊之間變數的相對獨立性,即保持模塊的獨立性,盡量少使用全局變數等。對於一些常用的功能模塊,還可以封裝為一個應用程序庫,以便需要時可以直接調用。但是在使用模塊化時,如果將模塊分成太細太小,又會導致程序的執行效率變低(進入和退出一個函數時保護和恢復寄存器佔用了一些時間)。

4、定義常數
在程序化設計過程中,對於經常使用的一些常數,如果將它直接寫到程序中去,一旦常數的數值發生變化,就必須逐個找出程序中所有的常數,並逐一進行修改,這樣必然會降低程序的可維護性。因此,應盡量當採用預處理命令方式來定義常數,而且還可以避免輸入錯誤。

5、減少判斷語句
能夠使用條件編譯(ifdef)的地方就使用條件編譯而不使用if語句,有利於減少編譯生成的代碼的長度,能夠不用判斷語句則少用判斷用語句。

6、表達式
對於一個表達式中各種運算執行的優先順序不太明確或容易混淆的地方,應當採用圓括弧明確指定它們的優先順序。一個表達式通常不能寫得太復雜,如果表達式太復雜,時間久了以後,自己也不容易看得懂,不利於以後的維護。

7、函數
對於程序中的函數,在使用之前,應對函數的類型進行說明,對函數類型的說明必須保證它與原來定義的函數類型一致,對於沒有參數和沒有返回值類型的函數應加上「void」說明。如果果需要縮短代碼的長度,可以將程序中一些公共的程序段定義為函數,在Keil中的高級別優化就是這樣的。如果需要縮短程序的執行時間,在程序調試結束後,將部分函數用宏定義來代替。注意,應該在程序調試結束後再定義宏,因為大多數編譯系統在宏展開之後才會報錯,這樣會增加排錯的難度。

8、盡量少用全局變數,多用局部變數。
因為全局變數是放在數據存儲器中,定義一個全局變數,MCU就少一個可以利用的數據存儲器空間,如果定義了太多的全局變數,會導致編譯器無足夠的內存可以分配。而局部變數大多定位於MCU內部的寄存器中,在絕大多數MCU中,使用寄存器操作速度比數據存儲器快,指令也更多更靈活,有利於生成質量更高的代碼,而且局部變數所的佔用的寄存器和數據存儲器在不同的模塊中可以重復利用。

9、設定合適的編譯程序選項
許多編譯程序有幾種不同的優化選項,在使用前應理解各優化選項的含義,然後選用最合適的一種優化方式。通常情況下一旦選用最高級優化,編譯程序會近乎病態地追求代碼優化,可能會影響程序的正確性,導致程序運行出錯。因此應熟悉所使用的編譯器,應知道哪些參數在優化時會受到影響,哪些參數不會受到影響。
在ICCAVR中,有「Default」和「Enable Code Compression」兩個優化選項。
在CodeVisionAVR中,「Tiny」和「small」兩種內存模式。
在IAR中,共有7種不同的內存模式選項。
在GCCAVR中優化選項更多,一不小心更容易選到不恰當的選項。

二、代碼的優化
1、選擇合適的演算法和數據結構
應該熟悉演算法語言,知道各種演算法的優缺點,具體資料請參見相應的參考資料,有很多計算機書籍上都有介紹。將比較慢的順序查找法用較快的二分查找或亂序查找法代替,插入排序或冒泡排序法用快速排序、合並排序或根排序代替,都可以大大提高程序執行的效率。.選擇一種合適的數據結構也很重要,比如你在一堆隨機存放的數中使用了大量的插入和刪除指令,那使用鏈表要快得多。
數組與指針語句具有十分密碼的關系,一般來說,指針比較靈活簡潔,而數組則比較直觀,容易理解。對於大部分的編譯器,使用指針比使用數組生成的代碼更短,執行效率更高。但是在Keil中則相反,使用數組比使用的指針生成的代碼更短。。

3、使用盡量小的數據類型
能夠使用字元型(char)定義的變數,就不要使用整型(int)變數來定義;能夠使用整型變數定義的變數就不要用長整型(long int),能不使用浮點型(float)變數就不要使用浮點型變數。當然,在定義變數後不要超過變數的作用范圍,如果超過變數的范圍賦值,C編譯器並不報錯,但程序運行結果卻錯了,而且這樣的錯誤很難發現。
在ICCAVR中,可以在Options中設定使用printf參數,盡量使用基本型參數(%c、%d、%x、%X、%u和%s格式說明符),少用長整型參數(%ld、%lu、%lx和%lX格式說明符),至於浮點型的參數(%f)則盡量不要使用,其它C編譯器也一樣。在其它條件不變的情況下,使用%f參數,會使生成的代碼的數量增加很多,執行速度降低。

4、使用自加、自減指令
通常使用自加、自減指令和復合賦值表達式(如a-=1及a+=1等)都能夠生成高質量的程序代碼,編譯器通常都能夠生成inc和dec之類的指令,而使用a=a+1或a=a-1之類的指令,有很多C編譯器都會生成二到三個位元組的指令。在AVR單片適用的ICCAVR、GCCAVR、IAR等C編譯器以上幾種書寫方式生成的代碼是一樣的,也能夠生成高質量的inc和dec之類的的代碼。

5、減少運算的強度
可以使用運算量小但功能相同的表達式替換原來復雜的的表達式。如下:

(1)、求余運算。
a=a%8;
可以改為:
a=a&7;
說明:位操作只需一個指令周期即可完成,而大部分的C編譯器的「%」運算均是調用子程序來完成,代碼長、執行速度慢。通常,只要求是求2n方的余數,均可使用位操作的方法來代替。

(2)、平方運算
a=pow(a,2.0);
可以改為:
a=a*a;
說明:在有內置硬體乘法器的單片機中(如51系列),乘法運算比求平方運算快得多,因為浮點數的求平方是通過調用子程序來實現的,在自帶硬體乘法器的AVR單片機中,如ATMega163中,乘法運算只需2個時鍾周期就可以完成。既使是在沒有內置硬體乘法器的AVR單片機中,乘法運算的子程序比平方運算的子程序代碼短,執行速度快。

如果是求3次方,如:
a=pow(a,3.0);
更改為:
a=a*a*a;
則效率的改善更明顯。

(3)、用移位實現乘除法運算
a=a*4;
b=b/4;
可以改為:
a=a<<2;
b=b>>2;
說明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR中,如果乘以2n,都可以生成左移的代碼,而乘以其它的整數或除以任何數,均調用乘除法子程序。用移位的方法得到代碼比調用乘除法子程序生成的代碼效率高。實際上,只要是乘以或除以一個整數,均可以用移位的方法得到結果,如:
a=a*9
可以改為:
a=(a<<3)+a

6、循環
(1)、循環語
對於一些不需要循環變數參加運算的任務可以把它們放到循環外面,這里的任務包括表達式、函數的調用、指針運算、數組訪問等,應該將沒有必要執行多次的操作全部集合在一起,放到一個init的初始化程序中進行。

(2)、延時函數:
通常使用的延時函數均採用自加的形式:
void delay (void)
{
unsigned int i;
for (i=0;i<1000;i++)
;
}
將其改為自減延時函數:
void delay (void)
{
unsigned int i;
for (i=1000;i>0;i--)
;
}
兩個函數的延時效果相似,但幾乎所有的C編譯對後一種函數生成的代碼均比前一種代碼少1~3個位元組,因為幾乎所有的MCU均有為0轉移的指令,採用後一種方式能夠生成這類指令。
在使用while循環時也一樣,使用自減指令控制循環會比使用自加指令控制循環生成的代碼更少1~3個字母。
但是在循環中有通過循環變數「i」讀寫數組的指令時,使用預減循環時有可能使數組超界,要引起注意。

(3)while循環和do…while循環
用while循環時有以下兩種循環形式:
unsigned int i;
i=0;
while (i<1000)
{
i++;
//用戶程序
}
或:
unsigned int i;
i=1000;
do
i--;
//用戶程序
while (i>0);
在這兩種循環中,使用do…while循環編譯後生成的代碼的長度短於while循環。

7、查表
在程序中一般不進行非常復雜的運算,如浮點數的乘除及開方等,以及一些復雜的數學模型的插補運算,對這些即消耗時間又消費資源的運算,應盡量使用查表的方式,並且將數據表置於程序存儲區。如果直接生成所需的表比較困難,也盡量在啟動時先計算,然後在數據存儲器中生成所需的表,後以在程序運行直接查表就可以了,減少了程序執行過程中重復計算的工作量。

G. 簡單描述編譯的幾個處理步驟

編譯過程分為分析和綜合兩個部分,並進一步劃分為詞法分析、語法分析、語義分析、代碼優化、存儲分配和代碼生成等六個相繼的邏輯步驟。這六個步驟只表示編譯程序各部分之間的邏輯聯系,而不是時間關系。

編譯過程既可以按照這六個邏輯步驟順序地執行,也可以按照平行互鎖方式去執行。在確定編譯程序的具體結構時,常常分若干遍實現。對於源程序或中間語言程序,從頭到尾掃視一次並實現所規定的工作稱作一遍。每一遍可以完成一個或相連幾個邏輯步驟的工作。

(7)和代碼優化部分不是每個編譯程序擴展閱讀:

對於c編譯程序來說,其語言的特點如下:

1、c語言是一種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護,而且表現能力和處理能力極強。

2、c語言具有豐富的運算符和數據類型,便於實現各類復雜的數據結構。它還可以直接訪問內存的物理地址,進行位(bit)一級的操作。

3、由於c語言實現了對硬體的編程操作,因此集高級語言和低級語言的功能於一體。它既可用於系統軟體的開發,也適合於應用軟體的開發。

4、此外,c語言還具有效率高、可移植性強等特點。因此它廣泛地移植到了各類各型計算機上,從而形成了多種版本。

H. 一個編譯器至少包含三個部分的進程是什麼

一個典型的編譯程序通常包含8個組成部分,它們是詞法分析程序、語法分析程序、語義分析程序、中間代碼生成程序、中間代碼優化程序、目標代碼生成程序、表格管理程序和錯誤處理程序。
(1) 編譯程序:如果源語言為高級語言,目標語言為某台計算機上的匯編語言或機器語

言,則此翻譯程序稱為編譯程序。

(2) 源程序:源語言編寫的程序稱為源程序。

(3) 目標程序:目標語言書寫的程序稱為目標程序。

(4) 編譯程序的前端:它由這樣一些階段組成:這些階段的工作主要依賴於源語言而與

目標機無關。通常前端包括詞法分析、語法分析、語義分析和中間代碼生成這些階

段,某些優化工作也可在前端做,也包括與前端每個階段相關的出錯處理工作和符

號表管理等工作。

(5) 後端:指那些依賴於目標機而一般不依賴源語言,只與中間代碼有關的那些階段,

即目標代碼生成,以及相關出錯處理和符號表操作。

(6) 遍:是對源程序或其等價的中間語言程序從頭到尾掃視並完成規定任務的過程。

詞法分析程序:輸人源程序,拼單詞、檢查單詞和分析單詞,輸出單詞的機內表達形式。

語法分析程序:檢查源程序中存在的形式語法錯誤,輸出錯誤處理信息。

語義分析程序:進行語義檢查和分析語義信息,並把分析的結果保存到各類語義信息表中。

中間代碼生成程序:按照語義規則,將語法分析程序分析出的語法單位轉換成一定形式的中間語言代碼,如三元式或四元式。

中間代碼優化程序:為了產生高質量的目標代碼,對中間代碼進行等價變換處理

閱讀全文

與和代碼優化部分不是每個編譯程序相關的資料

熱點內容
單片機編程存表法 瀏覽:719
富士康伺服器是什麼 瀏覽:452
編譯是二進制嗎 瀏覽:262
小程序賬號登錄源碼 瀏覽:876
雲南社保局app叫什麼 瀏覽:693
美女程序員吃大餐 瀏覽:208
項目二級文件夾建立規則 瀏覽:558
dns使用加密措施嗎 瀏覽:172
php獨立運行 瀏覽:531
手機sh執行命令 瀏覽:729
雲伺服器的角色 瀏覽:735
單片機頻率比例 瀏覽:843
我的世界伺服器如何關閉正版驗證 瀏覽:506
如何查roid伺服器上的 瀏覽:132
安卓手機主板如何撬晶元不掉電 瀏覽:251
php各個框架的優缺點 瀏覽:103
php1100生成數組 瀏覽:361
以後做平面設計好還是程序員好 瀏覽:554
雲伺服器應用管理 瀏覽:440
飢荒雲伺服器搭建過程 瀏覽:188