分享

如何利用LLVM写一个编译器

 quasiceo 2016-12-21
LLVM有自己的教程,如果你只想做个玩具,那可以首先试着实现LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,请看他的文档http://llvm.org/docs/

Kaleidoscope是一个范式简单的脚本语言,教程里的词法,语法分析都是手写的,基本流程就是词法语法解析,利用LLVM的API生成中间代码并执行。

我用visual studio编译的LLVM(version 3.6)实现过Kaleidoscope,我遇到的坑不少,如果你想以visual studio编译的LLVM实现Kaleidoscope,你可能同样会遇到

1. LLVM的生成目标对象为ELF格式,在windows下使用JIT的API时会出现incompatible 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




[1] LLVM Developers Mailing List
[2] LLVM IR和C/C++函数相互调用时的注意事项
[3] [LLVMdev] An enhancement for MCJIT::getFunctionAddress
感谢,google多次之后没想到在你这里找到了问题的解决方案。
请问去哪里可以找到中文版的llvm教程?谢谢,我想创造一门全中文的编程语言,也就是汉语编程.然后再用汉语编程语言创造一个llvm的汉化版.然后再开源发展,让更多的志同道合之人参与,发展汉语编程,丰富汉编世界.不过,这样看起来就像是一个递归.我的目标就是自然语言编程,也就是在编译器之前再加一道翻译,这一道翻译就是将自然语言编译为高级程序语言.或许一道还不够,还得再加一道.毕竟自然语言复杂多了.然后就是创造一个音频库,音频库到自然语言之间还得创造一个编译器.这样只要对着电脑麦克风说话,计算机就能识别人的意思了.哈哈,虽然思路简单,但是没有个趁手的工具真是举步维艰啊.
更多回答
35
1. 词法分析器(读取字符流,产生Token流) 2. 语法分析器(读取Token流,产生/Statement AST) 3. CodeGen(读取AST,利用LLVM API产生中间代码LLVM IR) 4. LLVM Backend(读取LLVM IR,产生可执行的目标文件) 而这里还有语义分析/类型系统等没… 显示全部

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多