GNU编译器
编辑GNU编译器(GCC)为编译器所生产系统GNU项目支持各种编程语言。GCC是GNU工具链的关键组件,也是大多数与GNU和Linux有关的项目(包括Linux内核)的标准编译器。在自由软件基金会(FSF)的分配下GCC GNU通用公共许可证(GNU GPL)。作为工具和示例,GCC在自由软件的增长中发挥了重要作用。
GCC 1.0于1987年首次发布时,由于它仅处理C编程语言,因此被命名为GNU C编译器。它于当年12月扩展到编译C ++。后来为Objective-C、Objective-C ++、Fortran、Java、Ada和Go等开发了前端。
现在,C和C ++编译器支持OpenMP规范的版本4.5,并且还支持OpenACC 2.0a规范的“xxx改进”的实现。默认情况下,当前版本支持gnu ++ 14(C ++ 14的超集)和gnu11(C11的超集),并且还提供严格的标准支持。如GCC 9、C ++ 17支持不再试验,并且它,或严格地GNU ++ 17,是在(即将)GCC GCC 11.还提供了实验支持默认C ++ 20。
GCC已被移植到各种指令集体系结构中,并被广泛用作开发自由软件和专有软件的工具。GCC也可用于许多嵌入式系统,包括基于ARM的系统。AMCC和基于Freescale Power ISA的芯片。编译器可以针对多种平台。
除了作为GNU操作系统的正式编译器外,GCC还被许多其他类似Unix的现代计算机操作系统(包括大多数Linux发行版)用作标准编译器。大多数BSD系列操作系统也都切换到了GCC,尽管自那时以来,包括FreeBSD和OpenBSD在内的一些BSD都已迁移到Clang编译器。使用GCC后,macOS也切换到了Clang。版本也可用于Microsoft Windows和其他操作系统。GCC可以为Android和iOS编译代码。
GNU编译器的设计
编辑GCC的外部接口遵循Unix约定。用户调用特定语言的驱动程序(gcc
用于C、g++
C ++等),该程序解释命令参数,调用实际的编译器,在输出上运行汇编器,然后可选地运行链接器以生成完整的可执行二进制文件。
每个语言编译器都是一个单独的程序,该程序读取源代码并输出机器代码。它们都有共同的内部结构。每个语言的前端都会解析该语言的源代码,并生成一个抽象的语法树(简称“树”)。
如有必要,将它们转换为中间端的输入表示形式,称为GENERIC形式;然后,中间端将程序逐渐转换为最终形式。编译器优化和静态代码分析技术(例如FORTIFY_SOURCE,尝试发现某些缓冲区溢出的编译器指令)被应用于代码。这些工作于多种表示形式,主要是与体系结构无关的GIMPLE表示和与体系结构有关的RTL表示。最后,使用特定于体系结构的模式匹配生成机器代码 最初基于Jack Davidson和Chris Fraser的算法。
除了Ada前端的某些部分外,GCC主要是用C编写的。该发行版包括Ada、C ++和Java的标准库,它们的代码主要用那些语言编写。在某些平台上,发行版还包含一个低级运行时库libgcc,它是由独立于机器的C语言和特定于处理器的机器代码的组合编写的,主要用于处理目标处理器无法直接执行的算术运算。
2010年5月,GCC指导委员会决定允许使用C ++编译器来编译GCC。该编译器旨在用C以及C ++的功能的子集编写。特别是,这是为了使GCC的开发人员可以使用C ++的析构函数和泛型功能而决定的。
2012年8月,海湾合作委员会指导委员会宣布海湾合作委员会现在使用C ++作为其实现语言。这意味着要从源代码构建GCC,需要一个了解ISO / IEC C ++ 03标准的C ++编译器。
2020年5月18日,GCC从ISO / IEC C ++ 03标准移至ISO / IEC C ++ 11标准(即需要编译、引导、编译器本身;默认情况下,它会编译更高版本的C ++)。
GNU编译器的功能
编辑GCC的某些功能包括:
- 链接时间优化跨目标文件边界进行优化,以直接改善链接二进制文件。链接时优化依赖于一个中间文件,该文件包含目标文件中包含的某些Gimple表示形式的序列化。在源代码编译期间,文件与目标文件一起生成。每个源编译都会生成一个单独的目标文件和链接时帮助程序文件。链接目标文件后,将再次执行编译器,并使用帮助程序文件优化单独编译的目标文件中的代码。
- 插件可以直接扩展GCC编译器。插件允许通过作为插件加载的外部代码针对特定需求量身定制股票编译器。例如,插件可以添加,替换甚至删除对Gimple表示形式进行操作的中端通道。已经发布了几个GCC插件,特别是GCC Python插件,它链接到libpython,并允许一个从编译器内部调用任意Python脚本。目的是允许GCC插件使用Python编写。MELT插件提供了一种类似于Lisp的高级语言来扩展GCC。
- 使用-fgnu-tm编译时的C ++事务内存。
- 从GCC 10开始,标识符允许使用UTF-8(Unicode)编码,即C源代码默认情况下使用UTF-8编码。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/117152/