http://www.lingcc.com/2011/03/28/11552/
不仅仅是“屠龙之技”-编译器开发者的精神胜利!
时不时听到周围作编译器相关工作的朋友、同学,对编译这个行业的未来持不乐观态度。诚然,芯片厂商可以通过优化芯片内的结构调整,很容易获得百分之十几以上的加速。而相比之下,编译器方面的静态优化,由于几十年的发展,能挖的性能很有限了,平均能有个10%左右的加速,发表一篇PLDI级别的文章,问题不大。有机会接触芯片细节,并据此开发编译器的,只有几个芯片设计公司;有机会接触到中端优化的,还有一些主推整套平台的一些公司。另外,就是些小的只做编译器的公司。不管是国内,还是国外,因为开源和芯片体系结构单一化,编译器开发职位正在慢慢减少。即使做了这方面的工作,往往也是非主流。不是销售,不是直接赚钱的研发。碰巧,那龙书又是以龙为封面,“屠龙之技”可谓恰到好处的一个词。
但本博比较喜欢把编译技术看成一种内功,没有花样繁多的招式,命令行一敲,性能测试结果出来,高了就是高了,不行就是不行,只有简单的对错。但一招一式扎实有力。
先来看看编译涉及的技术:
- 自动机相关理论
- 语法制导翻译相关理论
- 后端优化涉及的就更多
- 寄存器分配
- 指令调度
- 控制流图分析
- 运行时技术
- 垃圾收集
- 即时编译
从编译器开发的角度来说,开发这些技术是为了解决其中重要的问题。
从程序员的角度,这些理论为设计算法和组织程序提供了很多帮助。自动机相关理论,让程序更加简洁;语法制导翻译,方便设计和开发数据属性在整个软件控制中的流动;后端的理论也同样,如图着色,图算法这些。对于计算机相关非技术从业人员,这些技术背景,能帮助他拨开商业宣传的迷雾。任何语言,不管是C、Java、Python、Perl还是XML、HTML,甚至LATEX、SQL都会涉及到前端技术。再往大了说,要制定计算机相关的规则,要指定的尽量科学,这些理论和技术都是逃不掉的。
看看这个招聘:
c/c++应用分析与优化专家 北京 上海 24–32万职责
负责客户系统中c/c++应用的深度健康检查和分析,发现潜在风险,解决架构/性能疑难问题:
1) 负责企业应用架构的分析、咨询
2) 负责c/c++应用系统深度健康检查及性能分析
3) 负责c/c++应用问题/故障根本原因分析及诊断
4) 性能优化方案的制定及调优实施,
5) 提供客户性能改进的最佳实践
6) 快速响应并及时解决重大故障和问题
7) 进行性能优化服务等相关服务产品的开发
能力素质要求:
1) 精通unix c/c++语言
2) 精通unix(HPUX/AIX)c/c++的开发、编译、调优方法与工具
3) 精通CORBA技术
4) 精通HPUX/AIX/Solaris/Linux等操作系统环境
5) 熟悉oralce/informix数据库
6) 熟悉tuxedo等中间件者优先
7) 良好的沟通协调能力
8) 具备良好技术方案编写能力
9) 团队协作精神与主动性
教育工作经验要求:
1) 本科以上学历
2) 10年以上工作经验
3) 8年以上unix c/c++开发、调优经验
4) 具有电信/金融行业等企业级应用系统开发维护经验者优先信息来源:http://hunterfrank.blog.163.com/blog/static/16846334120112289168644/
单就薪水来讲,在这个有Hadoop、搜索背景应届硕士至少16W+的时代,十年的工作经验20-30W,不算多.但这工作更多看重的是经验积累。
精神YY完了,说正事。计算机,说到底,只是个工具,编译器是为了更好的使用工具而创造的工具。所以编写应用程序才是王道。而编译器始终都是一个小众化的东西,但因为必不可少,所以还是有人要做。养家糊口而已。
一个公司要想做大,并做到至少百年的老店。核心竞争力是要有的。核心竞争力要么是自称体系能拿的出的一整套方案,这个在生产硬件的厂商里特别明显,比如IBM,Apple都开始从芯片到系统,从硬件到软件都做。Oracle也收购了Sun,基本也构成了整个体系。HP估计有一天也会完全控制安腾的研发。而对于互联网公司,要么拼无法拷贝的模式,如豆瓣和各种成功的博客;要么拼人气,比如人人和QQ。否则,再好的创业,只有被拷贝的份。
慢慢的公司起来了,就像极了传统行业,需要长久的经验积累,而企业为了留住有经验的人,也需要付出诚意。估计这就是为啥有很多人说IBM和HP之流比较像国企了。
想不通以后的时候,就找个已有的模型来描述它:建筑业。互联网公司更像是房地产开发公司,时时刻刻围绕着消费者转,作他们最需要的。服务器厂商更像是造专职的建筑公司。而编译器就像重型建筑设备,有了他,事倍功半。必须承认,房地产公司是整个建筑行业最有可能赚大钱的。同理,互联网也一样,所以互联网行业需要更多的人,有更高的薪水吸引最好的人。当然,竞争也是最激烈的。
接触过编译器技术的,基本上都挺喜欢的,从YY的角度,就不把这种感情解释成恋旧了。不管作什么,坚持自我的提高肯定是没错的。只要是一个还有用的方向,假以时日,肯定能做出来点东西。
不过,技术仅仅是一方面,技术要有用,对大多数人有用,才是好。否则,那是练功练的走火入魔了。
其实这篇文章的主题是:看,搞编译的,也能挣点钱,对于现在的我,好高骛远要不得,要实干,路在脚下,事在人为。
编译方向是个值得考虑的选择
写这篇文章,是为了纠正上篇关于编译技术职业发展的帖子中自己的观点可能带来的误导。
尽量让面临硕士、博士选方向的学弟学妹了解编译知识在未来计算机技术职业生涯中的重要性,以及光明的未来方向。
Table of Contents
1 要有独门秘籍
要想体现自己的价值,就要有一个独门秘籍。不管是自己开公司,卖产品。还是打工,挣钱。都要有别人做不到,只有你才能做到的才行。
高薪,是因为你能给别人带来价值。薪水的高低,要看你的技术能否满足社会的需要,是不是社会所必须的。比如,曾经会点MFC,能做个简单的网站,就能找到很不错的工作。但现在可能,Android系统开发,网络(协议栈),手机应用开发更加火爆。而且一定要学的精,才有好的薪水,才能开能活下来,赚到钱的公司。
那些不可或缺的、高精尖的技术是首选。比如,最底层的微波、电路相信谁都知道它的重要性,不可或缺。大学本科时,师兄说过一句玩笑话:搞微波的,玩多高的频率,就能挣多少钱。不过学过电磁场理论的人都知道有多痛苦。参考中的链接1和2也能说明这个。其中参考2,针对复旦大学毕业生就业的分析,有下面一段话:
硕士毕业生的实际薪水排名前三位的专业依次是国际法、电路与系统、电磁场与微波技术,调查发现,这三个专业的实际薪水比期望薪水高
编译就是这样一种独门秘籍,有很高的门槛,而又不可或缺。总要有人写程序。有人要性能更好的程序,但又不想多写代码,不想错误百出,不想调优。编译器,或者更大点,一个好的编程环境是所有程序员最欢迎的。
2 三十年河东,三十年河西
在计算机行业,这个可能要缩短到20年。并行计算,在计算机刚刚出现的时候,也非常热门。不过自从上世纪九十年代到04年左右,有关并行计算的研究就非常少了。因为CPU的频率增加,使得串行程序只要换换CPU就能跑的更快了。但今天,并行计算又成了重要的研究方向。
CPU的结构,从单发射、顺序执行的标量处理器,到多发射、流水线、乱序执行的超标量处理器,曾经给处理器性能带来了很大的提升。但今天,功耗问题、成品率、芯片面积等问题,使得几乎所有的众核处理器又回到了顺序执行的模式。
向量机 90年代的时候也很火爆,但随着标量处理器的性能提升,渐渐被冷落了。但如今,GPU、Intel的AVX2,又隐隐约约看到了一点向量机的影子。
整个产业界处在不断的变化,更新之中。技术和方法基本就那么多,至少不同的历史时期,需要不同的排列组合方式,把他们放到一起,再加上不断的技术革新。只有一个因素永远不会变,就是使用计算机的人。而编译器正是供计算机从业人员使用(虽然Office软件,浏览器也是)。另外一个因素,目前来看也还没怎么变,就是计算机的执行模型。而编译器的最后结果是提供给执行模型的。所以编译器这个技术,更像铁饭碗。尤其是体系结构比较乱的今天。
3 要练好内功。
内功是最上乘的武功,计算机科学的内功:就是算法和体系结构。
算法,不用多说。实际中遇到的问题,如何利用计算机这种确定的、有限状态的、非连续的工具去解决,就是算法要研究的问题。当然这个算法中,还包括数据结构,好的数据结构才能更好的对现实问题做建模,以便供算法处理。
体系结构方面,目前来看,基本就没有变化,依然是冯-诺依曼的结构,不过多核和众核的并行执行模式,可能会带来一些新的变化,这也是为什么最近并行研究如此的热。有了体系结构这种内功,你就知道如何使用计算机。体系结构包括底层相关的,不仅仅是CPU、主存、cache、硬盘,还包括上层的操作系统和编译器。虽然说执行模型很简单,但操作系统和编译器里的学问也很大。操作系统牵涉到资源的分配问题,编译器牵涉到人与机器的交互问题。
其他神马,从计算机技术的角度看,都是浮云。
比如,上层语言经历了从汇编,到宏编程,到命令式语言(C),到面向对象编程(C++),到脚本语言(Python),以及编译+解释语言(Java)的大致演进过程。语言五花八门,我们不去争论应该学哪个,不该学哪个。最后这些语言,都要用那些指令在CPU上执行起来。不管上层扯什么语言特性,什么编译执行或者解释执行。最后,都是一系列的算术、逻辑、跳转指令;以及一系列的寄存器。语言到指令的过程,就是编译器和解释其(JVM)要做的工作。语言标准只是一些具体的规定语言如何实现而已。
比如,了解了Java所有对象都基于Object类,C#为底层CPU指令支持的数据类型,如整型,单/双精度浮点类型生成更直接的CIL代码,你就知道为什么使用C++的模板会生成很大的可执行文件,为什么Java的模板实现代码会比C#的模板代码性能略差一些。
什么基于C语言的Glibc标准库,基于C++的boost代码库,基于Python的Django网站架构,基于Java的J2EE web架构。除去上层的整个系统的结构设计,算法设计外,其他堆砌代码的工作居多。(搞编译,调bug最多)
4 厚积薄发
前不久,听张晓东老师介绍Mapreduce,台下一个老师疑问,数据库方向的研究专家许多年前就意识到需要更大的存数据的软件,研究了这么多年好像都没有太显著的进展。为什么一个搞搜索的互联网公司,却能发明这种Map 加 Reduce的机制来应对大规模的数据存取。“ 张晓东老师的回答是,Google的创始人从函数式语言中得到的灵感。MapReduce机制的两位发明人 Jeffrey Dean 和 Sanjay Ghemawat,一个是做程序设计语言的, 一个是研究面向对象数据库的。
前不久,听 Yuanyuan Zhou 老师讲座。周老师也是华人计算机学术界的榜样之一,其领导的研究组在国际上是绝对数一数二的,在最顶级的会议上每年都有数篇高质量的论文。
不仅仅如此,她们还在将成果做成产品,比如 Pattern Insight.这个公司致力于应用机器学习的方式来协助程序员编写程序,发现代码bug。这里面有意思的工作包括:结合代码注释发现bug,利用机器学习的方法来寻找操作系统中许多复制粘贴代码中的bug,利用条件分支语句的逻辑推导增强软件中的log输出,以便得到更丰富的log信息等等。可以从这里找到许多她们所从事的研究工作。可以看到许多针对源代码的分析工作,都能看到很多编译的影子,她们的工作应该偏向于利用语法和语义方面的技术。她们的很多工作都是在实际的开源项目,如Linux内核、浏览器、apache、mysql中寻找bug,因此公司比较欢迎这种实用的技术创新。
虽然,其他还有很多可以选择的方向。但当你迷茫,不知道要学点什么的时候,又想以后从事计算机方向的技术类工作时,编译是个值得考虑的选择。
这个网站网站常年发布编译方向招聘信息,感兴趣的可以把握把握技术需求的方向:Compiler Jobs