2

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

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

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

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

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

4

2 回答 2

3

我试图在这里(非常)粗略地说明连接 AFAIK

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

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

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

于 2012-07-24T20:04:44.163 回答
1

您的问题的答案非常广泛和通用,但我相信答案涉及对操作系统角色的理解。程序不能做任何操作系统不允许它们做的事情,并且从程序的角度来看,操作系统总是有一个定义好的接口。这个接口可能非常低级,如通过中断的系统调用,或者它可能处于更高级别,如 Win32 API。其中很多也与硬件和驱动程序有关,因为没有硬件就无法对程序进行输入和输出,硬件是通过操作系统从最终程序中抽象出来的。例如,nVidia 提供了由许多 API 抽象的 Windows 驱动程序:OpenGL、DirectX、WPF 等;如果您知道通过系统调用对视频卡驱动程序进行低级访问,您可以编写自己的 API。任何语言,例如 Java 或 C,都必须使用这些接口。

我希望这会有所帮助...

于 2012-07-24T18:34:17.823 回答