我最近读到了 Lua 联合创始人 Luiz H. de Figueredo 和 Roberto Ierusalimschy 的采访,他们讨论了 Lua 的设计和实现。至少可以说这是非常有趣的。然而,讨论的一部分让我想起了一些事情。 Roberto 将 Lua 称为“独立应用程序“(也就是说,它是纯 ANSI C,不使用操作系统中的任何内容。)他说,Lua 的核心是完全可移植的,并且因为它purity已经能够更容易地移植到从未考虑过的平台(例如机器人和嵌入式设备)。
现在这让我想知道。一般来说,C 是一种可移植性很强的语言。那么,C 的哪些部分(即标准库中的部分)最难移植?哪些内容可以在大多数平台上运行?是否应该只使用有限的数据类型集(例如避免short
有可能float
)?关于FILE
和stdio
系统?malloc
and free
?看来Lua 避免了所有这些。这是把事情推向极端吗?或者它们是可移植性问题的根源?除此之外,还可以做哪些其他事情来使代码具有极高的可移植性?
我问所有这些问题的原因是因为我目前正在用纯 C89 编写一个应用程序,并且它尽可能地可移植是最佳的。我愿意在实现它时采取中间路线(足够便携,但又不至于我必须从头开始编写所有内容。)无论如何,我只是想看看编写最好的 C 代码的关键是什么。
最后一点,所有这些讨论仅与 C89 有关。
就 Lua 而言,我们对 C 语言本身没有太多抱怨,但我们发现 C 标准库包含许多看似无害且易于使用的函数,直到您认为它们没有检查它们的功能。输入有效性(如果不方便的话也可以)。 C 标准规定,处理错误输入是未定义的行为,允许这些函数做任何他们想做的事,甚至使主机程序崩溃。例如,考虑 strftime。一些 libc 只是忽略无效的格式说明符,但其他 libc(例如,在 Windows 中)会崩溃!现在,strftime 并不是一个关键函数。为什么要崩溃而不是做一些明智的事情?因此,Lua 必须在调用 strftime 之前对输入进行自己的验证,并将 strftime 导出到 Lua 程序变得很麻烦。因此,我们试图通过核心的独立性来避免 Lua 核心中的这些问题。但 Lua 标准库无法做到这一点,因为它们的目标是将功能导出到 Lua 程序,包括 C 标准库中可用的功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)