前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Rust 漫画】揭开 Hello World 二进制文件巨大之谜

【Rust 漫画】揭开 Hello World 二进制文件巨大之谜

作者头像
张汉东
发布于 2023-10-20 07:33:37
发布于 2023-10-20 07:33:37
1K00
代码可运行
举报
文章被收录于专栏:Rust 编程Rust 编程
运行总次数:0
代码可运行

创意:张汉东 绘画:ChatGPT DALL•E3

创意来源:本人学习 Rust 过程中的一些踩坑、成长与思考。

如果大家喜欢,欢迎点赞、转发和赞赏,每一位读者对认可是我持续创作的动力。

漫画赏析

漫画解析

当 Rust 新人写下第一个 Hello World 程序时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main(){
    println!( "hello world, Rust");
}

在编译以后,看了二进制文件大小,多半会非常惊讶!你可能看到二进制文件大小高达 4 MB ,而 cpp 的 Hello world 二进制文件才 170kb,相比之下,Rust 二进制文件大小就太大了。

在 2015 年 Rust 1.0 发布之后的两三年内,这个问题曾在社区中引起了很大争议。

为什么 hello world 二进制文件如此巨大?

Rust语言在默认情况下产生较大的“Hello, World!”二进制文件的原因主要与其编译和链接策略有关。

  1. 静态链接
  • 默认情况下,Rust 产生的二进制是静态链接的,这意味着所有用到的库和函数都被直接包含在生成的文件中,而不是在运行时动态地加载。
  • 这一策略有其好处:生成的二进制文件在不同的系统上更具有独立性和可移植性,因为它不依赖于外部的库文件。但这也导致了较大的文件大小。
  • 即便是最简单的Rust程序,也会链接到Rust的标准库,也被称为std。这个库提供了许多基础的功能,如IO操作、线程管理、数据结构等。
  • 这些功能虽然在“Hello, World!”程序中可能未直接使用,但它们被包括在了编译的输出中。

其实 Rust的编译器(特别是其链接器)实际上是智能的,并采用了一个称为“树摇(tree shaking)”或“死代码消除(dead code elimination)”的过程,让它只会链接那些你的程序真正用到的库代码部分。

死代码消除:

  • Rust编译器会分析代码,确定哪些函数、变量和其他结构是未使用的。在编译和链接的过程中,所有未使用的代码(死代码)都不会出现在最终的二进制文件中。
  • Rust的标准库是模块化的。当你使用某个特定的模块或功能时,只有那部分代码会被拉入最终的二进制。例如,如果你的代码从标准库中只使用了 Vecprintln!,那么只有与这些功能相关的代码部分会被包括进来。
  • 静态链接的影响:尽管 Rust 进行了死代码消除,但静态链接仍然可能会导致较大的二进制文件,因为所有必要的代码都被包含在单个文件中。这与动态链接相反,其中二进制文件依赖于外部的共享库。
  • 其他因素:除了标准库和你的代码,还有其他因素可能影响编译输出的大小,例如调试信息、优化等级等。

那么该如何优化编译大小呢?

  1. 发布模式:通过使用cargo build --release,你可以告诉Rust进行更多的优化,并去除调试信息。这通常会显著减小生成的二进制文件大小。
  2. 去除标准库:对于某些特定应用,如嵌入式系统编程,你可能不需要整个标准库。在这种情况下,你可以考虑使用#![no_std]属性来禁用标准库。
  3. 使用strip命令strip是一个可以移除二进制文件中符号信息的工具,进一步减小文件大小。
  4. 其他优化工具和策略:例如,使用upx可以进一步压缩生成的二进制文件。还有其他的Cargo插件和工具,如cargo-bloat,可以帮助你识别和减小二进制文件大小。

社区也有人总结了如何优化编译文件大小:min-sized-rust[1]

其中也提供了一些优化配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[package]
name = "min-sized-rust"
version = "0.1.0"
authors = ["johnthagen <johnthagen@gmail.com>"]
license-file = "LICENSE.txt"

[dependencies]

[profile.release]
opt-level = "z"     # Optimize for size.
lto = true          # Enable Link Time Optimization
codegen-units = 1   # Reduce number of codegen units to increase optimizations.
panic = "abort"     # Abort on panic
strip = true        # Automatically strip symbols from the binary.

最终效果还是可以的。

后记

Rust 编译时间、编译文件大小和性能优化,也一个不可能三角,需要根据实际情况和需求进行权衡。

参考资料

[1]

min-sized-rust: https://github.com/johnthagen/min-sized-rust

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 觉学社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust 生态纯属炒作?3 年写了 10 万行代码的开发者吐槽:当初用 Rust 是被忽悠了
编者按:本文作者是国外一位用 Rust 编程语言开发游戏的开发者,这位作者和他的朋友两人成立了一家小型独立游戏开发工作室,在过去几年中他们致力于开发跨不同引擎的各种游戏。 他们热爱游戏,并在编程和创建各种应用程序(网络或桌面应用程序)方面拥有丰富的经验。他们用 Rust 构建了自己的引擎,称为 Comfy Engine,用于他们的游戏。本文就讲述了他们这三年来使用 Rust 编程语言开发游戏的心路历程。下列内容为 InfoQ 翻译并整理。
深度学习与Python
2024/05/06
8480
Rust 生态纯属炒作?3 年写了 10 万行代码的开发者吐槽:当初用 Rust 是被忽悠了
用Rust编写一个简易的游戏引擎
近年来,Rust语言以其独特的安全性和性能优势在多个领域崭露头角。尤其是在系统编程和性能敏感的应用中,Rust表现出了卓越的能力。而游戏开发正是一个对性能与稳定性要求极高的领域。开发者们逐渐发现,Rust能够很好地满足游戏引擎对高效、低延迟和内存安全的需求。
数字扫地僧
2024/12/13
2040
【Rust日报】2020-08-11 “群集”引擎:数据驱动的游戏引擎和应用框架
独立游戏开发者卡特·安德森发布了群集引擎(Bevy引擎)。这个引擎能用于开发游戏和应用程序,它是免费的开源项目。它的架构充分地利用了Rust语言模块化、速度和开发周期短的特点,可以跨平台、三维渲染,相比竞品,它的编译时间更短,功能更丰富。
MikeLoveRust
2020/08/17
1K0
《C++游戏开发:热门趋势与未来展望》
在当今的数字娱乐时代,游戏产业如同一颗璀璨的巨星,持续散发着耀眼的光芒。而在众多游戏开发技术中,C++以其强大的性能、高度的灵活性和广泛的适用性,成为了游戏开发领域的热门选择。本文将深入探讨 C++游戏开发的热门趋势,并展望其未来的发展前景。
程序员阿伟
2024/12/09
1960
开源游戏引擎:创造无限可能 | 开源专题 No.56
Godot Engine 是一个功能强大的跨平台游戏引擎,可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具,让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上,包括主要桌面平台 (Linux、macOS、Windows)、移动平台 (Android、iOS) 以及基于 Web 和控制器的平台。
小柒
2023/12/26
4880
开源游戏引擎:创造无限可能 | 开源专题 No.56
2021 年 Rust 行业调研报告
作者 | 张汉东 文   前 Rust 语言是一门通用系统级编程语言,无 GC 且能保证内存安全、并发安全和高性能而著称。自 2008 年开始由 Graydon Hoare 私人研发,2009 年得到 Mozilla 赞助,2010 年首次发布 0.1.0 版本,用于 Servo 引擎的研发,于 2015 年 5 月 15 号发布 1.0 版本。 自发布以来,截止到 2021 年的今天,经历六年的发展,Rust 得到稳步上升,已逐渐趋于成熟稳定。 至 2016 年开始,截止到 2021 年,Rust 连续五
深度学习与Python
2023/04/01
1.3K0
2021 年 Rust 行业调研报告
【Rust日报】2022-03-20 ​godot-rust 0.10 版本发布
来自 gankra 的博文。作者经常思考 Rust 中的Unsafe Pointer问题。
MikeLoveRust
2022/04/18
6990
【精华】【Bevy】rusty-bomber游戏项目总结
原文:https://github.com/Cupnfish/Cupnfish-log/blob/master/2021/rusty-bomber%E9%A1%B9%E7%9B%AE%E6%80%BB%E7%BB%93.md 如有转载标出作者即可。
MikeLoveRust
2021/02/23
2K0
【精华】【Bevy】rusty-bomber游戏项目总结
2021 年 Rust 生态调研报告 | 星辰大海 【上篇】
半年前,我写了一篇《三万言|2021 年 Rust 行业调研报告》[1] ,内容主要围绕 Rust 语言介绍 和 行业领域开源应用盘点 两大部分内容。时隔半年,我觉得有必要再写一篇年终的Rust 生态调研报告。因为我想给大家提供一个比较全面的视角,通过挖掘互联网上的各种散落且隐藏的信息,最终绘制出一张 Rust 的“生态地图”,让大家尽量客观公正地去认识 Rust 语言。
张汉东
2022/01/23
1.8K0
继承c语言的rust适合游戏开发吗
我们已经从掌上游戏时代度过了很多年。俄罗斯方块和马里奥游戏虽然外观简单,但易于使用,图形少,编程困难。尽管很难追溯到所有这些游戏的编写语言,但许多游戏都是用C语言编写的,这给编写它们的程序带来了困难。
程序那些事儿
2023/03/07
1.9K0
继承c语言的rust适合游戏开发吗
Bevy 游戏引擎开发指南
作为 Rust 与游戏开发爱好者,我从 Bevy 发布的时候就开始关注它的发展,Bevy 作为一个新生的实验性的游戏引擎,很适合追随它的成长脚步来学习游戏开发,一开始我还在犹豫是否要真正地深入了解和学习它。随着越来越多的人开始使用 Bevy 开发游戏和插件,他们的热情和愿景鼓舞了我,于是我也下定决心投入更多的精力来通过掌握 Bevy 提升自己的游戏开发技巧。
MikeLoveRust
2022/03/28
1.5K0
【Rust日报】2020-08-13 关于群集(Bevy)引擎ECS框架中system的语法糖是怎么实现的
作者表示之前的Instancing部分写的太过繁杂,作者喜欢展示各种不同的技术导致之前该章节与之前的章节相比显得脱节,这次更新简化了该教程。
MikeLoveRust
2020/08/17
1.5K0
【Rust日报】2019-09-23 - 一个用Rust编写的QUIC实现
运行测试http 0.9程序(neqm -client和neqm -server)
MikeLoveRust
2019/09/25
1.1K0
【Rust日报】2019-09-23 - 一个用Rust编写的QUIC实现
Rust初体验和介绍
Rust,一种由Mozilla开发的系统级编程语言,自2010年首次公开发布以来,凭借其高性能、内存安全、并发性以及开发人员友好的语法,逐渐在编程界崭露头角。本文将通过Rust的初体验、基础语法、核心特性、安装步骤以及代码实操等方面,全面介绍Rust编程语言。
小明爱吃火锅
2024/07/08
1870
GitHub 热点速览 Vol.35:Let's Go,Rust 大放异彩
作者:HelloGitHub-小鱼干 摘要:语言之争,一直存在于各类社群,不论是单个编程语言的交流群,亦或是 NoSQL、云开发等技术群,总能看到“要不要换 Go”、“Rust 比 C++ 更强”的影
HelloGitHub
2021/05/14
9010
GitHub 热点速览 Vol.35:Let's Go,Rust 大放异彩
原创 | 整理了38个Python游戏开发库
上次山月给大家分享了32个图形化界面(GUI)库,不知道有没有感兴趣的同学去试着设计一下自己想要的界面~
程序员晚枫
2022/05/14
3.5K0
原创 | 整理了38个Python游戏开发库
每一位 JS 开发者都应该学习如何使用 Rust
第一次接触 Rust 🦀 时,它并未在我心中掀起波澜。大概在两年前,我还是一名Web 开发者,最常用的编程语言是 JavaScript。彼时 Rust 在我眼中,犹如一座高耸入云的山峰,令人望而生畏。
米开朗基杨
2024/04/22
1210
每一位 JS 开发者都应该学习如何使用 Rust
游戏开发设计模式之组件模式
组件模式在游戏开发中是一种常用的设计模式,它通过将多个功能独立包装成单独的组件,可以自由地装配或拆卸,从而达到很好的解耦效果。这种模式特别适用于需要定义许多共享不同能力的对象的情况,而采用继承的方式却无法精确地重用代码。
用户11315985
2024/10/16
2610
游戏开发设计模式之组件模式
Godot3游戏引擎入门之零一:【翻译】为什么要选择 Godot 引擎
2018-08-24 by Liuqingwen | Tags: Godot 翻译 | Hits
IT自学不成才
2019/01/07
2.6K0
Android 游戏开发工具包热门问题解答
我们在 7 月发布了 Android 游戏开发工具包 (AGDK),并收集了一些开发者提出的热门问题,包括 AGDK 库和工具、Android 内存优化以及绘制图形等。
Android 开发者
2022/03/12
1.2K0
推荐阅读
相关推荐
Rust 生态纯属炒作?3 年写了 10 万行代码的开发者吐槽:当初用 Rust 是被忽悠了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验