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

时间:2008-11-07 23:21:47

标签: compiler-construction machine-language

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

13 个答案:

答案 0 :(得分:50)

答案 1 :(得分:16)

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

基本上,计算机实际上只能理解机器语言,这是一种用二进制(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

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

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

答案 2 :(得分:9)

一本关于非工程师谈论计算机的好书是'Code' by 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

答案 3 :(得分:6)

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

您可以比较编程如何在语言之间进行翻译。说你和另外两个人在一个荒岛上。你只说法语。 1号人(我们称他为弗雷德)只讲法语和日语。人2(鲍勃)只说日语。假设你需要请鲍勃去帮助你收集一些木柴。想象一下,在这种情况下,你是程序,鲍勃是计算机。你用法语对弗雷德说:“你能告诉鲍勃来帮助我。”弗雷德翻译成日语并要求鲍勃帮助你。在这种情况下,Fred将成为编译器。他将请求转换为Bob可以理解的内容。这就是计算机程序的工作方式。

有一篇很好的How Stuff Works文章可以解释事情。

在我参加数字电子课程之前,我个人并不真正理解计算机是如何工作的。在此之前,关于计算机如何为我工作的整个想法。在我构建了一个二进制计数器后,这一切都有意义。

答案 6 :(得分:1)

有些人已经提供了从典型编程语言到处理器可以执行的实际机器代码的翻译过程摘要。

要理解这个过程,有必要具体了解在机器代码级别编程的实际情况。一旦了解了处理器本身可以做什么,就可以更容易地理解高级编程结构作为它们的缩写。

但不幸的是,为台式电脑编写机器代码并不是很有趣。

作为替代方案,有一款名为Corewar的老游戏,您可以使用简化的机器语言编写小程序。然后这些计划互相争斗以求生存。你可以用原始机器语言编写基本程序,然后有一个宏系统,所以你不必重复这么多,这是迈向全功能语言的第一步。

另一个简单,有益但低级别的事情是编写一个简单的嵌入式控制器,如Arduino。有许多简单的介绍,如this one可用。您仍将使用编译器,但生成的机器代码更容易理解(如果您愿意),因为处理器的功能要简单得多。

这些都是了解数字计算机实际工作方式的好方法。

答案 7 :(得分:1)

非常简单,计算机编程是以一种可以理解的语言为计算机提供一组指令的行为。程序员通常用高级编程语言编写指令,然后将这些指令翻译成计算机理解的二进制语言。执行此转换的程序称为编译器。

答案 8 :(得分:1)

我有两个疯狂的建议。回到过去!

1。获得可编程计算器。

programmable calculator是一个常规计算器,你可以用它做常用的事情:输入数字,输入操作标志,按下等号键后,你可以在微小的显示屏上读取结果。此外,可编程计算器可以将短按键序列存储为程序,稍后可以通过单个按键“重放”。比如说,您将此序列设置为程序(每行一条指令):

(Start)
*
2
+
1
=
(Stop)

现在您有一个自定义操作:按下“程序”键(或您指定的那个),它将在没有您的进一步帮助的情况下运行序列,并将显示的内容乘以2并将添加1 - 这是一个程序!

稍后您可以尝试更多增强技术:将临时结果存储到内存中,分支结果。

优点:

  • 计算器是一个熟悉的环境。你已经掌握了基础知识。
  • 很简单。你不必学习很多指令和编程技巧。
  • 现代编程语言远非如此,而可编程计算器“就在它上面”。您将学习基础知识:内存,分支,基本操作。计算机的工作原理非常相似(在机器语言级别上)。
  • 你会遇到低级问题:记忆,除以零。
  • 非常酷。

缺点:

  • 它已经过时了。你必须学习一种不同的现代编程语言。
  • 这很不舒服(嗯,这是专业人士:你不能使用舒适的点击玩具)。也许你甚至无法保存你的代码。
  • 获得一个并不是一项微不足道的任务。你可以试试E-Bay。此外,文档也没有问题,大多数模式在互联网上都有大量用户组。

最佳选择恕我直言TI-59

2。在模拟器的帮助下学习BASIC语言。

当您打开具有内置BASIC language解释程序的计算机时,它已准备好接受您的命令,并在您键入时执行。首先,您可以在命令模式下尝试一些指令,例如:

PRINT 5*4

它会在下一行打印“20”,哇。如果你在命令模式下玩得足够多,你可以将指令组织到程序中,然后就可以运行,编辑和增强它。

优点:

  • BASIC是一种真正的编程语言,专为教育而设计。
  • 当你以后遇到现代编程语言并发现差异时,你会看到过去30年编程技术的进步(例如程序,结构等)。
  • 这很酷,特别是如果你得到一个真实的,而不仅仅是模拟器。

缺点

  • 它已经过时了。距离那个年龄差不多30年了。
  • 旧机器是紧凑的封闭系统。没有文件(今天我们使用它们的形式),文件夹,文件类型,它可能会让初学者感到困惑。

我最喜欢的BASIC系统是Commodore 16 (Plus/4),它与着名的C64非常相似。但更舒服。我更喜欢YAPE模拟器,它可以保存/加载内存快照或BASIC程序来存档。

答案 9 :(得分:0)

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

两本可以让您对此过程有一个体面概述的书籍是SICPTECS

答案 10 :(得分:0)

正如人们已经注意到的那样,有一些预编程(通常是“编译器”)将程序中的单词翻译成一种更为冗长的“低级”语言,称为“机器代码”。

机器代码由非常简单的指令组成,这些指令已经被底层处理器“理解”(或至少在其意义上有意义)。例如,将数据从存储器位置复制到处理器的特殊部分(称为“累加器”,其中可以对其进行简单的算法)的指令或者添加两个插槽的内容的指令。在累加器中。

您看到的复杂,复杂的程序(包括高级语言的编译器和解释器)都是最终构建的,这些简单的指令运行了数百万次。

答案 11 :(得分:0)

计算机有预设数量的指令;它已经知道怎么做了。计算机程序只是计算机将按顺序执行的指令列表。

早期的程序直接用机器语言编写。程序员为了让他们的生活更轻松,他们开始创建抽象来简化他们需要编写的程序。随着时间的推移,越来越多的抽象被添加,比如洋葱的层次,但这一切都归结为基本相同的东西 - 执行一系列指令。

如果您想学习编程而不关注编译器,技术等,那么当您开始在Alice中创建3D场景时,可以很好地指示程序是什么。爱丽丝从卡内基梅隆大学免费。你最终学习如何编程而不试图学习编程。

如果您想要了解有关技术细节的更多信息,那么您最好的选择是查看一些介绍Compi-sci大学的教科书。以下How C Programming Works也可能会给您一些答案。

答案 12 :(得分:-2)

基本上,你从一些简单的东西开始,例如:

print("Hello World");

然后你只需在它上面撒上语法糖和魔法标记,直到你做到你想要的为止!