Apa itu compiler, linker, loader?

Jawaban:

186
=====> 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 preprocessor: -

Pemrosesan awal C adalah langkah pertama dalam kompilasi. Ini menangani:

  1. #define pernyataan.
  2. #include pernyataan.
  3. Pernyataan bersyarat.
  4. Makro

Tujuan unit ini adalah untuk mengubah file sumber C menjadi file kode C Murni.

Kompilasi C:

Ada Enam langkah di unit:

1) Penganalisis Leksikal:

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.

2) Penganalisis Sintaks:

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.

3) Penganalisis Semantik:

Unit ini memeriksa arti dalam pernyataan. Misalnya:

{
    int i;
    int *p;

    p = i;
    -----
    -----
    -----
}

Kode di atas menghasilkan kesalahan "Assignment of incompatible type".

4) Pra-Optimasi:

Unit ini tidak bergantung pada CPU, yaitu ada dua jenis pengoptimalan

  1. Preoptimisasi (tidak tergantung CPU)
  2. Pasca pengoptimalan (tergantung CPU)

Unit ini mengoptimalkan kode dalam bentuk berikut:

  • I) Penghapusan kode mati
  • II) Penghapusan sub kode
  • III) Optimalisasi loop

I) Penghapusan kode mati:

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.

II) Penghapusan sub 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

    /*
     ...
    */
}

III) Pengoptimalan loop:

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++ ) {
        /*
        ...
        */
    }
}

5) Pembuatan kode:

Di sini, kompilator menghasilkan kode assembly sehingga variabel yang lebih sering digunakan disimpan di register.

6) Pasca Pengoptimalan:

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.

chus
sumber
6
Saya tidak yakin mengapa belum ada yang menunjukkannya, tetapi linker dan loader tidak dalam langkah yang sama. Menghubungkan adalah bagian dari kompilasi sementara memuat adalah bagian dari (sebelum) menjalankan program.
SimpleGuy
Dimana 7) Assembler dan yang terpenting 8) Linker dan 9) Loader yang ditanyakan?
131
  • Kompilator membaca, menganalisis, dan menerjemahkan kode ke dalam file objek atau daftar pesan kesalahan.
  • Sebuah linker menggabungkan satu atau lebih file objek dan mungkin beberapa kode perpustakaan menjadi beberapa yang dapat dijalankan, beberapa perpustakaan atau daftar pesan kesalahan.
  • Sebuah loader membaca kode yang dapat dieksekusi ke dalam memori, melakukan beberapa terjemahan alamat dan mencoba menjalankan program yang menghasilkan program yang sedang berjalan atau pesan kesalahan (atau keduanya).

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]
Toon Krijthe
sumber
2
penjelasan ini langsung ke depan. Anda harus mempertimbangkan untuk menjadi seorang dosen. Terima kasih
0.sh
Terima kasih karena tidak menghindari menjawab tentang linker dan loader!
29

Semoga ini bisa membantu Anda lebih banyak.

Pertama, lihat diagram ini:

                         (img source->internet)

sumber-> 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.

Anurag Bhakuni
sumber
15

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.

Tanu Saxena
sumber
14

Wikipedia seharusnya memiliki jawaban yang bagus, inilah pemikiran saya:

  • Kompilator: membaca sumber sesuatu.c, menulis objek sesuatu.o.
  • Linker: menggabungkan beberapa file * .o ke dalam program yang dapat dijalankan.
  • Loader: kode yang memuat file yang dapat dieksekusi ke dalam memori dan mulai menjalankannya.
RedGrittyBrick
sumber
4

*

dijelaskan sehubungan dengan, sistem berbasis linux / unix, meskipun itu adalah konsep dasar untuk semua sistem komputasi lainnya.

*

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

tsenapathy
sumber
4

Penyusun:

Ini akan membaca file sumber yang mungkin berjenis .c atau .cpp dll dan menerjemahkannya ke file .o disebut sebagai file objek.

Linker:

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:

  • tautan statis
  • tautan dinamis

Pemuat:

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 .

Raghu
sumber
1

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

samsri
sumber
1
  • Kompiler : Yang mengubah format yang dapat dimengerti manusia menjadi format yang dapat dimengerti mesin
  • Linker : Yang mengubah format yang dapat dimengerti mesin menjadi format yang dapat dimengerti sistem Operasi
  • Loader : adalah entitas yang benar-benar memuat dan menjalankan program ke dalam RAM

Linker & Interpreter adalah Interpreter yang saling eksklusif mendapatkan kode baris demi baris dan mengeksekusi baris demi baris.

Sugat Mankar
sumber
1
  • Compiler: Penerjemah bahasa yang mengubah program lengkap menjadi bahasa mesin untuk menghasilkan program yang dapat diproses oleh komputer secara keseluruhan.
  • Linker: Program utilitas yang mengambil satu atau lebih file objek yang dikompilasi dan menggabungkannya menjadi file yang dapat dieksekusi atau file objek lain.
  • Loader: memuat kode yang dapat dieksekusi ke dalam memori, membuat program dan tumpukan data, menginisialisasi register dan mulai menjalankan kode.
lucy
sumber
1

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.

Jeevan Joshi
sumber
1
Saya rasa jawaban Anda sebagian besar tercakup dalam 14 jawaban berkualitas tinggi yang ada dari 10 tahun terakhir
Nicolas Gervais
0

Kompiler adalah program khusus yang memproses pernyataan yang ditulis dalam bahasa pemrograman tertentu dan mengubahnya menjadi bahasa mesin atau "kode" yang digunakan prosesor komputer.

anil kumar chaurasia
sumber
0

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.

Mayur padhiyar Raysing bhai
sumber
-1

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

Abinasha Das
sumber