当前位置: 首页 > news >正文

LLVM 与 Clang 介绍

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

原博客地址:http://blog.csdn.net/wwang196988/article/details/6628543

晚上听国软徐纪元学弟给我说起了他刚装上的 Mac Lion 操作系统,也说到了最近 Apple 推出的新版本的 Xcode 4.2 在 iOS 4、iOS 5 程序开发中,加入了 automatic reference counting 功能,也即是开发者不再需要手动的做内存管理了,不用纠结内存管理了,不再需要 retain release 了。 同时 Apple 现在把编译器改为 LLVM 了,同时也保留了 GCC 的支持,但按这样的发展,GCC 至少在 Apple 开发上快到尽头了。

在网上查了下 LLVM 的发展历史:

发展历程

2000年 LLVM 开始开发,

2005年 Apple 雇了 Chris Lattner,LLVM 也相当于成了 Apple 的官方支持的编译器。
  Apple 已经将它用在 OpenGL 的流水线优化,Xcode 已经能使用 llvm-gcc 编译代码。

到今天的 Xcode 已经开始使用 llvm 编译代码。

鉴于此,也是自己对 LLVM 的学习,转载了这篇文章,让自己也让你明白 LLVM 的皮毛。微笑

同时推荐 LLVM 的官方链接:http://llvm.org/。

链接:http://linuxtoy.org/archives/llvm-and-clang.html。


LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。

Clang 开发事出有因,Wiki 介绍如下:

Apple 使用 LLVM 在不支持全部 OpenGL 特性的 GPU (Intel 低端显卡) 上生成代码 (JIT),令程序仍然能够正常运行。之后 LLVM 与 GCC 的集成过程引发了一些不快,GCC 系统庞大而笨重,而 Apple 大量使用的 Objective-C 在 GCC 中优先级很低。此外 GCC 作为一个纯粹的编译系统,与 IDE 配合很差。加之许可证方面的要求,Apple 无法使用修改版的 GCC 而闭源。于是 Apple 决定从零开始写 C family 的前端,也就是基于 LLVM 的 Clang 了。

Clang 的特性:

  1. 快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
  2. 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
  3. 诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天书。
  4. GCC 兼容性。
  5. 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
  6. 基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。

当然,GCC 也有其优势:

  • 支持 JAVA/ADA/FORTRAN
  • 当前的 Clang 的 C++ 支持落后于 GCC,参见 http://clang.llvm.org/cxx_status.html。(近日 Clang 已经可以自编译,见http://www.phoronix.com/scan.php?page=news_item&px=Nzk2Mw)
  • GCC 支持更多平台
  • GCC 更流行,广泛使用,支持完备
  • GCC 基于 C,不需要 C++ 编译器即可编译

相信介绍到这里大家能够对 Clang 和 LLVM 有所了解了。除去 Clang 之外,LLVM 还被用在 Gallium3D 中进行 JIT 优化,Xorg 中的 pixman 也有考虑使用 LLVM 来优化执行速度,llvm-lua 使用 LLVM 来编译 Lua 代码,gpuocelot 使用 LLVM 可以令 CUDA 程序无需重新编译即可运行在多核 X86CPU、IBM Cell、支持 OpenCL 的设备之上... 我个人感觉 Apple 在开源界口碑较差(也许是我的错觉?),不过 Apple 也为开源界贡献了不少,Webkit,OpenCL(虽说只是个标准),Clang。我最为佩服的是虽然出身于命令行之上的 Unix 族系统,但有魄力写出自成体系的图形栈,其图形界面优美而人性化,可谓也为开源界贡献了自己的精神与思想。 对于 Clang 这个很有潜力的项目,我希望其 C++ 支持(尤其是 template 支持)能够早日完善。因为 GCC 在 template 出错时的诊断信息如同小说一般...



转载于:https://my.oschina.net/songchunmin/blog/1561184

相关文章:

  • 实例讲解如何查找某个对象的定义情况
  • Oracle数据库“Specified cast is农田valid”
  • Linux 系统使用命令
  • 禁止微信下拉到顶部时露底--代码记录
  • 浅谈ListBox在Windows Phone 7 中的使用(2)
  • 服务器虚拟环境存储性能遭挑战。
  • 判断JS字符串中是否包含某些字符
  • 一位10年Java工作经验的架构师聊Java和工作经验
  • Linux下QT编程之hello qt程序
  • Dao 常用方法记录
  • vss团队开发工具使用(个人学习心得)
  • mybatis打印sql日志配置
  • mount报错
  • PHPINIDir directive honored per configuration tree apache配置错误
  • windows上传文件到linux乱码解决
  • [译]前端离线指南(上)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android 一些 utils
  • create-react-app项目添加less配置
  • css系列之关于字体的事
  • Debian下无root权限使用Python访问Oracle
  • js对象的深浅拷贝
  • Js基础知识(四) - js运行原理与机制
  • Kibana配置logstash,报表一体化
  • Koa2 之文件上传下载
  • PHP的Ev教程三(Periodic watcher)
  • Service Worker
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SQL 难点解决:记录的引用
  • uni-app项目数字滚动
  • Vue2.x学习三:事件处理生命周期钩子
  • vue-router 实现分析
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 汉诺塔算法
  • 将回调地狱按在地上摩擦的Promise
  • 一、python与pycharm的安装
  • 鱼骨图 - 如何绘制?
  • No resource identifier found for attribute,RxJava之zip操作符
  • 《天龙八部3D》Unity技术方案揭秘
  • 湖北分布式智能数据采集方法有哪些?
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)【Jmeter】 JMeter的界面布局与组件概述