CN116301906A - 一种模块化的c语言通用编译器 - Google Patents

一种模块化的c语言通用编译器 Download PDF

Info

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
Application number
CN202310575596.7A
Other languages
English (en)
Inventor
安占峰
王旭
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Anhui Huake Intelligent Technology Co ltd
Original Assignee
Anhui Huake Intelligent Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Anhui Huake Intelligent Technology Co ltd filed Critical Anhui Huake Intelligent Technology Co ltd
Priority to CN202310575596.7A priority Critical patent/CN116301906A/zh
Publication of CN116301906A publication Critical patent/CN116301906A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/425Lexical analysis
    • YGENERAL 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
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE 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/00Energy 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语言通用编译器,便于在不同功能模块内部进行修改、扩展甚至重建。
一种模块化的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,是在抽象语法树的基础上,构建控制流图,使用符号执行的技术执行路径敏感的代码分析,此模块可通过调度省略;
所述中间代码生成模块,用于从顶至下地遍历抽象语法树,将其转换为中间代码,完成编译器前端工作;
所述抽象语法树模块,用于为语法语义分析模块、静态分析模块和中间代码生成模块提供构建、操纵和分析抽象语法树的方法。
CN202310575596.7A 2023-05-22 2023-05-22 一种模块化的c语言通用编译器 Pending CN116301906A (zh)

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)

* Cited by examiner, † Cited by third party
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 中国科学院软件研究所 一种面向机械臂程序开发编程语言的编译方法及系统

Patent Citations (6)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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