![]() |
|
Модераторы: LSD Страницы: (144) « Первая ... 86 87 [88] 89 90 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]()
|
|
| Athari |
|
||||||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.6.2007 Где: Казань, Россия Репутация: 1 Всего: 1 |
@Zloxa
Да. Сравни:
или вообще
с общей формой
или частной
Если переменных несколько, то всё вообще весело:
в самом простом случае превращается в
а в общем случае это вообще
Как можно заметить, посреди служебного кода сложно найти суть метода. Синтаксический сахар -- это то, что отличает шарп от той же джавы: там, где в джаве "минимализм", со всех сторон обставленный костылями из обязательных к использованию паттернов, в шарпе будет лаконичный код в две строчки. Впрочем, даже в закостенелую джаву аналог using добавили. Примечания. 1. Зачем проверка на null? В using можно использовать любой метод, а не только конструктор, и этот метод имет право возвращать null. Например, переменная bar в примере выше может быть внутри блока using равна null, если создана через фабричный метод, потому что используется как аргумент. 2. Зачем каст к IDisposable? Интерфейс IDisposable может быть реализован явно (explicit implementation). Практикуется редко и вообще не рекомендуется, но встречается. 3. Зачем две переменных оборачивать в разные try? Только такая запись гарантирует правильное освобождение ресурсов. |
||||||||||||||||
|
|||||||||||||||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 1 Всего: 329 |
Динамическая типизация в delphi делается не через Variant. http://ru.wikipedia.org/wiki/%D0%94%D0%B8%...%86%D0%B8%D1%8F
|
||||
|
|||||
| diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 4 Всего: 142 |
Тут все дело в том, что в шарпе до появления динамических типов не поддерживалось позднее связывание, поэтому у некоторых сложилось впечатление, что это чуть ли не главное преимущество динамических типов. В бейсике позднее связывание для типа Object поддерживалось всегда, это было реализовано на уровне компилятора и для введения такой фичи никакие динамические типы не нужны. На самом деле это не главное. Динамические типы могут быть разными, сам фреймворк поставляет класс с динамическим поведением, под названием ExpandoObject. Такому объекту, например, можно налету добавить отсутствующее свойство, просто присвоив этому свойству значение и далее можно будет к этому свойству обращаться так же, как любому другому. Но и это еще не все. Самое интересное то, что можно создавать собственные динамические объекты и определять их динамическое поведение. В таких объектах можно обращаться к несуществующим свойствам, вызывать несуществующие методы и т. д., при этом как будет реагировать на это объект можно определить, переопределив методы доступа к членам. Покажу простой пример.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||
|
|||||||
| Athari |
|
||||||||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.6.2007 Где: Казань, Россия Репутация: 1 Всего: 1 |
@Beltar
Да что у тебя за детский максимализм... Причин не одна, а куча. Да, наличие консолей -- это тоже причина. На иксбоксе, кстати, дотнет вполне себе живёт.
Да кому они к чертям нужны? Тем фанатикам, которые меряют, у кого 101 FPS, а у кого 102? Ты только задумайся: двойные видеокарты. Это не ускорение железа, это выбивание производительности грубой силой. Платя в два раза больше, ты будешь иметь прирост 40% в лучшем случае. Это совсем не аналог обычного "топового" железа десятилетней давности -- цена совсем другая. Цену GeForce 690 посмотри -- это цена стандартного хорошего компа.
Здесь согласен. Но всё-таки многие вещи реализуются на границе возможностей железа, и если бы был хороший запас -- можно было бы не убиваться плюсами, а писать хоть на питоне.
Ну ты как бы сравни результаты того, что производится сейчас, и того, что производилось тогда. Масштабы выросли. Технологии другие.
У каждого языка есть фанатики, готовые писать на любимом языке в ущерб всему остальному. Их наличие не доказывает пригодности выбранных ими средств для общих масс.
Это показатель того, что результат стоит того, чтобы за него платить.
Твои личные знакомые -- это настолько репрезентативная выборка, что просто офигеть. Зайди на любой программистский сайт без специализации на конкретном языке -- дельфи там если и будет, то на отшибе.
Зачем -- взаимодействие с языками с динамической типизацией. http://en.wikipedia.org/wiki/Comparison_of...namic_languages Вон, в дельфи LLVM появляется, а там много языков поддерживается. Упрётся ведь в это.
Ты очень интересно разделил плюсы и дельфи -- при том, что по безопасности они примерно в одной весовой категории (арифметика указателей, ручное управление памятью). С преимуществами плюсов всё понятно (RAII, умные указатели и т.п.), хоть ты в них и не веришь. Из преимуществ дельфи в безопасности ты пока смог назвать только то, что ты можешь забыть написать * и вместо передачи по указателю передашь по значению. Аргумент, что работа с Foo и Foo* имеет различный синтаксис, ты проигнорировал, то есть аргумент можно считать нивелированным. Что дальше? Где достоинства дельфи по части запретов на простреливание ноги? Это сообщение отредактировал(а) Athari - 3.5.2013, 16:36 |
||||||||||||||||||
|
|||||||||||||||||||
| Zloxa |
|
|||
|
Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 4 Всего: 161 |
Я сначала подумывал было о том, что уменьшается количество вложенных блоков..... Но потом подумал что IRL, как правило, между созданием нескольких объектов таки производятся некоторые действия над первым соданым объектом, когда два объекта создаются последовательно - скорее вырожденный частный случай. Дядьвова, вы же знаете как я уважаю гибкость? И даже LSD, а вы знаете как я уважаю LSD, сказал про гибкость, что это хорошо. Но вам, как родному скажу: Бендер - осел, жалкая и ничтожная личность Ты уже не раз слышал мои пассажи о необходимости гибкости в велосипедостроении... впрочем тут дело совсем не в гибкости самой по себе. Когда гибкость дейсвтительно нужна, с ней и ее последствиями, таки приходится мириться. Но что ты отвечаешь на свой же вопрос "зачем это нужно". Ты отвечаешь "можно". Это немного абсурдно. Если следовать этому паттерну, Злохе вменят в обязанность чистить унитазы в офисе, только лишь потому что он может это делать. -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 14 Всего: 459 |
Тебя не поймешь, то куча это плохо, потому что медленно, сейчас говоришь, что хотя и медленно, но нифига не критично. Если не критично, значит оправданно, что делфи объекты хранить в куче. На самом деле есть целый слой приложений, которые включают в себя работу с Базами данных или же ведут другую активную работу со строками. Помниться я в свое время делал разбор XML файлов на железке, так вот оптимизация оператора new на самодельный стек дала ускорение в несколько раз. Наверное не все знают, что формы в делфи сериализуются в текстовой форме. Процесс создание формы происходит не так как в QT при помощи сгенерированного кода, а путем разбора XML-подобного текстового файла. На сегодняшний день прикладные программы часто обмениваются по сети некоторой объектной информацией и по большей части это текстовая форма в том или ином виде. И это не говоря о всякого рода отчетах, логах и т.д. Не зря же изобрели GC . Если б все было так хорошо, то не потребовалась бы такая оптимизация. Сборщик мусора не только упрощает работу с памятью, но и оптимизирует процесс выделения и освобождения памяти. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 4 Всего: 142 |
Все-таки попытайся рассмотреть мой пост в контексте той цитаты, ответом на которую он был. Акелла пытался показать, что в дельфах все это есть, на что я ему устроил простую демонстрацию того, что он неправильно понял, что такое динамические типы. Если говорить более широко, то динамические типы появились вместе с платформой DLR и их главное назначение - это поддержка взаимодействия с динамическими языками, работающими под управлением этой платформы. Что привносят эти типы в поддерживающие их языки - вопрос отдельный. Что касается моего примера, то о возможностях динамических типов можно написать очень много с подробными примерами и прочей лабудой, естественно в рамках отдельного поста я привел очень короткий и очень простой пример, в дальнейших комментариях просто обрисовал перспективы, вырисовывающиеся из этого примера. Пример с универсальным прокси-классом, по-моему весьма убедителен, да и из того, что я изобразил можно увидеть, что легко обобщается возможность создание флюент-интерфейса и этим все есно не ограничивается. Из твоего же комментария я понял, что ты рассматриваешь мой пример, как нечто исчерпывающее. Ну не знаю, если бы даже я написал ну очень много букаф, то не уверен, что ты стал бы это читать. Тогда вопрос в том, как до тебя что-то донести? -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Athari |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.6.2007 Где: Казань, Россия Репутация: 1 Всего: 1 |
@Alexeis
Мои тезисы размазаны по всему топику ровным слоем. Собираю в одном месте: 1. Работа с памятью критична для очень малого числа приложений. Обычно на неё уходит не больше 5%. 2. Работа с кучей медленнее, чем со стеком, если создание и копирование объектов дешёвое. 3. Скорость работы new/delete и GC сопоставима по скорости. GC сам по себе медленнее, но выравнивается за счёт особенностей (асинхронность, дефрагментация и прочие). 4. Дельфи не имеет выделения в стеке, поэтому, когда работа с памятью критична, оптимизировать сложнее. 5. Дельфи не имеет RAII, умных указателей и прочих фич для ручного управления памятью, поэтому оное сложнее, чем в плюсах. 6. Дельфи не имеет сборки мусора, поэтому автоматическое управление памятью сложнее, чем в дотнете. В целом допускаю, что: 1. Дельфи имеет более оптимизированный менеджер памяти для работы с кучей. (Хотя было бы интересно увидеть реальные числа.) 2. Дельфовые ссылки синтаксически приятнее, чем указатели в плюсах (меньше символов), и мощнее, чем ссылки в плюсах (неконстантны). В шарпе ссылки такие же. (Белтар, пишу не для тебя. Не надо по новому кругу.)
Если не изменяет память, в бинарниках всё-таки бинарные данные. Что формы в тексте хранятся -- это скорее из-за VCS, diff и прочих инструментов, которые обычно ориентированы на текст. @Zloxa @diadiavova
Зачем абстрактные примеры? Вот: https://github.com/markrendle/Simple.Data -- ORM с нулём вспомогательного кода. Все "классы" возникают прямо из БД. Магия dynamic в чистом виде. |
||||||||
|
|||||||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 1 Всего: 329 |
в XE4 уже есть и сборщик мусора, и подсчет ссылок
http://www.gunsmoker.ru/2013/05/modern-delphi.html - статья по изменениям в Delphi (архитектура, строки, ARC, кросс-платформа, устаревающие конструкции), основана на White Paper от Марко Канту. |
|||
|
||||
| Alexeis |
|
||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 14 Всего: 459 |
Что ты понимаешь под не имеет выделения в стеке? Массив или строку вполне можно создать в стеке. И даже массив записей. Если очень заморачиватся можно переопределить виртуальную статическую функцию класса выделяющую память и выделять память в своем стеке(но это уже из разряда сложных оптимизаций).
Это С++ не имеет умных указателей. Они реализуются классами, а делфи как раз имеет 3 встроенных типа умных указателей. Нет автоматического вызова деструкторов для объектов это да.
Это доступно только в версии Delphi.NET и Delphi Prism. Тут просто 2 варианта. Или иметь возможность работать с памятью при нативной компиляции или вкусняжки дотнета в полном объеме. В любом случае даже если в ресурсах они пожимаются бинарно для экономии памяти, то потом все равно разворачиваются в текст, иначе не будет работать RTTI . Если сильно нужно, могу покапать, находил функции для конвертации между представлениями. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
| Athari |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.6.2007 Где: Казань, Россия Репутация: 1 Всего: 1 |
@Akella
Офигеть. Нормальная статья по новой дельфи. Я уж начал сомневаться, что такие существуют.
Интересный пунктик...
Белтар, у строк в дельфи до сих пор преимущество над строками в плюсах?
Вкратце: ссылки считаются для строк, вариантов, динамических массивов и интерфейсов. В список добавляются объекты, если используется новый компилятор под ARM. Но им никто не пользуется, так как на дельфи под iOS писать невозможно (как только выходишь за рамки hello world -- начинается северный пушной зверёк). То есть можно считать, что счётчика ссылок для объектов нет. Возможно, будет позже, когда LLVM перетащат на остальные платформы. Да и реализация ARC далека от идеала: циклические ссылки не разруливаются. Для избавления от этой проблемы предлагается костыль в виде повсеместного использования атрибута weak (хотя что это атрибут, а не отдельный тип -- это хорошо, синтаксически не так ужасно). И меня сильно смущает, что счётчик используется всегда, то есть нет выбора -- по сути, такой же насильственный прикол, как и с IUnknown во всех интерфейсах. Засорение всего кода ифдефами вида "{$IFDEF AUTOREFCOUNT}", как предлагается в статье -- это вообще печаль, то есть рассчитывать, что все ринутся писать кросс-платформенный код было бы верхом наивности. Ждать надо. Пока слишком рано говорить о нормальной реализации сборки мусора. |
||||||||
|
|||||||||
| Athari |
|
||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 27.6.2007 Где: Казань, Россия Репутация: 1 Всего: 1 |
@Alexeis
Выделение экземпляров классов.
По-моему, ты что-то путаешь. Массив записей выделится одним куском, но в куче. Динамический -- точно. Вот запись создастся в стеке.
Этот стек не получится стеком, потому что надо будет убиться, чтобы гарантировать его "стековость" при вызове функций. Если есть реальные примеры -- я посмотрю, а пока это только теория.
Давай определимся: мы оцениваем реальные возможности языков, а не возможности максимально урезанных языков. В плюсах не встраивают фичи, которые можно вынести в стандартную библиотеку. И эта стандартная библиотека -- неотъемлемая часть языка. Дельфи более монолитна. Итак. В плюсах умные указатели есть. В дельфи умные указатели реализованы для интерфейсов и нескольких конкретных типов, для экземпляров обычных классов таковых не существует (ARM не в счёт).
Призма не имеет никакого отношения к дельфи. Там только язык, отдалённо напоминающий паскаль. Белтар уже пробовал на нём писать -- подтвердит, что различий даже на уровне синтаксиса чуть менее, чем дофига. Что такое Delphi.NET? А то по религиозным выкрикам Белтара я пришёл к выводу, что это неверная платформа, которая делает неверный код.
Функции для конвертации видел. Но у меня сильные сомнения, что они вызываются при чтении бинарных данных из ресурсов. Кто в здравом уме и трезвой памяти будет гонять картинки bin->hex->bin? |
||||||||||||
|
|||||||||||||
| Alexeis |
|
||||||||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 14 Всего: 459 |
Полный аналог Си
Специально, чтобы знать сколько места выделять есть еще такая функция class function InstanceSize: Longint; inline; А вот и реальный пример переопределения
Если нужен стек, то делаешь тоже самое в начале функции где хочешь использовать вызываешь функцию типа MyStack.PushStackPtr; В конце функции обязательно что-то типа MyStack.PopStackPtr; для того чтобы вернуть указатель стека обратно. Но это скорее особый случай, когда очень нужно. Скорее техническая возможность чем реальная фича. Ну в STL это сравнительно недавно появилось. У меня еще сохранился самописный код Shared_Ptr, который я выискивал на просторах инета. Я до сих пор пишу на VS2005 . Там такого нет. Мы же не рассматриваем в качестве возможностей С++ классы написанные сторонними разработчиками.
Это язык на платформе .NET2.0 Имел максимальную совместимость с Delphi for Win32.
Ща полезу покапаю. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||||||||
|
|||||||||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 14 Всего: 459 |
Да, по крайней мере в версии XE2 хотя и есть все эти функции, но они вероятно вызываются всякого рода редакторами, не формой. Форма работает с бинарным форматом, хотя там равно в этом формате название всех полей и их типы хранятся строково, для загрузки через RTTI. Бинарно только значения хранятся.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Beltar |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 2 Всего: 7 |
Универсальный прокси-класс это конечно здорово, но чем-то это все начинает напоминать COM.
Обычно означает, что вся кухня просто вынесена куда-то на другой уровень. 2 Alexeis: Можешь, как самый технически подкованный объяснить подробнее? Вот нам надо как-то размещать объекты не обязательно в куче, просто в памяти. Проблемы 3: сделать побыстрее и может происходить фрагментация памяти, их надо как-то удалять. Как именно GC может помочь по каждому из этих пунктов, а то пока неясно, не для того же чтобы delete не писать его придумали. У Атари это плохо получается. Добавлено через 11 минут и 1 секунду
А все, отныне именуем ее "кислород" ибо от Delphi там ничего нет, чисто Паскаль для .NET.
Разумеется нет, нельзя иметь преимущества над тем, чего нет, не считать же классыстрок полноценной заменой.
Это VCL реализованная на .NET Паскале, абсурдность такого в свете существования WinForms думаю объяснять не надо. Не удивительно, что она быстро издохла, попутно показав, что никаких причин дельфину переходить на .NET не имеется. Не путать с Delphi Prism.
Насколько я понимаю сишники должны аналогичную операцию переопределения new и delete делать влегкую от рождения. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
||||||||||
|
|||||||||||
![]()
|
| Правила ведения Религиозных войн | |
|
|
1. Уважайте собеседника 2. Собеседник != враг 3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez" С уважением, Smartov. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Религиозные войны | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |