语言如何扩展自己?
我正在学习C ++,并且刚刚开始学习Qt编写GUI程序的一些功能。 我问自己以下问题:
我以前没有语法能够向操作系统请求窗口或通过网络进行通信的方式(我承认我还没有完全理解的API)的C ++如何通过使用C ++自己编写的库突然获得此类功能? 这一切似乎对我来说非常循环。 你可能会在这些库中提供哪些C ++指令?
我意识到这个问题对于一个有经验的软件开发人员来说似乎微不足道,但我一直在研究几个小时而没有找到任何直接的回应。 它已经到了我无法遵循关于Qt的教程的地步,因为图书馆的存在对我来说是难以理解的。
计算机就像一个洋葱,它有许多层,从纯硬件的内核到最外层的应用层。 每个图层都将自身的一部分暴露给下一个外层,以便外层可以使用某些内层功能。
在例如Windows的情况下,操作系统为在Windows上运行的应用程序公开所谓的WIN32 API。 Qt库使用该API来将使用Qt的应用程序提供给它自己的API。 你使用Qt,Qt使用WIN32,WIN32使用较低级别的Windows操作系统,依此类推,直到它是硬件中的电信号。
一般来说,图书馆不可能做出任何可能的事情,这是不可能的。
但是这些库不一定要用C ++编写才能被C ++程序使用。 即使它们是用C ++编写的,它们也可能在内部使用其他不用C ++编写的库。 所以C ++没有提供任何方法来做这件事并不妨碍它被添加,只要有一些方法可以在C ++之外做到这一点。
在相当低的层次上,C ++(或C)调用的某些函数将以汇编语言编写,并且程序集包含所需的指令,以便在C ++中执行任何不可能(或不容易)的操作,例如调用一个系统功能。 在那个时候,系统调用可以完成你的计算机所能做的任何事情,只是因为没有什么能够阻止它。
C和C ++有两个属性,允许OP讨论的所有这些扩展性。
在内核或基本的非保护模式平台中,像串行端口或磁盘驱动器这样的外设以与RAM相同的方式映射到内存映射中。 内存是一系列开关,翻转外设的开关让你的串口或磁盘驱动器做有用的事情。
在受保护模式的操作系统中,当需要从用户空间访问内核时(比如写入文件系统或在屏幕上绘制像素)需要进行系统调用。 C没有指令进行系统调用,但C可以调用汇编程序代码,这些代码可以触发正确的系统调用,从而允许C代码与内核通信。
为了使特定平台的编程更容易,系统调用被包装在更复杂的函数中,可以在自己的程序中执行一些有用的功能。 一个可以直接调用系统调用(使用汇编程序),但使用平台提供的其中一个包装函数可能更容易。
还有另一个级别的API比系统调用更有用。 以malloc为例。 这不仅会让系统获得大量内存,而且还会通过完成所有记录的内容来管理这些内存。
Win32 API使用通用平台小部件集合来包装一些图形功能。 Qt通过以跨平台方式封装Win32(或X Windows)API来进一步实现这一点。
从根本上说,虽然C编译器将C代码转换为机器代码,并且由于计算机设计为使用机器代码,因此您应该期望C能够完成狮子共享或计算机可以执行的操作。 包装器库所做的一切都是为你做的繁重工作,这样你就不必这样做了。
链接地址: http://www.djcxy.com/p/40227.html上一篇: How does a language expand itself?
下一篇: How to get started with developing Internet Explorer extensions?