blogWithMarkdown icon indicating copy to clipboard operation
blogWithMarkdown copied to clipboard

用各种编程语言实现同样的调用

Open spacewander opened this issue 10 years ago • 0 comments

最近几个月的空闲时间里,我一直在做一件事,就是用各种编程语言实现同样的一套“算法”。 虽然名为“算法”,其实指的是C++标准头文件algorithms和numeric里面的一套辅助函数。因为这部分内容一般情况下都称之为STL算法,所以我也可以大胆地宣称自己实现的也叫做“算法”,哈哈。 目前,已经完成了C++/Python/Javascript/Coffeescript/Java这几个版本。由于新学期会有新的目标和计划,所以这个小实验就此打住,估计将来也就这几个版本。算法的时空效率方面,也许倒不是每一个都能遵守。代码实现方面,也更看重于代码是否清晰优雅,而不是效率(毕竟,如果要写出一个高效率的实现,恐怕得死更多的脑细胞)。


聊聊下自己的感受:

第一个版本是C++实现的,用C++实现自带的辅助算法。由于要实现的本身就是为C++量身定做的内容,算法的参数和功能无须作出任何裁改。大部分函数都没有难度。 但是,诸如stable_sort, rotate, prev_permutation, make_heap之类的函数,还是花了一些功夫去思考。

第二个版本是Python实现的。这个版本的实现很快就遇到了一个问题,Python里面的iterator和C++的iterator不是同一个东西。 在Python里面,只有一种iterator;而C++中有各种iterator,输入的/双向的/随机的,等等。 可以这么说,在C++里面,所有可以访问容器中的数据的方式,都算作iterator。而在Python(和其它语言)里,iterator指的是一种在实现了__iter__(或者叫别的什么东西)的接口的容器中迭代访问的对象。 Python里面,只是单单实现了__iter__的对象是不能修改里面的值,即相当于C++的input iterator,你只能拿来input,其他的事情一概不能做。 然而相关的算法中,大部分需要使用Forward iterator。这种iterator允许你在迭代的时候修改当前迭代到的对象。 还好Python里面可以找到差不多的对象,只要该对象实现了__setitem____getitem__即可。严格来说,这算是random iterator的要求。 所以说,这个差不多真是差好多啊。

因此,许多算法在设计的时候,就只能应用在list上,尽管它们并不需要随机访问的要求。

有了C++和Python版本,其他语言的版本就方便很多了。因为可以直接借鉴C++和Python的实现……

第三个版本是Javascript实现的。写了一会儿,发现Javascript跟Java还是很像的,都挺罗嗦。基本上,Python可以找到语法糖,三言两句就能解决的问题,要是使用了Javascript,你就不得不写i < xxx.length; i++....blabla,尽管它们都同为动态语言。写的时候我就猜了下,Javascript版本一定会比Python版本的要长得多,甚至说,比起静态类型的C++,Javascript版本也短不到哪里去。事后看来,确实如此。 而且让人讨厌的是,Javascript函数最后时不时要带上});这样的一串尾巴。处处带花括号就算了,你还要带上小括号,看来JS受C和LISP的影响真得挺深。

第四个版本是Coffeescript写的,Coffeescript不愧是Javascript的加糖版本,一下子就简单很多。写完这个版本,再一次坚定了从Javascript转到Coffeescript的决心。 当然,Coffeescript只是在JS上撒了薄薄一层糖霜。JS里没有的类库,在Coffee里面也没有……甚至说,JS的一些怪癖,Coffee也不能免除。你还是要小心翼翼,才能全身而退。

最后的一个版本是用Java写的。


事后我统计了各语言实现版本使用的行数:

  • c++ : 2145
  • python : 1042
  • javascript : 1724
  • coffeescript : 1269
  • java : 2185

可以看出,Javascript版本的确够罗嗦的,都快赶得上Java和C++了。Coffeescript虽然写起来轻松,但还是比Python的要长,这出乎我的意料之外。 另外Java的长度仅仅比C++的长一点,原本我还以为Java版本会比C++的长得多呢。看来我对Java的偏见,是时候改观了。

spacewander avatar Feb 28 '15 12:02 spacewander