Jawaban:
=====> 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)
Pemrosesan awal C adalah langkah pertama dalam kompilasi. Ini menangani:
#define
pernyataan.#include
pernyataan.Tujuan unit ini adalah untuk mengubah file sumber C menjadi file kode C Murni.
Ada Enam langkah di unit:
Ini menggabungkan karakter dalam file sumber, untuk membentuk "TOKEN". Token adalah sekumpulan karakter yang tidak memiliki 'spasi', 'tab' dan 'baris baru'. Oleh karena itu unit kompilasi ini juga disebut "TOKENIZER". Ini juga menghapus komentar, menghasilkan tabel simbol dan entri tabel relokasi.
Unit ini memeriksa sintaks dalam kode. Misalnya:
{
int a;
int b;
int c;
int d;
d = a + b - c * ;
}
Kode diatas akan menghasilkan kesalahan parse karena persamaan tidak seimbang. Unit ini memeriksanya secara internal dengan membuat pohon parser sebagai berikut:
=
/ \
d -
/ \
+ *
/ \ / \
a b c ?
Oleh karena itu unit ini juga disebut PARSER.
Unit ini memeriksa arti dalam pernyataan. Misalnya:
{
int i;
int *p;
p = i;
-----
-----
-----
}
Kode di atas menghasilkan kesalahan "Assignment of incompatible type".
Unit ini tidak bergantung pada CPU, yaitu ada dua jenis pengoptimalan
Unit ini mengoptimalkan kode dalam bentuk berikut:
Misalnya:
{
int a = 10;
if ( a > 5 ) {
/*
...
*/
} else {
/*
...
*/
}
}
Di sini, kompilator mengetahui nilai 'a' pada waktu kompilasi, oleh karena itu ia juga mengetahui bahwa kondisi if selalu benar. Karenanya ia menghilangkan bagian lain dalam kode.
Misalnya:
{
int a, b, c;
int x, y;
/*
...
*/
x = a + b;
y = a + b + c;
/*
...
*/
}
dapat dioptimalkan sebagai berikut:
{
int a, b, c;
int x, y;
/*
...
*/
x = a + b;
y = x + c; // a + b is replaced by x
/*
...
*/
}
Misalnya:
{
int a;
for (i = 0; i < 1000; i++ ) {
/*
...
*/
a = 10;
/*
...
*/
}
}
Pada kode di atas, jika 'a' bersifat lokal dan tidak digunakan dalam loop, maka dapat dioptimalkan sebagai berikut:
{
int a;
a = 10;
for (i = 0; i < 1000; i++ ) {
/*
...
*/
}
}
Di sini, kompilator menghasilkan kode assembly sehingga variabel yang lebih sering digunakan disimpan di register.
Di sini pengoptimalan bergantung pada CPU. Misalkan jika ada lebih dari satu lompatan dalam kode maka lompatan itu diubah menjadi satu sebagai:
-----
jmp:<addr1>
<addr1> jmp:<addr2>
-----
-----
Kontrol melompat ke langsung.
Kemudian fase terakhir adalah Menghubungkan (yang membuat eksekusi atau pustaka). Saat eksekusi dijalankan, pustaka yang dibutuhkannya dimuat.
Representasi ASCII:
[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]
Semoga ini bisa membantu Anda lebih banyak.
Pertama, lihat diagram ini:
(img source->internet)
Anda membuat sepotong kode dan menyimpan file (Kode sumber), lalu
Preprocessing : - Seperti namanya, ini bukan bagian dari kompilasi. Mereka menginstruksikan kompiler untuk melakukan pra-pemrosesan yang diperlukan sebelum kompilasi sebenarnya. Anda dapat memanggil fase ini Substitusi Teks atau menafsirkan arahan preprocessor khusus yang dilambangkan dengan #.
Kompilasi : - Kompilasi adalah proses di mana program yang ditulis dalam satu bahasa diterjemahkan ke bahasa lain yang ditargetkan. Jika ada beberapa kesalahan, kompilator akan mendeteksinya dan melaporkannya.
Merakit : - Merakit kode diterjemahkan ke dalam kode mesin. Anda dapat menyebut assembler sebagai tipe compier khusus.
Menautkan : - Jika bagian kode ini memerlukan beberapa file sumber lain untuk ditautkan, tautkan linker tersebut untuk menjadikannya file yang dapat dieksekusi.
Ada banyak proses yang terjadi setelahnya. Ya, Anda dapat menebaknya di sinilah peran loader:
Loader : - Memuat kode yang dapat dieksekusi ke dalam memori; program dan tumpukan data dibuat, register diinisialisasi.
Sedikit Info Ekstra: - http://www.geeksforgeeks.org/memory-layout-of-c-program/ , Anda dapat melihat tata letak memori di sana.
Compiler: Ini adalah program yang menerjemahkan program bahasa tingkat tinggi ke dalam program bahasa mesin. Kompiler lebih cerdas daripada assembler. Ia memeriksa semua jenis batasan, rentang, kesalahan, dll. Tetapi waktu berjalan programnya lebih banyak dan menempati sebagian besar memori. Ini memiliki kecepatan lambat. Karena kompilator melewati seluruh program dan kemudian menerjemahkan seluruh program ke dalam kode mesin. Jika kompiler berjalan di komputer dan menghasilkan kode mesin untuk komputer yang sama, maka itu dikenal sebagai kompilator mandiri atau kompilator residen. Di sisi lain, jika kompiler berjalan di komputer dan menghasilkan kode mesin untuk komputer lain, maka itu dikenal sebagai kompilator silang.
Linker: Dalam bahasa tingkat tinggi, beberapa file header atau pustaka bawaan disimpan. Library ini telah ditentukan sebelumnya dan ini berisi fungsi dasar yang penting untuk menjalankan program. Fungsi-fungsi ini dihubungkan ke perpustakaan oleh program yang disebut Linker. Jika linker tidak menemukan pustaka dari suatu fungsi, maka linker akan menginformasikan ke kompilator dan kemudian kompilator menghasilkan kesalahan. Kompilator secara otomatis memanggil linker sebagai langkah terakhir dalam menyusun program. Tidak dibangun di perpustakaan, itu juga menghubungkan fungsi yang ditentukan pengguna ke perpustakaan yang ditentukan pengguna. Biasanya program yang lebih panjang dibagi menjadi subprogram yang lebih kecil yang disebut modul. Dan modul-modul ini harus digabungkan untuk menjalankan program. Proses penggabungan modul dilakukan oleh linker.
Loader: Loader adalah program yang memuat kode mesin dari suatu program ke dalam memori sistem. Dalam Komputasi, loader adalah bagian dari Sistem Operasi yang bertanggung jawab untuk memuat program. Ini adalah salah satu tahapan penting dalam proses memulai program. Karena itu menempatkan program ke dalam memori dan mempersiapkannya untuk eksekusi. Memuat program melibatkan membaca konten file yang dapat dieksekusi ke dalam memori. Setelah pemuatan selesai, sistem operasi memulai program dengan meneruskan kontrol ke kode program yang dimuat. Semua sistem operasi yang mendukung pemuatan program memiliki loader. Di banyak sistem operasi, loader disimpan secara permanen di memori.
Wikipedia seharusnya memiliki jawaban yang bagus, inilah pemikiran saya:
*
*
Linker dan Loader dari LinuxJournal menjelaskan konsep ini dengan jelas. Ini juga menjelaskan bagaimana nama klasik a.out muncul. (keluaran assembler)
Ringkasan singkat,
c program --> [compiler] --> objectFile --> [linker] --> executable file (say, a.out)
Kami mendapatkan file yang dapat dieksekusi, sekarang berikan file ini ke teman Anda atau ke pelanggan Anda yang membutuhkan software ini :)
ketika mereka menjalankan perangkat lunak ini, katakan dengan mengetikkannya di baris perintah ./a.out
execute in command line ./a.out --> [Loader] --> [execve] --> program is loaded in memory
Setelah program dimuat ke dalam memori, kontrol ditransfer ke program ini dengan membuat PC (penghitung program) menunjuk ke instruksi pertama a.out
Ini akan membaca file sumber yang mungkin berjenis .c atau .cpp dll dan menerjemahkannya ke file .o disebut sebagai file objek.
Ini menggabungkan beberapa file .o yang dapat dihasilkan untuk beberapa file sumber menjadi file yang dapat dieksekusi (format ELF di GCC). Ada dua jenis penautan:
Program yang memuat file yang dapat dieksekusi ke memori utama mesin.
Untuk studi detail tentang ketiga tahapan eksekusi program ini di Linux, silakan baca ini .
perubahan kompilator memeriksa kode sumber Anda untuk kesalahan dan mengubahnya menjadi kode objek. ini adalah kode yang dijalankan sistem operasi.
Anda sering tidak menulis seluruh program dalam satu file jadi linker menautkan semua file kode objek Anda.
program Anda tidak akan dieksekusi kecuali di memori utama
Linker & Interpreter adalah Interpreter yang saling eksklusif mendapatkan kode baris demi baris dan mengeksekusi baris demi baris.
Compiler Ini mengubah kode sumber menjadi kode objek.
Linker Ini menggabungkan beberapa file objek menjadi satu file program yang dapat dieksekusi.
Loader Ini memuat file yang dapat dieksekusi ke dalam memori utama.
Kompiler adalah program khusus yang memproses pernyataan yang ditulis dalam bahasa pemrograman tertentu dan mengubahnya menjadi bahasa mesin atau "kode" yang digunakan prosesor komputer.
Kompiler menerjemahkan baris kode dari bahasa pemrograman ke dalam bahasa mesin.
Linker membuat hubungan antara dua program.
Loader memuat program ke dalam memori di database utama, program, dll.
Compiler: ini adalah perangkat lunak sistem yang memperbaiki kesalahan program, file objek, pesan, dll
Linker: ini adalah perangkat lunak sistem yang menggabungkan satu atau lebih file objek dan mungkin beberapa kode pustaka ke dalam beberapa perpustakaan yang dapat dicontohkan atau daftar kesalahan
Loader: Program yang memuat file yang dapat dieksekusi ke memori utama mesin