Saya mencoba untuk benar-benar memahami bagaimana sebenarnya bahasa tingkat tinggi dikonversi menjadi kode mesin dan kemudian dieksekusi oleh cpu.
Saya mengerti bahwa kode tersebut dikompilasi ke dalam kode mesin, yang merupakan kode tingkat rendah yang dapat digunakan CPU. Jika saya memiliki pernyataan tugas, katakan:
x = x + 5;
y = x - 3;
Apakah CPU menjalankan setiap baris satu per satu? Jadi pertama-tama akan menjalankan x = x + 5; instruksi dan instruksi selanjutnya yang akan dilakukan CPU adalah y = x-3; Saya benar-benar mencoba memahami proses eksekusi dan bagaimana kode yang saya tulis sebenarnya dieksekusi oleh CPU.
computer-science
cpu
Frankie
sumber
sumber
Jawaban:
Baris kode tidak ada hubungannya dengan bagaimana CPU mengeksekusinya. Saya sarankan membaca assembler, karena itu akan mengajarkan Anda banyak tentang bagaimana sebenarnya perangkat keras melakukan sesuatu. Anda juga bisa mendapatkan output assembler dari banyak kompiler.
Kode itu dapat dikompilasi menjadi sesuatu seperti (dalam bahasa assembly yang dibuat-buat):
Namun, jika kompiler tahu bahwa variabel tidak digunakan lagi, operasi toko mungkin tidak dipancarkan.
Sekarang bagi debugger untuk mengetahui kode mesin apa yang sesuai dengan satu baris sumber program, anotasi ditambahkan oleh kompiler untuk menunjukkan baris mana yang sesuai dengan di mana dalam kode mesin.
sumber
ADD Rx, Rx, $5
danSUB Ry, Rx, $3
(dengan asumsi bahwa variabel x dan y telah dipetakan ke dalam register). Anda sedang mendeskripsikan pendekatan RISC load / store.Tergantung.
Pada hari-hari awal mesin yang sangat sederhana, ya, kode dieksekusi satu baris pada satu waktu. Ketika mesin menjadi lebih besar, lebih cepat, dan lebih kompleks, Anda mulai melihat kemampuan untuk menjalankan beberapa instruksi secara bersamaan dan memori membaca dan menulis membutuhkan waktu lebih lama daripada operasi pada register.
Mengoptimalkan kompiler harus mempertimbangkan hal ini, dan baris yang Anda berikan dapat dieksekusi "lebih atau kurang" secara paralel, dengan satu bagian prosesor bekerja pada perhitungan y, sementara bagian lain menyimpan nilai baru yang sebelumnya dihitung dari x (dan perhitungan y menggunakan nilai baru dari register).
Control Data 6600 adalah mesin pertama yang saya tahu melakukan hal-hal semacam ini. Selain integer mengambil 300 nsec, referensi memori (baca atau tulis) mengambil 1000 nsec, mengalikan dan membagi membutuhkan BANYAK lebih lama. Hingga sekitar sepuluh instruksi semuanya dapat dieksekusi secara paralel, tergantung pada unit fungsional mana yang diperlukan. Kompiler FORTRAN CDC 6600 SANGAT bagus dalam menjadwalkan semua ini.
sumber
x
? Dengan cara ini, kode sudah dieksekusi dan disimpan dalam cache.Tidak, tidak ada pemetaan satu-ke-satu antara baris kode / instruksi dalam bahasa tingkat tinggi dan rendah. Bahkan, kedua baris di atas diterjemahkan ke dalam beberapa instruksi kode mesin , seperti
Detail sebenarnya dari instruksi ini bervariasi antar platform.
Ini adalah pandangan dasar dari banyak hal. Namun, untuk lebih memperumit masalah, CPU modern menerapkan teknik seperti pipa eksekusi , eksekusi out-of-order dan beberapa core , antara lain. Ini menghasilkan CPU melakukan banyak hal sekaligus, misal pipeline memproses fase berbeda dari instruksi selanjutnya secara paralel dalam unit pemrosesan yang sama, sementara banyak core dapat memproses instruksi independen secara paralel.
sumber
Anda harus melihat dengan sangat rinci dalam sebuah buku untuk menemukan lebih banyak detail tentang cara kerjanya, mungkin juga kelas kompiler.
Pada dasarnya, pertanyaan Anda berfokus pada 2 aspek berbeda.
1) Bagaimana kode diterjemahkan ke dalam kode mesin?
2) Kapan / bagaimana kode dihitung menggunakan paralelisasi?
Jawaban untuk 1) tergantung pada bahasa yang Anda gunakan (meskipun untuk contoh Anda sepele sehingga hasilnya akan sama). Cara kompiler melakukan terjemahan ke kode mesin adalah salah satu kekuatan bahasa. Selain itu, ada beberapa masalah yang perlu dipertimbangkan dalam contoh Anda, kode harus memuat data ke dalam memori, menyimpannya, dll.
Akhirnya paralelisasi adalah fitur yang dapat Anda paksa dari sudut pandang pemrograman, tetapi secara singkat, beberapa prosesor mungkin mencoba untuk berpikir bahwa beberapa bagian dari kode dapat dijalankan pada saat yang sama, karena mereka independen. Dalam kasus Anda, jelas, ini bukan masalahnya, karena Anda perlu menjalankan pernyataan secara berurutan, jadi tidak, itu tidak akan berjalan pada saat yang sama.
sumber