Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Очистка USES [D7, WinXP]


Страницы:   1 2 3 4 5 6

Stanislav ©   (2006-07-27 11:08:00) 

Можно ли каким-то образом автоматически из всех модулей проекта вычистить блок USES, т.е. убрать из него те модули которые нигде не используются


Stanislav   (2006-07-28 11:28:00) [41]

Плохиш ©   (28.07.06 10:47) [58]
Нужно внимательно читать ветку. с очисткой Uses помог Игорь Шевченко еще в самом начале.


tButton   (2006-07-28 11:16:00) [42]


> >> чудесное

"wonders never cease" (c) =)


@!!ex   (2006-07-28 10:59:00) [43]

>> чудесноеизбавление от лишних килобайтов веса.


Плохиш   (2006-07-28 10:47:00) [44]


> Stanislav ©   (28.07.06 10:10) [53]
> Я не говорю что из uses нужно удалять модули,

Я плякал. Сабж Пушкин за тебя написал?

> А говорю что ненужны в EXE части кода к которым по логике
> программы никогда не будет обращения

Ты бы хоть книжку какую про делфи почитал. Во всех вроде как описывается работа компилятора делфи и что он(компилятор) делает с неиспользуемым кодом. А то на ум приходит одно определение для таких как ты :-(


tButton   (2006-07-28 10:38:00) [45]


> что мы тут обсуждаем то?

чудесное избавление от лишних килобайтов веса.


@!!ex   (2006-07-28 10:30:00) [46]

Хм.. А если я обращаюсь к куску кода по адресу памяти? и если адрес выясняеться динамическ в процессе работы программы.
ИМХО не реально проанализировать.

Правда такие случаи редки, но все же имееют место.

P.S>
Автор, если прога все хорошо делает, что мы тут обсуждаем то?


Игорь Шевченко   (2006-07-28 10:21:00) [47]


> Как определить, что код не используеться?


Путем синтаксического и семантического анализа, чем, собстна, программа, приведенная по ссылке и занимается.


@!!ex   (2006-07-28 10:12:00) [48]

Хм... Еще раз.
Как определить, что код не используеться?


Stanislav   (2006-07-28 10:10:00) [49]

atruhin ©   (27.07.06 19:20) [49]
@!!ex ©   (27.07.06 19:24) [50]

Что вы приципились к initialization ?
Я не говорю что из uses нужно удалять модули,
А говорю что ненужны в EXE части кода к которым по логике программы никогда не будет обращения. Если в initialization есть код, то в exe к нему будет обращение, а если его нет, то его нет.


Stanislav   (2006-07-28 10:06:00) [50]

Сергей М. ©   (27.07.06 17:17) [47]

А я про что. Что в exe войдет целый класс. Но с классом понятно что если что-то из класса используется, то тянется весь класс, а если я ничего не использую, просто забыл убрать из uses модуль, то в exe войдут все классы которые имеются в этом модуле.


Игорь Шевченко   (2006-07-27 22:12:00) [51]

TUser ©   (27.07.06 18:01) [48]


> Нельзя этого делать, подключенные модули могут что-то делать
> "неявно" - в секциях initialization и finalization. Если
> просто удалить модули из которы ничего не вызывается - будут
> глюки.


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

atruhin ©   (27.07.06 19:20) [49]


> Если компилятор удалит этот модуль на который нет ссылок,
>  что будет?


Такие модули надо в dpr указывать в секции uses.

Сергей М. ©   (27.07.06 16:56) [42]


> В ЕХЕ нет никаких секций initialization


Строго говоря, все секции инциализации в порядке использования модулей, заносятся в таблицу, которую обрабатывает код из SysInit.pas и System.pas, но отдельной секции конечно нету.


@!!ex   (2006-07-27 19:24:00) [52]

>>Я не считаю, где я написал что его нужно исключить?

А если юнит такую секцию имеет, то его уже практически невозможно проанализировать.
А практически все большие юниты, которые как раз и занимают место имеют initialization или finalization.


atruhin   (2006-07-27 19:20:00) [53]

> Stanislav ©
Вот тебе пример из реального проекта.
Модуль
.....
initialization
 RegisterClass(TfrmObjectEditor);
end.

На класс TfrmObjectEditor в программе нет ни одной ссылки, но из БД считывается название редактора для данного класса и вызывается:
var
 FormClass : TPersistentClass;
 WinClass : TfrmAbstractChild;
begin
 Result := nil;
 FormClass := GetClass(ClassName);
 if Assigned(FormClass) then begin
   WinClass := TfrmAbstractChild(FormClass.NewInstance);
   (WinClass as ICreateObject).Init(ObjID, ParentID, TypeID, self);
   WinClass.Create(self);
   Result := (WinClass as ICreateObject);
 end;
Если компилятор удалит этот модуль на который нет ссылок, что будет?


TUser   (2006-07-27 18:01:00) [54]

Нельзя этого делать, подключенные модули могут что-то делать "неявно" - в секциях initialization и finalization. Если просто удалить модули из которы ничего не вызывается - будут глюки.


Сергей М.   (2006-07-27 17:17:00) [55]


> Stanislav


Тьфу ты, строго наоборот - не ошибаешься, это действительно так.
Пример ситуации я привел.


Сергей М.   (2006-07-27 17:09:00) [56]


> Stanislav ©   (27.07.06 17:00) [45]



> в EXE-шник включается часть кода, которая по логике программы
> никогда не выполнится


Ошибаешься.
Есть некий юнит, указанный в USES, в котором описан/реализован некий класс
В этом юните есть секция инициализации, в которой этот класс регистрируется.
При этом ни в одном другом юните того же проекта нет ни малейших намеков на обращение к этому классу.
Результат - код юнита в минимально необходимом объеме будет фигурировать в результирующем исп.модуле.


Stanislav   (2006-07-27 17:00:00) [57]

Сергей М. ©   (27.07.06 16:56) [42]
>>В ЕХЕ нет никаких секций initialization.
А я тебе прочто. Ты же сам спросил про то что было в 7 посте, вот я и ответил, а сейчас речь идет о EXE  и вопрос такой:
в EXE-шник включается часть кода, которая по логике программы никогда не выполнится, зачем ее туда включать, и там уже без разницы  Initialization, finalization и т.д.


Ketmar   (2006-07-27 16:59:00) [58]

вот инетерсно-то... особенно интересно (насчёт выкидывания кода), как определить, какие именно виртуальные методы выкинуть. и как быть, например, с кодоизвратами в VCL в таком случае?
я уж молчу о том, что выкидывание виртуальных методов напрочь несовместимо с пакетами...


Сергей М.   (2006-07-27 16:59:00) [59]


> Stanislav


Странно, что тебя не удивляет обязательное присутствие в ЕХЕ кода модуля System - в ран-тайм используется далеко не все, что имеется в этом юните.


Сергей М.   (2006-07-27 16:56:00) [60]


> Stanislav ©   (27.07.06 16:52) [41]


> Можно элементарно спрашивать "нужен ли вам модуль, в котором
> есть Initialization ".


Можно много еще чего спрашивать.
То что не спрошено самим Борландом, то ты можешь сам спросить - на то в IDE предусмотрена поддержка экспертов.


> разговор идет о exe


В ЕХЕ нет никаких секций initialization.
То что компилятор счел необходимым включить в результирующий код, то и будет присутствовать в ЕХЕ.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо