В отношении «переносимости» есть две проблемы:
- Может ли быть реализована практическая реализация языка для различных платформ
- Будет ли программа, написанная на языке, корректно работать на разных платформах без изменений
Чем сильнее гарантии, предоставляемые языком, тем сложнее будет переносить его на различные платформы (некоторые гарантии могут сделать невозможным или нецелесообразным реализацию языка на некоторых платформах), но тем более вероятно, что программы, написанные на язык будет работать без изменений на любой платформе, для которой существует поддержка.
Например, большая часть сетевого кода опирается на тот факт, что (на большинстве платформ) символ без знака равен восьми битам, а 32-разрядное целое число представлено четырьмя символами без знака в порядке возрастания или убывания. Я использовал платформу, где char был 16 бит, sizeof (int) == 1 и sizeof (long) == 2. Автор компилятора мог бы сделать так, чтобы компилятор просто использовал нижние 8 бит каждого адреса, или мог бы добавить много дополнительного кода, чтобы написание указателя 'char' сдвигало адрес на один бит вправо (сохраняя lsb), читая адрес, обновите верхнюю или нижнюю половину на основе сохраненного адреса lsb и запишите его обратно. Любой из этих подходов позволил бы запускать сетевой код без изменений, но сильно затруднил бы полезность компилятора для других целей.
Некоторые из гарантий в CLR означают, что нецелесообразно внедрять его на любой платформе с атомарным размером операций меньше 32 бит. И что? Если микроконтроллеру требуется более нескольких десятков Кбайт пространства кода и оперативной памяти, разница в стоимости между 8-разрядным и 32-разрядным достаточно мала. Поскольку никто не собирается запускать какие-либо варианты CLR для части с 32 КБ пространства кода и 4 КБ ОЗУ, кого волнует, сможет ли такой чип удовлетворить его гарантии.
Кстати, я думаю, было бы полезно иметь различные уровни возможностей, определенных в спецификации C; например, многие процессоры имеют 8-битные символы, которые можно объединить в более длинные слова с помощью объединений, и существует много практического кода, который использует это. Было бы хорошо определить стандарты для компиляторов, которые работают с такими вещами. Я также хотел бы видеть больше стандартов в нижней части системы, делая некоторые улучшения языка доступными для 8-битных процессоров. Например, было бы полезно определить перегрузки для функции, которая может принимать вычисляемое во время выполнения 16-разрядное целое число, 8-разрядную переменную или встроенную расширенную версию с константой. Для часто используемых функций эффективность может быть большой.