问题标签 [language-history]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 为什么 K&R 没有更好地定义数据类型长度?
我遇到的每一种现代编程语言都有明确定义的数据类型。例如,Java 有一个int
正好是 32 位的和一个long
正好是 64 位的。这不是特定于实现的,而是内置在规范本身中的。另一方面,C具有至少16位的a short
、至少16位的anint
和long
至少32位的a。但是,因为它被定义为至少,它们可能会更大,这会导致严重的可移植性问题。
我一直不明白这一点。我一直把它归结为 1970 年代不同硬件标准的结果,但这对我来说实际上没有意义。即使有很多计算机无法处理 64 位数据类型,这仍然不能成为不将 a 定义为short
16位和32 位的借口。根据标准,我们已经将 32 位视为任何硬件的最低要求。int
这种标准的扩散导致了以下建议,取自文章How to C(截至 2016 年):
如果您发现自己在新代码中输入
char
或int
或short
或或long
或unsigned
,那么您做错了。对于现代程序,您应该
#include <stdint.h>
使用标准类型。有关详细信息,请参阅
stdint.h
规范。常见的标准类型有:
int8_t
,int16_t
,int32_t
,int64_t
— 有符号整数uint8_t
,uint16_t
,uint32_t
,uint64_t
— 无符号整数float
— 标准 32 位浮点double
- 标准 64 位浮点注意我们没有
char
了。char 实际上在 C 中被错误命名和误用。
char
即使在进行无符号byte
操作时,开发人员也经常滥用“<code>byte”的意思。uint8_t
用来表示单个无符号字节/八位字节值和uint8_t *
表示无符号字节/八位字节值序列要干净得多。
我还注意到有很多建议建议将其size_t
用作标准去int
替换,就像Jens Gustedt 在 Modern C 中一样,它在本书的第一个示例中使用 asize_t
作为for
循环中的控制变量。
我的问题有两个:
1、为什么1978年K&R 2没有更明确地定义数据类型?
2. 在 2018 年,我们应该如何处理我们的数据类型选择,还是只是风格和约定以及高度固执己见?
php - PHP 中何时引入了STRLEN 操作码?
在检查 PHP 脚本生成的操作码时,我感到很惊讶,与其他字符串函数str_pad()
(strlen()
如STRLEN
https://3v4l.org/9QJQ7/vld#output
这个操作码是在哪个 PHP 版本中引入的?我在任何地方都找不到这些信息。
php - PHP 的 y2k_compliance php.ini 设置有什么作用?
这个问题纯粹是出于学术目的,因为该设置在 PHP 5.4 中已被删除,并且 2000 年早已过去,但有人知道y2k-compliance
配置设置做了什么吗?
PHP 文档并没有告诉你太多:
y2k_compliance(布尔值)
强制执行 2000 年的合规性(将导致不合规的浏览器出现问题)
所以,那里没有太多有用的信息!
从谷歌搜索中,大部分出现上述重复或对设置删除的引用,我发现的唯一附加信息是这个页面,它指出:
一些用户可能使用过时的、不合规的浏览器。如果出于某种奇怪的原因,您确定您网站的许多用户属于该组,则禁用 y2k_compliance 参数;否则,它应该被启用。
y2k_compliance = On
指定 PHP 脚本是否应与 2000 年兼容。使 PHP 脚本与 Y2K 兼容(通过将此指令设置为 On)将导致与不兼容 Y2K 的浏览器出现问题。
更多信息,但仍然是一个非常高级的描述。
我一直无法找到有关此设置试图解决什么问题或如何解决它的任何技术信息。
y2k-compliance
那么,如果标志被禁用,PHP 有什么不同呢?
oop - Robert Martin 所说的“只有函数从早期的编程时代存活下来,而不是例行公事”是什么意思?
摘自 Robert Martin 所著的 Clean Code 一书:
在编程的早期,我们组成了我们的例程和子例程系统。然后,在 Fortran 和 PL/1 时代,我们组成了我们的程序、子程序和函数系统。如今,只有该功能从那些早期阶段幸存下来。
在我看来,这段摘录告诉我们例行公事是一件坏事,正在走出编程时代。
我做了一些搜索,发现Fortran中子程序和函数之间的区别是:
- 子程序对输入变量进行一些操作,调用子程序的结果是修改了输入变量。
- 函数将一个或多个参数作为输入并返回单个输出值。
虽然我没有写 Fortran 只写 C,但 C 支持的结构与 inint foo(int x)
和void foo(int* x)
.
引起我注意的是我从未听说过void foo(int* x)
C 中的一个糟糕的约定,所以我想弄清楚 Robert Martin 的这段摘录是什么意思。
还有一个问题。从 OOP 的角度来看,如果我想在 C 中模拟 OOP,例程是不是函数的好选择?
bash - 替代 for 循环构造
一般评论:任何对这个问题提供新的和有用的见解的新答案都将获得奖励。
Bash 参考手册提到 Bash 支持以下 for 循环结构:
令人惊讶的是,以下 for 循环结构也是有效的:
这些不寻常的构造根本没有记录。Bash 手册、Bash 手册页和Linux 文档项目都没有提及这些结构。
在研究语言语法时,可以看到使用开闭大括号 ( { commands; }
) 作为替代方案do commands; done
是一种有效的构造,它适用于 for 循环和 select 语句,并且可以追溯到Bash-1.14.7
[1]。
另外两个循环结构:
没有这种替代形式。
由于许多 shell 语言是相关的,人们可以发现这些结构也在那里定义并温和地记录在案。KSH 手册提到:
由于历史原因,可以使用开括号和闭括号代替
do
and,done
例如
而 ZSH 为其他循环结构实现并记录了类似的替代方案,但有局限性。它指出:
对于
if
,while
和until
命令,在这两种情况下,循环的测试部分也必须适当分隔,例如用[[ ... ]]
or(( ... ))
,否则将无法识别测试的结束。
问题:这个构造的起源是什么,为什么它没有传播到其他循环构造?
更新 1:在这篇文章下面有一些非常有用和有教育意义的评论指出这是一个未记录的 Bourne Shell 功能,这似乎是早期 C-vs-sh 语言战斗的结果。
更新 2:问问题时:为什么没有记录此语言功能?在Gnu Bash 邮件列表中,我收到了 Chet Ramey(GNU bash 的现任首席开发人员)的以下答复:
它从未被记录在案。bash 支持它的原因(未记录)是因为它是一个未记录的 Bourne shell 功能,我们为了兼容性而实现了它。当时,30 多年前,有使用它的脚本。我希望那些脚本已经进入历史的垃圾箱,但谁知道现在有多少人在使用这个结构。
我将不记录它;人们无论如何都不应该使用它。
相关问题/答案:
脚注: [1]我没有找到更早的版本,我相信它早于这个
php - PHP 的“o”序列化格式是干什么用的?
PHP 7.4 的向后不兼容更改列表包含以下注释:
序列化
o 序列化格式已被删除。由于它从未由 PHP 生成,因此这可能只会破坏手动制作的字符串的反序列化。
(请注意,这是指用于对象序列化的小格式o
,而不是大格式。)O
似乎这从未由 PHP 的serialize()
函数生成,但该注释存在的事实意味着它已被unserialize()
函数识别。
我做了一个小测试小提琴 (3v4l.org),这表明这不仅仅是 big- 的同义词O
,这将是一个明显的可能性。
小提琴通过输出的错误消息中的差异公开了 PHP 中的更改。在 PHP >= 7.4 中,我们在位置 0(o
遇到 的位置)出现错误,而在 7.4 之前,错误在位置 5(数据所在的位置)报告。这意味着它o
已被识别,但数据格式错误,这与我上面已经推断的内容相关。
那么,o
序列化格式是什么,它反序列化为什么,如果 PHP 本身没有实际生成它,为什么它支持这样的特性?