当前位置:首页 » 编程软件 » 编写编译器

编写编译器

发布时间: 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;
}
}
}
}

截图:

热点内容
服务器如何搭建多个ip 发布:2024-11-15 19:42:10 浏览:102
价钱低高配置的有哪些车 发布:2024-11-15 19:34:53 浏览:380
androidgps定位开发 发布:2024-11-15 19:34:52 浏览:334
如何扫码添加服务器地址 发布:2024-11-15 19:31:48 浏览:278
sql语句复制数据库 发布:2024-11-15 19:28:02 浏览:837
算法的薪资 发布:2024-11-15 19:15:22 浏览:322
ubuntu可以重新编译吗 发布:2024-11-15 19:09:10 浏览:649
access数据库表的创建 发布:2024-11-15 18:51:18 浏览:141
怎么搭建信令服务器 发布:2024-11-15 18:48:03 浏览:578
如何解锁安卓手机锁屏图 发布:2024-11-15 18:47:48 浏览:966