Clang 与 GCC 的区别

GCC

GCC:GNU(Gnu’s Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。GCC原本用C开发,后来因为LLVM、Clang的崛起,它更快地将开发语言转换为C++。

Clang:LLVM的C语言家族前端

Clang项目是为LLVM 项目的C语言系列(C/C++,Objective C/C++,OpenCL,CUDA和RenderScript)中的语言提供语言前端和工具基础结构。
Clang项目提供了与GCC兼容的编译器驱动程序(clang)和与MSVC兼容的编译器驱动程序(clang-cl.exe)。
Clang的源代码授权采用的是类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。

Clang特性分析

本文详细的介绍了Clang的功能和目标,并对我们的意思给出了更广泛的解释。

快速编译与低内存使用

我们在clang上工作的一个主要焦点是使其快速,轻便和可扩展。clang的基于库的体系结构使得它可以直接计时并分析堆栈每层的成本,并且驱动程序具有许多性能分析选项。许多详细的基准测试可以在网上找到。
编译时间性能很重要,但是当使用clang作为API时,通常内存使用更是如此:代码占用的内存越少,一次可以容纳到内存中的代码就越多(例如,对于整个程序分析工具很有用)

除了在批处理模式下与GCC进行头对头攻击时,clang还具有基于库的架构,使其相对容易适应并使用它构建新工具。这意味着通常可以应用开箱即用的思维和新颖的技术来以各种方式改进编译。

Clang对比Gcc的优劣势分析

Clang:LLVM的C语言家族前端

Clang项目是为LLVM 项目的C语言系列(C/C++,Objective C/C++,OpenCL,CUDA和RenderScript)中的语言提供语言前端和工具基础结构。

Clang项目提供了与GCC兼容的编译器驱动程序(clang)和与MSVC兼容的编译器驱动程序(clang-cl.exe)。

Clang的源代码授权采用的是类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。

什么是Clang?

Clang: 一种C语言家族编译器

Clang项目的目标是创建一个新的C,C++,Objective C和Objective C++编译器(译注:也就是LLVM的前端Front-end),Clang基于LLVM架构,你现在可以获取它的源代码进行构建。

剖析LLVM寄存器分配(1)

1.寄存器分配概述

寄存器是位于CPU或GPU内部的少量的高速存储器,用于保存机器指令的操作数。由于其价格昂贵导致其数量有限,又由于存取速度快,使其不可或缺。因此,寄存器是计算机体系结构中的关键资源之一。在计算复杂表达式的过程中产生的中间结果也保存在寄存器中。更复杂的编译器会把经常使用的变量放在寄存器里,来避免反复地存取。如果是优化的编译器,会把公共子表达式消除或者循环不变量移动以后的重用值放在寄存器中。

在编写高级语言程序时会用到变量,如int xstring y等。大部分程序不关心变量在计算机体系结构中用什么形式表示。从程序开发者的角度看,变量中的数据通常被认为保存在内存中,可以通过文件I/O接口在硬盘和内存之间转移,而编译器负责在内存和寄存器之间转移数据,以便CPU或GPU可以操作寄存器中的数据。从存储结构的角度看,硬盘、内存、缓存(cache)和寄存器特点不同,总结如下:

LLVM中的JIT

JIT编译简介

JIT(just-in-time)即时编译技术是在运行时(runtime)将调用的函数或程序段编译成机器码载入内存,以加快程序的执行。所以,JIT是一种提高程序时间和空间有效性的方法。

程序运行时编译和执行的概念最早出自John McCarthy在1960年发表的论文《Recursive functions of symbolic expressions and their computation by machine》,James Gosling在1993年在关于Java的论文中使用了”JIT”这个术语。

JIT可以分为两个阶段:在运行时生成机器码和在运行时执行机器码。其中,第一个阶段的生成机器码方式与静态编译并无本质不同,只不过生成的机器码被保存在内存中,而静态编译是在程序运行前将整个程序完全编译为机器码保存在二进制文件中。运行时JIT缓存编译后的机器码,当再次遇到该函数时,则直接从缓存中执行已编译好的机器。因此,从理论上来说,JIT编译技术的性能会越来越接近静态编译技术。

使用LLVM写WebAssembly

如果你不知道的话,那让我来告诉你编译器社区中有一个小秘密:可以使用LLVM写WebAssembly

LLVM是像Clang和Rust这样的语言使用的工具,它是一种通用的中间表示(IR),可以编译成机器代码输出。Web Assenbly就是其中之一。

今天我将展示将LLVM编译成Web Assenbly是多么简单。让我们从编写IR函数开始:

define i32 @main() {
ret i32 42
}

从LLVM实现新语言的入门教程分析LLVM技术系统的体系架构

本文是学习了LLVM入门教程后的总结,目的是对LLVM的整体技术架构进行梳理,让其更加清晰,了解LLVM的能力边界。

LLVM整体架构

首先,画出LLVM技术的架构的框架图

用代码生成代码(编译器架构王者LLVM)

LLVM的开发思路很简单,就是用C++代码去不断生成llvm字节码。

RedApple语言示例

这是我花了两周多的时间制作的一门实验型语言,主要是想验证一个编译器的设计思路,宏翻译系统。

它的架构和一般的编译器很不一样,首先,编译器前端会先将语法转换为很通用的AST语法树节点,一般的编译器,往往是直接在这些节点上进行语义分析,然后进行代码生成。

这次我采用了类似lisp的表示方法,将源文件转换为语法树,然后遍历整棵语法树,根据上面标注的宏提示,去按照各个宏的规则进行翻译工作。

整个编译器1500行左右的代码,非常的小巧,不过功能也比较有限,而且好多地方还不完善,主要支持的就是函数的定义,结构体的定义,函数调用,结构体访问,分配内存,基本逻辑控制语句这些基本的特性。