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