您的位置 首页 资料

工程师:我与C言语长别离了,由于…

这几天来,我在思考那些正在挑战C语言的系统编程语言领袖地位的新潮语言,尤其是Go和Rust。思考的过程中,我意识到了一个让我震惊的事实——我有着35年的C语言经验。每周我都要写很多C代码,但是我已

  这几天来,我在考虑那些正在应战C言语的体系编程言语首领位置的新潮言语,尤其是Go和Rust。考虑的过程中,我认识到了一个让我震动的现实——我有着35年的C言语阅历。每周我都要写许多C代码,可是我现已记不清楚上一次我创立一个新的C言语项目是在什么时分了。

  假如你彻底不认为这种状况令人震动,那你很或许不是一个体系程序员。我知道有许多程序员运用更高档的言语作业。可是我把大部分时刻都花在了深化打磨像NTPsec、GPSD以及giflib这些东西上。娴熟运用C言语在这几十年里一向便是我的特长。可是,现在我不仅是不再运用C言语写新的项目,乃至我都记不清我是什么时分开端这样做的了,并且……回头想想,我觉得这都不是本世纪产生的作业。

  这个关于我来说是件大事,由于假如你问我,我的五个最中心软件开发技术是什么,“C言语专家”一定是你最有或许听到的之一。这也激起了我的考虑。C言语的未来会怎样?C言语是否正像当年的COBOL言语相同,在光辉之后,走向闭幕?

  我恰好是在C言语迅猛开展,并把汇编言语以及其它许多编译型言语挤出干流存在的前几年开端编程的。那场过渡大约是在1982到1985年之间。在那之前,有许多编译型言语争相招引程序员的注意力,那些言语中还没有清晰的领导者;可是在那之后,小众的言语就直接毫无声气的退出了舞台。干流的言语(FORTRAN、Pascal、COBOL)则要么只限于老代码,要么便是坚守单一范畴,再便是在C言语的边际范畴顶着愈来愈大的压力苟延残喘。

  而在那今后,这种景象持续了近30年。虽然在运用程序开发上呈现了新的意向:Java、Perl、Python,以及许许多多不是很成功的竞赛者。起先我很少重视这些言语,这很大一部分是由于在它们的运转时的开支关于其时的实践硬件来说太大。因而,这就使得C的成功无可撼动;为了运用和对接许多已有的C言语代码,你得运用C言语写新代码(一部分脚本言语测验过打破这种壁垒,可是只需Python有或许取得成功)。

  回想起来,我在1997年运用脚本言语写运用时本应该注意到这些言语的更重要的含义的。其时我写的是一个名为SunSITE的协助图书办理员做源码分发的辅佐软件,其时运用的是Perl言语。

  这个运用彻底是用来处理文本输入的,并且只需求能够应对人类的反应速度即可(大约0.1秒),因而运用C或许其他没有动态内存分配以及字符串类型的言语来写就会显得很傻。可是在其时,我仅仅是把其视为一个试验,而彻底没有想到我简直再也不会在一个新项意图第一个文件里敲下intmain(intargc,char**argv)这样的C言语代码了。

  我说“简直”,首要是由于1999年的SNG。我想那是我终究一个用C从头开端写的项目了。

  在那之后我写的一切的C代码都是在为那些上世纪现已存在的老项目添砖加瓦,或许是在保护比方GPSD以及NTPsec一类的项目。

  当年我本不应该运用C言语写SNG的。由于在那个年代,摩尔定律的快速迭代使得硬件愈加廉价,使得像Perl这样的言语的履行功率也不再是问题。仅仅三年今后,我或许就会坚决果断地运用Python而不是C言语来写SNG。

  在1997年我学习了Python,这对我来说是一道分水岭。这个言语很美好——就像我早年运用的Lisp相同,并且Python还有很帅的库!乃至还彻底遵从了POSIX!还有一个蛮好用的目标体系!Python没有把C言语挤出我的工具箱,可是我很快就习气了在只需能用Python时就写Python,而只在有必要运用C言语时写C。

  (在此之后,我开端在我的访谈中指出我所谓的“Perl的经历”,也便是任何一个没能完结和C言语语义等价的遵从POSIX的言语都注定要失利。在计算机科学的开展史上,许多学术言语的骨骸比比皆是,原因是这些言语的规划者没有认识到这个重要的问题。)

  显着,对我来说,Python的首要优势之一便是它很简单,当我写Python时,我不再需求忧虑内存办理问题或许会导致中心转储的程序溃散——关于C程序员来说,处理这些问题烦的要命。而不那么显着的优势恰好在我更改言语时闪现,我在90年代末写运用程序和非中心体系服务的代码时,为了平衡本钱与危险都会倾向于挑选具有主动内存办理可是开支更大的言语,以抵消之前说到的C言语的缺点。而在仅仅几年之前(乃至是1990年),那些言语的开支仍是大到无法承受的;那时硬件工业的开展还在前期阶段,没有给摩尔定律满足的时刻来发挥威力。

  尽量地在C言语和Python之间挑选C——只需是能的话我就会从C言语转移到Python。这是一种下降工程杂乱程度的有用战略。我将这种战略运用在了GPSD中,而针对NTPsec,我对这个战略的选用则愈加体系化。这便是咱们能把NTP的代码库巨细减少四分之一的原因。

  可是今日我不是来讲Python的。虽然我觉得它在竞赛中锋芒毕露,Python也未必真的是在2000年之前彻底完毕我在新项目上运用C言语的原因,由于在其时任何一个新的学院派的动态言语都能够让我不再挑选运用C言语。也有或许是在某段时刻里在我写了许多Java之后,我才渐渐远离了C言语。

  我写这个回忆录是由于我觉得我并非特例,在世纪之交,相同的开展和改变也改变了不少C言语内行的编码习气。像我相同,他们在其时也并没有认识到这种改变正在产生。

  在2000年今后,虽然我还在运用C/C++写之前的项目,比方GPSD,游戏韦诺之战以及NTPsec,可是我的一切新项目都是运用Python的。

  有许多程序是在彻底无法在C言语下写出来的,尤其是reposurgeon以及doclifter这样的项目。由于C言语受限的数据类型本体论以及其软弱的底层数据办理问题,测验用C写的话或许会很恐惧,并注定失利。

  乃至是关于更小的项目——那些能够在C中完结的东西——我也运用Python写,由于我不想花不必要的时刻以及精力去处理内核转储问题。这种状况一向持续到上一年年末,持续到我创立我的第一个Rust项目,以及成功写出第一个运用Go言语的项目。

  如前文所述,虽然我是在评论我的个人阅历,可是我想我的阅历表现了年代的趋势。我等待新潮流的呈现,而不是仅仅跟从潮流。在98年的时分,我便是Python的前期运用者。来自TIOBE的数据则标明,在Go言语脱胎于公司的试验项目并刚刚从小众言语中锋芒毕露的几个月内,我就开端完结自己的第一个Go言语项目了。

  总而言之:直到现在第一批有或许应战C言语的传统位置的言语才呈现。我判别这个的规范很简单——只需这个言语能让我等C言语内行承受不再写C的现实,这个言语才“有或许”应战到C言语的位置——来看啊,这有个新编译器,能把C转化到新言语,现在你能够让他完结你的悉数作业了——这样C言语的内行就会高兴起来。

  Python以及和其相似的言语对此做的并不够好。运用Python完结NTPsec(以此举例)或许是个灾祸,终究会由于过高的运转时开支以及由于废物收回机制导致的推迟改变而烂尾。假如需求是针对单个用户且只需求以人类能承受的速度运转,运用Python当然是很好的,可是关于以机器的速度运转的程序来说就不总是如此了——尤其是在很高的多用户负载之下。这不仅仅我自己的判别——由于拿Go言语来说,它的存在首要便是由于其时作为Python言语首要支撑者的Google在运用Python完结一些工程的时分也遭受了相同的效能痛点。

  Go言语便是为了处理Python搞不定的那些大多由C言语来完结的使命而规划的。虽然没有一个全主动言语转化软件让我很是不爽,可是运用Go言语来写体系程序对我来说不算费事,我发现我写Go写的还挺高兴的。我的许多C编码技术还能够持续运用,我还收成了废物收回机制以及并发编程机制,这何乐而不为?

  (这儿有关于我第一次写Go的阅历的更多信息)

  原本我想把Rust也视为“C言语要过期了”的例子,可是在学习并测验运用了这门言语编程之后,我觉得这种言语现在还没有做好预备。或许5年今后,它才会成为C言语的对手。

  跟着2017的结尾降临,咱们现已发现了一个相对老练的言语,其和C相似,能够担任C言语的大部分作业场景(我鄙人面会精确描绘),在几年今后,这个言语界的新星或许就会取得成功。

  这件事含义严重。假如你不长远地回顾前史,你或许看不出来这件作业的巨大性。三十年了——这简直便是我作为一个程序员的悉数生计,咱们都没有比及一个C言语的继任者,也无法眺望C之后的体系编程会是什么姿态的。而现在,咱们面前忽然有了后C年代的两种不同的展望和未来……

  ……另一种展望则是下面这个言语留给咱们的。我的一个朋友正在开发一个他称之为“Cx”的言语,这个言语在C言语上做了很少的改动,使得其能够支撑类型安全;他的项意图意图便是要创立一个能够在最少人力参加的状况下把古典C言语修改为新言语的程序。我不会指出这位朋友的姓名,以免给他太多压力,让他做出太多不切实践的确保。可是他的完结办法真的很是有意思,我会尽量给他征集资金。

  现在,咱们看到了能够代替C言语完结体系编程的三种不同的或许的路途。而就在两年之前,咱们的眼前仍是一片乌黑。我重复一遍:这件作业含义严重。

  我是在说C言语即将灭绝吗?不是这样的,在可预见的未来里,C言语还会是操作体系的内核编程以及设备固件编程的干流言语,在这些场景下,极力压榨硬件功能的陈旧规矩还在见效,虽然它或许不是那么安全。

  现在那些即将被C的继任者攻破的范畴便是我之前说到的我常常触及的范畴——比方GPSD以及NTPsec、体系服务以及那些由于前史原因而运用C言语写的进程。还有便是以DNS服务器以及邮件传输署理——那些需求以机器速度而不是人类的速度运转的体系程序。

  现在咱们能够对后C年代的未来窥见一斑,即上述这类范畴的代码都能够运用那些具有强壮内存安全特性的C言语的代替者完结。Go、Rust或许Cx,无论是哪个,都或许使C的存在被弱化。比方,假如我现在再来从头完结一遍NTP,我或许就会坚决果断的运用Go言语去完结。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/114712.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部