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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему все любят С++? 
:(
    Опции темы
kolesnle
Дата 11.4.2013, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 22.3.2013

Репутация: нет
Всего: нет



Цитата(k0rvin @  11.4.2013,  05:42 Найти цитируемый пост)
Повтори-ка на Паскале, поржем.

Да, да ! Давайте поржем все дружно !
PM MAIL   Вверх
Beltar
Дата 11.4.2013, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

Ты понимаешь, что в С++ теперь можно константно инициализировать практически что угодно? 


И как же я без этого жил-то...



Не вижу ни одного сообщения компилятора относящегося к выражению.
Что и неудивительно, т. к. какие там у Free Pascal'я глюки я не знаю, а вот в Delphi

Код

  TFPGMap<T,R>=class(TObject)
    F1:T;
    Next:R;
    procedure Add(V:R);
  end;

  TMyDictionary = class (TFPGMap<String, TMyDictionary>)
  end;

procedure TFPGMap<T, R>.Add(V: R);
begin
Next:=V;
end;

procedure TForm1.FormCreate(Sender: TObject);
var Root,Last:TMyDictionary;
    i:Integer;
begin
Root:=TMyDictionary.Create;
Root.F1:='0';
Last:=Root;
for i:=1 to 10 do
  begin
  Last.Add(TMyDictionary.Create);
  Last.Next.F1:=IntToStr(i);
  Last:=Last.Next;
  end;
Last:=Root;
repeat
label1.Caption:=Label1.Caption+Last.F1+' ';
Last:=Last.Next;
until Last=nil;
end;


Нормально компилируется. Минут 5 вдумчивого топтания батонов и вот вам набросок связного списка (Болт на утечки), по крайней мере, именно такая идея для такого шаблона первой пришла в голову. smile


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Beltar
Дата 11.4.2013, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

The following are the key differences between C# Generics and C++ templates:


Мы вроде не о решетке говорим.

По поводу функций, как констант, понимаешь в чем проблема, можно представить себе использование констант вида a+b и задавать этим, например, размер массива, или что-то в этом духе, но нет никакого смысла подсчитывать на этапе компиляции сверхсложное выражение, на худой конец, посчитай один раз при инициализации программы, да конечно, это лишняя работа в рун-тайм, вот только размер этой лишней работы рассыпается в пыль. Т. е. добавляется фича, которая нужна раз в 100 лет (хотя можно было бы и в Паскале без изменения синтаксиса вообще прикрутить использование стандартных функций для инициализации констант, но никто бы этого не заметил), и прибавки от нее на копейку, при этом сделать те же нормальные строки от которых пользы на миллион, или вменяемую модульность хотя бы на уровне паскалевских юнитов, вместо убогого механизма инклюдов, который, кстати, в Паскале тоже есть, но применяется весьма ограниченно, все никак не соберутся.

Так куда идет C++? В сторону наращивания фич для over 9000 частных случаев.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
kolesnle
Дата 11.4.2013, 08:48 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 22.3.2013

Репутация: нет
Всего: нет



Цитата(Beltar @  11.4.2013,  08:36 Найти цитируемый пост)
В сторону наращивания фич для over 9000 частных случаев.

Добавили только позарез нужное. Не думаю, что в дальнейшем будут что-то добавлять из ключевых слов/синтаксиса. Только библиотеку будут совершенствовать.

Цитата(Beltar @  11.4.2013,  08:36 Найти цитируемый пост)
паскалевских юнитов

Чем тебя не устраивают инклюды? Они лучше паскалевских юнитов
PM MAIL   Вверх
Akella
Дата 11.4.2013, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(k0rvin @ 10.4.2013,  17:53)
Цитата(Beltar @  10.4.2013,  12:39 Найти цитируемый пост)
В Паскале есть дженерики.

Во-первых, дженерики и шаблоны — разные вещи. Во-вторых, даже дженерики в паскале недоделаны (во всяком случае в делфи), один товарищ приводил пример, найду – выложу. В-третьих, зачем же так некропостить? =))

ну 4 года назад были недоделаны, да, когда их внедряли
ну теперь-то всё ок

Добавлено через 9 минут и 42 секунды
Цитата(k0rvin @  11.4.2013,  05:42 Найти цитируемый пост)
http://ideone.com/ct8xTq

В то время как в любом другом языке с дженериками это работает.



Там речь идёт о Pascal (fpc) (fpc 2.6.2)

это freePascal (Lazarus)


Кстати, на Lazarus можно писать кросплатформенные приложения.
Современный Delphi и Lazarus похожи, очень. Но есть всё равно различия.
И некоторые разработчики компонент выпускают версии и для Lazarus в том числе.
PM MAIL   Вверх
Akella
Дата 11.4.2013, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(k0rvin @  11.4.2013,  05:42 Найти цитируемый пост)
код C++
constexpr int fact (int x) { x < 2 ? 1 : return x * fact(x - 1); }
const fact10 = fact(10);



Что это за .... зачем оно такое? Delphi - это крисвый, изящный язык программирования. Легко читаемый. Даже если есть, то для чего такое, что оно даёт, какие приимущества?
PM MAIL   Вверх
Beltar
Дата 11.4.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

Чем тебя не устраивают инклюды? Они лучше паскалевских юнитов


Механизм инклюдов не предполагает никакого контроля видимости и повторного использования кроме набрасывания дефайнов. Про взаимную видимость, которая есть в Delphi, если модули прописывать в секции implamentation я уж молчу. Кроме того, юнит, это не просто кусок текста, это строго отформатированный элемент компиляции со списком экспорта. Или ты думаешь, что в Борланд такие дураки были, что ввели юниты в BP 4, когда инклюды, как самый примитивный способ реализации многофайловых исходников уже давно были? Кстати, как инклюдами предполагается разруливать ситуацию, когда в них есть одноименные идентификаторы? В юнитах коллизия разрешается явно, последний перечисленный юнит имеет приоритет, при обращении без спецификации юнита. А еще в юнитах есть такие интересные секции, как initialization и finalization, ну и четкое разделение, что на экспорт, а что внутреннее, т. е. юнит даже в обычном Паскале обеспечивал работу, похожую на ООП.

Цитата

Даже если есть, то для чего такое, что оно даёт, какие приимущества?


Возможность сэкономить одну микросекунду при запуске посчитав какую-то хрень при компиляции.  smile 


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
k0rvin
Дата 11.4.2013, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @  11.4.2013,  08:12 Найти цитируемый пост)
набросок связного списка (Болт на утечки), по крайней мере, именно такая идея для такого шаблона первой пришла в голову.

Вообще слова Map/Dictionary в названиях классов намекают на ассоциативные массивы. Ну да ладно, похоже пофиксили.

Цитата(Beltar @  11.4.2013,  08:36 Найти цитируемый пост)
Мы вроде не о решетке говорим.

Как будто делфийские дженерики сильно отличаются от шарповых.

Цитата(Akella @  11.4.2013,  10:02 Найти цитируемый пост)
Что это за .... зачем оно такое? Даже если есть, то для чего такое, что оно даёт, какие приимущества?

Уменьшение нагрузки на рантайм, при этом никакого изменения кода, кроме добавления constexpr не нужно. Собственно в том же ФП это называется "ссылочная прозрачность". В будущем было бы неплохо научить компилятор плюсов определять чистые функции автоматически и соответственно лучше оптимизировать код.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Akella
Дата 11.4.2013, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Нагрузка на рантайм в этом случае, мне кажется минимальна если будет написано по другому, без этого кода. Её вообще не будет, мне кажется.

Добавлено @ 13:11
В любом случае, компилятор Delphi при сборке аппликации способен упростить выражение до константы.
Но делать то, что умеет компилятор в ущерб читаемости, не камильфо.
PM MAIL   Вверх
k0rvin
Дата 11.4.2013, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Akella @  11.4.2013,  13:05 Найти цитируемый пост)
Но делать то, что умеет компилятор в ущерб читаемости, не камильфо.

Добавление слова constexpr перед определением функции -- это ущерб читабельности? o_O'


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Akella
Дата 11.4.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



я в общем про тот код
PM MAIL   Вверх
k0rvin
Дата 11.4.2013, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Akella @  11.4.2013,  14:52 Найти цитируемый пост)
я в общем про тот код 

Он не имеет отношения к обсуждаемой фиче. Вот то же самое на паскале:
Код

constexpr function Fact(x : Integer) : Integer;
begin
  if x < 2 then Fact := 1 else Fact := x * Fact(x - 1);
end;

const Fact10 = Fact(10);



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Beltar
Дата 11.4.2013, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

Вообще слова Map/Dictionary в названиях классов намекают на ассоциативные массивы.


Я не знаю на что намекают названия классов, а вот структура данных, которая содержит ссылку на объект своего собственнного типа намекает как раз на связный список.  Для ассоциативных массивов (оказывается такая очевида штука, как массив из структур с полем идентификатором даже название крутое имеет. smile ) в Delphi есть заготовки вида TDictionary<string, string>.

Цитата

Как будто делфийские дженерики сильно отличаются от шарповых.


Кстааати,

C# does not support explicit specialization; that is, a custom implementation of a template for a specific type.

В твоем примере, который в FPC не компилировался, как раз и создается класс наследник под 2 заданных типа. Если это не custom implementation of a template for a specific type, то что это?
procedure Proc<T>(A: T); overload;
procedure Proc(A: String); overload;

Это что? Если вспомнить об утиной типизации, то вполне плавает, крякает и от утки не отличимо.

Собственно хелп Delphi по этому поводу так и говорит:

Цитата

Generics in Delphi are unlike templates in C++ or generic types in C#. Most notably, a type parameter cannot be constrained to a specific simple type, such as Integer, Double, String, and so forth. In cases where different types need to be expressed (including simple types), consider using overloaded functions for each needed type or use a record type such as TValue from the System.Rtti unit, which offers operators and methods for storing and querying these data types.


И в общем-то правильно, нефиг вводить всякую фигню, когда в языке уже давно есть способ решения проблемы типа перегрузка функций и RTTI.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Akella
Дата 11.4.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Цитата(k0rvin @ 11.4.2013,  15:05)
Цитата(Akella @  11.4.2013,  14:52 Найти цитируемый пост)
я в общем про тот код 

Он не имеет отношения к обсуждаемой фиче. Вот то же самое на паскале:
Код

constexpr function Fact(x : Integer) : Integer;
begin
  if x < 2 then Fact := 1 else Fact := x * Fact(x - 1);
end;

const Fact10 = Fact(10);

так это другое дело  smile 
PM MAIL   Вверх
k0rvin
Дата 11.4.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Beltar @  11.4.2013,  15:37 Найти цитируемый пост)
структура данных, которая содержит ссылку на объект своего собственнного типа намекает как раз на связный список.

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

Цитата(Beltar @  11.4.2013,  15:37 Найти цитируемый пост)
RTTI

О, да ты любитель рантайм-кастов, значит.


Цитата(Akella @  11.4.2013,  15:49 Найти цитируемый пост)
так это другое дело

Это одно и то же.


Цитата(Beltar @  11.4.2013,  15:37 Найти цитируемый пост)
procedure Proc<T>(A: T); overload;
procedure Proc(A: String); overload;

[DCC Error] Unit1.pas(22): E2530 Type parameters not allowed on global procedure or function


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.2262 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.