Ответ 1
В отношении "переносимости" есть две проблемы:
- Можно ли создать практическую реализацию языка для различных платформ
- Ожидается ли, что программа, написанная на языке, будет корректно работать на разных платформах без изменения
Чем сильнее гарантии, сделанные языком, тем сложнее будет переносить его на различные платформы (некоторые гарантии могут сделать невозможным или нецелесообразным реализацию языка на некоторых платформах), но тем более вероятно, что программы, написанные на язык будет работать без изменений на любой платформе, для которой существует поддержка.
Например, много сетевого кода зависит от того, что (на большинстве платформ) unsigned char - восемь бит, а 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-битную переменную или встроенную расширенную версию с константой. Для часто используемых функций между ними может быть большая разница в эффективности.