Rust玩具-企业微信机器人通用服务
Rust的第二次接触-写个小服务器程序
JUST PRACTICE
蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小型的服务器程序吧。
可执行文件压缩
前言
最近看Rust相关东西的时候看到一篇关于压缩可执行文件的文章。压缩可执行文件对嵌入式开发特别有用,但是延伸一下用来减少我们游戏行业里预编译的工具二进制包大小和Android/iOS的库也是蛮有用的。
原文见这里: https://jamesmunns.com/blog/tinyrocket/
基本流程
- Release编译,移除调试符号文件,开启最小化size优化(-Oz)
- 使用LLVM的全量LTO
- 使用xargo重新编译标准库(std)和核心库(core)(这个C/C++不容易模仿,而且编译选项十分难搞)
- 移除jemalloc(服务器程序还是留着比较好,内置的malloc实现一般碎片比较厉害。虽然C/C++默认也不是jemalloc,很多项目为了新能还是会用它)
- 移除panic的详情信息(这个仅适用于Rust)
- strip(由GNU的binutils提供),参考命令:
strip [二进制]
- UPX进一步压缩加壳
尝试改造优化
然后尝试使用上面的流程改造我们的 gmtools-cli 。原先我是直接开LTO+Release编译的,编出的文件大小为4.4MB(4520728字节)。
初识Rust
前言
虽然我主要使用C++,但是最近也想学点现代化的新语言。初步想的是从golang和Rust里先选一个。
这两年golang在国内很火,最大的特点莫过于语言层面提供了协程支持,能够极大地简化异步逻辑地理解。我之前也接触过一点,还写了个goroutine压力测试对比我的libcopp的性能。但是golang的语法我实在不喜欢,特别是那个不管啥类型声明都是反着来,感觉在复杂的类型下会非常反人类。而且听用过的人说golang的GC还很不稳定。另外之前有新闻说golang正在准备2.0,2.0版本即将加入泛型支持,然后导致很多语法不兼容和语法分析得重写。所以我还是懒得踩这个坑了,至少等2.0出来再说。
Rust是Mozilla搞出来想拿来重写Firefox的。说实话Mozilla和Google还有点差距,导致Rust的发展还比较慢。对比起来就是感觉golang很快就提供了一些快速可用的原型给大型项目使用,标准库也足够丰富。而Rust还纠结在底层、语言层面的优化和最求极致。很多组件都还不成熟,编程设计模型也还没完全统一。
但是接触了一点Rust以后,我发现Rust真的是挠到了C++程序员的痒点,语言层面解决了用C++得费很多脑力和用各种奇技淫巧实现并且还不能完全阻止被绕过的质量控制问题,而且保留了C++很多编译期推断得高级特性。并且和C++一样,提供给你能力,但不限定你方法提供 零成本抽象(zero-cost abstractions) 或者说叫 零开销(zero-overhead)。