CN116301906A - 一种模块化的c语言通用编译器 - Google Patents
一种模块化的c语言通用编译器 Download PDFInfo
- Publication number
- CN116301906A CN116301906A CN202310575596.7A CN202310575596A CN116301906A CN 116301906 A CN116301906 A CN 116301906A CN 202310575596 A CN202310575596 A CN 202310575596A CN 116301906 A CN116301906 A CN 116301906A
- Authority
- CN
- China
- Prior art keywords
- module
- scheduling
- grammar
- functional
- analysis module
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 claims abstract description 18
- 239000002346 layers by function Substances 0.000 claims abstract description 17
- 239000010410 layer Substances 0.000 claims abstract description 16
- 230000003068 static effect Effects 0.000 claims abstract description 15
- 238000007781 pre-processing Methods 0.000 claims abstract description 10
- 238000013461 design Methods 0.000 claims abstract description 7
- 238000005516 engineering process Methods 0.000 claims description 3
- 238000012545 processing Methods 0.000 claims description 2
- 230000006870 function Effects 0.000 abstract description 7
- 238000012986 modification Methods 0.000 abstract description 6
- 230000004048 modification Effects 0.000 abstract description 6
- 238000010586 diagram Methods 0.000 description 7
- 238000010276 construction Methods 0.000 description 2
- 230000011218 segmentation Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种模块化的C语言通用编译器,采用分层结构的模块化设计,由基础层、功能层和调度层构成;所述基础层包括基础模块,负责所有与底层操作系统关联的操作;所述功能层包括预处理模块、词法分析模块、语法语义分析模块、抽象语法树模块、静态分析模块、中间代码生成模块,负责将源代码转换为中间代码;所述调度层包括管理调度模块,负责按用户设置的调度策略要求,调度功能层的各个功能模块,组成编译工具链,启动编译过程。本发明通过分层结构的模块化设计,通过管理调度模块实现功能层的各个功能模块的调度;功能层不同功能模块独立完成其对应功能,极大方便了功能模块内部的修改、扩展甚至重建。
Description
技术领域
本发明属于编译器技术领域,具体涉及一种模块化的C语言通用编译器。
背景技术
编译器是一个软件程序,它读入的是人类通过某种程序设计语言(称为源语言)编写的程序,并将其翻译成一个与之等价的另一种可由计算机识别的语言(称为目标语言)编写的程序。作为这个翻译过程的一个重要组成部分,编译器应当能够向用户报告被编译的源程序出现的错误。
根据编译器的构造方法或者实现功能的不同,编译器被分为一遍编译器、多遍编译器、装入并运行编译器、调试编译器、优化编译器等多种类别。表面上看,编译器的种类似乎千变万化、形形色色、多种多样,实际上任何编译器所要完成的基本任务是相同的。通过对编译器构造理论的研究,可以利用同样的基本技术为各种各样的源语言和目标语言构建编译器。
现有的编译器主要来自国外,在国产化操作系统平台上的国产编译器,还是待填补的空白。
发明内容
针对上述技术问题,本发明提供一种模块化的C语言通用编译器,便于在不同功能模块内部进行修改、扩展甚至重建。
一种模块化的C语言通用编译器,采用分层结构的模块化设计,由基础层、功能层和调度层构成;
所述基础层包括基础模块,负责所有与底层操作系统关联的操作;
所述功能层包括预处理模块、词法分析模块、语法语义分析模块、静态分析模块、中间代码生成模块和抽象语法树模块,负责将源代码转换为中间代码;
所述调度层包括管理调度模块,负责按用户设置的调度策略要求,调度功能层的各个功能模块,组成编译工具链,启动编译过程。
进一步的,所述预处理模块,用于处理源代码文件中以“#”开头的预编译指令;
所述词法分析模块,用于读入预编译后的源代码的字节流并将字节流转变为Tokens流,具体是将字节流组织成词素Lexeme序列,对于每个词素,产生词法单元Token作为输出,并生成相关符号表,从而将字节流转变为Tokens流,其中每个词法单元Token标记词素类别、值以及在源代码中出现的位置,词素类别包括关键字、标识符、常量、特殊符号;
所述语法语义分析模块,用于遍历每个Token进行词句分析,根据语法规则,验证代码语法是否正确,最后生成一个节点并记录相关的信息;并在此基础上进行语义检查,若语义上有错误,则给予提示,若语义上无错误,则将Token按照语法规则组合成语义,生成语义节点,然后将这些节点按照层级关系构成抽象语法树;
所述静态分析模块,用于检查程序中一些在正常编译过程中不容易发现的bug,是在抽象语法树的基础上,构建控制流图,使用符号执行的技术执行路径敏感的代码分析,此模块可通过调度省略;
所述中间代码生成模块,用于从顶至下地遍历抽象语法树,将其转换为中间代码,完成编译器前端工作;
所述抽象语法树模块,用于为语法语义分析、静态分析和中间代码生成提供构建、操纵和分析抽象语法树的方法。
本发明通过分层结构的模块化设计,通过管理调度模块实现功能层的各个功能模块的调度;功能层不同功能模块独立完成其对应功能,极大方便了功能模块内部的修改、扩展甚至重建。
附图说明
图1为本发明公开的C语言通用编译器的模块化结构示意图;
图2为编译流程图;
图3为带静态分析过程的编译流程图;
图4为预处理器构成示意图;
图5为分词器构成示意图;
图6为语法分析器构成示意图;
图7为静态分析器构成示意图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步详细的说明。本发明的实施例是为了示例和描述起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显而易见的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。
一种模块化的C语言通用编译器,采用分层结构的模块化设计,由基础层、功能层和调度层构成,如图1所示。
所述基础层包括基础模块,负责所有与底层操作系统关联的操作,例如基本的输入输出、文件操作等。
所述功能层包括预处理模块、词法分析模块、语法语义分析模块、抽象语法树模块、静态分析模块、中间代码生成模块,负责将源代码转换为中间代码;
所述调度层包括管理调度模块,负责按用户设置的调度策略要求,调度功能层的各个功能模块,组成编译工具链,启动编译过程。
具体的,所述预处理模块,用于处理源代码文件中以“#”开头的预编译指令,将源程序转换为.i文件。
所述词法分析模块,用于读入预编译后的源代码的字节流并将字节流转变为Tokens流,具体是将字节流组织成有意义的词素Lexeme序列,对于每个词素,产生词法单元Token作为输出,并生成相关符号表,从而将字节流转变为Tokens流,其中每个词法单元Token标记词素类别、值以及在源代码中出现的位置,词素类别包括关键字、标识符、常量、特殊符号等。
所述语法语义分析模块,用于遍历每个Token进行词句分析,根据语法规则,验证代码语法是否正确,最后生成一个节点并记录相关的信息;并在此基础上,进行语义检查,若语义上有错误,则给予提示,若语义上无错误,则将Token按照语法规则组合成语义,生成语义节点,然后将这些节点按照层级关系构成抽象语法树。
所述静态分析模块,用于检查程序中一些在正常编译过程中不容易发现的bug(例如空指针、数组越界、内存泄露、零除问题等),是在抽象语法树的基础上,构建控制流图,使用符号执行的技术执行路径敏感的代码分析。此模块不是编译过程的必要组成部分,是为提高应用程序的健壮性、安全性而设计的附加功能模块,也可通过调度省略。
所述中间代码生成模块,用于从顶至下地遍历抽象语法树,将其转换为中间代码,完成编译器前端工作。
所述抽象语法树模块,本身并不是独立的编译环节,功能是为语法语义分析、静态分析和中间代码生成提供构建、操纵和分析抽象语法树的方法。
在默认编译模式下,编译过程包括预处理、词法分析、语法语义分析和中间代码生成四个步骤,其流程如图2所示。
当用户对应用程序的健壮性、安全性有着更高要求时,可以通过附加命令行参数-check,增加静态分析过程,检查程序是否存在一些常见的设计缺陷,其流程如图3所示。
功能层不同功能模块独立完成其对应功能,极大方便了功能模块内部的修改、扩展甚至重建。各个功能模块从功能上相对独立,即可以做为整个编译器的内在组成部分,成为完整编译工具链上的一环,也可以单独构建成为一个功能独立的专用编译工具,如图4-7分别对应的预处理器、分词器、语法分析器和静态分析器,用户可以按照预处理、词法分析、语法语义分析、静态分析、中间代码生成这样的顺序,分步实现从源代码(.c文件)、预处理源码(.i文件)、Tokens文件、抽象语法树到中间代码(.bc文件和.ll文件)的编译全过程,这样可以在《编译原理》课程教学时,加深学生对所学理论知识的理解。
显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域及相关领域的普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
Claims (2)
1.一种模块化的C语言通用编译器,其特征在于,采用分层结构的模块化设计,由基础层、功能层和调度层构成;
所述基础层包括基础模块,负责所有与底层操作系统关联的操作;
所述功能层包括预处理模块、词法分析模块、语法语义分析模块、静态分析模块、中间代码生成模块和抽象语法树模块,负责将源代码转换为中间代码;
所述调度层包括管理调度模块,负责按用户设置的调度策略要求,调度功能层的各个功能模块,组成编译工具链,启动编译过程。
2.根据权利要求1所述的模块化的C语言通用编译器,其特征在于,
所述预处理模块,用于处理源代码文件中以“#”开头的预编译指令;
所述词法分析模块,用于读入预编译后的源代码的字节流并将字节流转变为Tokens流,具体是将字节流组织成词素Lexeme序列,对于每个词素,产生词法单元Token作为输出,并生成相关符号表,从而将字节流转变为Tokens流,其中每个词法单元Token标记词素类别、值以及在源代码中出现的位置,词素类别包括关键字、标识符、常量、特殊符号;
所述语法语义分析模块,用于遍历每个Token进行词句分析,根据语法规则,验证代码语法是否正确,最后生成一个节点并记录相关的信息,并在此基础上进行语义检查,若语义上有错误,则给予提示,若语义上无错误,则将Token按照语法规则组合成语义,生成语义节点,然后将这些节点按照层级关系构成抽象语法树;
所述静态分析模块,用于检查程序中一些在正常编译过程中不容易发现的bug,是在抽象语法树的基础上,构建控制流图,使用符号执行的技术执行路径敏感的代码分析,此模块可通过调度省略;
所述中间代码生成模块,用于从顶至下地遍历抽象语法树,将其转换为中间代码,完成编译器前端工作;
所述抽象语法树模块,用于为语法语义分析模块、静态分析模块和中间代码生成模块提供构建、操纵和分析抽象语法树的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310575596.7A CN116301906A (zh) | 2023-05-22 | 2023-05-22 | 一种模块化的c语言通用编译器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310575596.7A CN116301906A (zh) | 2023-05-22 | 2023-05-22 | 一种模块化的c语言通用编译器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116301906A true CN116301906A (zh) | 2023-06-23 |
Family
ID=86815258
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310575596.7A Pending CN116301906A (zh) | 2023-05-22 | 2023-05-22 | 一种模块化的c语言通用编译器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116301906A (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103885810A (zh) * | 2014-03-07 | 2014-06-25 | 东莞市升力智能科技有限公司 | 基于正则表达式的Gerber文件编译器 |
CN104750533A (zh) * | 2013-12-31 | 2015-07-01 | 上海海尔集成电路有限公司 | C程序编译方法及编译器 |
CN108874396A (zh) * | 2018-05-31 | 2018-11-23 | 苏州蜗牛数字科技股份有限公司 | 基于hlsl的多平台多目标语言的交叉编译器及编译方法 |
CN109918081A (zh) * | 2019-03-01 | 2019-06-21 | 中安智联未来有限公司 | 一种编译方法及编译器 |
CN110825384A (zh) * | 2019-10-28 | 2020-02-21 | 国电南瑞科技股份有限公司 | 一种基于llvm的st语言编译方法及编译系统和编译器 |
CN111580825A (zh) * | 2020-04-28 | 2020-08-25 | 中国科学院软件研究所 | 一种面向机械臂程序开发编程语言的编译方法及系统 |
-
2023
- 2023-05-22 CN CN202310575596.7A patent/CN116301906A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104750533A (zh) * | 2013-12-31 | 2015-07-01 | 上海海尔集成电路有限公司 | C程序编译方法及编译器 |
CN103885810A (zh) * | 2014-03-07 | 2014-06-25 | 东莞市升力智能科技有限公司 | 基于正则表达式的Gerber文件编译器 |
CN108874396A (zh) * | 2018-05-31 | 2018-11-23 | 苏州蜗牛数字科技股份有限公司 | 基于hlsl的多平台多目标语言的交叉编译器及编译方法 |
CN109918081A (zh) * | 2019-03-01 | 2019-06-21 | 中安智联未来有限公司 | 一种编译方法及编译器 |
CN110825384A (zh) * | 2019-10-28 | 2020-02-21 | 国电南瑞科技股份有限公司 | 一种基于llvm的st语言编译方法及编译系统和编译器 |
CN111580825A (zh) * | 2020-04-28 | 2020-08-25 | 中国科学院软件研究所 | 一种面向机械臂程序开发编程语言的编译方法及系统 |
Non-Patent Citations (1)
Title |
---|
张晔: "PLC程序控制流分析方法", 《计算机应用》, pages 103 - 104 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5581696A (en) | Method using a computer for automatically instrumenting a computer program for dynamic debugging | |
Liskov et al. | Programming with abstract data types | |
EP0643851B1 (en) | Debugger program which includes correlation of computer program source code with optimized objet code | |
US7219338B2 (en) | Multi-language compilation | |
Glanville | A machine independent algorithm for code generation and its use in retargetable compilers. | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
CN107193745A (zh) | PLC程序到NuSMV输入模型的自动化构建方法 | |
Angelov et al. | PGF: A portable run-time format for type-theoretical grammars | |
Aversano et al. | Handling preprocessor-conditioned declarations | |
CN116541286A (zh) | 一种基于插桩和符号执行的高覆盖率测试数据生成方法 | |
WO2023133932A1 (zh) | 一种基于动态传递参数的ate装置和传输方法 | |
CN101499093A (zh) | 一种监控系统内存数据库通用交互方法 | |
US7165244B2 (en) | Web application code conversion system | |
US20070150876A1 (en) | Method and system for compiling a source code | |
CN116501330A (zh) | 一种基于解耦架构的文本类编程语言编译方法 | |
CN116301906A (zh) | 一种模块化的c语言通用编译器 | |
Paakki | Prolog in practical compiler writing | |
Jourdan et al. | The OLGA attribute grammar description language: Design, implementation and evaluation | |
KR101422737B1 (ko) | 다중 언어 코드 동시 실행 장치와 그 방법 | |
Grigorev et al. | String-embedded language support in integrated development environment | |
Tenma et al. | A system for generating language-oriented editors | |
Collofello et al. | Ripple effect analysis based on semantic information | |
Neto et al. | Compiler construction-a pedagogical approach | |
JPH02183338A (ja) | プログラム言語トランスレータ生成装置および方法 | |
KR0168929B1 (ko) | 칠 전위처리기의 전위처리 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20230623 |