Difference between revisions of "Writing portable code regarding the processor architecture/ru"
(Created page with "{{Editing Writing portable code regarding the processor architecture}} Существует ряд проблем связанных с написанием кода, явл...") |
m (categories) |
||
Line 91: | Line 91: | ||
{{Data types}} | {{Data types}} | ||
− | [[Category: | + | |
− | [[Category:Processors]] | + | {{AutoCategory}} |
+ | [[Category:Russian (unfinished translation)]] | ||
+ | [[Category:Data types/ru]] | ||
+ | [[Category:Processors/ru]] | ||
+ | [[Category:Multiplatform Programming/ru]] | ||
+ | [[Category:Platform-sensitive development/ru]] | ||
+ | [[Category:Tutorials/ru]] |
Revision as of 07:27, 15 May 2015
│
English (en) │
Bahasa Indonesia (id) │
русский (ru) │
Существует ряд проблем связанных с написанием кода, являющегося не зависимым от процессорной архитектуры. Одна из них - это порядок следования байтов, другая – разрядность процессора (32 или 64-битные ЦП).
Порядок следования байтов (ПСБ)
Порядок следования байтов определяет, как будет хранить ЦП значения больше одного байта. (т.е. 16/32/64-битные целые числа).
Free Pascal поддерживает процессоры с двумя типами следования байтов:
- Порядок следования от младшего к старшему байту: longint(4) кодируется как 04 00 00 00 (little endian)
- Порядок следования от старшего к младшему байту: longint(4) кодируется как 00 00 00 04 (big endian)
Примечание:
Процессоры со средним(смешаным) порядком байтов, известный так же, как смешанный порядок байтов, сегодня встречаются редко. Наиболее известный представитель процессоров со смешанным порядком байтов является устаревший сегодня PDP-11 производства компании DEC.
Каждое семейство процессоров имеют свой порядок байтов, но как правило они либо от младшего к старшему, либо от старшего к младшему, в зависимости от архитектуры (ARM, PPC).
Самые известные представители процессоров с порядком следования байтов от младшего к старшему, являются процессоры семейства x86, используемые в ПК, и его собратья x86-64. Типичными же представителями процессоров с порядком следования байтов от старшего к младшему являются процессоры семейства PPC (см. примечание выше) и процессоры m68k, использовавшихся в миникомпьютерах HP3000, а так же в майнфреймах подобные IBM 370 (серия Z).
Поскольку спецификация TCP/IP предполагает, что все заголовки в структуре протокола должны храниться с порядком байтов от старшего к младшему, то данный порядок байтов иногда упоминается как «сетевой порядок следования байтов».
Наиболее важен порядок байтов в следующих случаях:
- при обмене данными компьютерами с различными архитектурами ЦП
- при доступе к большому количеству данных, например, представленных в виде массива целых чисел или байтов.
Пример последнего:
type
Q = record
case Boolean of
True: (i: Integer);
False: (p: array[1..4] of Byte);
end;
var
x:^Q;
begin
// Указываем компилятору порядок следования байтов(ПСБ):
{$IFDEF ENDIAN_LITTLE}
Writeln('Программа скомпилирована для компьютеров с ПСБ от младшего к старшему (например Intel x86, ARMEL)');
{$ENDIF}
{$IFDEF ENDIAN_BIG}
Writeln('Программа скомпилирована для компьютеров с ПСБ от старшего к младшему (например PowerPC, ARMEB)');
{$ENDIF}
New(x);
x^.i := 5;
if x^.p[1] = 5 then
WriteLn(x^.p[1],' На вашей машине ПСБ от младшего к старшему')
else
if x^.p[4] = 5 then
WriteLn(x^.p[1],' На вашей машине ПСБ от старшего к младшему')
else
WriteLn(x^.p[1],' ',x^.p[2],' ',x^.p[3],' ',x^.p[4],' Порядок следования байтов не определён');
WriteLn;
{ Сделаем паузу для просмотра результата }
Write('Нажмите Enter для выхода из программы ');
ReadLn;
end.
Данный пример на компьютерах с ПСБ от младшего к старшему выведет число 5 (т.к. число 5 хранится в памяти в виде 05 00 00 00). В то же время, компьютеры с ПСБ от старшего к младшему (например, PowerMac) выведут 0 (поскольку число 5 хранится в памяти в виде 00 00 00 05).
Для определения порядка следования байтов, служат директивы компилятора ENDIAN_BIG и ENDIAN_LITTLE (или FPC_LITTLE_ENDIAN и FPC_BIG_ENDIAN начиная с версии 1.9).
Изменение ПСБ
Модуль system имеет ряд процедур для преобразования данных между порядком следования байтов от старшего к младшему и ЦП, на которым выполняется программа (BEtoN, NtoBE). Соответствующие процедуры реализованы и для машин с ПСБ от младшего к старшему: LEtoN, NtoLE. Имеются также процедуры для смешанного порядка байтов (SwapEndian).
Некоторые сетевые библиотеки, например Synapse имеют собственные реализации конвертации ПСБ между сетью и компьютером.
Согласование
Некоторые процессоры могут не правильно выстроить данные в памяти. Это может привести к изменению размера типа данных запись(record), поэтому всегда используйте функцию sizeof для проверки размера записи.
32 Bit и 64 Bit
Для достижения максимальной совместимости со старым кодом, FPC не изменяет размер стандартных типов данных, например: integer, longint или word при переходе с 32 разрядного на 64-ёх разрядный ЦП. Выражения, вроде longint(pointer(p)) приведут к ошибке на 64-разрядных процессорах. Для написания переносимого кода в FPC введены типы PtrInt и PtrUInt в модуле system, представляющие собой знаковые и беззнаковые целочисленные типы данных такого же размера, как и указатель(Pointer).
Имейте в виду, что смена размера типа "pointer" так же влияет на размер записей, если Вы определите запись не фиксированного размера, а через процедуры new или getmem (<x>,sizeof(<x>)).
Это относится к открытым платформам Unix. В коммерческом мире, существуют некоторые исключения, например Tru64 или ILP64.
simple data types |
|
---|---|
complex data types |