关于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 语法扩展。

原文地址:https://www.cnblogs.com/CH520/p/10146146.html

时间: 2024-10-23 14:42:00

关于GNU规范的语法扩展的相关文章

0090 JS变量的使用:声明、赋值、初始化、语法扩展、命名规范

变量的声明 变量的赋值 7.1 声明变量 // 声明变量 var age; // 声明一个 名称为age 的变量 var 是一个 JS关键字,用来声明变量( variable 变量的意思 ).使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员管. age 是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间. 7.2 赋值 age = 10; // 给 age 这个变量赋值为 10 =: 用来把右边的值赋给左边的变量空间中,此处代表赋值的意思 变量值是程序员保存到变量空

Linux下的AT&T语法(即GNU as 汇编语法)入门

http://blogold.chinaunix.net/u3/105209/showart_2085748.html 学习这么长时间,一直在C语言这一层面上钻研和打拼,日积月累,很多关于C的疑惑在书本和资料中都难以找到答案.程序员是追求完美的一个种群,其头 脑中哪怕是存在一点点的思维黑洞都会让其坐卧不宁.不久前在itput论坛上偶得<Computer Systems A Programmer's Perspective>(以下称CS.APP)这本经典好书,遂连夜拜读以求解惑.虽说书中没有能正

第01节:Linux 内核中的 C 语言语法扩展

1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来"怪怪的".说它是C语言吧,貌似又跟教材中的写法不太一样:说它不是 C 语言呢,但是这些程序确确实实是在一个 C 文件中.此时,你肯定怀疑你看到的是一个"假的 C 语言"! 比如,下面的宏定义: #define mult_frac(x, numer, denom)( { typeof(x) quo

博客园markdown语法扩展

从Markdown语法解析说起 Markdown作为一种非常轻便的标记语言,非常适合博客的写作.其语法十分简单,一般都是一些特殊的字符组合来实现特定的语法,比如一级标题.二级标题,插图.插表等等.这些语法和HTML之间存在一种转换关系,或者说映射.其中担当这个转化工作的就是 js 脚本文件,其术语称之为解析 . 查阅相关资料后得知,目前来说,对于Markdown这门语言,标准语法很有限,所以后面不断发展出了许多扩展语法,但是仍然十分有限,并且不太好自定义扩展语法(教程太复杂,不适合新手),为此我

GNU ARM汇编语法

http://wenku.baidu.com/view/812a698c84868762caaed55d.html?re=view ARM汇编源程序有两种风格: ARM官方推荐的风格,所有的指令都大写.常用在windows下的IDE中. GNU风格的汇编风格,所有的指令都小写.常用在与Linux相关的工具中. 注释符号: GNU arm汇编所采用的注释符号是@符号,同样c语言中的 // 和 /* */ 两种类型的注释方法在GNU arm汇编中也被支持. 宏定义: 在GNU arm汇编程序中可以使

C# 语法 ( 扩展方法 )

<!-- 扩展方法的声明 --> 注 : 尽量少用 1, 声明一个公共静态的类  public static class 类名 {} 2,在类中声明一个公共静态的方法 ,参数用关键字 this 修饰  如 :  public static string FirstCharToUp(this string s) { return s } 3,调用方法时, 引入命名空间,用String对象直接点出, 如 : String s  = "abcdeg"; s = s.FirstCh

Css3之基础-1 Css 概述、样式表使用方式、语法规范

一.CSS 概述 CSS概述 - CSS作用 CSS概念 - CSS (Cascading Style Sheets): 层叠样式表,又叫级联样式表,简称样式表 - 用于 HTML 文档中元素的样式定义 - 实现了将内容与表现分离 - 提高代码的可重用性和可维护性 CSS与HTML之间的关系 - HTML 用于构建网页的结构 - CSS 用于构建 HTML 元素的样式 - HTML 是页面的内容组成,CSS是页面的表现 HTML 属性与CSS样式的使用原则 - W3C 建议尽量使用CSS样式取代

对openjdk的javac编译器扩展了一个语法糖

我的扩展功能描述如下: 在java的现有语法中加入var来声明变量,并且可以根据初始化数据来自动类型推导. 举两个例子: 例一: 如下JAVA代码(注意这里的var是新语法): import java.util.*; public class TestHello { private var i = new ArrayList<List<?>>(); } 在用我修改的编译器编译之后,再用反编译工具反编译之后会看到如下形式的代码: import java.util.ArrayList;

CSDN-markdown扩展语法说明

目录 概述 换行 删除线 链接自动识别 表格 代码块高亮 定义列表 脚注 自动生成目录 参考资料 正文 概述 大部分情况下,Markdown的基本语法已够我们使用,比如随性记录点东西.非专业的分析文章等,一般只用到标题.区块引用.强调.列表这样的基本元素.但若要写专业性比较强的分析文章或技术性文章,这些基本语法就不够用了,因为我们经常会用到表格.脚注.想要自动生成文章目录等,若是涉及代码的技术文章,我们还希望代码支持高亮以提升阅读体验.这就需要用到Markdown的扩展语法了. CSDN-mar