windows - 所有基于 Windows 的程序都使用 Windows API 吗?没有它如何制作程序?

标签 windows api dll assembly operating-system

我已经编程几年了,我知道如何使用预先存在的/标准库创建我自己的复杂方法。我一直想知道(例如Java)在Java中创建JFrame对象时是如何创建JFrame的?如何使用标准代码(无库)来编写 GUI 或复杂操作(例如创建文件、读取文件等)

如果我们使用的所有这些现有方法都可以与我们用来 build 金字塔的积木进行比较。这些 block 最初是如何创建的? (我的意思是技术上)。没有标准库的编程语言就是变量、循环和数学(甚至数学函数也是由某人创建的)。

基本问题是Java或C或任何其他语言(例如在Windows上运行时)是否通过调用Windows .dll库来创建窗口和其他复杂操作来完成其所有操作?

如果是这样,这些复杂的操作/方法/函数是如何在只有常规变量、循环等的操作系统中创建的?

我对编程的理解存在差距。 我理解计算机读取二进制(电=开/关),有人制作了汇编/汇编器来将二进制转换为更可读的代码,该代码将数字从处理器中的不同寄存器移动,这可以导致基本数学、加法、减法、乘法、除法。我理解的差距是从汇编语言跳转到像 C 这样的高级语言,它保存变量、执行循环、创建 GUIS、操作系统。

最佳答案

据我所知,我试图(非常)粗略地说明其中的联系

  • 硬件 = 如果用他们的语言进行指导,他们就可以实际做事,即以电脉冲形式(电压高/低)的 1 和 0 流;
  • 总线/网络 = 供应/承载这些电脉冲
  • 控制单元<​​/strong> = CPU 中的一个重要硬件,控制总线路由信号/脉冲
  • 指令(机器代码)=控制单元可以理解的1和0流;这是由制造商预先确定的;这可以告诉控制单元如何使用CPU寄存器、内存和I/O设备(即计算机硬件)
  • 进程 = 驻留在内存中的指令集
  • 操作系统 = 一组可以访问硬件的进程,可以通过对现有进程的系统调用来创建新进程。系统调用是人类可读的指令,最终转换为机器代码
  • 目标文件/二进制文件/可执行文件 = 当进程不在内存中且不执行但驻留在磁盘中时; CPU 指示 BIOS 查找操作系统加载程序,引导加载程序启动一个母进程来启动操作系统,并且该母进程从驻留在磁盘中的(内核)对象文件生成其他进程
  • 汇编器 = 从汇编代码生成目标代码(文件);汇编代码是人类直接可读的指令形式,执行所有这些存储、加载到 CPU 寄存器和内存中、向各种 I/O 设备写入/发送信号
  • 编译器/解释器等=最终将更高级的语言转换为指令(变量存储在内存中,循环转换为从内存中的一个位置到另一个位置的跳转,如果您有兴趣,请查看使用gcc -S source.c -o assembly.s从简单的C程序生成的汇编代码)
  • 程序(源代码) = 人类和编译器都能理解的语言
  • 驱动程序 = 用于与硬件通信的程序,它们产生这样的目标代码,其中包含处理特定硬件所需的指令;专有硬件不会透露其说明,因此您必须下载其二进制文件
  • 库/API = 存储在磁盘上的一段目标代码/编译器可理解的代码,这样您就不需要每次编写程序时都重新发明轮子

因此,当您从 Java 创建 GUI 时,它实际上是在请求您的窗口管理器通过其 native 方法调用以“绘制一个 20x20 矩形,其角为半径为 5px 的圆角”的形式创建 GUI ,窗口管理器将此请求转发给操作系统进程,操作系统进程通过驱动程序将适当的指令转发给控制单元,然后强大的 CU 将向您的显示器发送一些信号,为适当的像素着色,从而给您一种 GUI 的感觉。

我知道我会因为像傻瓜一样回答和报告偏离主题的问题而得到很多反对票:P

关于windows - 所有基于 Windows 的程序都使用 Windows API 吗?没有它如何制作程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11636582/

相关文章:

api - 在不使用HTTP session 的情况下将身份验证 token 存储在RESTful API中

c++ - Cython 代码可以编译成 dll 以便 C++ 应用程序可以调用它吗?

c++ - 我可以使用 NPAPI 在一个 DLL 中创建多个插件吗?

windows - MouseLeave 事件不适用于按下左键单击

c# - 检索本地文件夹中某个时间范围内创建的文件

windows - 如何在 Windows 批处理脚本中获取可选的命令行参数值作为字符串?

c - 通过单个发送调用发送的合理数据量

c# - 如何在请求中传递字符串列表?

php - Sendgrid 邮件列表 ID

dll - 通过 DLL 从 Fortran 调用 Ada 过程