惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
人人都是产品经理
人人都是产品经理
C
Check Point Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 聂微东
Help Net Security
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
L
LINUX DO - 最新话题
Cloudbric
Cloudbric
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
O
OpenAI News
V2EX - 技术
V2EX - 技术
H
Hacker News: Front Page
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
PCI Perspectives
PCI Perspectives
爱范儿
爱范儿
Hacker News - Newest:
Hacker News - Newest: "LLM"
Martin Fowler
Martin Fowler
S
Schneier on Security
Webroot Blog
Webroot Blog
Know Your Adversary
Know Your Adversary
云风的 BLOG
云风的 BLOG
H
Help Net Security
I
InfoQ
Simon Willison's Weblog
Simon Willison's Weblog
雷峰网
雷峰网
J
Java Code Geeks
V
Visual Studio Blog
MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
Google Online Security Blog
Google Online Security Blog
Spread Privacy
Spread Privacy
有赞技术团队
有赞技术团队
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
www.infosecurity-magazine.com
www.infosecurity-magazine.com
A
About on SuperTechFans
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
TaoSecurity Blog
TaoSecurity Blog
WordPress大学
WordPress大学
S
Securelist
P
Proofpoint News Feed

文章列表 on polarisxu

通过一个例子让你彻底掌握 Go 工作区模式 这道题正确率竟然只有 22% Go 开源项目推荐:一个简单的 Go 练手项目 go test 如何禁用缓存? Go1.18 快讯:constraints 包被移除标准库 跟着 Go 作者学泛型 「2022 版」轻松搞定 Go 开发环境 鹅厂小哥用行动反对加班:程序员加班能被终结吗? Go 为什么选择 Gopher 作为吉祥物? 本地如何配置多个 GitHub/Gitee 账号? 为 Java 开发者准备的 Go 教程 02:Java 有而 Go 无 GitHub 发现了 studygolang 项目依赖的漏洞 Typora 宣布收费后,这款开源 Markdown 编辑器火了 为 Java 开发者准备的 Go 教程 01:漫游了 我的 2021 年终总结 泛型版 singleflight:Go 中如何防止缓存击穿? 2021 年你写了多少代码?这个 Go 工具帮你统计 Go1.18 新特性:TryLock Go 泛型入门教程 程序员瑞士军刀:各种结构的转换工具 终于有 Go 版的 Elasticsearch 了 Go泛型系列:maps 包讲解 Go 1.18 中的 any 是什么? Go1.18 快讯:新的 IP 包 Go编程模式:详解函数式选项模式 Go泛型系列:slices 包讲解 Nginx 竟然也有 playground — Go 语言构建的 Go泛型系列:Go1.18 类型约束那些事 Go1.18 快讯:Module 工作区模式 Go1.18 快讯:新增的 Cut 函数太方便了 Go1.18 快讯:废弃了这个 API Go1.18 快讯:新增字符串 Clone API Go:如何获得项目根目录? Go 如何获取和设置环境变量 重磅变动:更快找到微信公众号里的Go文章 Go 这样设置版本号:我们的项目也可以 假期结束,推荐 2 本 manning 出的 Go 图书 Go Fiber 框架系列教程 04:测试应用 Go Fiber 框架系列教程 03:中间件 Go泛型系列:提前掌握Go泛型的基本使用 推荐一个 Go GUI 实战项目 Go Fiber 框架系列教程 02:详解相关 API 的使用 Go Fiber 框架系列教程 01: 和 Express 对比学习 Go Module:私有不合规库怎么解决引用问题 Go1.17 新特性:go get 变了 Go1.17 新特性:testing 包的相关变化 StackOverflow 上关于 Go select 死锁的问题 新书推荐:用 Gin 框架构建分布式应用 Go 官网要变天。。。 Gin 这是要成为 Go 官方框架? 扬眉吐气:刚刚,Go 已经默认支持泛型了 Go 1.17 新特性:Module 有哪些变化? Go 第三方库推荐:类型转换如此简单 担心密码提交到 GitHub?建议使用这个 Go 开源工具 Go 的时间格式化为什么是 2006-01-02 15:04:05? GitHub 为 Go 社区带来安全支持 Go开源项目推荐:500行代码确认请求时间花在哪 一道关于 len 函数的诡异 Go 面试题解析 厉害了我的 Go:推荐系统都有开源实现 Go1.17 新特性:新版构建约束 这个工具真好:看看你的Go项目依赖有无漏洞 网友很强大,发现了Go并发下载的Bug Rust 劝退系列 09:函数 Go项目实战:一步步构建一个并发文件下载器 这本 Go 新书挺期待的:100 个常见错误 Go 启用新的官方问答社区 这是要干嘛?!微软招 Go 编译器全职开发人员 Go1.17 快报之标准库越来越注重易用性 Go1.17 新特性之切片变数组 回顾 Go 官网的演变史 站长8年前的Go代码竟然进入大厂的项目里了 Go图书翻译:一个好消息,一个坏消息 不怕烂尾!决定组织翻译这本 Go 图书 Rust 劝退系列 08:模式匹配 一本花了2.5年写成的Go免费在线图书 被黑惨了:一句话,说明自己会 Go,咋整? Go1.16 中的新函数 signal.NotifyContext 怎么用? Go 1.17 新特性提前学之测试执行随机化 Rust 劝退系列 07:流程控制 官方的 Go 多版本管理:使用和原理 Rust新书:给你一个劝退的理由 周刊题解:常量表达式这个规则应该了解下 盘点那些使用 Go 语言的国外公司 编写了50万行Go代码是一种什么体验 Rust 劝退系列 06:常量 Uber 使用 Go 的规模这么大?!都自己定制的 Go 编译器了 Go Team Leader — rsc 大神新开源了一个库,增强模板功能 再一次看到了 Go 的节制:int128 类型要不要支持? Rust 劝退系列 05:复合数据类型 「卷」有理论依据:海勒姆定律—Go又是怎么卷的 Go 真的也可以进行 GUI 开发:还有这样的图书呢 Rust 劝退系列 04:基本数据类型 我的 Go 语言书单 Rust 劝退系列 03:变量 我又来推荐免费 Go 新书了:一本用 Go 讲架构的书 注释竟然还有特殊用途?一文解惑 //go:linkname 指令 这个功能,公众号、微信群会不会被玩坏? 一道 Go 闭包题,面试官说原来自己答错了:面别人也涨知识 Rust 劝退系列 02:第一个 Rust 程序 Rust 劝退系列 01:打造开发环境
那些想替代 C 的语言怎么样?Go、Rust、C++ 和 Zig 生产力对比
2021-04-01 · via 文章列表 on polarisxu

C 已经快 50 岁了。对于一瓶葡萄酒来说,这个年龄很棒,但对于快速发展的行业中的编程语言而言,它就不同了。在过去的十年中,出现了许多具有不同风格的新语言,所有这些语言都试图在某种程度上成为 C 语言的替代者。

当一种新语言或多或少变得流行时 —— 开发人员开始编写基准测试,以展示该语言编写的软件性能,CPU 利用率和内存使用量以及二进制文件的大小等等。

在这里,我想在不同的层面上进行一些实验 —— 编程语言的 UX(用户体验),使用这种语言时开发人员的效率,使用它们的容易程度,常见的挫败感,阅读代码的感受。我相信编程语言的 UX 与它们的技术特征一样重要,并且对语言的成功做出了很大的贡献。

注意:该文章的其余部分带有很多主观色彩。

实验

让我们编写一个应用程序,该程序以递归方式扫描当前目录中的所有文件,并在与给定通配符匹配的文件中打印这些行。类似于 aggrep,但使用通配符而不是正则表达式。二进制文件应被忽略。

我发现这个问题是一个很好的练习,因为它展示了如何实现非常简单的通配符匹配算法(该算法可用于字符串和数字之类的纯数据,无需学习任何库或 API)。该算法应通过一些非常简单的测试。然后,它需要一些非常通用的底层 API,例如递归扫描目录或逐行读取文件。问题的所有部分都非常简单,小巧且范围广泛。这个小程序当然也可以用其他任何语言实现。

我想测试该语言与常规的 “write-compile-run-debug” 循环的“友好”程度,为匹配算法编写测试的复杂度,找到与文件一起使用所需的 API、系统和基本 I/O 的难易度,指出错误时编译器的友好程度,语言的“直观性”等等。

我的样本量相当谦逊 —— 仅我本人。但是为了避免偏见,建议你自己做(不要花太长时间)并比较结果。用不同的语言编写小程序后,我让同行的开发人员(约 20 人)阅读并给我反馈,哪些界限不清楚,哪些阅读和理解起来“更容易”。这些开发人员没有使用这种语言的经验,但是能熟练使用其他语言,例如 Java,C#,JavaScript,Kotlin 和 Swift 等。

我在这里测试的语言是 C++,Go,Rust 和 Zig。我得到的结果程序可以在 GitHub 找到: https://github.com/zserge/glob-grep,请随时批评。

从 Zig 开始,因为我想看看 Zig 是什么类型的语言。之前听到过这个语言有不错的反馈,但是一直没用过。没有经验可谈,我打开了 Vim 并开始编写代码。

我花了大约 1 个小时来完成程序。通配符匹配算法(我以前知道,只需要在 Zig 中实现)花了我大约 20 分钟的时间。其余主要在寻找 API 来进行目录扫描和文件读取。

TLDR:出色,直观的小语言,较差的是 stdlib 和 docs。

我喜欢的是:对于 C 程序员,该语言出奇的直观。感觉很简单,关于语言的文档(而不是 stdlib)非常清晰和友好。

对于年轻的语言而言,Vim 集成也相当不错(在启用 Vim 插件之前 —— 格式化错误(编译器错误)使我很郁闷)。

我喜欢错误处理方法。喜欢该语言附带的测试工具。甚至喜欢字符串只是字节数组,就像在 C 中一样。

我对附带分配器的第一个反应是震惊,但实际上它甚至没有引起注意。它给人以极简主义的感受,即该语言的核心是如此简单,以至于它甚至不使用动态内存。同样,非常接近 C。

在编写此代码时,我必须阅读许多 Zig 编译器和 stdlib 源代码,并且代码非常简洁明了。

我不喜欢的东西:stdlib 文档太糟糕了。我从目录扫描和文件 I/O 中学到的所有知识–我都是从 GitHub 搜索结果中获得的,这也非常稀缺。

编译器提示消息也不是很友好,但是对于熟悉 C 的人来说,这没什么大不了的。

在 stdlib 中缺少字符串处理例程是出乎意料的,要连接字符串,必须手动做所有事情 —— 分配缓冲区,将字符串放在那里。或者使用格式化程序和分配器来同时打印两个字符串,然后释放缓冲区。但这仍然和 s1+s2 有很大不同。

总的来说,核心语言很简单,我很喜欢它,但是 stdlib 比 libc 更受限制。我希望这只是该语言早期的标志。

实际上,读 Zig 代码的人都提到了这点。它有点冗长,但明确,可预测且易于理解。毫不奇怪,因为该语言在设计时考虑了可读性(没有隐藏的控制流,没有隐藏的分配,没有宏,没有运算符重载,没有元编程等)。

Rust

我尝试学习 Rust,但失败了。我花了 2 个多小时才完成此程序,完成后我感到失望。

TLDR:复杂。

我喜欢的东西:编译器提示消息友好。该语言的文档也不错。但仅此而已,我这次并没有了解生命周期、错误处理等。围绕该语言的工具既现代又不错。

我不喜欢的东西:编译器消息太冗长,占据了整个屏幕。我可不想 rustc --explain 为每个错误而奔波。求求你,不要惩罚我。文档有时也太冗长。我的意思是,最好有更多的文档而不是更少的文档,但是先拥有 TLDR 版本会更好。对于 stdlib 来说,也是如此,一小段功能及其用一句话即可完成的工作将更容易阅读。有 &strStr[u8],让新手感到惊讶。

总体而言,Rust 中的编码对我来说就像是解决难题。可能会很有趣和令人兴奋的地方,尤其是在将 Rust 用作一种业余语言时,但是对于大多数任务,我宁愿使用一种“人机工程学”的语言,这种语言几乎不会引起注意。

读 Rust 代码过程中,经常会骂出至少两个 “wtf”。他们经常抱怨语法不清楚,需要注意细节。而且,模式匹配对于“主流”开发人员仍然是陌生的事情。

Go

这是作弊。我曾经使用 Go,但是我还是想在这个实验中尝试一下。正如我期望的那样,我花了大约 15 分钟就能使我的完整 “glob” 实用程序正常工作。

TLDR:富有成效,但固执己见。

我喜欢的东西:感觉非常有用,文档对我来说很神奇 ——简短但有用,可以立即打开相关的 stdlib 函数源码并进行进一步研究。根据过去的经验,在编写应用程序时,我已经设想了如何使其成为多线程并提高性能(简单的 fan-out)。

我不喜欢的东西:太多东西(缓冲 I/O,GC)存在。你不会觉得自己可以控制一切(就像在 Zig 中一样)。太自以为是 —— 这是列表中唯一需要我创建 3 个单独的文件才能使其起作用的语言。仍然会犯一些低级错误,例如意外的变量 shadow 或在循环内使用 defer。

读 Go 代码,会发现它很清楚,有些人对内联 walker 函数感到好奇(它们不一定是内联的,他们是正确的)。一些人想知道多重分配,比如a, b = c, d,这种写法感觉更混乱了。具有讽刺意味的是,如果我是 Go 语言的新手,我会写出更直接的 Go 代码。

C++

尽管我有一定的 C 经验,但是与现代 C++ 却相去甚远,因此我决定尝试一下。我花了大约 20 分钟才能完成,这是出乎意料的。

TLDR:好老的“朋友”。

我喜欢的东西:感觉很熟悉,就像认识一个过去的老朋友一样。我喜欢这些文档,并提供了许多示例和良好的可读性。看到如今的 stdlib 这么强大,我感到很惊讶。文本编辑器和 IDE 中的支持也非常可靠。

我不喜欢的东西:不良的工具 —— 没有构建系统,没有测试工具,没有 linter。我们过去习惯使用它,但这并不是现代开发人员所期望的。太强大了 —— 对于这项任务,C++ 感觉非常有生产力,但是我可以想象自己在某个时候处于决策瘫痪状态,这时有许多不同的方式来做某事,而所有事情都是一样的(或不好的)。

读 C++ 代码的人实际上过去至少已经读过 C 或 C++,这是他们大学课程的一部分。我猜很多人抱怨使用 ::,所以我应该正确使用名称空间。总的来说,由于我在 C++ 代码中没有“品味” —— 我敢肯定它可以写得更清楚,但是我也看到在没有注意到的情况下它可能写得更糟。

其他基准

所有语言均生成静态可执行文件,大小均相同(2 ~ 5MB)。最小的是 Zig,最大的是 Rust。扫描整个 /usr/include 文件树时,它们的性能几乎相同。这就是为什么我要强调技术特性(主要指性能)通常不如开发人员体验那么重要。

我想另外提一下构建时间。我运行了整个 build + test + clean 循环一百次。Go 最快(如预期的那样),其他三个都是基于 LLVM 的,速度要慢 3 到 4 倍。

这意味着什么?这个结果并不令人惊讶,并且经常有关于语言的陈词滥调:Go 易于阅读,Rust 复杂,C++ 熟悉,Zig 看起来很有希望,但还太年轻而无法判断。

如果我必须编写与 C 代码没有进行大量交互的新服务/实用程序 —— 我肯定会选择 Go。如果必须调用某些 C 或 C++ 库 —— 不幸的是,我会坚持使用 C++。Rust 和 Zig 在现代编程世界中将占据什么位置 —— 只有时间会证明一切。我希望 Zig 有更好的文档,这样可能在它变得过于小众和淹没之前获得流行。我一定会更加关注它,到目前为止,这是我遇到的第一个真正的 C 替代品,尤其是在涉及低级编码时。

当然,尽管年代久远,C 仍然存在。在很多地方,C 是唯一的实际选择。我很高兴 C 还保持青春。

原文链接:https://zserge.com/posts/better-c-benchmark/

本文作者:zsergo

编译:polarisxu