Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Портирование приложений с Turbo Pascal на Free Pascal

Страницы: 1
Портирование приложений с Turbo Pascal на Free Pascal, Перевод официальной документации
Попытался сделать перевод на русский статьи, которая, на мой взгляд, будет очень полезна для переходящих на FPC. Перевод пока, что называется "на скорую руку" сделан - возможны неточноти, ошибки, и еще некоторые пункты так "с лёту" перевести не получилось smile:D Но, надеюсь со временем и вашей помощью статья исправится, допишется, возможно даже кто-то сможет добавить какие-то свои замечания/наблюдения.

Оригинал: Porting Turbo Pascal to Free Pascal

Мой перевод:

Портирование приложений с Turbo Pascal на Free Pascal.

Этот документ содержит некоторую информацию о различиях между Free Pascal`ем и Turbo Pascal 7.0. Этот список не полный.

Assembler
* Ассемблер по-умолчанию использует другой синтаксис, но вы можете переключиться на синтаксис Intel (который использует Turbo Pascal) путем добавления ключа -Rintel при компиляции или добавлением {$asmmode intel} в ваш исходник.
* 32-битная модель памяти требует полного переписывания ваших ассемблерных блоков.

Run time библиотеки
* Чтобы пользоваться массивом PORT, добавьте мудль Ports к вашим используемым модулям (доступно только под Dos/Go32v2 и Linux).
* Вы можете обращаться к памяти в real mode используя MEM[seg:ofs] (так же как MemW и MemL) только под Go32v2.
* Ofs() возвращает longint а не word.
* Модуль OVERLAY не доступен.
* Поддержка Turbo Vision осуществляется Free Vision; клон, потому что оригинальный Turbo Vision все еще не доступен свободно (авторские права на него еще принадлежат Borland).

Препроцессор/Синтаксис
* Если вы будете использовать ключ -So (или добавите {$mode TP} в ваш исходник), компилятор перейдет в режим совместимости с Turbo Pascal, который сделает недоступными некоторые продвинутые особенности FPC (как например перегрузка процедур) для обеспечения лучшей совместимости с Turbo Pascal.
* Вложенные комменатрии разрешены, но вы получите Note при компиляции (отключено в режиме TP).

Синтаксис
* FAR и NEAR игнорируются.
* Чтобы получить адрес процедуры для назначения его переменной процедуры вы должны использовать @-оператор (в TP режиме, переменные процедуры работают как в TP).

Код
      procedure p;
        begin
        end;

      var
        proc : procedure;
      begin
        proc:=@p;
      end;

* INLINE поддерживается компилятором, но может использоваться только для кода паскаля, не для байткода.
* Заголовки процедур/функций, которые были объявлены в начале всегда должны полностью переписываться в определении, иначе компилятор будет думать, что они перегружены (не требуется, если используете -So).
* Здесь гораздо больше зарезервированных слов.
* Некоторые расширения Delphi поддерживаются частично.

Семантика
* Максимальный размер параметра, который можно передать к подпрограмме, составляет 64 КБ для версии Intel и 32 КБ для версий Motorola.
* Записи всегда выравниваются по словам; используйте 'packed record' или {$PACKRECORDS 1} чтобы получить записи, совместимые с TP7. Небольшое предупреждение: используйте packed только если вам действительно это надо, поскольку non-alignment of fields может не работать на не-Intel процессорах (и замедлит доступ к данным практически во всех случаях).

Код
      type
        r1=record
          a : byte;
          b : word;
        end;
        r2=packed record
          a : byte;
          b : word;
        end;

      begin
        writeln(sizeof(r1));  { outputs 4 }
        writeln(sizeof(r2));  { outputs 3 }
      end.

* Предупреждение: currently all sets in FPC are either longint or 32 byte sized, whereas TP sets usually are byte or word sized. A current work around for this is declaring your sets as a byte/word and then use the bit manipulation unit available on the contributions page to manually include/exclude items. Of course, this is only necessary if you need TP compatible records, otherwise you can use the standard FPC sets.
* Function results can also be complex types like arrays or records (not in TP mode).
* It's possible to handle the function result in a function like a variable (not in TP mode):

Код
      function a : longint;
        begin
          a:=12;
          while a>4 do
           begin
             {...}
           end;
         end;

* Вышеупомянутый пример работал бы с TP, но компилятор предположит, что a>4 является рекурсивным вызовом. Чтобы сделать рекурсивный вызов в FPC, Вы должны добавить () после названия функции (не в режиме TP):

Код
      function a : longint;
        begin
          a:=12;
        {    v---- this is a recursive call }
          if a()>4 then
           begin
             {...}
           end;
        end;
[code]
[b]*[/b] Процедура exit может так же использоваться с function result как параметр:

[code]      function a : longint;
        begin
          a:=12;
          if a>4 then
           exit(a[b]*[/b]67);
        end;

* Определяемые в начале функции, всегда должны определяться с полным заголовком (не в режиме TP):

Код
       procedure x(v : longint);forward;

       procedure x; { this overloads the procedure x !!!!}
         begin
           { ... }
         end;

       { write instead: }

       procedure x(v : longint);
         begin
           { ... }
         end;

* Всегда короткое определение булевых переменных (для TP режима тоже!!).

Другое
* Параметры командной строки различаются.
* Не все ключи компилятора полностью реализованы.
* Бинарные модули не совместимы.
Изменено: Андрей - 02.12.2009 01:13:41
спасибо, надо будет почитать на досуге
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)