PDA

Tam Sürümünü Görmek İçin : hello world uygulaması


ozan
25/05/2004, 12:05
selam,

kafama bişi takıldı. c'de yazdığım hello world uygulaması 26 KB tutarken, visual basic 6'da yazılmış aynı program nasıl 16 KB oluyor? C ile yazılmış olanın daha küçük olmasını bekliyorum. Sonuçta konsoldan çalışıyor, vb ile yazılmış olansa windows app tarzında. sizce neden c'de yazılmış olan daha büyük olmuş olabilir?

teşekkürler..


vadumor
25/05/2004, 12:10
#include dan dolayi olabilir.. pencere felan windowsta hazır var ya direk çağırıyo ondan olsa gerek heralde..

niye bu kadar sorun oldu bu ?

kkriger mi yapcan demoscencimisin ?

ozan
25/05/2004, 13:24
bir arkadaş c, #include ile çağrılan başlık dosyalarının hepsini program dahil eder dedi(seninde dediğin gibi). bundan heralde.

sorun diil, merak ettim sadece, birden ilgimi çekti vb'nin dosyasının c'ninkinden küçük olması. :)

ozan
25/05/2004, 13:26
demoscene'ci diilim bu arada.. ama kkrieger manyak bişi.. :)

psikopat®
25/05/2004, 14:26
26 KB tutması mümkün değil. eğer içine gereksiz birçok şey eklemediysen 26 KB'dan çok daha az tutar.

ozgan
25/05/2004, 15:47
:d 11.3 K :d

psikopat®
25/05/2004, 15:56
sadece ekrana "Hello World" yazacak bir program 26KB tutmaz.

ozgan
25/05/2004, 16:06
Ben yazdim ve denedim. ->11.3K<- tuttu :) siz fazladan #include koymus olabilirseniz 26K tutabilir. sadece #include<stdio.h> koymaniz yetiyor..

ozan
25/05/2004, 17:24
sadece stdio.h dosyası include edilmiş durumda. sadece main ve printf fonksiyonu var. derleyici dev-c++.

Euclides
25/05/2004, 17:57
1...
Vb'de yazdığın "Meraba Televole" uygulaması 1.5MB büyüklüğünde içinde tüm vb komutlarının ve sistemlerini olduğu bir DLL dosyasına ihtiyaç duyar.Ki bu DLL dosyası default olarak windowsla beraber gelmediği için ektradan kurulması gerekir

Yani:
Vb ile yazdığın program 1.5MB+10kb büyüklüğündedir...
2...
bunun yarışmaları bile yapılıyor. 800B'da Pencere çıkartanlar var.(Asm ile)
yazdığın programın 26kb tutması doğal çünkü içinde onlarca gereksiz kod taşıyor şuan.Aslında 1kb tutmalıydı fakat c++ sağolsun :)

psikopat®
25/05/2004, 19:29
ozan, programı bi yazsana bakalım.

acehreli
25/05/2004, 21:03
Programin ne kadar buyuk olacaginin aslinda dille pek ilgisi yoktur.

Gereksiz eklenen basliklarin #include edilmesinin de programin boyunu arttiracagindan endiselenmeyin. Ornegin benim ortamimda gerekmese de <stdlib.h>i eklemek programin boyutunu degistirmedi. (Siz de deneyin! :) )

Cunku o basliklar icinde genelde kod bulunmaz; bulunan global bir kac nesne de derleyici ve/veya baglayici tarafindan programdan cikartildigi icin, gereksiz basliklar yalnizca kutukler arasi bagimliliklara ve derleme zamaninin artmasina neden olurlar.

Benim programim soyle:


#include <stdio.h>

int main()
{
printf("Hello world!\n");
return 0;
}


Ben bu programi RedHat 7.1 ortaminda gcc 3.2 ile olusturdugumda, programin buyuklugunu en az 2956, en cok da 1706561 bayt yapabiliyorum! :) Haksizlik olmasin diye programdaki 'symbol' bilgilerini cikartmak icin 'strip deneme' yaptigimda ise buyuk programin boyunu yine de 385800 bayttan daha kucuk yapamiyorum.

Kucuk program icin secenekler: -s
Buyuk program icin secenekler: -g -static

Seceneklerin anlamlari soyle:

-s: Program boyutunu kucultmeye calis

-g: Debug bilgisini de programa ekle

-static: Programin kullandigi kutuphaneleri de programa ekle. (Boyle yaptigimizda program .dll veya .so gibi dinamik kutuphanelere gerek duymadan tek basina calisabilir.)

Ayni programi bir de C++ derleyicisi ile denersem, sonuclar 3516 ile 1711020 bayt arasinda degisiyor! (Yine ayni secenekleri kullandim.)

Bir kere de iostream kutuphanesini kullanalim (Bu noktada Turkce'ye de donmek istiyorum; ne "hello"su! :) ):


#include <iostream>

int main()
{
std::cout << "Merhaba dunya!\n";
}


Bu durumda kucuk program 4888 bayt, buyuk program da 6066276 bayt oluyor! (Yuh! :) ) Ama strip yapinca biraz kuculuyor: 771960 bayt.

Ali

acehreli
25/05/2004, 21:11
Duzeltme: -Os yerine -s secenegini kullanmisim. :( (Tabii boylece yanlislikla -s secenegini de ogrenmis oldum :) ) Cunku asil -Os "program boyutunu kucultmeye calis" anlamina geliyor.

Oyle yapinca printf'li kucuk programin boyutu C'de 2940 bayta, C++'ta ise 3484 bayta dustu. cout'u kullanan C++ programini da 4864 bayta dusurebildim.

Ali

Euclides
26/05/2004, 01:20
Programin ne kadar buyuk olacaginin aslinda dille pek ilgisi yoktur.

"AHA sana Aksinin ispati" diyor ve senin min: 2940B 'de yazdigin programi nasm ile Mandrake 10.0 altinda 72B'la yazdigimi belirtiyor üstünede soruce code yolluyorum
(Asagidaki güzellik bana degil "Brian Raiter"'a aittir :))
(Not: Asagidaki programin ELF headeri yokmus gibi gözükebilir ama aslinda var..)
;; hello.asm: Copyright (C) 1999-2001 by Brian Raiter, under the GNU
;; General Public License (version 2 or later). No warranty.
;;
;; To build:
;; nasm -f bin -o hello hello.asm && chmod +x hello


BITS 32

org 0x68504000

db 0x7F, "ELF"
dd 1
dd 0
db 0
inc eax ; the program begins here,
push eax ; though these instructions
push dword 0x00030002 ; serve no purpose
xor eax, eax ; zero eax
lea edx, [byte eax + 13] ; 13 == size of output buffer
inc eax ; eax now equals 1
push eax ; 1 == the exit syscall no.
push dword 4 ; 4 == the write syscall no.
mov ecx, msgtext ; point ecx at output buffer
xchg eax, ebx ; 1 == stdout
done: pop eax ; set eax to the syscall no.
int 0x80 ; make the syscall
dec ebx ; 0 == successful exit code
jmp short done ; do next syscall
dw 1
msgtext: db 'hello, world', 10

;; This is how the file looks when it is read as an ELF header,
;; beginning at offset 0:
;;
;; e_ident: db 0x7F, "ELF" ; required
;; db 1 ; 1 = ELFCLASS32
;; db 0 ; (garbage)
;; db 0 ; (garbage)
;; db 0x00, 0x00, 0x00, 0x00, 0x00 ; (unused)
;; db 0x00, 0x40, 0x50, 0x68
;; e_type: dw 2 ; 2 = ET_EXE
;; e_machine: dw 3 ; 3 = EM_386
;; e_version: dd 0x508DC031 ; (garbage)
;; e_entry: dd 0x6850400D ; program starts here
;; e_phoff: dd 4 ; phdrs located here
;; e_shoff: dd 0x50402EB9 ; (garbage)
;; e_flags: dd 0xCD589368 ; (unused)
;; e_ehsize: dw 0x4B80 ; (garbage)
;; e_phentsize: dw 0xFAEB ; (garbage)
;; e_phnum: dw 1 ; one phdr in the table
;; e_shentsize: dw 0x6568 ; (garbage)
;; e_shnum: dw 0x6C6C ; (garbage)
;; e_shstrndx: dw 0x2C6F ; (garbage)
;;
;; This is how the file looks when it is read as a program header
;; table, beginning at offset 4:
;;
;; p_type: dd 1 ; 1 = PT_LOAD
;; p_offset: dd 0 ; read from top of file
;; p_vaddr: dd 0x68504000 ; load at this address
;; p_paddr: dd 0x00030002 ; (unused)
;; p_filesz: dd 0x508D30C1 ; a tad bit large ...
;; p_memsz: dd 0x6850400D ; also excessive
;; p_flags: dd 4 ; 4 = PF_R (no PF_X?)
;; p_align: dd 0x2EB9 ; (garbage)
;;
;; Note that the top three bytes of the file's origin (0x40 0x50 0x68)
;; translate to "inc eax", "push eax", and the first byte of "push
;; dword". Note also that the program begins at offset 13, which is
;; the same number as the size of the output buffer.
;;
;; The fields marked as unused are either specifically documented as
;; not being used, or not being used with 386-based implementations.
;; Some of the fields marked as containing garbage are not used when
;; loading and executing programs. Other fields containing garbage are
;; accepted because Linux currently doesn't examine then.

acehreli
26/05/2004, 02:18
Evet ama ayni programi ben yine assembly kullanarak ama cok daha kotu bir sekilde yazabilir ve sonucta cok buyuk bir program da olusturabilirim. (Boyle bir sey yapacak kadar assembly bilmiyorum tabii. :) ) Boylece program buyuklugunun dile bagli olmadigini gostermis olurum. Yani ikisi de assembly ile yazilmis degisik boylarda programlarimiz olur.

Senin de gosterdigin gibi, herhalde en kucuk programlar assembly ile elle yazilanlardir. Ama onlar da varolan kutuphaneleri kullanarak genelde daha da kucuk olabilirler herhalde. (Bu program icin demiyorum.)

Ayrica not: O program benim ortamimda 59 bayt olarak olusturuldu ama calistirinca 'Cannot allocate memory' hatasi verdi. nasm ve chmod Linux'ta da calisacagina inandirdi ama... (?)

Euclides
26/05/2004, 10:40
Ayrica not: O program benim ortamimda 59 bayt olarak olusturuldu ama calistirinca 'Cannot allocate memory' hatasi verdi. nasm ve chmod Linux'ta da calisacagina inandirdi ama... (?)
O program bir hatadan dolayı o kadar küçük olabiliyor.
Aynı programı normal halde yeniden yazdım.FAKAT 792B
Sanırım aşağıdaki sisteminizde çalışacaktır.

acehreli
26/05/2004, 20:07
Tesekkurler... Benim ortamimda 856 bayt oldu ve calisti; 'strip hello' yaptiktan sonra ise boyu 504 bayta dustu :)