Намагаючись дати трохи інший погляд на інші відповіді, я відповім так.
(Відмова: Я трохи спрощую речі, ситуація, яку я даю, суто гіпотетична і написана як засіб демонстрації концепцій, а не 100% вірна життя).
Подумайте про речі з іншої точки зору, уявіть, що ви щойно написали просту операційну систему з основними можливостями управління потоками, вікнами та пам’яттю. Ви хочете впровадити бібліотеку C ++, щоб користувачі могли програмувати на C ++ і робити такі речі, як робити вікна, малювати вікна тощо. Питання полягає в тому, як це зробити.
По-перше, оскільки C ++ компілюється в машинний код, вам потрібно визначити спосіб використання машинного коду для взаємодії з C ++. Ось тут входять функції, функції приймають аргументи і повертають значення, таким чином вони забезпечують стандартний спосіб передачі даних між різними розділами коду. Вони роблять це, встановлюючи щось відоме як закликаюча конвенція .
А угоду про виклики держави , де і як аргументи повинні бути розміщені в пам'яті , так що функція може знайти їх , коли він запускається на виконання. Коли функція викликається, функція виклику розміщує аргументи в пам'яті, а потім просить процесор перейти до іншої функції, де він робить те, що робить, перш ніж перескакувати туди, звідки її викликали. Це означає, що викликаний код може бути абсолютно будь-яким, і він не змінить спосіб виклику функції. Однак у цьому випадку код, який стоїть за цією функцією, буде мати значення для операційної системи і діятиме на внутрішньому стані операційної системи.
Отже, через багато місяців у вас все функції ОС впорядковано. Ваш користувач може викликати функції для створення вікон та малювання на них, вони можуть створювати нитки та всілякі чудові речі. Ось проблема, проте функції вашої ОС будуть відрізнятися від функцій Linux або Windows. Тож ви вирішили потрібно надати користувачеві стандартний інтерфейс, щоб він міг писати портативний код. Ось де QT заходить.
Як ви майже напевно знаєте, QT має безліч корисних класів та функцій для виконання тих чи інших речей, які роблять операційні системи, але таким чином, що вони не залежать від основної операційної системи. Це працює таким чином, що QT надає класи та функції, які є однаковими за способом їх відображення користувачеві, але код за функціями відрізняється для кожної операційної системи. Наприклад, QApplication :: closeAllWindows () QT насправді викликає спеціалізовану функцію закриття вікон кожної операційної системи залежно від використовуваної версії. У Windows він, швидше за все, викликає CloseWindow (hwnd), тоді як на ОС, що використовує X Window System, він потенційно може викликати XDestroyWindow (дисплей, вікно).
Як очевидно, в операційній системі є багато шарів, всі вони повинні взаємодіяти через інтерфейси багатьох різновидів. Є багато аспектів, яких я навіть не торкався, але для їх пояснення потрібно було б дуже багато часу. Якщо вас більше цікавить внутрішня робота операційних систем, я рекомендую перевірити вікі OS dev .
Майте на увазі, що причиною того, що багато операційні системи вирішують виставляти інтерфейси на C / C ++, це те, що вони компілюються в машинний код, вони дозволяють змішувати інструкції зі збирання з власним кодом, і вони надають програмісту велику свободу.
Знову ж таки тут багато чого відбувається. Я хотів би продовжити пояснення, як бібліотеки, такі як .so та .dll файли, не повинні писатись на C / C ++ і можуть бути записані в зборах чи іншими мовами, але я відчуваю, що якщо я ще додаю, я можу також написати всю статтю, і скільки б я хотів зробити це, у мене немає сайту, де можна розмістити її.