为什么 BIND 10 要用 C++ 和 Python 来写 已翻译 100%

oschina 投递于 2013/02/27 20:03 (共 5 段, 翻译完成于 02-28)
阅读 9622
收藏 30
6
加载中

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

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

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

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

fbm
fbm
翻译于 2013/02/27 22:15
3

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

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

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

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

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

fbm
fbm
翻译于 2013/02/27 22:38
2

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

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

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

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

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

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

fbm
fbm
翻译于 2013/02/27 23:28
1

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

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

有一件我们可能会以不同方式来作的事是,选择编写能够同时运行于Python 2和Python 3中的代码,而不是必须要求Python 3。随着时间的推移,这个问题会变得越来越小,因为Python的未来 Python 3,但这个决定给人们带来很多苦恼,为了运行个软件还不得不安装一个新版本的解释器,这让人很不高兴。我希望在2到3年后,我们能够笑谈这些苦恼,而到那时Python 2也已成为一段退色的记忆。
fbm
fbm
翻译于 2013/02/27 23:50
2
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(25)

奔跑的颳牛
奔跑的颳牛
现在没有用过的语言还有很多啊 !!!!
许辰_
许辰_
C++与python结合是王道?
David_Lee_
David_Lee_

引用来自“DUXINLONG”的评论

只要有可能, 我们都尽量使用Python。Python是一种非常流行的语言, 通常在大多数调查中都是嘴流行的脚本语言(可能要除PHP之外)。它具有我们要寻找的所有特性。。。

嘴流行???

我觉得真的是诶。国外的论坛上有很多关于Python的讨论,而且据我这几天的使用来看,Python的库支持真的是非常强大,有很多各种平台上的开源项目。
Xsank
Xsank
学精python却是是件不容易的事
fbm
fbm

引用来自“青耕”的评论

引用来自“oldpig”的评论

"DNS服务器要使用特定的数据结构和算法,所以我们无法依赖用C或者C++编写的底层库。这个要求基本上排除了使用任何解释性语言的可能性。" 超大型逻辑错误。

原文意为需要尽可能的利用底层设施,依赖现有的底层库无法达到这点,进而自然也就无法使用依赖这些底层库的解释性语言。

差不多就是这样的,但原文更强调的是无法利用底层库提高运算速度,我露译了一点,现在加上了,真抱歉
fbm
fbm

引用来自“oldpig”的评论

"DNS服务器要使用特定的数据结构和算法,所以我们无法依赖用C或者C++编写的底层库。这个要求基本上排除了使用任何解释性语言的可能性。" 超大型逻辑错误。

对不起,我刚才通读文章后,重新修改了这个翻译,里面有个翻译错误,这句话完整的应该是:“DNS服务器要使用特定的数据结构和算法,所以我们无法依靠使用C或者C++编写的底层库来提高运算速度。” 因为数据结构和算法特殊,底层用C或者C++编写的库无法直接使用,所以靠使用库无法提高运算速度。这个逻辑就说得通了。对我在翻译中的疏忽所造成的误解,我表示歉意。
fbm
fbm

引用来自“mark35”的评论

通常在大多数调查中都是嘴流行的脚本语言

对不起,是最,不是嘴。
fbm
fbm

引用来自“maxos”的评论

引用来自“DUXINLONG”的评论

只要有可能, 我们都尽量使用Python。Python是一种非常流行的语言, 通常在大多数调查中都是嘴流行的脚本语言(可能要除PHP之外)。它具有我们要寻找的所有特性。。。

嘴流行???

人家说的是国外的情况, 天朝排除在外。

没错,不是作者要排除,而是作者是个外国人,他们哪里很少统计中国的情况。等中国软件技术崛起之后这种情况才会改观哈
fbm
fbm

引用来自“DUXINLONG”的评论

只要有可能, 我们都尽量使用Python。Python是一种非常流行的语言, 通常在大多数调查中都是嘴流行的脚本语言(可能要除PHP之外)。它具有我们要寻找的所有特性。。。

嘴流行???

对不起,输入的时候不小心把最弄成嘴了,真是抱歉地很。我用的这个搜狗输入法,zui对应的第一个汉字老是嘴,不管我选多少次最,真奇怪。不过这不能怪输入法,是我的错。太不认真了。
fbm
fbm

引用来自“阳光灿烂的日子”的评论

Python 2已成为一段褪色的记忆

现在改了一下翻译,加了个原文中没有的词“到那时”,现在这句话变成了:“到那时Python 2也已成为一段退色的记忆。” 这样可能更符合中文的阅读习惯。谢谢你的提示。
返回顶部
顶部