Compiler construction 有人能告诉我计算机编程的基本原理吗?

Compiler construction 有人能告诉我计算机编程的基本原理吗?,compiler-construction,machine-language,Compiler Construction,Machine Language,是什么让编程语言中的所有单词真正起作用?我的意思是,到底是什么让电脑知道这些词的意思?如果我口头上告诉我的计算机做某事,它不会做,因为它不明白。那么,这些写进语言中的人类词汇究竟是如何让计算机做一些令人满意的活动的呢 在最简单的情况下,一个名为编译器的程序接受您编写的编程语言单词,并将它们转换为计算机可以理解的机器语言。编译器理解一种特定的编程语言(C#、Java等),它有非常具体的规则,说明如何向编译器解释希望它做什么 解释和理解这些规则是堆栈溢出的主要内容。:) 基本上,你从一些简单的事情开

是什么让编程语言中的所有单词真正起作用?我的意思是,到底是什么让电脑知道这些词的意思?如果我口头上告诉我的计算机做某事,它不会做,因为它不明白。那么,这些写进语言中的人类词汇究竟是如何让计算机做一些令人满意的活动的呢

在最简单的情况下,一个名为编译器的程序接受您编写的编程语言单词,并将它们转换为计算机可以理解的机器语言。编译器理解一种特定的编程语言(C#、Java等),它有非常具体的规则,说明如何向编译器解释希望它做什么


解释和理解这些规则是堆栈溢出的主要内容。:)

基本上,你从一些简单的事情开始,比如:

print("Hello World");

然后你只需在上面撒上语法糖和魔法标记,直到它达到你想要的效果

编程是指您采取一系列步骤来解决某个问题,并用需要特定语法的特定语言编写出来。当你用这种语言描述了这些步骤后,你可以使用一个编译器(根据格雷格的评论),将这种语言翻译成计算机可以解释的语言


艺术在于确保你能很好地描述这些步骤:)

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

基本上,计算机只理解机器语言,这是一种用二进制(1和0)实现的基本语言。在这之上的一个层次是汇编语言,它是一种非常原始的语言,至少是人类可读的

在高级语言中,我们可能有如下内容:

Person.WalkForward(10 steps)
在机器代码中,它将是:

Lift Persons Left Foot Up
Lean Forward
Place Left Foot Down
Lift Right Foot up
Lean Forward 
Place Right Foot Down
etc
现在很明显,没有人愿意编写程序来告诉计算机每一件重复的事情,所以我们有称为编译器的工具

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

CPU有一个称为指令指针的寄存器(一种可以存储数字的东西)。指令指针表示从内存中提取指令的地址。CPU提取一条指令,执行它,然后继续执行下一条指令,除非它执行的指令说要转到其他地方。这些指示相当薄弱。把这个数字加到那个数字上。把这个号码储存在那边。从那边接下一条指令。一个名为编译器的程序分析你的程序并将其转换成机器代码(这里我跳过几个步骤)


有两本书可以让你对这个过程有一个很好的概述,分别是和。

你可以比较编程是如何工作的,以及不同语言之间的翻译。假设你和另外两个人在一个荒岛上。你只会说法语。第一个人(我们叫他弗雷德)只会说法语和日语。第二个人(鲍勃)只会说日语。比如说你需要叫鲍勃去帮你捡些柴火。想象一下,在这种情况下,你是程序,鲍勃是计算机。你用法语对弗雷德说:“你能告诉鲍勃来帮我吗?”弗雷德翻译成日语,请鲍勃帮你。在这种情况下,弗雷德将是编译器。他把请求翻译成鲍勃能理解的东西。计算机程序就是这样工作的

有一篇很好的文章解释了一些事情


直到我上了一堂数字电子课,我个人才真正理解计算机是如何工作的。在此之前,我一直在思考计算机如何为我工作。在我构建了一个二进制计数器之后,这一切都是有意义的。

这一切都是从CPU或处理器开始的。每种处理器类型都有一组定义好的指令可以执行。这些指令在1和0上运行,它们依次表示您希望它们表示的任何内容:数字、字母,甚至指令本身

在最低电平,0由晶体管上存在的特定电压(通常接近0V)确定,1表示存在不同的电压(取决于CPU,例如5V)

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

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

然后编写一个程序,将两个数字相加,通常如下所示:

4 + 5
然后将此文本传递给编译器,编译器将为运行程序的处理器生成足够的机器代码(请注意,您可以编译代码,以便在与当前运行的处理器不同的处理器中运行,这是一个称为交叉编译的过程,例如在嵌入式平台中非常有用)。那么编译器最终大概会生成

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

从结构化语言生成机器代码的过程相当复杂,并且限制了这些语言最终看起来的正常程度。这就是为什么你不能用英语写一个程序,因为它有太多的歧义,编译器无法生成正确的零和一序列

CPU可以执行的指令相当基本和简单,包括加法、除法、求反、从R读取
(Start)
*
2
+
1
=
(Stop)
PRINT 5*4