Difference between revisions of "Writing portable code regarding the processor architecture/ru"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{Editing Writing portable code regarding the processor architecture}} Существует ряд проблем связанных с написанием кода, явл...")
 
m (categories)
Line 91: Line 91:
 
{{Data types}}
 
{{Data types}}
  
[[Category:Tutorials]]
+
 
[[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 поддерживает процессоры с двумя типами следования байтов:

  1. Порядок следования от младшего к старшему байту: longint(4) кодируется как 04 00 00 00 (little endian)
  2. Порядок следования от старшего к младшему байту: longint(4) кодируется как 00 00 00 04 (big endian)

Примечание:

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

Каждое семейство процессоров имеют свой порядок байтов, но как правило они либо от младшего к старшему, либо от старшего к младшему, в зависимости от архитектуры (ARM, PPC).

Самые известные представители процессоров с порядком следования байтов от младшего к старшему, являются процессоры семейства x86, используемые в ПК, и его собратья x86-64. Типичными же представителями процессоров с порядком следования байтов от старшего к младшему являются процессоры семейства PPC (см. примечание выше) и процессоры m68k, использовавшихся в миникомпьютерах HP3000, а так же в майнфреймах подобные IBM 370 (серия Z).

Поскольку спецификация TCP/IP предполагает, что все заголовки в структуре протокола должны храниться с порядком байтов от старшего к младшему, то данный порядок байтов иногда упоминается как «сетевой порядок следования байтов».

Наиболее важен порядок байтов в следующих случаях:

  1. при обмене данными компьютерами с различными архитектурами ЦП
  2. при доступе к большому количеству данных, например, представленных в виде массива целых чисел или байтов.


Пример последнего:

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.



navigation bar: data types
simple data types

boolean byte cardinal char currency double dword extended int8 int16 int32 int64 integer longint real shortint single smallint pointer qword word

complex data types

array class object record set string shortstring