Язык С

       

Соображения о переносимости


Некоторые части языка "C" по своей сути машинно-зависи- мы. Следующие ниже перечисление потенциальных трудностей хо- тя и не являются всеобъемлющими, но выделяет основные из них. Как показала практика, вопросы, целиком связанные с ап- паратным оборудованием, такие как размер слова, свойства плавающей арифметики и целого деления, не представляют осо- бенных затруднений. Другие аспекты аппаратных средств нахо- дят свое отражение в различных реализациях. Некоторые из них, в частности, знаковое расширение (преобразующее отрица- тельный символ в отрицательное целое) и порядок, в котором помещаются байты в слове, представляют собой неприятность, которая должна тщательно отслеживаться. Большинство из ос- тальных проблем этого типа не вызывает сколько-нибудь значи- тельных затруднений. Число переменных типа REGISTER, которое фактически может быть помещено в регистры, меняется от машины к машине, также как и набор допустимых для них типов. Тем не менее все ком- пиляторы на своих машинах работают надлежащим образом; лиш- ние или недопустимые регистровые описания игнорируются. Некоторые трудности возникают только при использовании сомнительной практики программирования. Писать программы, которые зависят от каких- либо этих свойств, является чрез- вычайно неразумным. Языком не указывается порядок вычисления аргументов фун- кций; они вычисляются справа налево на PDP-11 и VAX-11 и слева направо на остальных машинах. порядок, в котором про- исходят побочные эффекты, также не специфицируется. Так как символьные константы в действительности являются объектами типа INT, допускается использование символьных констант, состоящих из нескольких символов. Однако, посколь- ку порядок, в котором символы приписываются к слову, меняет- ся от машины к машине, конкретная реализация оказывается весьма машинно-зависимой. Присваивание полей к словам и символов к целым осуществ- ляется справо налево на PDP-11 и VAX-11 и слева направо на других машинах. эти различия незаметны для изолированных программ, в которых не разрешено смешивать типы (преобразуя, например, указатель на INT в указатель на CHAR и затем про- веряя указываемую память), но должны учитываться при согла- совании с накладываемыми извне схемами памяти.

Язык, принятый на различных компиляторах, отличается только незначительными деталями. Самое заметное отличие сос- тоит в том, что используемый в настоящее время компилятор на PDP-11 не инициализирует структуры, которые содержат поля битов, и не допускает некоторые операции присваивания в оп- ределенных контекстах, связанных с использованием значения присваивания.



    Содержание раздела