之前用 C 写的一个服务端的程序,用到的技术栈是 GLib、GStreamer、libsoup、sqlite、websocket,实现的功能有网络通信,语音播放等功能,服务器端数据库及文件管理,JSON API 等,断断续续花了一年多的时间,代码量 12000 多行。
前一段时间,我将 C 程序大部分功能都砍掉,只保留关键的部分,只保留语音播放和一些关键的网络通信等最基本的功能;
然后用 Ruby 重写了其中的 90% 的功能,C 程序间通过 TCP 实现进程间的通信,,用到的技术栈是 Eventmachine / Sinatra / Sequel 等,花了一个月。代码量 2000 多行。
所有这一切基本完成后,感觉良好,感觉之前都白忙活了,5 倍多的代码量,而且感觉实现的功能还不完善,最害怕有需求变动,现在轻松应对(但是表面上不能表现出来)
之前都是写完代码,然后 make 一下,嗯,没有报错,还不错,接着手工测测就 OK 了。
现在是写完代码,rake test 一下,嗯,0 failures, 0 errors,真香。
对的,我后面用 Ruby 重写的时候,就是像素描一样,很快就搞定了。我决定以后有业务逻辑方面的代码再也不会考虑使用 C/C++ 了,实在有 Ruby 搞不定的,我还会在 GEM 里 用 扩展来搞定。
根据大数据统计
80% 的 c/c++ 使用者觉得 go 好一些
30% 的 ruby 使用者觉得 go 好一些
因为 ruby 更接近人类语言,写起来舒服。
从技术角度做我们这种网络语音应用,用 C/C++ 没有什么大问题。团队其它成员(其实就另外一个小伙伴)是写 C/C++ 的,其它语言没有实战经验,他写好库函数成动态链接库 so,我直接用 c/c++ 调用即可,还能共享代码和人力资源。搞到后面,老板越来越压缩时间,在好几个项目间辗转,我感到力不从心,老板说招人也迟迟不见动静,招来也不不能马上上手,遂萌生了调用 Ruby 大法的想法,一个人顶三。
上面说性能的一些同学,我想说一下,在小公司,就不要操心这个问题了,还是多想想开发效率问题,多为自己着想。
用 Go、Rust 都是爱好,当然 Go 解决了 C++ 的存在的问题,但是 Go 对于 micro controllers 不利呀,把 unsafe 列为禁忌的语言,你看哪个 bootloader 不是 ld 占据固定某片区的。
如果谈爱好当然 including Ruby,其实很多项目如果有了 rb 根本就不需要 C 写得太多 code 了,而且更美观、简短和灵活,灵活我觉得是最重要的,这是能不能加速的重要条件,把 performance 交给 C,把 logic 交给 ruby。
写代码,ruby 和 C 更配哦
有了 mruby 这个小情人以后,Ruby 和 C 搭配很自然,真是用好极了,比 MRI Ruby 那样写 C 扩展或者用 FFI 不是一样的套路。在 mruby 中是以 C 为主,mruby 为配角,很用 C 写的很繁琐的部分可以调用嵌入的 mruby 来完成。有空写一篇。
我有空看看。粗看了一下 async 是采用纯 Ruby 写的,而 Eventmachine 是采用 C++ 扩展的,是否有什么大不同吗?