Вперед Назад Содержание

17. Переносимость, как она понимается в GNU

Многое из того, что называется "переносимым" в мире Unix, зачастую оказывается переносимым только в разные версии Unix'а. Для GNU-программ это вторично, поскольку основной целью является исполнение их под одним и только одним ядром - GNU-ядром, и компилирование их одним и только одним компилятором с языка C ­ компилятором GNU C. Многообразие GNU-систем на различных процессорах должно быть таким же, как многообразие систем Berkley 4.3 на различных процессорах.

На сегодняшний день все пользователи используют GNU-программы на не-GNU-системах. Поэтому поддержка различных не-GNU систем нужна, хоть и не является первостепенной. Простейший способ достичь переносимости на разумный диапазон систем состоит в использовании Autoconf. Едва ли Вашей программе потребуется иметь больше информации о машине, чем может дать Autoconf, хотя бы потому, что большинство программ, которым нужны такие знания, уже существуют.

Трудно сейчас сказать точно, какие возможности будет предоставлять GNU-ядро, потому что его реализация еще не завершена. Однако, Вы можете спокойно использовать все то, что есть в 4.3, просто избегайте использования форматов полувнутренних быз данных (таких, как каталоги), когда можно воспользоваться высокоуровневой альтернативой (readdir).

Вы можете спокойно использовать любые стандартные возможности языка C, библиотек или ядра, поскольку мы считаем необходимым поддержать их в полной GNU-системе, неважно есть она сейчас или нет. То, что существуют ядра или компиляторы C, не предоставляющие соответствующие возможности, не важно, покуда GNU-ядро и компилятор с языка C поддерживают их.

Остается беспокоиться о различиях между различными типами процессоров, такими, как разница в порядке байтов и ограничения на выравнивания. Наврядли 16-битовые машины будут поддержаны GNU, так что не стоит задумываться о том, может ли целое быть шириной менее чем 32 разряда.

Вы можете считать, что все указатели имеют одинаковый формат, независимо от типа, на который они указывают, и что это на самом деле целое. Есть некоторые странные машины, для которых это неверно, но они не так и важны; не тратте время угождая им. Кроме того, со временем мы поместим прототипы функций во все GNU-программы, и это, вероятно, приведет к тому, что Ваша программа будет работать даже на таких странных машинах.

Поскольку некоторые важные для нас машины (включая 68000) имеют обратный порядок байтов, не следует считать, что адрес целочисленного объекта - это так же адрес и его наименее значащего байта. Не делайте такую ошибку:

int c; ... while ((c = getchar()) != EOF) write(file_descriptor, &c, 1);
Вы можете считать разумным использование мегабайта памяти. Не старайтесь уменьшать использование памяти, если Вы не подходите к этому барьеру. Если Ваша программа создает сложные структуры данных, стройте их в памяти, и выдайте фатальную ошибку, если malloc вернул ноль.

Если программа работает по строкам, и она может быть применена к произвольному предоставленному пользователем входному файлу, она должна хранить в памяти только одно строку, поскольку это не сложно, и пользователи смогут обрабатывать файлы большего размера, чем может поместиться в оперативной памяти.


Вперед Назад Содержание