C/C++培训
达内IT学院
400-996-5531
对编程语言感兴趣的读者建议看一看Tiobe Index [1], 它经常会提醒你今年哪几个程序设计语言最流行。这种流行程度当然跟“钱”途有关。
针对苹果手机App编程的语言Objective C其实一直存在,但也是在iPhone风靡全球以后,它才从排行40几位火箭般蹿升到前十位,然后随着Apple公司推荐程序员使用Swift语言,它才逐渐让位给了Swift。
同理,当深度学习库和物联网成为最为关注的未来后,Python语言的地位也逐渐加强,进位到了第五名的位置。每个语言排名此起彼落,是很正常的,不是吗?
但是,不需要仔细琢磨你就会发现:前四个程序语言的地位在近几十年一直遥遥领先,居于统治地位。它们依次是Java, C, C++, C#. Java语言是写一次,就可以在各种平台上跑的那种万金油语言,C/C++是七八十年代以来随着Unix系统软件的广泛普及而长盛不衰,C#则是微软公司的利器,希望克服C/C++的缺点,让Java虚拟机让位于NET平台。
这么多年风风雨雨下来,连提出Java语言的SUN公司都已变成昨日黄花,Java语言的地位依旧稳固,因为它的生命力深深扎根于Oracle,IBM,Google等一系列公司,并得到他们的支持。如今的Android平台下缺省开发语言是Java,大胆预测即便新的Kotlin语言提出来替换它,也不能撼动其根深蒂固的地位。
说了这么多引言,其实我真正想说的是C/C++语言的一个小问题,却又是系统软件工程的一个大问题,估计跟这两个语言的统治地位一样会长期困扰大家。
C/C++的程序通常有两个部分,一个是.h头文件,是通常.c实现文件头上引入的外部引入(include)的程序接口。自从David Parnas提出信息掩蔽原则后【2】,写程序要注意把接口和实现分离开来。虽然这篇文章的历史很悠久,想研究软件工程的朋友还是一定要读一读。
这就带来了一个小问题:接口,或者我们说的应用程序接口API,往往声明了大于实现需要的内容。比如说,
#include <stdio.h>
int main(int argc, char ** argv) {
printf("Hello, world!\n");
}
以上程序是最小的例子了。可是,你要是把头文件stdio.h全部展开,会引入946行代码!946行代码都长什么样呢?大概是这个样子:
。。。
23 #ifndef _STDIO_H
24
25 #if !defined __need_FILE && !defined __need___FILE
26 # define _STDIO_H 1
27 # include <features.h>
28
29 __BEGIN_DECLS
30
31 # define __need_size_t
32 # define __need_NULL
33 # include <stddef.h>
34
35 # include <bits/types.h>
36 # define __need_FILE
37 # define __need___FILE
38 #endif /* Don't need FILE. */
。。。
比这还绝的是,引入的第27行又递归地引入更多的头文件,又是163行代码。。。如此一来一去(术语称为预处理),你会得到852行代码,让编译器去理解。
可是,从这个程序的意图上说,你只需要那么一行声明:
extern int printf (const char *__restrict __format, ...); 就能够编译通过了。
问题说清楚了,当你的程序引入头文件的时候,编译器不分青红皂白的处理全部信息,就会浪费宝贵的编译时间。如果有办法自动地规整程序,简化为只引入必要的信息,就能够有效地缩减编译器计算的时间。
Java和其他程序语言当然也有类似的问题,但是在C/C++程序中表现得尤其明显。因为系统软件,比如Linux Kernel, DB2,嵌入式系统,等等往往很复杂,需要定义许许多多头文件,把它们整理清楚是很有用的工具。细节我就不详细展开了,参见以下参考文献:
【1】 #/tiobe-index/
【2】DL Parnas. On the criteria to be used in decomposing systems into modules.Communications of the ACM 15 (12), 1053-1058
【3】Yijun Yu, Homayoun Dayani-Fard, John Mylopoulos: Removing false code dependencies to speedup software build processes. CASCON 2003: 343-352
【4】Homayoun Dayani-Fard, Yijun Yu, John Mylopoulos, Periklis Andritsos: Improving the Build Architecture of Legacy C/C++ Software Systems. FASE 2005: 96-110
【5】Yijun Yu, Homayoun Dayani-Fard, John Mylopoulos, Periklis Andritsos: Reducing Build Time through Precompilations for Evolving Large Software. ICSM 2005: 59-68
【6】Yijun Yu, Faster Compilation through Lighter Recompilation, The Open University, UK, Technical Report, 2012/07, 2012. pp. 1-5.
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved