Yanıtlar:
=====> COMPILATION PROCESS <======
|
|----> Input is Source file(.c)
|
V
+=================+
| |
| C Preprocessor |
| |
+=================+
|
| ---> Pure C file ( comd:cc -E <file.name> )
|
V
+=================+
| |
| Lexical Analyzer|
| |
+-----------------+
| |
| Syntax Analyzer |
| |
+-----------------+
| |
| Semantic Analyze|
| |
+-----------------+
| |
| Pre Optimization|
| |
+-----------------+
| |
| Code generation |
| |
+-----------------+
| |
| Post Optimize |
| |
+=================+
|
|---> Assembly code (comd: cc -S <file.name> )
|
V
+=================+
| |
| Assembler |
| |
+=================+
|
|---> Object file (.obj) (comd: cc -c <file.name>)
|
V
+=================+
| Linker |
| and |
| loader |
+=================+
|
|---> Executable (.Exe/a.out) (com:cc <file.name> )
|
V
Executable file(a.out)
C ön işleme, derlemenin ilk adımıdır. Şunları ele alır:
#define
ifadeler.#include
ifadeler.Ünitenin amacı, C kaynak dosyasını Pure C kod dosyasına dönüştürmektir.
Ünitede altı adım vardır:
Bir "TOKEN" oluşturmak için kaynak dosyadaki karakterleri birleştirir. Bir simge, "boşluk", "sekme" ve "yeni satır" içermeyen bir karakter kümesidir. Bu nedenle bu derleme birimi "TOKENIZER" olarak da adlandırılır. Ayrıca yorumları kaldırır, sembol tablosu ve yer değiştirme tablosu girişleri oluşturur.
Bu birim, koddaki sözdizimini kontrol eder. Örneğin:
{
int a;
int b;
int c;
int d;
d = a + b - c * ;
}
Yukarıdaki kod, denklem dengeli olmadığı için ayrıştırma hatası oluşturacaktır. Bu birim, aşağıdaki gibi ayrıştırıcı ağacını oluşturarak bunu dahili olarak kontrol eder:
=
/ \
d -
/ \
+ *
/ \ / \
a b c ?
Bu nedenle bu birime PARSER de denir.
Bu birim ifadelerdeki anlamı kontrol eder. Örneğin:
{
int i;
int *p;
p = i;
-----
-----
-----
}
Yukarıdaki kod, "Uyumsuz tip ataması" hatasını oluşturur.
Bu birim CPU'dan bağımsızdır, yani iki tür optimizasyon vardır
Bu birim, kodu aşağıdaki biçimlerde optimize eder:
Örneğin:
{
int a = 10;
if ( a > 5 ) {
/*
...
*/
} else {
/*
...
*/
}
}
Burada derleyici, derleme zamanında 'a'nın değerini bilir, bu nedenle if koşulunun her zaman doğru olduğunu da bilir. Dolayısıyla koddaki diğer kısmı ortadan kaldırır.
Örneğin:
{
int a, b, c;
int x, y;
/*
...
*/
x = a + b;
y = a + b + c;
/*
...
*/
}
aşağıdaki gibi optimize edilebilir:
{
int a, b, c;
int x, y;
/*
...
*/
x = a + b;
y = x + c; // a + b is replaced by x
/*
...
*/
}
Örneğin:
{
int a;
for (i = 0; i < 1000; i++ ) {
/*
...
*/
a = 10;
/*
...
*/
}
}
Yukarıdaki kodda, eğer 'a' yerelse ve döngüde kullanılmıyorsa, aşağıdaki gibi optimize edilebilir:
{
int a;
a = 10;
for (i = 0; i < 1000; i++ ) {
/*
...
*/
}
}
Burada derleyici, daha sık kullanılan değişkenlerin kayıtlarda saklanması için montaj kodunu oluşturur.
Burada optimizasyon CPU'ya bağlıdır. Diyelim ki kodda birden fazla atlama varsa, bunlar aşağıdaki gibi birine dönüştürülür:
-----
jmp:<addr1>
<addr1> jmp:<addr2>
-----
-----
Kontrol doğrudan atlar.
Daha sonra son aşama Bağlama'dır (çalıştırılabilir veya kitaplık oluşturur). Yürütülebilir dosya çalıştırıldığında, ihtiyaç duyduğu kitaplıklar Yüklenir.
ASCII gösterimi:
[Source Code] ---> Compiler ---> [Object code] --*
|
[Source Code] ---> Compiler ---> [Object code] --*--> Linker --> [Executable] ---> Loader
| |
[Source Code] ---> Compiler ---> [Object code] --* |
| |
[Library file]--* V
[Running Executable in Memory]
Umarım bu size biraz daha yardımcı olur.
İlk önce şu diyagramı gözden geçirin:
(img source->internet)
Bir kod parçası yaparsınız ve dosyayı kaydedersiniz (Kaynak kodu), sonra
Ön işleme : - Adından da anlaşılacağı gibi, derlemenin bir parçası değildir. Derleyiciye gerçek derlemeden önce gerekli ön işlemi yapmasını söylerler. Bu aşamaya Metin Değiştirme adını verebilir veya # ile gösterilen özel önişlemci yönergelerini yorumlayabilirsiniz.
Derleme : - Derleme, bir dilde yazılmış bir programın hedeflenen başka bir dile çevrildiği bir süreçtir. Bazı hatalar varsa, derleyici bunları tespit edecek ve rapor edecektir.
Birleştir : - Birleştirme kodu makine koduna çevrilir. Assembler'a özel bir complier türü diyebilirsiniz.
Bağlama : - Bu kod parçasının bağlanması için başka bir kaynak dosyası gerekiyorsa, bağlayıcı bunları çalıştırılabilir bir dosya yapmak için bağlar.
Ondan sonra gerçekleşen birçok süreç var. Evet, tahmin ettiniz, tam da burada yükleyicinin rolü geliyor:
Yükleyici : - Yürütülebilir kodu belleğe yükler; program ve veri yığını oluşturulur, kayıt başlatılır.
Küçük Ekstra bilgi: - http://www.geeksforgeeks.org/memory-layout-of-c-program/ , orada bellek düzenini görebilirsiniz.
Derleyici: Üst düzey bir dil programını bir makine dili programına çeviren bir programdır. Derleyici, derleyiciden daha akıllıdır. Her türlü limiti, aralığı, hatayı vb. Kontrol eder. Ancak program çalışma süresi daha fazladır ve belleğin daha büyük bir bölümünü kaplar. Yavaş hıza sahiptir. Çünkü bir derleyici tüm program boyunca ilerler ve daha sonra tüm programı makine kodlarına çevirir. Bir derleyici bilgisayarda çalışır ve aynı bilgisayar için makine kodlarını üretirse, o zaman kendi kendine derleyici veya yerleşik derleyici olarak bilinir. Öte yandan, bir derleyici bir bilgisayarda çalışıyorsa ve başka bir bilgisayar için makine kodlarını üretiyorsa, o zaman bir çapraz derleyici olarak bilinir.
Bağlayıcı: Yüksek seviyeli dillerde, bazı yerleşik başlık dosyaları veya kitaplıklar saklanır. Bu kitaplıklar önceden tanımlanmıştır ve bunlar, programı yürütmek için gerekli olan temel işlevleri içerir. Bu işlevler, Linker adlı bir program tarafından kitaplıklara bağlanır. Bağlayıcı bir işlev kitaplığı bulamazsa, derleyiciye bilgi verir ve ardından derleyici bir hata oluşturur. Derleyici, bir programı derlemenin son adımı olarak bağlayıcıyı otomatik olarak çağırır. Kitaplıklarda yerleşik değildir, ayrıca kullanıcı tanımlı işlevleri kullanıcı tanımlı kitaplıklara bağlar. Genellikle daha uzun bir program, modüller adı verilen daha küçük alt programlara bölünür. Programı yürütmek için bu modüller birleştirilmelidir. Modülleri birleştirme işlemi bağlayıcı tarafından yapılır.
Yükleyici: Yükleyici, bir programın makine kodlarını sistem belleğine yükleyen bir programdır. Hesaplamada, bir yükleyici, bir İşletim Sisteminin programları yüklemekten sorumlu olan parçasıdır. Bir programı başlatma sürecindeki temel aşamalardan biridir. Çünkü programları hafızaya alır ve çalıştırmaya hazırlar. Bir programın yüklenmesi, yürütülebilir dosyanın içeriğini belleğe okumayı içerir. Yükleme tamamlandığında, işletim sistemi kontrolü yüklenen program koduna geçirerek programı başlatır. Program yüklemeyi destekleyen tüm işletim sistemlerinde yükleyiciler bulunur. Birçok işletim sisteminde, yükleyici kalıcı olarak bellekte yerleşiktir.
Wikipedia'nın iyi bir cevabı olmalı, işte düşüncelerim:
*
*
LinuxJournal'dan Bağlayıcılar ve Yükleyiciler bu kavramı açıklıkla açıklıyor. Ayrıca a.out'un klasik adının nasıl ortaya çıktığını da açıklıyor. (montajcı çıkışı)
Hızlı bir özet,
c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)
çalıştırılabilir dosyayı aldık, şimdi bu dosyayı arkadaşınıza veya bu yazılıma ihtiyacı olan müşterinize verin :)
Bu yazılımı çalıştırdıklarında, bunu komut satırına yazarak söyleyin ./a.out
execute in command line ./a.out --> [Loader] --> [execve] --> program is loaded in memory
Program hafızaya yüklendikten sonra, PC'nin (program sayacı) ilk talimatını işaret ederek kontrol bu programa aktarılır. a.out
.C veya .cpp vb. Türünde kaynak dosyayı okuyacak ve bunu nesne dosyası olarak adlandırılan .o dosyasına çevirecektir.
Birden çok kaynak dosyası için oluşturulabilen birkaç .o dosyasını çalıştırılabilir bir dosyada (GCC'de ELF biçimi) birleştirir. İki tür bağlantı vardır:
Çalıştırılabilir dosyayı makinenin birincil belleğine yükleyen bir program.
Linux'ta program yürütmenin bu üç aşaması hakkında ayrıntılı bir çalışma için lütfen bunu okuyun .
derleyici değişiklikleri, kaynak kodunuzdaki hataları kontrol eder ve onu nesne koduna dönüştürür. bu, işletim sisteminin çalıştırdığı koddur.
Genellikle tüm programı tek bir dosyaya yazmazsınız, bu nedenle linker tüm nesne kod dosyalarınızı bağlar.
ana bellekte olmadığı sürece programınız çalıştırılmayacak
Linker & Interpreter, karşılıklı olarak münhasır olan yorumlayıcıdır ve satır satır kod alır ve satır satır çalıştırır.
Derleyici Kaynak kodunu nesne koduna dönüştürür.
Bağlayıcı Çoklu nesne dosyalarını tek bir yürütülebilir program dosyasında birleştirir.
Loader Yürütülebilir dosyayı ana belleğe yükler.
Derleyici, belirli bir programlama dilinde yazılmış ifadeleri işleyen ve bunları bir bilgisayar işlemcisinin kullandığı makine diline veya "koda" dönüştüren özel bir programdır.
Derleyici , kod satırlarını programlama dilinden makine diline çevirir.
Bağlayıcı , iki program arasında bir bağlantı oluşturur.
Yükleyici , programı ana veri tabanındaki, programdaki vb. Belleğe yükler.
Derleyici: Programların, nesne dosyalarının, mesajların vb. Hatalarını düzelten bir sistem yazılımıdır.
Linker: Bir veya daha fazla nesne dosyasını ve olası bazı kütüphane kodunu, bazı açıklanabilir bazı kitaplıklarda veya bir hata listesinde birleştiren bir sistem yazılımıdır.
Yükleyici: Çalıştırılabilir dosyayı makinenin birincil belleğine yükleyen bir program