Lazarus как он есть

Довольно часто наше нежелание разбираться в вопросе и уверенность в собственной логике рождает неверные предположения. Эти предположения, высказанные как утверждения на публичной площадке, могут прочно осесть в чужих головах и сформировать ложные отрицательные представления.

Так в комментариях к недавней теме «Lazarus 1.0 увидел свет!» были высказаны некоторые неверные утверждения, а также задан ряд вопросов оставшихся без ответов. Являясь разработчиком Lazarus и FPC уже довольно продолжительное время, я могу и хочу дать ответ на большинство связанных с этими продуктами вопросов и развеять некоторые неверные предположения.

Утверждение: Размер исполняемых файлов оставляет желать лучшего. Виноват компилятор, компоновщик и др.

Некоторую информацию по данной теме можно получить на wiki-странице.

Итак, основная составляющая размера исполняемого файла — отладочная информация. Отладочную информацию добавляет компилятор FPC когда ему передан ключ "-g". FPC может генерировать 2 вида отладочной информации: устаревший stabs и современный dwarf (версии 2 или 3), что также определяется переданными компилятору ключами. Оба вида отладочной информации понимаются отладчиком gdb. В Lazarus включить/выключить отладочную информацию, а также определить ее вид можно на закладке «Компоновка» в параметрах проекта:

Если вы собираете проект под Windows или Linux, можно сформировать внешний файл отладочных символов. В этом случае в исполняемый файл отладочная информация добавляться не будет, а вместо нее будет помещена ссылка на внешний отладочный файл.

Исключение отладочной информации уменьшает размер пустого проекта с формой с 20Мб до 1,6Мб на Windows. Но, 1,6Мб тоже больше чем 300Кб, который выдавал Delphi 7 (Delphi XE, к примеру, уже выдает значительно больше из-за распухания RTTI). Дело тут не в компиляторе и не в компоновщике, которые делают свою работу верно, а все дело в LCL.

LCL — Lazarus Component Library архитектурно состоит их двух частей: фронтэнда — платформонезависимой библиотеки классов для разработчиков приложений (TForm, TButton, TLabel, ...) и бэкэнда — части отвечающей за реализацию этих компонент под конкретную платформу (win32, qt, gtk2, ...). При начальной реализации бэкэндов никто особо не задумывался о размере исполняемых файлов и писал общие методы, в которых обращался ко всем классам фронтэнда.

Например, следующий код из модуля lcl\interfaces\win32\win32proc.pp тянет в исполняемый файл классы TCustomGroupBox, TCustomTabControl, даже если вы их нигде не используете:
if (TheWinControl is TCustomGroupBox) then
begin
...
end else
if TheWinControl is TCustomTabControl then
begin
...
end;


Решить эту проблему может рефакторинг, но он требует значительных усилий и времени, которые в условиях нехватки рук возможно лучше потратить на решение других проблем. Надо сказать, что определенные усилия в этом направлении были приложены 2 или 3 года назад, что позволило сократить размер пустого проекта с формой на 300Кб.

Утверждение: Lazarus ставил однажды в Windows, и запомнилось, что даже простейшая программа с окном и кнопкой компилируется ооочень долго.

Проблема была, когда FPC использовал GNU компоновщик для Windows. Но, в FPC 2.2 (а сейчас Lazarus использует FPC 2.6) проблема была устранена разработкой встроенного компоновщика для Windows. Кроме того, на тот момент компоновщик GNU не умел собирать под платформу Win64, что тоже послужило толчком к разработке собственного встроенного компоновщика. Надо заметить, что под Linux и Darwin таких проблем со скоростью сборки не было и нет (и как следствие до сих пор нет и собственного компоновщика под эти платформы).

Сейчас сборка и запуск пустого проекта с формой на моей машине занимает не более 2х секунд.

Вопрос: Здорово, если в Lazarus появится нормальный докинг, как в Delphi 2006, к примеру. Сильно повысит удобство интерфейса. Хотя, может быть, он там уже есть?

Докинг можно включить сборкой дополнительного пакета, но это делать не рекомендуется, так как пока присутствует ряд нерешенных проблем. К версии 1.2 докинг будет готов и скорее всего сразу встроен в среду.

Утверждение: «Mac OS X: 10.4, LCL только 32bit, не-LCL могут быть 64bit». Да уж, впечатляет.

Во-первых, имеется в виду, что Lazarus собирает проекты под Mac OS X не ниже версии 10.4. То есть поддерживаются и 10.5 и 10.6 и 10.7 и 10.8 (на которой у меня сейчас запущен Lazarus). LCL проекты могут быть только 32бит.

Это связано с тем, что на Max OS X существуют 2 основные системные библиотеки: carbon и cocoa. Carbon появилась первой и представляла собой библиотеку функций. Не было никаких проблем начать строить на ее основе LCL бэкэнд, что и было сделано. После Apple представил еще одну библиотеку cocoa, которая вместо функций содержит классы Objective-C. Позже Apple объявил, что не будет делать библиотеку carbon 64 разрядной, и вообще новые приложения надо разрабатывать только под cocoa.

Для взаимодействия с Objective-C классами в FPC был добавлен диалект, получивший название Objective-Pascal. В Lazarus был также добавлен бэкэнд для cocoa, но он в настоящее время находится в стадии ранней разработки. Возможно (я приложу к этому усилия), к версии 1.2 он будет на уровне бэкэнда под gtk2 и qt.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 77

    +4
    Вы занимаетесь разработкой Lazarus/являетесь активным контрибьютером? На вашей хабрастранице не так много информации
      +3
      Да, уже более 5-ти лет активно участвую в разаботке Lazarus и 4 года в разработке FPC. Я также добавил некоторую информацию в свой профиль.
      0
      Delphi ж вроде умеет выбрасывать не используемый код при линковке, а лазарус нет.
        +2
        Лазарус — это среда. Линкер FPC, афайк, умел это делать. Однако же, обращение вида «if X is TMyVeryUnusableClass» делает весь оный класс фактически используемым.
          0
          Дельфи умеет выкидывать неиспользуемые методы класса
            0
            Вполне возможно провести такую оптимизацию: проверяем используется ли класс где-либо кроме блоков if SomeClassInstance is TSomeClass и если нет, то заменяем блок на if False с последующим выкидыванием. Но проблема с IS это лишь пример — в коде LCL бэкэндов можно найти и другие варианты использования классов LCL фронтэнда, которые также не дают выкинуть их из пустого приложения с формой.
              0
              Вы не ищете легких путей, как я посмотрю…
                0
                Если у вас есть идея лучше как бы мог этот делать компилятор, то скажите — вдруг она будет проще в реализации :)
                  0
                  Я ж говорю, неиспользуемые методы класса выкинуть (и все чем пользовался он тоже переоценить). Тогда от неиспользуемого класса останется лишь имя и почти пустая rtti, и результат похудеет.
                    0
                    Так делать нельзя, так как возможен вызов методов и обращение к свойствам через RTTI.
                      0
                      Уверен, что все это можно отследить.
                        0
                        Обращение к RTTI идет же через строки. Можно выкидывать методы, для которых  RTTI не формируется. Но вообще оптимизация — не моя тема (в FPC этим в разное время занимались Florian Klämpfl, Jonas Maebe и Сергей Горелкин), и я сходу не готов придумывать что и как можно оптимизировать.
                      0
                      Я ж понимаю, счетчик ссылок на идентификаторы в компиляторе и линкере есть?
                        0
                        Безусловно есть.
                          0
                          Виртуальный конструктор компонентов может сбить с толку, но на самом деле тут тоже проблемы нет — дельфи оставляет сам класс доступным, если на него ссылается класс формы или процедура RegisterClass и разбирается уже с его методами…

                          Если конструкторы у класса обычные, то если они ни разу не вызваны, класс можно выкинуть целиком.

                          Если судьбу ссылки на класс можно проследить, можно не записывать использование методам, которые по ней не использованы и классам, которые ей не присваивались…
                            0
                            Вы несколько упрощаете ситуацию. Можно ведь без хранения ссылки на ксласс вызывать его методы (хоть методы класса, хоть методы экземпляра) вроде: SomeVar := TSomeClass.GetSomeValue. Так что всеже все несколько сложнее.
                              0
                              На имя ссылка есть? Есть. Можно следить использование переменной, и выбрать один из трех вариантов: не используется — тогда не считать, используется — тогда считать, и передается туда, где следить дальше невозможно — тогда тоже на всякий случай посчитать…
                                0
                                Если вы сейчас говорите про класс вцелом, то конечно неиспользуемые классы выкидываются в FPC.

                                Если вы говорите про исключение метода класса, то я вас не понимаю.

                                В любом случае, вы можете попробовать реализовать свои идеи на кодовой базе  FPC и если они окажутся удачными, они обязательно будут включены в проект.
                                  0
                                  Может, и займусь когда… интересных дел очень много, а важных ещё больше…
                                0
                                Но конечно, несколько упрощаю. Все варианты неиспользуемости сразу не отследить, но все же расти есть куда.
            0
            Поставил, попробовал.
            Что сразу очень сильно напрягло и фактически сделало невозможным серьезное использование Lazarus:
            — нельзя выбрать контрол и кликом на форме поставить его в указанное место.
            Можно это сделать только через двойной клик на контроле.
            — попытка сменить размеры контрола на форме — мышиный курсор не превращается в перекрестье стрелок при наведении на «горячую точку смены размера».
            Точнее он на мгновение «моргает» и снова становится стрелочкой. Однако, как оказывается, можно уже менять размер, то есть форма курсора обманывает.

            Дальше смотреть не стал, честно говоря, сильно удивлен такими серьезными недоделками. Без их исправления всерьез заниматься дизайном форм невозможно. Баг 1 не дает возможность быстро ставить контрол в нужное место. Баг 2 в 100 раз увеличивает время подгонки размеров контролов.

            Windows 7 64b Base Edition, 2 монитора Full HD через одну карту.

            Насчет времени компиляции и пр. — более-менее быстро компилирует. Хотя с Delphi не сравнить, конечно, тот, вообще, мухой.
              0
              >>— нельзя выбрать контрол и кликом на форме поставить его в указанное место.
              Здесь вы не правы.
                0
                Мне не удается, могу screencapture записать для подтверждения.
                  0
                  Было бы полезно, если бы вы отправили эту информацию в наш трекер ошибок. Могу пока только сообщить что на моей Windows 7 32bit все прекрасно работает.
                    +1
                    При создании issue непонятны некоторые поля.

                    Platform,OS и OS version. Чем отличаются?

                    Product Build. В about ничего похожего, где взять?

                    В любом случае, создал два issue.

                    22824
                    22825
                      +1
                      Platform, OS, OS Version — Например 32bit Windows, 7 или 64 bit Ubuntu 12.10.

                      Product Build — нужен если вы используете сборку из svn — надо заполнить номер ревизии. Если у вас 1.0, то ничего дополнительного заполнять не надо.

                      По поводу ошибок:
                      0022824 — не является ошибкой — вы выделили компонент не в палитре компонент, а в окне поиска компонент.
                      0022825 — скорее всего ошибка среды, которую мы будем исправлять (хотя у меня и не наблюдается)
                        0
                        Вот замечание, которое я хотел добавить в 22824. Сейчас вообще не могу создать новый issue :( — пустая страница.

                        I disagree on this.

                        1. Delphi has Ctrl-Alt-P shortcut for Tool palette. So any Delphi user following my steps feels like «WTF? I cannot put a selected control on form». Because in Delphi there is no separate search window for components.

                        2. Double-clicking control in «component search window» still puts (!) control on form. «WTF? Why double-click works while selecting and single-clicking doesn't?»

                        3. The funniest thing happens if one presses ENTER on selected component in a search window. Lazarus puts control on form and also selectes component in palette toolbar. Now single-click on form and this puts another component on it. WTF??

                        This weird behaviour can be easily improved.

                        1. Single-click on component in search window tool should select component on palette toolbar (so single-left-click on form puts component on form as it should).

                        2. ENTER works exactly like single-click (do not put component on form on ENTER).
                          0
                          Кратко: при клике компонента в окне поиска надо выбирать его в palette toolbar. Это решит проблему.
                            0
                            Ну и при нажатии Enter в окне поиска надо ставит компонент на форму и отменять выбор компонента в palette toolbar, чтобы последующие клики на форме не ставили второй экземпляр компонента.
                            0
                            Вот подобное окно в Delphi 7: image

                            Оно не работает так как вы хотели бы.
                              0
                              Какая версия Delphi, не подскажете?
                                0
                                В Delphi 2007 и Delphi XE не вижу такого окна. Как его открыть?

                                Да, вообщем, даже если оно и есть.

                                Ctrl-Alt-P открывает Tool Palette с возможностью поиска по названию. Выбранный при поиске компонент ставится на форму кликом. Это поведение стандартно для Delphi и нужно перенести в Lazarus.

                                В lazarus вроде есть настройка «Delphi-подобный»? Касается она только синтаксиса языка? Если нет, то при выборе этой настройки надо выбрать и это поведение. Это разумно будет.

                                  0
                                  В Lazarus оно открывает окно поиска компонентов. Lazarus не пытается на 100% повторить среду Delphi.
                                    0
                                    Все равно поведение сбивает с толку. Даже без учета знания того, как это работает в Delphi.

                                    Нашел компонент, выбрал — не могу поставить кликом, почему?
                                    Нажал ENTER, кликнул на форме — поставилось 2 компонента, почему?

                                    Наткнулся еще на один баг, связанный с IPC. Но не могу добавить issue — пустая страница при выборе пункта «Report Issue»

                                      0
                                      Вот новый issue, в котором сведены эти претензии.

                                      mantis.freepascal.org/view.php?id=22829
                                    0
                                    Написал же что речь про Delphi 7
                                      0
                                      Да, действительно, не заметил) Лучше, наверное, ориентироваться на более современную версию.
                                        +2
                                        Сейчас две актуальных версии — XE3 и 7. Обе актуальные.
                                          0
                                          XE3 — допустим, а 7-то почему? Не лучше взять 2007?
                                            0
                                            Испоганили же…
                                              0
                                              Ну, не знаю. В Delphi 7 8 лет, сейчас уже два года в 2007. Из неприятного разве что подсказка, но обычно лезу в интернет, так что не напрягает.

                                              Наткнулись на два системных бага, оба более-менее обходятся.

                                              А так-то особых проблем нет.
                                                +2
                                                На основной работе D7 для старых проектов и D2007 для менее старых. Есть и XE, но перевод на unicode старых проектов не сделан, да и зачем делать там где он не нужен вообще? Большинство же новых проектов уже под web — там без Delphi.

                                                На дополнительной работе занимаюсь разработкой компонент и там D7 — обязательно. Будешь делать в версии старше — формы замучишься корректировать под младшие версии. Да и код написаный на D7 всегда работает до D2007 (и, за редким исключением, в 2009-XE2).
                                                  0
                                                  Отчего не перейти от D7 к D2007 для старых проектов?

                                                    +2
                                                    D7 is solid like a rock! Если Вы понимаете, о чем я говорю, конечно.

                                                    ЗЫ Блин… Так просится фраза: «Вы себе даже не представляете...» Григорий, надеюсь, шо сюда не доберутся люди. Гляньте ко мне в профайл. Все проекты хостились на D7. И только Юникод заставил, cцyko, сменить ориентацию. Я клянусь вам, шо если бы таки не он, то хер бы с маслом увидели Борланды\КодЖиры\ымбаркадеры, а не денег бедных шахтёроф…
                              0
                              Вот бы это там на месте ещё бы понятно оказывалось… хинт хотя всплывал, или пример прямо в Caption-е к полю…
                                0
                                Главное чтобы из вашего отчета об ошибке было понятно как и на чем ее воспроизводиь. А на счет указанных полей — ими практически никто не пользуется, так как все обычно в тексте указывают свою платформу, операционную систему и прочее.
                              +1
                              Хмм, не могу добавить замечания в мой же issue: он — read-only! WTF?
                                0
                                Проверьте — внизу должно быть поле для добавления комментария.
                                  0
                                  Add Note?

                                  Ввожу, нажимаю кнопку «Add note», получаю:

                                  APPLICATION ERROR #1103
                                  The action cannot be performed because issue '22824' is read-only
                                    +1
                                    Увы, такая беда есть с отчетами помеченными как «resolved». Вообще mantis давно пора обновить, но он у нас содержит собственные изменения, которые сильно быстро не перенесешь.
                        +1
                        Не очень понятно минусование этого комментария. Я наблюдаю это баги и они для меня являются критическими. Что не так?
                          +1
                          Утверждения «Без их исправления всерьез заниматься дизайном форм невозможно.» и " Баг 2 в 100 раз увеличивает время подгонки размеров контролов." не полностью верны.

                          Это потому, что «Однако, как оказывается, можно уже менять размер, то есть форма курсора обманывает.». Баг 2 — это некритичный глюк, и работе мешать он не может. Пару раз убедились, что наведя мышь можно тащить независимо от формы курсора — и таскаете себе, не тратя время…
                          +1
                          «Mac OS X: 10.4, LCL только 32bit, не-LCL могут быть 64bit». Да уж, впечатляет.

                          Я так понимаю, камень в мой огород. Привел цитату точь-в-точь из официального источника. Ясен пень, мне жлобу под Маки компилировать не приходилось. Посыпаю голову активированным углём ;)
                            +4
                            Если вы разработчик Lazarus, хочу сказать вам спасибо за ваш труд.
                            Отличная система вышла, некоторое время разрабатывал на ней серверный софт под Linux.
                            Жаль только indy не особо стабилен…
                              0
                              Интересно: а почему Indy, почему не SynapseLib?
                                0
                                Функционал лучше в разы.
                                Полнее ООП.
                                0
                                Спасибо. Команда Indi сама занимается поддержкой своей библиотеки. Не могу никак прокомментировать ее стабильность, так как ни разу не пользовался.
                                  0
                                  Это понятно.
                                  Про indy это просто констатация факта.
                                  Камень ни в коем случае не в ваш огород.
                                    0
                                    Не советую связываться с Indy.

                                    Если интересно, напишу подробности.
                                      0
                                      Интересно и подробности и что пользовать вместо.
                                        0
                                        Насчет вместо — в результате все самописное, на что заменить — не знаю.

                                        Проблема с Indy была очень неприятная — Indy не позволял управлять временем подключения.
                                        Несмотря на наличие свойства ConnectTimeout, задав которое якобы можно ограничить время, проведенное в connect.

                                        Indy просто игнорировал это свойство и мог «провисеть» в вызове сколько угодно. Я посмотрел код и убедился, что именно так и есть. Это факт и код, который я увидел сильно убавили мое доверие к Indy. На мой взгляд, это то, что называют overdesigned.
                                          0
                                          а оно под fpc так же без исходников, и подправить сложнее чем своё написать?
                                            +2
                                            Это нетривиальная правка, она архитектурная.

                                  0
                                  Я бы тоже рекомендовал Synapse, все достаточно прозрачно и никаких глюков на нем не заметил в Lazarus
                                  0
                                  Меня каждый раз напрягают диалоги настроек — совершенно неинтуитивны для дельфиста-виндузятника.
                                  Они ссылаются на особенности консольных программ, на их ключи, названы черезмерно лаконично и загадочно.
                                    0
                                    Так я и не понял, лазарус под OS X выше 10.4 запускается? Потому что на sourceforge для загрузки предоставлен файл lazarus-1.0-powerpc-macosx.dmg.
                                      0
                                      Так вот же вам для процессоров intel: lazarus-1.0-20120828-i386-macosx.dmg
                                        0
                                        Спасибо, поставил на попробовать
                                        Из первого, что бросилось в глаза — отсутствие пункта меню «настройки» на привычном месте (в меню самого приложения). Нашел только через пункт меню сервис -> параметры. Само окно настроек какое-то поплывшее
                                        В общем довольно приятное первое впечатление. Но шрифт monaco по умолчанию для кода — это конечно очень по-дельфийски, но глаз не радует
                                          0
                                          Увы, научить этот диалог подбирать ширину стандартными средствами невозможно. Прийдется вам его первый раз расширить. По поводу меню не на родном месте — да проблема известная и она присутствует в списке ошибок, но ее решение требует расширения свойств  TMenu и TMenuItem. При работе над cocoa бэкэндом обязательно будет решено.
                                            0
                                            TLayoutControl нужен вместо вороха отдельных компонентов типа TLabel, TPanel, TGroupBox, TPageControl, TSplitter и TScrollBox. И очень давно нужен…
                                              0
                                              В Lazarus есть очень продвинутый Anchor editor, но в данном случае даже он не поможет, так как на форму втсавляются фреймы, которые создаются по мере необходимости — выбрали узел в дереве — если фрейм был создан, то показываем, иначе создаем и показываем. Т.е. заранее без создания всех фреймов минимальную ширину не узнать, а увеличивать размер формы во время работы — не очень красиво :)
                                                0
                                                Наоборот, лучше уж ширина изменяется динамически. Во многих стандартных программах и их настройках высота меняется динамически, в зависимости от контента и никого это не смущает
                                                  +1
                                                  Постараемся к версии 1.2 эту проблему решить.
                                                  0
                                                  Очень красиво. Как минимум, красивее макинтоша с названием меток на поля…
                                                    0
                                                    Скриншота же, ох уж этот Swype…
                                        0
                                        Намучился я ставить компоненты, попробовал поставить CodeTyphon (этакая сборка lazarus), и там всё замечательно. Уже всё стоит и в полном комплекте.

                                        Only users with full accounts can post comments. Log in, please.