"Less is exponentially more"的读后感

98 views
Skip to first unread message

Yili Zhao

unread,
Jun 29, 2012, 5:47:48 AM6/29/12
to golang-china
首先谢谢monnand提供资料参考和xing xing的翻译。

先从Rob演讲的主题开始:“为什么 Go,一个被设计为用于摧毁 C++ 的语言,却并未获得 C++ 程序员的芳心?"
"我认为那是因为 Go 和 C++ 有着完全不同的哲学。C++ 是让你的指尖解决所有的问题。”

我曾经做过过一个实验项目,是关于图像处理方面的。
这个实验项目很小,只是一个桌面程序,没有涉及到网络编程和服务器编程。
我们小组成员对C++的理解也很肤浅。

一开始我们看到Boost有一个图像处理范型库-GIL,后来经过一段时间的使用,
发现GIL的设计有些“超范型”,而且学习曲线比较陡峭,对于普通的C++使用者
来说比较难。

因此我们希望设计一个微型库,能够提供一个公共的接口来表示内存中的图像数据。
由于像素有8位的,16位,和32位的等等,因为自然想到使用C++的模板:
template <typename Type, size_t N> class Image {...}
常见的类模板实例包括:Image<Byte, 1>,Image<Byte, 3>, Image<Float, 1>, Image<Float, 3>等。
由于受到STL的影响,我们将类模板Image设计成为像素的容器,并且在其中添加了诸如迭代器之类的STL容器元素。
并且,为了能够方便表示图像数据之间的运算,我们还对运算符进行了重载,能够完成诸如C = A + B这样的运算。
从这个角度来说,C++的范型和运算符重载特性确实给我们带来了便利。

本质上图像处理算法和图像文件的格式没有直接关系,更多的是对内存中的图像像素数据进行处理。
但是,总要把处理后的数据写到相应的图像文件中保持,便于观察实验结果。
我们也想提供一个公共的接口,支持常用的图像文件格式读写,主要包括PNG, JPEG, TIFF。
由于这三种图像格式本身都有相应的C语言库:LibPNG,LibJPEG和LibTIFF,可以在上面进行封装。
这时我们需要使用C++的函数模板:
// 读接口
template <typename I>
bool read(I& image, const std::string& filename) {...}
// 写接口
template <typename I>
bool write(const I& image, const std::string& filename) {...}
其中还需要函数模板重载和模板嵌套模板语法的支持。

我想说自己用了很多时间来学习C++的模板和范型编程,就向Rob提到的:
"C++ 程序员无法转到 Go 是因为他们经过艰辛的战斗才获得对其语言的精确控制能力,
他们不想放弃已经获得的任何东西。对于他们,软件不仅仅是关于让工作完成,而是关于用一个确定的方式完成。"

对于那些能够熟练使用C++的人来说,要转到Go语言应该会很难。

更何况C/C++经过几十年的发展,还积累了很多的库。

Rob提到的“我们并未尝试去设计一个更好的 C++,甚至更好的 C。仅仅是一个对于我们在意的那种类型的软件来说更好的语言。"
Rob所谓“他们在意”的那种类型的程序应该是指服务器端和分布式的程序。如果Go被设计成只是一个更好的C++,
那么很可能和已经存在的D语言一样。

目前在内核编写和驱动领域,C/C++应该更加适合;在图形/图像领域,C/C++和Matlab更加适合。

--
Yili Zhao

shiwei xu

unread,
Jun 29, 2012, 7:25:46 AM6/29/12
to golang...@googlegroups.com
我个人觉得 C++ 程序员转向 Go 是迟早的事情,这中间的障碍主要是想明白得与失。
C++ 是我在 Go 之前最喜欢的语言,但是 Go 确实有让人折服的魅力。

我历史写过不少 C++ 代码,也开放过不少 C++ 库:http://github.com/xushiwei

多数库转向 Go 以后没有太多价值。有一个库例外:https://github.com/xushiwei/tpl,这个库一个很优雅的例子是 80 行内实现一个复杂的计算器( https://github.com/xushiwei/tpl/blob/master/examples/calculator )。我曾经想把这个库移到 Go 下,不过一方面现在事情比较多,精力有限;另一方面确实 Go 在 DSL 方面的能力无法和 C++ 相比,这个库可能无法很优雅的移植。

之前我做 Go 语言讲座的时候,也有人问过我 Go 对 DSL 支持的问题。我的回答是 Go 语言的哲学是反对在语言内实施一个 DSL 的,也就是说 Go 语言可能更倾向于你去做一个标准的 compiler 来支持 DSL,而不是用 Go 的原生语法取巧来实施 DSL 想达到的效果。



--
Yili Zhao

--
官网: http://golang-china.org/
IRC:  irc.freenode.net     #golang-china
@golangchina



--
许式伟

Gao Ya'nan

unread,
Jun 29, 2012, 10:56:37 AM6/29/12
to golang...@googlegroups.com
有些地方需要精确控制,对时序和时间有苛刻的要求,如驱动程序,这方面 C、C++和汇编会有优势,不过个人以为 C 和汇编更容易掌握一些。

更多的地方是完成某些功能,而不需要精确控制,这个地方 C++ 又并非优选。

我觉得没有完美的语言,以增加特性让语言达到完美是适得其反的。

2012/6/29 shiwei xu <xushi...@gmail.com>:

Xing Xing

unread,
Jun 29, 2012, 11:59:32 AM6/29/12
to golang...@googlegroups.com
于 Fri, 29 Jun 2012 22:56:37 +0800
"Gao Ya'nan" <abutt...@gmail.com> 写道:

> 有些地方需要精确控制,对时序和时间有苛刻的要求,如驱动程序,这方面
> C、C++和汇编会有优势,不过个人以为 C 和汇编更容易掌握一些。
>
> 更多的地方是完成某些功能,而不需要精确控制,这个地方 C++ 又并非优选。
>
> 我觉得没有完美的语言,以增加特性让语言达到完美是适得其反的。
>

最近尝试用 cgo 做了个玩具,https://bitbucket.org/mikespook/goemphp
发现真需要精确控制,其实 go 联合 c 能做得很好。

平民四月份

unread,
Jun 29, 2012, 7:09:45 PM6/29/12
to golang...@googlegroups.com
在我看来现在在go中,有一些设计是违背这个原则的,典型表现是new(Object)/&Object{}这一对,另外我也搞不明白Println/fmt.Println在什么时候用什么....

@Xing Xing,星哥来篇blog,普及下cgo.也许是偏见我个人比较不太喜欢这东西.

2012/6/29 Xing Xing <mike...@gmail.com>
--
官网: http://golang-china.org/
IRC:  irc.freenode.net     #golang-china
@golangchina



--
 Face the sea, for the spring flowers blossoming




Gao Ya'nan

unread,
Jun 29, 2012, 7:14:42 PM6/29/12
to golang...@googlegroups.com
2012/6/29 Xing Xing <mike...@gmail.com>:

同意,因为我写了一个简单的扫描 pci 配置空间的程序。

chai2010

unread,
Jul 4, 2012, 9:38:33 PM7/4/12
to golang...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages