我正在学习c++,我刚刚开始学习Qt的一些功能来编写GUI程序。我问了自己以下问题:
c++以前没有语法能够要求操作系统提供一个窗口或一种通过网络进行通信的方式(我承认我也不完全理解api),它是如何通过c++本身编写的库突然获得这些功能的?在我看来,这一切都是可怕的循环。你能在这些库中找到哪些c++指令?
我知道这个问题对一个有经验的软件开发人员来说似乎微不足道,但我已经研究了几个小时,没有找到任何直接的回答。这已经到了我无法理解Qt教程的地步,因为库的存在对我来说是不可理解的。
我正在学习c++,我刚刚开始学习Qt的一些功能来编写GUI程序。我问了自己以下问题:
c++以前没有语法能够要求操作系统提供一个窗口或一种通过网络进行通信的方式(我承认我也不完全理解api),它是如何通过c++本身编写的库突然获得这些功能的?在我看来,这一切都是可怕的循环。你能在这些库中找到哪些c++指令?
我知道这个问题对一个有经验的软件开发人员来说似乎微不足道,但我已经研究了几个小时,没有找到任何直接的回答。这已经到了我无法理解Qt教程的地步,因为库的存在对我来说是不可理解的。
当前回答
您的c++程序使用Qt库(也是用c++编写的)。Qt库将使用Windows CreateWindowEx函数(在kernel32.dll中用C编写)。或者在Linux下,它可能使用Xlib(也是用C编写的),但它也可以发送原始字节,在X协议中意味着“请为我创建一个窗口”。
与你的两难问题相关的是“第一个c++编译器是用c++编写的”的历史注释,尽管实际上它是一个带有一些c++概念的C编译器,足以编译第一个版本,然后它可以编译自己。
类似地,GCC编译器使用GCC扩展:它首先被编译到一个版本,然后用于重新编译自身。(GCC构建说明)
其他回答
你是对的,一般来说,图书馆不能使任何不可能的事情成为可能。
但是库并不一定要用c++来编写才能被c++程序使用。即使它们是用c++编写的,它们也可能在内部使用其他不是用c++编写的库。因此,c++没有提供任何方法来做这件事的事实并不妨碍它被添加,只要在c++之外有某种方法来做这件事。
在相当低的级别上,c++(或C)调用的一些函数将用汇编编写,并且该汇编包含所需的指令,以完成在c++中不可能(或不容易)的操作,例如调用一个系统函数。此时,该系统调用可以做计算机能够做的任何事情,因为没有任何东西可以阻止它。
关键在于操作系统是否可能公开API以及如何使用该API的详细描述。
操作系统提供了一组具有调用约定的api。 调用约定定义了将参数提供给API的方式、返回结果的方式以及如何执行实际调用。
操作系统和为它们创建代码的编译器可以很好地协同工作,所以您通常不必考虑它,只需使用它。
首先,我觉得有一点误会
c++以前没有语法能够要求操作系统提供一个窗口或一种通过网络通信的方式,它是如何做到的呢
没有用于操作系统操作的语法。这是语义学的问题。
突然通过c++本身编写的库获得这些功能
操作系统主要是用c编写的。您可以使用共享库(即dll)来调用外部代码。此外,操作系统代码可以在系统调用*或中断上注册系统例程,您可以使用程序集调用这些例程。共享库通常只是为您进行系统调用,因此您可以避免使用内联汇编。
这里有一个很好的教程:http://www.win.tue.nl/~aeb/linux/lk/lk-4.html 它适用于Linux,但原理是相同的。
操作系统如何对显卡、网卡等进行操作?这是一个非常广泛的主题,但大多数情况下你需要访问中断,端口或写入一些数据到特殊的内存区域。由于这些操作是受保护的,所以无论如何都需要通过操作系统调用它们。
创建窗口不需要特殊的语法。所需要的只是操作系统提供一个API来创建窗口。这样的API由c++提供语法的简单函数调用组成。
此外,C和c++是所谓的系统编程语言,能够访问任意指针(可能由硬件映射到某些设备)。此外,调用在程序集中定义的函数也相当简单,这允许处理器提供的全部操作。因此,使用C或c++和少量的汇编程序来编写操作系统本身是可能的。
还应该提到Qt是一个不好的例子,因为它使用所谓的元编译器来扩展c++的语法。然而,这与它调用操作系统提供的api来实际绘制或创建窗口的能力无关。
计算机就像一个洋葱,它有很多很多层,从纯硬件的内核到最外层的应用层。每一层都将自己的一部分暴露给下一个外层,这样外层就可以使用内层的一些功能。
以Windows为例,操作系统为运行在Windows上的应用程序公开了所谓的WIN32 API。Qt库使用该API为使用Qt的应用程序提供自己的API。你使用Qt, Qt使用WIN32, WIN32使用较低级别的Windows操作系统,等等,直到它成为硬件中的电信号。