Kernighan, B. W. and Ritchie, D. M. "The 'C' Programming Language"; Chapter 25
25. Соображения о переносимости.
Некоторые части языка "C" по своей сути машинно-зависимы. Следующиениже перечисление потенциальных трудностей хотя и не являютсявсеоб'емлющими, но выделяет основные из них.
Как показала практика, вопросы, целиком связанные с аппаратнымоборудованием, такие как размер слова, свойства плавающей арифметикии целого деления, не представляют особенных затруднений. Другие аспектыаппаратных средств находят свое отражение в различных реализациях.Некоторые из них, в частности, знаковое расширение (преобразующееотрицательный символ в отрицательное целое) и порядок, в которомпомещаются байты в слове, представляют собой неприятность, котораядолжна тщательно отслеживаться. Большинство из остальных проблем этоготипа не вызывает сколько-нибудь значительных затруднений.
Число переменных типа register, которое фактически может быть помещенов регистры, меняется от машины к машине, также как и набордопустимых для них типов. Тем не менее все компиляторы на своихмашинах работают надлежащим образом; лишние или недопустимые регистровыеописания игнорируются.
Некоторые трудности возникают только при использовании сомнительнойпрактики программирования. Писать программы, которые зависят от каких-либо этих свойств, является чрезвычайно неразумным.
Языком не указывается порядок вычисления аргументов функций; онивычисляются справа налево на pdp-11 и vax-11 и слева направо наостальных машинах. Порядок, в котором происходят побочные эффекты, такжене специфицируется.
Так как символьные константы в действительности являются об'ектами типаint, допускается использование символьных констант, состоящих изнескольких символов. Однако, поскольку порядок, в котором символыприписываются к слову, меняется от машины к машине, конкретнаяреализация оказывается весьма машинно-зависимой.
Присваивание полей к словам и символов к целым осуществляется справоналево на pdp-11 и vax-11 и слева направо на других машинах. Этиразличия незаметны для изолированных программ, в которых не разрешеносмешивать типы (преобразуя, например, указатель на int в указатель наchar и затем проверяя указываемую память), но должны учитываться присогласовании с накладываемыми извне схемами памяти.
Язык, принятый на различных компиляторах, отличается тольконезначительными деталями. Самое заметное отличие состоит в том, чтоиспользуемый в настоящее время компилятор на pdp-11 неинициализирует структуры, которые содержат поля битов, и не допускаетнекоторые операции присваивания в определенных контекстах, связанных сиспользованием значения присваивания.