編譯原理開發作業
1. 編譯原理作業求助
單選
1. C
2. C
3. D
4. A
判斷
5. 對
6. 錯
7. 錯
8. 錯
9. 對
10. 錯
2. C/C++ 的預編譯原理是什麼為什麼要用預編譯
為了防止程序在實際應用當中出現錯誤
他們太重要了,
(1)數據結構:首先要明白---->程序=演算法+數據
「數據結構」就是做數據這塊的,例如一個「電影播放器」程序,首先要有「電影」嗎,這個就是「數據」,那麼就要用「數據結構」的知識,怎麼存儲每一幀,怎麼高效,怎麼能無損,怎麼空間最節省.........,然後才是怎麼去「解碼」(解碼就是「演算法」做的啦),當然這么講起來不是很嚴謹,但你可以看得出,數據結構可以說的上是有50%的重要性了。
(2)編譯原理:不要以為,自己不去開發「語言」,編譯原理就沒有用啦,它能讓你從根本上理解編譯器,這對怎麼提高程序的效率,怎麼變出漂亮的程序很有用................當然貌似如果從事,「人工智慧」這一塊的話,編譯原理也非常重要。
(3)資料庫:又是剛才哪一點----------->程序=演算法+數據
數據以文件的形式存儲,是在不是很高效,所以,為了方便數據的管理與查找等等..........人類作出了「資料庫」,說白了,它就是用來解決「數據」這部分內容的,現在基本無論你做什麼都離不開資料庫了,從大型網游到網站,到手機等的移動設備編程,都要用到資料庫
--------------------------------------------------------------------------------------------------
從你的體溫來看,你可能剛剛接觸編程,沒有做過什麼成品,隨著你越來越了解這個領域,你會剛到這些東西非常重要,當然還有很多東西,與以上三者地位相當,或更高,例如,微型計算機組成原理,等一些硬體方面的知識.......................................
---------------------------------------------------------------------------------------------------
還是「廣泛閱讀」吧。
4. 學習編譯原理對從事應用軟體開發有何啟發
學習編譯原理和操作系統對編程能力對編程能力的作用在於:
1、學好了編譯原理,才可能編寫出高效,穩健,佔用內存少的程序。
2、學習操作系統對windows相關的編程很有幫助。如果是對操作系統關系不大的C/C++/c#,java之類的編程,關系不大。
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。雖然只有少數人從事編譯方面的工作,但是這門課在理論、技術、方法上都對學生提供了系統而有效的訓練,有利於提高軟體人員的素質和能力。
操作系統(Operating System,簡稱OS)是管理和控制計算機硬體與軟體資源的計算機程序,是直接運行在「裸機」上的最基本的系統軟體,任何其他軟體都必須在操作系統的支持下才能運行。
5. 想用Java做編譯系統的大作業,這個難嗎誰能幫助一下 ,給我一些關於這個方面的資料!!
難於上青天啊,這個不是你懂java就可以做的。需要的知識非常多,具體的我也不清楚,你可以想一想,這個很java的底層打交道啊。能做出編譯系統的都是程序員中的牛人,如果你對這個感興趣,你可以看一看《編譯原理》類型的書籍。很高深,我覺得很難!
6. 計算機工程畢業論文精選範文
近年來,隨著全球網際網路技術的普及、計算機技術的迅猛發展、數字技術的瞬息萬變,計算機工程在人們生活、生產中的應用越來越廣泛。下面是我為大家整理的計算機工程畢業論文,供大家參考。
計算機工程畢業論文範文一:計算機軟體工程銀啟扒專案管理思考計算機軟體大體分為三類,一種是總述,一種是系統軟體,一種是應用軟體,系統軟體的作用是促使各個硬旁橘體按照一定的規律協調工作,保證計算機處於正常運轉狀態。而應用軟體的作用則是為了實現某種使用願望而開發出來的軟體。
1計算機軟體工程專案管理的基本概念
1.1工程專案管理的含義工程專案管理主要是業主通過委託從事工程專案管理的企業,簽署相關協議,工程專案管理企業有義務和權力代表業主在工程專案進行的情況卜干預和服務。工程專案管理企業可以協助業主同項目工程總承包簽訂一系列鋒昌合同,只是起到輔助性作用,不直接與總承包企業或者施工、勘察、供貨和設計簽署協議或合同,工程專案管理企業有責任在施工過程中監督合同的完成情況。
1.2軟體工程專案的概況
1.2.1管理人員開展有序的專案計劃
企業必須把人員管理放在重要位置,在軟體工程專案的開發上人員的調配問題是保證工程順利進行的重要因素,因此,專案能否成功和工作人員的工作能力、寫作能力息息相關,針對工程專案的操作類別不同,可以分配成各個研究小組,進行科學合理的針對性開發和高效的協作,有利於工程的快速推進和更加完善。小組內的人員根據自身優勢,確定自己的工作內容和工作時間。對專案進行正確的認識和對風險進行評估,與此同時從節約成木的方而出發,形成科學的人力資源調配機制,使專案得以順利開展。
1.2.2質量和配置管理工作
軟體的質量管理工作是整個專案的核心工作,質量管理決定著計算機軟體工程專案管理是否真正的成功,通過一系列保證質量的手段,有計劃的編制、控制和保證專案質量。保證專案質量的方式可以通過定期的進行質量評估得以實現,在日常專案管理中要不斷的對工作進行考查,對於專案不合格的地方要提出意見並且考慮整改措施,不斷完善整個軟體配置管理的記錄工作,使專案的質量能有一定的檢測體系,這樣開發者會對專案工程的質量問題有比較深入的了解。
1.2.3風險評估和管理工作
風險管理大致分為兩種工作,一種是風險識別,另一種是風險評估。得到評估結果以後要針對問題提出相應的解決辦法,定期檢測計算機軟體工程的好處是可以減小產生風險的概率,還可以避免一些因疏忽而產生風險,使專案的損失減少到最低,也減少了因專案風險而造成的一些相關責任人的利益沖突。
2計算機軟體工程專案管理中存在的問題
2.1管理團隊的協作問題
分工合作是我們完成一個專案的基木因素,在軟體開發方而更需要每個人的智慧一起凝聚出果實,共同享受成果,而目前在計算機軟體工程專案管理方而資訊的交流方而存在一些問題,例如分工不清、團隊不合作等問題。
2.2需求分析和實際中的業務存在差距問題
計算機軟體工程專案沒有結合實際的活動需求,也沒有調查有效的資料分析,因此計算機軟體工程專案管理在開發出新的產品以後並沒有取得理想的業務效果。
2.3風險管理的問題
專案的風險工作是企業需要考慮的很重要的問題,如果風險沒有相應科學管理,很容易帶來巨大的損失,但是很多員工並不懂得如何規避風險,缺乏相應的專業知識,更是缺少對風險工作的管理,導致很多企業在風險來臨時無法做出正確行動,造成巨大的經濟損失。
3計算機軟體工程專案管理的對策
3.1對風險管理和工作進度進行有效管理
制定風險管理制度。計算機軟體工程專案管理的工作人員必須具有一定的風險識別意識和相應的遇到風險的專業知識,並且能有效的控制風險的能力。在平時要做好風險評估的管理報告,針對可能發生的風險要及時預測並且做出相應的解決行動。設定專門的人員對計算機軟體工程專案定期進行風險的評估和檢查工作。在整個專案中,根據需要進行多次的風險管理工作,因為風險無時無刻都有可能存在,檢查的目的是盡量減少風險發生,在一般情況卜處理風險的措施一般有三種:減緩、規避和轉移。提高工程的進度,不斷的推進工程的工作效率。要制定詳細的工作計劃表,並且盡可能達到最高的工作目標。工作人員有嚴謹的工作態度和高效的作息時間安排,管理人員要密切關注工程進度,不斷的督促員工完成應做的工作量,有條理、高效的完成對員工的工作任務的監督工作。
3.2建立完善的管理體系針對計算機軟體工程的人員日常管理工作,要建立科學有效的管理方案。合理安排人才資源,確保在進行計算機軟體專案工程時人員調配順利進行。專業知識的培訓對於工作人員來說
是必不可少的,可以極大的豐富計算機軟體工程專案人員的專業水平和實踐能力,減少工作上的失誤,提高工作效率和工作人員的素質。獎罰制度是對企業員工優劣的衡量標准,所以在計算機軟體工程專案管理方而採取獎罰制度可以極大程度上調動員工的積極性,使員工主動為企業創造效益,企業的發展才能有長遠的未來。
3.3建立合作的團隊
在員工內部建立有效的交流機制。員工的內部工作經驗交流是非常重要的,因此要完善溝通方法,開辟多種交流方式和渠道,不斷的增強各個部門的溝通意識,使團隊的力量不斷凝聚起來。明確分工,責任落實到個人。計算機軟體工程管理非常復雜,需要的人員也眾多,因此必須要使每個員工明確自己的工作內容和范圍,清晰的劃分自己所需要負責的區域,清楚自己的責任,這樣能夠確保每一個步驟都井井有條,非常有秩序。調動整個團隊的工作積極性。通過一些活動、獎勵措施等使每一個工作人員全身心的投入到工作中去,願意並想要去做的更好,不斷激發團隊的潛力和員工的協作能力,這樣專案不僅會做的越來越好,員工內部也會越來越和諧並且充滿正能量,企業的效益也會不斷得到提升。
4結語
計算機軟體工程專案管理的工作內容十分的復雜,要保證軟體工程按照工程原計劃進度順利開展工作,並且要節約成木、保證質量,必須熟練對計算機軟體進行操作,在現在的大多數生產計算機軟體的企業中最為重要的就是軟體工程專案的管理效率,軟體工程專案的成功條件是軟體專案要具有科學性和高效性,在此基礎上企業的合理管理也是企業走向成功的關鍵。
計算機工程畢業論文範文二:計算機工程能力教學思索1現狀分析
培養高質量的軟體開發人才一直是社會和行業關注的焦點。早在11年前,對於工程教育的迫切性就被人提出來[1]。工程教育本身也作為一個系統問題被討論[2]。現在從國家層面在戰略上建立了軟體學院進行專門培養,各個高校也不斷推出新的課程、新的措施方案。在這一領域雖然比過去似乎已經有了翻天覆地的變化,但來自企業的呼籲似乎一直反映出諸多不盡如人意。更多的思路希望將企業的力量直接引入到教學,比如實訓基地等[3];而國家層面也非常關注實訓[4]。但實際效果可能變得流於表面,因為企業往往難以將核心的工作拿給學生做,而其訓練的專案也並未從更全面系統的角度去設計,其鍛煉效果就有限了。在軟體開發這一領域,由於其具有變化迅速,新技術不斷涌現的特點,導致不少在教育內容上選擇了追逐新技術、新語言、新平台,以能用會用這些流行主流技術為目標。典型的代表就是北大青鳥,有些二本的學生在畢業前專門花錢去青鳥學習,似乎可以看到這種教育的優勢。但另一個矛盾的情況是,往往那些關注員工後勁的公司卻不願意招聘青鳥的學生。如果將目光投向國外的頂級大學,例如斯坦福,其教學上並沒有去「依賴」校企合作,以及很熱門的「實訓」。其核心課程依然是過去的傳統經典課程。以一個研究生為例,一學期能修2門課是正常,3門就很優秀。它並沒有追逐所謂的新技術。但無人質疑其學生的工程能力、科研能力和創造能力。
2什麼是計算機工程能力的核心
什麼才是我們軟體開發教育的核心知識架構,怎樣才能培養學生可持續發展的核心競爭力?我們調查過一些非常高水準的軟體開發者,發現他們往往在底層軟體上持之以恆地進行長時間深刻的鍛煉,然後在未接觸的新領域才能非常迅速地掌握核心。例如,一個非計算機專業的系統分析員曾經「只」在DOS這種原始的作業系統下玩了10年,甚至自己寫過一個漢化的DOS。他只有書本上的一點點網路知識時,就用一兩天時間解決了一個學通訊的研究生1個月都不能解決的網路故障。這是一個典型的例子,他並沒有「實際的」網路經驗,什麼使得他如此輕松地進入了新的領域呢?而另一個曾就職於vmware、google等頂級公司的程式設計師,在Unix下只用C語言做了10年系統級程式設計。當用Java,C++甚至是javascript時,其學習時間只是1天,很快就比做了幾年專門java程式設計的程式設計師還精通。如何才是軟體開發人員的本質力量?什麼才能讓他們在變化萬千的新技術面前屹立不倒,乘風破浪?
2.1計算機工程能力
我們認為計算機工程能力包含兩方面的內容:1核心知識架構;2計算機的思維方式。什麼是核心知識架構呢?是反應該領域最基本規律和支撐技術的知識。簡單地說就是傳統的作業系統、編譯、資料庫。作業系統將硬體、軟體、高階語言和匯編融匯在一起,它幾乎包括了軟體工程中所有重要的因素。舉一個簡單的例子,似乎只有面向物件這種「高階東西」才有的虛擬函式運用,其實在linux中就有相應的虛檔案系統。作業系統是最為復雜的計算機工程之一。編譯融匯了大量的演演算法,而且能讓大家真正看「穿」語言的外表,深入到其內里,體現了最根本的計算機技術。其優化技術,也深刻地和硬體交融在一起,很好體現了底層風范。資料庫,不僅是運用演演算法最多的地方,甚至是超越作業系統的一個復雜的系統,從快取技術到i/o優化,到索引,再到事務處理,無一不是反映計算機最深刻規律。大家可以發現,所謂核心知識架構,都具有兩個特點,反映本質規律,體現軟硬融匯交織。也只有這樣,才能建立下面談到的「計算機思維方式」。
2.2核心知識架構
為什麼我們沒包括一些新興的語言和技術呢?似乎它們很「實用」。而且已經出現的問題是,按照傳統科目和方式學習後,學生在企業什麼都不會。這也正是大家關注工程教育的初衷。為什麼不強調這些新興實用技術的教育還在強調「古老」的「基礎」。計算機領域一個顯著的特點是,表面上知識更新非常快,新技術、語言層出不窮。這很容易導致當我們發現學生能力欠缺時,將問題歸罪於新技術的學習不得力,知識結構老化。但其實目前的問題可以從另外一個角度考慮,是否是基礎教育不得力?分析國外著名大學,如斯坦福、伯克利的課程,我們發現兩個特點:1關鍵的基礎課程,如作業系統、編譯原理、資料庫,始終是其最重要的課程,並沒有過分追逐各種「新潮」技術。2學生一學期能修的課程非常有限,一般為3門課。而國內卻呈現相反的狀況,比如編譯原理被降到了選修課的角色,新潮課程層出不窮,一個學生二年級一學期要修13門課。在這種走馬觀花的狀況下,計算機這種具有強烈「手藝」色彩和工程實踐的學科,被完全紙上談兵化。而一些可憐的實驗內容,還被學生的復制拷貝所湮沒。我們認為,恰恰是這種情況,使得基礎核心知識教育沒有工程化,沒有充分動手,導致了基礎知識教育某種程度上的巨大失敗。從以下鮮明的對比可以窺見問題的端倪:國內學生反映作業系統課程是文科課程只需要背條款考試即可;而相對地,國外著名高校作業系統課程要求學生實現「小」作業系統。國內資料庫只講其應用如大量講解sql等運用,sql即使非計算機專業人士也很容易學習,這也是它被發明的初衷。斯坦福的資料庫課程中有一門需要實現一個資料庫系統。在筆者走訪的計算機工程上優秀的人才,發現其共同的特點就是在諸如作業系統或資料庫上都有很深入的學習經歷,比如前面提及的自己構建過漢化DOS系統,或者在Unix下,做核心以及驅動很多年等。而當他們接觸新技術時,之前深刻的經驗和淬煉的思維就讓他們如虎添翼,快人一等。更有甚者,國外真正的最頂級專家,都是在這些領域有無與倫比水平的專家,從delphi的締造者,轉戰到微軟並入主平台的開發,也可看到雄厚的底層知識和能力的巨大作用。所以「老」知識並不是障礙,而是通向天堂的階梯。究其原因,就涉及到工程能力的第2個方面,計算機思維方式。
2.3計算機思維方式
對非專業人士它是很抽象的概念,而對真正專業人士,這又是一個非常鮮活的概念。這里限於篇幅,我們只舉一個簡單的例子。面對在C++中外部程式碼如何直接修改私有變數的問題,計算機的思維方式就是:物件也是放在記憶體中,只要能拿到物件的地址,並知道物件的布局,那麼就可修改。而沒有建立這種思維的人,就完全被高階語言的語法所左右,無從下手。一句話,無法看到本質,沒有從下而上的底層思維。核心知識課程的有效深入教學和計算機思維方式建立有何直接關系呢?我們認為核心知識因為其反應了計算機本質規律,而且從底層建立起來,所以對其深入掌握運用後,它從開始的逼迫到最後的陶冶,最終潛移默化地讓受眾建立起「計算機思維方式」。而這正是計算機工程師安身立命之本,就如同音樂家有其獨特的音樂思維方式一樣。為什麼諸如java之類的課程於建立計算機基本思維不太合適呢?因為它更高層,無法讓學生看到最下面。而唯有徹底、深刻和系統的底層淬煉,才能真正建立起「計算機思維方式」。
3如何打造強大的計算機工程能力
大家一方面指責基礎課程的「空洞」、「無用」、「陳舊」;另一方面在不斷開設的海量新課和技術中壓得學生更加遠離程式設計,遠離實踐。即使能培養出熟悉某種語言的學生,也無法看到他們和培訓學校有何不同。實訓也似乎沒有根本解決問題,我們在實踐中發現,往往是那些自己醉心於程式設計的學生最後有著卓越的表現。讓基礎知識能支撐和指導實踐,而非僅僅「符號」,並引導學生進行高效的實踐。
3.1「3塊連一線」,4門基礎課程整合打造核心知識架構
我們將4門基本課程進行貫通式整合,著力塑造學生的「計算機思維」。下層的是3門基礎課在上一小節探討了其在工程能力訓練上不可替代的重要地位,對軟體開發環境產生支撐。而軟體開發環境又通過精心的設計和工程實踐,從應用角度將3門課程所學的知識串聯起來。從而將基礎知識和工程開發更有機整合在一起。首先,闡述為什麼將以上課程整合在一起的理由。要回答這個問題,必須先回答什麼東西支撐了優秀程式設計師。在我們的調查人員中,無一例外地都具有很深厚的底層軟體開發背景。有長期從DOS的Hack入手的;有長期從事Unix核心程式設計的;有從Windows的driver起步的;有以反匯編逆向為根基的。長期在最底層的經歷,使他們建立了最真實和能觸控的系統觀,能以計算機的方式思考。所以面臨新技術時,他們能透過新形式很快把握其精髓,深刻地把握其實質。「太陽下面沒有真正的新事物」,例如號稱21世紀最新的重要的軟體技術AOPAspectOrientedProgramming,AOP,其實在20世紀60年代就出現在了匯編一級的軟體技術中,它本質就是鉤子技術的系統化。在底層的軟體世界,我們不僅能夠用到那些所謂的最新的技術,而且能看到其本質我們可能就是用機器碼自己構建出來的,而不被新技術的華麗外衣障目。這些使得具有底層經驗的開發者,更有創造力,更能創造,也更能洞察迷亂後的本質,庖丁解牛,解決那些異常復雜的工程問題。舉一個筆者遇到的真例項子,一個具有深刻底層經驗的程式設計師一直只有C語言和作業系統程式設計經驗和一個只有深刻Java經驗的程式設計師,在同時學習Javascript的閉包概念時,後者一個禮拜都還有些似是而非。前者很快就能自如運用,且最後指點了後者1個小時,後者頓時豁然開朗。這是典型的「新」與「老」,上層和底層經驗在面對新事物時的對比。既然底層軟體賦予我們如此強大的能力,那麼哪些是底層軟體呢?大家公認,作業系統、編譯和資料庫由來就是計算機工程自身的根基。所以,我們必須將這3門課涉及的知識好好淬煉。而如何將3門課的知識和我們日常的軟體開發聯絡起來呢?如何用它們指導平時程式的開發呢我們大多數是開發使用者級軟體,不會開發核心軟體,因此許多人認為幾乎整個在核心中的作業系統對使用者級軟體開發無從指導?另一門課,《軟體開發環境》解決了這一問題。它有一條主線,通過反匯編將C語言和匯編串聯起來,讓系統級的知識從高階語言的面紗下展現出來。同時用逆向工程這把庖丁之刃,將編譯、連結、面向物件等軟體開發中的重要知識塊剖剔,讓底層與上層貫通一氣。而逆向的技術技巧,本身也是非常高階的軟體開發技術。因此,我們用「3塊連一線」來總結4門課的關系是最好不過了。為什麼不納入語言課程,比如C/C++語言?從我們的工程經驗來看,語言只是計算機原理和思想的載體,是表述方式而已。為了表述形式而專門花大力氣是不值得的。比如,國外的著名大學很多都不開設語言課,在其他課程作業中必須用C語言程式設計,學生們就在那裡鍛煉了。真正的語言的力量並非來自語言本身,而是底層知識為支撐的專案鍛煉。我們的思路是以構建式完成大量的完整系統的編寫,這樣就很好鍛煉了軟體開發和工程能力。同時,「軟體開發環境」本身從逆向層面也對語言有了深刻的剖析,這是純粹的語言課難以完成的。另外,從大綱安排上,我們在大一就會讓學生用C語言來初步接觸程式編寫,這時並不適合放入太高階主題。而在教學中,語言的力量已經滲透到一個個工程構建中,隨風潛入夜了。為什麼不納入演演算法課程?從某種程度上,「程式就是演演算法與資料結構嗎」?我們認為在系統中運用演演算法,演演算法才具有生命力。而編譯、作業系統、資料庫以及我們專門設立的一些課程設計將全面運用各種演演算法和資料結構。在實戰中運用並學習提升才是王道。這也正是構建式學習的精髓所在,這也正是探索式學習培養學生的創造能力的精髓所在。演演算法課已經為我們准備了元件,就看你怎麼去組裝甚至改造。
3.2以構建主義的思路,深度實踐的風格改革課程
前面我們論述了底層知識架構的重要性,那麼怎麼來將它們實際地建立在學生的工程實踐中呢?簡單地說就是「構建一個具體而微的系統」。講作業系統就構建一個小作業系統,講編譯原理就構建一個我譯器。同時,設計一些跨度較大的課程設計覆蓋這些課程的一些重點內容。構建完整系統本身就可真實淬煉工程能力,而這些內容的復雜性、難度以及運用知識點的廣度,本身就超越了簡單的企業實訓專案,在培養人才方面具有系統性、完整性、挑戰性獨特優點。我們需要的是運用團隊的思路和現代軟體工程的手段,將其開發過程管理發起來,從而熟悉企業級開發的工具鏈,將軟體工程學到的知識貫通到實作中。這也回答了「和以前相似的強調基礎課程教育,什麼特點使得我們的做法能獲得強大的工程能力?」這一問題。以前更多注重理論知識的學習,而現在的做法是回歸計算機工程的自身科學規律———實踐為王。
3.3改革考核評價標准,充分強調動手實踐
以前我們一直是卷面考試,實驗分數只是象徵性的點綴。這本身違反了計算機工程的特點。只有改變評價考核標准,才能真正驅動學生充分鍛煉工程。在課程軟體開發環境中,我們採取了平時的考試結合期末考試的方式,而兩者均為軟體編寫。期末考試在實驗室上機編撰指定題目。不強調對一些函式名等死知識點的記憶,可以用線上幫助。這本身也符合軟體開發的規律。
4結束語
我們在計算機工程教育上試圖做一些回歸本質的工作,也取得了一些效果。比如在軟體開發環境中,學生普遍認為:「似乎將3年學的程式課全學習了,收獲很大」。更有同學,在外企公司的面試中,直接運用了課堂上的知識,這在傳統的教學環節中是難以獲取的。但整個工作尚在起步階段,所以仍有很多工作需要做,許多環節需要優化。我們希望在以後的工作中更深入探索工程教育的規律和本質。
7. 漢語程序設計語言的編譯原理
漢編系統是一個互動式的程序設計環境,最初是為程序員在小型和微型計算機上開發應用程序而設計的。主要應用於科學計算和工業控制,比如儀器、機器人、過程式控制制、圖形和圖像處理、人工智慧和商業應用。漢編語言的主要優點是軟體開發快速、互動式、計算機硬體的高效使用等。
漢編語言與傳統語言最大的不同是它的可擴展性。漢編語言的編程過程就是定義新的詞,詞實際上就是語言的新命令。詞可以用一系列以前定義的詞來定義,這個過程與教育孩子的過程相似:我們總是用孩子們以前理解的概念來教給孩子們新的概念,而這些詞被稱為「高級定義」。同樣,新的詞也可以用匯編代碼定義。
可擴展性的結果是我們在開發一個應用的同時,也間接地開發了一個特殊的、針對這一類應用的「面向應用的模塊,它可以用於或者經過修改之後被用於相似的應用。
漢編語言的可擴展性並不僅僅是為語言自身增加新的命令,所以不要把定義詞與傳統高級語言定義函數、過程等同。漢編系統還能對定義詞(建詞)進行擴展,創建一個可以定義其它詞的詞,這種詞被稱為「定義詞」。在創建這樣一個定義詞的時候,程序員能夠指定它所創建的詞在編譯時間、運行時間或者這兩種狀態下的特殊行為。這個能力允許我們定義特殊的數據類型,並對其行為和結構實施完全的控制。又由於這種詞的運行時行為可以用高級語言或者匯編語言來定義,所以由定義詞創建的詞將具有與其它漢編詞一樣的性能。系統也允許我們增加一個新的「編譯指示符」以實現特殊類型的循環或者其它的控制結構。比如,漢語言定義一個程序變數的詞:給,其代碼大概如下:
編給(32位數-<變數名>-)編譯時
(---32位數)運行時
建詞可用地址4位元組空出寫
動作讀
。
定義變數時
5給變數一
則5被自動寫入變數一的實體域中
運行「變數一」時
變數一
則變數一實體域中的數字5被自動讀取,放到數摞上 漢編詞可以使用以前定義的詞或者匯編代碼來定義,它們與其它語言的子程序相似,也與其它語言的命令等效。漢編系統允許我們在鍵盤上打入一條指令的詞名,這個詞將被立即執行。然而,如果我們把功能的詞名放到定義中,將編譯成對於這個詞的引用。
高級詞是由其它詞的集合來定義的,我們可以把這個過程想像成是其它語言的宏。新的詞被加入到它們可以使用的存儲器中,其定義被加入到詞典中。在一個漢編詞的命名規則中,只有很少的幾個字元不能作為詞名使用。
當遇到一個詞的時候,漢編系統就通過詞典搜索希望找到這個詞的定義,如果找到這個詞定義的功能,或者被立即執行,或者作為引用而被編譯到新的定義中。然而,如果在詞典中沒有找到這個詞,系統就試著把它轉換成一個數。如果轉換成功,就把它放在數摞上。如果不能轉換成數字,就顯示這個未定義的詞名並列印出一個錯誤的信息來報告這個詞是系統所不知道的。
漢編詞的執行流程大概可以用一個詞來模擬如下:
編查詞測試
{詞名串--}
255個位元組空給詞名串
詞名串255填0
詞名串字串傳送
詞名串(查詞)
0=
就
計位元組
串>數
就
♀
否則
字串未定義詞名串字串+傳送
詞名串計位元組
回車印字串
全復位
然後
否則
執行
然後
。★
字串看數摞查詞測試數摞已空!★
字串123456查詞測試★.
看數摞[1]123456★.
顯123456★
字串看方法查詞測試
看方法未定義
漢編系統編譯流程如右圖(流程圖來源:漢編新浪博客)所示。
漢編語言堅持「結構化程序設計」原理:
·詞必須在引用之前被定義;
·邏輯流限制只有順序、條件和循環,有專門的詞用於實現常用的程序控制結構;
·程序員使用許多小的、獨立的模塊(詞)來實現最大的可測試性和可靠性;
這種方法有兩個明顯的優點
·新的詞總是用以前定義和測試過的詞來構造,所以調試更容易。模塊可以單獨執行以測試它的功能;
·固有的模塊性使漢編語言成為一個「設計性語言」,允許自頂向下的設計同時保持自底向上的測試。一個詞可以在不同的程序中使用,但是它的功能只需要定義一次;
這些都保證了漢編軟體能夠快速和有效地被開發,同時,如果管理得當,也可以作為自身文檔的基礎。
漢編語言的5個主要元素決定了它的特點:
·一個詞典;
·兩個數摞,一個是參數摞,另一個是用於嵌套的返回摞;
·鍵盤(輸入流)解釋器;
·一個編譯器;
·虛擬存儲; 詞典是漢編定義詞的數據和代碼存儲空間,也為編譯建立了詞的索引。詞典中的詞包括漢編程序代碼詞、常數定義詞、變數定義詞、不定量定義詞,面向對象部分還有模板、對象、對象事件、消息。
漢編代碼存儲在詞典中。詞典占據了系統存儲器的很大部分,它由一個串線鏈接的可變長度的項目組成,每個項目定義了一個詞。每個定義的內容根據詞的類型(數據項、常數、操作序列等)而有所不同,詞典是可擴展的。
詞是由「定義詞」加入詞典的,最常用的定義詞是「編。」當「編」執行的時候,馬上就把後面的詞名掃描,建立一個詞典項,然後進入「編譯」模式。有許多不同的編譯方法,最常用的是「串線編碼」,這種方法把定義編譯成一系列以前定義詞的地址引用。詞的定義由「。」(句號)結束。下面就是一個詞的定義:
編平方(--)♂*顯。
當一個詞名項被編譯到詞典中的時候(稱為定義的首部),它包含一個指向詞典中前一個首部的指針。新詞的詞名加入詞典(這里就是平方),接著一個指向詞名為「(編)」子程序調用的指針編譯到詞典中作為定義的第一部分,這個指針指向一段在解釋定義體時需要執行的代碼。當然,這里所說的不是唯一的編譯技術,但它的應用最為普遍,這種技術稱為間接串線編碼,因為定義中的第一個項目是一段代碼的引用,這段代碼知道如何解釋定義的其它部分。
定義的其它部分稱為這個定義的體。在編譯模式下,系統將依次尋找每個詞的首部。每個首部地址依次放到定義體中,這樣就產生了一個地址列表。最後在到達「。」時,詞名為「。」的子程序地址被編譯進詞典。「。」子程序用來將控制返回到調用詞,就像一個子程序返回一樣。
8. 編譯原理
C語言編譯過程詳解
C語言的編譯鏈接過程是要把我們編寫的一個C程序(源代碼)轉換成可以在硬體上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯為機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啟動代碼和用到的庫文件進行組織形成最終生成可執行代碼的過程。過程圖解如下:
從圖上可以看到,整個代碼的編譯過程分為編譯和鏈接兩個過程,編譯對應圖中的大括弧括起的部分,其餘則為鏈接過程。
一、編譯過程
編譯過程又可以分成兩個階段:編譯和匯編。
1、編譯
編譯是讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,源文件的編譯過程包含兩個主要階段:
第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。如#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中。這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
主要是以下幾方面的處理:
(1)宏定義指令,如 #define a b。
對於這種偽指令,預編譯所要做的是將程序中的所有a用b替換,但作為字元串常量的 a則不被替換。還有 #undef,則將取消對某個宏的定義,使以後該串的出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif等。
這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3) 頭文件包含指令,如#include "FileName"或者#include <FileName>等。
在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。包含到C源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與C源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。
例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
第二個階段編譯、優化階段。經過預編譯得到的輸出文件中,只有常量;如數字、字元串、變數的定義,以及C語言的關鍵字,如main,if,else,for,while,{,}, +,-,*,\等等。
編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼表示或匯編代碼。
優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬體環境也有很大的關系。優化一部分是對中間代碼的優化。這種優化不依賴於具體的計算機。另一種優化則主要針對目標代碼的生成而進行的。
對於前一種優化,主要的工作是刪除公共表達式、循環優化(代碼外提、強度削弱、變換循環控制條件、已知量的合並等)、復寫傳播,以及無用賦值的刪除,等等。
後一種類型的優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體寄存器存放的有關變數的值,以減少對於內存的訪問次數。另外,如何根據機器硬體執行指令的特點(如流水線、RISC、CISC、VLIW等)而對指令進行一些調整使目標代碼比較短,執行的效率比較高,也是一個重要的研究課題。
2、匯編
匯編實際上指把匯編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段:
代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。
數據段:主要存放程序中要用到的各種全局變數或靜態的數據。一般數據段都是可讀,可寫,可執行的。
UNIX環境下主要有三種類型的目標文件:
(1)可重定位文件
其中包含有適合於其它目標文件鏈接來創建一個可執行的或者共享的目標文件的代碼和數據。
(2)共享的目標文件
這種文件存放了適合於在兩種上下文里鏈接的代碼和數據。
第一種是鏈接程序可把它與其它可重定位文件及共享的目標文件一起處理來創建另一個 目標文件;
第二種是動態鏈接程序將它與另一個可執行文件及其它的共享目標文件結合到一起,創建一個進程映象。
(3)可執行文件
它包含了一個可以被操作系統創建一個進程來執行之的文件。匯編程序生成的實際上是第一種類型的目標文件。對於後兩種還需要其他的一些處理方能得到,這個就是鏈接程序的工作了。
二、鏈接過程
由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。
根據開發人員指定的同庫函數的鏈接方式的不同,鏈接處理可分為兩種:
(1)靜態鏈接
在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。
(2) 動態鏈接
在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。
對於可執行文件中的函數調用,可分別採用動態鏈接或靜態鏈接的方法。使用動態鏈接能夠使最終的可執行文件比較短小,並且當共享對象被多個進程使用時能節約一些內存,因為在內存中只需要保存一份此共享對象的代碼。但並不是使用動態鏈接就一定比使用靜態鏈接要優越。在某些情況下動態鏈接可能帶來一些性能上損害。
我們在linux使用的gcc編譯器便是把以上的幾個過程進行捆綁,使用戶只使用一次命令就把編譯工作完成,這的確方便了編譯工作,但對於初學者了解編譯過程就很不利了,下圖便是gcc代理的編譯過程:
從上圖可以看到:
預編譯
將.c 文件轉化成 .i文件
使用的gcc命令是:gcc –E
對應於預處理命令cpp
編譯
將.c/.h文件轉換成.s文件
使用的gcc命令是:gcc –S
對應於編譯命令 cc –S
匯編
將.s 文件轉化成 .o文件
使用的gcc 命令是:gcc –c
對應於匯編命令是 as
鏈接
將.o文件轉化成可執行程序
使用的gcc 命令是: gcc
對應於鏈接命令是 ld
總結起來編譯過程就上面的四個過程:預編譯、編譯、匯編、鏈接。了解這四個過程中所做的工作,對我們理解頭文件、庫等的工作過程是有幫助的,而且清楚的了解編譯鏈接過程還對我們在編程時定位錯誤,以及編程時盡量調動編譯器的檢測錯誤會有很大的幫助的。
是否可以解決您的問題?