Derleyici Nasıl Çalışır? [kapalı]


17

Not: Bunun daha önce sorulmamasına şaşırdım ve eğer varsa bir aramada bulamadım.

Tonlarca web sitesinde bulundum, tonlarca makale okudum ve tonlarca açıklama duydum. Birçoğu iyiydi, ama hepsi ya geniş ya da çok karmaşık ya da sadece kötü kötüydü. Benim sorum şu, derleyici nasıl çalışır?

Bu zor ve geniş bir soru ise, lütfen söyle. Ama eğer değilse, lütfen soruyu cevaplayın.


4
Çok geniş, en azından "Nasıl çalışır" bölümü. Bu konuda yazılmış kitaplar var.
Oded

1
en.wikipedia.org/wiki/Compiler bulmak önemsiz olan Wikipedia bağlantısı, özellikle neyi merak ediyorsunuz? Soru, "Derleyiciler kodu bir dilden diğerine çeviriyor" un akıllı alec yanıtını vermem için yeterince geniş. bu gerçekten ne içerir.
JB King

1
Evet ve bence çok iyi yanıtlandı.
Jeremy

1
Bir derleyicinin nasıl çalıştığına dair herhangi bir açıklama ya çok geniş ya da çok karmaşık olacaktır. Bu karmaşık bir konudur ve derleyici dersleri bilgisayarla ilgili aldığım en zor derslerdi.
David Thornley

1
@David Elbette derleyiciler karmaşıktır ve burada nasıl çalıştıklarının tüm ayrıntılarını açıklayamazsınız. Ancak, derleyici kursunuza başlamadan önce derleyicinin ne olduğu veya nasıl çalıştığı hakkında temel düzeyde üst düzey bir anlayışa sahip olduğunuzdan eminim.
Dima

Yanıtlar:


24

Derleyici, başka bir programın kaynak kodunu bir programlama dilinden yürütülebilir koda çeviren bir programdır.

Kaynak kodu genellikle üst düzey bir programlama dilinde (ör. Pascal, C, C ++, Java, Perl, C #, vb.). Yürütülebilir kod, CPU tarafından doğrudan yürütülebilen bir makine talimatları dizisi olabilir veya sanal bir makine (örneğin Java bayt kodu) tarafından yorumlanan bir ara temsil olabilir.

Kısacası, bir derleyici bir programı insan tarafından okunabilir bir formattan makine tarafından okunabilir bir formata dönüştürür.

Bir derleyicinin nasıl çalıştığına gelince, bu gerçekten karmaşıktır. Konuyla ilgili kitaplar ve üniversite dersleri bulunmaktadır. Sürecin ana aşamalarını kısaca özetlemeye çalışacağım, ancak bu çok iyi bir genel bakış olacak.

  1. Lexing - program metnini "belirteçlere" ayırın. Belirteçler, programlama dilinin tanımlayıcıları (anahtar sözcükler, değişken adları, işlev adları vb.) Veya işleçler (=, *, & vb.) Gibi "sözcükleridir".
  2. Ayrıştırma - belirteç dizisini çeşitli dil yapılarını temsil eden bir veri yapısı olan ayrıştırma ağacına dönüştürür: tür bildirimleri, değişken bildirimleri, işlev tanımları, döngüler, koşullu ifadeler, ifadeler vb.
  3. Optimizasyon - sabit ifadeleri değerlendirin, kullanılmayan değişkenleri veya erişilemeyen kodu optimize edin, mümkünse döngüleri açın vb.
  4. Ayrıştırma ağacını makine talimatlarına (veya JVM bayt koduna) çevirin.

Yine, bunun çok kısa bir açıklama olduğunu vurguluyorum. Modern derleyiciler çok akıllı ve sonuç olarak çok karmaşıktır.


2
Aslında bir dili başka bir dile çevirir. Erken C ++ derleyicisi C derlemiştir. Aynı şey Vala derleyicisi için de geçerlidir. Java derleyicisi JVM'nin JIT derleyicisi olmadan çalıştırılamayan bayt kodunu derler.
deadalnix

1
@deadalnix IMHO, mesele, çalıştırılamayan koddan çalıştırılabilir koda gitmenizdir. C-cephesinin bir derleyici değil, C derleyicisinin bir ön ucu olduğunu iddia ediyorum. Ya da eğer derleme sürecinde bir aşama. Sanal makineler, elbette "yürütülebilir" ve "yürütülebilir olmayan" arasındaki sınırı bulanıklaştırır. Burada yürütülebilir kodun bayt kodu gibi sanal makineye giren her şey olduğunu düşünürüm ve JIT gibi VM içinde neler olup bittiğini soyutlayabilirim.
Dima

1
@Dima, yürütülebilir olmayan koddan yürütülebilir koda kadar olması gerekmez. Örneğin, JVM bayt kodunu doğrudan Windows makinelerinde çalıştıramazsınız.

1
@ Thorbjørn Ravn Andersen: ancak bayt kodu JVM tarafından yürütülebilir. "Sanal makinenin" amacı programcıya gerçek bir makine gibi görünmüyor mu?
Dima

2
Geleneksel olarak bir derleyicinin, Dima'nın dediği gibi, bir programı insan tarafından okunabilir bir formattan makine tarafından okunabilir bir formata dönüştürdüğünü iddia ediyorum. Cfront'u C ++ 'ya C ya da Java'yı bayt koduna çeviren Cfront gibi varyasyonlar, temel, geleneksel konsepti tanımayan birine açıklayana kadar bırakılması gereken daha gelişmiş konulardır.
Carson63000

5

Derleyici, bir programlama dilinde (kaynak dil) yazılan kaynak kodunu başka bir bilgisayar diline (hedef dil, genellikle nesne kodu olarak bilinen ikili bir forma sahip) dönüştüren bir bilgisayar programıdır (veya bir dizi talimattır). Kaynak kodunu dönüştürmek istemenin en yaygın nedeni yürütülebilir bir program oluşturmaktır.

Derleyici kaynak programları altta yatan donanım ile üst düzey dillerde köprü oluşturur. Bir derleyici şunları gerektirir:

  1. Programların sözdiziminin doğruluğunu belirleme
  2. Doğru ve verimli nesne kodu oluşturma
  3. Çalışma zamanı organizasyonu
  4. Çıktıyı birleştirici ve / veya bağlayıcı kurallarına göre biçimlendirme.
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.