多年后再用D做项目,回来留个脚印

lifc 2015-10-31
距上次用D开发已有5、6年。这次重回D阵营,查资料恰巧看到自己多年前旧帖,回来留个脚印。

这期间完成的项目都用C、C++、Lua。这次准备用D重写一个有实时性要求的分布式系统,核心节点须在几百~几千指令周期完成特定任务,否则会丢失外部信号。非实时部分通过RPC连接多个节点,要求自动生成接口代码。

原型选择C+Lua(LuaJIT),选C的原因是核心(实时)部分开始设想要在几十~几百KB内存的ARMv7设备上运行,但这一目标后期调整为有较大内存的ARM或X86嵌入式设备。

同时有分布式需求,大量用到RPC。服务描述、请求打包、派发这些C实现相当累,开发人员和用户对开发效率不太满意。

本来Lua这方面是强项,但实时性不理想。虽然用LuaJIT的FFI直接操作内存,谨慎处理每个对象分配,但处理外部高频波形时偶尔还会出现GC停顿。大约每分钟1、2次,每次1~5ms,示波器明显看到响应时间延长。
lifc 2015-10-31
原型完成后考虑换种实现语言,选D之前做了很多尝试。

尝试1:首选C++,但是:
1、用上STL,数据、逻辑处理顺畅了,只是各种潜在堆分配、析构、引用计数维护(原子操作锁总线)等等都会拖慢处理速度
对底层开发人员来说,这些机制并非必须(但却有传染性,算是C++的无奈)

2、为实现RPC用到了富含各种技巧的模板技术。自己写完不愿看,其他成员看不懂,用户不敢看,编译器看不清。用户开发遇到问题,见到编译器丢出来几百、上千行错误信息,当下崩溃(clang++这方面好点)

3、模板代码内联能提升单次运行速度,但一个用到string+map的十几行函数生成10KB+目标代码(gcc -O2优化,-Os好一些),这样的函数成千上万,严重浪费L1 Cache,最终拖慢整体运行速度

4、RPC系统普遍应用模板和各种绑定,与Python、Lua甚至是C互相调用相当麻烦,boost的加入也让编译速度变得难以忍受

尝试2:后来试用Erlang,软实时、分布式、跨平台方面符合要求,只是对团队成员和用户来说门槛过高,且通过各种driver、port与C交互不直观,外加VM强制要求SMP平台否则无法正确处理C->Erlang回调(单CPU运行SMP VM效率受影响)

尝试3:Go语言开发原型确实舒服。不过一方面Go缺少范型、模板,只能牺牲性能借助运行时反射实现某些需求,另外1.5的escape analysis仍不够智能,传递临时数组、对象会产生heap分配,高频调用(100K/s)生成垃圾忒多。虽说1.5版GC明显改进,距软实时目标仍有差距

尝试4:接下来是最近流行的Rust。语言高速进化中,外部库跟不上进度,常无法通过编译。有时用到两个外部库,一个要求nightly版编译器,另外一个要求稳定版。
另外语法较复杂,对程序员充分不信任,要求明确每项资源归属,对很少动态分配内存的嵌入式开发人员来说是种累赘。(Rust文档也提到入门会有这种困惑,渐渐形成习惯就好)
lifc 2015-10-31
尝试5:旧爱D语言。选D的理由是能兼顾运行效率和开发效率,同时能够回避上述问题,总结有几点:
1、项目规模变大,继续用C比较累,D开发效率不输Lua
2、Lua前期开发快,但动态语言不严谨,一些问题延后至运行时暴露。D没有这种问题
3、不想重造太多轮子,D的核心库、社区开源库恰好能满足需求
4、D编译器日趋成熟,dmd、ldc达到生产水平(gdc相对差点)
5、D模板系统很赞,配合CTFE自动生成高效RPC proxy、stub(Go只能用运行时反射实现)
6、D可与C模块无缝连接
7、D语言GC可选、可控(最重要因素)

前几点不表,主要说GC。按说D现有GC不足以满足实时项目,但通过nogc属性及unregister thread可创建独立于druntime的实时线程。只要愿意、有能力自己实现一些基本算法,核心线程以C的思路开发,完全可以不依赖druntime和GC。

有人会问,既然可以把D当作C来实现核心线程,用C++不也一样?原因很简单,实时部分代码量大(仿真多种CPU指令集、外设、数字逻辑器件)但逻辑相对单一,C++、D都胜任。
但外围各种上层(非实时)业务,C++必须手动管理资源,或去招惹那一堆带有传染性的资源管理机制。而用D实现,享受GC便利的同时,偶尔几十ms停顿也不算问题。诚如Linus所言,C++少了C的简约直观,又没有GC语言的省心,以及动态语言快速开发能力,何必自寻烦恼?

总之,自己的爱好、自己的业余时间、自己的项目,有理由找一套能够取悦自己和用户的方案。项目定位特殊,或许不具普遍性,不能(也不敢)以此来论证各种语言优劣。权当解决特定问题的一次思考和尝试,留迹于此供大家参考。
riki 2015-11-02
D 语言学习交流群 264617728, 欢迎加入     
ilovetopview 2015-11-10
@lifc  D的脚步正在加快,2.069了,呵呵
Global site tag (gtag.js) - Google Analytics