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

 
 Ответить  Открыть новую тему 
> FPC 2.6.0
IUnknown
сообщение 4.01.2012 16:58
Сообщение #1


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


На официальном сайте FPC с 1 января 2012 г. доступна новая версия компилятора: 2.6.0

Приведу список новых возможностей...

Изменения в языке

1. Добавлена поддержка вложенных типов (в том числе - классов), классовых переменных и локальных констант.

То есть, теперь можно написать так:
type
TA = class
strict private
const Value = 1; // Константа для внутреннего использования

type
innerA = class // Вложенный класс, невидимый снаружи
// ...
end;

public
var
myVariable : Integer; // Статическая переменная
// (принадлежит типу, а не экземпляру)
type
availableA = class // Вложенный класс, доступный извне
// ...
end;
end;



2. Расширенный синтаксис записей.

То, что в Дельфи называется advanced record syntax, теперь есть и в FPC. В записях можно использовать спецификаторы private/public, можно описывать вложенные типы, конструкторы, статические поля, свойства, классовые конструкторы, классовые деструкторы и классовые операторы (конструкторы записей пока не поддерживаются). На всякий случай, отличия таких расширенных записей от классов:
1) не поддерживается наследование;
2) записи могут содержать вариантные части, классы - нет;
3) записи - это не ссылки, а значения, в отличие от классов.


3. Энумераторы записей.

В предыдущих версиях FPC энумераторы (перечислители) могли быть классами, объектами или интерфейсами. Теперь они могут быть также и расширенными записями.


4. Поддержка хелперов классов и записей.

Это позволяет добавлять методы, свойства и перечислители к классам и записям, не прибегая к наследованию. Пример использования хелпера:

type
TObjectHelper = class helper for TObject
function ToString(const aFormat: String): String; overload;
end;

function TObjectHelper.ToString(const aFormat: String): String;
begin
Result := Format(aFormat, [ToString]);
end;

var
Obj: TObject;
begin
Writeln(Obj.ToString('The object''s name is %s'));
end.
Подробное описание - Здесь (англ.)


5. Дженерики: записи, массивы и процедурные типы.

В предыдущих версиях FPC поддерживались только шаблонные (вернее, обобщенные) классы, объекты и интерфейсы. Теперь стало возможным делать обобщенными всё вышеперечисленное.


6. Поддержка локальных перечислений.

В режиме {$SCOPEDENUMS ON} перечисления не добавляются в глобальную область видимости:

type
TFoo = (A, B, Foo);
{$SCOPEDENUMS ON}
TBar = (A, B, Bar);
{$SCOPEDENUMS OFF}

begin
WriteLn(Integer(Foo));
WriteLn(Integer(A)); // Выводится TFoo.A
WriteLn(Integer(TBar.B));
WriteLn(Integer(TBar.Bar));
WriteLn(Integer(Bar)); // Ошибка: нет глобального Bar
end;



7. Поддержка собственных сообщений об устаревших элементах.

unit OldUnit deprecated 'Use NewUnit instead';

interface

implementation

procedure OldRoutine; deprecated 'Use NewRoutine instead';
begin
end;

end.
(также допустимо использовать с константами)


8. Поддержка диалекта Objective Pascal

Для большего удобства работы в MacOS X. (В настоящее время этот диалект поддерживается только на Darwin-платформах, включая iOS). Основы языка Objective Pascal описаны здесь



9. Добавлен режим, поддерживающий стандарт ISO 7185

{$MODE ISO}, или -Miso из командной строки


10. Поддержка вложенных процедурных переменных.

Теперь возможно определить переменную процедурного типа, которая совместима по присваиванию с вложенными процедурами/функциями. Эта фича включена по умолчанию в режимах {$mode MacPas} и {$mode ISO}, в остальных режимах ее надо включить явно: {$modeswitch NestedProcVar}. Возможно также присвоить обычную (не вложенную) подпрограмму подобной переменной, и вызывать ее таким образом.

Разрешение этой фичи изменяет соглашение вызова вложенной подпрограммы. Это "сломает" код времен Турбо-Паскаля, который использует вложенные процедуры/функции как Callback-и при работе с коллекциями из модуля Objects.

Тип процедурной переменной может хранить ссылку на вложенную подпрограмму в двух случаях:
а) когда он описан внутри списка параметров другой процедуры (описание в стиле ISO:
procedure caller(procedure ToBeCalled);
begin
ToBeCalled;
end;

procedure Main;

procedure InnerToMain;
begin
// ...
end;

begin { Main }
Caller(@InnerToMain);
end; { Main }

begin
Main;
end.
)
б) когда в объявлении присутствует "is nested" (подобно описанию "of object" для методов класса):

type NestedProc = procedure is nested;
var
T : NestedProc;

procedure Caller(p : NestedProc);
begin
T := p;
T;
end;

procedure Main;

procedure InnerToMain;
begin
// ...
end;

begin
Caller(@InnerToMain);
end;

begin
Main;
end.
При использовании этого способа надо быть внимательным, поскольку очень просто написать неправильный код: если присвоить ссылку на вложенную процедуру соответствующей переменной, выйти из области видимости внешней функции, и только потом попытаться вызвать вложенную - подобный вызов приведет к UB (неопределенному поведению)


11. Поддержка нелокальных Goto (я просто описываю нововведение, нравится оно мне или нет - это другой вопрос)

Теперь возможно перейти по Goto на метку в другой подпрограмме, т.е., быстро выйти из глубоко вложенной подпрограммы в менее вложенную. Эта возможность включена по умолчанию в режимах ISO/MacPas, в остальных - ее надо (а лучше - не надо) включить: {$modeswitch NonLocalGoto}. Невозможно обойти нелокальным Goto стековые фреймы, требующие финализации (во избежание проблем с подсчетом ссылок).


12. Поддержка & для экранирования ключевых слов.

Можно использовать экранированные служебные слова как идентификаторы:

var
&do: string;
&in: boolean;
begin
&do:='abc';
&in:=true;
end.



13. Поддержка параметров univ для режима MacPas

Предыдущие версии компилятора просто игнорировали квалификатор univ для параметров. Теперь FPC его нормально парсит и интерпретирует как и все другие компиляторы MacPascal-я: то есть, разрешает передачу любых фактических параметров, если их размер соответствует размеру формального параметра подпрограммы. Эта возможность - только для режима {$mode macpas}. Пользоваться ей нужно с большой осторожностью, так как она вообще предназначена для портирования Legacy-кода.


14. Вещественный тип CExtended

С точки зрения точности этот тип аналогичен типу Extended, но он соответствует свойствам/поведению эквивалентного Extended типа в C. С практической точки зрения это означает, что на платформах i386/x86_64 тип CExtended соответствует типу long double, а на остальных платформах - типу double. В основном это необходимо в случаях, когда с С переводятся описания структур, чтобы гарантировать правильное выравнивание, и для описания параметров к Сишным подпрограммам.

Внимание: на данный момент FPC не поддерживает эквивалент long double на других платформах (кроме вышеперечисленных).


15. Встроенный SAR (shift arithmetic right)

В отличие от SHL/SHR, SAR реализован не как оператор, а как встроенная функция. Она имеет разные имена для разных целочисленных типов (SarInt64/SarLongint/SarSmallint) чтобы избежать проблем при присваивании результата функции в выражении.


16. Встроенные ROL/ROR

Вместе с SAR добавлена поддержка и для ROL (Rotate Overflow Left) и ROR (Rotate Overflow Right). Также как и в случае SAR, функции реализованы под разными именами для разных типов параметров.


17. Встроенные функции Bit Scan.

Добавлена поддержка еще двух функций: BSF (Bit Scan Forward) и BSR (Bit Scan Reverse).


18. Типы Boolean16, Boolean32 и Boolean64.

Эти 3 типа аналогичны по поведению стандартному типу Boolean, за исключением того, что их размеры - соответственно 2, 4 и 8 байт. Очень удобно в случае организации интерфейса с библиотеками.

Внимание: существующие типы WordBool/LongBool/QWordBool подразумевают, что False = 0, а True <> 0. В случае использования новых типов False = 0, True = 1, а все остальные значения - не валидны.


Изменения в языке

1. Поддержка VFPv2/VFPv3

Была добавлена поддержка модулей Vector Floating Point (VFP) второй и третьей версии. Эти модули обычно включаются на процессорах семейств Cortex-A8 и Cortex-A9, а также на устройствах, основанных на iOS.


2. Поддержка Thumb-2

Была добавлена поддержка для генерации Thumb-2 кода для ARMv7-M так же, как это реализовано в семействе Cortex-M3.

На данный момент эта архитектура поддерживается только для встроенных (embedded) систем, она еще не работает ни для Linux ни для iOS.


(продолжение следует. Есть еще немало изменений на уровне использования - usage changes - с описаниями, как было, как стало и почему внесено изменение. Чуть позже опишу их тоже подробно)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 5.01.2012 0:50
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Продолжаем smile.gif

Все системы

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

1. Ключевое слово static теперь разрешено использовать по умолчанию во всех режимах совместимости (Показать/Скрыть)

2. Переключатель режимов POINTERARITHMETICS заменен на директиву POINTERMATH (Показать/Скрыть)

3. Компилятор больше не ищет утилиты в текущей папке. (Показать/Скрыть)



Изменения в языке

1. Передача производных классов через var- и out- параметры (Показать/Скрыть)

2. Параметры array of const и подпрограммы cdecl (Показать/Скрыть)

3. Строковые константы длиннее 256 символов (Показать/Скрыть)

4. Типизированные константы (String/AnsiString), содержащие WideChar-ы/UnicodeChar-ы (Показать/Скрыть)

5. Неявная переменная Result в режиме MacPas (Показать/Скрыть)

6. Тип результата оператора Addr() (Показать/Скрыть)

7. Недоступные символы и свойства (Показать/Скрыть)

8. <ordinal> запрещено в <set type> (Показать/Скрыть)

9. Поддержка хелперов для записи и класса (Показать/Скрыть)

10. Анонимный вызов Inherited (Показать/Скрыть)

11. Получение адреса поля в свойстве-записи. (Показать/Скрыть)

12. Синтаксис Generic-ов в режиме Delphi (Показать/Скрыть)



Изменения в реализации

1. Порядок параметров в RTTI (Показать/Скрыть)

2. Размер множеств в режиме TP/Delphi (Показать/Скрыть)

3. Константы в смешанных (знаковых/беззнаковых) 64-битных выражениях (Показать/Скрыть)

4. Переполнение/Проверка границ для вещественных констант (Показать/Скрыть)

5. Новый элемент перечисления TTypeKind (Показать/Скрыть)

6. Выравнивание (padding) типов Object/Class (Показать/Скрыть)

7. Декорирование имен переменных, типизированных констант, и внутренних символов. (Показать/Скрыть)

8. Использование ResourceString для инициализации типизированных строковых констант. (Показать/Скрыть)



Изменения в модулях

1. SysUtils.GetAppConfigDir() теперь использует VendorName (Показать/Скрыть)

2. IniFiles.WriteString() больше не удаляет пустые строки (Показать/Скрыть)

3. IniFilesDeleteKey() больше не удаляет пустые секции (Показать/Скрыть)

4. Модуль и утилиты xmlrpc удалены (Показать/Скрыть)

5. Определения IInterface.QueryInterface, ._AddRef и ._Release изменились. (Показать/Скрыть)

6. Переменная thread_count удалена из модуля system (win32, win64, wince, symbian, nativent) (Показать/Скрыть)

7. Глобальные переменные для локали объявлены устаревшими. (Показать/Скрыть)

8. Изменено логгирование CustApp (Показать/Скрыть)

9. Свойство fpweb T(Custom)FPWebModule.Template (Показать/Скрыть)

10. Изменения в модуле HTTP (Apache) (Показать/Скрыть)

11. fcl-image теперь использует другое сжатие по умолчанию при записи PNG-файлов (Показать/Скрыть)

12. Некоторые поля дженериков в FGL были случайно установлены в Public/Protected (Показать/Скрыть)

13. Файл regexpr.pp переименован в oldregexpr.pp (Показать/Скрыть)



Unix платформы

1. SysUtils.FileAge больше не работает для папок (Показать/Скрыть)



x86 платформы

1. Размер операции pushf/popf/pusha/popa во встроенном ассемблере (стиль Intel) (Показать/Скрыть)



x86-64 платформы

1. Передача параметров и возврат результата на x86-64 (за исключением Win64) (Показать/Скрыть)

2. Передача константных параметров под не-Win64 платформами (Показать/Скрыть)


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 5.01.2012 22:35
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> 15. Встроенный SAR (shift arithmetic right)

> В отличие от SHL/SHR, SAR реализован не как оператор, а как встроенная функция. Она имеет разные имена для разных целочисленных типов (SarInt64/SarLongint/SarSmallint) чтобы избежать проблем при присваивании результата функции в выражении.

А чё, слабо было просто сделать так, чтобы shr учитывал знаковость типа? Этот косяк ещё с ботланда тянется, пора бы и убрать.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 31.10.2024 18:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"