[Powered by Google Translate] ROB Bowden: Mari kita bicara tentang kompiler.
Sampai titik ini, Anda baru saja mengetik kode sumber Anda ke
beberapa file, mengirim mereka melalui kotak hitam besar yang
Clang, dan keluar datang file eksekusi yang tidak
apa yang Anda tulis dalam kode sumber Anda.
Sebagai magis seperti itu sudah, kita akan mengambil lebih dekat
melihat apa yang sebenarnya terjadi
ketika kita mengkompilasi file.
Jadi apa artinya untuk mengkompilasi sesuatu?
>> Nah, dalam pengertian yang paling umum, itu hanya berarti
mengubah kode yang ditulis dalam satu
pemrograman bahasa ke bahasa lain.
Tapi biasanya ketika orang mengatakan mereka mengkompilasi sesuatu, mereka
berarti mereka mengambil dari pemrograman tingkat tinggi
bahasa ke bahasa pemrograman tingkat yang lebih rendah.
Ini mungkin tampak seperti hal yang sangat subjektif.
Sebagai contoh, Anda mungkin tidak berpikir tentang C sebagai tinggi
bahasa pemrograman tingkat, tetapi Anda compile.
Tapi itu semua relatif.
Seperti yang akan kita lihat, kode perakitan dan akhirnya mesin
kode yang kita mengkompilasi ke tidak diragukan lagi tingkat yang lebih rendah
dibandingkan C.
Meskipun kami akan menggunakan dentang dalam demonstrasi hari ini, sebuah
banyak ide di sini membawa ke kompiler lain.
>> Untuk dentang, ada empat langkah utama dalam keseluruhan
kompilasi.
Ini adalah salah satu, preprocessing dilakukan oleh preprocessor, dua,
kompilasi dilakukan oleh kompilator, tiga, perakitan
dilakukan oleh assembler, dan empat,
menghubungkan dilakukan oleh linker.
Ini mungkin membingungkan bahwa salah satu substeps dari keseluruhan
Kompiler clang disebut kompilator, namun
kita akan mendapatkan bahwa.
Kami akan menggunakan program sederhana halo dunia sebagai contoh kami
seluruh video ini.
Mari kita lihat.
>> Langkah pertama adalah preprocessing.
Apa preprocessor lakukan?
Dalam hampir setiap program C Anda pernah membaca atau menulis,
Anda telah menggunakan baris kode yang dimulai dengan hash.
Saya akan menyebutnya hash, tetapi Anda juga dapat menyebutnya pound, jumlah
menandatangani, atau tajam.
Setiap baris tersebut adalah direktif preprocessor.
Anda mungkin pernah melihat # define dan # include sebelumnya, tapi ada
beberapa lagi yang preprocessor mengakui.
Mari menambahkan # define untuk contoh dunia halo kami.
Sekarang mari kita jalankan hanya preprocessor pada file ini.
Dengan melewati bendera clage E-, Anda menginstruksikan untuk menjalankan
hanya preprocessor.
Mari kita lihat apa yang terjadi.
Sepertinya dentang hanya meludah keluar semua
pada baris perintah.
Dalam rangka untuk menyimpan semua output ini ke file baru yang disebut
hello2.c, kita akan tambahkan> hello2.c perintah kita.
Sekarang mari kita lihat pada file preprocessed kami.
>> Whoa, apa yang terjadi pada program pendek kecil kami?
Jika kita pergi semua jalan ke bagian bawah file ini, kita akan melihat
beberapa kode yang kita benar-benar menulis.
Perhatikan bahwa # mendefinisikan hilang dan semua contoh nama
telah diganti dengan apa yang kita ditentukan dalam
# define baris.
Jadi apa yang semua typedef dan deklarasi fungsi
di bagian atas file?
Perhatikan bahwa # define bukan hanya preprocessor
direktif yang kita tentukan.
Kami juga telah # include stdio.h.
Jadi semua lini gila sebenarnya hanya stdio.h disalin
dan disisipkan ke bagian atas file ini.
Itulah sebabnya file header sangat berguna untuk fungsi
deklarasi.
Alih-alih perlu copy dan paste semua fungsi
deklarasi Anda berencana untuk menggunakan di bagian atas file Anda,
preprocessor akan copy dan paste mereka dari header
mengajukan untuk Anda.
>> Sekarang kita sudah selesai preprocessing, kita bergerak ke
kompilasi.
Alasan kita sebut ini kompilasi langkah ini karena ini adalah
langkah mana dentang sebenarnya tidak kompilasi nya dari C ke
perakitan kode.
Dalam rangka untuk memiliki dentang mengkompilasi file ke perakitan, namun
terus lagi, lulus S-flag
pada baris perintah.
Mari kita lihat pada perakitan
file yang outputted.
Sepertinya cukup bahasa yang berbeda.
Kode assembly sangat prosesor yang spesifik.
Dalam kasus ini, karena alat CS50 berjalan pada
prosesor x86 virtual, ini adalah kode assembly x86.
Sangat sedikit orang menulis langsung dalam kode assembly hari ini,
namun setiap program C Anda pernah menulis akan berubah bawah
dalam perakitan.
Sekali lagi, kita sebut ini langkah kompilasi C ke assembly
karena kita akan dari tingkat yang lebih tinggi ke tingkat yang lebih rendah
bahasa pemrograman.
>> Apa yang membuat tingkat perakitan lebih rendah daripada C?
Nah, dalam perakitan, kami sangat terbatas dalam apa yang bisa kita lakukan.
Tidak ada jika, sementara ini, untuk itu, atau loop apapun.
Tapi Anda bisa mencapai hal yang sama yang mengontrol ini
struktur menawarkan menggunakan operasi terbatas yang
perakitan tidak menyediakan.
Tapi untuk melihat seberapa perakitan tingkat rendah benar-benar, mari kita pergi
satu langkah lebih lanjut dalam penyusunan kami, perakitan.
Adalah tugas assembler untuk mengubah kode assembly
menjadi objek atau kode mesin.
Ingat bahwa assembler tidak perakitan output;
lebih, dibutuhkan dalam perakitan dan kode output mesin.
Kode mesin adalah 1 aktual dan 0 bahwa CPU dapat
mengerti, meskipun kami masih memiliki sedikit pekerjaan yang tersisa
sebelum kita dapat menjalankan program kami.
Mari kita merakit kode perakitan kami dengan melewati
Dentang-c bendera.
Sekarang mari kita lihat apa yang ada di file dirakit.
>> Nah, itu tidak membantu kami sangat banyak.
Ingat bahwa kode mesin adalah satu dan nol yang
komputer Anda dapat mengerti.
Itu tidak berarti itu mudah bagi kita untuk memahami.
Jadi persis bagaimana tingkat rendah adalah perakitan?
Ini hampir sama dengan kode obyek.
Pergi dari perakitan ke kode objek jauh lebih dari sebuah
terjemahan dari transformasi, yang mengapa
seseorang tidak mungkin mempertimbangkan assembler untuk
melakukan kompilasi aktual.
Bahkan, itu cukup mudah untuk menerjemahkan manual dari
perakitan ke kode mesin.
Melihat perakitan untuk fungsi utama, yaitu baris pertama
terjadi sesuai dengan 0x55 heksadesimal.
Dalam biner, itu 1010101.
Baris kedua terjadi sesuai 0x895 heksadesimal.
Dan, selanjutnya 0x56.
Mengingat meja relatif sederhana, Anda bisa menerjemahkan
perakitan ke dalam kode mesin yang dapat mengerti juga.
>> Jadi ada satu langkah yang tersisa dalam
kompilasi, yang menghubungkan.
Menghubungkan menggabungkan sekelompok file objek ke dalam satu file besar
bahwa Anda benar-benar bisa mengeksekusi.
Menghubungkan sangat tergantung dari sistem.
Jadi cara termudah untuk mendapatkan dentang hanya menghubungkan objek
file bersama adalah untuk memanggil dentang pada semua file yang
Anda ingin menghubungkan bersama-sama.
Jika Anda tentukan. File o, maka tidak akan perlu memproses ulang,
kompilasi, dan merakit semua kode sumber Anda.
Mari kita melempar fungsi matematika ke dalam file kami, sehingga kami memiliki
sesuatu untuk menghubungkan masuk
Sekarang mari kita compile kembali ke kode obyek dan
sebut dentang di atasnya.
Ups.
Karena kita termasuk fungsi matematika, kita perlu untuk link dalam
perpustakaan matematika dengan-lm.
>> Jika kita ingin menghubungkan bersama sekelompok. O file yang kita
menulis kita sendiri, kita hanya akan menentukan mereka semua pada
baris perintah.
Pembatasan adalah bahwa satu-satunya dari file-file ini harus
sebenarnya menetapkan fungsi utama, atau yang lain
executable yang dihasilkan tidak akan tahu di mana untuk memulai
menjalankan kode Anda.
Apa perbedaan antara menentukan file untuk link dalam
dengan-l dan hanya menentukan file secara langsung?
Tidak ada.
Hanya saja dentang yang terjadi untuk mengetahui berkas apa
sesuatu seperti-lm terjadi untuk merujuk.
Jika Anda tahu file yang sendiri, Anda bisa menentukan hal itu
eksplisit.
Hanya ingat bahwa semua-l bendera harus datang di akhir
permintaan klien Anda.
>> Dan itu semua ada untuk itu.
Bila Anda hanya menjalankan dentang pada beberapa file, ini adalah apa itu
benar-benar melakukannya.
Nama saya Rob Bowden, dan ini adalah CS50.