[linux-programlama] Re: Hangi dili kullanmalıyım

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Tue 21 Sep 2004 - 09:18:04 EEST


Selamlar...

> Bence bu konuda bir ön yargılı yaklaşıyorsunuz. Çağdaş C++
> derleyicilerinin optimizasyon becerileri ve 1999'dan bu yana uydukları
> standarttaki nesne modeli sayesinde söz konusu yavaşlamalar tarihe
> karışmıştır.

Sanki eskiden varmiydi ?

Eskiden, direct C++ derleyicileri yoktu. Bir preprocessor onu alir C'ye
tercume ederdi. Elbette burada uygulanan bazi kaliplarin verimsiz
olabilmesi ihtimal dahilindeydi. Bir diger sorunda her focus ( { ... }
araligi) icin yeni bir stack cercevesi olusturma derdiydi.

Guncel C++ derleyicileri dogrudan, C'ye tercume etmeden calisiyor. Boyle
olunca da daha optimize islevler mumkun oluyor. Gerci ayni sekilde
optimizasyon C uzerinde de mumkun..

> Ayrıca kişisel deneyimim, özellikle STL kullanarak yazılan kodların son
> derece iyi tasarlanmış C programlarından bile daha hızlı çalışabildiğini
> gösteriyor.

Son derece iyi tasarlanmis bir C programi, son derece iyi tasarlanmis
bir C++ programindan daha hizli calisir. Cunku,

curl_easy_setopt(curl_handler, CURLOPT_URL, "http://localhost");

C like bir cagri. Bunu C++'ya tercume ederseniz:

curl_handler.setopt(CURLOPT_URL, "http://localhost");

Sekline doner. Burada derleyici, curl_handler icin bir this pointeri ve
local vtbl'i olusturan bir structure kullanir. Bunun ardindan her tur
nesne cagrisi,

this->vtbl->member_call();
this->member_variable;

Sekline doner. Elbette, static member, virtual func. vs. hikayelerine
bagli olarak bu biraz degisebilir. Fakat,

this->vtbl->member_call();

cagrisi, this ile vtbl pointerlerinin toplanmasi, elde edilen sonucunda
tekrar member_call pointeri ile toplanmasi sonucu elde edilen bir
pointer olacaktir:

push parameter
mov bx, offset this
add bx, vtbl
add bx, member_call
call bx

Gibi ozetleyebilecegimiz bir assembly yapisi cikar. Gercek durum ise
biraz daha kotudur, yani bir kac opcode daha eklenir. Diger sekilde
yapilan cagrilarda ise:

push parameter
call function;

gibi daha kisa bir kod uretilir. Bu basitce (elbette tonla detay var
ama) hiz farkinin nereden geldigini gosterir.

Peki aralarindaki hiz farki ne olur. Devede kulaginin bir tuyu bir sey
cikar. Ama genel toplamda C (veya C++ ile yazilmis C Like kod) daha
hizli olacaktir.

Hiz farki bence ihmal edilebilir. Hemde gonul rahatligiyla..

> >yoksa C++ cok daha guvenlidir, C'ye gore. Programcinin hatalarini en aza
> >indirir. Sizi guvenli kod yazmaya zorlar. Buna ragmen C++ ile yazilmis
> >buyuk bir kernel yok. nedeni yukarida dedigim gibi.

Biraz myth'lere kaciyor :))

C++ daha guvenli degildir. C++ icin yapacaginiz modelleme calismasi ile
C icin yapacaginiz farklidir. OOP icin onemli olan, her nesnenin kendi
icinde belirgin bir izole state machine sunabilmesidir. Ama.

class:
   public:
      int i;

gibi bir seyle,

obj.i = 5;

gibi bir satir kullanmak sizi feci sekilde carpabilir. Tamam, SIGSEGV
yemezsiniz. Derleyici hic bir sey demez. Fakat, bu encapsulation
modeline aykiridir. Reusability icin bu "i" yi saklayacak, set_i, get_i
gibi fonksiyonlar tanimlayacaksiniz. Yoksa, sizde dahil birilerinin bir
gun

unsigned int x;

obj.i = x;

yazmasini engelleyemezsiniz. Bu gercekten tehlikeli ve ciddi bir
sorundur, ne olur ki "int" "uint" farkindan demeyin.

Google vs. gibi dizinlerde, oop mythleri hakkinda bolca dokuman
bulabilirsiniz..

OOP olayi ve C++ harbiden iyidir. Ama sihirli degnek degildir. C'de oyle
geek isi, thor'un cekici gibi bir seyde degildir. Her ikiside ayni
derecede zordur, gucludur. Ama hepsi o kadar. C++'yi "mukemmel" yapan
her sey C'yi "berbat" yapacaktir. Bakarsiniz, hangisi daha uygunsa o
ise, onu kullanirsiniz..

Saygi ve sevgiler..


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.