IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> FPC 2.4.0
сообщение
Сообщение #1


Гость






Итак, в качестве новогоднего подарка от разработчиков FPC на официальном сайте доступна новая версия компилятора: 2.4.0

Изменений достаточно много:
  • поддержка новых платформ: 64-bit Mac OS X (x86_64/ppc64), iPhone (Mac OS X/Arm), Haiku (BeOS family), улучшенная поддержка ARM EABI;
  • Дельфи-подобная работа с ресурсами под всеми платформами;
  • улучшение генерации отладочной информации (dwarf);
  • общая оптимизация программы (заявляется увеличение скорости компиляции модулей)
.
.
.


Приведу краткий список изменений...
Полный список, с объяснением их причин и методов исправления программ приведен здесь (англ. язык):
freepascal wiki -> User Changes 2.4.0


Изменения в использовании конструкций языка

1. В предыдущих версиях компилировался код, в котором константа перечислимого типа передавалась в подпрограмму:
procedure test(const a);
begin
end;

begin
test(5);
end.
, теперь он компилироваться не будет, поскольку неизвестен размер константы (1, 2, 4, или 8 байт), передаваемой в подпрограмму.

2. Свойства (properties), напрямую связанные (mapped) с полями класса, трактуются компилятором, как обычные поля класса. Если раньше можно было такие property передавать в качестве Var или Out - параметра, и получать адрес свойства, то теперь этого делать нельзя. Все property трактуются одинаково, независимо от того, связаны они с полем напрямую, или используют функции чтения/записи (getter/setter):
{$mode objfpc}
type
trec = record
a, b: integer;
end;

tc = class
private
fmyfield: integer;
frec: trec;
public
property myfield: integer read fmyfield write fmyfield;
property rec: trec read frec write frec;
end;

var
c: tc;
begin
c:=tc.create;
inc(c.myfield); // Ошибка: Нельзя получить адрес константного выражения
c.rec.a:=5; // Ошибка: Аргументу нельзя присвоить значение
cardinal(c.myfield):=$ffffffff; // Ошибка: Аргументу нельзя присвоить значение
end.


3. Перегрузка оператора присваивания, возвращающего строку. Теперь невозможно создать такой оператор, который будет возвращать строку фиксированного размера (не равного 255). То есть, код:
type
ts1 = string[4];
ts2 = string[255];

operator :=(l: longint) res: ts1;
begin
str(l:4,res);
end;

operator :=(l: longint) res: ts2;
begin
str(l:20,res);
end;

begin
end.
компилироваться больше не будет (ts1 не является теперь допустимым типом для оператора присваивания). Если вам так уж необходимо вернуть строки разной длины - "оберните" эти строковые типы в запись:
type
ts1 = record
s: string[4];
end;
ts2 = record
s: string[255];
end;

operator :=(l: longint) res: ts1;
begin
str(l:4,res.s);
end;

operator :=(l: longint) res: ts2;
begin
str(l:20,res.s);
end;

begin
end.


4. Описание абсолютных переменных: прежние версии FPC позволяли совмещать переменные с полями классов, элементами динамических массивов, элементами строк, и т.д. Теперь совмещение с любым разыменованным выражением запрещено. Код:
type
ta = class
p: pointer;
procedure test;
end;

procedure ta.test;
var
pa: ta absolute p;
b: pchar;
c: char absolute b[4];
begin
end;

begin
end.
компилироваться не будет...

5. Индексированные свойства (properties) и значения по умолчанию: если в getter-е для индексированного свойства присутствует значение по умолчанию, то при вызове можно было не указывать умалчиваемое значение Теперь этого делать нельзя, ВСЕ параметры в таких getter-ах должны быть указаны:
{$mode objfpc}
{$H+}

type
{ TForm1 }
TForm1 = class
private
function GetFoo(Index: Integer; Ask: Boolean = True): Integer;
public
property Foo[Index: Integer; Ask: Boolean]: Integer read GetFoo;
end;

function TForm1.GetFoo(Index: Integer; Ask: Boolean): Integer;
begin
Result := Foo[Index]; // Не хватает параметра
end;

end.


6. Порядок полей/методов в описании класса. Раньше можно было описывать "вперемешку" поля, свойства и методы класса. Теперь этого делать нельзя: поля должны идти перед методами и свойствами. Как результат - подобный код:
{$mode objfpc}

type
tc = class
constructor create;
a: longint; // Поле описано после метода
end;

constructor tc.create;
begin
end;

begin
end.
компилироваться больше не будет.

7. Описания типов в списке параметров подпрограммы. Теперь нельзя конструировать тип прямо в заголовке подпрограммы, нужно предварительно описать тип (в секции Type программы/модуля), а уж потом его использовать. Так больше делать нельзя:
procedure write(var f: file of extended; e: extended);
begin
system.write(f,e);
end;

procedure writestring(const s: string[80]);
begin
writeln(s);
end;

function mystr: string[50];
begin
mystr:='abc';
end;
Это ограничение проистекает из правила совместимости типов Паскаля: "Два типа, описанные совершенно одинаково в разных местах программы, считаются разными".

Некоторые изменения в реализации:
1. Изменены правила выравнивания переменных, имеющих тип "запись".

2. Присваивание значения True в переменную типа ByteBool/WordBool/LongBool/QWordBool теперь не эквивалентно присваиванию 1. Теперь все биты булевых переменных устанавливаются в 1 (значение становится равным "-1").

*****

Чуть позже будут выложены результаты тестирования компиляторов FPC второй ветки (2.0.0, 2.0.4, 2.2.0, 2.2.2, 2.4.0) на скорость:
1) доступа к члену класса.
2) вызова пустого статического метода.
3) вызова пустого динамического метода.
4) быстрой сортировки массива (Quick Sort).
5) пузырьковой сортировки массива(Bubble Sort)
6) "древесной" сортировки массива (Tree Sort).
7) вычисления 4500 цифр числа Пи.
8) конкатенации строк.
9) вещественных вычислений.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
volvo   FPC 2.4.0   29.01.2010 5:01
Lapp   О_о Однако.. Пожалуй, что рано выьрасывать преды…   29.01.2010 6:35
volvo   В FPC? Нет... Вот такое свободно компилируется и в…   29.01.2010 6:56
volvo   Итак, первые результаты тестов. Для начала я реши…   29.01.2010 18:39
Archon   Огромное спасибо за обзор, он пришелся очень кстат…   30.01.2010 12:51
volvo   Так эта возможность появилась не в 2.4, а раньше. …   30.01.2010 16:13
SKVOZNJAK   Тот форум странный, моя айпишка там забанена навер…   30.01.2010 23:47
Romtek   Так как же тогда можно с пунктом 2?   22.04.2010 19:33
volvo   Никакие трюки теперь не допускаются. Только …   22.04.2010 19:53
Romtek   Теперь ясно. Пошли по пути увеличения строгости си…   22.04.2010 21:52
SKVOZNJAK   "Мне бы ваши проблемы, Марь Ивановна" (…   2.05.2010 4:50
SKVOZNJAK   var B: int64; A: array[1..1000] of byte; begin B:=…   24.06.2010 16:12
volvo   Неправда, ничего не вылетает, печатается 0 как и п…   24.06.2010 17:11
TarasBer   А в чём смысл обращаться к 1001 элементу 1000-элем…   24.06.2010 17:57
SKVOZNJAK   Значит это только в линуксе, поленился винду загру…   25.06.2010 20:44
Lapp   Значит это только в линуксе, поленился винду загр…   26.06.2010 10:25
SKVOZNJAK   Задачи меня почти не интересуют, так как не студен…   26.06.2010 15:55
volvo   Включение {$R+} (или -Cr) приведет к тому же …   26.06.2010 20:07


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.04.2024 9:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name