Dalam upaya memberikan pandangan yang sedikit berbeda dengan jawaban lain, saya akan menjawab seperti ini.
(Penafian: Saya menyederhanakan sedikit hal, situasi yang saya berikan adalah murni hipotetis dan ditulis sebagai sarana untuk menunjukkan konsep daripada 100% benar untuk kehidupan).
Pikirkan hal-hal dari sudut pandang lain, bayangkan Anda baru saja menulis sebuah sistem operasi sederhana dengan kemampuan dasar threading, windowing dan manajemen memori. Anda ingin menerapkan pustaka C ++ untuk membiarkan pengguna memprogram dalam C ++ dan melakukan hal-hal seperti membuat windows, menggambar ke windows dll. Pertanyaannya adalah, bagaimana melakukan ini.
Pertama, karena C ++ mengkompilasi ke kode mesin, Anda perlu menentukan cara untuk menggunakan kode mesin untuk berinteraksi dengan C ++. Di sinilah fungsi masuk, fungsi menerima argumen dan memberikan nilai balik, sehingga memberikan cara standar untuk mentransfer data antara berbagai bagian kode. Mereka melakukan ini dengan menetapkan sesuatu yang dikenal sebagai konvensi pemanggilan .
Sebuah konvensi menelepon negara di mana dan bagaimana argumen harus ditempatkan di memori sehingga fungsi dapat menemukan mereka ketika dijalankan. Ketika suatu fungsi dipanggil, fungsi panggilan menempatkan argumen dalam memori dan kemudian meminta CPU untuk beralih ke fungsi lainnya, di mana ia melakukan apa yang dilakukannya sebelum melompat kembali ke tempat ia dipanggil. Ini berarti bahwa kode yang dipanggil dapat berupa apa saja dan itu tidak akan mengubah cara fungsi dipanggil. Namun dalam hal ini, kode di belakang fungsi akan relevan dengan sistem operasi dan akan beroperasi pada kondisi internal sistem operasi.
Jadi, berbulan-bulan kemudian dan Anda memiliki semua fungsi OS Anda beres. Pengguna Anda dapat memanggil fungsi untuk membuat windows dan menggambar di atasnya, mereka dapat membuat utas dan segala macam hal indah. Inilah masalahnya, fungsi OS Anda akan berbeda dengan fungsi Linux atau fungsi Windows. Jadi, Anda memutuskan untuk memberikan antarmuka standar kepada pengguna agar mereka dapat menulis kode portabel. Di sinilah QT masuk.
Seperti yang hampir pasti Anda ketahui, QT memiliki banyak kelas dan fungsi yang berguna untuk melakukan hal-hal yang dilakukan sistem operasi, tetapi dengan cara yang tampak independen dari sistem operasi yang mendasarinya. Cara kerjanya adalah bahwa QT menyediakan kelas dan fungsi yang seragam dalam penampilannya bagi pengguna, tetapi kode di belakang fungsi berbeda untuk setiap sistem operasi. Sebagai contoh, QApplication QT :: closeAllWindows () akan memanggil fungsi penutupan jendela khusus setiap sistem operasi tergantung pada versi yang digunakan. Di Windows kemungkinan besar akan memanggil CloseWindow (hwnd) sedangkan pada os menggunakan Sistem X Window, itu berpotensi akan memanggil XDestroyWindow (tampilan, jendela).
Seperti terbukti, sistem operasi memiliki banyak lapisan, yang semuanya harus berinteraksi melalui antarmuka banyak varietas. Ada banyak aspek yang belum saya sentuh, tetapi untuk menjelaskan semuanya, akan memakan waktu yang sangat lama. Jika Anda lebih tertarik dengan cara kerja sistem operasi dalam, saya sarankan memeriksa wiki dev OS .
Ingatlah bahwa alasan banyak sistem operasi memilih untuk mengekspos antarmuka ke C / C ++ adalah karena mereka mengkompilasi ke kode mesin, mereka mengizinkan instruksi perakitan untuk dicampur dengan kode mereka sendiri dan mereka memberikan tingkat kebebasan yang besar kepada programmer.
Sekali lagi, ada banyak hal yang terjadi di sini. Saya ingin terus menjelaskan bagaimana perpustakaan seperti file .so dan .dll tidak harus ditulis dalam C / C ++ dan dapat ditulis dalam bahasa assembly atau bahasa lain, tetapi saya merasa bahwa jika saya menambahkan lagi saya mungkin juga akan tulis seluruh artikel, dan sebanyak yang saya ingin lakukan, saya tidak punya situs untuk menyimpannya.