A. 编译器二:LLVM和GCC的区别
GCC: GNU Compiler Collection
GCC属于传统编译器,传统编译器的工作原理基本上都是三段式的,可以分为前端(Frontend)、优化器(Optimizer)、后端(Backend)。前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树(Abstract Syntax Tree)。优化器对这一中间代码进行优化,试图使代码更高效。后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。
事实上,不光静态语言如此,动态语言也符合上面这个模型,例如Java。Java Virtual Machine也利用上面这个模型,将Java代码翻译为Java bytecode。这一模型的好处是,当我们要支持多种语言时,只需要添加多个前端就可以了。当需要支持多种目标机器时,只需要添加多个后端就可以了。对于中间的优化器,我们可以使用通用的中间代码。
这种三段式的结构还有一个好处,开发前端的人只需要知道如何将源代码转换为优化器能够理解的中间代码就可以了,他不需要知道优化器的工作原理,也不需要了解目标机器的知识。这大大降低了编译器的开发难度,使更多的开发人员可以参与进来。
虽然这种三段式的编译器有很多有点,并且被写到了教科书上,但是在实际中这一结构却从来没有被完美实现过。做的比较好的应该属Java和.NET虚拟机。虚拟机可以将目标语言翻译为bytecode,所以理论上讲我们可以将任何语言翻译为bytecode,然后输入虚拟机中运行。但是这一动态语言的模型并不太适合C语言,所以硬将C语言翻译为bytecode并实现垃圾回收机制的效率是非常低的。
GCC也将三段式做的比较好,并且实现了很多前端,支持了很多语言。但是上述这些编译器的致命缺陷是,他们是一个完整的可执行文件,没有给其它语言的开发者提供代码重用的接口。即使GCC是开源的,但是源代码重用的难度也比较大。
LLVM: Low Level Virtual Machine
LLVM最初是[Low Level Virtual Machine]的缩写,定位是一个虚拟机,但是是比较底层的虚拟机。它的出现正是为了解决编译器代码重用的问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。
LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。
B. 怎样构建一个不依赖gcc/binutils的llvm/clang linux工具链
1,Build llvm/clang/lldb/lld 3.5.0等组件 1.0 准备: 至少需要从llvm.org下载llvm, cfe, lldb, compiler-rt,lld等3.5.0版本的代码。 $tar xf llvm-3.5.0.src.tar.gz $cd llvm-3.5.0.src $mkdir -p tools/clang $mkdir -p tools/clang/tools/ex...
C. Linux环境下C++开发
你能否先去入门一下 Linux ?基础会了再来讨论这个问题?
不过我觉得可能你连 Windows 下面的开发详细都不是很清楚吧?
开发工具分开发编辑环境,项目管理程序,编译控制环境,编译器。
GCC 是编译器,光有一个 GCC 并不代码你就真的 Linux 开发了。因为 GCC 还可以给 FreeBSD 编译程序。GCC 也可以做 Windows 开发进行编译用。
1、GCC 是编译器,binutils 是连接器,glibc 是基础 libc 库,make 是编译控制器。开发环境可以用 eclpise ,另外如果用 QT 库开发,可以用 QT 自己的开发工具。不过这些组合都是可以替换的。比如编译器除了 GCC 还可以用 llvm 。glibc 还可以改用 uclibc ,make 一般是 gmake ,还有 cmake 或者干脆自己从头写脚本直接进行过程控制。
2、如果你会开发那就没区别,只是函数调用、开发环境、代码风格等等的过程不一样。如果你不会,那就完全不同根本没办法比较。
3、我想反问 GCC 是什么?
4、写一个在 Linux 下面可以运行的 C++ 程序就叫 Linux 环境下的 C++ 开发。
D. 如何利用LLVM写一个编译器
LLVM有自己的教程,如果你只想做个玩具,那可以首先试着实现LLVM Tutorial: Table of Contents的Kaleidoscope。深入的,请看他的文档http://llvm.org/docs/
Kaleidoscope是一个范式简单的脚本语言,教程里的词法,语法分析都是手写的,基本流程就是词法语法解析,利用LLVM的API生成中间代码并执行。
我用visual studio编译的LLVM(version 3.6)实现过Kaleidoscope,我遇到的坑不少,如果你想以visual studio编译的LLVM实现Kaleidoscope,你可能同样会遇到
1. LLVM的生成目标对象为ELF格式,在windows下使用JIT的API时会出现incompatible object format的错误警告,需要在通过重新设定Mole的triple,我的PC的getTargetTriple的结果是“i686-pc-windows-msvc”,直接在后面再加上“-elf”即可
TheMole->setTargetTriple("i686-pc-windows-msvc-elf");
2. LLVM不支持windows下通过动态链接导出函数,如果需要使用C/C++的函数,需要通过addSymbol进行注册
llvm::sys::DynamicLibrary::AddSymbol(/*std::string("_") +*/ "printd", &printd);
3. Kaleidoscope里使用的JIT的查找函数的API,getPointerToFunction已经被弃用了,需要替换为getFunctionAddress
E. 有没有安装好的linux erlang
你需要以下准备材料:
1 GNU unzip 用于解压。
2 tar打包解包程序。
3 GNU make
4 Gcc 之类的C编译器,或者LLVM或clang
5 GNU m4
6 Perl 5
7 相关的库和头文件: ncurses termcap termlib, 软件包名称通常是ncurses-devel之类,自己慢慢在程序管理器中查找。
8 git(可选)
安装过程:
解压源码包:
$ tar -zxf otp_src_19.1.tar.gz
进入源码目录,声明变量。
$ cd otp_src_19.1
$ export ERL_TOP=`pwd`
配置:
$ ./configure
如果你不在配置时添加变量指定安装位置,那么默认会安装在 /usr/local/{bin,lib/erlang}中,如果你没有权限安装在此位置,必须在配置时指定安装安装位置,如安装到/opt/erlang/19.1/{bin,lib/erlang}, 用此选项--prefix=/opt/erlang/19.1
如果构建过程中出错,可能是perl声明了LANG变量,则你可以修改回来:
$ export LANG=C
然后编译:
make
测试
make release_tests
在源码目录release下创建一个test目录,然后测试:
$ cd release/tests/test_server
$ $ERL_TOP/bin/erl -s ts install -s ts smoke_test batch -s init stop
用浏览器查看源码目录下/release/tests/test_server/index.html 的测试报告,一切无误后,进行安装。
make install
运行
% erl
Erlang/OTP 17 [erts-6.0] [hipe] [smp:8:8]
Eshell V6.0 (abort with ^G)
1>
如果你还要编译文档,则声明如下两个变量
$ export PATH=$ERL_TOP/bin:$PATH
$ export FOP_HOME=/path/to/fop/dir
其中,$ERL_TOP变量是源码目录。
然后
make docs
验证正确后,
F. Gcc和llvm编译器有什么区别,我这配置哪个快
LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。
G. 高通snapdragon-llvm-3.8.3-linux64怎么使用的
现在A6的情况还不清楚,只好以A5为参照物,笼统的比一下!(这里指的是Iphone4S的A5)
按苹果官方说法,A6的CPU和GPU性能均为A5的2倍!
而高通四核8064的CPU性能是A5的接近5倍;其GPU性能是A5的2倍以上!
可以说,要论绝对性能的话,8064应该更强,不过,他们用于不同的系统,不能光看硬件性能,应该说他们都够用了!
H. RHEL linux下llvm的安装。安装出现的错误如下,怎么解决或者知道怎么编译,教一下。
缺少关联的文件。
needed by `lib/Target/AArch64/Utils/CMakeFiles/LLVMAArch64Utils.dir/AArch64BaseInfo.cpp.o'.
I. linux编译安装后,能不能把build文件夹删除