关于“可移植性”有两个问题:
- 是否可以为各种平台生成语言的实际实现
- 是否期望用一种语言编写的程序无需修改即可在各种平台上正确运行
一种语言的保证越强,将其移植到各种平台就越困难(某些保证可能使在某些平台上实现该语言成为不可能或不切实际),但用该语言编写的程序更有可能在存在支持的任何平台上无需修改即可工作。
例如,许多网络代码依赖于这样一个事实:(在大多数平台上)无符号字符是 8 位,而 32 位整数由四个无符号字符按升序或降序表示。我使用了一个 char 为 16 位、sizeof(int)==1 和 sizeof(long)==2 的平台。编译器作者可以让编译器简单地使用每个地址的低 8 位,或者可以添加很多额外的代码,以便编写一个 'char' 指针会将地址右移一位(保存 lsb),读取地址,根据保存的地址 lsb 更新高或低半部分,并将其写回。这些方法中的任何一种都允许网络代码在不修改的情况下运行,但会极大地阻碍编译器用于其他目的。
CLR 中的一些保证意味着在原子操作大小小于 32 位的任何平台上实现它是不切实际的。所以呢?如果一个微控制器需要超过几十 KB 的代码空间和 RAM,那么 8 位和 32 位之间的成本差异非常小。由于没有人会在具有 32K 代码空间和 4K RAM 的部件上运行 CLR 的任何变体,谁在乎这样的芯片是否能够满足其保证。
顺便说一句,我确实认为在 C 规范中定义不同级别的功能会很有用;例如,许多处理器确实有 8 位字符,可以使用联合将其组装成更长的单词,并且有很多实用代码可以利用这一点。为使用这些东西的编译器定义标准会很好。我还希望在系统的低端看到更多标准,为 8 位处理器提供一些语言增强功能。例如,为可以采用运行时计算的 16 位整数、8 位变量或具有常量的内联扩展版本的函数定义重载会很有用。对于经常使用的功能,它们之间的效率可能会有很大差异。