技术资讯
制作简易的编译器-从无到有
2018-06-27
 制作简单的编译器需要怎么做?怎样从无做到有?跟着我的教学走,你会觉得很简单   编译原理是计算机专业大三或者大四的必修课程之一,许多学员都会对学生提出硬性或者软性的制作简易编译器的要求。许多学生手足无措,别急,学长也是过来人,看完这个教程,保证你轻轻松松完成属于你自己的编译器。   首先第一篇教程不会涉及具体的实现。在这种大工程之前,正确的模块划分是极为重要的。这样可以让你阶段性地看到自己的成果,对于自信心是一个极大的帮助;此外,正确的模块划分有助于后期排除错误。   在此之前也介绍一下工作量。如果完全自己手撕一个编译器,其工作量可能和手撕一个CPU(用verilog)工作量差不多,大概会耗时一个月左右,不过如果只是交一个作业,完全不用全部自己完成。特别是语义分析这种工作,有大量现成的代码稍加修改就可以直接使用(当然,严格意义上来讲,所有部分都可以稍加修改直接使用)。   我们将编译器制作分为以下四个模块分块实现完成:   一、语法分析、词法分析模块(yacc、lex)   yacc、lex是linux环境下的语法生成器和词法生成器,使用非常广泛。一般情况下老师也比较鼓励学生去用yacc和lex去完成这样的实验。需要说明的是,在现存的linux操作系统中,yacc和lex已经发生了变异。我们所采用的是ubuntu环境下的bison和flex。   二、语义分析(C语言)   语义分析是在词法分析语法分析结束,生成了语法树的基础上,对语法树进行遍历,建表,查错。   三、中间代码生成(C语言)   这一部分就是在语义分析的基础上,生成三元式、四元式之类的。   四、目标代码生成(C语言)   这一步就实现了从某种语言(你制定的语言)到MIPS代码的转换。有人说我不要MIPS,我要x86的,没问题,从中间引入llvm即可   跟着我的教程走,学到哪里,编译器做到哪里;做到哪里,作业交到哪里。即使你只做了语法分析、词法分析,你也可以交一个语法生成树,就是这么简单、这么人性化。看到这里,如果符合你的要求,follow me;不符合的话,可以去看看其他的教程。
查看更多→
编译器的种类有哪些?
2018-06-25
 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。   处理器   作用是通过代入预定义等程序段将源程序补充完整。   前端   前端主要负责解析(parse)输入的源代码,由语法分析器和语意分析器协同工作。语法分析器负责把源代码中的‘单词’(Token)找出来,语意分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 例如“a = b + c;”前端语法分析器看到的是“a, =, b , +, c;”,语意分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。 前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在此基础上进一步优化,处理。   后端   编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。   一般说来所有的编译器分析,优化,变型都可以分成两大类: 函数内(intraprocedural)还是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。
查看更多→
Arm编译器
2018-06-22
 Arm RVDS4.1中的Arm编译器是唯一一个与Arm编译器联合开发的商用编译器, 专门设计用于为Arm编译器架构程序并提供最优支持。该编译译器的开发历经有20年左右,被公认为是业界标准C和C++编译器,用于生成面向向Arm、 Thumb、 Thumb-2、VP和NEON指令集的的应用程序。     Arm编译器设计用于以最佳方式执行Arm编译器生成的代码     Arm编译器支持所有Arm处理器中的新增器功能。     基于分析驱动的编译器将自动在运行时优化代码并提供信息。     Ar皿编译器支持生成 Symbian OS和 Arm Linux应用程序及库,RVDS4.1编译器与RVDS4.0相比,最佳代码大小减少了多达6%,并使最佳性能提高了10-20%。     除了Arm编译器之外,先进的NEON矢量化Arm编译器(RVDS专业版的一部分)支持从标准的的C和C++代码自动生成成 Arm NEON SITⅧD代码序列。NEON矢量化Arm编译器可使关键多媒体内核的速度提高4倍,最终使整个应用程序性能提高到2倍。     Ar皿编译器     针对成本极为敏感型设各的开发:     为进一步提高基于Arm编译器的一系列应用程序的代码密度,Arm编译器特别提供了一个可选的 microlib C库(ISO标准C运行时库的子集),该库的大小已针对微控制器成用进行了最小化。 microlib C库的运行时库代码大小締减了90%。     Cortex-M与Arm编译器结合使用时, microlib C库提供完全基于C语言的开发环境,而不必还原为汇编语言-即便对中断服务例程也是如此。这样就无需具体了解Arm编译器架构。     nichol ib C库所节省的内存空间将取决于应用程序,“ hello world”应用程序     可节省97%, Dhrystone之类的较为复杂的应用程序可节省到50%     降低 Linux应用程序开发的风险:     Arm编译器团队所创建的针对Arm架构的ABI同样可在 Arm GNU编译器中实现。这样,即可支持创建和使用可在不同开发环境间共享的库。     GNU编译译器与Arm编译器相互兼容意味着可以使用Arm编译器生成 Linux应用程序。Arm编译器能为您您的开发团队提供高质量的商用工具包可提供的卓越的支持和性能、稳定性和代码大小优势。
查看更多→
编译器是什么?
2018-06-14
 编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。编译是从源代码(通常为高级语言)到能直接被计算机   编译器或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。   典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,所以我们电脑上的文件都是经过编译后的文件。
查看更多→
工作中有哪些使用过的编译器?
2018-04-18
工作之中难免会用到很多的工具,,一步步走过来也算是蹒跚满志。现如今只剩下会用vim gcc了。不是其它工具不会用因为用的少了慢慢的就生疏了,习惯形成了也就不好改了。要我说用那款能编译器更好的工作,着实很为难。编程贵在思想,用什么去实现着些那便是仁者见仁智者见智了。   但是每个工具有每个工具好用之处,希望以个人之拙见来说说初学者如何选择一款适合自己的编译器。   window中的:   Turbo C   它太老了,想当年舍它其谁,大学里都用它,老谭的c都是用它调试的,曾经多少人的回忆,不过现在已经基本不用它了,老了也该退休了。   dev-cpp          这个我个人觉得适合初学者,Dev-C++是Windows平台下的开源C++编程环境。它集成了GCC、MinGW32等众多自由软件,界面类似Visual Studio,但体积要小的多。它的缺点是难以胜任规模较大的软件项目。但我们初学者一般都调试一些初级的语法、算法。用关公大刀显然不合适,用它得心应手。   mingw studio   MinGW,即 Minimalist GNU For Windows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC 产生 Windows32 程序。   vc++6.0   相信大家对这个情有独钟,广泛使用的一款编译工具,window 开发必备,集合编辑,调试,运行于一体,特别时调试功能我觉得没有比他更好的了,后续版本vs2008,vs2010...(大工程适用)功能越来越强大,越来越好用。不过就是安装起来有些麻烦,可能机器环境不一样会出现各种安装错误,这些需要我们去耐心百度解决。   C++ Builder   C++ Builder是由Borland公司推出的一款可视化集成开发工具。C++ Builder具有快速的可视化开发环境:只要简单地把控件(Component)拖到窗体(Form)上,定义一下它的属性,设置一下它的外观,就可以快速地建立应用程序界面;C++ Builder内置了100多个完全封装了Windows公用特性且具有完全可扩展性(包括全面支持ActiveX控件)的可重用控件;C++ Builder具有一个专业C++开发环境所能提供的全部功能:快速、高效、灵活的编译器优化,逐步连接,CPU透视,命令行工具等。它实现了可视化的编程环境和功能强大的编程语言(C++)的完美结合。   linux中的:   gcc   貌似好像就gcc了,功能十分的强大,没有图形界面只有命令。window使用习惯了的人,适应步了这样的操作。在linux下基本都是命令加脚本构建我们的编译系统。gcc是最终干事的,但如何去干事还是需要脚本命令工具和人共同完成的。     个人只使用TC,dev-cpp,vc++6.0,vs2008,gcc。其他几个捣鼓过但是基本上没认真使用过。window上的编译工具太多了,但是好用能用的就那几款,初学者我建议使用在window上使用dev-cpp(小,简单易上手)编写一些c/c++基础的例子,调试起来也方便。linux下基本时没有其他选择的gcc功能太强大。java学习基本上用eclipse,不知道还有比这个好用的,我觉得没有。   对于初学者来说我觉得过多的去注重编译器没有太大意义,与其把时间花在环境配置上,不如多去学习语法算法,等你明白语言本身的一些东西,会算法了。如何编译只是百度一下熟悉一下工具的事情。
查看更多→
Altium Designer 快速制作原理图库的技巧
2018-04-12
    作原理图库时,如果逐个管脚双击修改名称是非常繁琐的。而且效率低容易出现错误。本文介绍一种快速的制作原理图图库的方法。       1、新建一个Excel表格,按照下图格式填好各个管脚的编号和名称,X1,Y1代表引脚的位置.。红色部分是固定格式。       2、在AD原理图库里新建一个器件。然后点击右下角的SCH 工具栏选择SCHLIB List 或View-Workspace-SCH-SCHLIB List。         3、把SCHLIB list设置成edit模式       4、把事先制作好的Excel表格里的内容全部复制,回到SCHLIB list界面。单击右键选择“Smart Grid Insert”       5、上一步结束后会跳出一个窗口如下图所示,点击 AutomaticalyDeterminePAaste,然后点击OK;        6、以上操作结束后就可以看到所有管脚已经放好了。接下来手动调整一下管脚角度加上边框即可完成制作。
查看更多→
初学者选择哪一款编译器
2018-04-12
一个是详细的规范软件,别的一个是开发的情形,它收罗一系列开发所必要的软件工具,固然其中也收罗编译器在外面。         编译器只是一个把源代码编译成方针代码的工具而已,一致个编译器可以存在于不合的开发情形中,它可以存在于VS的开发情形,也可以存在于codeblock这个开发情形,还可以存在Eclipse外面,一样往常开发情形都可以自身设置配备布置选择编译器等这些软件。每一家的编译器都能够会供应不合库函数和头文件,像早期的Borland的C编译器与Microsoft的就良多不合,也有群友问爲什麼在VC外面找不到一些头文件就是这个事理。       一个开发情形除了一样往常的编译器,还收罗编纂器,预措置器,毗邻器,方针文件复制,汇编器,反汇编器等等,它实质上是一个综合了编写代码,编译,调试,甚至末了的实行文件打包工具于一体的一些列工具集结,所以名副其实就是一个情形,不是详细某一个工具软件。并且往往开发情形不只是支撑一种说话,比方VS,它可以支撑C/C++、VB、C#等说话开发。它除了供应这些工具集,还做了良多格外的任务,比方帮你结构Makefile、编译毗邻设置配备布置、自动生成情形变量等。      实际上要写最复杂的开发情形的软件其实不难,就是供应一个代码编纂器,然后挪用相应的编译器来编译这些源代码,只需有makefile编写根基功的都不是太难。      经由进程体味编译器,你可以很清楚地知道哪些优化是编译器可以优化的,和哪些是编译器不能中止优化的,无论他们看起来是何等的合理和复杂。你将会学到哪类代码通常会建造最佳代码块,爲什麼会多么和这些代码做了什麼。      你会知道爲什麼一些代码可以拥有更好的机能,比方运用一半寄放器组缓存滤波系数一半寄放器组缓存样本的FIR滤波器,它和运用浅显优化器完成的不一样。你和你喜好的编译器是一个能建树疾速代码的团队,你可以运用它高效地任务,或许运用延迟优化等有意义的技巧来改削它。
查看更多→
MDK编译器警告和错误详解
2018-03-29
工作后从单片机转成ARM,刚开始用ADS1.2编译器,用了一段时间,因为我接手的项目的老程序正是用ADS编译的,部门也大都在用.在学单片机的时候用的是keil.c51编译器,ads和这个编译器在易用性上真是无法比较.后来渐渐知道keil已经被arm公司收购,现在keil.MDK成为了arm官方编译器,所以决定重新投奔keil,利用平时的时间,将原程序重新用mdk编译.小编在这里把平时遇到的编译器给出的警告和错误信息给出详解,希望给初学者一点帮助。    1.warning:  #550-D: variable "d" was set but never used 描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了. 解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.   2.warning:  #1-D: last line of file ends without a newline 描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样. 解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.   3. warning:  #111-D: statement is unreachable 描述:声明不可能到达.多出现在这种场合: 解决:不理会.   4. warning: C3017W: data may be used before being set 描述:变量'data'在使用前没有明确的赋值 解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.   5. warning:  #177-D: variable "temp" was declared but never referenced 描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning:  #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过. 解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用. 与该警告类似的还有 warning:  #177-D: function "MACProcessBeacon" was declared but never referenced   6. warning:  #940-D: missing return statement at end of non-void function "DealwithInspect2" 描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.   7..warning:  #1295-D: Deprecated declaration lcd_init - give arg types 描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.
查看更多→