Derleyiciler diğer sınıfları ve özelliklerini nasıl bilir?


14

İlk programlama dilimi nesne yönelimli ve şimdiye kadar tek bir 'sınıf' yaratmakla yazıyorum. Ama diyelim ki derslere, diyelim ClassAve ClassB. Bu ikisinin birbirleri ile ilgisi yoksa, o zaman her şey iyidir. Ancak, diyelim ki ClassAbir oluşturur ClassBpozlar 2 ilgili sorular -Bu:

-Nasıl derleyici know-derleme ne zaman ClassAolduğunu ClassBeğer olursa, nasıl 's özelliklerini biliyor, hatta var ve?

Şimdiye kadar düşüncelerim şöyleydi: bir seferde her sınıfı derlemek yerine (yani tarama, ayrıştırma ve kod üretme) her bir "dosya (gerçekten dosya değil, ama bir" sınıf ") her birini taramam + ayrıştırmam gerekiyor mu , sonra herkes için kod oluşturmak?

Yanıtlar:


13

Farklı diller (ve böylece derleyiciler) buna farklı yaklaşır.

C ailesinde, farklı modüllerde nesne oluşturulurken kullanılan karşılık gelen bir başlık dosyası vardır. Başlık dosyaları, nesnenin boyutu ve çağrılabilecek işlevler veya yöntemler hakkında bilgi sağlar. Bu, bellek ayırma için gerekli bilgilere izin verir ve "bu yöntem / işlev / prosedür var mı?" kaynağın kendisine erişmesi gerekmeyen tek bir birimin derlenmesi sırasında kullanılır.

Java'da, derleyici sınıf yolundaki şeylerin farkındadır ve bu nesneyi kendilerine bağlanmak için inceler (yöntemlerin var olduğunu doğrulamak, doğru sayıda argümana sahip olmak vb.). Java, derlendiğinde hakkında hiçbir şey bilmediği diğer sınıflarda çalışma zamanı yüklemesinde dinamik olarak bağlanabilir. Dinamik yükleme örneği için Class.forName dosyasına bakın .

Her iki seçenek de oldukça geçerlidir ve kendi avantajları ve dezavantajları vardır. Başlık dosyalarının bazılarına hantal ve DRY'yi ihlal ettiğini görmek . Öte yandan, üstbilgi dosyalarınız yoksa, kitaplıkların derleyici ve bağlayıcı tarafından denetlenebilir olması gerekir. ve makineye bağlı olacaktır).


0

Pratik olarak, Java ile IDE'nin tüm programa aynı anda bakması; ClassB'ye başvurulduğunda, IDE derleyicisine bakacaktır. Kütüphaneler de dahil olmak üzere her şey tam bir bütündür. Program hazır olduğunda, sınıf yollarını değiştirebilir, tek tek .class dosyalarını alıp çıkarabilir ve kitaplık sürümlerini değiştirebilirsiniz. Ayrıca IDE kullanmadan tek tek .java dosyalarını derleyebilirsiniz (veya bir şekilde denetlemelerinden kaçınabilirsiniz). Sonuç hiç tutarlı olması gerekmez ve bu değilse sen edecektir çalışma zamanı olsun istisnalar. (Bir IDE'nin sizin için yapmaya çalıştığı birçok şeyden biri, çalışma zamanı hatalarını derleme zamanı veya daha doğrusu düzenleme zamanı hatalarına dönüştürmektir.)

C # 'ın hemen hemen aynı olduğunu ve C ve C ++' nın gerçekten farklı olduğunu düşünmüyorum, Java ve C # IDE'lerin yaptığı şey sadece perde arkasında sizin için C / C ++ stili başlıklar oluşturmaktır.


Java derleyicileri, bağımlı öğeleri de derler. Bu tür şeylerden çalışma zamanı istisnaları elde edersiniz, ancak bir şeyleri gerçekten zorlamak için çok uğraştıysanız (örneğin, bir API'yi tüketicileri derledikten sonra bir API'yi değiştirme ve yeniden derleme).
Donal Fellows

@DonalFellows: Sorunlarım eksik kütüphaneler ("Ama ben bunu tüm makinelerime koydum!") Ve çalışan programları (istemeden çalışırken değiştirilebilen .class dosyaları) yeniden derledik. Henüz yapmadım, ancak artık ana programla eşleşmeyen paketleri güncellemeyi öngörebilirim. Ben C ve .dll çok (ve bunu bana yapmıştı) yıllar önce bir sürü yaptım . İnanıyorum ve umarım şu anda orada olmayan birçok koruma vardır.
RalphChapin

Gerçekten bir IDE derleyici / linker derleme / linker sorunları çözmek için nasıl bilir ile ne ilgisi yok. Yanılıyorsam beni düzeltin, ancak bir IDE tüm konuya tamamen diktir (sadece programcıdaki görevi kolaylaştırır). Neden? Çünkü teoride IDE derleyiciyi arka planda kullanıyor.
Thomas Eding

@ThomasEding: Çok haklısın. Bu soruyu cevapladığımda IDE'yi derleyiciden / bağlayıcıdan ayırmakta sorun yaşıyordum. Benim mazeret: Java çalışana kadar "bağlantı" değildir ve bu yüzden o zamana kadar bir sınıf ref veya yöntem çağrısı yanlış bilmiyorum; IDE görevimi gerçekten "kolaylaştırmaz", bunu mümkün kılar. (FORTRAN ve C'de, çok uzun zaman önce) derlediğimde, bağlandığımda ve sonra koştuğumda hata almak için kullandım. Şimdi yazarken neredeyse tüm bu hataları alıyorum, bu da IDE'yi bir anlamda derleyici, bağlayıcı ve yürütücü yapıyor. Bugün, çalışma zamanı olmayan tüm hatalar IDE'den geliyor.
RalphChapin

0

Eski diller bazen daha katıdır; Java'da nelerin mümkün olduğunu düşünün:

public interface Ifc {
    public static final Ifc MY_CONSTANT = new Implem();
}

public class Implem implements Ifc {
}

Yukarıdaki anti-paterni gördüm ve gerçekten çirkin (bunu yasaklardım). Her iki derleme birimi de birbirini kullanır. Ancak Ifc derlenmiş bir Implem olmadan kodlamak için derlenebilir. Derlenmiş kod .class, bir C .obj ile karşılaştırılabilir, "bağlantı bilgileri:" parametresiz bir kurucu çağıran bir Implem içe aktarma içerir Implem(). Implem sınıfı daha sonra sorunsuz olarak derlenebilir. Kısmen ClassLoader - başlatma / derleme JVM sınıfı verileri ve kısmen de Java Sanal Makinesi'nin kendisi , bütünleştirici olarak biraz bağlayıcı olarak oynar .

Örneğin, belirli bir kitaplığın bir sürümüyle derleme ve bu kitaplığın başka bir sürümüyle çalıştırma, çalışma zamanı hatalarını tanıyacaktır.

Bu yüzden cevap: Derleme, bir araya getirmek için kod + veri + API olarak görülmesi gereken derlenmiş nesne kodu birimleri sunar.

Derleyici daha sonra birlikte bir paketleme yapmalı ve bağlantı API'sını doğrulamalıdır ; ikinci aşama.

Bu tahriş edebilir ve yetersiz görünebilir, ancak matematiksel kanıtlar aynı şekilde çalışabilir: tüm doğruluğu kanıtlamak için, doğrulama yapılıncaya kadar doğru olacak bir parçayı zaten düşünebilirsiniz.

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.