Показать сообщение отдельно

  #6  
Старый 01.03.2007, 13:57
taha
Постоянный
Регистрация: 20.08.2006
Сообщений: 327
Провел на форуме:
2472378

Репутация: 1077
По умолчанию

Цитата:
Delphi - сосет!
C++ - рулит!
бред
nc.STRIEM каждому своё

незя сравнивать Delphi и C, это разные вещи! Дельфи это среда, С это язык. У каждого свои особенности и недостатки.

по поводу веса Delphi есть замечательная стать Hex'a (читайте кому не лень)

Код:
Размышления на тему Delphi...  
Автор: Hex
   Много раз возникал вопрос "Почему exe, сделаные в делфи, такие большие?" Щас отвечу и все будет ясно.

 
   Сделаем такой примерчик: 
Поцепим на форму один Memo и одну кнопку. Напишем такой код: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
Asm 
int 3 
end; 
memo1.Lines.savetoFile('hz.txt'); 
end; 

Я поставил int 3 чтоб было легко найти то место, где будет вызваться memo1.Lines.savetoFile. 
Запускаем нашу супер прогу. Делаем bpint 3. Жмем на нашу единственную кнопку. Попадем в айс. Сменим eip на адрес следующей команды. На жеж не надо чтоб int 3 выполнилось. И пройдем до адреса 44FC41. Увидим такое: 

EAX=00BC3544 EBX=00BC3604 ECX=004284A8 EDX=0044FC50 ESI=00BC1A18 
EDI=0068F4AC EBP=0068F470 ESP=0068F330 EIP=0044FC41 o d I s z a P c 
CS=015F DS=0167 SS=0167 ES=0167 FS=0F3F GS=0000 DS:00BC3544=00427080 
-----PROJECT1!CODE+0004EC50-----------------------byte--------------PROT---(0)-- 

0167:0044FC50 68 7A 2E 74 78 74 00 00-55 8B EC 33 C0 55 68 7D hz.txt..U..3.Uh}^ 
-------------------------------------------------------------------------PROT32- 
015F:0044FC2F INT 3 
015F:0044FC30 MOV EAX,[ESI+000002F0] 
015F:0044FC36 MOV EAX,[EAX+00000220] 
015F:0044FC3C MOV EDX,0044FC50 
015F:0044FC41 MOV ECX,[EAX] 
015F:0044FC43 CALL [ECX+74] 

В edx лежит адрес строки 'hz.txt'. Больше тут смотреть неначто. 

Теперь сделаем из нашего кода вот такую вещь: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
Asm 
int 3 
end; 
memo1.Lines.LoadfromFile('hz.txt'); 
end; 

При вызове этого мы в айсе увидим следующее: 

EAX=00BC3544 EBX=00BC3604 ECX=00427080 EDX=0044FC4C ESI=004283A4 
EDI=0068F4AC EBP=0068F470 ESP=0068F334 EIP=0044FC40 o d I s z a P c 
CS=015F DS=0167 SS=0167 ES=0167 FS=3D37 GS=0000 DS:004270E8=00414ECC 
-----PROJECT1!CODE+0004EC4C-----------------------byte--------------PROT---(0)-- 
0167:0044FC4C 68 7A 2E 74 78 74 00 00-55 8B EC 33 C0 55 68 79 hz.txt..U..3.Uhy^ 
-------------------------------------------------------------------------PROT32- 
015F:0044FC2C INT 3 
015F:0044FC2D MOV EAX,[EAX+000002F0] 
015F:0044FC33 MOV EAX,[EAX+00000220] 
015F:0044FC39 MOV EDX,0044FC4C 
015F:0044FC3E MOV ECX,[EAX] 
015F:0044FC40 CALL [ECX+68] 

Один интересный момент! В принципе тут все одинаково с предидущим кодом. Только изменился адрес строки и значение ECX, а также теперь идет CALL [ECX+68], вместо CALL [ECX+74]... А теперь делаем такую подлость: удаляем для чистоты эксперимента файл "hz.txt". Запускаем прогу, где у нас идет 
memo1.Lines.LoadfromFile('hz.txt'); 
И когда дойдем до 
015F:0044FC40 CALL [ECX+68] 
изменим его на 
015F:0044FC40 CALL [ECX+74] 
И выполним. 
Ну как? нравится? был создан hz.txt! Т.е. выполнилась 
memo1.Lines.savetoFile('hz.txt'); 

Вот так-то! При компиляции exe файлов делфи пихает все процедуры и свойства юзаемых компонентов даже если они не юзаются. Благодаря этому файлы временами имеют гигантские размеры. 
Какие можно сделать выводы? Програмировать надо на СИ, потому что там оно лишнего не вставляет. Или писать все на апи. Правда тогда от делфи останется тока синтаксис. Но главное я считаю не в этом :) Главное - это то, что демки написанные на делфи, это выходит далекоооо не демки :) Надо тока постараться, там уже все есть, только дописать отсталось :)
по поводу Си - он конечно хорош, но лично я предпочиаю MASM. Си тоже макро-ассемблер, только уж очень макро.

[ADD]
кста борландский си, тоже самое что и Delphi и вес один и дизасм почти тот же (только сигнатуры Иды дают понять что это разные вещи =))) ).

Последний раз редактировалось TAHA; 01.03.2007 в 14:06..