本文探讨了C++作为静态语言在编译阶段进行的错误检查,包括语法、类型和声明检查。C++2011的新特性在某些旧版编译器上可能无法编译。预处理器负责头文件替换、条件编译和宏替换等任务。编译、汇编和链接过程创建可执行文件。虽然编译器能检查一些错误,如未定义的变量和无效指针,但无法检查所有功能性错误,程序员需要自我校验,如初始化引用和指针,避免变量溢出和修改const对象等。
摘要由CSDN通过智能技术生成
对于代码而言,时刻想着编译器的行为,想着编译器会如何如何,编译器与语言同行;另一方面而言,编译器要与C++最新标准保持一致,对于最新的C++2011标准,对编译器也提出了要求,C++2011标准增加的一些新的语言,在VS2010上无法编译成功,典型的一个例子就是C++2011标准中提出了使用花括号初始化以及赋值对象变量的方式,在VS2010编译器中无法编译通过,类似的一些编译器与语法标准不匹配的可能要特别留意。
2.
预处理器的工作是进行相关替换
:(1)对于头文件的替换(2)对于条件编译的预处理(3)对于宏的替换(4)对于const对象的常量替换工作
3.编译过程
4.汇编过程
5.连接过程:链接成可执行文件
6.当然对于编程过程中的各类BUG,编译器不能检查功能性BUG,进行判断算法的正确与否,但可以对代码形式进行检查。但编译器并不是所有的错误都能检查,需要程序员自己在写代码的过程中利用经验,避免一些编译器无法检查出来的错误,
但对程序的执行产生错误的一些编码行为:
<
在《算法+数据结构=程序》一书中,Niklaus Wirth 设计的 PL/0 语言
编译器
分成两部分,把源语言翻译成中间语言的
编译器
和中间语言解释器,
编译器
用的是递归下降的预测分析方法中间语言是一种栈机器
代码
,其指令集是根据 PL/0 语言的需要来设计的。
编译器
源码及测试程序可从。一条指令由三个域组成:
(1)操作码 f:上面已经列出了所有 8 种操作码。
(2)层次差 l:这里的层次差就是 5.3.2 节介绍嵌套深度时的 n p − n a 。该域仅用于存取指令和调用指令。
(3)多用途 a:在运算指令中,a 的值用来区分不同的运算;在其他情况,a 或是一个数(lit,int),或是一个程序地址(jmp,jpc,cal),或是一个数据地址(lod,sto)。
编译器
对 PL/0 源程序进行一遍扫描,并逐行输出源程序。在源程序无错的情况下,
编译器
每编译完一个分程序,就列出该分程序的
代码
,这由
编译器
的 listcode 过程完成。每个分程序的第一条指令是 jmp 指令,其作用是绕过该分程序声明部分产生的
代码
(即绕过内嵌过程的
代码
)。listcode 过程没有列出这条
代码
。 解释器是
编译器
中的一个过程,若源程序无错,则编译结束时调用解释过程 interpret。由于 PL/0 语言没有输出语句,解释器按执行次序,每遇到对变量赋值时就输出该值。 由于 PL/0 语言是过程嵌套语言,因此程序运行时,活动记录栈中每个活动记录需要包含控制链和访问。活动记录栈的栈顶以外的存储空间作为
代码
执行过程中所需要的计算栈,无需另外设立计算栈。
这个
编译器
的源
代码
是我原先为了完成编译原理实验课作业而写的,所以只具有教学价值,现在发出来和大家共享 ;-)<br/><br/>和网上流传的版本不同,它从文法开始,一直做到了符号表的实现. 想实现自己的
编译器
的话,只需在把Initializtion.h中的文法
修改
为自己的即可.<br/><br/>工程结构:<br/>Initializtion.h 初始化文法,便于进一步进行分析,它为构造GRAMMAR类提供了信息.其中默认非终极符用<>括上,
修改
时需要注意.<br/>Grammar.cpp Grammar.h 定义了文法GRAMMAR类,它通过initializtion.h的信息建立文法的内部表示。<br/>LL1_Analyser.cpp LL1_Analyser.h 定义了LL1分析器,即LL1_Analyser类.<br/>LL1_Recognizer.cpp LL1_Recognizer.h 为LL1语法分析驱动器,可以通过文法,TOKEN序列和LL1分析表,判定语法是否正确,同时驱动动作.<br/>Rec_Parse.cpp Rec_Pares.h 实现了递归下降分析器Rec_Parse类, 递归下降的思想和LL1驱动器一样,不过是把压栈改成调用自己,而把弹栈改成返回.<br/>Scanner.cpp Scanner.h 实现了词法分析器,可以将程序变为TOKEN序列. 扫描的源程序文件路径也在这里被定义(默认为.//demo.txt)<br/>Action.cpp Action.h 实现了语义栈的操作,_Action类定义了动作符号所对应的动作.<br/>SymTable.cpp SymTable.h 实现了符号表的建立和输出.<br/><br/>希望大家能通过该程序对STL和编译原理有更深刻的理解,Have Fun and Good Luck!<br/><br/> -- David.Morre
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional infor
在终端写python脚本的时候,经常在写完脚本运行的时候,才发现错误。如果某些
代码
没有运行到,则其中的错误不会被
检查
出来。这是因为python是一门动态解释型语言。这与用gcc编译C等静态语言时可以发现全局的语法问题有所不同。
为了避免潜在的语法问题。我们在写完python脚本文件之后,最好给python脚本做个静态语法
检查
,以此来避免低级错误。
检查
工具有pyflakes, pylint, pyf
原文来自微信公众号:编程语言Lab-基于语义的
编译器
测试
搜索关注编程语言Lab 公众号:HW-PLLab获取编程语言更多技术内容
如果读者想了解更多有关类型系统相关的技术内容,欢迎加入编程语言社区 SIG-程序分析。
加入方式:文末有小助手微信,添加并备注加入 SIG-程序分析。
视频回顾:
SIG-程序分析技术沙龙回顾|Semantic-based Compiler Testinghttps://www.bilibili.com/video/BV1zY411b7uG?
# 研究背景及意义 #