Şimdi Ara

kütüphaneler için binary kavramı nedir?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
11
Cevap
0
Favori
801
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba arkadaşlar
    C/C++ da lıbrary yani kütüphaneler için binary kavramı tam olarak nedir?
    açıklarsanız çok sevinirim



  • Binary derken?

    Derlenip objeye (.o) dönüşmüş olan kod dosyaları binary halindedir. Sonra bunlar paketlenir ve library (.lib, .a, .dll, .so) olur. Bundan mı bahsediyorsun?
  • Kutuphanelerden kastin baslik dosyalariysa onlarin binary ile bir iliskisi yok. Hic kutuphane kullanmadan da program yazabilirsin. Cunku kutuphanelerin icinde sadece fonksiyon, yapi ve siniflar vardir. Tabii makrolar ve bazi tanimlamalar da var ve bunlarin tek esprisi programciya kolaylik olsun diye hazirlanmis hazir kodlar olmasi. Kutuphane kullanmadigin durumda yapacagin her seyi tek tek tanimlanaman gerekir. Misal string kutuphanesini kullanmadan da pekala char pointer'lariyla string olusturabilirsin ama string kullanmak daha kolaydir.
    Burdan anlayacagin butun olay derleyicide bitiyor.

    if ( SART ) { 
    Olumluysa
    }
    else {
    Olumsuzsa
    }
    ------------------------------------
    if
    ( SART )
    {
    Olumluysa}else
    {
    Olumsuzsa
      }
    ------------------------------------
    if ( SART ) {
    Olumluysa
    }
    Olumsuzsa
    ------------------------------------
    if ( SART ) {Olumluysa} else {Olumsuzsa}
    ------------------------------------
    ( SART ) ? (Olumluysa) : (Olumsuzsa)

    Su orneklerin hepsi ayni isi yapar ve hepsi birbirinin aynidir. Yani kodunu hangi sekilde yazarsan yaz derleyici ayni sonucu verir. Bunun sebebi kodu derle dedikten sonra derleyicinin o kodu once optimize etmesidir. Misal if ornegi icin derleyiciyi yazan otorite bi takim testler yapip sistemde en cok randiman veren if tipini bulur. Ondan sonra derleyiciye "eleman nasil yazarsa yazsin sen butun if'leri suna cevir" der ve kodu oyle derler. Hayir ya benim yazdigim kodu kendi kafasina gore cevirmesin benim yazdigim sekilde derlensin diyorsan basina volatile keyword'unu yazarsin.

    Ustte baslik dosyalarinin binary ile iliskisi yok yazmistim, aslinda sadece baslik degil, C veya C++'ta yazilmis programin okuma/yazma haricinde binary ile iliskisi hic yoktur. Derleyici kodu binary'i degil, elektro_gadget'in bahsettigi .o uzantili dosyalarda yazan hex kodlarina, yani derlenen mimariye ait assembly komutlarinin karsiligina cevirir. Finalde hangi sistemde calisacaksa ona ozel calistirilabilir dosya formatina cevrilir. (ornek .exe)

    (.lib, .a, .dll, .so) dosya tipleriyle calistirilabilir dosya arasinda fark yok, tek fark tiklayinca calismiyor :)
    Bu sekilde dosyalar cogu zaman calistirilabilir dosyanin boyutu buyuk olmasin diye yazilir. Bazende ayni islemleri kullanacak birden fazla uygulamaya o islemleri tek tek yazmaktansa yeri geldiginde bak iste orda(.lib, .dll vs.) yaziyor demek icin yazilir.

    ---
    Yazmasam icim rahat etmiyecekti. Biri cikipta yeak yaa o dedigin gibi olmuyor demez umarim. Basit olsun diye oyle yazdim Yani mantigi bu sekilde desem daha iyi olur.



    < Bu mesaj bu kişi tarafından değiştirildi Maybe Tomorrow -- 13 Haziran 2013; 20:48:14 >




  • ayrıntılı cevaplarınız ve emekleriniz için teşekkür ederim arkadaşlar.
    Sorumun çıkış noktası hem çok faydalı hemde benim için baş belası olan BOOST kütüphane dosyaları...
    BOOST'un resmi sayfasındaki açıklamada 2 tür kullanımdan bahsedilmiş

    1- Header-Only Libraries
    Burada anladığım kadarıyla bir derleme yapmak gerekmiyor ve kütüphane dosyasını programıma eklemem yetiyor

    #include <boost/lambda/lambda.hpp>


    yazdığım programı şu şekilde derliyorum

    g++ -I /boost_1_53_0 ornek_kod.cpp -o ornek_kod

    buradaki 'kütüphane' sanırım arkadaşında bahsettiği başlık dosyası oluyor ve string.h da olduğu gibi sadece kütüphaneyi programıma eklemem yeterli oluyor

    2- Build Boost
    Burada bir örnek program içinde kullanmak istediğim

    #include <boost/regex.hpp>


    için şu ifade yer alıyor resmi sitede.

    quote:

    Programm uses the Boost.Regex library, which has a separetely-compiled binary component


    sorum benim burada adı geçen library ve binary dir.
    sonradan oluşturulan .so uzantılı dosyanın derleme esnasında programıma eklenmesi şu şekilde yapılıyor


    g++ -I /boost_1_53_0 ornek_kod.cpp -o ornek_kod /boost_1_53_0/stage/lib/libboost_reggex.so

    sorum bu iki farklı boost kütüphanesi neden teki direkt koda eklenirken diğerinde bu kadar zahmete giriyoruz. Aradaki fark nedir?



    < Bu mesaj bu kişi tarafından değiştirildi beterman -- 14 Haziran 2013; 9:40:01 >




  • İster sadece başlık olsun, ister derlenmiş olsun hepsi kütüphanedir.

    Eğer bu bir şablon (template) kütüphanesi ise derleyicinin kaynak kodunu görmesi gerekir. Bu yüzden kodlar derlenmeden başlık dosyası içinde servis edilir.

    Mesela STL nin neredeyse tamamı başlık dosyası şeklinde. Neden öyle olmak zorunda dersen birçok sebebi var ama en önemlileri %100 tip uyumu, %100 taşınabilirlik sağlamak, optimizasyonu maksimuma çıkarmak, derleme zamanında hesaplanabilen ifadeler yazabilmek vs. Örneğin vector tanımlarken;

    vector<Tür> nesne; şeklinde yazarız. Derleyici buradaki tür bildirimine bakar ve sanki sınıf o türle yazılmış gibi derler. Yani;

    template <typename T>
    class vector {
    T ob;
    ...
    };

    bildirimi şu şekle getirir.

    class vector {
    Tür ob;
    ...
    };

    Derleyicinin bunu yapabilmesi için kaynak kodu görmesi şart.

    Birde inline fonksiyonlar var. Derleyici fonksiyon çağrısını engellemek için fonksiyon kodunu direkt çağrıldığı yere açar. Bunu yapmak için de yine kodu görmesi şart. Fakat bu sadece optimizasyon amaçlı, şablonlar gibi gerekli değil.




  • elektro_gadget boost konusunda kalabilirsek anlamam daha kolay olcak sanırım.
    Boost tan benim anladığım programcıların işini kolaylaştırabilecek bir çok hazır kodu (kütüphaneyi) içermesidir.
    Bu kütüphane dosyaları bekledindiği gibi .hpp uzantılı olarak indiriliyor.
    Şu basit soruyu cevaplıyabilir misiniz?
    Neden bazı dosyaları sadece #include yoluyla koduma eklemem yeterliyken diğer dosyaları binary'e (.so yada .a uzantılı dosyalar) çevirmem ve bunları
    derleme esnasında linken yapmam gerekiyor ki?
    Soru şu şekilde de sorulabilirdi? Bir kütüphane dosyasını direkt programa eklememle link etmem arasındaki fark nereden geliyor?
  • Boost, stl veya Qt fark etmez. Hepsinin sınıf şablonları başlık dosyaları içerisinde durur, öyle olmak zorunda. Gerekliliğini açıklamaya çalıştım ama sanırım şablon konusuna hiç çalışmamışsın bu yüzden anlamakta zorlanıyorsun.

    Link işlemi her zaman gerekli ondan kaçış yok. Eğer kütüphane şablon şeklindeyse derleyici o şablona ve senin koduna göre tek kaynak kod üretir ve onu derler. Yani .hpp + .cpp -> class.cpp -> .o -> link (exe).

    Kütüphane derlenmiş ise iki obje dosyası bağlanır. derlenmiş.o + (seninkod.cpp -> seninkod.o) -> link.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • quote:

    Kütüphane derlenmiş ise iki obje dosyası bağlanır. derlenmiş.o + (seninkod.cpp -> seninkod.o) -> link.


    kütüphanenin derlenip derlenmemesi onun şablon olup olmamasına mı bağlı? Çünkü en başa bakarsak bir derlenmemiş birde derlenmiş 'kütüphane' dosyası sözkonusu...
  • quote:

    Orijinalden alıntı: beterman

    kütüphanenin derlenip derlenmemesi onun şablon olup olmamasına mı bağlı?

    Evet. Çünkü şablonlar adından da anlaşılacağı gibi tamamlanmış kod değildir, yani derlenmesi için gereken bütün bilgileri içermez.
  • quote:

    Orijinalden alıntı: beterman

    quote:

    Kütüphane derlenmiş ise iki obje dosyası bağlanır. derlenmiş.o + (seninkod.cpp -> seninkod.o) -> link.


    kütüphanenin derlenip derlenmemesi onun şablon olup olmamasına mı bağlı? Çünkü en başa bakarsak bir derlenmemiş birde derlenmiş 'kütüphane' dosyası sözkonusu...

    quote:

    Program uses the Boost.Regex library, which has a separetely-compiled binary component

    Kutuphane iceriginde ekstradan ayri olarak sistem icin onceden derlenmis bir bilesen bulundurur.
    Yada
    Boost.Regex kutuphanesi icerisindeki kutuphane ogelerinden bir tanesi daha onceden derlenmistir.

    Abi Turkce'ye cevirince anlamlar bile birbirine kayiyor, herhalde bu sekilde olmustur . Bu arada binary ile ilgili unuttugum cok onemli bir sey var. Ecnebiler final dosyalarina da binary diyolar.



    < Bu mesaj bu kişi tarafından değiştirildi Maybe Tomorrow -- 14 Haziran 2013; 21:00:13 >




  • quote:

    Boost.Regex kutuphanesi icerisindeki kutuphane ogelerinden bir tanesi daha onceden derlenmistir


    eger öyleyse bu kütüphaneyi kullanan bir programin derlenmesinde tekrar kütüphaneyi link etmeye gerek kaliyor mu?
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.