Nesne kodu, makine kodu ve montaj kodu arasındaki fark nedir?
Farklarının görsel bir örneğini verebilir misiniz?
Nesne kodu, makine kodu ve montaj kodu arasındaki fark nedir?
Farklarının görsel bir örneğini verebilir misiniz?
Yanıtlar:
Makine kodu , doğrudan CPU tarafından çalıştırılabilen ikili (1'ler ve 0'lar) kodlardır. Bir metin düzenleyicide bir makine kodu dosyasını açmak için olsaydı sen basılamaz karakterler dahil çöp görecekti (hayır, o , basılamaz karakterler;)).
Nesne kodu , makine kodunun henüz tam bir programa bağlı olmayan bir kısmıdır. Tamamlanmış ürünü oluşturan belirli bir kütüphane veya modülün makine kodudur. Ayrıca, tamamlanmış bir programın makine kodunda bulunmayan yer tutucular veya ofsetler içerebilir. Bağlayıcı bağlantı herşey birlikte ile bu tutucuları ve uzaklıklar kullanacaktır.
Montaj kodu , çoğunlukla makine talimatları ile doğrudan 1: 1 analogu olan düz metin ve (bir şekilde) insan tarafından okunabilen kaynak kodudur. Bu, gerçek talimatlar, kayıtlar veya diğer kaynaklar için anımsatıcılar kullanılarak gerçekleştirilir. Örnekler JMP
ve MULT
CPU atlama ve çarpma talimatları için. Makine kodunun aksine, CPU montaj kodunu anlamıyor. Bir kullanımı ile makineye montaj kodu dönüştürmek assembler veya derleyici genellikle işlemci talimatlardan daha da soyutlanmış yüksek düzeyli bir programlama dili ile birlikte derleyici düşünmek olsa.
Tam bir program oluşturmak, program için kaynak kodunun derleme veya C ++ gibi daha üst düzey bir dilde yazılmasını içerir . Kaynak kodu, nesne koduna monte edilir (montaj kodu için) veya (daha üst düzey diller için) derlenir ve ayrı modüller, son programın makine kodu olmak için birbirine bağlanır. Çok basit programlar söz konusu olduğunda bağlantı adımına gerek olmayabilir. IDE (entegre geliştirme ortamı) gibi diğer durumlarda, bağlayıcı ve derleyici birlikte çağrılabilir. Diğer durumlarda, ortama son uygulamanın nasıl oluşturulacağını söylemek için karmaşık bir make komut dosyası veya çözüm dosyası kullanılabilir.
Farklı davranan, yorumlanmış diller de vardır . Yorumlanan diller, özel bir tercüman programının makine koduna dayanır. Temel düzeyde, bir tercüman kaynak kodunu ayrıştırır ve komutları hemen yeni makine koduna dönüştürür ve yürütür. Bazen çalışma zamanı ortamı veya sanal makine olarak da adlandırılan modern tercümanlar çok daha karmaşıktır: bir seferde kaynak kodun tüm bölümlerini değerlendirmek, mümkün olduğunda önbelleğe almak ve optimize etmek ve karmaşık bellek yönetimi görevlerini yönetmek. Yorumlanan bir dil, montaj koduna benzer şekilde, daha düşük seviyeli bir ara dile veya bayt koduna önceden derlenebilir.
Diğer cevaplar farkın iyi bir açıklamasını verdi, ama siz de bir görsel istediniz. İşte C kodundan bir yürütülebilir dosyaya yolculuk ettiklerini gösteren bir diyagram.
Montaj kodu, makine kodunun okunabilir bir temsilidir:
mov eax, 77
jmp anywhere
Makine kodu saf onaltılık koddur:
5F 3A E3 F1
Bir nesne dosyasındaki gibi nesne kodu demek istediğinizi varsayalım. Bu, makine kodunun bir varyantıdır, bir sıçrama, bir bağlayıcının bunları doldurabileceği şekilde parametrelenmiştir.
Montajcı, montaj kodunu makine koduna (nesne kodu) dönüştürmek için kullanılır. Bağlayıcı, yürütülebilir bir nesne oluşturmak için birkaç nesne (ve kütüphane) dosyasını birbirine bağlar.
Bir kez saf hex bir montajcı programı (montajcı yok) yazdım Neyse ki bu iyi eski (eski) 6502 geri yoluydu. Ama pentium opcodes için montajcılar var sevindim.
Henüz belirtilmeyen bir nokta, birkaç farklı montaj kodu türünün olmasıdır. En temel biçimde, talimatlarda kullanılan tüm sayılar sabit olarak belirtilmelidir. Örneğin:
1902 $: BD 37 14: LDA 1437 $, X 1905 $: 85 03: 03 $ STA 1907: 85 09: 09 dolar 1909 $: CA: DEX 190A: 10: 1902 BPL
Yukarıdaki kod biti, bir Atari 2600 kartuşunda 1900 $ adresinde saklanırsa, 1437 $ adresinden başlayan bir tablodan getirilen farklı renklerde bir dizi satır görüntüler. Bazı araçlarda, bir adresin yazılması, yukarıdaki satırın en sağ kısmı ile birlikte, orta sütunda gösterilen değerleri belleğe kaydeder ve bir sonraki satıra aşağıdaki adresle başlar. Bu formdaki kodu yazmak, onaltılık yazımdan çok daha uygundu, ancak her şeyin kesin adreslerini bilmek zorundaydı.
Çoğu montajcı, birinin sembolik adresleri kullanmasına izin verir. Yukarıdaki kod daha çok şöyle yazılır:
rainbow_lp: lda ColorTbl, x sta WSYNC sta COLUBK dex bpl rainbow_lp
Montajcı, LDA talimatını otomatik olarak ayarlayacak, böylece ColorTbl etiketine hangi adresin eşlendiğini gösterecektir. Bu tip birleştirici kullanmak, kod yazmayı ve düzenlemeyi, tüm adresleri el ile tuşlamak ve el ile tutmak zorunda kaldığında mümkün olandan çok daha kolay hale getirir.
Kaynak kodu, Montaj kodu, Makine kodu, Nesne kodu, Bayt kodu, Yürütülebilir dosya ve Kütüphane dosyası.
Tüm bu terimler çoğu insan için karşılıklı olarak ayrıcalıklı olduklarını düşündükleri için çoğu zaman kafa karıştırıcıdır . İlişkilerini anlamak için şemaya bakın. Her terimin açıklaması aşağıda verilmiştir.
Okunabilir (programlama) dilde talimatlar
C, C ++ ve Java programları gibi yüksek seviyeli (programlama) bir dilde yazılmış talimatlar
Bir montaj dilinde yazılmış talimatlar (bir tür alt seviye programlama dili). Derleme işleminin ilk adımı olarak, üst düzey kod bu forma dönüştürülür. Daha sonra gerçek makine koduna dönüştürülen montaj kodudur. Çoğu sistemde, bu iki adım derleme işleminin bir parçası olarak otomatik olarak gerçekleştirilir.
ör. program.asm
Bir derleme işleminin ürünü. Makine kodu veya bayt kodu şeklinde olabilir.
ör. dosya.o
Makine dilinde talimatlar.
ör. a.out
JVM gibi bir tercüman tarafından yürütülebilen bir ara formda talimat.
ör. Java sınıfı dosyası
Bağlama işleminin ürünü. CPU tarafından doğrudan çalıştırılabilen makine kodlarıdır.
örneğin, bir .exe dosyası.
Bazı bağlamlarda bayt kodu veya komut dosyası dili yönergeleri içeren bir dosyanın da yürütülebilir olarak değerlendirilebileceğini unutmayın.
Bazı kodlar, yeniden kullanılabilirlik gibi farklı nedenlerle bu forma derlenir ve daha sonra yürütülebilir dosyalar tarafından kullanılır.
cc1
yürütülebilir dosyanın içinde yerleşik bir montajcıya sahip olmak yerine ayrı bir montajcıya beslediği bir asm metni oluşturur ). Bence asm dairesi "kaynak" dairenin sol tarafına yapışmalıdır, çünkü bazı asm kaynak değil sadece asmdır. Tabii ki hiçbir zaman nesne kodu değildir, ancak bazı asm kaynaktan nesne dosyalarına giden yolda bir adımdır.
Montaj kodu burada tartışılmıştır .
"Bir montaj dili, bilgisayarları programlama için düşük seviyeli bir dildir. Belirli bir CPU mimarisini programlamak için gereken sayısal makine kodlarının ve diğer sabitlerin sembolik bir temsilini uygular."
Makine kodu burada tartışılmıştır .
"Makine kodu veya makine dili doğrudan bilgisayarın merkezi işlem birimi tarafından yürütülen bir talimatlar ve veriler sistemidir."
Temel olarak, derleyici kodu dildir ve bir derleyici (bir derleyiciye benzer) tarafından nesne koduna (CPU'nun çalıştığı yerel kod) çevrilir.
Bence bunlar ana farklar
Okunabilirlik, kodun litte çaba ile oluşturulduktan 6 ay sonra iyileştirilmesini veya değiştirilmesini sağlayabilir, diğer yandan performans kritikse, üretimde sahip olacağınız belirli donanımı hedeflemek için düşük seviyeli bir dil kullanmak isteyebilirsiniz. daha hızlı yürütme.
Günümüzde IMO bilgisayarlar, bir programcının OOP ile hızlı bir şekilde çalışmasını sağlayacak kadar hızlıdır.
Montaj, insanların anlayabileceği kısa bir terimdir ve doğrudan bir CPU'nun kullandığı makine koduna çevrilebilir.
İnsanlar tarafından biraz anlaşılabilir olsa da, Assembler hala düşük seviyededir. Yararlı bir şey yapmak çok kod gerektirir.
Bunun yerine C, BASIC, FORTAN gibi daha yüksek seviyeli diller kullanıyoruz (tamam biliyorum kendimle çıktığımı biliyorum). Derlendiğinde bunlar nesne kodu üretir. İlk diller nesne kodu olarak makine diline sahipti.
Bugün birçok dil, böyle bir JAVA ve C # genellikle makine kodu olmayan, ancak makine kodu üretmek için çalışma zamanında kolayca yorumlanabilen bir bayt koduna derlenir.
Programlarınızın kaynak dosyaları nesne dosyalarına derlenir ve daha sonra bağlayıcı bu nesne dosyalarını birbirine bağlayarak mimarinizin makine kodlarını içeren yürütülebilir bir dosya oluşturur.
Hem nesne dosyası hem de yürütülebilir dosya, bir metin düzenleyicisi tarafından açıldığında mimarinin makine kodunu yazdırılabilir ve yazdırılamayan karakterler biçiminde içerir.
Bununla birlikte, dosyalar arasındaki ikilik, nesne dosyalarının çözülmemiş harici referanslar (örneğin) içerebilmesidir printf
. Yani, diğer nesne dosyalarına bağlı olması gerekebilir .. Yani, çözülemeyen harici referansların C / C ++ çalışma zamanı kütüphanesi gibi diğer nesne dosyalarıyla bağlantı kurarak iyi çalıştırılabilir yürütülebilir dosyayı elde etmek için çözülmesi gerekir. .