Diagram Cross Compiler's T

9

Saya sedang mempelajari Bootstrapping dari Red Dragon Book Compiler dan menemukan diagram T untuk cross compiler cukup membingungkan. Saya tidak mengerti apa yang dimaksud dengan "Jalankan compiler1 melalui compiler2". Adakah yang bisa memberikan penjelasan yang lebih baik, analogi atau contoh untuk berhubungan dengan beberapa kompiler dunia nyata?

Beberapa notasi dulu. Dengan Maksudku compiler untuk bahasa L ditulis dalam bahasa S yang menghasilkan bahasa keluaran / kode mesin N . Ini adalah batu nisan atau diagram-T .LSN= masukkan deskripsi gambar di siniLSN

Mengkompilasi Kompiler

  1. Misalkan kita memiliki cross-compiler untuk bahasa baru L dalam bahasa implementasi S menghasilkan kode untuk mesin N.

    LSN=
    T-diagram untuk LSN

  2. Misalkan kita juga memiliki kompiler S yang ada berjalan pada mesin M menerapkan kode untuk mesin M:

    SMM=
    T-diagram untuk SMM

  3. Jalankan LSN melalui SMM untuk menghasilkan LMN

Konstruksi Penyusun

LMN=LSN+SMM
T-diagram untuk LMN = LSN + SMM

Raphael
sumber
Saya menambahkan beberapa diagram-T, yang seharusnya membuatnya lebih mudah untuk memahami apa yang terjadi. Semoga seseorang dapat menemukan cara yang lebih baik untuk mengubahnya.
Dave Clarke

Jawaban:

11

Diagram-T (yang telah Anda hilangkan dari versi asli pertanyaan Anda) sangat penting untuk memahami pertanyaan semacam ini. Mari kita lihat diagram-T terakhir.

masukkan deskripsi gambar di sini

T pertama menggambarkan kompiler dari L ke N yang ditulis dalam S.

T kedua menggambarkan kompiler dari S ke M yang ditulis dalam M (atau berjalan di M). Ini akan menjadi kompiler kompiler Anda .

Menerapkan T kedua ke T pertama mengkompilasi T pertama sehingga beroperasi pada mesin M. Hasilnya adalah kompiler dari L ke N yang berjalan pada mesin M.

Fakta bahwa T kedua juga berjalan pada mesin M adalah menangkap bahwa Anda menjalankan kompilator pada mesin yang akan Anda jalankan kompiler, daripada harus menggunakan kompilator silang (yang akan menjadi kasus jika M bawah berbeda ).

Dave Clarke
sumber
5

Ini berarti bahwa kami mengkompilasi LSN dengan SMM, yaitu, jalankan kode sumber LSN melalui SMM.

Ketika SMM mengkompilasi beberapa kode sumber, itu menghasilkan executable untuk mesin M, jadi ketika kami mengkompilasi LSN dengan SMM kami mendapatkan LMN - executable, yang mengkompilasi file sumber L pada mesin M untuk menghasilkan executable untuk mesin N.

Mungkin akan lebih mudah untuk memahami ini dengan analogi. Misalkan kita memiliki kompiler C ccyang ditulis dalam Fortran, yang menghasilkan kode ARM. Misalkan kita juga memiliki kompiler Fortran fcdi komputer x64 kita. Jika kita mengkompilasi cckode sumber dengan fckita mendapatkan program yang berjalan pada x64, mengkompilasi program C, tetapi menghasilkan executable untuk ARM.

Daniil
sumber
0

Untuk membuatnya sederhana ....

Catatan: Ingat Kompiler hanya dapat berjalan pada bahasa tingkat rendah.

Dalam Diagram 1, kompiler ditulis dalam HLL (High Level Langg) sehingga tidak dapat dijalankan bahwa pada mesin, implementasi langg dari compiler harus dalam LLL.

Jadi, dalam Diagram 2, Implementasi langg dari kompiler dijalankan pada kompiler Resident diri sehingga kode target dapat berjalan pada mesinnya sendiri.

Akhirnya, menggabungkan keduanya kompiler berjalan pada mesin dengan langg - M

masukan langg - L

keluaran Langg - N

Lakukan padaku
sumber