为什么正则表达式不是ISO C99的一部分?

7

每个人都知道C语言很棒,但在文本处理任务中非常糟糕。鉴于这些事实,正则表达式绝对应该成为ISO C的一部分。但它并不是。我不明白为什么?难道有人认为它不重要吗?

5个回答

15

正则表达式与C语言本身一样不属于音频库、图形库或加密库。把它们并入C语言本身会降低C语言的通用性质,并严重限制它作为小型高效嵌入式语言的使用。

C语言的理念是具有非常小而高效的语言关键字集,并针对下一层功能提供标准化的库。由于正则表达式、图形、音频、加密等事物没有单一的平台或标准,因此它们无法适配于标准C库。

它们最适合作为用户库,这就是它们目前所处的位置。


2
很好的回答。如果再深入探讨,可以问为什么文件I/O在标准库中 -- 毕竟,它只是许多可能的文件I/O子系统之一,对吧?我猜这是因为C语言作为UNIX主要系统编程语言的传承,文件系统在除了内存管理以外的方面扮演着非常重要的角色(如数据持久性、设备驱动程序、IPC等)。 - stakx - no longer contributing
另外,我们可以通过删除那些繁琐的控制台输入/输出函数来进一步减少库的大小。 - BlueRaja - Danny Pflughoeft
3
我不确定这个答案是否真的可行。 毕竟,C标准提供了“自由实现”的选项,其中许多更复杂的函数是可选的。 本质上,正则表达式库并不比printf()更加平台或领域特定 - 我倾向于将其称为历史偶然而已。 - caf
尽管如此,这并没有回答问题。像正则表达式/加密选择这样的东西并不是特定于平台的,肯定可以由C委员会标准化。需要在小型嵌入式系统上运行与此无关——没有理由链接未被使用的代码...... - BlueRaja - Danny Pflughoeft
@claws - 除了最小规模的嵌入式平台(例如PIC或8051),通常支持完整的ANSI C标准。当然,今天的嵌入式系统经常运行完整的Linux内核,因此区别变得有点模糊。 - Amardeep AC9MF
显示剩余2条评论

8

但那不是标准库,那只是 POSIX。那么非 POSIX 系统呢? - claws
好的,正则表达式是一个非常有用的函数,但是不同的正则表达式实现之间的细微差别并不那么有用。许多非POSIX系统在许多库中与POSIX标准具有显着的兼容性,甚至我的卡西欧计算器也有一些POSIX功能(通过日立C实现)。 - tovare
这些只是POSIX正则表达式。它们与PCRE甚至Perl正则表达式不同。其他语言中还有许多不同的风格,甚至不要开始。 :) - Robert P

5
因为这是一个需要在正则表达式语言中标准化的库特性。标准机构是由委员会推动的,这不是一项容易的任务。这份文件解释了标准化的合理性:http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf,这可能会澄清原因。另一个解释在文件中给出,是为了保持语言简单。有很多可用的下载,只需使用其中一个即可。

3
因为正则表达式并不是编程语言的必要特性。方便?当你需要它们的时候,非常方便。必要?绝不是。
Web开发者自然会认为正则表达式是语言的必要特性,因为他们必须验证所有的HTML表单数据。那些经验总是和几个大型关系数据库服务器之一在一起的开发者会认为SQL支持是必要的。在科学领域工作的人需要支持“大数字”或张量。GUI开发者认为内置的GUI工具包是必要的。有些人整天处理XML,认为XML支持是必要的……等等。这个“必需品”清单可能变得相当长,像Java这样的语言显然采用了“厨房水槽”的方法来实现其庞大的标准库。我欣赏C语言在这方面不是一个“厨房水槽”语言。
请注意不要假设您最喜欢的语言特性是每个人都必备的特性。

@caf - 我在考虑低挂果?也就是说,比正则表达式容易实现得多,并且可以帮助许多嵌入式和信号处理领域的人...无论这是否是错误的,我不会发表意见 :P - detly
你提到了嵌入式系统。在嵌入式系统中,整个C标准库都可用吗?我的意思是,在嵌入式系统中有很多函数(操作系统服务)是没有意义的,比如文件处理、打印等等。它们完全依赖于底层操作系统和嵌入式系统。 - claws
@caf - 因为芯片具有复杂的算术指令。C 的目的是抽象底层机器,而不是提供丰富的语言特性或大量核心库。我们都知道,如果 C 标准包括正则表达式,否则我们现在将陷入一个20年前的旧版预Unicode基本regexp界面。相反,我们有第三方库可以以更快的速度进行改进。我宁愿每年升级libpcre,也不愿每十年等待新的C标准! - John
那是一个很好的回答(对底层机器进行抽象)-你应该使用它更新你实际的答案;)(我的观点是复杂的算术也不是"必要的")。我还要注意到,我们被卡在一些明显落后而又不必要的函数中,比如scanf()——所以我仍然认为这是一个"历史意外",导致了哪些过时的东西进入了系统。 - caf

1
C语言的重点在于小而强大。由于正则表达式通常是一个庞大而复杂的主题,因此它属于库。然而很遗憾,C委员会没有“赞助”一些编写良好、标准的C算法/数据结构库。有大量这样的库存在。我倾向于尽可能使用GNU“赞助”的库,因为它们适用于大多数平台,即使它们不一定是最容易或最有效的使用方式。它们确实取得了很好的平衡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接