當前位置:首頁 » 編程軟體 » 編寫編譯器

編寫編譯器

發布時間: 2022-01-10 13:56:10

㈠ 自己寫編譯器怎麼寫,我想為中國程序員做個編譯C語言的編譯器。

首先做這個東西的意義並不大,如果是想學習的話,看看這本書Modern Compiler by Andrew W. Appel

㈡ 編譯器的實現

.begin
.org 2048
main: ld [a],%r1
!if (a==2)
subcc %r1,2,%r0
bne else
sll %r1,2,%r1
ba done
!false c=a/2
else: srl %r1,1,%r1
done:st %r1,[c]
halt
a:2
c:0
.end

㈢ 如何寫一個簡單的編譯器

因為我這里都只寫了Parser,所以就只談談第一次寫Parser的建議。1.扔掉龍書虎書鯨魚書。這些書都有一個問題,就是在自己手寫完一個自己的Parser之前,書上寫的那些鬼東西完全都不知道該怎麼用,用在哪裡。2.大膽地擼。不要在意性能啊

㈣ 第一個 C 語言編譯器是用什麼語言編寫的

參考 Dennis M. Ritchie 寫的 The Development of the C Language:Chistory,C 語言誕生的基本過程就是 Ken Thomson 不滿意 BCPL,於是設計了 B 語言,並且用 BCPL 為 B 語言寫了一個編譯器,然後從這個編譯器開始自舉寫新的 B 語言編譯器。貝爾實驗室的眾人在 PDP-7 上用 B 語言寫了各種各樣的東西後又不滿意 B 語言了,於是 1971 年 DMR 開始在新買的 PDP-11 上用 B 給 B 寫擴展,稱之為 NB (new B,此處省略吐槽若干),擴展著擴展著離 B 的畫風越來越遠了,就取了一個新名字變成了一門新語言—— C 語言。 1973 年夏天他們用手頭的編譯器和語言給 PDP-11 重寫了一個 Unix Kernel。C 語言大約就是這個時期成型的。

所以,可以說第一個 C 語言的編譯器是用 B 語言,或者說是擴展過的 B 語言(NB)寫的。因為是一邊改進語言一邊用改進了的編譯器這樣滾雪球寫出來的,也可以看成是 C 語言寫的?畢竟 很難確定什麼時候 C 自己變成了一門新語言……

㈤ 如何編寫自己的編譯器

我暈,你們老師真NB,你學的什麼語言啊?是c嗎?上來就讓你做個編譯器,你們老師吃錯葯了吧?

我大學同學畢業設計才是做個編譯器,那會那倆人合作做的,還都是我們系公認的c最強的兩個,合作還做了半年,你認為大一剛上來就做這個?!

㈥ 匯編語言編譯器是怎麼編寫的

編譯器自舉!搜索這個關鍵字
程序都是編譯器編譯的。這個是肯定的
至於第一款X語言編譯器是不是直接1010101010自己寫的那就不知道啦

一般開發編譯器的話。有兩條路選擇
1.利用yacc(或者其變種)&lex(詞法分析)-等工具自己生成語法模板
詞法語法都可以使用這些工具自己生成
然後自己編寫生成的中間碼和生成的機器碼就可以了
一般做編譯原理類似試驗都是如此的。許多編譯器也的確是這樣

2.自己寫詞法分析和語法分析。可以參考一些開源的編譯器
lcc-這個是ANSI C99標準的編譯器是開源的
或者nasm,watcom等編譯器到www.sf.net上不少開源的編譯器

總的來說。高級語言編譯器比較難寫
如果想快速寫出一個的話
可以採用第一種做法。利用工具生成語法詞法模板
先寫一個簡單的匯編編譯器比較簡單
開源的有nasm,jwasm(支持masm語法開源的編譯器)
http://www.japheth.de/JWasm.html
fasm(這款編譯器是自舉的.就是自己可以編譯自己),
http://flatassembler.net/

剩下的就是自己做好語言規則關鍵字map
引用高手的話。語言map做好了你的編譯器也做好一半了
剩下的都是機械性的工作了。
生成x86或者arm指令。

優化工作這個很難解釋.根據你所需要的做吧
畢竟可以做出一個無錯,又XX的編譯器已經很難得

你可以選擇使用現有的編譯器開發自己的編譯器
然後等到你的編譯器支持相當數量指令和成熟度的時候
使用自己的語法重新寫一遍編譯器.
這樣你就可以用自己的編譯器開發自己的編譯器了(是不是很邪惡?)

另外舉幾個例子
Delphi的編譯器是C++ Builder開發的。
而C++ Builder的IDE是Delphi開發的
C++ Builder的編譯器是C++ Builder開發的-這個就是編譯器自舉了。。Delphi和C++ Builder共享一個後端化優化器。
Delphi 早期的版本的編譯器是tasm直接編譯的。可見Anders的匯編功力多強悍(Anders也就是後來VJ++,C#,.NET工程的核心架構師.最關鍵的靈魂級人物)

VC++的編譯器是VC++開發的。很明顯這都說明了編譯器自舉
自己開發自己。如果一個編譯器可以做到自己編譯自己。那基本上就可以實現任何功能了。

關於編譯器開發的書籍可以看一下
龍書《編譯原理(第二版)》
虎書《現代編譯原理-C語言描述》
鯨書《高級編譯器設計與實現》
建議從鯨書看起。然後是龍書
再來是虎書--虎書裡面描述了許多現代編譯器(正如其名)技術
例如面向對象啦,優化,垃圾回收等等.
鯨書看完基本上就可以實現一個簡單的Tiny C編譯器了
然後在龍書鞏固,讀一下語言規范,自己看一些開源的匯編編譯器代碼
自己就可以嘗試做一個匯編語言編譯器了.等到技術提高了
在嘗試做一些高級語法識別,參考LCC代碼做一下ANSI C99的
C語言編譯器。再來就看你自己的興趣和領悟度拉
如果想支持C++的話就得要對編譯器做許多方便的研究

類似Java那種跨平台或者Ruby,Python等動態語言
虎書中也有描述。當然看自己功力了

㈦ 如何自己實現一個編譯器

1、編譯器有很多種,每一種的使用方式不盡相同。常用編譯器:
Visual C++
GNU C++
Inter C++
Sun C++
clang
2、一般編譯過程:源文件→預處理→編譯→匯編→鏈接→可執行文件
下面以GCC示例:
預處理(Pre-Processing):根據預處理命令(#開頭)修改源文件
# gcc -o hello.i -E hello.c or # cpp -o hello.i hello.c
編譯(Compiling):語法檢查,並將源文件翻譯成匯編文件
# gcc -o hello.s -S hello.i or # cc1 -o hello.s hello.i
匯編(Assembling):將匯編文件轉換為目標文件(二進制)
# gcc -o hello.o -c hello.s or # as -o hello.o hello.s
鏈接(Linking):編址和符號鏈接,生成可執行文件
# gcc -o hello hello.o or # ld -o hello hello.o

㈧ 在編寫程序時要用到編譯器,什麼是編譯器有什麼用

VC Borland C Eclipse 都是編譯器 就是把你的源代碼 編譯 解釋成機器能讀懂的機器碼 因為機器內部是用二進制的嘛 所以最終也就是一串 1 0 組成的序列

㈨ C#編寫編譯器

幫你寫了一個,其實用一個字典就可以了,源碼在附件中。

核心代碼:

//-----------------------------------------------------------------------
//<rightfile="DictionaryHelper.cs"company="">
//TODO:Updaterighttext.
//</right>
//-----------------------------------------------------------------------

namespaceGreekDictionary
{
usingSystem.Collections.Generic;

///<summary>
///TODO:Updatesummary.
///</summary>
publicclassDictionaryHelper
{
publicDictionary<string,GreekLetter>Dictionary{get;set;}

publicDictionaryHelper()
{
this.Dictionary=newDictionary<string,GreekLetter>
{
{"alpha",newGreekLetter{Upper="Α",Lower="α",Phonetic="a:lf",English="alpha",Chinese="阿爾法"}},
{"beta",newGreekLetter{Upper="Β",Lower="β",Phonetic="bet",English="beta",Chinese="貝塔"}},
{"gamma",newGreekLetter{Upper="Γ",Lower="γ",Phonetic="ga:m",English="gamma",Chinese="伽馬"}},
{"delta",newGreekLetter{Upper="Δ",Lower="δ",Phonetic="delt",English="delta",Chinese="德爾塔"}},
{"epsilon",newGreekLetter{Upper="Ε",Lower="ε",Phonetic="ep`silon",English="epsilon",Chinese="伊普西龍"}},
{"zeta",newGreekLetter{Upper="Ζ",Lower="ζ",Phonetic="zat",English="zeta",Chinese="截塔"}},
{"eta",newGreekLetter{Upper="Η",Lower="η",Phonetic="eit",English="eta",Chinese="艾塔"}},
{"thet",newGreekLetter{Upper="Θ",Lower="θ",Phonetic="θit",English="thet",Chinese="西塔"}},
{"iot",newGreekLetter{Upper="Ι",Lower="ι",Phonetic="aiot",English="iot",Chinese="約塔"}},
{"kappa",newGreekLetter{Upper="Κ",Lower="κ",Phonetic="kap",English="kappa",Chinese="卡帕"}},
{"lambda",newGreekLetter{Upper="∧",Lower="λ",Phonetic="lambd",English="lambda",Chinese="蘭布達"}},
{"mu",newGreekLetter{Upper="Μ",Lower="μ",Phonetic="mju",English="mu",Chinese="繆"}},
{"nu",newGreekLetter{Upper="Ν",Lower="ν",Phonetic="nju",English="nu",Chinese="紐"}},
{"xi",newGreekLetter{Upper="Ξ",Lower="ξ",Phonetic="ksi",English="xi",Chinese="克西"}},
{"omicron",newGreekLetter{Upper="Ο",Lower="ο",Phonetic="omik`ron",English="omicron",Chinese="奧密克戎"}},
{"pi",newGreekLetter{Upper="∏",Lower="π",Phonetic="pai",English="pi",Chinese="派"}},
{"rho",newGreekLetter{Upper="Ρ",Lower="ρ",Phonetic="rou",English="rho",Chinese="肉"}},
{"sigma",newGreekLetter{Upper="∑",Lower="σ",Phonetic="`sigma",English="sigma",Chinese="西格馬"}},
{"tau",newGreekLetter{Upper="Τ",Lower="τ",Phonetic="tau",English="tau",Chinese="套"}},
{"upsilon",newGreekLetter{Upper="Υ",Lower="υ",Phonetic="jup`silon",English="upsilon",Chinese="宇普西龍"}},
{"phi",newGreekLetter{Upper="Φ",Lower="φ",Phonetic="fai",English="phi",Chinese="佛愛"}},
{"chi",newGreekLetter{Upper="Χ",Lower="χ",Phonetic="phai",English="chi",Chinese="凱"}},
{"psi",newGreekLetter{Upper="Ψ",Lower="ψ",Phonetic="psai",English="psi",Chinese="普西"}},
{"omega",newGreekLetter{Upper="Ω",Lower="ω",Phonetic="o`miga",English="omega",Chinese="歐米伽"}}
};
}
}
}

調用代碼:

namespaceGreekDictionary
{
usingSystem;
usingSystem.Windows.Forms;
:Form
{
;

privateconststringNoResult="There'.";

publicGreekDictionary()
{
InitializeComponent();
this.helper=newDictionaryHelper();
}

privatevoidbuttonTranslate_Click(objectsender,EventArgse)
{
varenglish=this.textBoxEnglish.Text;
try
{
vargreek=this.helper.Dictionary[english];
this.textBoxGreek.Text=greek.ToString();
}
catch(Exception)
{

this.textBoxGreek.Text=NoResult;
}
}
}
}

截圖:

熱點內容
單片機android 發布:2024-09-20 09:07:24 瀏覽:765
如何提高三星a7安卓版本 發布:2024-09-20 08:42:35 瀏覽:664
如何更換伺服器網站 發布:2024-09-20 08:42:34 瀏覽:311
子彈演算法 發布:2024-09-20 08:41:55 瀏覽:289
手機版網易我的世界伺服器推薦 發布:2024-09-20 08:41:52 瀏覽:817
安卓x7怎麼邊打游戲邊看視頻 發布:2024-09-20 08:41:52 瀏覽:162
sql資料庫安全 發布:2024-09-20 08:31:32 瀏覽:94
蘋果連接id伺服器出錯是怎麼回事 發布:2024-09-20 08:01:07 瀏覽:507
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:658
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:481