DLang vs GoLang

这次我打算好好写,  因为最近有点闲.


首先介绍两种语言:

DLang

如果你不介意阅读英文, 那么DLang的官网有一份非常好的介绍, 简单概括下就是

  • C太古老了, 缺乏很多新的特性.
  • C/C++太复杂了, 但是语言标准就有数百页之多.
  • C++中有很多常用的, 好的特性是通过标准库实现的, 而非编译器, 这样无法做到最好的优化.
  • D希望简化开发, 降低复杂度, 但同时保留大多数好的特性.
  • 作者希望这能成为C/C++的代替品.
对我来说, DLang意味着:
  • 垃圾回收. DLang采用了多线程GC(有时间我会写写这个), 回收精度很高, 性能损耗却非常小.
  • C Style Syntax. C和D之间类似的代码具有类似的功能.
  • DMD + LDC. DMD是官方的后端, 而LDC则是基于LLVM的后端, 前端则都是相同的DMD Front End. 
  • 松散的特性集合. D拥有运算符重载, 泛型编程, RTTI, 内建复数支持等.
  • 包管理系统. 包的名称和导入与所在文件夹有直接关联, 简化了管理.

GoLang

我没有找到关于Go语言设计哲学的官方文档, Ken, Rox, Rob等人对于这门语言的讨论和介绍散见于他们的博客和群组里.
如果你有兴趣了解这门语言, 官网上有一片 洋洋洒洒的Spec, 

我不太想四处拷贝整理出他们的设计思想, 在这里只说说我看到的:
  • C太古老, 太低级. C++太复杂.(Rob Pike讨论Go语言发端时提到过), 因此需要一个具有现代特性, 复杂度低的语言.
  • 这门语言有最小化的特性集合, 其他内容均有标准库提供.
  • 它具有类似C的语法, 能够编译成二进制代码, 并且内建并发支持.
  • 作者们希望这能成为C++的代替品.
对我来说, GoLang意味着:
  • 垃圾回收. Go有垃圾回收, 至于更详细的可以参看这里.
  • 开源.
  • Pascal Feel C Style Syntax.
  • 大量的语法糖. 

可以看到, 二者的目标都是替代C++, 目标都是简化软件开发. 不过二者的设计思想却是截然相反.
(*二者的目标在某种程度上不太一样, 虽然Go号称是泛用的语言, 但它依然主要是面向网络编程)
很久之前Group上有一篇讨论 DvsGo的帖子, 可以作为参考.


Language Performance

对我来说, 运行速度是最重要的内容之一, 因此首先来看一组对比.所有的语言采用完全相同的代码, 没有特别优化.
三组测试分别是N体问题(测试数值计算速度), 素数(测试整数/逻辑处理), BT(测试内存性能). 其中Go没有编译选项.
每个测试运行5次, 取最优. 左边是时间, 右边是内存.

DLang vs GoLang_第1张图片
DLang vs GoLang_第2张图片


可以看到D-DMD和Go表现相近. 不过基于LLVM的ldc表现相对好些.(*go没有基于llvm的版本)
但二者表现都没法与GCC相比. 内存使用上则是FreePascal占优, 这是来自它标准库的特别处理方法.
不过根据前面提到的 909Bug, Go在32位系统下表现会更差.


Language Style

代码是K-Means, 二者用了类似的算法.

GoLang:
DLang vs GoLang_第3张图片


DLang:
DLang vs GoLang_第4张图片



语法很大程度上基于个人感受,  不过可以看到在普通的环境下并没有什么大的差别. 不过问题在与C的交互上:

首先看看Go下使用GSL的API:

DLang vs GoLang_第5张图片


不但需要引入unsafe包, 并且需要用大量的类型转换(注意第32行). 这点非常容易出错.

D上则好了很多, 只需要简单的声明, 变量是可以互换的. 下面是一个lapack的声明.

DLang vs GoLang_第6张图片


入门/深入阅读资料

D只有两本书比较权威:
剩下的只有D的官网和论坛. 不过好在一书是D语言作者编写的, 内容也非常全面.
DLang vs GoLang_第7张图片



Go语言最近有了不少书, 包括中文的, 等,  英文版有, 等.
不过大部分的质量都不高, 仅仅停留在介绍语法, 介绍标准库, 贴几个示例程序而已. 只能作为入门读物.
DLang vs GoLang_第8张图片







最后, 说个我 自己的小例子.
前阵子需要做文字聚类, 于是随手选了Andrew Ng教授01年的文章实现了下, 最开始用的是Go.
最后整个工程超过了1万行. 分成8个包, 每个包平均由5个文件组成.
测试数据用了1000单词, 2万文章. 结果运行时间超过了48小时. 内存占用高达1.24GB.(编译器: Go1.0.2)
随后我用D重写了整个工程,  最终代码只有4000行. 在同样的机器, 同样的数据上做了测试, 
只花费了25分钟. 内存占用只有124MB.(编译器: DMD)
二者均没有使用并发. 但都很容易实现. Go里可以简单地 go func来实现. D里可以用range和parallelism.map/reduce.
可以看到, 相比于测试里的表现, 实际应用里二者差距还是非常大的. 在更大的数据上(12万文章), Go消耗了接近4GB内存,
而D则只有数百兆.

你可能感兴趣的:(杂谈)