Hello|测试 C、Python、Java 等 16 种编程语言的 Hello World:7 种存在 Bug?
译者 | 张洁
责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
Hello World 可能是最简单的计算机入门程序 。 几十年来 , 许多人在开始使用新的编程语言时 , 编写的第一个程序通常是 Hello World 。
这不起眼的入门程序没有 Bug , 对吗?
文章图片
图片来自 sunfishcode 的博客
毕竟 , Hello World 程序只做一件事 。 怎么会有 Bug?
万万没想到 , 有开发者在好奇心驱动下 , 测试了 16 种常用的语言后 , 竟然在里面检测出了 7 种编程语言的 Hello World 带有 Bug 。
以 C 语言中的 Hello World 程序为例
首先 , 以 C 语言为例来测试 。 事实上 , 用 C 语言写 Hello World 有很多不同的版本 , 如维基百科搜索显示的版本、《C 程序设计语言》(也简称 K&R)一书中的 Hello World , 甚至还有从 1974 年贝尔实验室备忘录中引入的最古老的 C 语言 Hello World 程序 。
文章图片
图片来自 sunfishcode 的博客
这是 "ANSI C "(美国国家标准协会和国际标准化组织对 C 语言发布的标准)中的 Hello World 程序写法:
对于业界而言 , 这应该是最标准 C 语言 Hello World 的版本 。
它使用“(void)”来显示 main 是一种新型声明方式 。 这个版本使用 EXIT_SUCCESS 返回值来表示成功 , 而不是使用 0 。 根据 C 语言标准 , 这其实没有必要 , 不过在此我们也不做更改了 。 除此之外 , 它还使用了适当的头文件声明了 puts 函数 。
这个版本试图把所有的步骤都做到完美 。
然而 , 它里面还是有一个 Bug 。
C 语言中的 Bug 从何而来?
Linux 有一个有趣的设备文件 , 叫做“/dev/full” , 跟“/dev/null”(程序员群体中行话叫做黑洞 , 即丢弃一切写入其中的数据 , 读取它会立即得到一个 EOF)非常像 , 但是当你将数据写入到“/dev/full”时 , 该文件不会扔掉数据 , 而会出现错误 。 它的作用就像是文件系统中一个刚刚用完空间的文件:
所以让我们测试一下上面的 C 语言示例:
然而 , 它实际上并没有成功 。 我们可以使用 strace 进行确认:
那么 , 这个 Bug 有多严重呢?
可以说 , Hello World 不应该作为标准的测试代码 , 因为它并不是绝对的安全 。
此话应该从何说起?想必很多程序员在初次学习编程的时候 , 大多数会用 Hello World 程序来试一下 。 这也导致了 Hello World 常被开发者用来检测程序的标准输出 , 但是因为此时 Hello World 程序存在 Bug , 所以 prints 的标准输出往往可能会被重定向到另一个文件 。
譬如 , 现实世界中 , 如果文件占用了全部的空间 。 此时用 Hello World 程序来检测 , 最终并没有检测任何问题 , 那么该代码的父进程将不知道子进程失败了 , 会继续运行 , 即使系统期望产生的输出内容已经悄悄地丢失了数据 , 但程序还是像什么都没有发生一样 。
举个例子 , 编写一个程序 , 其中主要是 prints一个 yaml 文件到标准输出 。 如果标准输出的空间用完了 , 输出可能会在某个任意的点被截断 , 尽管它仍是有效的 yaml 。 所以我们期望程序能够检测并报告这种情况 。
7 种主流语言常见的 Hello World 程序都有 Bug?
除了 C 语言之外 , Python 告诉我们“Bug 不应该被无声地忽视” , 下面是 Python 2 的测试示例:
幸运的是 , Python 3 正确地报告了错误 , 而且还显示了一个更漂亮的错误信息 。
语言 | 是否有Bug | 测试的版本 |
C | 是 | (全部) |
C++ | 是 | (全部) |
Python 2 | 是 | Python 2.7.18 |
Ruby | 是 | ruby 2.7.2p137(2020-10-01 修订版 5445e04352)[x86_64-linux-gnu] |
Java | 【Hello|测试 C、Python、Java 等 16 种编程语言的 Hello World:7 种存在 Bug?】是 | openjdk 11.0.11 2021-04-20 |
Node.js | 是 | v12.21.0 |
Haskell | 是 | Glorious Glasgow Haskell 编译系统 , 版本 8.8.4 |
Rust | 否 | rustc 1.59.0 (9d1b2106e 2022-02-23) |
Python 3 | 否 | Python 3.9.5 |
Perl | 否 | perl 5 , 版本 32 , subversion 1 (v5.32.1) 为 x86_64-linux-gnu-thread-multi 构建(带有 46 个注册补丁...) |
Perl 6 | 否 | v2020.12 |
Bash | 否 | GNU bash , 版本 5.1.4(1)-release (x86_64-pc-linux-gnu) |
Awk | 否 | GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1) |
OCaml | 否 | 4.08.1 |
Tcl | 否 | 8.6.11 |
C# | 否 | Mono JIT 编译器版本 6.8.0.105 |
— END—
《新程序员001-004》全面上市 , 对话世界级大师 , 报道中国IT行业创新创造
— 推荐阅读 —
? 湖仓一体是否会掀起金融业的下一波数字浪潮?
?Java 8 八年不倒、IntelliJ IDEA 力压 Eclipse , 2022 年 Java 开发者都在用什么?
? Linux 新漏洞曝光 , 居然又双叒是提升权限漏洞!
推荐阅读
- 诺唯|苏宁易购上线新冠抗原检测试剂盒预约,最快10分钟完成自测
- 辅助|贝瑞基因新品重磅发布,助力辅助生殖、切实推进优生优育
- 电流|电动机/马达负载柜 JAY-5145 操作简单、实用性强
- 探测|梁步阁:让雷达生命探测更精准、更高效(创新故事)
- 最新消息|乌克兰总统呼吁微软、甲骨文在俄罗斯停止产品支持
- 硬件|内存、SSD硬盘还要涨价?美光CEO表态芯片缺货持续到明年
- 抗原|热景生物新冠抗原检测试剂盒获批国内上市
- 文莱|热景生物新冠抗原自测试剂获新加坡批准上市
- IT|最便宜的红旗纯电E-QM5上市:12.28万起、能跑431公里
- IT|中国提前锁定残奥会金牌榜、奖牌榜第一创造历史