1. 編譯器的工作原理
編譯 是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器語言)的翻譯過程。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的EXE,
所以我們電腦上的文件都是經過編譯後的文件。
2. 資料庫,數據結構,編譯原理對編程有那些影響和幫助
他們太重要了,
(1)數據結構:首先要明白---->程序=演算法+數據
「數據結構」就是做數據這塊的,例如一個「電影播放器」程序,首先要有「電影」嗎,這個就是「數據」,那麼就要用「數據結構」的知識,怎麼存儲每一幀,怎麼高效,怎麼能無損,怎麼空間最節省.........,然後才是怎麼去「解碼」(解碼就是「演算法」做的啦),當然這么講起來不是很嚴謹,但你可以看得出,數據結構可以說的上是有50%的重要性了。
(2)編譯原理:不要以為,自己不去開發「語言」,編譯原理就沒有用啦,它能讓你從根本上理解編譯器,這對怎麼提高程序的效率,怎麼變出漂亮的程序很有用................當然貌似如果從事,「人工智慧」這一塊的話,編譯原理也非常重要。
(3)資料庫:又是剛才哪一點----------->程序=演算法+數據
數據以文件的形式存儲,是在不是很高效,所以,為了方便數據的管理與查找等等..........人類作出了「資料庫」,說白了,它就是用來解決「數據」這部分內容的,現在基本無論你做什麼都離不開資料庫了,從大型網游到網站,到手機等的移動設備編程,都要用到資料庫
--------------------------------------------------------------------------------------------------
從你的體溫來看,你可能剛剛接觸編程,沒有做過什麼成品,隨著你越來越了解這個領域,你會剛到這些東西非常重要,當然還有很多東西,與以上三者地位相當,或更高,例如,微型計算機組成原理,等一些硬體方面的知識.......................................
---------------------------------------------------------------------------------------------------
還是「廣泛閱讀」吧。
3. 不同編譯環境 對同一程序可能有哪些影響
可能的,原因很多,無法一一列舉,只是舉兩個例子,
比如某些編譯環境(通常debug環境),會給變數付初始值,比如int給0,指針給null,這樣的話如果程序本身實現忘了給初始值,那麼可能還是能夠正常工作下去。但是在不給變數付初始值的編譯環境,就會出錯了。
另一個例子是對於內存的安全檢查,如果程序存在內存溢出的情況,那麼不對內存做安全檢查的編譯環境編譯後生成的代碼可能可以正常工作,但是對內存做安全檢查的編譯器出來的就可能會出現異常了
4. 為什麼大學老師教c語言用的是Turbo C , 感覺好麻煩
你說的是寫程序的軟體?那我說一說我用過的版本:1turboc2.0:當年學習C語言時在機房只讓用這個軟體,全英文版本,操作很……反正那一學期過後我就再也沒用過,不太明白當時老師為什麼一定要讓學生用這個軟體(一代代傳下來的?),也許操作過程可以讓學生對C理解得更深(反正我是沒體會到……),不過因為是很原始的東西,所以不會有「篡改」函數的問題(所謂篡改就是編譯器為了優化、安全等問題,可能會把c中的一些原函數改了,改成一個換了名字的新函數,比如下面介紹的vs,對初學者來說會很煩人,因為會花一些時間去找為什麼根本沒有錯的代碼會報錯……)2vc6.0:當時接觸了之後第一反應:好東西啊!跟turboc比起來,那簡直是方便太多太多了,居然可以滑鼠點擊隨意定位代碼位置(用turboc久了就是這么容易滿足……),終於告別了turboc那藍色的窗口,可以十分舒服的敲代碼和調試了3vs2013:很好很強大,用了一下便把vc給卸了,和vc6.0相比,vs讓我更舒服(也變得更懶)。 總結一下:turboc雖然各種讓人討厭,但小巧,學習c語言基礎有它確實就夠了,還不用擔心一些編譯器優化所導致的報錯;vc自然比turboc好用得多,而且也不大,不過6.0也有點古老,和win7就有兼容的問題,有時會出錯,不過vc++還有新版本,更加好用不過體積也更大;vs很強大(很強很大),集成了很多功能(c++、c#、資料庫、網站建設……),所以體積你懂得,vc++那些新版本的體積和它一比就是輕量級……只是學習c語言的話,用vs性價比太低了 建議:老師教學就用老師建議的版本,自學就用看的書中建議的版本,這樣不用擔心因編譯器版本問題而導致的代碼報錯。但如果實在不想用那就選vc吧,6.0相對來說還是比較適合初學者的,也可以選vc其他版本,不過不建議太新的版本,因為新版本往往代表著功能的增加,作為初學者把時間浪費在熟悉編譯器環境上有些不值,把精力放在c語言的學習上才是初學者應該做的(等打好基礎了再去選一個好點的編譯器來提高效率吧)
5. 關於編譯器
看來你還沒入門哦,就想寫一個操作系統了
嗯!有志不錯,相信有一天你會成功的。
一般地說寫一個OS你要會一門高級語言(如C++)一門低級語言(如匯編asm)高級語言用來做界面這方面比較容易一點。而低級用來做低層驅動這方面是高級語言所不能相比的。
當然C語言介於兩者之間,也能對硬體編程,但C是16位的程序對於圖形處理不是很好,我個人建議你低級語言用匯編,對硬體編程時沒有那麼抽象,想傳送的數據很清楚知道來去的方面,但要對硬體這方面的知道要了解。還有就是像要懂操作系統原理還要知道怎麼去實踐這些原理這些才是重要的,選擇語言不是難事,給你一個組合吧(C和asm)雖然不能做出XP這種效果來,但這個圖形操作系統還是很的,就看你自己的功夫了。
對於你補充的問題吶,程序的位數好像指CPU的寄存器的位數吧,在386以前的CPU好像一條指令大是16位的(當然有的指令沒這么大,有8位的)在386後的新加的指令中才有32位的,為了使386以後的CPU能使用以前的指令,規定在16位指令加上不同的指令前綴,形成32位指令形式,這里的32指令就是32位程序的指令,而你說的64位程序。。在我所學的指令里沒有64位的指令,但以以前的指令在在64位上運行,也要兼容的問題吧!之所以有64位的CPU所來是指CPU一次處理數據的位數,比如說32的CPU一次能處理32位的數據,而要處理64位的就要分兩次從內存中取數據而佔用匯流排,這樣會使CPU有空閑,而64位的CPU只要一次就行了,所以你理解錯了,
最後一個問題是人家生在那個年代,和人家有遠見,成績不好並不代表實踐不好,理論和實踐是兩回事,理論在好不會實踐也是廢話,所以人家敢做,在實踐中學習,在加上機遇。這個事不是你我能說清的,只能說說個人見解罷了。。
對於計算機硬體的知道只能告訴你這么之了,,大家相互學習,共同進步吧!!
如果你想找資料的話!你把你的郵箱留下,我這有硬體,操作系統,指令這些用於寫操作的資料!!
6. 現在的在校大學生學c語言使用用的編譯器還是那個很老的那個vc6.0嗎為什麼高校不使用新一點的編譯
經典啊,教材資料都是針對vc6.0的,如果換的話,就需要換教材換資料,老師的工作量就會變大,學校就要多花錢,說到這了,你懂的!
7. 什麼是編譯原理
編譯原理是計算機專業的一門重要專業課,旨在介紹編譯程序構造的一般原理和基本方法。內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。 編譯原理是計算機專業設置的一門重要的專業課程。雖然只有少數人從事編譯方面的工作,但是這門課在理論、技術、方法上都對學生提供了系統而有效的訓練,有利於提高軟體人員的素質和能力。
這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的 必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。 我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀 50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟 編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間 誕生不少名著的相關數論。
8. 大學里java教學用什麼編譯器
一 eclipse / myeclipse
當年學習java,最先接觸到的就是 eclipse。喔了個噻,當時感覺eclipse好牛啊,有好多先進的功能:
1. 可以方便地進行包管理。可視化窗口,創建目錄和文件都很方便,移動包,復制包等都可以方便的進行。
2.熱鍵操作。復制保存啥的就不說了,代碼提示這個功能還是很不錯的,在寫著寫著,腦子突然短路的時候,可以通過快捷鍵把腦子快速帶回來。
3.代碼調試。有時候,寫著寫著代碼,突然間就報錯了,不知道哪裡錯了,咋整,這時候,如果使用編輯器的話,就可以使用 debug模式進行調試了,找出問題所在,解決問題。
4.一些代碼管理等插件。在企業中肯定要用到代碼同步工具,svn 或者 git , 在編輯器中會提供這樣的插件,方便代碼的管理。
二 idea
相比 eclipse 和 myeclipse ,idea 的基本功能差不多。
1. 包管理:也是有方便的包和資源管理。
2.熱鍵:也是提供熱鍵管理的,而且還很好用。
3.代碼調試:debug模式用起來也是很舒服。
4.插件方面:也是支持一些插件的,如 熱部署插件等。
三 比較
1. 操作:兩個軟體有不同的快捷鍵,雖然idea兼容部分eclipse快捷鍵,但是不建議這樣做。
2.資源消耗:idea更能吃內存啊呦喂,電腦配置低的傷不起啊。eclipse要更柔和一點。
3.是否免費:eclipse 是免費的,myeclipse和idea 是要付費的呦。但是嘛,你懂得。
4.專業性:idea 應該是更專業的,有更高的代碼更新機制和代碼提示功能。但是 eclipse 涉及的范圍更廣,除了java 和可以編輯其他語言的項目。
四 建議
1. 如果電腦配置比較低,建議使用 eclipse ,並且使用較低版本的,這樣,電腦不會太吃力。如果配置比較高,比如,16G內存,固態硬碟,那就使用idea吧。
2. 沒有最好的編輯器,只有最適合自己的編輯器。任何一個編輯器用習慣了,都是很不錯的。
希望對您有所幫助!~
9. 您好,我現在學單片機,但是老師講的是匯編語言,我感覺聽懂比較困難,我們沒有任何的匯編基礎,我現在編
當然有影響啦,是很好的影響,讓你知道怎麼樣去設定基本的指令。匯編其實不是很難懂的。指令掌握了,理解下基本的程序就可以了。C語言編程的也要靠匯編進行解決問題。我之前也是學匯編的,現在工作基本上用C來寫,真的多虧學校老師教的知識來應對。現在上手比較快。學的東西多,我覺得不會有相剋的原理。對嵌入式的沒有影響。都是語言。沒關系的。不難。C應用范圍會更廣點。
10. 為什麼要學習編譯原理
大學課程為什麼要開設編譯原理呢?這門課程關注的是編譯器方面的產生原理和技術問題,似乎和計算機的基礎領域不沾邊,可是編譯原理卻一直作為大學本科的必修課程,同時也成為了研究生入學考試的必考內容。編譯原理及技術從本質上來講就是一個演算法問題而已,當然由於這個問題十分復雜,其解決演算法也相對復雜。我們學的數據結構與演算法分析也是講演算法的,不過講的基礎演算法,換句話說講的是演算法導論,而編譯原理這門課程講的就是比較專註解決一種的演算法了。在20世紀50年代,編譯器的編寫一直被認為是十分困難的事情,第一Fortran的編譯器據說花了18年的時間才完成。在人們嘗試編寫編譯器的同時,誕生了許多跟編譯相關的理論和技術,而這些理論和技術比一個實際的編譯器本身價值更大。就猶如數學家們在解決著名的哥德巴赫猜想一樣,雖然沒有最終解決問題,但是其間誕生不少名著的相關數論。
推薦參考書
雖然編譯理論發展到今天,已經有了比較成熟的部分,但是作為一個大學生來說,要自己寫出一個像TurbocC,Java那樣的編譯器來說還是太難了。不僅寫編譯器困難,學習編譯原理這門課程也比較困難。
第一本書的原名叫《CompilersPrinciples,Techniques,andTools》,另外一個響亮的名字就是龍書。原因是這本書的封面上有條紅色的龍,也因為獗臼樵詒嘁朐?砘?嘴域確實?忻?所以很多國外的學者都直接取名為龍書。最近機械工業出版社已經出版了此書的中文版,名字就叫《編譯原理》。該書出的比較早,大概是在85或86年編寫完成的,作者之一還是著名的貝爾實驗室的科學家。裡面講解的核心編譯原理至今都沒有變過,所以一直到今天,它的價值都非凡。這本書最大的特點就是一開始就通過一個實際的小例子,把編譯原理的大致內容羅列出來,讓很多編譯原理的初學者很快心裡有了個底,也知道為什麼會有這些理論,怎麼運用這些理論。而這一點是我感覺國內的教材缺乏的東西,所以國內的教材都不是寫給願意自學的讀者,總之讓人看了半天,卻不知道裡面的東西有什麼用。
第二本書的原名叫《ModernCompilerDesign》,中文名字叫做《現代編譯程序設計》。該書由人民郵電出版社所出。此書比較關注的是編譯原理的實踐,書中給出了不少的實際程序代碼,還有很多實際的編譯技術問題等等。此書另外一個特點就是其現代而字。在傳統的編譯原理教材中,你是不可能看到如同Java中的垃圾回收等演算法的。因為Java這樣的解釋執行語言是在近幾年才流行起來的東西。如果你想深入學習編譯原理的理論知識,那麼你肯定得看前面那本龍書,如果你想自己動手做一個先進的編譯器,那麼你得看這本《現代編譯程序設計》。
第三本書就是很多國內的編譯原理學者都推薦的那本《編譯原理及實踐》。或許是這本書引入國內比較早吧,我記得我是在高中就買了這本書,不過也是在前段時間才把整本書看完。此書作為入門教程也的確是個不錯的選擇。書中給出的編譯原理講解也相當細致,雖然不如前面的龍書那麼深入,但是很多地方都是點到為止,作為大學本科教學已經是十分深入了。該書的特點就是注重實踐,不過感覺還不如前面那本《現代編譯程序設計》的實踐味道更重。此書的重點還是在原理上的實踐,而非前面那本那樣的技術實踐。《編譯原理及實踐》在講解編譯原理的各個部分的同時,也在逐步實踐一個現代的編譯器TinyC.等你把整本書看完,差不多自己也可以寫一個TinyC了。作者還對Lex和Yacc這兩個常用的編譯相關的工具進行了很詳細的說明,這一點也是很難在國內的教材中看到的。
推薦了這三本教材,都有英文版和中文版的。很多英文好的同學只喜歡看原版的書,不我的感覺是這三本書的翻譯都很不錯,沒有必要特別去買英文版的。理解理論的實質比理解表面的文字更為重要。
編譯原理的實質
幾乎每本編譯原理的教材都是分成詞法分析,語法分析(LL演算法,遞歸下降演算法,LR演算法),語義分析,運行時環境,中間代碼,代碼生成,代碼優化這些部分。其實現在很多編譯原理的教材都是按照85,86出版的那本龍書來安排教學內容的,所以那本龍書的內容格式幾乎成了現在編譯原理教材的定式,包括國內的教材也是如此。一般來說,大學裡面的本科教學是不可能把上面的所有部分都認真講完的,而是比較偏重於前面幾個部分。像代碼優化那部分東西,就像個無底洞一樣,如果要認真講,就是單獨開一個學期的課也不可能講得清楚。所以,一般對於本科生,對詞法分析和語法分析掌握要求就相對要高一點了。
詞法分析相對來說比較簡單。可能是詞法分析程序本身實現起來很簡單吧,很多沒有學過編譯原理的人也同樣可以寫出各種各樣的詞法分析程序。不過編譯原理在講解詞法分析的時候,重點把正則表達式和自動機原理加了進來,然後以一種十分標準的方式來講解詞法分析程序的產生。這樣的做法道理很明顯,就是要讓詞法分析從程序上升到理論的地步。
語法分析部分就比較麻煩一點了。現在一般有兩種語法分析演算法,LL自頂向下演算法和LR自底向上演算法。LL演算法還好說,到了LR演算法的時候,困難就來了。很多自學編譯原理的都是遇到LR演算法的理解成問題後就放棄了自學。其實這些東西都是只要大家理解就可以了,又不是像詞法分析那樣非得自己寫出來才算真正的會。像LR演算法的語法分析器,一般都是用工具Yacc來生成,實踐中完全沒有比較自己來實現。對於LL演算法中特殊的遞歸下降演算法,因為其實踐十分簡單,那麼就應該要求每個學生都能自己寫。當然,現在也有不少好的LL演算法的語法分析器,不過要是換在非C平台,比如Java,Delphi,你不能運用YACC工具了,那麼你就只有自己來寫語法分析器。
等學到詞法分析和語法分析時候,你可能會出現這樣的疑問:詞法分析和語法分析到底有什麼?就從編譯器的角度來講,編譯器需要把程序員寫的源程序轉換成一種方便處理的數據結構(抽象語法樹或語法樹),那麼這個轉換的過程就是通過詞法分析和語法分析的。其實詞法分析並非一開始就被列入編譯器的必備部分,只是我們為了簡化語法分析的過程,就把詞法分析這種繁瑣的工作單獨提取出來,就成了現在的詞法分析部分。除了編譯器部分,在其它地方,詞法分析和語法分析也是有用的。比如我們在DOS,Unix,Linux下輸入命令的時候,程序如何分析你輸入的命令形式,這也是簡單的應用。總之,這兩部分的工作就是把不規則的文本信息轉換成一種比較好分析好處理的數據結構。那麼為什麼編譯原理的教程都最終把要分析的源分析轉換成樹這種數據結構呢?數據結構中有Stack,Line,List這么多數據結構,各自都有各自的特點。但是Tree這種結構有很強的遞歸性,也就是說我們可以把Tree的任何結點Node提取出來後,它依舊是一顆完整的Tree。這一點符合我們現在編譯原理分析的形式語言,比如我們在函數裡面使用函樹,循環中使用循環,條件中使用條件等等,那麼就可以很直觀地表示在Tree這種數據結構上。同樣,我們在執行形式語言的程序的時候也是如此的遞歸性。在編譯原理後面的代碼生成的部分,就會介紹一種堆棧式的中間代碼,我們可以根據分析出來的抽象語法樹,很容易,很機械地運用遞歸遍歷抽象語法樹就可以生成這種指令代碼。而這種代碼其實也被廣泛運用在其它的解釋型語言中。像現在流行的Java,.NET,其底層的位元組碼bytecode,可以說就是這中基於堆棧的指令代碼的。
關於語義分析,語法制導翻譯,類型檢查等等部分,其實都是一種完善前面得到的抽象語法樹的過程。比如說,我們寫C語言程序的時候,都知道,如果把一個浮點數直接賦值給一個整數,就會出現類型不匹配,那麼C語言的編譯器是怎麼知道的呢?就是通過這一步的類型檢查。像C++語言這中支持多態函數的語言,這部分要處理的問題就更多更復雜了。大部編譯原理的教材在這部分都是講解一些比較好的處理策略而已。因為新的問題總是在發生,舊的辦法不見得足夠解決。
本來說,作為一個編譯器,起作用的部分就是用戶輸入的源程序到最終的代碼生成。但是在講解最終代碼生成的時候,又不得不講解機器運行環境等內容。因為如果你不知道機器是怎麼執行最終代碼的,那麼你當然無法知道如何生成合適的最終代碼。這部分內容我自我感覺其意義甚至超過了編譯原理本身。因為它會把一個計算機的程序的運行過程都通通排在你面前,你將來可能不會從事編譯器的開發工作,但是只要是和計算機軟體開發相關的領域,都會涉及到程序的執行過程。運行時環境的講解會讓你更清楚一個計算機程序是怎麼存儲,怎麼裝載,怎麼執行的。關於部分的內容,我強烈建議大家看看龍書上的講解,作者從最基本的存儲組織,存儲分配策略,非局部名字的訪問,參數傳遞,符號表到動態存儲分配(malloc,new)都作了十分詳細的說明。這些東西都是我們編寫平常程序的時候經常要做的事情,但是我們卻少去探求其內部是如何完成。
關於中間代碼生成,代碼生成,代碼優化部分的內容就實在不好說了。國內很多教材到了這部分都會很簡單地走馬觀花講過去,學生聽了也只是作為了解,不知道如何運用。不過這部分內容的東西如果要認真講,單獨開一學期的課程都講不完。在《編譯原理及實踐》的書上,對於這部分的講解就恰到好處。作者主要講解的還是一種以堆棧為基礎的指令代碼,十分通俗易懂,讓人看了後,很容易模仿,自己下來後就可以寫自己的代碼生成。當然,對於其它代碼生成技術,代碼優化技術的講解就十分簡單了。如果要仔細研究代碼生成技術,其實另外還有本叫做《》,那本書現在由機械工業出版社引進的,十分厚重,而且是英文原版。不過這本書我沒有把它列為推薦書給大家,畢竟能把龍書的內容搞清楚,在中國已經就算很不錯的高手了,到那個時候再看這本《》也不遲。代碼優化部分在大學本科教學中還是一個不太重要的部分,就是算是實踐過程中,相信大家也不太運用得到。畢竟,自己做的編譯器能正確生成執行代碼已經很不錯了,還談什麼優化呢?
編譯原理的課程畢竟還只是講解原理的課程,不是專門的編譯技術課程。這兩門課程是有很大的區別的。編譯技術更關注實際的編寫編譯器過程中運用到的技術,而原理的課