1. 怎样去写一个编译器(用C语言写C语言编译器),需要哪些知识做
写编译器重点就是设计并实现一些数据结构和算法,语言特点太多的话,代码写起来不容易,建议你找一个小语言尝试下,不要一开始就去尝试成熟语言。否则你会在写完语法分析程序以后,遭遇到很大的困难。多数人都是在写语义分析程序的时候,突然发现自己设计的数据结构很烂,后边越写越要命。
如果你想入门编译器的话,那么可以看《编译原理与实践》,整本书先将编译器理论,然后后边教你一步步实现c-miuns(c的子集)的编译器,包括lex,yacc,都在几千行代码左右。这本书讲的比较简单易懂一点
也可以学学斯坦福大学的编译器设计公开课(aiken设计了一个叫cool的语言,专门用来教人写编译器),课程地址上面有人给了:Compilers。这门课以前有个实验环境(据说已经给了,我以前写的时候还是用的网上一个不完整的实验环境),把和编译器知识无关的内容都给你写好了,你只需要在固定的地方填上你的内容就可以写出你的编译器(不要觉得很简单哦,人家的代码写的很精巧的,读完就发现写个好编译器还是很费脑子的),另外,这个实验环境有个特点,就是在每一步都提供标准程序做对比,你可以在写完一部分以后就同标准程序对比,及时发现错误。这种方式为写编译器又提供了很多帮助
先找个小的,慢慢研究,弄懂了整体的结构再说
2. 汇编语言编译器是怎么编写的
编译器自举!搜索这个关键字
程序都是编译器编译的。这个是肯定的
至于第一款X语言编译器是不是直接1010101010自己写的那就不知道啦
一般开发编译器的话。有两条路选择
1.利用yacc(或者其变种)&lex(词法分析)-等工具自己生成语法模板
词法语法都可以使用这些工具自己生成
然后自己编写生成的中间码和生成的机器码就可以了
一般做编译原理类似试验都是如此的。许多编译器也的确是这样
2.自己写词法分析和语法分析。可以参考一些开源的编译器
lcc-这个是ANSI C99标准的编译器是开源的
或者nasm,watcom等编译器到上不少开源的编译器
总的来说。高级语言编译器比较难写
如果想快速写出一个的话
可以采用第一种做法。利用工具生成语法词法模板
先写一个简单的汇编编译器比较简单
开源的有nasm,jwasm(支持masm语法开源的编译器)
fasm(这款编译器是自举的.就是自己可以编译自己),
patible object format的错误警告,需要在通过重新设定Module的triple,我的PC的getTargetTriple的结果是“i686-pc-windows-msvc”,直接在后面再加上“-elf”即可
TheModule->setTargetTriple("i686-pc-windows-msvc-elf");
2. LLVM不支持windows下通过动态链接导出函数,如果需要使用C/C++的函数,需要通过addSymbol进行注册
llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);
3. Kaleidoscope里使用的JIT的查找函数的API,getPointerToFunction已经被弃用了,需要替换为getFunctionAddress
4. 编写一个操作系统,应该先编写一个编译器
可以用C编写也可以用别的语言编写。
我在解释下吧,```看样子我没解释的详细。最原始的C语言编译器估计是用汇编语言写的,而汇编器估计是用机器码强写的,而机器码的规则是设计CPU架构的人规定的。而所有的理论基础,你就带仔细查看50,60年代的大牛了,图灵,冯诺依曼,knuth……之类的人给出理论上的证明和可行性,编译器的设计在knuth给出了LR(K)算法后才开始有了质的飞跃。
而现在的编译器实现的就简单了,你可以用C语言在写一个C编译器,来编译C程序,也可以写C++编译器来编译C++,假如你是用C写C编译器,那么这种貌似叫交叉编译`~~,大概就这样了。楼主真的想了解透彻自己去写个编译器就知道是怎么回事了
5. 如何利用LLVM写一个编译器
书籍请参考编译原理的龙书,以及flex,bison,llvm的manual。
如何写我可以给你一个大致的流程, 编译器由词法分析器->语法分析器->中间代码生成器->后端组成。 用C语言写编译器一般可以按照以下步骤: 1.使用flex生成词法分析器。
(flex可以通过自己编写的描述文件来自动生成词法分析器) 2.使用bison生成语法分析器。(bison可以通过自己编写的描述文件来自动生成语法分析器) 3.通过语法分析器得到输入代码的语法树表示。
4.编写遍历函数遍历语法树生成中间代码。(这里推荐使用LLVM的中间代码表示) 5.利用LLVM工具集来编译执行所得到的中间代码。