vaxocentrism



Предыдущая | Следующая

vaxocentrism (ваксоцентризм), сущ. Гипотетическая болезнь, поражающая многих Си-программистов (особенно тех из них, кто работал в UNIX), проработавших какое-то время на машинах типа VAX и привыкших к следующим соглашениям, которые на всех других машинах приводят к ошибкам.1.Предположение, что при переназначении нулевой указатель сохраняет свое значение, т.к. все биты сброшены, и ячейка памяти с адресом ноль читается и всегда содержит ноль. Неувязка: приводит к ошибке адресации на всех других машинах и даже на самих VAX, работающих не под BSD UNIX. Обычно эта ошибка является результатом небрежности (программист забывает проверить ссылку перед тем, как ее использовать), а не как намерение использовать явный недостаток системы. 2.      Предположение, что в каждом символе имеется знаковый разряд. 3.Предположение, что указатель одного типа можно свободно преобразовывать к указателю любого другого типа, или, если подходить более строго, предположение, что все указатели имеют одинаковые размеры и один и тот же формат, что с точки зрения программиста означает, что он не должен заботиться о выборе правильного типа. Неувязка: приводит к ошибке на машинах, ориентированных на работу с целыми словами, и на машинах, в которых используются разные форматы указателей. 4.      Предположение, что все параметры подпрограммы хранятся в одной непрерывной области памяти в строго определенном порядке. Неувязка возникает при попытке воспользоваться этим предположением на большинстве машин RISC-архитектур. 5.      Предположение, что указатель и переменная целого типа имеют одинаковый размер, поэтому можно безбоязненно записывать значение указателя в переменную целого типа и наоборот, и не бояться усечения. На машинах с пословной адресацией и машинах с сегментной организацией памяти, в которых используются забавные форматы указателей, это предположение приводит к ошибке. 6.   Предположение, что переменная любого типа данных и любого размера может размещаться в памяти, начиная с любого адреса и можно, например, сконструировать и назначить ссылку на объект, который расположен в памяти, начиная с нечетного адреса. На большинстве машин (особенно с RISC-архитектурой), которые более эффективно работают с языками высокого уровня, подобные предположения могут привести к ошибке адресации или ошибке шины. 7.     Связанное с предыдущим предположение, что незначащие поля в конце записи не дополняются пустыми кодами или пробелами, поэтому при работе с массивами следующий байт после последнего байта предыдущего компонента массива всегда будет первым байтом следующего компонента. Но такое предположение зависит не только от архитектуры, но и от того, как организован компилятор. 8.     Предположение, что все адресное пространство является «плоским», поэтому всегда можно использовать ссылку типа f oo [-1]. Проблемы возникают в случае нулевого адреса, а на машинах с сегментной организацией памяти типа Intel ошибка может возникнуть в любом другом месте (конечно, сегментирование памяти всегда свидетельствует о «прибабахнутости» архитектуры, но это тема отдельного разговора). См. brain-damaged. moby. 9.     Предположение, что объекты могут иметь самые произвольные размеры без всяких оговорок. Проблемы возникают на машинах с сегментацией памяти на машинах, в которых не используется виртуальная память. 10. Предположение о том, что размер стека ограничен только размером памяти. Приводит к недоразумениям в архитектурах с сегментацией и практически на всех машинах без виртуальной памяти и с покадровой организацией стека. 11.Предположение, что внутри объекта все биты и прочие адресуемые компоненты упорядочены определенным образом, и что этот порядок всегда один и тот же. Проблемы возникают на машинах .с «тупоконечной» организацией памяти (см. big-endian). 12.Предположение о том, что можно сравнивать между собой указатели разных объектов, не принадлежащих к одному массиву, или указатели объектов разных типов. В первом случае возникают недоразумения на машинах с сегментацией памяти, во втором – на машинах с пословной адресацией или машинах с разными форматами указателей.   13.Предположение, что размер типа int раве 32 битам или что sizeof(int) == sizeof (long). Это предположение не работает на машинах с 286 процессором и даже в некоторых компиляторах для 386 и 68000. 14.Предположение, что можно писать argv[]. Некоторые Си-компиляторы для персональных компьютеров воспринимают это как ошибку. Заметим, что программист может быть подвержен ваксоцентризму даже в том случае, если он никогда в жизни не видел ни одной машины класса VAX. Некоторые из этих предположений (особенно предположения 2 5) в одинаковой степени относятся к PDP-11 (первая машина, для которой был написан компилятор Си), поэтому отдельные симптомы ваксоцентризма появились задолго до появления самого VAX.