有人能告诉我计算机编程如何工作的基础知识吗?

use*_*661 18 compiler-construction machine-language

什么使编程语言的所有单词实际上做了什么?我的意思是,实际上发生了什么让计算机知道所有这些词的含义是什么?如果我口头告诉我的电脑做某事,它就不会这样做,因为它不明白.那么,这些人类用语言写成文字究竟是如何让计算机做出一些理想的活动呢?

Vin*_*vic 50

一切都始于CPU或处理器.每种处理器类型都有一组能够执行的定义指令.这些指令对1和0进行操作,而这些指令又表示您希望它们的任何内容:数字,字母,甚至指令本身.

在最低级别,零由一个晶体管上存在一定电压(通常接近0V)决定,而1是存在不同电压(取决于CPU,比如5V)

机器指令本身是零和一组放置在处理器中称为寄存器的特殊位置,处理器从特定位置获取指令及其操作数并执行操作,将结果放在另一个位置,然后去取取下一条指令,依此类推,直到执行完毕或关闭指令为止.

一个简单的例子.假设机器指令001表示添加两个数字.

然后你编写一个添加两个数字的程序,通常是这样的:

4 + 5
Run Code Online (Sandbox Code Playgroud)

然后将此文本传递给编译器,该编译器将为将运行程序的处理器生成足够的机器代码(旁注,您可以编译代码以在与当前运行的处理器不同的处理器中运行,这是一个名为的进程交叉编译,它在嵌入式平台中很有用.好吧,编译器最终会生成,

001 00000100 00000101
Run Code Online (Sandbox Code Playgroud)

使用附加的样板机器代码将001指令放在下一个指令寄存器(指令指针)中,将二进制编码的数字放在数据寄存器(或RAM)中.

从结构化语言生成机器代码的过程相当复杂,并限制了这些语言最终看起来的正常程度.这就是为什么你不能用英语编写程序的原因,因为编译器能够生成正确的0和1序列,所以它的含糊不清.

CPU可以执行的指令是相当基本和简单的,加法,除法,否定,从RAM读取,放入RAM,从寄存器读取等等.

接下来的问题是,这些简单的数字指令如何产生我们在计算中看到的所有奇迹(互联网,游戏,电影播放器​​等)?

它基本上归结为创建适当的模型,例如3D游戏引擎具有代表游戏世界的数学模型,并且可以基于它来计算游戏对象的位置/碰撞.

这些模型建立在很多这些小指令之上,而这里的高级语言(非机器代码)确实闪耀,因为它们提高了抽象级别,然后您可以更接近想要实现的模型,允许您很容易理解如何根据收到的来自控制器的输入有效计算士兵的下一个位置,而不是因为你太忙于试图不忘记0来阻止你轻易推理.

从汇编语言(一种非常类似于机器代码的语言,它是第一种编程语言,它是CPU特定的.每个汇编指令直接转换为机器代码)到C(在不同的CPU之间可移植,并且是在比汇编更高的抽象级别:每行C代码代表许多机器代码指令).这对程序员来说是一个巨大的生产力提升,他们不再需要在不同的CPU之间移植程序,他们可以更容易地思考底层模型,导致我们看到的软件(甚至需求)持续复杂性增加从20世纪70年代到今天.

待处理的缺失链接是如何控制如何处理该信息以及如何从外部源接收输入,例如在屏幕上显示图像或将信息写入硬盘驱动器,或在打印机上打印图像,或从接收来自键盘.这一切都可以通过计算机中存在的其他硬件实现,这些硬件以类似于CPU的方式控制,您将数据和指令放在图形卡或网卡或硬盘驱动器中的某些晶体管中或内存.CPU具有允许其将一些数据或指令放入(或从其中读取信息)不同硬件的适当位置的指令.

与我们今天所拥有的相关的另一个相关的事情是,所有现代计算机都带有称为操作系统的大型程序,这些程序管理所有基本的东西,如与硬件交谈和错误处理,比如程序崩溃时会发生什么等等.此外,许多现代编程环境都带有大量已编写的代码(标准库)来处理许多基本任务,如在屏幕上绘图或读取文件.这些库将反过来要求操作系统代表它与硬件通信.

如果这些不可用,编程将是一项非常艰巨而乏味的任务,因为您编写的每个程序都必须再次创建代码以在屏幕上绘制单个字母或从每个特定类型的硬盘读取一个位,例如.

好像我被带走了,我希望你明白这件事:-)

  • 这是一个该死的好答案,我想我会把一些问我这个问题的朋友链接到这篇文章. (2认同)

Fly*_*wat 16

计算机编程语言实际上是一种高度抽象的语言,它被转换成计算机实际理解的非常基本的语言.

基本上,计算机实际上只能理解机器语言,这是一种用二进制(1和0)实现的基本语言.高于此级别的是汇编语言,这是一种非常原始的语言,至少是人类可读的.

在高级语言中,我们可能会有类似的东西:

Person.WalkForward(10 steps)
Run Code Online (Sandbox Code Playgroud)

在机器代码中它将是:

Lift Persons Left Foot Up
Lean Forward
Place Left Foot Down
Lift Right Foot up
Lean Forward 
Place Right Foot Down
etc
Run Code Online (Sandbox Code Playgroud)

现在很明显,没有人愿意编写程序来告诉计算机每一个重复的事情,所以我们有称为编译器的工具.

编译器采用更易于人类理解的更高级语言,并将其转换为机器代码,以便计算机可以运行它.


Ste*_*ows 9

一本关于非工程师谈论计算机的好书是Charles Petzold的"Code".我不记得究竟它是否涵盖了你的问题,但我想是的.如果你有兴趣再往前走,这是一个不错的选择.

代码http://ecx.images-amazon.com/images/I/11MYtZPhJEL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA198_SH20_OU01_.jpg


Gre*_*ill 6

在最简单的情况下,一个称为编译器的程序会使用您编写的编程语言,并将它们转换为计算机可以理解的机器语言.编译器理解一种特定的编程语言(C#,Java等),它有关于如何向编译器解释您希望它做什么的非常具体的规则.

对这些规则的解释和理解是Stack Overflow的主要内容.:)