❶ 难道编译器AI到帮人类善做主张的跳过写的代码不执行自作聪明的优化
从代码上看,连续对同一个内存单元赋值,连续执行四次,和只执行最后一次没有区别,如果编译器优化能过滤掉这种没有效率的代码,你应该感谢编译器的开发人员作出的这种提高程序执行效率的努力。
况且一般编辑器都都会提供是否优化代码和优化等级的选项,供开发者选择。
❷ 编程只有写代码→编译→程序 这一种方式吗有没有更复杂的东西
是这样。简单编译器靠一个人完全可以实现。编译器主要分为编译器和连接器两个部分。我这里先简单说一下编译器。
首先所有编译器都预定义了一个符号表项,在符号表现中保存着程序语言(如C++)的关键字(保留字)以及这些关键字对应的类型、作用域、优先级、结合性等等。这个符号表项如果自己编写的话,可以考虑实现为C++中的一个map容器。
其次编译器需要一个代码分析器。如果你之前写过一个C++的计算器程序的话,我认为你对这个会很了解。代码分析器就是说识别出代码中的关键字并且识别出用户定义类型等等。这个可以通过目前广泛流行的“递归向下调用”实现。
首先编写一个函数,处理大的表达式。这个函数返回最终结果(在编译器中,这一步就是生成程序代码),然后是字表达式函数,处理子表达式,返回结果。最后是一个分析单项的函数。这个函数分析出项是什么类型(名字、值、关键字等)并且将类型信息用一个enum枚举值返回。
最后我们通过这样一个链条向下调用:表达式->字表达式->项。由项返回项类型给字表达式,子表达式产生结果(可能是一个新对象、一个变量)并且返回给表达式,表达式生成代码(这里的代码只是伪代码,需要给连接器进一步处理成机器代码)。
参见《C++程序设计语言 特别版》第6章 Calculator类。以及习题中有一道是让你动手编写一个简单编译器。
最后是连接器。连接器的实现很复杂。。很晦涩(这一步我完全不会)。它牵扯到了操作系统底层语言和实现。连接器的大致原理是分析编译器生成的伪代码并且会把它翻译成机器语言(即一个二进制可执行文件)。光是这一步就有大量的系统底层问题:内存、指针、栰、地址、映象、内核等等。需要你精通操作系统以及内核了。事实上,我估计这一步只有大师级别的程序员才能实现(这样的程序员估计没有几个)。这绝对是计算机编程的最高境界了。
❸ 编译器做什么工作
1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。 2. 语法分析 语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。 3. 语义分析 语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。 4. 中间代码生成 中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。 5. 中间代码优化 优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。 6. 目标代码生成 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。 7 符号表管理 符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。 8 出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。
❹ 什么是c编译器有什么用,可以用它来写C语言吗
所谓c语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照c语言的规则,将其转换成系统可以执行的二进制文件。
其本质在于对文件的读入,分析,及处理。这些操作,c语言都是可以实现的。
所以用c语言来做c语言的编译器是完全可行的。
但是,历史上的第一个c语言编译器,肯定不是c语言写的,因为在没有编译器时,无法把c语言转换成可执行文件。
只要有了第一版其它语言的编译器,就可以用c语言写编译器了。
事实上,目前大多数的c语言编译器,都是用c语言写的。
❺ 编译原理除了可以用来编写编译器,还在哪些领域可以用到编译原理的知识
很多的,例如MASM编译器。
编译原理内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等,这门课大部分人听起来比较困难,介绍编译程序构造的一般原理和基本方法,虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对我们提供了系统而有效的训练,有利于提高软件人员的素质和能力。
❻ 编译器有什么用
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
❼ 编译器是什么意思,是做什么的
编译器
编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。
下面我们看看它是如何工作的。首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为obj文件。再经过链接器的链接就可以生成最后的可执行代码了。有些时候我们需要把多个文件产生的目标文件进行链接,产生最后的代码。我们把一过程称为交叉链接。
有一个称为LCC的编译器,还挺不错的;还有一个用于分析其规则的小工具;
❽ TurboC中的代码编译器是做什么用的啊
代码编译器是用来修改程序的代码的,或者编辑程序的源代码时会用到的,如果技术不行不要乱修改源代码,不然后果自负呵~~~~~~~~~
❾ 在编写程序时要用到编译器,什么是编译器有什么用
VC Borland C Eclipse 都是编译器 就是把你的源代码 编译 解释成机器能读懂的机器码 因为机器内部是用二进制的嘛 所以最终也就是一串 1 0 组成的序列
❿ C语言编译器是用来做什么的
1.
C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。
2.
C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。