14.1 C/C++
C是一门古老的语言,在1969年由贝尔实验室设计开发,今天仍然是系统领域和高性能计算的主要选择。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点。C++在C的基础上,支持了数据的抽象与封装、面向对象和泛型编程。功能与性能的平衡使C++成为了目前应用最广泛的系统编程语言之一。

本节将介绍三款流行的C/C++开发工具,GCC、LLVM和Clang。
14.1.1 GCC
GCC(GNU Compiler Collection)是一套由GNU开发的编程语言编译器,是一套以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC(特别是其中的C语言编译器)通常被认为是跨平台编译器的事实标准。

GCC可处理C/C++,以及Fortran、Pascal、Objective-C、Java、Ada等多种语言。
将C/C++代码运行在容器内的最简方法,就是将编译指令写入Dockerfile中,然后使用此Dockerfile构建自定义镜像,最后直接运行此镜像,即可启动程序。
- FROM gcc:4.9
- COPY . /usr/src/myapp
- WORKDIR /usr/src/myapp
- RUN gcc -o myapp main.c
- CMD ["./myapp"]
编辑main.c,内容如下:
- #include<stdio.h>
- int main()
- {
- printf("Hello World\n");
- return 0;
- }
现在,就可以使用Dockerfile来构建镜像my-gcc-app:
- $ docker build -t gcc-image .
创建并运行此容器,会编译并运行程序,输出Hello World语句。
- $ docker run -it --rm --name gcc-container gcc-image
- Hello World
如果只需要容器编译程序,而不需要运行它,可以使用如下命令:
- $ docker run --rm -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp gcc gcc -o myapp main.c
以上命令会将当前目录("$(pwd)")挂载到容器的/usr/src/myapp目录,并执行gcc-o myapp myapp.c。GCC将会编译myapp.c代码,并将生成的可执行文件输出至/usr/src/myapp文件夹。
14.1.2 LLVM
LLVM(Low Level Virtual Machine)是伊利诺伊大学的一个研究项目,试图提供一个现代化的,基于SSA的编译策略,同时支持静态和动态编程语言。和之前为大家所熟知的JVM以及.net Runtime这样的虚拟机不同,这个虚拟系统提供了一套中立的中间代码和编译基础设施,并围绕这些设施提供了一套全新的编译策略(使得优化能够在编译、连接、运行环境执行过程中,以及安装之后以有效的方式进行)和其他一些非常有意思的功能。

Docker Hub中已经有用户提供了LLVM镜像,读者可以直接下载使用,不再赘述。
- $ docker pull imiell/llvm
14.1.3 Clang
Clang是一个由Apple公司用C++实现、基于LLVM的C/C++/Objective C/Objective C++编译器,其目标就是超越GCC成为标准的C/C++编译器,它遵循LLVM BSD许可。Clang很好地兼容了GCC。
Clang特性包括:
·快:在OSX上的测试中,Clang比GCC 4.0快2.5倍。
·内存占用小:Clang内存占用一般比GCC要小的多。
·诊断信息可读性强:Clang对于错误的语法不但有源码提示,还会在错误的调用和相关上下文上有更好的提示。
·基于库的模块化设计:Clang将编译过程分成彼此分离的几个阶段,将大大增强IDE对于代码的操控能力。
在Docker Hub中已经有用户提供了Clang的镜像,读者可以直接下载使用:
- $ docker pull bowery/clang
