Здравствуйте, Serginio1, Вы писали:
S> В свое время можно было легко обмениваться виртуальными объектами между С++ и Delphi т.к. последовательность описания методов однообразно ложилась в VMT. В COM тоже самое.
AFAIK, в качестве COM-овских интерфейсов была взята уже готовая реализация VMT из MS C++. А Delphi изначально делалась с оглядкой на COM. Так что совместимость по формату VMT между Delphi и C++ — это заслуга именно COM
By the grace of God Almighty
And the pressures of a marketplace
The human race has civilized itself
It's a miracle
Здравствуйте, Serginio1, Вы писали:
А>>>>В действительности о Delphi, как таковой, можно забыть как о страшном сне. Borland ее развивать не будет. В более-менее серьезных проектах использовать Delphi, в виду убогости Object Pascal и, собственно, VCL, не рационально. Да и зачем, если есть .NET?.
AM>>>Могу допустить убогость VCL, но вопрос в чес убогость Object Pascal? kuj>>Delphi language? А сравните, например, с .NET-языками, C++, Java, OCaml... Благо, спецификации их доступны в Интернет. S> Delphi.Net language?
Да особо без разницы. .NET-языки обязаны отвечать определенным требованиям, поэтому существенных различий между ними нету. S> А если серьезно все проблемы в поверхностном знании этого могучего языка. Помню было сравнение языков в "Программисте" при этом много
Э-э, Delphi language могучий язык? Не смешите мои тапочки! S> ляпусов было допущено и Виртовские языки весьма неплохо смотрелись а победила там ADA.
Э-э, сколько лет назад это было? По каким критериям сравнивали? Для каких задачей? Хотите, чтоб я вас убедил, что есть класс задач, где оптимальным выбором станет не процедурный, а вполне себе функциональный OCaml, например? А ежели ограничиться сравнением C++/.NET семейство vs Delphi Language, то и тут должно быть все очевидно. Нет?
Здравствуйте, VladD2, Вы писали:
S>> И много ли используешь встроенную сериализацию???
VD>А она то каким боком тут? Я ее вообще стараюсь не использовать.
Гы гы, наивные, не используют они . Встроенная сериализация настолько широко используется внутри самого фреймворка, что обойтись без нее в мало-мальски крупных проектах практически невозможно.
Здравствуйте, Gregory_krovosos, Вы писали:
G_>>>А Дельфи замечательно переваривает большие проекты (скажем, сейчас у меня в проекте 118 юнитов из них 58 форм) — _никаких_ _тормозов_. Это замечательно. А>>По секрету скажу, что 58 форм и 118 юнитов — это *не*большой проект. Ну разве что средний размер одного юнита у тебя — 1MB
G_>Ну все относительно конечно Мой предыдущий большой дельфийский проект насчитывал более 100 форм. А каков Ваш наибольший проект? G_>Или это из серии "я видел людей которые видели людей которые видели Ленина"?
Чего, пиписьками меряемся? Легко . В янусе полтора мега плюсовых и шарповских исходников (при том что эти языки лаконичнее паскаля). При том он ни в коем разе не является большим проектом.
Здравствуйте, <Аноним>, Вы писали:
VD>>Без приведения типов и на С++ нельзя. А>В действительности можно, если сильно захотеть. Вопрос в профессиональном опыте, коего Вам, судя по всему, не хватает. Не обессудьте. VD>>Хотя конечно чем их меньше, тем лучше. Ну, да хорошо спроектированная программа на любом языка старается их не делать. Что же касается стабильности, то тут С++ на последнем месте, так как язык не карантируем типобезопастности в рантайме. Молейшая ошибка и память испорчена... А>Да-да, вопрос профессионального уровня.
Рекомендую ознакомится с правилами форумов и впредь больше их не нарушать.
Здравствуйте, AndrewVK, Вы писали:
AVK>Гы гы, наивные, не используют они . Встроенная сериализация настолько широко используется внутри самого фреймворка, что обойтись без нее в мало-мальски крупных проектах практически невозможно.
Ну, укажи мне на использование стандартной сериализации в том же R#-е. Проект вроде не маленький.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Чего, пиписьками меряемся? Легко . В янусе полтора мега плюсовых и шарповских исходников (при том что эти языки лаконичнее паскаля). При том он ни в коем разе не является большим проектом.
Ну, уже не маленький. Правда плюсовых там кил 150, не более.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Ну, укажи мне на использование стандартной сериализации в том же R#-е. Проект вроде не маленький.
Ну на самом деле не такой уж большой, но пожалуйста. Помнится ты там хотел сборки в отдельный домен грузить, так общение между доменами, оно того, через BinaryFormatter.
Здравствуйте, VladD2, Вы писали:
AVK>>Чего, пиписьками меряемся? Легко . В янусе полтора мега плюсовых и шарповских исходников (при том что эти языки лаконичнее паскаля). При том он ни в коем разе не является большим проектом.
VD>Ну, уже не маленький.
Да чего там большого? Чистого времени не более половины человекогода.
VD> Правда плюсовых там кил 150, не более.
VD>В общем, фигню какую-то говоришь. Единая иерархия никакого отношения к поддержке комонентности н имеет.
Самое прямое. Если в C++ класс ничем не отличается от структуры и лкгко можно дать ссылку объект как в куче так и в стеке.
Кроме того при выделении памяти под объект используется свой манагер памяти (В Net и Яве GC но тоже единый МП).
Кстати при освобождении памяти из выделенной через HeapAlloc в 10 раз медленне чем в МП Delphi.
Единая иерархия дает достаточно просто выделять память иницализироват (в том числе и поддерживаемые интерфейсы http://www.rsdn.ru/Forum/Message.aspx?mid=527260&only=1
) а так же и освобождение памяти.
Мктаклассы (или рефлексия просто метаклассы быстрее и типизированные а в Яве Clas.CreateInstance к рефлексии никакого отношения не имеет),
позволяют лего создавать объекты (constructor Create(AOwner: TComponent); virtual
регистрировать метаклассы
procedure RegisterClass(AClass: TPersistentClass);
begin
RegGroups.Lock;
try
while not RegGroups.Registered(AClass) do
begin
RegGroups.RegisterClass(AClass);
if AClass = TPersistent then Break;
AClass := TPersistentClass(AClass.ClassParent);
end;
finally
RegGroups.Unlock;
end;
end;
Получать метаклассы
[pascal]
function GetClass(const AClassName: string): TPersistentClass;
begin
RegGroups.Lock;
try
Result := RegGroups.GetClass(AClassName);
finally
RegGroups.Unlock;
end;
end;
[/pascal]
[pascal]
procedure CreateComponent;
var
ComponentClass: TComponentClass;
begin
try
ComponentClass := FindComponentClass(CompClass);
Result := nil;
if Assigned(FOnCreateComponent) then
FOnCreateComponent(Self, ComponentClass, Result);
if Result = nil then
begin
Result := TComponent(ComponentClass.NewInstance);
if ffInline in Flags then
begin
Include(Result.FComponentState, csLoading);
Include(Result.FComponentState, csInline);
end;
try
Result.Create(Owner);
except
Result := nil;
raise;
end;
end;
Include(Result.FComponentState, csLoading);
except
if not Recover(Result) then raise;
end;
end;
[/pascal]
и загружать персистентные данные и все это встроено в язык.
function InitInheritedComponent(Instance: TComponent; RootAncestor: TClass): Boolean;
function InitComponent(ClassType: TClass): Boolean;
begin
Result := False;
if (ClassType = TComponent) or (ClassType = RootAncestor) then Exit;
Result := InitComponent(ClassType.ClassParent);
Result := InternalReadComponentRes(ClassType.ClassName, FindResourceHInstance(
FindClassHInstance(ClassType)), Instance) or Result;
end;
var
LocalizeLoading: Boolean;
begin
GlobalNameSpace.BeginWrite; // hold lock across all ancestor loads (performance)try
LocalizeLoading := (Instance.ComponentState * [csInline, csLoading]) = [];
if LocalizeLoading then BeginGlobalLoading; // push new loadlist onto stacktry
Result := InitComponent(Instance.ClassType);
if LocalizeLoading then NotifyGlobalLoading; // call Loadedfinally
if LocalizeLoading then EndGlobalLoading; // pop loadlist off stackend;
finally
GlobalNameSpace.EndWrite;
end;
end;
function InitComponentRes(const ResName: string; Instance: TComponent): Boolean;
begin
Result := InternalReadComponentRes(ResName, FindResourceHInstance(
FindClassHInstance(Instance.ClassType)), Instance);
end;
function ReadComponentRes(const ResName: string; Instance: TComponent): TComponent;
var
HInstance: THandle;
begin
if Instance <> nil then
HInstance := FindResourceHInstance(FindClassHInstance(Instance.ClassType))
else HInstance := 0;
if InternalReadComponentRes(ResName, HInstance, Instance) then
Result := Instance else
raise EResNotFound.CreateFmt(SResNotFound, [ResName]);
end;
function ReadComponentResEx(HInstance: THandle; const ResName: string): TComponent;
var
Instance: TComponent;
begin
Instance := nil;
if InternalReadComponentRes(ResName, HInstance, Instance) then
Result := Instance else
raise EResNotFound.CreateFmt(SResNotFound, [ResName]);
end;
function ReadComponentResFile(const FileName: string; Instance: TComponent): TComponent;
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
Result := Stream.ReadComponentRes(Instance);
finally
Stream.Free;
end;
end;
Так в Delphi просто был сделан неиспользуемым packed Class , который мог был по сути аналогом класса в C++, как из нет в Net и Яве.
Единообразие упрощает проектирование среды и поддержки компанентности на уровне компилятора.
Конечно все это можно сделать и в С++ но ручками
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
kuj>Э-э, сколько лет назад это было? По каким критериям сравнивали? Для каких задачей? Хотите, чтоб я вас убедил, что есть класс задач, где оптимальным выбором станет не процедурный, а вполне себе функциональный OCaml, например? А ежели ограничиться сравнением C++/.NET семейство vs Delphi Language, то и тут должно быть все очевидно. Нет?
Ага наверное логичнее сравнивать Delphi/Net/Java vc C++. Так как у Net и у Delphi на много больше схожего и дельфисты в Net и Яве как рыбы в воде, чего не скажешь о сишниках.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, SilverCloud, Вы писали:
SC>Здравствуйте, Serginio1, Вы писали:
S>> В свое время можно было легко обмениваться виртуальными объектами между С++ и Delphi т.к. последовательность описания методов однообразно ложилась в VMT. В COM тоже самое.
SC>AFAIK, в качестве COM-овских интерфейсов была взята уже готовая реализация VMT из MS C++. А Delphi изначально делалась с оглядкой на COM. Так что совместимость по формату VMT между Delphi и C++ — это заслуга именно COM
Разговор не о том что первее, а о сущности интерфейсоа как классов, наследовании и принципам ООП.
А то что M$ устанавливает правила игры, в том числе и на Васике ничего удивительного.
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
VD>Без приведения типов и на С++ нельзя. Хотя конечно чем их меньше, тем лучше. Ну, да хорошо спроектированная программа на любом языка старается их не делать. Что же касается стабильности, то тут С++ на последнем месте, так как язык не карантируем типобезопастности в рантайме. Молейшая ошибка и память испорчена...
А зачем допускать ошибки?! Ошибки должны быть устранены в процессе отладки и тестирования. А по стабильности C++ как раз на первом месте. Хотя, настоящий художник может сделать кистью шедевр, а неуч только загадит холст...
Здравствуйте, AndrewVK, Вы писали:
AVK>Ну на самом деле не такой уж большой,
Да, уже приличный.
AVK> но пожалуйста. Помнится ты там хотел сборки в отдельный домен грузить, так общение между доменами, оно того, через BinaryFormatter.
Т.е. нет все же пока?
Думаю возможно множество проектов в которых не будет нужна стандартная сериализациия или ее там столько что она ни на что не влияет.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
AVK>> но пожалуйста. Помнится ты там хотел сборки в отдельный домен грузить, так общение между доменами, оно того, через BinaryFormatter.
VD>Т.е. нет все же пока?
Ну так и проект пока что далек от завершения.
VD>Думаю возможно множество проектов в которых не будет нужна стандартная сериализациия или ее там столько что она ни на что не влияет.
Может и возможно, но пока что в реальности мне такого проекта приличных размеров не встречалось.
Здравствуйте, Serginio1, Вы писали:
S> Ага наверное логичнее сравнивать Delphi/Net/Java vc C++. Так как у Net и у Delphi на много больше схожего и дельфисты в Net и Яве как рыбы в воде,
Судя по вопросам в форуме что то не очень заметно.
P.S. — как человек, который хорошо знает первых три и довольно неплохо последний смею тебя заверить — Дельфи значительно ближе к С++ нежели к дотнету или джаве.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> Ага наверное логичнее сравнивать Delphi/Net/Java vc C++. Так как у Net и у Delphi на много больше схожего и дельфисты в Net и Яве как рыбы в воде,
AVK>Судя по вопросам в форуме что то не очень заметно.
AVK>P.S. — как человек, который хорошо знает первых три и довольно неплохо последний смею тебя заверить — Дельфи значительно ближе к С++ нежели к дотнету или джаве.
Смотрим Delphi.Net совместимость с нативной версией 95%. Какой язык еще может позволить такой безболзненный переход ?????
Сколько мучаются с С++ ????
... << RSDN@Home 1.1.0 stable >>
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
kuj>>Э-э, сколько лет назад это было? По каким критериям сравнивали? Для каких задачей? Хотите, чтоб я вас убедил, что есть класс задач, где оптимальным выбором станет не процедурный, а вполне себе функциональный OCaml, например? А ежели ограничиться сравнением C++/.NET семейство vs Delphi Language, то и тут должно быть все очевидно. Нет? S> Ага наверное логичнее сравнивать Delphi/Net/Java vc C++. Так как у Net и у Delphi на много больше схожего
Схожего не так уж и много. Коллекции, атрибуты, пространства имен, делегаты, множественное интерфейсное наследование, перегрузка операторов, автоматическое управление памятью, сама по себе компонентная модель и многое другое в .NET пришли отнюдь не из Delphi... S>и дельфисты в Net и Яве как рыбы в воде, чего не скажешь о сишниках.
Я вот никогда не был "дельфистом", однако, в .NET без проблем ориентируюсь. Дельфисту все же сложнее будет, т.к. ему не известны такие понятия как, например, пространство имен (C++), построение "цепочек" делегатов (C++, мультиметод), атрибуты (C++, атрибутивный COM в ATL)...
kuj>Я вот никогда не был "дельфистом", однако, в .NET без проблем ориентируюсь. Дельфисту все же сложнее будет, т.к. ему не известны такие понятия как, например, пространство имен (C++), построение "цепочек" делегатов (C++, мультиметод), атрибуты (C++, атрибутивный COM в ATL)...
И что с этого. ИМХО, в этом не так сложно разобраться если потребуется.