[Powered by Google Translate] ROB Bowden: Mari kita bercakap tentang penyusun.
Sehingga ketika ini, anda hanya perlu ditaip kod sumber anda ke
beberapa fail, menghantar mereka melalui kotak hitam ini besar yang
Dilafaz, dan keluar datang fail boleh laku anda yang tidak
apa yang anda menulis dalam kod sumber anda.
Sebagai ajaib seperti itu, kita akan mengambil lebih dekat
melihat apa yang sebenarnya berlaku
apabila kita menyusun fail.
Jadi apakah maknanya untuk menyusun sesuatu?
>> Nah, dalam erti kata yang paling umum, ia hanya bermakna
kod mengubah ditulis dalam satu
bahasa pengaturcaraan yang lain.
Tetapi biasanya apabila orang mengatakan mereka menyusun sesuatu, mereka
bererti mereka sedang mengambil dari pengaturcaraan peringkat tinggi
bahasa untuk bahasa pengaturcaraan tahap yang lebih rendah.
Ini mungkin kelihatan seperti segi yang sangat subjektif.
Sebagai contoh, anda mungkin tidak berfikir C sebagai tinggi
tahap bahasa pengaturcaraan, tetapi anda menyusun ia.
Tetapi ia adalah semua saudara.
Seperti yang kita akan lihat, kod pemasangan dan akhirnya mesin
kod yang kita menyusun ke adalah tidak dapat dinafikan tahap yang lebih rendah
daripada C.
Walaupun kami akan menggunakan dilafaz dalam demonstrasi hari ini,
banyak idea-idea di sini membawa kepada penyusun lain.
>> Untuk dilafaz, terdapat empat langkah utama dalam keseluruhan
kompilasi.
Ini adalah salah, prapemprosesan dilakukan oleh prapemproses, dua,
kompilasi yang dilakukan oleh pengkompil, tiga, memasang
dilakukan oleh penghimpun; dan empat,
menghubungkan dilakukan oleh pemaut.
Ia boleh mengelirukan bahawa salah satu substeps keseluruhan
Penyusun dilafaz dipanggil pengkompil, tetapi
kita akan mendapat itu.
Kami akan menggunakan program dunia hello mudah sebagai contoh kita
sepanjang video ini.
Mari kita lihat.
>> Langkah pertama adalah prapemprosesan.
Apakah prapemproses lakukan?
Dalam cukup banyak program C setiap anda pernah membaca atau bertulis,
anda telah digunakan baris kod yang bermula dengan hash.
Saya akan memanggilnya hash, tetapi anda juga boleh memanggil ia pound, bilangan
menandatangani, atau tajam.
Mana-mana garis itu adalah arahan prapemproses.
Anda mungkin dilihat # menentukan dan # include sebelum, tetapi terdapat
adalah beberapa lagi yang mengiktiraf prapemproses.
Mari kita menambah # define contoh dunia hello kami.
Sekarang mari kita berlari hanya prapemproses pada fail ini.
Dengan lulus bendera E-clage, anda mengarahkan ia untuk menjalankan
hanya prapemproses.
Mari kita lihat apa yang berlaku.
Ia kelihatan seperti dilafaz hanya memuntahkannya daripada segala-galanya
pada baris arahan.
Dalam usaha untuk menyelamatkan semua output ini kepada fail baru yang dipanggil
hello2.c, kami akan melampirkan> hello2.c kepada arahan kami.
Sekarang mari kita lihat file preprocessed kami.
>> Wah, apa yang berlaku kepada program sedikit pendek kita?
Jika kita pergi sepanjang jalan ke bawah fail ini, kita akan lihat
beberapa kod yang kita sebenarnya menulis.
Notis bahawa mentakrifkan # hilang dan semua contoh nama
telah digantikan dengan apa yang kita dinyatakan dalam
# menentukan barisan.
Jadi apakah semua ini typedefs dan pengisytiharan fungsi
di atas fail?
Notis bahawa mentakrifkan # tidak adalah hanya prapemproses
arahan yang kita dinyatakan.
Kami juga telah # include stdio.h.
Jadi semua garis gila adalah sebenarnya hanya stdio.h disalin
dan ditampal ke atas fail ini.
Itulah sebabnya fail header adalah begitu berguna untuk fungsi
pengisytiharan.
Sebaliknya perlu salin dan tampal semua fungsi
pengisytiharan anda merancang untuk menggunakan di atas fail anda,
prapemproses akan copy dan paste mereka dari pengepala
memfailkan untuk anda.
>> Sekarang bahawa kita sedang dilakukan prapemprosesan, kita bergerak ke
kompilasi.
Sebab kita panggil ini kompilasi langkah adalah kerana ini adalah
langkah di mana dilafaz sebenarnya tidak menyusun dari C ke
Kod pemasangan.
Dalam usaha untuk mempunyai dilafaz menyusun fail ke perhimpunan, tetapi
terus lagi, meluluskan ia S-bendera
pada baris arahan.
Mari kita lihat pada perhimpunan
fail yang telah outputted.
Ia kelihatan seperti agak bahasa yang berbeza.
Perhimpunan kod adalah sangat pemproses tertentu.
Dalam kes ini, sejak perkakas CS50 berjalan pada
pemproses x86 maya, ini adalah kod pemasangan x86.
Sangat beberapa orang yang menulis secara langsung dalam kod perhimpunan hari ini,
tetapi setiap program C anda pernah menulis mendapat berubah ke bawah
ke perhimpunan.
Sekali lagi, kita panggil ini langkah menyusun C ke perhimpunan
sejak kita pergi dari tahap yang lebih tinggi ke tahap yang lebih rendah
bahasa pengaturcaraan.
>> Apa yang membuatkan tahap pemasangan yang lebih rendah daripada C?
Nah, dalam perhimpunan, kami sangat terhad dalam apa yang kita boleh lakukan.
Terdapat ada, manakala adalah, adalah, atau gelung apa-apa jenis.
Tetapi anda boleh mencapai perkara yang sama bahawa kawalan ini
struktur menawarkan menggunakan operasi terhad bahawa
pemasangan tidak menyediakan.
Tetapi untuk melihat betapa pemasangan tahap rendah benar-benar adalah, mari kita pergi
satu langkah ke hadapan dalam penyusunan kita, pemasangan.
Ia adalah kerja penghimpun untuk mengubah kod pemasangan
ke dalam objek atau kod mesin.
Ingatlah bahawa penghimpun tidak pemasangan output;
sebaliknya, ia mengambil masa dalam perhimpunan dan output kod mesin.
Kod mesin adalah sebenar 1 dan 0 yang CPU boleh
memahami, walaupun kita masih mempunyai sedikit kecil kerja yang ditinggalkan
sebelum kita boleh menjalankan program kami.
Mari kita memasang kod perhimpunan kami oleh lulus
Dilafaz c-bendera.
Sekarang mari kita lihat apa yang dalam fail dipasang.
>> Nah, itu tidak membantu kita sangat banyak.
Ingatlah bahawa kod mesin adalah orang-orang dan sifar yang
komputer anda boleh memahami.
Itu tidak bermakna ia adalah mudah untuk kita memahami.
Jadi tepat bagaimana rendah tahap adalah perhimpunan?
Ia hampir sama dengan kod objek.
Melangkah dari pemasangan kepada kod objek adalah lebih daripada satu
terjemahan daripada transformasi, itulah sebabnya
kita tidak mungkin mempertimbangkan penghimpun
melakukan apa-apa menyusun sebenar.
Malah, ia agak mudah untuk manual menterjemah dari
pemasangan untuk kod mesin.
Melihat pemasangan untuk fungsi utama, yang baris pertama
berlaku sesuai dengan 0x55 perenambelasan.
Dalam binari, itulah 1010101.
Barisan kedua berlaku sesuai 0x895 perenambelasan.
Dan seterusnya, 0x56.
Memandangkan jadual yang agak mudah, anda boleh menterjemahkan
pemasangan ke dalam kod bahawa mesin boleh memahami terlalu.
>> Jadi ada satu langkah yang masih berada dalam
kompilasi, yang menghubungkan.
Menghubungkan menggabungkan sekumpulan fail objek ke dalam satu fail besar
bahawa anda sebenarnya boleh melaksanakan.
Menghubungkan adalah sangat sistem bergantung.
Jadi cara yang paling mudah untuk mendapatkan dilafaz hanya menghubungkan objek
fail bersama-sama adalah untuk memanggil dilafaz pada semua fail yang
anda mahu untuk menghubungkan bersama-sama.
Jika anda nyatakan. Fail o, maka ia tidak perlu untuk memproses semula,
menyusun, dan memasang semua kod sumber anda.
Mari kita membuang fungsi matematik ke dalam fail kita, jadi kita perlu
sesuatu untuk menghubungkan masuk
Sekarang mari kita menyusun kembali ke kod objek dan
dilafaz panggilan di atasnya.
Oops.
Sejak kita termasuk fungsi matematik, kita perlu untuk menghubungkan
perpustakaan matematik dengan lm.
>> Jika kita mahu untuk menghubungkan bersama sekumpulan. O fail yang kita
wrote on kita sendiri, kita hanya akan menyatakan mereka semua di
baris arahan.
Sekatan adalah bahawa satu-satunya fail-fail ini mesti
sebenarnya menentukan fungsi utama, atau lain
laku yang terhasil tidak akan tahu di mana untuk bermula
menjalankan kod anda.
Apakah perbezaan antara menyatakan fail untuk menghubungkan
dengan-l dan hanya menyatakan fail langsung?
Tiada apa-apa.
Ia hanya dilafaz yang berlaku untuk mengetahui fail tepat apa
sesuatu seperti lm berlaku untuk merujuk kepada.
Jika anda tahu bahawa fail sendiri, anda boleh menentukan ia
jelas.
Hanya ingat bahawa bendera-l perlu datang pada akhir
permintaan pelanggan anda.
>> Dan itu semua ada padanya.
Apabila anda hanya menjalankan dilafaz pada beberapa fail, ini adalah apa yang ia
sebenarnya melakukan.
Nama saya adalah Rob Bowden, dan ini adalah CS50.