Delphi vs C++
, Часть 1
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.58] |
|
|
Правила раздела:
| Страницы: (117) « Первая ... 107 108 [109] 110 111 ... 116 117 ( Перейти к последнему сообщению ) |
Delphi vs C++
, Часть 1
|
Сообщ.
#1621
,
|
|
|
|
Цитата C#, Pascal, Delphi, VB, PHP, Java, ... продолжать? Ты уже показал, как ты знаешь Delphi (раздельная компиляция юнитов - такой же основной принцип, как и строгая типизация), так что если с другими языками ситуация схожа - то лучше не надо Я тоже знаю карате, джиу-джицу, самбо, таеквандо и много других страшных слов PS: Кстати, где ты в словах Ромкина нашел переходы на личности или провокацию на них других участников? Я пока увидел это лишь в словах г-на trainer, по поводу пророков |
|
Сообщ.
#1622
,
|
|
|
|
Поправил из-за сбоя, чтобы не двоилось
Цитата Flex Ferrum @ у меня получается сделать следующий вывод: 1. Delphi не поддерживает неявную идентификацию интерфейсов в среде выполнения (т. е. ее RTTI не так хорош, как его тут малюют) 2. (как следствие) Delphi использует в качестве RTTI для интерфейсов явно указываемые UUID'ы и возлагает обязанность по их созданию на программиста, что (на мой взгляд) несколько странно. 3. (как следствие) Delphi имеет определенные завязки на COM, т. к. ни в каком другом языке (из тех, с которыми я работал) нет специальных языковых конструкций, используемых для навешивания на интерфейсы UUID'ов (в С++ этого вообще нет, в C# для этого используются метаатрибуты классов, но там метаатрибутика используется много для чего еще, в Java - и быть не может, т. к. изначально формировалась в другой среде). 4. Либо говорящий не совсем понимает, о чем вообще ведется речь, и откуда у чего ноги растут. По порядку: 1 - 2. RTTI для интерфейсов в Delphi просто не употребим. Да, употребляется именно UUID. И по следующим причинам: RTTI не работает через границу dll и процесса. Требуется bpl, а это чистая зависимость от языка. RTTI также работает для классов, а интерфейс - абстракция, и может быть реализован где угодно и как угодно. На это, собственно, и расчет. Как бы класс ни реализовал интерфейс - интерфейс будет опознан. На мой взгляд, все вполне логично: в результате в Delphi я не обязан реализовывать декларируемый интерфейс непосредственно в классе, там обеспечена двоичная композиция (кажется, это так называется), когда интерфейс реализуется вообще сторонним коклассом, присоединяемым в двоичном коде. Замечу, что да, изначально интерфейсы были созданы для поддержки СОМ. Но это было в прошлом веке. Сейчас, по крайней мере теоретически, данный механизм независим от платформы. И можно говорить, что интерфейсы в Delphi имеют поведение как в СОМ, но имеются ли завязки - я не уверен. По крайней мере, интерфейс, который я привел выше, обязан работать и на Linux, где я о COM не слышал. К сожалению, Kylix не стоит, проверить не могу. Но я уверен, что задумка была именно такая. Именно поэтому был введен IInterface, который, как заявлено, в win32 соответствует IUnknown, 3. Я бы сказал, "интерфейсы работают как в СОМ", привязка не обязательна. 4. А вот это вполне возможно |
|
Сообщ.
#1623
,
|
|
|
|
Цитата И тут, их величество интерфейсы ни с того ни с чего умеют подсчитывать ссылки(это на уровне языка/language core). А их величество строки не умеют? А варианты? А динамические массивы?Цитата Чтобы качественно программировать на Дельфи нужно знать не меньше подводных камней. По крайней мере, не нужно знать, что строки необходимо заканчивать нулевым символом Тоже не назовешь "прозрачным" поведением, не так ли? |
|
Сообщ.
#1624
,
|
|
|
|
Цитата --Ins-- @ Ты уже показал, как ты знаешь Delphi Ладно, ладно, молчу, но, лучше бы ты повнимательней присмотрелся к контексту моих "страшных слов"... Цитата Romkin @ Чем отличается то, что сказал ты, от того, что сказал я? Ты процитировал какую-то мудрую книгу по COM, где было сказано, что интерфейс - это не абстрактный класс .Цитата Romkin @ 1 - 2. RTTI для интерфейсов в Delphi просто не употребим. Я конечно ничего в Delphi не понимаю, как верно заметил --Ins--, но мне казалось, что в Delphi можно написать someRef as ISomeInterface и получить что нужно без указания каких-либо UUID'ов. Разве нет? |
|
Сообщ.
#1625
,
|
|
|
|
Цитата Господа Дельфисты, признайте уже, что Delphi - это Windows-only язык/компилятор и т.д., а программирование на Kylix столь же широко распространёно, сколько сайтостроение на С++. То, что он не получил распространение - это не аргумент. Аргумент - это само существование этого компилятора. Если можно было создать - значит язык кроссплатформенный. И ты не все учитываешь, есть еще .NET и Free Pascal |
|
Сообщ.
#1626
,
|
|
|
|
Цитата --Ins-- @ А их величество строки не умеют? А варианты? А динамические массивы?Ну да. 1. Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible .2. Варианты - а чего их подсчитывать то? AFAICS, это обыкновенные структурки размером байт эдак в 10-20, которые располагаются совсем не в куче.3. Динамические массивы - ну да, ещё один костыль в языке для которого есть специальные ф-ции hi/lo, специальные правила MM и пр. BTW, IIRC эти самые массивы совместимы с OLE'шными - то бишь очередная рюшечка .UPD: итого, у вас reference-counted только те сущности, которые нужны для OLE/COM. Добавлено Цитата --Ins-- @ По крайней мере, не нужно знать, что строки необходимо заканчивать нулевым символом Тоже не назовешь "прозрачным" поведением, не так ли?Какие-такие строки? Я ничего никаким нулевым символом не заканчиваю . |
|
Сообщ.
#1627
,
|
|
|
|
Я уже говорил, что это нужно для распознания нужного интерфейса. Флекс верно заметил, можно было бы сделать на основе RTTI, но эта штука может меняться даже в разных версиях компилятора, так что не катит.
Цитата archimed7592 @ Если уж на то пошло, то в Си вообще нет понятия символов, есть лишь понятие char, который можно рассматривать как символ, но не более. Вот именно эта концепция и не позволяет удобно работать со строками. Извини, что повторяюсь, но, каким местом ты сюда строки приплёл? Я про символы говорил... Цитата archimed7592 @ В Дельфях синтаксис более строгий, так что компилятор зарубит на корню любые попытки "прострелить себе ногу" Чтобы качественно программировать на Дельфи нужно знать не меньше подводных камней. Цитата archimed7592 @ Не смешно. Если взять тот же Си, то могу напомнить тебе, что строки с завершающим нулем появились под вполне определенную архитектуру, где была удобная аппаратная поддержка вот это я и называю рющечками: взята конкретная платформа(win32), конкретная технология(COM) и добавлена рющечка в язык Так что не надо про рюшечки, их в любом языке хватает.Цитата archimed7592 @ Ну вот, приехали. Это каким же образом связаны базовый объект ООП и типы данных? Или ты не знаешь, что Дельфи позволяет обходиться без ООП? К TObject можно привести только его наследников, но никак не втсроенные типы аля integer, double, boolean, string А раз так, то зачем привязывать типы к ООП? Добавлено Цитата archimed7592 @ Архимед, скорее наоборот 1. Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible . Дельфийские строки являются прямым наследником Паскалевских, а OLE появилось позже Так что это микрософт передрал идею, сделав свою технологию Дельфи-совместимой |
|
Сообщ.
#1628
,
|
|
|
|
Цитата --Ins-- @ И ты не все учитываешь, есть еще .NET и Free Pascal ![]() Free Pascal - бедняги, пытаются по неоднозначной спецификации(используя старый и проверенный метод проб и ошибок) состряпать компилятор, который будет более-менее соответствовать современной редакции Delphi. А Borland плевать, что кто-то что-то там пытается - они будут менять язык и поведение как им заблагорассудиться и не будут "проталкивать новый стандарт". .NET - то же мне кроссплатформенность. Я не удивлюсь, если уже есть brainfuck4dotNET. Чтобы сделать .NET компилятор нужно: 1) добавить все возможности, требуемые CLS и 2) специфицировать существующие возможности языка в терминах CLR. |
|
Сообщ.
#1629
,
|
|
|
|
Цитата archimed7592 @ Я конечно ничего в Delphi не понимаю, как верно заметил --Ins--, но мне казалось, что в Delphi можно написать someRef as ISomeInterface и получить что нужно без указания каких-либо UUID'ов. Разве нет? Если SomeRef - класс, то можно. Если интерфейс - то при наличии IID, поскольку переход в общем случае может быть нетривиальным, и упор идет на реализацию этих интерфейсов непосредственно в коклассе. Добавлено Цитата Flex Ferrum @ Ну, если посмотреть в сторону C#, то там интерфейс реализован вообще хитро. Реализация методов интерфейса ищется не только в том классе, который явно описан, как реализующий интерфейс, и наследниках этого класса, но также и в предках этого класса (по сигнатуре метода интерфейса). Вот это - реализация интерфейса, как языковой конструкции. Упс. И в наследниках?! Вот этого точно нет. Это как? Потомок же не создан, он что, создается? А в предках - ищется, куда денешься-то? |
|
Сообщ.
#1630
,
|
|
|
|
Цитата 1. Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible Ты не поверишь, но работа со строками в Delphi - куда более логична и прозрачна, чем в C/C++. Программист работает с некой абстрактной сущностью и его совсем не интересуют аспекты ее реализации. Компилятор все берет на себя. Кстати, Цитата ...скорее наоборот Дельфийские строки являются прямым наследником Паскалевских, а OLE появилось позже Так что это микрософт передрал идею, сделав свою технологию Дельфи-совместимой в этой цитате очень большая доля правды. Почитай более старую литературу, там строки, длина которых не определяется нулевым символом, а записана непосредственно рядом со строкой, называются "Pascal-строками" И очень многие подхватили эту идею и перенесли ее к себе. Так как, например, для операции конкатеции строк не нужно пробегать по всем строкам, определяя положение нулевого символа, и вычисления размера буфера для новой строки. Теперь эти длины можно просто взять из метаданных и сложить. |
|
Сообщ.
#1631
,
|
|
|
|
Цитата Romkin @ Брр. Чем отличается то, что сказал ты, от того, что сказал я? Я с самого начала утверждал, что интерфейс - абстракция, и нельзя говорить, как именно он обязан реализоваться. При этом ты активно критикуешь реализацию описания интерфейса посредством абстрактного класса. Цитата --Ins-- @ 1 - 2. RTTI для интерфейсов в Delphi просто не употребим. Да, употребляется именно UUID. И по следующим причинам: RTTI не работает через границу dll и процесса. Требуется bpl, а это чистая зависимость от языка. RTTI также работает для классов, а интерфейс - абстракция, и может быть реализован где угодно и как угодно. На это, собственно, и расчет. Как бы класс ни реализовал интерфейс - интерфейс будет опознан. На мой взгляд, все вполне логично: в результате в Delphi я не обязан реализовывать декларируемый интерфейс непосредственно в классе, там обеспечена двоичная композиция (кажется, это так называется), когда интерфейс реализуется вообще сторонним коклассом, присоединяемым в двоичном коде. Замечу, что да, изначально интерфейсы были созданы для поддержки СОМ. Но это было в прошлом веке. Сейчас, по крайней мере теоретически, данный механизм независим от платформы. И можно говорить, что интерфейсы в Delphi имеют поведение как в СОМ, но имеются ли завязки - я не уверен. По крайней мере, интерфейс, который я привел выше, обязан работать и на Linux, где я о COM не слышал. К сожалению, Kylix не стоит, проверить не могу. Но я уверен, что задумка была именно такая. Именно поэтому был введен IInterface, который, как заявлено, в win32 соответствует IUnknown, Почему-то С++ не границы dll не мешают. Я вполне могу (в случае, если я пользуюсь одним компилятором) делать dynamic_cast'ы, "нарушающие" границы dll-ек, и это будет прекрасно работать. И по простой причине - компилятор с RTTI отвечают за то, чтобы такие касты проходили корректно. Интерфейс - это, конечно, абстракция. Но ровно до того момента, пока не получает конкретного воплощения для своего описания. В С++ - это абстрактные классы. В Delphi - это сущности под заголовком interface. Т. е. когда интерфейс приобретает вид вполне конкретной синтаксической и семантической конструкции, он перестает быть абстракцией. Вот в том же С++ я действительно могу использовать "чисто абстрактные" интерфейсы - когда программирую с помощью шаблонов (т. е. занимаюсь метапрограммированием). Там я интерфейс явно нигде не описываю, предполагая, что типы, которыми я типизирую конкретный шаблон, содержат реализации нужных мне методов. Вот это - интерфейсы как абстракция. Тут никакого RTTI и в помине быть не может. Правда, все остается на уровне компилятора. А когда ты в коде описываешь нечто под заголовком interface, этому нечто вполне можно присвоить некий RTTI-идентификатор. Автоматически, а значит навешивать явным образом UUID - это уже от лукавого (что и демонстрирует -Ins-). И кроссплатформенность тут приплетать ни к чему. Уж кому-кому, но не С++-сникам рассказывать про кроссплатформенность. Об этом можно будет поговорить, когда ты сможешь написать программу, которая откомпилируется двумя-тремя различными компиляторами под две-три разных программно-аппаратных архитектуры. Вот тогда будем говорить про кроссплатформенность, переносимость и про проблемы, которые тогда возникают. А пока большинство приведенных тобою аргументов выглядят несколько, гм, притянутыми за уши, т. к. я еще в предыдущем посте сказал, что есть две решаемые проблемы - когда мы не покидаем границ языка и платформы, и когда нам нужно связать код, написанный на разных языках и разными компиляторами, и все приведенные тобою аргументы относятся ко второму случаю, который (при разработке) возникает далеко не часто. |
|
Сообщ.
#1632
,
|
|
|
|
Цитата AndNot @ Если уж на то пошло, то в Си вообще нет понятия символов, есть лишь понятие char, который можно рассматривать как символ, но не более. Вот именно эта концепция и не позволяет удобно работать со строками. Где неудобство? Я сколько работаю - одни удобства. На примере можно? Цитата AndNot @ Это не аргумент В Дельфях синтаксис более строгий, так что компилятор зарубит на корню любые попытки "прострелить себе ногу" . Волков бояццо - в лес не ходить .Цитата AndNot @ Не смешно. Если взять тот же Си, то могу напомнить тебе, что строки с завершающим нулем появились под вполне определенную архитектуру, где была удобная аппаратная поддержка Так что не надо про рюшечки, их в любом языке хватает.Если честно, ты не напомнил мне(ибо я этого не знал ), но, так или иначе, это было в каком году? И в каком году появились UUID'ы в Delphi? Я бы понял, если бы эта рюшечка пришла в Дельфи из Паскаля, но, с высоты сегодняшнего дня UIID'ы в языке смотрятся как-то глупо. Я же не ропчу на Delphi за их object ... end, который похож на class ... end - ну да, досталось в наследство, ничего не поделаешь.Цитата AndNot @ Ну вот, приехали. Это каким же образом связаны базовый объект ООП и типы данных? Или ты не знаешь, что Дельфи позволяет обходиться без ООП? А раз так, то зачем привязывать типы к ООП? Ах, вот оно какое тут rational .Цитата Romkin @ Если интерфейс - то при наличии IID, поскольку переход в общем случае может быть нетривиальным, и упор идет на реализацию этих интерфейсов непосредственно в коклассе. Мдя... А коклассы - это случаем не OLE/COM-приблуда? |
|
Сообщ.
#1633
,
|
|
|
|
Цитата archimed7592 @ Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible Собственно, так же, как и массивы И кто тебе сказал, что они OLE-совместимы? Скорее совместимы с ASCIIZ (PChar). Скажешь, тоже рюшечки?И динамические массивы тоже не путай с вариантными. По-твоему, Delphi полностью OLE-совместимым каким-то получается ))Цитата archimed7592 @ UPD: итого, у вас reference-counted только те сущности, которые нужны для OLE/COM. Да уж. Вывод на пустом месте. И где в COM определена структура ansistring? Собственно да, WideString соответствует по структуре BSTR. Насколько - не знаю. Но трудно придумать что-то другое: структура простая, так почему бы не взять то, что уже есть и не изобретать велосипед? А динамический массив - это не safe array! Все, что ты сказал - уж прости, не соответствует действительности и основано на слухах. |
|
Сообщ.
#1634
,
|
|
|
|
Цитата --Ins-- @ Программист работает с некой абстрактной сущностью и его совсем не интересуют аспекты ее реализации. Да я тоже работаю с некой абстрактной сущностью и меня не интересуют аспекты её реализации. Только, в отличии от Delphi-программистов я могу выбрать реализацию от STLport, стандартную, реализацию от Qt, из ICU и т.д. Цитата --Ins-- @ очень многие подхватили эту идею и перенесли ее к себе. Так как, например, для операции конкатеции строк не нужно пробегать по всем строкам, определяя положение нулевого символа, и вычисления размера буфера для новой строки. Теперь эти длины можно просто взять из метаданных и сложить. ![]() У, блин, да сто лет в обед, как в С++ не используются NTBS. Да, они там есть, точно так же, как и есть object ... end в Delphi, но наличие не обязует к использованию. |
|
Сообщ.
#1635
,
|
|
|
|
Цитата archimed7592 @ А коклассы - это случаем не OLE/COM-приблуда? Я называю коклассом класс, реализующий данный интерфейс. Извини, попутал тебя. |