Derleyici ile montajcı arasında gerçek bir fark var mı?


15

İkisi arasında herhangi bir fark var mı? Gereğince Ullman kitabında , derleyiciler başka (genellikle düşük seviye) diline bir dili dönüştürmek ve böylece bir montajcı yapar. İkisi nasıl farklı?


1
Montajcı , belirli bir dizi görevi yerine getiren bir derleyicidir. Terimler pratikte biraz farklılaşmıştır, ancak "derleyici" nin temel tanımı (diller arasında çeviri) geçerlidir.
Raphael

Tüm montajcılar (basit) derleyicilerdir, çünkü bir dili diğerine dönüştürürler. Tüm derleyiciler montajcı değildir.
user253751

Yanıtlar:


16

Bir montajcı montaj kodunu makine koduna çevirir. Çeviri mekaniktir ve sadece bir şekilde yapılabilir. Buna karşılık, bir derleyici, ilgili programlama dilini derlediğinde daha fazla özgürlüğe sahiptir - örneğin, optimize edebilen ve hatta optimize etmeyen derleyiciler bile farklı kodlar üretebilir. Ayrıca, derleyiciler "ön uç" u (programlama diline karşılık gelen) ve "arka uç" u (bilgisayar mimarisine karşılık gelen) ayıracak şekilde yazılabilirken, montajcılarla ikisi her zaman aynıdır.


2
Çeviri neden sadece tek bir yolla yapılabilir? Bu, kaynak kodunun belirli bir makine kodu (ve hedef mimari) için oluşturulamayacağı anlamına mı geliyor? Kulağa sezgisel geliyor. Çünkü belirli bir makine kodu talimatı birden fazla asm talimatıyla eşleşebiliyorsa, makine hangi talimatın yürütüleceğine nasıl karar verir? Bir şey mi kaçırıyorum?
Utku

3
Korkarım burada "tek yön" anlamını yanlış anlamışsınızdır. Bir montaj kodu verildiğinde , makine koduna tek bir çevirisi olduğu anlamına gelir . T ( A ) AAT(A)A
Yuval Filmus

Teşekkürler, Ullman'ın kitabında bir derleyicinin bir ön ucu ve bir arka ucu olduğunu da görüyorum. Doğruysam, arka uç bir ara dilde optimizasyon, makine kodunun oluşturulması ve makine kodunun optimizasyonunu gerçekleştirir ve üç görevin her biri birden fazla şekilde yapılabilir. "arka uç" kısmı bir montajcı mı? Ara dil bir montaj dili midir? Sanırım evet, ama cevabınız bir montajcının işini sadece bir şekilde yaptığını belirtiyor.
Tim


Ara dil genellikle makineden bağımsız bir dile karşılık gelir.
Yuval Filmus

11

Sonuçta derleyici yazmak bir montajcıdan daha eğlenceli . Montaj dilleri genellikle ayrıştırma ve tip kontrolü için neredeyse önemsiz olacak şekilde tasarlanmıştır ve çok sayıda tablo güdümlü jeneratör içerme eğilimindedir ("ekleme op kodu 01110", "yükleme talimatları için hedef işlenen kaydı 17 ila 21 bitleri arasında belirtilir "). Genellikle bir montajcının en ilginç kısmı sembolik etiketleri sayılara çözümleyen kısımdır.

Bununla birlikte , çoğu montajcı az miktarda aritmetik (örneğin küçük sabitlerle sembolik etiketler ekleyerek) yapabilir ve çoğu montajcı bir makro işleme tesisine sahiptir veya entegre edilmiştir. (Çoğu Unix sisteminde, makro özelliği aslında C ön işlemcisini montajcıya düzgün bir şekilde geçirmeden önce montaj üzerinde çalıştırılarak sağlanır.)

MIPS toplayıcısı bunun ötesine geçmek zorunda kaldı ve bazı ilginç kod oluşturma kararları aldı ve az miktarda optimizasyon yaptı. MIPS makine dili, örneğin farklı sabitleri yüklemek için farklı kod dizileri gerektirir ve bu nedenle montajcı sabit oluşturulduktan sonra kod dizisini seçmek zorunda kaldı . Ayrıca, MIPS makine kodu gecikme yuvaları fikrine sahipti , ancak bunları soyutlamak ve derleyiciye daha "normal" bir soyut montaj dili sunmak montajcının sorumluluğundaydı. Bu yüzden MIPS montajcısının bazı yerel talimat çizelgelemesi yapması gerekir.

Bu ayrım, Norman Ramsey'in bazı çalışmaları, özellikle de C - taşınabilir montaj dili ile daha da bulanıklaşıyor . (İlgili makale Ramsey ve Peyton Jones, "İstisnaların Birden Fazla Uygulamasını Destekleyen Tek Bir Ara Dil", Prog. Lang. Impl. Ve Dsgn. , (PLDI-21): 285-298, 2000. ) Ve son olarak, orada aynı zamanda David Walker ve Greg Morrisett'in bellek güvenliğini garanti edebilen bir montajcısıyla yazılan bir Montaj Dili .


0

Burada biraz basitleştirilmiş cevap, gerçeklik daha karmaşık. Bir Assembler (A) ve Derleyici (C) arasındaki farkın diğer şeylerin arasında olmasını beklerim:

  1. Bir kaynak kodu satırı doğrudan bir CPU opcode (A) ile ilgilidir (C)
  2. Gerçek CPU (A) veya makineden bağımsız (C)

Derleme dilini "düşük düzey" ve bir derleyicinin "yüksek düzey" i anladığı kaynak dili (genellikle brüt basitleştirme, ama yine de) olarak adlandırıyoruz.

Montaj dilinde örnek olarak bir ekleme işlemi yapabilirsiniz:

  • a, b ekle (belirli bir CPU için)
  • R5, R6 ekleyin (farklı bir CPU için)
  • add (A5), D2 (farklı bir CPU için)

Üst düzey bir dilde şunları yazabilirsiniz:

  • x = y + z;

Ve bu, bir dizi koşula bağlı olarak bir talimat veya yüzlerce talimatla sonuçlanabilir, biri derleyicinin talimatlar için oluşturduğu CPU'dur.

Gördüğünüz gibi montaj kaynak dili en sık: (A) bir kaynak kod satırı bir satır CPU opcodes'i verir ve hangi CPU'yu hedeflediğinize bağlıdır. Üst düzey bir dil (C) derleyicisi sizin için tüm bu ayrıntıları yönetir - bir kaynak kodu satırı sıfır, bir veya daha fazla CPU opodu ve derleyici CPU'nun neler yapabileceğinin ayrıntılarını işler.

Bugün bir derleyici genellikle birkaç farklı aşamadan oluşur. Ön uç / arka uç veya başka şeyler olarak adlandırılan arılama olarak adlandırılabilirler. Onları genellikle dört aşama olarak görüyorum:

  1. İlk aşama, gerçek kaynak kodunu okur ve dahili bir temsil oluşturur. Bu aşama gerçek kaynak dili bilir.
  2. İkinci aşama, dahili temsile bakar ve bir dizi optimizasyon yapar. Günümüzde, derleyici genellikle programı daha hızlı hale getirir ve büyürse umursamaz. Optimizasyon dahili sunumda yapılır. İlginçtir, bunun bazı bölümleri birkaç farklı dil için genel olabilir.
  3. Üçüncü aşama dahili temsili alır ve seçilen CPU için gerçek kodu oluşturur. Bu aşamada farklı CPU'ları hedefleyen birkaç farklı sürüm olabilir. Aslında kaynak kodunu bir kez yazıp daha sonra farklı CPUS'lar için derleyebilirsiniz.
  4. Programı "paketlemek" için son hazırlıklar (bu aşama bir bağlayıcı olabilir).

İyi derleyiciler yazmak son derece yetenekli bir meslektir - bir oyuncak dili derleyicisi yapmak bir amatör tarafından (veya iyi, biraz daha uzun) bir öğleden sonra yapılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.