「移植性」に関しては、次の 2 つの問題があります。
- 言語の実用的な実装をさまざまなプラットフォーム用に作成できますか
- ある言語で書かれたプログラムは、さまざまなプラットフォームで修正なしで正しく動作することが期待されますか?
言語による保証が強ければ強いほど、さまざまなプラットフォームへの移植が難しくなります (保証によっては、一部のプラットフォームでその言語を実装することが不可能または非現実的になる場合があります)。しかし、その言語で書かれたプログラムは、サポートが存在するどのプラットフォームでも変更なしで動作します。
たとえば、多くのネットワーク コードは、(ほとんどのプラットフォームで) unsigned char は 8 ビットであり、32 ビット整数は昇順または降順の 4 つの unsigned char で表されるという事実に依存しています。私は、char が 16 ビット、sizeof(int)==1、および sizeof(long)==2 であるプラットフォームを使用しました。コンパイラの作成者は、コンパイラに各アドレスの下位 8 ビットを単純に使用させるか、「char」ポインタを書き込むとアドレスが 1 ビット右にシフトされ (lsb が保存される)、アドレス、保存されたアドレス lsb に基づいて上半分または下半分を更新し、それを書き戻します。これらのアプローチはいずれも、ネットワーク コードを変更せずに実行できますが、他の目的でのコンパイラの有用性を大きく妨げていました。
CLR の保証の一部は、32 ビット未満のアトミック操作サイズを使用してプラットフォームに実装することが実際的ではないことを意味します。だから何?マイクロコントローラーが数十キロバイト以上のコード空間と RAM を必要とする場合、8 ビットと 32 ビットのコスト差はごくわずかです。32K のコード空間と 4K の RAM を備えた部品で CLR のバリエーションを実行する人はいないので、そのようなチップがその保証を満たすことができるかどうかは誰が気にします.
ところで、C 仕様でさまざまなレベルの機能を定義すると便利だと思います。たとえば、多くのプロセッサには、ユニオンを使用してより長い単語に組み立てることができる 8 ビットの char があり、これを利用する実用的なコードがたくさんあります。そのようなもので動作するコンパイラの標準を定義することは良いことです. また、システムのローエンドでより多くの標準を見て、8 ビット プロセッサで利用できる言語の機能強化を望んでいます。たとえば、実行時に計算された 16 ビット整数、8 ビット変数、またはインライン展開されたバージョンの定数を受け取ることができる関数のオーバーロードを定義すると便利です。よく使われる機能については、それらの間で効率に大きな違いが生じる可能性があります。