Weaver — первые впечатления
Wednesday, 26 August 2009 19:58Предисловие, или отвлечённые размышления про Embarcadero и Microsoft
У ребят изНа самом деле я сейчас произнёс не более чем длинную скептическую тираду =) Потому что всё это перечисление не имеет никакого смысла, пока я не уточню, что же ИМЕННО выбрали в качестве "крупных нововведений" в этом году коджировцы. И вот тогда уже можно о чём-то говорить. Самое интересное вот в чём: релиз RAD Studio выходит раз в год, релиз Visual Studio вместе с новым .NET Framework — раз года в три. Каждый релиз последней, соответственно, приносит нам примерно в 3 раза больше фич, чем типичный релиз первой. Иногда и того меньше (фичи C# 4, к примеру, по сравнению с C# 3 тянут как раз на годик работы коджировцев). Но вот в чём загвоздка: эти фичи доработаны. То есть ты смотришь на них, читаешь один-два поста в блогах MSDN и сразу думаешь: "Ага, отлично, вот это я могу приткнуть сюда, а вон то так и просится вон в тот мой класс месячной давности". И все рады и довольны. Коджировцы же, в свою очередь, работают несколько иначе. После того, как Хейлсберг, гениальный представитель стыка тысячелетий, ушёл в MS, последние версии Delphi исповедуют принцип "А теперь возьмём вон ту фичу C#, сделанного нашим же идеологом с учётом прошлых граблей, и реализуем её в нативном Делфи, как он и хотел бы". Но поскольку они не Хейлсберг, то фича реализовывается... ммм... не до конца. Их можно понять, у них меньше людей, времени ровно год, а не три, бюджет поджимает... но всё-таки каждый август я, читая delphifeeds, восклицаю "Wow!", а через некоторое время, немножко покодив на свежем релизе, чешу затылок и думаю "Твою мать..."
Хотите конкретики? OK, поясняю, что я имею в виду. Возьмём в качестве примера 2009 год и дженерики. Ясное дело, дженерики — это был гигантский прорыв в Делфи, их многие годы ждали, без них было дико неудобно программировать кучу специфических вещей, с этим никто и не спорит. Но вот что интересно... дженерики-то ввели, а обеспечить их должную поддержку на требуемом уровне так и не получилось (не успели?). К примеру, в IDE простейший рефакторинг "Rename" при попытке подсунуть ему обобщённый тип начинал заикаться и материть разработчика непечатными словами. IDE считала ошибками безобиднейшие конструкции DeCAL2009, из-за чего я практически не мог пользоваться рефакторингом во время кодинга на Делфи: ну не жует она код, в котором есть "красные подчеркивания"! Хотя все конструкции корректны, и компилятор спокойно обрабатывал весь код без единого варнинга даже. Дальше, если у нас уже есть модуль Generics.Collections с обобщёнными классами и интерфейсами, то почему бы не переделать на него VCL? Почему-то до сих пор банальнейший TListView своё свойство Items представляет как специфический класс TListItems, а не просто а-ля TList<TListIem>, хотя функционал у них идентичен. Обратная совместимость — это замечательно, но в итоге библиотека хромает на обе ноги. В конце концов, чтобы решить проблемы обратной совместимости, можно вспомнить, как в незапамятные времена добрые люди придумали интерфейсы.
К чему я веду, собственно... Любая новая возможность в C# появляется интегрированной: типичные сценарии её использования продуманы и встроены в FCL, IDE ведёт себя так, словно фича была здесь всегда, и дополнительно предлагается кучка новых классов/структур/интерфейсов/методов старых классов, которые удобно используют эти новые возможности. Delphi же исторически предназначен для сторонних разработчиков, традиция писать под него сотни новых компонентов и библиотек не переведётся, пока существует на свете сам Delphi. Поэтому любая новая возможность Делфи вводится в компилятор, обеспечивается простейшей базовой поддержкой, документируется с парой примеров — и гуляйте, ребята, пишите монструозные библиотеки с её юзаньем, улучшайте программистам жизнь, мы своё дело сделали.
И это удручает.
Языковые возможности
Декларативное программирование, в отличие от императивного, не так плотно вошло в нашу жизнь. На самом деле миллионы человек ежедневно пользуются его плодами, бродя по HTML-страничкам (да-да, несмотря на то, что HTML — язык разметки документа, его также смело можно назвать и попросту декларативным ЯП). Но вот активное использование этой концепции в других областях, кроме Веб-разметки, скриптинга и пр., а также с более продвинутыми возможностями, встречалось очень редко. До тех пор, пока команда разработчиков .NET не предложила всем атрибуты.Простая ведь штука, на самом-то деле. Просто определённый вид пометки любой сущности с возможностью конкретизации этой пометки несколькими параметрами. Самое интересное в том, что сам атрибут по факту ничего не делает: для того, чтобы воспользоваться его возможностями, нужно написать где-нибудь код, который в run-time берет информацию о требуемом объекте, проверяет наличие у него некоторого атрибута, и в случае его присутствия уже делает своё чёрное дело, чего, собственно, и хотел человек, навесивший на объект этот атрибут. Часто это не слишком-то удобно на самом деле, но уж как есть. С помощью атрибутов отлично реализуется парадигма АОП (аспектно-ориентированного программирования), что, собственно, и сделали ребята из RemObjects, родив для Delphi Prism замечательный фреймворк под названием Cirrus. А когда у тебя есть АОП-фреймворк — у тебя есть краткий и не морозящий мозги способ реализовать логирование, многопоточность, запись сущностей в БД, контрактное программирование и кучу прочих прелестей, которые иначе вылились бы в гору лишних мусолящих взгляд строчек в твоем исходнике. Шикарно, на самом-то деле. Главное, чтобы такой фреймворк кто-нибудь написал — или продемонстрировал общие принципы его создания.
Вот тут и кроется проблема, затронутая мною в предисловии. Да, в Делфи теперь есть шарповские атрибуты, они аналогичным образом наследуются от TCustomAttribute, имеют всё тот же интуитивный синтаксис и подчиняются тем же законам использования. Вот только в среде они обозначены лишь четырьмя страничками справки. Я не нашёл в VCL и RTL ни одного сделанного руками коджировцев атрибута. Ни тебе Serializable, ни Log, ни Obsolete. Возможно, атрибуты были использованы, чтобы дать нам свежие возможности RTTI, не знаю; в справочной системе об этом нет ни слова, в модуле Rtti мною не было найдено ни одного атрибута. В общем и целом, пока какая-то добрая душа не реализует полный фреймворк, аналогичный Cirrus`у, использовать атрибуты бесполезно. Потому что любой мой собственный исходник будет в итоге велосипедом.
Хочется большего и прямо сейчас — идём на delphifeeds, читаем один практический пример. Нет, лучше еще один.
Да, кстати. Атрибуты не полностью скопированы с C#. В справочной системе я, к примеру, не нашёл способа, как применить атрибут к возвращаемому значению функции. То, для чего в Шарпе предназначены атрибутные префиксы, а-ля [return: MinimumInteger(10)]. Про подобные префиксы устранения неоднозначности в Делфи (а их же тьма-тьмущая: assembly, return, type, method, param...) в справке не сказано ни слова.
Теперь про RTTI. Здесь у меня нет ни единой претензии. Подобной универсальной системы ждали все, и ждали довольного долго, и теперь работа с RTTI в Делфи ничем не уступает дотнетовскому или джавовскому отражению. Просто скопирую сюда код из статьи, совмещающий демонстрацию использования RTTI и атрибутов:
LContext: TRttiContext;
LType: TRttiType;
LAttr: TCustomAttribute;
begin
{ Create a new Rtti context }
LContext := TRttiContext.Create
{ Extract type information for TSomeType type }
LType := LContext.GetType(TypeInfo(TSomeType));
{ Search for the custom attribute and do some custom processing }
for LAttr in LType.GetAttributes() do
if LAttr is TSpecialAttribute then
WriteLn(TSpecialAttribute(LAttr).FValue);
{ Destroy the context }
LContext.Free;
end;
Вот модулем Rtti я теперь с удовольствием буду пользоваться на каждом шагу. И всем рекомендую.
Чтобы кастомизировать процесс создания метаинформации для RTTI, можно использовать новые директивы {$RTTI} и {$WEAKLINKRTTI}. Они дают всю необходимую гибкость.
Дальше идёт директива delayed. Степень полезности — средняя, но применение найти можно. Короче говоря, это отложенный вызов функции из библиотеки. Если вы собираетесь экспортировать функцию из дллки, в которой по какой-то причине этой функции может и не быть (проблемы версий), пишете delayed, а в рантайме уже проверяете, какую реализацию использовать: библиотечную, точно зная, что при данных условиях вызов функции не навернется, или собственную. Таким образом был реализован механизм естественного ввода (жестов и тачей) в VCL Weaver`а: на Windows 7 используем системные функции, а на предыдущих ОС — собственный движок. Исходник из delphifeeds:
function CloseTouchInputHandle; external user32 name 'CloseTouchInputHandle' delayed;
function CloseWindow; external user32 name 'CloseWindow';
...
if OSVersion = WINDOWS_7 then
CloseTouchInputHandle
else
MyInternalSimplerClose;
Главная польза, наверное — отсутствие пяти строк дополнительного кода везде, где раньше с этой целью использовали динамическую загрузку DLL.
Последняя фича действительно очень и очень востребована — это кастинг интерфейсов обратно в объект, на который он ссылается. Если вы создали экземпляр некоторого объекта, реализующего некоторый интерфейс, а потом присвоили ссылку на этот объект переменной интерфейсного типа, вы можете воспользоваться старыми добрыми операторами as и is, чтобы привести эту переменную обратно к объектному типу. Да что там, даже старый паскалевский небезопасный кастинг (с использованием имени типа) здесь сработает. Все правила остаются в силе — если запрошенный класс не реализует данный интерфейс, as выбросит исключение, is вернёт false, а небезопасный кастинг просто присвоит итоговой переменной nil. Всё просто.
Работает такой кастинг только для дельфийских объектов. COM`у — нет =) Почему — читайте здесь
Продолжение следует...
Следующую часть рассказа, описывающую новенькие красоты VCL, RTL и IDE, я сегодня уже не смогу рассказать вам, любезные читатели. Оставайтесь на нашей волне денек-другой, и все будет, обещаю. Потому что впечатление от этих возможностей у меня сейчас на порядок выше, чем от тех же атрибутов.Свои впечатления, наверное, выскажу подробно и обстоятельно (как всегда) после некоторого опыта работы с триалом. Ждите.
( правонарушителям )
Хроники Августа
Sunday, 23 August 2009 19:27Через неделю выходит на свет божий RAD Studio 2010. Я не знаю, буду ли я делать её полный обзор, как год назад, но если буду — то как минимум после того как загружу, установлю на свою машину и опробую все своими руками. А также почитаю справку.
По крайней мере, если судить по delphifeeds.com, то количество удобных возможностей опять впечатляет и опять дает робкую надежду на долгую и безоблачную жизнь прекрасному языку программирования.
Как минимум у нас есть RTTI уровня дотнетовского отражения, атрибуты, кастинг интерфейсов в объекты, улучшенная во много раз IDE, дебаг-визуалиаторы, поддержка естественного ввода (тачей и жестов) в VCL, Firebird, SOAP 1.2, JSON и множество разных мелочей.
Наша дружная квиповская команда совместными усилиями родила долгожданную статью на Хабрахабр: QIP: точки над "i". Целью было наконец-то объяснить всем негодующим, что творится за кулисами Инфиума, ситуацию, сложившуюся вокруг проекта, развенчать несколько оригинальных мифов и помочь тем, кто проект ненавидит. Знаете, получилось. Мы собрали такой холивар и собрание вопросов в комментариях, какой встречается на ресурсе не так уж часто. И, судя по всему, все-таки обратили мнение о программе к лучшему не у одного человека. Приятно это, когда правду можно говорить открыто, и эта правда помогает любимому проекту...
На очереди, наверное, мануал по плагонаписанию. Я давно думал что-нибудь подобное вкратце рассказать для населения.
Вообще я продолжаю увлекаться Хабрахабром. Да, конечно, Хабр уже не торт, но он продолжает оставаться:
- ценнейшим ресурсом IT-новостей
- отличным сборником пользовательского мнения
- хорошей коллекцией познавательных статей по программированию
- неплохим местом для заведения полезных и хороших знакомых
Так что будем продолжать писать. Это полезно, где бы то ни было.
Вот, к примеру, именно с Хабра я узнал о Киевском Coffee'n'Code. Думал пойти еще на первый, но его темы в итоге скатились в полный Веб и обсуждение вебдевовских фреймворков, к которым я не имею никакого отношения. Зато вот второй, судя по всему, очень даже заинтересует. Главное — чтобы никакая гадость (вроде вуза) не перебила поездку.
Работаю над PluginUpdater`ом. Сказать, что он сырой — не сказать ничего. Он икает, дергается, иногда выставляет претензии, многое не умеет, часть умеет, но не так, как надо, а часть вообще умеет, а все желают, чтобы не умел =) Короче говоря, это совершенно не то состояние, в котором должен находиться софт подобного уровня. Поэтому я работаю судорожно, август заканчивается, а по опыту знаю: как только начнется вузовский семестр, моё свободное время начнёт улетучиваться просто с поразительной скоростью. И пока оно еще есть, надо много сделать. Итогом этого "много" и форумских споров стало то, что сегодня мне совершенно не хочется ничем заниматься, хотя туду разросся до галактических масштабов. Вот, поэтому сижу, пишу в блог...
Кстати, о блоге. Потратил полчаса, прошел по нему до самого зарождения и залочил самые экстравагантные записи, сделанные в период юного и беззаботного детства. Всего маразматичных, личных и смешных постов оказалось штук 20, остальные ещё можно показывать людям :) Когда читал некоторые — ржал до безумия, но таких меньшинство, в основном это те, которые просто не соответствуют тематике блога. Знания изменились, кардинально. А вот взгляды, что интересно, с тех пор остались практически те же.
Исполнил древнее желание — купил комбинацию APC-шных стабилизатора и ИБП. Потому что за всё лето, по-моему, так ни разу и не выключал компьютер самостоятельно: постоянно это было по вечерам из-за перебоев в электричестве. Спасибо тебе, наше дорогое Киевэнерго.
Зато теперь я по крайней мере могу не бояться, что однажды в солнечный и приятный вечер у меня полетит к чертям собачьим дневная работа.
А вообще, бекапы — наше всё.
У меня сейчас есть аккаунт на самых популярных сайтах по инвайтам: Хабрахабр, Дару~Дар, Демоноид, 0дей, Новафильм. Хорошие друзья, хорошая репутация и хорошие места дислокации многое решают. Проблема только в том, что на некоторых из них я не могу похвастаться активностью: всё-таки Волевские тарифы дают о себе знать. Ну нет в моём районе достойных домашних сетей, нет. А есть всем ненавистные Воля, ОГО, Билайн и дорогущие беспроводники. Придется пока что так и сидеть. Тем более что волевцы хитрые, они бонусами заманивают, скоростью, акционными временными анлимами, бесплатными ресурсами на своём DC. Ну что же, придется пока сидеть так.
По крайней мере Хабр и ДаруДар я облюбовал по полной программе)
Практически полностью перешёл на C#. На Делфи кодю плагины для Инфиума (человеческий перевод .NET SDK, который я пытался организовать, лежит пока в сторонке недописанным, к сожалению) и редкие просьбы друзей о мелких утилитах. Последние, кстати, тоже скоро буду делать на дотНете.
А уж Google Code Jam 2009 и подавно писать надо будет на шарпе. Только для него надо бы ещё какой-нибудь мелкий подручный скриптовый язык для быстрых задач. Пока изучаю потихоньку PowerShell, со всем остальным стаффом этого класса я как-то не дружу. В общем, посмотрим.
TopCoder. Четко осознал свою позицию: синий. То есть уровень — выше среднего участника, однако среди таких высших — худший. Что ж, я так и подозревал с самого начала.
До жёлтого я поднимусь, судя по всему, не раньше чем через полгода. А уж о красном можно только мечтать.
Потому что, как я однажды писал в статусе, «из этого человека никогда не выйдет хорошего олимпийца. Он умеет хорошо думать. Он умеет красиво писать. Теперь только научите его делать это БЫСТРО!»
Старый комп надо будет вытащить на свет божий из шкафа и приспособить к какому-то полезному делу. *Ага, в однокомнатной квартире...* Потому что считать себя особой, имеющей отношение к IT, и не разбираться должным образом в администрировании — бред собачий.
Резюмируя. Вообще, новостей много, как айтишных, так и не имеющих к ним отношения. Но описывать их все я попросту замонаюсь, поэтому закругляюсь. Тем более пора идти чем-то заниматься всё-таки. Пока возможности есть.
На сим плановое обновление блога считаю закрытым, до новых встреч.
С уважением, Skiminok.
skiminog: reloading
Tuesday, 7 July 2009 18:54А ещё здесь отмечаю насущную проблему: мне нужно какое-нибудь дело, работа, проект, а то я сдохну от ничегонеделанья в ближайшие два месяца. В общем, в Киеве ищется работа (удалённая либо временный контракт) для junior-разработчика Delphi/C# либо технического копирайтера. Не самое длинное (я просто составил общую картину и любимые разработки), но все же дающее общее представление портфолио можно найти на Weblancer либо на Free-lance. Жаль, конечно, но фриланс-вакансии на тему прикладного программирования в настоящее время попадаются, как редкие жемчужины — а-ля «это было давно и неправда»...
Delphi Live 2009 — преанонс
Saturday, 16 May 2009 01:44Вкратце: нам обещают нативную IDE под Windows вплоть до 7, Mac OS X и Linux. Консольный хелловорлд для Мака якобы демонстрировался прямо на конференции.
Походу дело ещё довольно не близкое. Явно не в следующей версии.
В компиляторе: поддержка 64бит, поддержка многоядерности, атрибуты в стиле .NET, фичи по мелочи.
Параллельная RTL.
Улучшения в VCL. Работа с природными средствами ввода: жесты, тачскрин, GPS и т.д. (на будущее)
Абсолютно новая модель RTTI, идентичная рефлексии в .NET/Java. Полное покрытие.
Переработанная и улучшенная IDE, больше ориентированная на работу с клавой. Удобный ToolsAPI для IDE и создания форматировщиков кода. Новый дизайнер форм. Куча изменений по мелочи.
Демонстрация Delphi Prism с фреймворком Cirrus (аспектно-ориентированное программирование), работающей в альфе Visual Studio 2010.
Интеграция SVN, поддержка Firebird, нативное взаимодействие с дотнет-кодом через некий .NET Proxy, SOAP 1.2, DataSnap c HTTP, интеграция средств Embarcadero для работы с БД в IDE.
Документация.
Quad+1 holiday
Saturday, 14 February 2009 21:11Как вы думаете, сколько сегодня праздников? Один? Да, как бы не так. Четыре, товарищи;)
Во-первых, канешно, день Святого Валентина. Ну, про него инет и так напичкан инфой и отзывами, так что не буду повторять азбучные истины=)
Во-вторых, 14 февраля считается Днем Компьютерщика. Потому что именно 14 февраля 1946 состоялся первый запуск первого в истории человечества реально работающего вычислительного устройства — компьютера ENIAC.
В-третьих, 14 февраля 1995 г. — официальный релиз Delphi 1. Поздравляю свой любимый язык программирования с четырнадцатилетием=)
В-четвёртых, сегодня в 1:31:30 по Киеву системное компьютерное время, а конкретнее Unix-time, пересекло любопытное число 1234567890.
Да, и у вашего покорного слуги маленький личный праздник) Я наконец-то приобрёл бумажную версию бестселлера и лидера программерской литературы последних 10 лет: Стив Макконнелл, «Совершенный код».
Так что с чем поздравить, мы уж найдём) Было бы чем)
Delphi Prism: взгляд сквозь новые грани. Часть 2
Tuesday, 2 December 2008 01:54Вот в каком порядке переводить раздел Delphi Prism Language, была проблема уже нешуточная. В конце концов, посоветовавшись с товарищами, я решил идти более-менее по логическому порядку, но писать всё-таки не учебник по программированию, а считать, что читают статью люди, имеющие опыт в данной отрасли. Проще говоря, это будет всё тот же "Delphi for Win32 vs. Delphi Prism", упорядоченный от простейших материалов к интереснейшим :-)
Прежде всего стоит сделать важное замечание. Delphi Prism - .NET-язык, то есть полностью CLR-совместимый. Это значит, что любое изменение и любая мелочь языка должны быть построены в строгом соответствии со стандартом M$ - иначе программа даже просто не скомпилируется. Поэтому, когда я буду говорить о проведённых изменениях, очень многие из них я смогу мотивировать только одной фразой: потому что .NET. Это касается и имён конструкторов, и целочисленного деления, и ещё кучки разных тонкостей, каждую из которых попытались или включить в опции совместимости (как с конструкторами), или обыграть так, чтобы для программиста ничего не поменялось, а компилятор сам проводил преобразования в корректный IL (как с границами массивов - в .NET они начинаются с 0, но в Delphi Prism реализовали, конечно же, привычный нам свободный вариант... но об этом в соответствующем месте), или попросту много раз громко сакцентировать внимание на переделке (как с целочисленным делением). По ходу статьи вы встретите следующие пометки:
..., потому что .NET. — особенно краткое оправдание для некоторых изменений.
Несовместимо! — акцент на кардинальных нововведениях.
Совместимо:) — далее следует инструкция по включению обратной совместимости для описываемого пункта.
Вообще говоря, в 99% случаев все синтаксические проблемы по переходу решаются с помощью Oxidizer.
1. Пространства имён.
Начать следует с нескольких концепций .NET. *Ох, чует моё сердце, за время написания цикла статей по Призме я этих концепций расскажу на пол-МСДН, так что даже первый раз увидевшие платформу в глаза смогут свободно писать на ней тяжеловезные фреймворки сразу после изучения основ синтаксиса произвольного языка) Но, может, это и к лучшему. ОК, поехали.*
Понятия "файл" для программиста не существует. Файлы - это сущность чисто физическая, о ней вспоминаешь, когда сохраняешь проект на жёстком диске, а программа должна работать с сущностями разработки, с контекстом и задачей приложения. Поэтому разбиения на модули нет. Есть разбиение на пространства имён (ПИ). Пространство имён распространяется на несколько файлов, имеет название, ключевое слово namespace заменило собою ключевое слово unit, с той лишь разницей, что его название может повторяться в нескольких файлах - тогда это одно и то же ПИ.
Совместимо:) - ключевое слово unit осталось как синоним для namespace.
Delphi Prism полностью поддерживает циклические ссылки, в отличие от Delphi for Win32. То есть приведённый ниже код скомпилируется без проблем:
interface
uses SecondOne;
type
TClass1 = class
private
C1: Class2;
end;
//...
implementation
end.
namespace SecondOne;
interface
uses FirstOne;
type
Class2 = class(Class1)
end;
//...
implementation
end.
Название ПИ можно опустить:
interface
implementation
end.
Даже если вы не указали используемое ПИ в секции uses, то доступ к его элементам всегда можно получить, полностью прописав путь к элементу прямо в коде:
PS: System.Drawing.Printing.PaperSource;
Структуру проекта принято разделять на иерархию вложенных ПИ, чтобы получалось нечто вроде namespace System.Text.RegularExpressions. Чтобы использовать сразу все вложенные в какое-то пространство ПИ, можно воспользоваться конструкцией ".*":
Кстати говоря: если вы добавляете использование одних и тех же ПИ в каждое пространство вашего проекта, возможно, лучше будет сделать это глобально с помощью "Project Options" в IDE.
2. Главный метод.
Как только что выяснилось в ходе разговора о пространствах имён, понятия "программа" (program) у CLR не существует. Встаёт логичный вопрос: что же тогда служит точкой входа для сборки? Где искать начало выполнения? Ответ: в главном методе.
Несовместимо!
Главный метод имеет имя Main и служит той точкой, с которой начинается выполнение любой программы, будь она консольной, визуальной, или Веб-сервисом (исключение DLL, которая, вообще говоря, не выполняется). Такой метод должен быть хотя бы у одного класса в вашем пространстве имён; если он найден только у одного класса, выполнение автоматически начнётся с данного Main`a, в противном же случае выбирается тот класс, который указан в Project Options.
Главный метод обязательно статичен, то есть, в терминологии Delphi, представляет собою метод класса (class method). Он может не принимать параметров вообще, иметь один строковый параметр либо иметь один параметр - динамический массив строк. В последних двух случаях Main`у передаются аргументы командной строки.
Главный метод может либо не возвращать значения, либо возвращать целое число - код выхода программы.
Ниже привожу (вернее - честно слямзиваю с Prism Wiki) пример главного метода некоей программы:
begin
if Length(Args) <> 1 then begin
Console.WriteLine('Filename expected!');
exit 1;
end;
RunWith(Args[0]);
exit 0;
end;
- Ключевое слово method означает то, что и означает - любой метод:-) Это функция или процедура, в терминах старого доброго Паскаля... и Делфи, конечно же. Метод может возвращать значение, а может и не возвращать - в этом его преимущество, меняя функцию на процедуру, вам приходилось заодно изменять и ключевое слово в её описании и реализации. Сейчас это неудобство не нужно. Да и термин ООП "метод" лучше объясняет суть явления, чем пришельцы из 70-х "процедура" и "функция".
Совместимо:) Никто не заставляет писать method, старый синтаксис procedure и function остался в целях совместимости и убран никогда не будет. - Ключевое слово exit - дубликат return из языков с Си-подобным синтаксисом. Немедленный выход из метода с возвращением указанного значения соответствующего типа. Или невозвращением - в случае метода-процедуры.
Несовместимо! Exit у Delphi Prism - ключевое слово языка с соответствующим синтаксисом. Функция Exit() с одним необязательным параметром из Delphi for Win32 2009 осталась в прошлом. - Метод WriteLine() класса Console, как нетрудно догадаться, выполняет функции процедуры WriteLn. Впрочем, это уже относится не к Призме, а чисто к FCL, так что лучше MSDN вам никто ничего не объяснит. Тем более что она теперь русская.
3. Переменные.
Небольшое отступление от логики. Вообще говоря, повторюсь, если бы это был учебник по программированию на Delphi Prism для начинающих, то я бы пошёл как установлено временем: идентификаторы, выражения, константы, простейшие операторы... а только потом уже такая сложнейшая по своему наполнению область, как использование переменных. Но поскольку статью читают (надеюсь, читают) далеко не нубы, то я перескочу сразу к более интересному материалу, а ценные сведения об основах упомяну тогда, когда они срочно понадобятся по ходу рассказа.
Совместимо:) Переменные в Призме объявляются стандартной конструкцией var. Другое дело что теперь эта конструкция свободно гуляет по всему вашему коду. В отличие от Delphi for Win32, в Призме объявление переменных доступно не только в описательной секции метода, но и в любой точке его кода. Старый принцип Бейсика и Си: где понадобилось - там и объявляйте. Любить этот принцип или нет, использовать или забыть как страшный сон - решать только вам.
var
someInt1, someInt2: Integer;
someFloat: Double := 0.5;
begin
//немного кода
var someBoolean: Boolean;
//и ещё немного кода
var AnswerToLifeTheUniverseAndEverything: Integer := 42;
end;
Несовместимо! Обратите внимание: начальная инициализация переменных происходит не символом "=", а оператором присваивания ":=". По мнению разработчиков Delphi Prism, такой синтаксис корректнее иллюстрирует суть процесса: присваивание стартового значения переменной (полю, свойству... да мало ли), а не статическое, постоянное равенство. Это же вам не константа.
Инициализация переменных одновременно с объявлением - возможность, доступная для любого типа данных. Вот вам создание объекта:
var
File1: System.IO.FileStream := new FileStream('c:\file1.txt', FileMode.Append, FileAccess.Write, FileShare.Write);
begin
var File2: System.IO.FileStream := new FileStream('c:\file2.txt', FileMode.Append, FileAccess.Write, FileShare.Write);
end;
Delphi Prism, будучи дотнет-языком, активно использует автоматическое распознавание типов, более известное как Type Inference:
var s := 'Hello';
var c := new System.UTF8Encoding(true);
(Кстати, вы заметили "%101"? Это просто пятёрка. В двоичной системе счисления, что указано соответствующим префиксом. Да и старый знакомый префикс "$" для шестнадцатеричной тоже никуда не делся.)
Любой идентификатор может быть зарезервированным стандартным словом, если не забывать везде ставить перед ним символ "&":
Что-то статья получилась о ерунде всякой. Пожалуй, на третью часть надо пустить что-нибудь действительно покрасивей: паралелльные циклы, там... или асинхронное выполнение. Или про обнуляемые типы можно поговорить. Посмотрим через пару дней.
Delphi Prism: взгляд сквозь новые грани. Глава 1
Sunday, 30 November 2008 01:331. Delphi Prism и все-все-все.
Все знают о Delphi.NET. Этому продукту, впервые появившемуся перед нашими глазами в Delphi 8, сулили просто грандиозное будущее. В самом деле: тогда, в 2001-2003 годах, платформа .NET только-только появилась, представляла собой очень и очень перспективную разработку и с каждым годом захватывала в свои ряды всё больше и больше поклонников из мира Software Developing.
Delphi не осталась в стороне. Сначала в Borland, а затем и в CodeGear, люди начали ставить на нового лидера разработки, и всецело ориентировать свои продукты на .NET. В принципе, стоит признать наперёд, что в темпах популярности они не ошиблись... вот только сами оказались не на высоте. Но это произойдёт потом, а пока компания с жаром и пылом принялась за продвижение языка программирования нового класса.
За несколько лет обозначились основные проблемы Delphi.NET, впервые чётко сформулированные уже в 2007-2008 во времена Embarcadero:
- Менеджеры компании упорно пытались сохранить Delphi.NET полную или практически полную совместимость на уровне синтаксиса со своим старшим братом - Delphi for Win32. Учитывая, что разработка нативной версии продвигалась в Коджире на порядок медленнее, чем развитие майкрософтовцами CLR, на уровне темпов ребята явно терпели неудачу.
- Не во всех областях получалось организовать полнофункциональный визуальный редактор интерфейса - M$ закрыла эту возможность.
- Многие программисты невзлюбили новую оболочку CodeGear RAD Studio. Кто-то утверждал о багах, кто-то - производительности... в любом случае, пересадить огромную толпу потенциальных потребителей на новый язык оказалось невозможным, пока он используется именно в данной среде.
- На самом деле и Delphi for Win32 с одной стороны, и C# с другой в массе специфичных задач оказывались на порядок выгоднее Delphi.NET.
Проблему заметили в Embarcadero, и поняли, что вопрос надо решать срочно и по возможности кардинально. Сообщество требовало мощного прорыва, такого же, который подкрепил бы триумф нативной Delphi 2009: Tiburon, и довершил бы эффектный прыжок среди программистского населения. Но для прорыва нужны были помощники.
Ими стали RemObjects. Старая, довольно известная на просторах комьюнити фирма, давным-давно зарекомендовавшая себя на рынке разработкой PascalScript, AnyDAC, Data Abstract... и Chrome. Позднее более известный как Oxygene. Язык с Pascal-подобным синтаксисом, наряду с Обероном и Модулой продолжающий последние заветы Вирта - но дотнетовский. Т.е. Oxygene поставлялся как расширение к Microsoft Visual Studio - компилятор, интерпретатор и т.д. нового .NET-языка. Oxygene стал известен лишь в узких кругах, не так много компаний перешло на него, несмотря на богатый функционал. Вообще говоря, проект многие считали чем-то вроде научно-исследовательской разработки RemObjects - на уровне "чисто поржать", что ли.
Пока к RemObjects не обратилась Embarcadero. Две компании объединили усилия и за каких-то полгода на основе разработок Oxygene и Delphi родили принципиально новый продукт с грандиозным функционалом и собственной, радужной судьбой. Это новое лицо Oxygene, подсоленное известностью имени Delphi, назвали Delphi Prism.
2. Сапожник, портной... кто ты будешь такой?
Ключевые пункты в описании Delphi Prism:
- Delphi Prism - расширение к Visual Studio. Оно работает в оболочке Visual Studio Shell, бесплатно предоставляемой M$ для разработчиков собственных дотнет-языков. Если на Вашем компьютере установлена Visual Studio (не Express версия), то Призма автоматически при установке интегрируется в неё. В противном же случае вышеупомянутая оболочка будет автоматически установлена Призмой и вы сможете запускать её автономно, получая аналогичную полнофункциональную среду программирования - без необходимости отдельной покупки VS.
Также Delphi Prism доступна в составе CodeGear RAD Studio 2009. - Delphi Prism полностью соответствует последнему стандарту .NET и даже опережает его (о последнем см. ниже). Вы можете разрабатывать приложения под ASP.NET, Silverlight, Windows Presentation Foundation (WPF), WinForms, LINQ. Гарантируется, что Призма всегда будет оставаться как минимум в ногу с развитием M$.
Есть возможность выбирать версию .NET, под которую будет ориентировать приложение. - Так как Delphi Prism - полностью совместим с CLR, то он поддерживает любую реализацию дотнета, которая соответствует спецификации Майкрософт. В частности, на данный момент Призма прекрасно работает под Mono на Linux (GTK#) и Mac OS (Cocoa#). Разумеется, никто не запрещает также использовать на всех трёх платформах WinForms наряду с GTK# и Cocoa# - все упомянутые возможности разработки поставляются "из коробки".
Более того, сейчас в стадии бета-версии находится также процесс интеграции Prism в среду MonoDevelop, вместо VS. - Привычный синтаксис, знакомый нам по Delphi, позволяет легко перейти с языка на язык, а изобилие новых синтаксических возможностей в нём - стимулирует переход с удвоенной силой ;-)
Кстати говоря, продукт RemObjects Hydra позволяет использовать в одном проекте одновременно Delphi Prism и Delphi for Win32, интегрируя их друг с другом. - Стоит отметить, что привычная для выбравших в своё время Delphi.NET библиотека VCL.NET более развиваться не будет. WinForms, GTK#, Cocoa# содержат всё необходимое для полноценной визуальной разработки.
Что же касается огромного количества элементов Delphi RTL, которые портировать будет чуть более трудоёмко, то этот вопрос в настоящий момент решается с помощью ShineOn - авторской реализации Delphi RTL исключительно на .NET FCL. ShineOn тоже ещё не вошёл в финальную стадию, однако количество уже переведённого кода впечатляет. - В ближайшие месяцы, согласно Нику Ходжесу, CodeGear выпустит в народ сразу несколько функциональных обновлений для Призмы. Роадмапа ещё нет, он обещается на DN в ближайшем будущем, а пока что всем рекомендуется запастись Software Accurance.
- Первый trial появился для свободной закачки на сайте CodeGear позавчера.
Вики в основном наполнена на английском языке. Часть материала успешно переведена на немецкий, часть - на французский, и часть - на японский языки. В силу того что большего количества информации про Призму нет более ни на одном ресурсе Интернета, мой небольшой цикл статей про уникальные возможности языка (да-да, уникальные, как по сравнению с Делфи, так и по сравнению с C#!) без лишнего оригинальничанья будет представлять собой в основном перевод справочной вики Призмы на русский язык. Не дословно, конечно же. С авторскими комментариями. Но любителей изучать всё в первоисточниках сразу лучше отошлю на Prism Wiki и Delphifeeds.com - здесь вы не найдёте ничего, кроме агрегатора этих двух ресурсов.
Итак, общее описание продукта закончено. Пора приступать к конкретике. А именно - к возможностям языка...
(no subject)
Saturday, 1 November 2008 01:40Не с нуля, но система хранения и все контейнеры теперь шаблонные - а значит, минимум половину кода нужно перелопатить по полной программе. Мозг кипит, уши свистят, руки давно запутались в собственных строчках. Наверное, пора бы и спать лечь, а то попорчу всё на свете в этом плагине.
P.S. Вот кто мне может вразумительно объяснить, что CodeGear имела в виду под ошибкой вида "Incompatible types: "u_qip_plugin.DIterator<string>" and "u_constants.DIterator<string>"? Что значит несовместимы?! Это один и тот же шаблон, инстацированный одним и тем же типом! Причём описанный даже не мной! Однако между двумя моими модулями передать его какого-то чёрта не получается...
Тибурон и дебаг
Sunday, 12 October 2008 18:47У меня версия среды последняя - 12.0.3170.16989. Пробовал обратиться к единственному знакомому, который ставил себе Тибурон. У него 12.0.3163.16897 - и всё работает...
Взываю о помощи. Сижу в полном тупике.
Скрины настроек конфигурации "Debug":
Кульминация долгожданного
Wednesday, 10 September 2008 20:59Всё это чертовски забавно)
Monday, 8 September 2008 21:10Беты Тибурона появляются на серверах коджира с завидной регулярностью: раз в несколько дней. Система обычна: "ребята удалые" упорно собирают этот гигантский набор 7-зипов, добавляют к нему коллекцию из трех патченных bds.exe и десяти слип-файлов (выбирай на вкус :-D ) и кидают на файл-хостинг. Администрация хостинга через денёк-другой-третий удаляет файл, ссылаясь на правонарушение, но тут обнаруживается свежая бета и наша песня хороша, начинай сначала... Ждём релиза, господа, ждём и не кипятимся. "Stay tuned" © David I.
Именитые разработчики плагинов для IDE и библиотеков классов/компонентов одним за другим потихоньку рапортуют о полной готовности своего детища под 2009-ку. По состоянию на текущий момент список насчитывает:
- Internet Component Suite
- TsiLang
- TResourceAllocationChart
- TPerlRegEx
- NSELib - The NameSpace Extension Library
- JEDI API & WSCL (beta)
- Castalia
- TMS Software
- RemObjects SDK
- RemObjects DataAbstract
- DS Plug-in system
- SmartInspect
Жаль только, за DeCAL ни одна живая душа, в том числе и её автор, взяться и не подумает. Может, найти свободное время, пока есть, и самому в исходниках порыться? Заодно и доделать, и перегрузку методов внедрить, а то библиотека писалась во времена Delphi 3, и про шаблоны подумать... эх, красота бы получилась. Но сложно, сложно, да. Нужна поддержка. Поспрошать среди знакомых, штоле...
Скоро снова буду временно заглядывать в любимый свой лицей - вести всё тот же ООП-спецкурс. Поколение сменилось, лица по большей части будут незнакомые, но всё такие же интересные. Эх, ну вот почему эта инициатива только мне в своё время пришла в голову? Неужели нет в Киеве здравомыслящих? Неужели ведущие школы, лицеи и гимназии не понимают, что нельзя зацикливаться на одном пути? ООП - это красиво, это идеология, философия, религия в какой-то мере, в конце концов. Это надо рассказывать, готовить людей к жизни. Всё-таки ввели информатику как общеобразовательный предмет - так будьте добры преподавать её по-человечески. Курс азов программирования нужен в нашем кошмарном XXI веке ничуть не меньше пользовательского. Тем не менее в средней общеобразовательной школе (в нормальных заведениях ситуация гораздо лучше, но всё равно не айс) мы имеем год на лабуду по типу "история вычислительной техники", "работа с файлами и папками" (на примере DOS, мать моя женщина, вы слышите это?! с какой частотой вы это гениальнейшее в глаза сейчас видите вокруг?) и прочая, прочая, прочая. Зацепляем офисные пакеты - отлично. Фотошоп - замечательно. Интернет и положения его использования - великолепно. И три месяца на... давно канувший в пучину веков Turbo Pascal? Нет, ё-моё, ну почему тогда не продолжить тенденцию и не рассказывать про текстовые редакторы на примере Лексикона?! Вы определитесь, что вы детям желаете дать вообще? Я так понимаю, что навыки ориентирования в современном цифровом мире. Так прошу прощения, современном! Вопрос, входит ли программирование в эти навыки, вообще-то говоря, является сложным, до него дойдёт своя очередь, однако как можно рассказывать о программировании и не давать никакого реального представления о том, что сейчас в него входит? Тем более что такая красивая идеология на самом-то деле описывает весь мир, а не только Computer Science.
Скучный пост вышел. Наверное, из-за настроения. Надо взять себя в руки а потом в те же руки взять TSZII. Там ещё много-много рюшечек народу хочется прикрутить. А я канул неизвестно куда и скучаю, не дело. Мда.
"Не было печали, просто уходило лето..."
Но прошёл день и этот ад закончился. Итак, впечатления по мере использования (мера использования не очень большая пока что, но кое-что уже накопилось):
--- Ускорения установки я лично не заметил.
--- Инсталл разделён на 5 частей: собственно CodeGear RAD Studio, хелп, Boost, Remote Debugger и набор провайдеров для БД. Единой интегрирующей системы нет, пять инсталляшек надо запускать по отдельности в произвольном порядке. Prereqs я не считаю, у меня они и так стояли.
== Откуда в Студии Delphi.NET 2009 - я хз. Одно из двух: либо всунули просто апдейнутый в плане системы типов 2007-й, либо имеющуюся у меня на руках сборку делали пираты, просто заменив архивы скачанными с сайта Коджира архивами и оставив идентичный инсталлятор. Хотя это вряд ли: изменения в инсталляторе таки были, как минимум дерево фич другое и предупреждение о лицензировании Ribbon`a всунуто...
--- С какого бодуна CodeGear RAD Studio теперь требует ребут?!! О_О
++ Запуск собственно среды гораздо ускорился, видно невооружённым глазом.
++ Интерфейс среды - просто конфетка. Теперь в этом видно Висту, действительно такую, какой оно должно быть. Segoe UI плюс эффект Офиса 2003 (донт ворри, не 2007): закрашивание пункта главного меню под указателем и выброс меню как бы на высшем от него z-index`e. Впрочем, это всё надо увидеть.
--- Новые надписи в Class Explorer`e и Project Manager`e чрезмерно большие, занимают по несколько строк. Их можно отключить, но тогда на кнопках останутся только изображения, и у пользователя появится превосходный шанс потренироваться в распознавании сюрреалистических образов.
++ Я успел проверить только дженерики, на собственно кодинг осталось маловато времени (см. ниже). Но они отлично работают, эдитор логично адаптирован под новые языковые конструкции, то же для набора контейнеров.
++ Спасибо за обновление справки. Оно действительно стоящее, особенно отдельные разделы (группы статей) "Unicode" и "Generics". Статья "What's new in Delphi 2009" оказалась длиннющей, как московское метро, и в конце под завязку наполненной неописанными в блогах мелочами ;)
--- Модули Generics.Defaults и Generics.Collections не документированы.
--- Хелп кое-где хреновый: нет переводов строк в примерах исходников.
== Два малозначительных эррора, выскочивших у меня в процессе работы (судя по логу, неудачные попытки запустить HelpInside, обычно всё с ней ок, не напрягайтесь) списываю на пиратов.
--- Между прочим, хвалились-хвалились, а диалог опций всей Студии растягиваемым так и не сделали, в отличие от многих других диалогов.
Общее впечатление: отлично, но мелкие недоработки подпорчивают настроение *хотя мне в последнее время трудно его испортить куда дальше... блин, отвлёкся, простите*
To be continued.
Раша всегда с тобой
Saturday, 30 August 2008 22:40Сейчас буду перечитывать всё это дело заново. Авось какие забавные перлы отыщутся)))
UPDATE:
- Generics всё-таки решили обозвать шаблонами. Ну, не я им судья.
- "Создание привлекательных интерфейсов пользователя с помощью новых компонентов VCL, элементов управления «Лента»..."
Интерфейс Ribbon - это на просторах СНГ, оказывается, "Лента". Я не знаю, что им сделает региональное отделение Майкрософта:) - "...улучшенная система управления конфигурацией сборки, обеспечивающая удобный выбор конфигураций сборки..."
...которые, будучи конфигурациями сборками, представляют вам удобный способ конфигурировать сборки и сохранять в формате конфигураций сборки, чтобы потом система управления конфигурациями сборки могла прочитать конфигурацию сборки и соответствующим образом сконфигурировать вашу сборку, ведь только конфигурация сборок с помощью нашей улучшенной системы управления конфигурациями сборок даёт вам такие широкие возможности по конфигурированию ваших сборок. - "...можно использовать перетаскивание компонентов, перехват событий..."
...и переработку отходов. - "...Новая многоуровневая архитектура DataSnap™ позволяет создавать в среде быстрой разработки высокопроизводительные, масштабируемые middleware-приложения для баз данных. Подключение к таким приложениям может быть установлено по быстрому открытому протоколу обмена данными с «тонких» полнофункциональных клиентов, которые располагаются практически на любой native или Web-платформе..."
Middleware, "тонких", native... Мне одному режут глаз эти слова? - "2009-ые версии - лучшие из когда-либо созданных версий Delphi и C++Builder..."
О небо! Они нас всё это время обманывали?! Это уже 2009-я версия?! А как же тысячи пользователей в неведеньи, которые до сих пор наивно полагают, что она по счёту двенадцатая?! - По моему скромному мнению, уникальное по своему происхождению слово "webinar" лучше было бы и перевести как "вебинар", а не именовать громоздко "веб-семинаром".
- "В визуальные объекты в библиотеке VCL для Интернета могут быть встроены технологии низкого уровня..."
VCL for the Web, млять, вы слышите меня, VCL for the Web! - "Системные требования:
...
- Дисковод для DVD-дисков"
Пристрелите меня кто-нибудь. - "Я все еще использую очень старую версию Delphi. Могу ли я сделать покупку по ценам обновления?"
Заметьте, просто ну очень старую. Наверное, Delphi 1, не больше.
Here Comes Tiburon. Part I
Saturday, 23 August 2008 20:09Согласно статье на eWeek, с 25 августа начинается приём заказов. Немногим позже продукт официально выходит в продажу.
Приношу свои извинения за то, что "пост" по факту представляет собою три поста: даже у ЖЖ, как выяснилось, есть ограничения на объём записи (да что вы говорите... :-D ). Каждый пост будет оформлен в виде списка возможностей с пунктами и подпунктами. А по каждому подпункту - краткое описание плюс кучка ссылок. Ссылок много, очень много, пост будет полон ими чуть более, чем наполовину. Практически все из них - на инглише, но это дело десятое, я полагаю. Интересующемуся человеку прочесть не составит труда, угу? Итак, я начинаю.
> Part I: Юникод и параметризированные типы aka дженерики.
Part II: Анонимные методы, IDE и VCL, разнообразное прочее.
Part III: Нововведения в С++Builder`e.
( I. Unicode )
( II. Generics )