Шаблоны (Templates) = Generic

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение debi12345 » 02.06.2006 16:04:15

Речь вообще идет о генерации кода. Компилятор С++ пишет сам Интел (да и АМД вроде тоже). Правда ссылки на более-менее реальные тесты так никто и не дал, но разница процентов в 10-20 должна быть.

Ну так прозводители процов заморачиваются новейшими фичами этих процов - странно, если бы это было по другому. Писали бы они паскаль-компиляторы - тогда бы и сравнили...

Причем тут линкер ? Просто типы и код нужно писать так, чтобы смартлинку была возможность себя проявить.

В Дельфи размер того же кода в полтора раза меньше. Это лучшее, чего удается добиться от FPC. Какой нафиг он смарт если он такой тупой?

Вы сами эспериментировали со смартлинком, что такое говорите ?
FPC-программы также сильно увеличиваются от использования WideString и Variant(150k), и это увеличение не может быть существенно уменьшено смартлинком - потому что эти модули грузят in-memory диспетчеры функций, сответственно - на момент линковки все эти функции оказываются нужны "на всякий случай".
И вообще - для смартилинка нет ничего хуже, чем использование "<type> = procedure/function" или "function1 = function2", и как раз этот механизм интенсивно используется в Лазарусе для переключения между GUI-тулкитами ( хоть команда и принимает некоторые меры).

Result:=,

Вот это язык не особо красит. Я бы заменил на Return().

Не скажите... Все таки под Result сразу выделяется память, и по ходу функции делаешь с ним что хочешь, а когда готово - "exit" .


-Fcutf8

А это чего?

Компиляция исходников, созданных в локали UTF-8. Удобно - не то слово. Можно использовать русские текстовые константы прямо в исходниках. И будет это одинаково читаться ( и печататься на принтере, ... ) и в Линуксе(koi8), и в Вынь32(cp1251).
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Replicator » 02.06.2006 18:18:01

Компилятор С++ пишет сам Интел (да и АМД вроде тоже).

Ага, он вообще всего один и его все пишут :lol:

Компилятор от Intel - icc, действительно, называют самым эффективным. Но во-первых, он стоит около $500 (или больше, уже не помню). Во-вторых, им мало кто пользуется - в основном g++ или, для win32, VC++. А популярный g++ практически не дает преимуществ. Да и компоновщик он использует тот же, что и fpc.
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение mr.denton » 02.06.2006 22:24:33

debi12345 писал(а):А еще очень бы хотелось позаимствовать из С механизм "L-value", это когда работают конструкции типа

"if ( (a+=2) > 3 ) {..}".

А то в Паскале приходится где-то запоминать промежуточный результат "(a+= 2)" .

а так чем хуже?
Код: Выделить всё
a:=a+2;
if ( (a+2) > 3 ) then begin..end;

А вообще вроде fpc должен такое позволять...
Аватара пользователя
mr.denton
новенький
 
Сообщения: 23
Зарегистрирован: 30.04.2006 03:23:07

Сообщение debi12345 » 03.06.2006 08:10:26

Код: Выделить всё
a:=a+2;
if ( (a+2) > 3 ) then begin..end;

А вообще вроде fpc должен такое позволять...

Вся фишка в присвоении значения с одновременным доступом к этому же значению в том же выражении - чтобы не писать "a:=a+2" .
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение alexs » 03.06.2006 09:50:25

Цитата:
Result:=,


Вот это язык не особо красит. Я бы заменил на Return().

Нефиг
а конструкцию чего-там:=Result+1
чем менять?
всёж на одну переменную меньше объявлять
и вобще - замашки си..та надо давить в душе - не давать им вырватся наружу
а вобще это уже по моему офф-топ
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Mirage » 04.06.2006 17:51:04

Ну из Оберона result выкинут, а его автора трудно обвинить в си...зме.:)
По сути своей result - и есть неявная переменная. Заведя переменную Result явно добьетесь аналогичного эффекта., не забыв ее в return указать.
А вообще да, оффтопик.;)
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Сообщение Replicator » 04.06.2006 20:04:50

Не судьба написать функцию типа:
Код: Выделить всё
function ad(var x: integer; inc_: integer = 1): integer;
begin
  Result := x + inc_;
  x := x + inc_;
end;

Сделать ее inline и использовать в циклах и т.п. Можно сделать такуюже для возвращения уже измененного значения.
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение pda » 05.06.2006 04:48:11

debi12345 писал(а):Вся фишка в присвоении значения с одновременным доступом к этому же значению в том же выражении - чтобы не писать "a:=a+2" .

Фу... Долой! ;-) Имхо, не стоит. Оно, конечно, понятно, зачем это всё, но не надо. По каким правилам прикажете тогда короткие логические вычисления делать? ;-)
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение debi12345 » 05.06.2006 16:10:37

Mirage писал(а):Ну из Оберона result выкинут, а его автора трудно обвинить в си...зме.:)
По сути своей result - и есть неявная переменная. Заведя переменную Result явно добьетесь аналогичного эффекта., не забыв ее в return указать.
А вообще да, оффтопик.;)


Не так все просто... если "return <var>" связана с указателями (string и т.д. ) - то по выходу из функции можете получить AccessViolation, потому что локальная <var> разрушается по выходу из функции.

Да, тем Result и хороша, что избавляет от дебильной возни с предварительным заказом памяти под строки.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение Replicator » 05.06.2006 16:40:01

Ну напишите функцию return(var x), которая будет делать Result := x :lol:

Зачем превращать Pascal в C?! Это разные языки. Не нравятся конструкции паскаля - С ждет-недождется. Уж там-то можно такое вытворять, отчего волосы дыбом встают. В С++ уже поняли и ушли от всякой фигни, а в Яве и подавно. А вы хотите добавить в язык совершенно ненужные ему придатки - зачем?
Replicator
постоялец
 
Сообщения: 154
Зарегистрирован: 30.04.2006 17:14:45
Откуда: Outer Heaven

Сообщение Sergei I. Gorelkin » 05.06.2006 18:51:46

В FPC уже давным-давно для желающих существует Exit(x)...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение SovNarKom » 06.01.2007 23:58:25

На момент написания сообщения стало возможным использовать дженерики, но синтаксис всё-таки выбрали ужасный... да и глюки при наследовании имеются...
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение GrayEddy » 07.01.2007 12:09:56

Что и требовалось доказать... :cry:
Команда FPC = команде Lazarus'а? Все таки первая команда пошустрее будет по исправлению глюков, IMHO.
Можно привести примерчик этого "ужастика" с дженериками?
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Сообщение SovNarKom » 08.01.2007 12:01:22

Вот такая вот петрушка. тестик написал...

Код: Выделить всё

{ TDE_GEN_OneWayList }

generic TDE_GEN_OneWayList<GItemType> = class
protected
type
  pTListItem = ^TListItem;
  TListItem = record
   pNext: pTListItem;
   Data: GItemType;
  end;
var
  FpHead: pTListItem;
  FpLast: pTListItem;
  FWasError: Boolean;
  procedure RaiseError(const AErrorCode: Cardinal; const pErrorData: Pointer);
public
  pErrorProc: TDE_ErrorProc;
  procedure AddListItem(const AItemData: GItemType); inline;
  procedure AddListItemAsHead(const AItemData: GItemType); inline;
  procedure AddItemAfterId(const AID: Cardinal; const AItemData: GItemType); inline;
  procedure AddItemAfterData(const ABaseItemData: GItemType; const AItemData: GItemType); inline;
  procedure AddItemAfter(const ApItem: pTListItem; const AItemData: GItemType); inline;
 
  procedure GetListItemById(AID: Cardinal; out ApItem: pTListItem); inline;
  procedure GetListItemDataById(AID: Cardinal; out AItemData: GItemType); inline;
  procedure GetListItemIdByData(const AItemData: GItemType; out AID: Cardinal); inline;
  procedure GetListItemByData(const AItemData: GItemType; out ApItem: pTListItem); inline;
  procedure GetListItemId(const ApItem: pTListItem; out AID: Cardinal); inline;
 
  procedure DeleteListItem(const ApItem: pTListItem); inline;
  procedure DeleteListItemHead; inline;
  procedure DeleteListItemById(const AID: Cardinal); inline;
  procedure DeleteListItemByData(const AItemData: GItemType); inline;
 
  procedure ClearError; inline;
  procedure Clear; inline;
  constructor Create;
  destructor Destroy; override;
end;               
SovNarKom
постоялец
 
Сообщения: 389
Зарегистрирован: 28.05.2005 10:37:39
Откуда: Воронеж [vrn] [36]

Сообщение *vmr » 08.01.2007 21:56:22

GrayEddy писал(а):Зря все это приколотили. Это означает излишнее усложнение компилятора, который ничем не будет отличаться в скором от С++.

Не, скорость нисколько не убавится. Си++ тормознутый не из-за шаблонов, а из-за тупого разбиения на хидеры/код (*.срр).
GrayEddy писал(а):За все надо надо платить. Как правило, компиляторы Паскаля однопроходные. Оптимизация кода отстутствует (в VP и старом добром TP), в Delphi и FP с этим получше.

Опять наслушались "умных дядь"-сипипишников. Да однопроходные, но второй проход им и не нужен (в сипипи без него ну никак).
Кстати посмотрел исходники SVN-версии(2.1.1), там идет пост-оптимизация ассемблерного кода. Чем не второй проход?

Добавил: не обратил внимания что уже 3 страницы написали :))
Аватара пользователя
*vmr
постоялец
 
Сообщения: 168
Зарегистрирован: 08.01.2007 01:46:07
Откуда: Киев

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru