编译器

七天LLVM零基础入门(Linux版本)------第三天

馋奶兔 提交于 2019-12-05 13:53:51
作者: snsn1984 第二天的任务中的LLVM IR的文档( http://llvm.org/docs/LangRef.html ) 对于初学者来说,看起来一定很费劲,内容繁杂,找不到头绪,看了后边的忘记了前面的,这些都是很正常的。但是,这里需要注意的是,不管多烦躁,一定要硬着 头皮先把这个文档通读一遍,在读的同时,可以自己写一个小程序,根据前面学习的使用clang的命令将该程序转换成.ll格式的,然后在阅读文档的同时, 对照.ll格式的文件,去实际的看一看,到底说的是什么样的东西,然后这样才能加深印象,才能让阅读文档变得不那么艰难。 下面开始今天的学习任务: 第一步:复习LLVM IR的文档( http://llvm.org/docs/LangRef.html ) 复习该文档的时候,略微有些侧重点,就是该文档从开始的部分,一直到 http://llvm.org/docs/LangRef.html#other-values 这个部分之前,都要仔细复习一遍。后面的内容,大致的过一遍,以后要用到的时候,可以找到地方就行。 第二步:阅读文档 ( http://llvm.org/docs/ProgrammersManual.html ) 这个文档从名字就可以看出来是干什么用的,这个就是LLVM的编程指引,相对来说这个文档没那么长,但是里面的东西很重要,希望在阅读的过程中 认真阅读。同时

七天LLVM零基础入门(Linux版本)------第二天

混江龙づ霸主 提交于 2019-12-04 17:04:09
作者: snsn1984 在第一天的时候,我们简单了解了llvm和clang。今天我们继续对LLVM进行学习。 第一步:学会如何查找LLVM的文档 LLVM的文档很多,也很全面,是开源软件中文档比较全面并且比较细致的,这是很难得的一个事情。所以只要和LLVM打交道,就一定要学会并且善于去使用这些LLVM的文档。 因为LLVM文档比较多,初学者可能不太容易搞清楚,我之前写过一个关于LLVM的文档的博文,可以参考: http://blog.csdn.net/snsn1984/article/details/8165529 这个博文把文档的地址和文档的分类进行了简单介绍。 第二步:熟悉LLVM的IR IR是 intermediate representation 的缩写,顾名思义是中间表示的的缩写。中间表示已经被越来越多的编译器所采用,传统的编译器多采用汇编语言作为自己的中间语言,而现在大一些的编译器都有了自己专属的中间表示。LLVM IR的官方文档地址: http://llvm.org/docs/LangRef.html 简要介绍可参加我之前的博文: http://blog.csdn.net/snsn1984/article/details/8037414 LLVM IR是整个LLVM框架中极其重要的一部分,一般与LLVM相关的项目都无法避开LLVM IR这个部分

七天LLVM零基础入门(Linux版本)------第五天

我是研究僧i 提交于 2019-12-04 17:03:55
作者: snsn1984 第一步:复习文档 Write an LLVM pass http://llvm.org/docs/WritingAnLLVMPass.html 第二步:阅读LLVM编程规范 http://llvm.org/docs/CodingStandards.html 编程规范是编程中需要注意的基础点,代码风格符合不符合规范,将会直接影响整个代码的可读性和代码质量。 所以一定要认真阅读,并且在自己编写代码的过程中要遵守规范。最容易犯错误的两点就是缩进和空格。不同 的编程规范的缩进是不同的,但是对TAB的限制是大多数规范都有的。任何不是必须的空格,都是不应该出现 的。 第三步:参照LLVM编程规范写Pass例子 编写一个Pass,删除掉程序中所有的没有使用的指令。比如: %2 = add i32 %1, 1; %3 = add i32 %2, 1; ret; 那么因为%3并没有被使用,所以指令%3 = add i32 %2, 1; 就可以被删除了,删除之后,如果%2没有别的地方使用, 那么这条语句也可以删除掉了。依次循环下去,最后得到的是一个没有无用的代码的程序。 延伸阅读: http://en.wikipedia.org/wiki/Dead_code_elimination ------------------------------------------

七天LLVM零基础入门(Linux版本)------第六天

天涯浪子 提交于 2019-12-04 17:03:42
作者: snsn1984 第一步:对优化代码的pass继续进行深入的分析 首先检查一下第五天中的Pass练习,什么情况下可以进行优化,什么情况下不可以进行优化。 可以参照系统自带的Pass: http://llvm.org/docs/doxygen/html/DCE_8cpp_source.html 需要将判断是否需要优化的主要函数 isInstructionTriviallyDead (I, TLI) 进行深入的分析。函数的具体内容位置: http://llvm.org/docs/doxygen/html/Local_8cpp_source.html#l00269 将第五天要求的pass进一步进行完善。 第二步:学习LLVM Test 参照LLVM文档: http://llvm.org/docs/TestingGuide.html 此处需要注意的是,在llvm的build目录下,在已经运行make成功的情况下,直接进行make check,可以运行llvm 自带的所有测试。 此处可参考我的一个博文: http://blog.csdn.net/snsn1984/article/details/8617068 第三步:写一个测试用例 写一个测试程序输出的测试用例。 可以测试最简单的hello world程序,测试该程序的输出的是不是程序本身期望输出的“hello world”。

七天LLVM零基础入门(Linux版本)------第七天

断了今生、忘了曾经 提交于 2019-12-04 17:03:32
作者: snsn1984 这是这一次零基础入门的最后一天,这次的主要任务是实战一个Pass。 任务描述: 实现一个Pass,该Pass可以读取一个程序中所有的for循环的循环头的名字并输出。 同时,实现一个测试用例去测试输出的结果是否正确。该Pass的输入应该包含嵌套 循环。 提示: An llvm::FunctionPass using llvm::LoopInfo LoopInfo &LI=getAnalysis<LoopInfo>() //In runOnFunction getAnalysisUsage(AnalysisUsage &AU) //In structure std::vector<Loop*> workList(LI.begin(), LI.end()); 在这个任务完成之后,应该已经达到可以达到可以分析和实现LLVM的Pass,查找和 分析LLVM的源码,查找需要使用的文档,并且可以知道下一步该如何自己学习LLVM。 -------------------------------------转载请注明出处---------------------------------------------------- 来源: oschina 链接: https://my.oschina.net/u/860439/blog/110810

详解C中volatile关键字

为君一笑 提交于 2019-12-03 23:43:00
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: short flag; void test() { do1(); while(flag==0); do2(); } 这段程序等待内存变量flag的值变为1(怀疑此处是0,有点疑问,)之后才运行do2()。变量flag的值由别的程序更改,这个程序可能是某个硬件中断服务程序。例如:如果某个按钮按下的话,就会对DSP产生中断,在按键中断程序中修改flag为1,这样上面的程序就能够得以继续运行。但是,编译器并不知道flag的值会被别的程序修改,因此在它进行优化的时候,可能会把flag的值先读入某个寄存器,然后等待那个寄存器变为1。如果不幸进行了这样的优化,那么while循环就变成了死循环,因为寄存器的内容不可能被中断服务程序修改。为了让程序每次都读取真正flag变量的值,就需要定义为如下形式: volatile short flag; 需要注意的是,没有volatile也可能能正常运行

实现接口时@Override注解问题

↘锁芯ラ 提交于 2019-12-03 15:25:47
用IntelliJ 15打开一个以前的工程,发现代码出现很多关于@Override的错误,编辑器提示:“ @Override is not allowed when implementing interface method”,怎么会这样子?看来@Override是个有故事的家伙,呵呵!   先来上张图吧!看看到底是什么样子的错误。   下面我们来分析一下该问题。我们都知道@Override从jdk1.5开始出现的,是用来标注方法重写的。通常方法重写发生在继承父类,重写父类方法,或者实现接口,实现接口方法。@Override能够保证你正确重写方法,当你重写方法出错时,比如方法名误写,或者漏掉参数,编译器会提示编译错误。   出现以上问题,则跟编译器版本问题有关。编译器1.5只支持@Override注释重写父类方法,不支持实现接口方法。而我的IDE默认使用jdk1.5的编译器。   我们只需要将language level设置高于jdk1.5版本即可,因为我机器安装的是jdk1.7,所以我将language level设置为:jdk1.7,问题解决。   IntelliJ设置方法:菜单File → Project Structure → Project Language Level   Eclipse设置方法:菜单Windows->Preferences-->java-

惊艳的Open WATCOM C/C++

好久不见. 提交于 2019-12-03 08:46:48
成立于1981年的WATCOM公司于1988年推出PC版的C语言编译器,或许是专心研究的缘故, Watcom C/C++是以在DOS下能够产生最佳化程序代码闻名于世的,许多写游戏和DOS Extender的厂商都指名要使用Watcom C/C++,因为不论是Borland C/C++还是Visual C/C++,它们产生的最佳化程序代码都比Watcom C/C++的最佳化程序代码差上一截。再加上当时最有名的DOS Extender厂商PharLap公司也是使用Watcom C/C++,因此Watcom C/C++在专业的C/C++程序员以及系统程序员心中是第一品牌的C/C++开发工具。 然而,惨烈的C/C++编译器四国圣战,WATCOM C++还有 Symantec C/C++,Broland C/C++最终不敌Microsoft C/C++,(这并不是由于编译器的原因,个中原由,大家可以去看一下台湾著名程序员 李维的《C/C++ 圣战》。)卖掉的卖掉,转行的转行,如今, Symantec 早就不搞C/C++了,诺顿就是Symantec的品牌,WATCOM被Sybase收购后, 开发了 Optima++, 据说当时看来是非常不错的开发工具,能够直接拖拽控件,当时Sybase终究不是个有眼光的公司,1.5开发后就放弃了,当然这时期的编译器还是叫WATCOM,直到1999前年

25行代码实现一个简单的编译器

我与影子孤独终老i 提交于 2019-12-01 12:16:36
起因 《 25行JavaScript语句实现一个简单的编译器 》实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码。java 8提供了函数式编程的支持,昨晚脑子抽风突然兴趣java也可以实现一个如此简单的编译器! java和js语言差异 java相对js这类胶水语言来说还是相对啰嗦的,一些动态语言的特性在java里并不具备。《 25行JavaScript语句实现一个简单的编译器 》的作者是个js高手js用得溜溜的,下面说说他用到js里有而java没有的功能。 js 字符串模板 他在Transpiler中使用ES2015新增的模板字符串功能。 `(${ast.expr.map(transpileNode).join(' ' + opMap[ast.val] + ' ')})`; js内置 map和简单的赋值语法 const node = { val: consume(), type: Op, expr: [] }; 其他胶水语言的话对应的是tuple,java要实现的话还真啰嗦不少。 模式匹配 (实际这是js的map啊啊啊) const opAcMap = { 'sum': args => args.reduce((a, b) => a + b, 0), 'sub': args => args.reduce((a, b) => a - b), 'div':

计算机的革命----编译器体系的战争<二>-----集团军的危险信号

痴心易碎 提交于 2019-11-30 20:27:53
Symantec C/C++ 已经不见踪影,Symantec现在专心做他的安全软件,诺顿杀毒软件,还有一些其他的,Boland C/C++最后还是被收购了,现在的RAD C++ Builder混的一直不愠不火,WATCOM 被Sybase败落后终于开源了,现在是Open WATCOM 1.9,Open WATCOM 2.0正在构建中,前几日我还编译了 2.0Beta1 现在呢,Microsoft C/C++也还不错,代码质量什么的也很好,在微软的内部,C/C++的压力也不小,.NET托管的还有C# Visual Basic F#这些都在争取微软的资源,微软也曾经推出过C/C++编译器的研究项目 Phoenix,现在呢,是推出Roslyn,C#,Visual Basic的编译器项目,WPF直到Visual Studio 11才在Windows 8上正式支持C/C++构建,以往,如果不是自己设置,C/C++代码不用C/CLR是无法支持的,当然就算WPF支持也要C/CLR。不过,在Windows平台上,最佳C/C++应用开发Visual C/C++是最佳选择,前提是你有足够的钱支付软件授权费用。GCC在Windows上有两个著名的移植版本一个是cygwin,也就是windows 上模拟Linux,一般而言开发基于Windows的程序不太建议,因为这样的程序还要调用cygwin库