Gönderen Konu: Linus'un mesajı  (Okunma sayısı 16501 defa)

Linus'un mesajı

« : 03.11.2011 13:04:13 »
Hızlı düğmeleri aç

endo

İleti: 687

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.moldibi.com
Abi bi hayli hardcore girmiş, Skate: hatırlıyor musun yıllar önce C'yi seviyorum ama C++'ı sevemedim gitti, sırtında "uyumluluk" isimli kocaman bi kamburu yıllardır taşıyor ve karmaşası giderek artıyor demiştim.. Sanırım benzer düşünceleri olan birini daha buldum :)

http://article.gmane.org/gmane.comp.version-control.git/57918

Tabii mesajı bu başlık altına atmam hoş oldu :)
- endo of glance -

Linus'un mesajı

« Yanıtla #1 : 03.11.2011 13:47:07 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
@endo: kardeşim şu anda aktif olarak iki dil kullanmaktayım.
 
C++/CLI (Managed C++)
ve
Native C++
 
ıkisi de yalnızca Windows hedefli şekilde. Zaten Native C++ kullandığım kısımlar DirectShow filtreleri, haliyle portability herhangi bir biçimde söz konusu değil.
 
Gelelim Ansi C'ye. şu anda içinde bulunduğum proje state'i için söylüyorum. "şEYTAN GÖRSÜN YÜZÜNÜ!!!". :) Ama bu arada yer yer inline Assembly kullandığımı da hatırlatırım. Yani;
 
Assembly
Ansi C
Native C++
Managed C++

böyle bir dörtlüden tek kullanmadığım Ansi C. :)
 
Gel gör ki C++ başımızı ağrıtıyor. 2-3 haftada geliştirdiğimiz bir bileşende çıkan bugları tamamen temizlemek bazen 1-2 haftamızı alabiliyor. Yani toplamda 1 ay sürüyor iş. Ansi C ile yazmaya kalksak 1-2 hafta hata temizlemeyle uğraşmadan 3-4 aya toparlardık halbuki işi. :)
 
Gelelim low level gerektiren yerlere. Mesela ekrandaki sittin tane pixel için pixel shader v.s. kullanmadan CPU tarafında bir işlem yapmak gerekiyor. Bu durumda kalkıp C++'ın compiler optimizasyonlarına güvenmiyorum. Ama Ansi C'ye de güvenmiyorum. Inline ASM ile işi bitiriyorum. Tabii her ihtimale karşı C++'dan yapılabilecek temel optimizasyonları yapılmış bir versiyonu da hazırlayıp performans testleri yapıyorum her iki durum için de. Sonuçta ASM'den yazdığımın daha performanslı çalıştığına ikna olursam bu versiyonu koruyorum. Eğer ciddi bir fark yaratmıyorsa projedeki kodların rahat okunabilirliği açısından C++ versiyonu kullanıyorum.
 
Topic de boşa gitmesin.
 
C=++ ne oldu ya? şu Plazma yayınlandıktan sonra (!) C=++ da artık yayınlansa. Hatta C=++'ın çıkış noktası olan Anatolian Governer vardı hani... Tabii tüm bunlar Glance'in yeni demosu için kodlamakta olduğun partlar... neyse çok yüklenmeyeyim Bilgem kardeşime (iyi ki de yüklenmedim). ;)

Linus'un mesajı

« Yanıtla #2 : 04.11.2011 00:45:39 »
Hızlı düğmeleri aç

endo

İleti: 687

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.moldibi.com
Burda abi biraz fazla abartılı konuşmuş tabii. O kadar katı düşünmüyorum ben.
Ama benim hep takıldığım konu, karmaşıklık. "Başka nasıl olacak ki?" ya da "Olmasa daha mı iyi" yeterli mazeretler değil ve dahası bence basitliğin/kolaylığın/optimizasyonun önündeki en büyük engel bu gibi düşünceler.
O yüzden C++ ve benzeri dillerdeki karmaşıklığın "gelişimin doğal bir sonucu" olduğuna katılmıyorum.
Bu tıpkı karekök 2'nin irrasyonel olduğunun ispatını ilk yapanların bunu 3-5 sayfalık karmaşık ve zor bir matematikle yapması karşısında pisagor'un 5-6 satırda ve ortaokul çocuğunun anlayacağı kadar basit matematikle yapabilmesi gibi.
Burada konu kriptik zorlamalarla kodun daha kısa yazılması değil, daha "basit", "yalın" ve "güzel" yazılması.
ışin dil ile ilgili olan kısmı ise, dilin bu yalınlığa izin verip vermemesi. C++ vermiyor :)
- endo of glance -

Linus'un mesajı

« Yanıtla #3 : 04.11.2011 02:15:10 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
linus bok yesin :)
 
birisine sadece "bu kutuphanede niye C sectiniz" sorusu yuzunden bu kadar saydirip, hem dile hem genel OO kavramlarina hem de Computer Science bilim dalina komple bu kadar giydirmek ne kadar muhendisce bilmiyorum.
 
ben su su su ozelliklerini tercih etmiyorum buradaki problem domain'e su yonlerden uymuyor desin canimi yesin. Ama "C++ leads to bad design decisions" gibi genel ifadeler kullanan adam ne dedigini bilmiyor demektir.
 
C++ bazi problem uzaylari icin en uygun dil, bunu secen onbinlerce muhendise ve programciya salak muamelesi yapmak carpik bi ozguvenden baska birsey olamaz.
 
sonucta diller arac, problemimize en uyan araci secmek bizim gorevimiz. degisik seviyelerdeki dillerin degisik problem turlerinde ne tip verimlilik farklari yarattigina dair yapilmis zilyon tane arastirma var (cogu IBM tarafindan). Linus acsin biraz yayin okusun
 
endo'cum senin ilgili tespitlerine saygiliyim ve bir kismina katiliyorum. cok advanced template meta-programming veya bazi boost yapilarini kullanmanin kriptik gorunen sonuclar yarattigina da katiliyorum. Fakat;
1- cogu is icin o kadar kriptik olmayan daha kolay okunabilir kodlar yazmak da mumkun
2- o kriptik ifadelerin bazilari hayvanlar gibi optimize edilebiliyor compiler tarafindan.
 
kisacasi begenmeyen kullanmasin kardesim :) ama kullanana da "siz salaksiniz" muhabbeti yapilmasin benim derdim o.

Linus'un mesajı

« Yanıtla #4 : 04.11.2011 07:45:06 »
Hızlı düğmeleri aç

coze

İleti: 238

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Kizdirmayin Linus amcami. Ya ordaki ifade "Niye C dilini sectiniz" gibi efendi bisi degil, BS filan demis lavuk, Linus'da agzinin payini vermis tabi. Ama tabi "C++ leads to bad design decisions" biraz talihsiz bir aciklama olmus, ama o da gaza geldigini farketmistir sonradan diye dusunuyorum.

Linus'un mesajı

« Yanıtla #5 : 04.11.2011 10:56:15 »
Hızlı düğmeleri aç

endo

İleti: 687

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.moldibi.com
hahahah! walla mesajı yazarken hem forumu biraz hareketlendireyim dedim, hem de acikcasi senden saglam bi cevap gelecegini biliyordum onu goreyim istedim :)
dediklerine katiliyorum, proje icin en uygun olan arac secilmeli, hersey icin en uygun dil diye birsey yok.
her zaman soylerim "genellemeler genelde yanlistirlar". linus'un yazisinda da fazla genel ifadeler var, belki ifadeyi daha guclu ya da sert kilmak icin kullanmistir.

"cogu is icin o kadar kriptik olmayan daha kolay okunabilir kodlar yazmak da mumkun"
maalesef bu konuyu "buyuk abiler" dahil kimse yeterince onemsemiyor, benim en cok kizdigim/takildigim  nokta da bu. maalesef dil de (c++) bu konu da pek yardimci olmuyor.
- endo of glance -

Linus'un mesajı

« Yanıtla #6 : 04.11.2011 13:53:11 »
Hızlı düğmeleri aç

ssg

İleti: 331

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
ben de c++'a bir turlu isinamadim. ms'teyken tamamen c++'ta yazdigim projeler de oldu. belki oradaki nahos tecrubemin de etkisi vardir. genel olarak hata yapmasi cok kolay ve o hatayi ayiklamasi zor bir dil. bir seyi yapmanin 50 yolu olmasi ve bu yollarin genelde birbiriyle pek uyumlu olmamasi (CString, std::string, char* vs) ayrica problem. c'de de durum cok farkli degil (open, fopen, _open vs) ama ebat olarak daha kucuk oldugundan ayni hataya dusme ihtimalin daha az.

linus'un argumanlarinda dikkate alinmasi gereken iki nokta var:

- "c++'in cektirdigi acilar". e bu dogru? compiler hatalarinin anlasilmazligi, name mangling'in yarattigi tamamen karmasik isimler, delete[] ile delete vs. tuzaklarla dolu bir dil.

- "abstraction oyuncaklari uzun vadede geri alinamaz yuke donusurler". linus'un siyah gordugu noktanin beyaz oldugu gibi gri taraflari da mevcut. ama bir gercek ki gelistirmede ilerleken kendi mezarini derinlestirmediginden surekli emin olman lazim. object-oriented cayirlarinda nese icinde kosarken evin yolunu bulamayacak kadar uzaklasmis olabiliyorsun. bu tabi ki c++'a degil oop her dile uyarlanabilecek bir konu.

bunun otesinde tahmin ediyorum ki linus kendine c++ ile yapabilecegi her seyi rahatca yapabildigi bir framework ve know-how birikimi yaratmistir. o yuzden verimlilik hakkinda kendisi acisindan hakli olabilir.

ayni thread'de enteresan argumanlar da sozkonusu bir tanesi var ki skate'i de destekliyor: hidden complexity. yazdigin kodun neye derleyecegini kestirmen c'ye kiyasla bir hayli guc. ozellikle stl kullanirken.

Linus'un mesajı

« Yanıtla #7 : 04.11.2011 15:07:43 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
aslında artık tek derdim yalnızca dil olmaktan da çıktı. cpu tarafında yapılan optimizasyonlar da artık beni aşıyor. yani compiler'ın ürettiği kodda bir tane no operation tarzı birşey görüp de "haha, salağa bak, gereksiz cycle harcamış" diye düşünüp bunu remove ediyorsun, bakıyorsun performans düşüyor. nedenmiş, çünkü onun amacı opcodeları belli bloklara align etmekmiş. bu tür modern cpuların sahip olduğu optimizasyonları tek tek inceleyip uygulayacak zamanım olmuyor. ama compilerlar elbette ki bunların çoğunu göz önünde bulunduruyor. ben de bilir bilmez ASM kodu yazıp, performansı kıyaslıyorum. tek derdim compiler'ın ne üreteceğini bilememek de değil aslında. zaten benim inline ASM kullandığım bölümlerde STL, boost gibi şeyler kullanılmıyor. pixel buffer içinde yapılan işlemler, efektler, analizler v.s. bol bol iç içe loop gerektirebilen çeşitli durumlar işte.

Linus'un mesajı

« Yanıtla #8 : 04.11.2011 20:35:05 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
delete ile delete[] aslinda enteresan bir konu. cunku ben onu C'den kalan array ile uyumluluk probleminin sonucu olarak gorurum. C++'i C gibi kullanan (her zaman hata olarak degil bazen kosullar geregi) insanlarin karsilasma olasiligi daha yuksek. Straustroup'un dedigi gibi RAII kullanirsa kisi bu tehlikelere dusmemeli. Yani ya array'leri classlara wrap etmeli ya STL container'i kullanmali falan filan.
 
Bence daha buyuk tehlike if (foo = bar) :)
 
C++'in problemi bence bu:
- dil cok guclu (hem ifade edebilecegi seyler, hem performans, hem olceklenebilirlik yonunden)
- dilin bu gucunu dogru kullanmak icin paketler halinde takip edilmesi gereken bazi idiom'lar var: Mesela value types + RAII + exception handling + STL + boost + single exe beraber kullanilmali. Ya da , COM + abstract factory'ler + no-exception (error codes) + multiple dlls + Dynamic Polymorphism beraber kullanilmali
- mesela herkes STL kullanir. ama exception handle etmez, RAII kullanmaz. Dolayisiyla kodlari zaten kafadan leak dolu olur.
- bu idiom paketlerini parcalayip kullanirsan iste o zaman aci cekiyorsun.
- Ve iste C++'in eksigi bu: bu idiom paketlerinin paket olarak kullanildigini verify etmiyor compiler sana.
- bu idiom'larin onemli bolumu hayli advanced konular, gercek dunyadaki pekcok programci bunlari dogru sekilde anlayip kullanamiyor. icinden programcilarin gelip gectigi sirketlerde de C++ codebase'leri maintain etmek bu yuzden zor oluyor.
 
Yani benim kanim sudur: C++ cok guclu bir dil. Bazi cok zor problemleri cozebilecek gucte iken biraz buyukce olan projelerde hala kullanilabilecek olceklendirilebilirlige sahip tek dil su anda. Bu problem uzayi zor bir uzay. Cozebilen baska alternatif dil de ahanda bakiniz yok. Yani C++'a baktigimizda zor bir problemi cozebilen tek alternatife bakiyoruz. Bu uzayin zorlugu yuzunden C++ da ustalasmasi zor bir dil.
 
Ayni olcekte reuse destekleyen ve ayni seviyede performansa compile edilebilen baska bir dil ortaya cikana kadar, isi bu uzayda problem cozmek olan programcilar C++'la aralarindaki sevgi-nefret iliskisini surdurmeye devam etmek durumunda :)

Linus'un mesajı

« Yanıtla #9 : 04.11.2011 22:27:05 »
Hızlı düğmeleri aç

ssg

İleti: 331

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
c uyumlulugu sevdasinin c++'a buyuk zarari verdigine ben de katiliyorum. ama c++ tabani uzerine bahsettigin idiomatic gruplar sadce felsefi boundary'lerle sinirli. platformun kendisi kisitlar saglamadigindan herkesin tekrar tekrar ayni pattern'lari kesfetmesi nefislerini tutmasi vs gerekiyor. yazilimcinin dusunsel yatirimi platforma degil gelistirecegi projeye gitmeli.

Linus'un mesajı

« Yanıtla #10 : 04.11.2011 23:18:36 »
Hızlı düğmeleri aç

nightlord

İleti: 1.085

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.nightnetwork.org
evet ben de ayni seyi soylemeye calismistim:
Alıntı
- Ve iste C++'in eksigi bu: bu idiom paketlerinin paket olarak kullanildigini verify etmiyor compiler sana.

Linus'un mesajı

« Yanıtla #11 : 05.11.2011 02:08:19 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
Aslında günümüzdeki en büyük sorunlardan biri C++'ı sıfırdan başlanmış bir projede yanlış kullanıyor olmak değil, bağımlı olunan SDK'lardaki tavsiye edilenin dışındaki kullanımlar neden oluyor. Yani belli bir sistematiğe sahip yazılım ekipleri, kendi uygulamalarını, kütüphanelerini, SDK'larını çok düzenli geliştirebilir ve C++'ın hedef olduğu eleştirilere gülüp geçebilirler. Ancak C++'dan şikayetçi olmakta haklı olan ekipler de var, şahsen de bu tür durumlara maruz kaldığım oldu.
 
En sık yaşanan durumlardan biri şu. Aynı SDK'nın içinde, bir fonksiyon char*, diğeri LPCSTR, bir diğeri LPCWSTR, ötekisi OLESTR istiyebiliyor. Hadi bu wrapper yazmaya alışık kişiler için hızlı aşılabilecek sorunlar ancak daha vahim kullanımlar da gördüğüm oldu. Mesela "char* filepath" tarzı bir parametre oluyor ve sen haliyle "c:\\hede\\hodo" bir input veriyorsun. Sonuç? File not found. Sebebi ise adam senden char* istiyor ama aslında unicode string girmen gerekiyor. Tabii ki Çince (!) dökümanda bundan bahsetmeyi unutmuş olabiliyorlar. :) Bunu geçiyorum, tersini de görüp epey şok olmuştum. Adam WCHAR ya da LPCWSTR gibi bir parametre bekliyor. Haliyle string'i unicode'a çevirip veriyorsun ve çalışmıyor. Ansi string'i unicode'a çevirmeden sadece pointer'ını cast edip verince çalışıyor.
 
Bunlar extreme durumlar ancak bunları yaşayınca insan "hay senin gibi..." diye birşeylere saydırmak istiyor. Ben SDK'yı yazanlara saydırmayı uygun görürken bazıları da dile saydırmayı tercih ediyor.
Yaşadığım ve hala tam mantığını anlayamadığım durumlardan biri de şu olmuştu. Bir SDK'da bir structure var. Atıyorum şöyle birşey;
 
Kod: [Seç]
struct Frame {
    DWORD width;
    DWORD height;
    ...
    BYTE data[1];
}

Sondaki data[1] dediği şey tüm frame datasını tutacak olan yer. SDK'nın kendi örnekleri bile memory access violation veriyor. Adam 1 byte olarak belirlediği yere kilobytelarca veri girmeye çalışıyor, hiçbir allocation olmadan. Doğrudan pointerına dayıyor veriyi. :) Nasıl oluyor bilmiyorum ancak merak edip denedim, Visual Studio 6'da bu bir biçimde çalışıyor. Yani çalışıyor derken safe biçimde çalışıyor anlamında değil ancak VC 6 runtimeları herhalde memory konusunda o kadar strict değilmiş ki program göçmüyor. Daha üst runtimelar böyle bir saçmalığa izin vermiyor. Elimle denemelik BYTE data[1] olan yeri BYTE data[20000] diye ortalama, en büyük paketi kapsayabilecek bir değerle değiştirdim ve yeni runtimelarla da çalıştı (tabii ki kalıcı bir çözüm olarak yapmadım bunu). ınsan kodları elinde olmadığı, direk lib'lerini linkleyerek kullandığı bir SDK'nın header dosyasını değiştirmek durumunda kalabilir mi? :)

Sonuç olarak C++'dan sıfırdan bir proje üretecekseniz ve bir bağımlılığınız olmayacaksa işiniz çok kolay. Ama başka birinin SDK'sına muhtaç durumdaysanız dua edin de o adamlar işini hakkıyla yapmış olsunlar.

Programcılığın dilden çok zor yanları genellikle şu şekildeki diyaloglarla benim hafızama kazınmıştır. Bu özel bir örnek değil, ilk aklıma gelen bu oldu.

- (birkaç gün kafayı sıyırdıktan sonra...) Ya cihaza komutları gönderiyorum, ilk komutu alıp diğerlerini almıyor. Komutların arasına biraz sleep koyduğumda alıyor. Dökümanda böyle bir durumdan bahsedilmemiş. Komutlar için bir queue mekanizmanız yok mudur? Ya da iki komut arası ne kadar beklemem lazım, ne önerirsiniz?
- 50-60 milisaniye kadar falan bekleyin... ya da 100.
- teşekkür ederim.

Ya da rekorlardan biri. Bir bug bulup, içime sinmeyen bir workaroundla çözdükten sonra firmanın teknik ekibiyle yazışmalarımdan bir kesit.

- Epey uğraştıktan sonra sorunun şurada olduğunu farkettim, şöyle bir workaroundla çözebildim. Ancak elbette ki bu geçici bir çözüm. Bu konuyu belki yeni SDK'nızda çözmüşsünüzdür diye öncelikle sizinle irtibata geçmek istedim. Bu konu yeni SDK'da çözüldü mü? Ya da bu sorunun çözümü için ne önerirsiniz?
- Bize örnek kodları gönderirseniz çözümü yeni SDK'mıza ekleriz.

şimdi söyleyin bana. C++'ın günahı ne? :D :D :D
« Son Düzenleme: 05.11.2011 02:16:27 Gönderen: skate »

Linus'un mesajı

« Yanıtla #12 : 05.11.2011 02:18:55 »
Hızlı düğmeleri aç

gibraltar

İleti: 122

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
Zamanında Minix vs Linux kapışmasında da A.S. Tanenbaum'a acayip laflar etmişti. Dolayısıyla bu Linus Torvalds'ın ilk vukuatı değil. Yalnız Linux'un dünya için ne ifade ettiğini düşünürseniz, Torvalds'ın bir mega ego taşıyor olma olasılığının da düşük olmadığını anlarsınız. En nihayetinde bu bedava bir projeydi ve getirisinin en azından geliştiricisinin egosuna bir kaç bin experience puanı olması kaçınılmazdı (Kurumsal Linux destek işleriyle uğraşarak yıllar sonra Linux Foundation üzerinden biraz para kazanabilmişlerdi sanki).

Dil savaşlarını hep anlamsız bulmuşumdur. Zira ben istediğim *süpersonik araç gerece ulaşabildikten sonra başkasının kullandığı **dandik araç gerecin durumu beni neden ilgilendirsin ki? Gerçi C++ için OOP'un yer yer karmaşıklaşabildiğini ***- protected abstract virtual base pure virtual private destructor- kabul etmem gerek :) Nakış gibi işlenen cici - python, ruby - dillerin yanında bu sert mahalle ağızları cidden can sıkıcı. Lakin nightlord'un da dediği gibi hem c gibi hızlı olsun, hem bilmem neyin obje modelini de şey ettirebilelim dediğimizde akla yatkın başka ne kullanılabilir ki? Bu soruyu yalnızca dil özellikleri bakımından değil; yetişmiş eleman, tecrübe ve kod tabanı birikimi bakımından da irdelemek lazım gelir düşüncesindeyim.

*, ** bana göre
*** Tom Cargill

Ek edit:Tanenbaum–Torvalds debate
« Son Düzenleme: 05.11.2011 02:27:02 Gönderen: ray »
Bilgehan Korkmaz