西西河

主题:【原创】语言编译器等请教 -- 中国农民

共:💬62 🌺30
全看树展主题 · 分页首页 上页
/ 5
下页 末页
家园 【原创】语言编译器等请教

高级语言编完程后需要编译器等工具把变成机器语言,才能由CPU执行,比如JAVA语言编完程后需要JAVA Editor将起转换成机器语言。这个编译器是由什么语言做出来的?怎么做?能否请方家尽可能详细地介绍一下?多谢了。

家园 你是问compiler是用什么写的么?

原理上什么语言都可以,实际上用C写的比较多些。

另外Java有点不同,Java源码编译产生后的代码不是“真正”的机器码,要通过虚拟机来执行。这个执行的过程类似于解释语言。

家园

因为不是学计算机,始终搞不清楚。我知道SAP是用ABAP写的,ABAP的COMPILER也是用C写的吗?C自己的COMPILER呢?

家园 呵呵,大多数现代C语言的编译器也是C写的

是不是有点鸡生蛋的味道...

家园 当然,第一个是机器码敲出来的

我没去翻这段历史,不过最早的C编译器,至少在内核部分是汇编语言。

家园 彻底糊涂了

感觉是自己把自己生下来。能否介绍一下?或者推荐几本书?老农虽然不是学计算机的,却对这个感兴趣。写这个和编程本身比,哪一个更难?

家园 这个。。。

编译原理在计算机系是高年级课程,有些东西还是要有其他课打基础的。直接上手有点难度。

我上大学用的陈火旺、钱家骅、孙永强的教材,觉得不太适合初学者。国外似乎此类教材也很多,不过没怎么看过,所以也不好评价。

家园 另外

如果你对写自己的编译器感兴趣,现在已经不需要从最基本的开始自己写了。有现成的编译器生成工具LEX和YACC

家园 是啊

老农是学自动化出身,对计算机是二把刀。不过非常想拥有自己的编译器。如何下手?

是啊
家园 天...

为何要有自己的编译器?这种东西有现成的用就很好了。

家园 最早的汇编当然也是机器码搞出来的

哈哈,所有的祖宗都是机器码。

是啊
家园 呵呵,

不知道老兄是否经常写汇编代码,如果不经常的话,写几个要是还有兴趣,那就找本书仔细读读。例如最简单的,用一个支持N位的加减乘除写一个支持2N位的加减乘除,看看是否还有兴趣。

家园 N多N多年前

我写过一个小编译器,完全是用C语言搞定。原来是准备用UNIX下的YACC来搞的,但是不符合导师的意思,他要一个可以给计算机系的高年级的学编译的学生演示编译器全工作过程的系统,还要每一步都可以拆开,这样在给学生指定PROJECT的时候,就可以要求他们去实现那个被抽掉的功能。

我们用的最早的C编译器有CC1,CC2,LINK等过程,我觉得按照这个路子走不错,依次进行语法、语义的分析,然后转化成一个类似汇编语言的中间代码,最后一步是把这个中间语言对应到相应机器的汇编语言,对PC机而言,就是宏汇编,然后用微软的MASM汇编编译器来编译就可以运行了。

家园 很酷啊,多讲讲。你的编译器进去的是什么语言?

要能把你用到的数据结构、算法什么的都给大家过一遍就好了。

家园 自己定义的一个语言

文法类似于C,但是没有C那么灵活,不然我的编译器就太复杂了,那不是拿起石头砸自己的脚嘛!但是也没有PASCAL 那么严格,最基本的功能都有了,IF..THEN..ELSE判断语句,WHILE, DO...WHILE, FOR 循环,调用子程序包括了CALL BY REFERENCE和 CALL BY VALUE等等,反正,对于学习编译是足够了。

其实我自己觉得最有意思的是语义分析部分,最后发现最简单的堆栈就蛮好用的。最简单的,如果没有括号这样的比较复杂一点的优先级的话,比如

X=A+B;

根据第一轮的扫描,我们知道有X,=, A,+,B,;这样几个TOKEN, 发现第一个算符,比如=,就先压进算符堆栈,再后面扫描到了加法,先把+号压进堆栈,等到发现B后面没有更高级别的计算了(比如乘除法运算),就弹出这个+算符,然后从另外一个算子堆栈里弹出两个算子A和B,这样就生成了一句类似汇编的中间语言,就像这样

ADD A,B

MOV AX,X

把变量A和B相加,结果在寄存器AX里面,然后把这个值移到变量X里面。

当然,真正的算法远比这个复杂多了,十多年了,细节记得不是太清楚,不过大概的意思就是这样的。

全看树展主题 · 分页首页 上页
/ 5
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河