关于GNU规范的语法扩展
- GNU 是一款能用于构建类 Unix 操作系统的计算机软件合集,由自由软件之父 Richard Stallman 开创,于 1983 年 9 月 27 日对外发布。GNU 完全由自由软件(free software)构成。
- GNU 语法扩展源自于 GCC 编译器,在 1987 年发布 1.0 版本,称为 GNU C Compiler。随后,GCC 编译器前端支持了 C++、Objective-C/C++、Fortran、Ada、Java 以及最近跃升的 Go 等编程语言,因此现在 GCC 被称为 GNU Compiler Collection。
- 由于在 20 世纪 90 年代,GNU C 编译器就对 C90 标准做了相当多的语法扩展,包括复合字面量、匿名结构体和数组、可指定的初始化器等,这些语法扩展被广泛使用,尤其是大量用于 Linux 内核代码中,因此 C99 标准将这些语法特性全都列入标准之中。
- 正因为 GCC 本身是开源自由软件,因此很多商用编译器也基于 GCC 进行扩展,例如:
- 像 ARM 的 RVCT(RealView Compiler Toolkit)本身就支持 GNU 扩展;
- 还有不少开发平台本身就直接使用 GCC 编译工具。
- 由于有不少大公司顶级开发人员的参与,因此 GCC 编译器的目标代码优化能力相当高,而且还支持许多不同的处理器。所以,GCC 当前被广泛使用并博得开发者的好评。像 Linux 操作系统基本默认使用 GCC 作为默认编译器,包括 Android 的 NDK 开发工具一开始也是如此。
- 然而,由于 GCC 基于比较严格的 GPL 许可证,许多大型商业开发商对它望而却步。该许可证允许使用者免费使用软件,但是要求不能随意对它进行篡改并重新发布。如果开发者对它进行篡改,然后发布自己修改之后的软件,那么必须要把自己修改的那部分也开源出来。
- 因此,在 2003 年诞生了一个 LLVM 开源项目,基于更为宽松的 BSD 许可证,其编译器称为 Clang。BSD 许可证允许开发者随意对软件进行修改并重新发布,甚至可以将修改过的版本作为自主版权,因而这个许可证深受大公司的欢迎。
- 现在 Apple 对 LLVM 项目的投入非常大。macOS 上的开发工具 Xocde 从 4.0 版本起就开始使用 Clang 编译工具链,随后 Apple 将自己改写的 Clang 编译器称为 Apple LLVM。当前最新的 Xcode 8 所使用的 Apple LLVM 版本为 8.x。
- 而当前 Android NDK 也支持了 Clang 编译器工具链。
- Clang 编译器并非基于 GCC,它是从头开始写的。但是它的目标是尽量与 GCC 编译器兼容,所以Clang 编译器包含大部分 GNU 语法扩展,除此之外还含有它自己特有的C语言扩展。当然也有一些特性是 GCC 含有而 Clang 不具备的,不过这些特性一般很少使用。
- 我们现在可以看到 GNU 语法扩展适用性十分广泛。如果读者当前在做 Linux/Unix 或 Windows 上的C语言编程开发,或者是在开发 macOS/iOS 应用,又或者是在开发 Android 应用,那么完全可以毫无顾忌地使用 GNU 语法扩展。
关于GNU规范的语法扩展的更多相关文章
- 嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展
1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...
- ExtJs对js基本语法扩展支持
ExtJs对js基本语法扩展支持 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可 ...
- GNU风格 汇编语法总结(转)
转载自:http://blog.sina.com.cn/s/blog_78d30f6b0101713r.html 汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器 ...
- ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可以引入动态加载的概念来即用即取.这 ...
- [转载]ExtJs4 笔记(2) ExtJs对js基本语法扩展支持
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/) 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引 ...
- ES6规范及语法基础
var的特点 函数作用域 let的特点 没有变量提升,必须先声明.再调用 同一个作用域下不可以重复定义同一个名称 块级作用域 function fun(){ let a = 10 if(true){ ...
- JavaScript变量语法扩展
1.更新变量 一个变量被重新赋值后,它原有的值会被覆盖,变量值将会以最后一次赋值为准. 2.同时声明多个变量 var age = 18 , address ='火影村' , gz = 2000 ; ...
- C语言编程基础
主流C语言编译器介绍 关于GNU规范的语法扩展 用C语言构建一个可执行程序的流程 宏定义(无参宏定义和带参宏定义),C语言宏定义详解 条件编译,C语言条件编译详解 原码.反码.补码及位操作符,C语言位 ...
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
让ASP.NET Web API支持JSONP和W3C的CORS规范是解决"跨域资源共享"的两种途径,在<通过扩展让ASP.NET Web API支持JSONP>中我们 ...
随机推荐
- ARM-Linux内核移植之(一)——内核启动流程分析
内核版本:2.6.22 为什么要采用这样一个较低的版本进行移植了,因为韦东山大牛说了,低版本的才能学到东西,越是高版本需要移植时做的工作量越少,学的东西越少. 内核启动分为三个阶段,第一是运行hea ...
- 线程--demo3
示例1:SwingAndThread package com.etc.jichu; import java.awt.Container; import java.net.URL; import jav ...
- krpano之语音介绍
语音介绍:在每进入一个场景时,播放一段该场景的语音介绍. 制作步骤: 1.定义全局事件.在关闭场景时执行stopsounds(),在打开新场景时执行automusic(). <events on ...
- 【知识结构】最强Thymeleaf知识体系
在开发一个小项目的时候,使用的是Spring Boot,Spring Boot 官方推荐的前端模板是thymeleaf, 花了两天时间将官方的文档看完并总结了下知识体系结构.转载请注明出处,https ...
- Python基础学习三 文件操作(一)
文件读写 r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[不可读: 不存在则创建:存在则只追加内容:] r+,[可读.可写:可追加,如果打开的文件不存 ...
- phpmailer邮件类
<?php/** * 邮件类 * Enter description here ... * @author df * Mail::getMail()->sendMail(); * */cl ...
- ReactNative项目创建及结构分析
- c++ 装饰模式(decorate)
装饰模式:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类 更为灵活.有时我们希望给某个对象而不是整个类添加一些功能.比如有一个手机,允许你为手机添加特性,比如增加挂件.屏幕贴 ...
- SpringBoot24 SpringDataJPA环境搭建、实体类注解、关联查询
1 版本说明 JDK:1.8 MAVEN:3.5 SpringBoot:2.0.4 IDEA:旗舰版207.2 MySQL:5.5 2 SpringDataJPA环境搭建(SpringBoot版本) ...
- 535. Encode and Decode TinyURL 长短URL
[抄题]: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problem ...