編譯原理可以用c寫解釋器嗎
1. 我要用C寫個面對對象的語言的解釋器,怎麼開始比較好
先去閱讀編譯原理吧!腳本語言的解釋器不是那麼好做的,涉及到的東西實在多,如果你敢於嘗試,建議先去閱讀一下現有的編譯器代碼。
2. 怎樣去寫一個編譯器(用c語言寫C語言編譯器),需要哪些知識做鋪墊,可以給一下相關網站和書籍的推薦嗎
寫編譯器重點就是設計並實現一些數據結構和演算法,語言特點太多的話,代碼寫起來不容易,建議你找一個小語言嘗試下,不要一開始就去嘗試成熟語言。否則你會在寫完語法分析程序以後,遭遇到很大的困難。多數人都是在寫語義分析程序的時候,突然發現自己設計的數據結構很爛,後邊越寫越要命。
如果你想入門編譯器的話,那麼可以看《編譯原理與實踐》,整本書先將編譯器理論,然後後邊教你一步步實現c-miuns(c的子集)的編譯器,包括lex,yacc,都在幾千行代碼左右。這本書講的比較簡單易懂一點
也可以學學斯坦福大學的編譯器設計公開課(aiken設計了一個叫cool的語言,專門用來教人寫編譯器),課程地址上面有人給了:Compilers。這門課以前有個實驗環境(據說已經給了,我以前寫的時候還是用的網上一個不完整的實驗環境),把和編譯器知識無關的內容都給你寫好了,你只需要在固定的地方填上你的內容就可以寫出你的編譯器(不要覺得很簡單哦,人家的代碼寫的很精巧的,讀完就發現寫個好編譯器還是很費腦子的),另外,這個實驗環境有個特點,就是在每一步都提供標准程序做對比,你可以在寫完一部分以後就同標准程序對比,及時發現錯誤。這種方式為寫編譯器又提供了很多幫助
先找個小的,慢慢研究,弄懂了整體的結構再說
3. 關於編譯原理的問題
1.當然是機器語言了,如果是匯編指令,那還得編譯一次!能運行的程序都是機器語言,只有機器語言才能控制CPU,NET或java這些中間語言,程序在運行時會被CLR或JVM快速編譯成機器語言,因此這些程序速度上有損失。
高級語言源代碼(文本)-通過編譯器(compiler)-程序(二進制機器語言)
匯編代碼(文本)-通過匯編器(assembler)-程序(二進制語言)
看到這里,你可能會想那匯編語言到底有什麼用呢,編譯器完全能代替匯編啊?
(1).編譯器是通過高級語言(c,c++)轉到機器語言的。轉換過的機器語言受限與高級語言,效率和功能上都有限制。比如c不等過分操作內存。但通過匯編器轉化過來的機器語言,效率高,且用匯編語言,直接和CPU對話!
(2).匯編可以反匯編(逆向編譯),而這里高級語言沒有發言權,就是:
程序(二進制機器語言)-通過反匯編器(compiler)-可轉化為匯編代碼(文本)
但永遠不能轉化為高級語言的源代碼,。
以上兩點匯編存在的重要性。
2。當然是說移植源代碼。windows用x86機器語言,蘋果用powerPC機器語言,windows程序當然不能運行在蘋果機上,因為程序其實就是一串機器語言!但windows上有c的編譯器(vc++),蘋果機上也有c編譯器(gcc),因此同一個c的源代碼,當然就可以通過不同平台的同一種編譯器實現平台移植。
3.當然是NASM,我看的所有書都首先說NASM,他是開源的,就像Linux一樣,很受歡迎,還有MASN是微軟的,borland的也有匯編器,不過都不常見了。
4.這跟CPU有關,一般32位x86兼容的cpu有許多寄存器,多數是32位的,也有16位的。比如CS,ES,DS這些segment寄存器一直是16位的。
5.優勢太多了,這和32位和16位存在的優勢一樣,16位電腦最大內存1MB,寄存器都是16位的。32位,最大內存可以有4GB,整整是16位的4096倍啊!16位多渺小啊,同理64位基本上也可以蔑視32位,64內存最大內存用TB來衡量,寄存器多數是64位!地址匯流排也是64位。64對32位沒有什麼優勢劣勢可言,64位完全就是32位的下一代。
4. c++編譯程序是用什麼軟體寫出來的
我只知道c可以用來開發編譯器~~我們編譯原理課程是使用c語言開發編譯器
當然匯編肯定也可以用來開發編譯器
匯編語言的編譯器也可以使用c語言來編寫,編譯器其實算是一個文本處理工具,再說c語言的程序之後也會轉換為匯編語言的版本,直至機器語言,所以匯編的編譯器不一定非得匯編語言編寫~~
應該不是java
c#這樣的高級語言開發出來的。。。
另外java虛擬機以及c#的底層都是c++編寫的。
能力有限,只知道這些,期待樓下的答復~~
5. 如何用c寫一個編譯器
先學編譯原理。
然後根據步驟,
1 處理預編譯
2 詞法分析
3 語法分析
4 語義分析
5 中間代碼轉換
6 二進制代碼生成。
簡單起見,不需要考慮優化。 初期可以不需要支持太多語法。
6. C語言既可以編譯執行又可以解釋執行嗎 編譯執行怎麼解釋 解釋執行又怎麼解釋
C 語言程序僅可以解釋執行。
解釋程序是將源程序(如BASIC)作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程序。編譯程序是把高級語言(如FORTRAN、COBOL、Pascal、C等)源程序作為輸入,進行翻譯轉換,產生出機器語言的目標程序,然後再讓計算機執行這個目標程序,得到計算結果。
相對於編譯性語言,其優點是可移植性好,只要有解釋器環境,程序就可以在不同的操作系統上運行。
缺點是代碼需要有專門的解釋器,在程序運行時,除要給用戶程序本身分配內存空間外,解釋器也佔用系統資源,所以其運行速度較慢。另外,也很難達到像C、C++那樣操作系統底層操作的目的。
解釋型語言常用於,一是對運行速度要求不高(如一些網頁腳本等)的場合,二是對跨平台(操作系統的兼容性)有要求的場合。
(6)編譯原理可以用c寫解釋器嗎擴展閱讀
1、Python和Java語言,專門有一個解釋器能夠直接執行Python程序,每個語句都是執行的時候才翻譯。
2、Python代碼在運行前,會先編譯成中間代碼,每個 .py 文件將被換轉成pyc 文件,pyc 就是一種位元組碼文件,它是與平台無關的中間代碼。不管放在 Windows 還是 Linux 平台都可以執行,運行時將由虛擬機逐行把位元組碼翻譯成目標代碼。
7. c++ 解釋器與編譯程序
解釋語言是解釋執行,編譯語言是編譯後執行。這個大部分書記中對這2中語言 的描述。
簡單解釋一下(個人理解):
解釋語言也可以成為腳本語言,代碼編寫後可以直接在代碼解釋器上執行(不是編輯器,編輯器調用了解釋器才可以執行代碼)。解釋器也就是執行代碼需要的運行環境,比如執行Java代碼就需要jvm。
編譯語言是需要編譯後才可以執行的語言,代表語言——C語言。編寫完代碼後需要編譯才可以運行。編譯後的文件不一定就是exe文件,exe文件只是window系統上的一種可執行文件。
解釋語言和編譯語言最大的區別就在於編寫完的代碼是否需要編譯後才能執行。所謂編譯,就算編寫代碼的優化、調整。具體可以參考《編譯原理》這本書。經過編譯後的代碼具有更高的執行效率(編譯過程計算機會將你寫的代碼極度優化,包括更改變數名、刪除注釋、刪除無用變數、運算符的替換……)經過編譯後的文件因為更改了很多的內容所以反編譯成原始代碼的時候已經面目全非了。而解釋語言不同,解釋語言沒有編譯過程(執行效率全看程序員個人水平和解釋器的速度)只是將代碼轉化為標準的二進制代碼(比如Java)可以將轉化後的代碼轉化回原來的代碼只是少了注釋。
目前開發語言中編譯類的語言使用率在下降,但是效率的優勢,編譯類的語言依然占據很大市場。
8. 請問編譯原理的詞法分析用C語言編寫的演算法是怎樣的
ε只能出現在NFA中,當然不是為了方便直觀,而是連通NFA和DFA的橋梁。編譯原理講授的不是如何繪制NFA或者DFA,二是告訴讀者怎樣能夠自動實現NFA或DFA的構造。在實際應用中ε可以幫助計算機轉換NFA為DFA,而在屬性文法和語法制導階段,它也是溝通綜合屬性與繼承屬性、執行語義動作不可或缺的一部分。另外ε的使用可以大大簡化文法產生式的構造難度。我記得最初使用ε是為了使得文法體系(字母表)更加完善,但是在實際應用中卻變得應用廣泛(此觀點不一定正確)。 最後想說的是,在編譯中,ε也帶來了不小的麻煩,否則也就不會有諸如「去空產生式」這樣的演算法了:)
採納哦
9. 編譯原理里,什麼是源語言,什麼是目標語言,什麼是翻譯器,什麼是編譯器,什麼是解釋器,什麼是T形圖
在vc 將c/c++代碼翻譯成asm文件的過程中
c/c++ 是源語言 asm是目標語言 vc是翻譯器
vc將asm在編譯成 obj文件 最後於庫文件鏈接成 二進制文件 vc就是編譯器
java中 需要跑一個 java虛擬機 比如 sun的 java.exe java.exe就是解釋器
c語言 a機器 c語言 b機器 C語言 b機器
a機器 c語言 a機器
圖a 圖b 圖c
在上圖中,圖(a)為已有的編譯程序,圖(c)為需要得到的編譯程序,圖(b)為需要書寫的編譯程序,只要我們把(b)在(a)上編譯就可得到(c)
打個比方
編譯器a是已有的在intel主機上將c語言翻譯成可在intel主機上運行的編譯器 我們希望得到在intel機器上運行的將c語言翻譯成可在蘋果主機上運行的編譯器c 那麼我們只需要用c語言寫一個將c語言翻譯成可在蘋果主機上運行的編譯器b, 在編譯器a上編譯c語言寫的編譯器b 就可以得到編譯器c
10. 我想自己用C/C++做一個腳本語言解釋器,但是不知道需要什麼知識
對於腳本解釋的,只是調用了系統的api吧,應該是這樣子,你自己用程序寫,然後調用系統api,然後獲取返回內容就行了
比如普通的命令,,復制,你可以定義成其他名字,調用的api或者是直接用cmd下可以用的命令直接用至於讀取你的程序執行內容,那根讀取文本一樣!