Arama

Makine Dili

Güncelleme: 5 Mart 2007 Gösterim: 11.855 Cevap: 1
Misafir - avatarı
Misafir
Ziyaretçi
5 Mart 2007       Mesaj #1
Misafir - avatarı
Ziyaretçi
Makine Dili
Her bilgisayarın anlayacağı kendi makine dili vardır. Örneğin, Pentium işlemcinin makine dili, Sparc işlemciden farklıdır. Makine dilindeki bir komut, bit (0 ya da 1) gruplarından oluşur. Örneğin, makine dilinin bir komutu iki değerin toplanması ya da bir değerin ana belleğin bir bölgesinde saklanması gibi basit işlemleri içerir. İnsanların makine dilinde program yazması hemen hemen olanaksızdır. Örneğin, makine dilinde iki sayının toplanması,
Sponsorlu Bağlantılar
01000110011101000111101010000010010101101000010
biçiminde ifade edilir.

Makine dili mikroişlemci ya da mikrodenetleyici gibi komut işleme yeteneğine sahip entegrelerin işleyebilecekleri komutlardan ve buna uygun söz diziminden oluşan dile verilen addır. Makine dili, işlemcinin verilen komutlar doğrultusunda çalıştırılmasını sağlayan ve işlemci mimarisine göre değişen en alt seviyedeki programlama dilidir. Bu dil sadece 0 ve 1 binary ikililerinin anlamlı kombinasyonlarından meydana gelmektedir. Bu nedenle, makine dilinin anlaşılması çok güçtür. 0 ve 1 ikilileri işlemcinin instruction seti doğrultusunda işleme (process) uygulanacak operasyon, operasyonun gerçekleştirileceği verinin hafızada bulunduğu adres ve hafızaya ulaşım yolları gibi bilgileri ifade edecek şekilde biraraya gelmekte ve işlemci tarafından decode edilerek gerekli işlemin yerine getirilmesi sağlanmaktadır. Diğer proglamlama dillerin gerektirdiği derleyici ya da yorumlayıcı kullanımını gerektirmediğinden ve donanımı doğrudan kontrol etme gücü olduğundan kullanılır.
Kullanılan işlemcinin komut setinden ibaret olan makina dili komutları donanıma bağımlıdır. Günümüzde kullanılan i386 (32bit intel) ve i486 gibi işlemci standartlarının herbirine ait birer komut seti bulunmaktadır ve bu komut seti yalnız o mimariye yöneliktir. Bunun temelinde yatan asıl sebep işlemcinin hafıza birimi üzerinden okuduğu bir veri parçasının (bir ya da birkaç bayt) işlemciye bir emir teşkil edicek bir ifade olabilmesi için bu veri parçasının işlemci üzerinde donanımsal olarak bir işleme karşılık gelmesi gerekliliğinden kaynaklanır.
Örneğin: 1 0011 0111 gibi 9 bitlik bir wordu düşünecek olursak burada sol baştaki 1 biti indirect adresleme yapıldığını, bu bitten sonraki 4 bit olan 0011 çarpma işleminin yapılması gerektiğini geriye kalan 4 bit 0111 ise hafızanın 0111 adresine gidilmesi gerektiğini belirtebilmektedir. Bu düzen tabi ki farklı işlemci mimarileri için farklı olacaktır.

Assembly Dili
Assembly programlama dili, çoğu zaman özel alanlarda geliştirilen programlarda kullanılan alt düzel bir Programlama dili olarak tanımlanır. Bu dilin komutları, bilgisayarın doğrudan işlettiği makine dili komutlarının birebir karşı lığıdır. Bu nedenle bu dil için makine dili de denilebilir.
Her ne kadar uzman programcıların özel alanlarda kullandığı bir dil olarak tanımlansa da, programcılar istedikleri takdirde her türlü uygulamayı bu dil ile geliştirebilirler yada kullandıkları üst düzey dil altından çağırabilecekler i procedurler yazabilirler. Çünkü hemen hemen her dilde Assembly için destek bulunmaktadır.
Dilin en büyük avantajı CPU çevrebirimlerinin ve ana belleğin çok iyi bir şekilde kontrolünü sağlamasıdır. Ayrıca işletim sistem fonksiyonlarını da çok kolaylıkla kullanmak mümkündür. Assembly program dili derleyicisi kullanılan komutların birebir makine dili karşılıklarını üretir. Bu nedenle bu dil ile oluşturulan programlar olabilecek en kısa programlar olurlar.
Bir Assembly programı çalışabilir bir programın tüm kesimlerinin tam olarak tanıtılması ile oluşturulabilir. Bu nedenle bir Assembly programda minimum üç ana kesim bulunmalıdır.

Yüksek Seviyeli Programlama Dilleri
Makine dilinde çok sayıda komutla yapılabilecek bir iş, yüksek seviyeli programlama dilinin bir komutu ile yapılabilir. Bu yüksek seviyeli diller, İngilizce ya da Türkçe gibi doğal bir dil değil, kendi yapısı ve dilbilgisi kuralları olan, insanlar için anlaşılması kolay olan dillerdir.
Yüksek seviyeli programlama dilinde yazılan bir program, derleyici (compiler) dediğimiz yazılımlar tarafından, makine dilindeki denk bir programa dönüştürülür. Bilgisayar tarafından çalıştırılacak olan program, makine dilindeki programdır. Bazı yüksek seviyeli programlama dilleri arasında Pascal, Fortran, Basic, C, C++, Cobol, Lisp ve Prolog sayılabilir. Bu dillerin birkaçında, iki sayının toplanması şöyle ifade edilir:
C:=A+B; (Pascal)
C=A+B; ( C )
C=A+B (Fortran)
Bazen yüksek seviyeli programlama dilinde yazılmış bir program, makine diline çevrilmek yerine başka bir ara dile çevrilebilir. Bu ara dildeki komutlar, hiçbir makineye bağımlı değildir. Bu ara dildeki programlar, o dilin yorumlayıcısı (interpreter) olarak bilinen yazılımlar tarafından çalıştırılır. Bunun amacı, ara dildeki programların değişik bilgisayarlarda hiçbir değişikliğe uğramadan kullanılabilmesidir.


x
KisukE UraharA - avatarı
KisukE UraharA
VIP !..............!
5 Mart 2007       Mesaj #2
KisukE UraharA - avatarı
VIP !..............!
Sembolik makina diline ihtiyacınız var mı? Aslında, her ne yapıyorsanız bölmek istemem, ama burada zor kazanılmış tecrübelerin sonucu olarak bazı tavsiyelerde bulunacağım.
Artılar ve Eksiler
Sponsorlu Bağlantılar
Sembolik makina dilinin (Assembly) avantajları
Sembolik makina dili (Assembly) pekçok düşük seviyeli şeyi ifade edebilir:
  • makinaya bağlı yazmaç ve Giriş/Çıkışlara (I/O) erileşilirsiniz
  • çoklu yazılım parçalarının ya da donanım aygıtlarının ölümcül kilitlenmesini içeren kritik bölümlere özgü kod davranışlarını kontrol edebilirsiniz.
  • alışıldık derleyicinizin herkesçe kabul görmüş kurallarını kırabilirsiniz, ki bu da bazı eniyilemelere izin vermektedir (bellek tahsisiyle, evrelerle (threading), çağrı kurallarıyla ilgili kuralları geçici olarak kırmak gibi).
  • kod parçaları arasında, uygun olmayan (örn. değişik derleyiciler tarafından üretilen veya düşük seviye arayüzlerle ayrılan) kurallar kullanarak arayüzler tasarlayabilirsiniz.
  • işlemcinizin alışılmadık programlama kiplerine erişebilirsiniz (örn. açılış arayüzü için 16 bitlik kip, aygıt yazılımları, Intel bilgisayarlardaki kalıtsal kodlar).
  • kötü ve eniyileme yapmayan derleyicilerle uyumlu çalışacak sıkı döngüler için oldukça hızlı kodlar üretebilirsiniz. (Ancak, eniyileme yapabilen özgür derleyiciler var!)
  • her ne kadar başka herhangi birininkine ait olmayacak olsa da, size özel aygıt ayarlarınız için el ile eniyilenmiş mükemmel bir kod üretebilirsiniz
  • yeni dilinizin eniyileme yapabilen derleyicisi için bir kod yazabilirsiniz (bu, çok azımızın yapacağı ve hatta pek de sıklıkla yapmayacağı bir iştir).
  • örn. kendi kodunuzu tamamiyle kontrol altına alabilirsiniz
Sembolik makina dilinin (Assembly) dezavantajları
Sembolik makina dili, oldukça düşük seviyeli bir dildir (bundan daha aşağıda ikilik komutları el ile kodlamak bulunmaktadır). Bu da şu manalara gelmektedir:
  • ilk başlarda yazmak, oldukça uzun ve can sıkıcıdır
  • hata yapmaya oldukça meyillidir
  • hatalarınızı takip etmek oldukça zor olabilir
  • kodunuzu anlamak ve değiştirmek oldukça zordur, örn. bakımını yapmak
  • sonuç, şu anda veya gelecekte var olacak mimarilere taşınabilir değildir
  • kodunuz aynı mimarinin sadece belli bir gerçekleştirimi için eniyilenecektir: mesela, Intel uyumlu platformlar arasında, herbir CPU tasarımı ve türevi (işlemci birimlerinin nispi gecikme süresi, üretilen iş (through-output) ve kapasitesi, önbellekler (cache), RAM, taşıt (bus), diskler, FPU, MMX, 3DNOW, SIMD uzantılarının varlıkları, v.b.) tamamiyle farklı eniyileme tekniklerini ifade etmektedir. İşlemci (CPU) tasarımları halihazırda şunları içermektedir: Intel 386, 486, Pentium, PPro, PII, PIII, PIV; Cyrix 5x86, 6x86, M2; AMD K5, K6 (K6-2, K6-III), K7 (Athlon, Duron). Yeni tasarımlar yukarılara doğru tırmanmayı sürdürmektedir, dolayısıyle ne bu listenin ne de kodunuzun güncel kalacağını ummayın.
  • çok az bir ayrıntı üzerinde fazlaca zaman harcarsınız, hızlanmanın büyük kısmını oluşturan küçük ve geniş algoritmik tasarımlar üzerine odaklanamazsınız (örn. liste/diziler üzerinde değişikler yapan hızlı ve ilkel nesneler oluşturmak için çokça zaman harcayabilirsiniz; oysa sadece hesaba dayalı bir adresleme (hash) tablosu veya başka bir yaklaşımda ikilik ağaç ya da pekçok CPU kümesine dağıtılmış olan yüksek seviyeli bir yapı programınızı çok daha hızlandırırdı).
  • algoritmik tasarımınızdaki ufak bir değiliklik var olan sembolik makina kodunuzu tamamiyle geçersiz hale getirebilir. Bu durumda ya tamamen tekrar yazmaya (yazabilemeye) hazırsınızdır veya belirli bir algoritmik tasarımı yapmaktan sıkılmışsınızdır.
  • Standart karşılaştırmalı değerlendirmeden (benchmark) uzak olmayan kod üzerinde, eniyileme yapan ticari derleyiciler elle kodlanmış sembolik makina dili gerçekleştirirler (aslında, RISC mimarisine göre bu durum x86 mimarisi üzerinde daha az geçerlidir ve belki de geniş bir şekilde bulunan/kullanılan derleyiciler için de daha az doğrudur; herneyse, tipik bir C kodu için GCC oldukça iyidir);
  • Ve her durumda, comp.compilers'da bulunan yönetici John Levine'nin dediği gibi,
    "derleyiciler karmaşık veri yapılarının kullanımını oldukça kolay
    hale getirmektedir ve derleyiciler işin yarısından sonra sıkılmamakta
    ve güvenilir oldukça güzel kodlar üretmektedir."

    Prosedür ve modül sınırları arasında kodu eniyilerken, aynı zamanda da tüm (büyük) program boyunca düzgün biçimde kod dönüşümleri üreteceklerdir.
Değerlendirme
Tüm bunlardan sonra, sembolik makina dili kullanmanın bir ihtiyaç olduğunu düşünebilirsiniz ve hatta ihtiyaç olmadığı bazı yerlerde kullanmak çok da faydalı olabilir. Şunları yapmak isteyeceksiniz:
  • sembolik makina dilinin kullanımını küçültmek
  • iyi tanımlanmış arayüzler içine bu kodları koymak (encapsulate)
  • sembolik makine dili dışında yüksek seviyeli dillerle tanımlanmış yapılar tarafından sembolik makine dili kodunuzun otomatik üretilmesi (örn. GCC satıriçi (inline) makrolar)
  • bu programları otomatik araçların sembolik makine dili koduna dönüştürmesi
  • bu kodun eğer mümkünse eniyilenmesi
  • yukarıdakilerin tümü, örn. bir derleyici (ya da derleyiciye bir eklenti) arka ucu (back-end)
Sembolik makina diline gerek duyulsa (örn. İşletim sistemi geliştirmek) bile, yukarıdakilerin çok daha fazlasına gerek duyulmayacağını göreceksiniz ve de üstteki prensipler de varlığını koruyacaktır.
Bununla ilgili olarak Linux çekirdek kaynaklarına bakınız: ne kadar az sembolik makina diline gerek duyulursa, neticesinde hızlı, güvenilir, taşınabilir ve sürdürülebilir işletim sistemi oluşmaktadır. Hatta DOOM gibi başarılı bir oyun dahi yoğun şekilde C ile yazılmıştır, sadece küçük bir kısmı hızı arttırmak için sembolik makine dili ile yazılmıştır.
Sembolik makina dili nasıl kullanılmaz
Başarılı kodu gerçeklemek için adımlar
comp.compilers'daki Charles Fiterman'ın bilgisayara karşın insanın ürettiği sembolik makina kodlarıyla ilgili söylediği gibi:
İnsanoğlu her zaman kazanmak zorundadır ve işte bu da nedenidir.

Birincisi insanoğlu herşeyi yüksek seviyeli dilde yazar.
İkincisi üzerinde zaman harcadığı sıcak noktaları bulacak
şekilde programın taslağını hazırlar.
Üçüncüsü elinde bu kısımlar için derleyicinin ürettiği kod vardır.
Dördüncüsü makina kodu üzerinde ufak gelişmeler sağlayarak onlara
bir canlılık kazandırabilir.


İnsanoğlu kazanır çünkü makinaları kullanabilmektedir.


Eniyileme yapan derleyiciler ile dilleri
Diğerleri arasında ObjectiveCAML, SML, CommonLISP, Scheme, ADA, Pascal, C, C++ gibi dillerin programınızın şişkinliğini eniyileyecek özgür derleyicileri vardır ve genellikle, sıkı döngüler için bile elle yazılmış sembolik makina kodundan daha iyisini üretirler, bu arada da daha yüksek seviyeli ayrıntılar üzerinde odaklanmanızı sağlarlar ve de belli bir kararlı düzeye geldikten sonra da yukarıda bahsedilen şekilde belli miktar başarıma el koymanızı yasaklamazlar. Elbette, bu dillerin çoğu için eniyileme yapan ticari derleyiciler de vardır!
Bazı diller C kodu üreten ve sonrasında eniyilemesini C derleyicisine yaptıran derleyicilere sahiptir: LISP, Scheme, Perl ve diğer pekçoğu. Hız oldukça iyidir.
Kodunuzu hızlandıracak için genel adımlar
Kodunuzun hızlı çalışmasını sağlamak için, analiz araçlarından birinin kodunuzun belli bir yerini sürekli bir performans darboğazı olarak tanımlaması gerekmektedir.
Bu nedenle, bir kod parçasını çok yavaş olarak tanımladıktan sonra, şunları yapmalısınız:
  • öncelikle daha iyi bir algoritma kullanmaya çalışın;
  • yorumlamak yerine onu derleyin;
  • daha sonra derleyicinizdeki eniyilemeyi etkinleştirip onunla oynayın
  • daha sonra derleyiciye nasıl eniyileme yapacağına dair ipuçları verin (LISP'de bilgi girmek; GCC ile yazmaç kullanmak; pekçok derleyicideki seçenekler, v.b)
  • bundan sonra ancak son çare sembolik makina dilidir.
Son olarak, sembolik makina diliyle yazmayı bitirmeden önce, üretilen kodu incelemelisiniz, problemin gerçekten de kötü kod üretiminden kaynaklandığını görmelisiniz, ki bu herzaman sanılan durum olmayabilir: derleyicinin ürettiği kod sizin yazdığından daha iyi olabilir, özellikle modern çoklu ardışık düzen (multi-pipelined) mimarilerinde! Programın yavaş olan kısımları esas olarak böyle olabilir. Hızlı işlemcili modern mimarilerde temel sorun, bellek erişim gecikmeleri, önbellek atlamaları, TLB (TLB-misses) kayıpları ve sayfa hatalarından kaynaklanmaktadır; yazmaç kullanımı gereksiz olmaktadır ve veri yapılarını daha kazançlı bir şekilde ve bellek erişimini daha iyi yapmanın yollarını tekrar düşüneceksiniz. Belki de tamamen farklı bir yaklaşım sorunun çözümüne yardımcı olabilir.
Derleyicinin ürettiği kodu incelemek
Derleyicinin ürettiği kodu incelemek için pek çok neden vardır. İşte size bu kodla neler yapacağınız:
  • üretilen kodun el yordamıyla geliştirilip geliştirilemeyeceğini kontrol edin (veya derleyici seçenekleriyle oynayarak)
  • durum böyle ise, o zaman üretilmiş kod ile başlayın, onu yeniden yazmak yerine değiştirin
  • genel olarak, dış dünyaya karşı sizin sembolik makine rutinlerinizi anlayan üretilen kodu değişiklik yapmak için bir yama gibi kullanın
  • derleyicinizdeki hataları takip edin (tahminim en az sıklıkla)
Sembolik makina dilinizin oluşması için standart yol derleyicinizi -S parametresiyle çalıştırmaktır. Bu, GCC C derleyicisini de içeren (GCC) pekçok Unix derleyicinde çalışmaktadır. GCC'ye gelince, -fverbose-asm komut satırı parametresiyle çok daha anlaşılabilir sembolik makina kodları üretecektir. Elbette, iyi sembolik makina kodu elde etmek istiyorsanız, herzamanki eniyileme seçeneklerinizi ve ipuçlarını unutmayınız!
Linux ve Assembly
Muhtemelen farkettiğiniz üzere, genel olarak, Linux programlamada sembolik makine dilini kullanmaya ihtiyaç duymazsınız. DOS'takinin aksine, Linux sürücülerini sembolik makine dili ile yazmanız zorunlu değildir (aslında, eğer gerçekten istiyorsanız yapabilirsiniz). Ve günümüzün eniyileme yapan derleyicileriyle, farklı işlemcilerdeki hızı dikkate alıyorsanız, C ile yazmak çok daha basittir. Yine de, bunu okuyorsanız, C/C++ yerine sembolik makine dili kullanmak için bir nedeniniz olabilir.
Sembolik makine dilini kullanmak ihtiyacında olabilirsiniz veya sadece kullanmak isteyebilirsiniz. Kısaca, sembolik makine dili krallığına dalmaktaki temel pratik sebepler (ihtiyaç) kısa kodlar ve libc bağımsızlıklarıdır. Pratik olarak ve en sık karşılaşılan nedense (istek), 20 yıllık ve herşeyi sembolik makine dili ile yapma alışkanlığı olan eski bir bilgisayar kurdu olmaktır.
Yine de, eğer Linux'u gömülü bir sisteme yerleştiriyorsanız, tüm sistemin büyüklüğüne göre kısa olabilirsiniz: çekirdeği, libc ve tüm diğer şeylerin (file|find|text|sh|v.b) uygulamalarını birkaç yüz kilobyte'a oturtmalısınız ve her kilobyte'ın değeri çok fazladır. Bundan dolayı, mümkün olan yollardan birisi, sistemin bazı (veya tüm) kısımlarını sembolik makine dili ile yazmaktır ve bu durum da pekçok yer tasarrufu sağlayacaktır. Mesela, basit bir, sembolik makine dili ile yazılmış, httpd 600 byte'tan az tutmaktadır; kernel, httpd ve ftpd içeren bir sunucuyu 400kb veya daha az boyutta ayarlayabilirsiniz... Bunu düşünün.
Son düzenleyen KisukE UraharA; 16 Mart 2008 17:44
Gerçekçi ol imkansızı iste...

Benzer Konular

24 Ağustos 2015 / P.u.S.u Meslekler
4 Ocak 2016 / careless_WhispeR X-Sözlük
8 Mart 2007 / Misafir Taslak Konular
 Makine
27 Haziran 2008 / SatanpisT Taslak Konular