为什么 BIND 10 要用 C++ 和 Python 来写

474 查看

英文原文,翻译:开源中国

这篇博文是对来自Twitter的这个问题的答复:

@nodakai: 为什么BIND10非要用C++编写?? 我认为从这个不幸的事件中,托管语言的支持者们有许多需要学习了解的地方

当我开始进行BIND 10的项目工作时,唯一已经做的决定就是要使用哪种编程语言,恰逢预料之中的关于自行车棚的那次讨论之后。 那时最重要的问题是要让项目继续进行,而不是去重启一场可能永无休止的争论,一直讨论到底要使用哪种(或哪些)编程。

话说到这了,我对所选语言感到非常满意。实际上,如果开头就要做这个决定的人是我,我选择的也是同样这些语言。

BIND 9 是用C语言编写的。在它设计和编写之时 —— 在20世纪末 —— 这真是一个唯一合乎逻辑的选择。C语言在阅读和编写方面相对简单,很多平台都支持它,并且还能生成运行速度飞快的代码。 此外,C缺乏能够支持软件工程的语言特性,而且完全不安全。

于是,当ISC开始正式考虑BIND 10时 ——大约是2006年左右 —— 就提出了新项目要使用哪种语言的问题。

第一个很显然的问题是,“为什么不用C?” 下面给出部分答案:

  • C中的字符串操作实在是个乏味的苦差事
  • C缺乏很好的内存管理机制
  • 错误处理有随意性且难弄
  • 封装和其它面向对象的特性只能通过模仿才能实现

大家都一致认为,我们可以做得更好。问题是“怎样才能准确的做到这一点?”

要选择一门新的语言,当然要满足一些要求:

  • 该语言必须处于相对主流的位置。
    Wikipedia上关于编程语言的页面 中列出了600多种语言,而且还没有列完。然而,BIND 10有一个目标是,要让大家很简单就能上手。尽管使用类似Eiffel或Prolog的这类语言后,因为它们比较新奇所以有可能会吸引一些开发者,但对于大多数程序员来说却是个难以逾越的障碍。还有第二个理由,ISC要保证,无论选什么语言都必须能够找到熟练的开发者。
  • 该语言必须能够解决C语言中的绝大多数问题。
    理想情况下,这意味着,该语言必须能优雅的处理字符串、内存垃圾回收,异常处理,并且还是面向对象的。
  • 该语言在CPU密集型运算方面速度要非常快。
    现代的DNS服务器很大程度上是属于计算密集型的,无论是在有授权还是在递归解析的情况下都是这样。DNS服务器要使用特定的数据结构和算法,所以我们无法依赖用C或者C++编写的底层库。这个要求基本上排除了使用任何解释性语言的可能性。

我们最终选择的方式是混合使用两种编程语言:

  • Python
    只要有可能, 我们都尽量使用Python。Python是一种非常流行的语言, 通常在大多数调查中都是最流行的脚本语言(可能要除PHP之外)。它具有我们要寻找的所有特性。。。就是在性能方面有点问题。
  • C++
    当有必要时,我们会使用C++.
    C++也是一门非常流行的语言, 而且也具有我们要寻找的所有特性。然而,C++绝不是一门很容易就能使用起来的语言,于是我们想了个主意,就是我们在可能的情况下要避免它的复杂性。

如果你在很早的时候学过C++但没有在现在的C++编程环境下编过程序,你可能会对用它来编程有着一些错误的观点。我们使用了Boost库,这里面有个共享指针,能提供一种对动态分配对象的引用计数的手段。实际上,采用资源获得即初始化(RAII)后,就能够解决大量的资源锁定和泄露问题。

到目前为止,结果中我们代码的75%用到是C++,17%用的是Python (链接) ,这个结果表明,BIND 10中的大部分代码对性能要求都很严格。

在选择语言时,其它的项目会有不同的考虑因素,所以,尽管C++和Python是BIND 10不错的选择,但它们可不是适合于每个项目。

但从大的思路上讲,为BIND 10考虑语言选择方面的动因和决策方式在我们的项目开始时很有意义,而且我想它们现在仍然很有意义。

有一件我们可能会以不同方式来作的事是,选择编写能够同时运行于Python 2和Python 3中的代码,而不是必须要求Python 3。随着时间的推移,这个问题会变得越来越小,因为Python的未来  Python 3,但这个决定给人们带来很多苦恼,为了运行个软件还不得不安装一个新版本的解释器,这让人很不高兴。我希望2到3年后,我们能够笑谈这些苦恼,而Python 2已成为一段退色的记忆。