它们是什么:浅谈计算机、程序、语言和编程


我们在做什么?

本节是为了阐述清楚编程最基本的哲学问题:

  • 为什么要编程?
  • 编程,是在做什么?

现代计算机太复杂了,初学者根本无法理解这个神奇的小家伙。但初学者需要对计算机和编程有一个整体的认知。这章,就将

计算机是什么?

计算机的目的,起初不过“计算”二字。简单的数学计算,如 1 + 2,有两个部分:数据“1”和“2”,指令“+”。

众所周知,中央处理器(CPU,Central Processing Unit)会做这个计算。当这种数学计算变得复杂起来的时候,就需要一个地方记忆这些“数据”和“指令”。于是,“CPU”从“内存(Memory)”中获取数据和指令,并把结果保存在里边。(我们暂时不需要关心CPU是怎么做的,就像上司只需要对员工发号施令。)

计算机是为人服务的。人们需要得知结果,就要在“显示器”上看到结果,或者利用“打印机”在纸上打印出来。这些都是“输出设备(Output Device)”。

光这样还不够,现在的计算机只会计算 1 + 2 而已。我们需要可以任意地将计算式“放进”内存,等待计算机把它们计算完毕。于是,“键盘”也很重要,它是“输入设备(Input Device)。

最初的计算机就是这样组成的:

CPU ⇌ 内存 ← 输入设备
       ↓
     输出设备

只不过,随着科技的发展,人们需求的提升,计算机遇到了更多的问题,人类就制造了更快、更聪明的计算机。人们也有了更多样化的输入输出设备,比如触控屏,话筒,耳机,鼠标,摄像头,陀螺仪,蓝牙芯片,NFC……

但是就以初学者的角度而言,毋须在开始就试图理解眼前复杂的计算机。此刻眼中的计算机,就是这样简单四部分构成的“可自定义的计算器”,用以处理“数据”和“指令”。随着学习的深入,一些计算机体系结构*和计算机网络方面的知识是必要的,但不妨到时再说。

注:

* 计算机体系结构是指根据属性和功能不同而划分的计算机理论组成部分及计算机基本工作原理、理论的总称。其中计算机理论组成部分并不单与某一个实际硬件相挂钩,如存储部分就包括寄存器、内存、硬盘等。

计算机程序是什么?

不严格的说,计算机程序,是人类命令计算机做的事情*。它由人类以编程语言编写,为计算机添加特定的功能,用以实现人类的某些目的。计算机很复杂,但是人类的需要更复杂。对着一台新买的计算机,我们对它讲:

我想知道美国总统川普又干了点啥人神共愤的事儿!

但是方呱呱坠地的计算机并不知道怎样做。我们需要一个“网络浏览器”(比如Chrome,IE,Safari),以之访问Baidu或者Google,并搜索这个问题。“网络浏览器”就是一个极其复杂的程序。

对于一个计算机程序:

  • 你需要打开他。
  • 他(可能)问你一些问题。
  • 他(可能)会为你办一些事情
  • 或者告诉你一些东西。

比如上面的例子。

你:打开了网络浏览器!
浏览器:打开了打开了,给你显示在屏幕上!接下来干啥?
你:在地址栏输入”www.baidu.com”,敲回车!
浏览器:emmm……打开了这个网页!等你下命令!
你:在百度的搜索框输入:“川普最新政举”,敲回车!
浏览器:emmm……稍等……出来了出来了!都给你写出来了!你看哪个!
你:点击一个感兴趣的话题。
……

不过浏览器这样的程序,还是过于复杂了。它为了方便没有计算机基础的人们使用,有一个好看的外表,你可以点击很多按钮,以此给它下很多不同的指令;按钮旁边,既有精美的图标,又有漂亮简捷的文字说明。他和你用图形交流。(这就是“图形交互界面”,Graphical User Interface,简称GUI。)

我们开始学习的是很简单的计算机程序,是用文字交流的,运行在命令行界面(command-line interface,CLI)**上。初学者只需要关注程序的功能和正确性,并不需要把他。(用文字交互,并不说明我们写的程序很低级——仅仅是漂不漂亮而已。)

由于许多初学者都没有使用CLI的经历,下面将举例说明:使用CLI和计算机说话是何种体验?(电脑酱的名称是YoRHa-A2)

cli

上图就是一个使用CLI和计算机对话的例子。翻译如下:

你:给我显示(echo)一行字:“Python超简单的!”
命令行:Python超简单的!
你:给我显示现在的时间(date)!
命令行:Fri Nov 2 13:34:19 AEDT 2018
你:给我显示我的用户名(whoami)!
命令行:akitsuki
你:给我显示那个文档的内容!叫sample.txt!
命令行:这是一个txt文档喔!

总结,人类为了自己的需求编写程序,如echo,date。人类要操控计算机,就要使用交互程序。

人类 ⇌ 交互程序(CLI或者GUI) ⇌ 计算机程序 ⇌ 操作系统 ⇌ 计算机

注:

* 严格地说,计算机程序(Computer Program)是指一组指示计算机或其他具有消息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。

** 命令行界面(英语:command-line interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,用户通过键盘输入指令,计算机接收到指令后,予以执行。

为什么需要编程语言?

计算机的构造虽然复杂,但是从原理上,确实是又young又Simple的东西。它无法理解人类的语言,也无法理解人类的目的。人类只能从很低级(逻辑和数学)的角度去控制它。 它也难以变通,人们可以说“你今天吃了吗?”,“吃了吗,今儿”,“How are you going?”去打招呼,但是计算机作为一个严谨又愚蠢的机器,只能使人类去适应它。

所以,人类需要编程语言去编写程序。编程语言就是人类和计算机的交流方式。它一定程度上是固定的。也就是说,不能指望编程语言去圆通地理解你的意图。编写程序时,你必须符合它的规范。

所以,编程语言是一种被标准化的交流技巧,用来向计算机发出指令。它是用来定义计算机程序的形式语言。

编写程序

所以,编程,就是为了使愚蠢的计算机满足人类的目的,使用计算机语言精确描述计算机执行的一系列指令的过程。

(当然,随着程序复杂度的提高,编写程序往往需要多人通力合作并且耗时良久。软件的编写,就成为了一个“工程问题”。软件开发的过程并不仅仅包含程序设计,还包含分析、设计、编码、测试、除错等阶段。本书也会尽量精简地涵盖这些过程。)

TODO: 假如CSAPP 1.1节对程序的介绍

为什么要学习编程?

  1. 编程是后信息时代职业人的基础技能
  2. 灵活使用程序,可以大幅提高工作效率
  3. 学习程序可以锻炼逻辑思维能力
  4. 使用计算机可以为生活提供便利
  5. 计算机程序一些行业强大的信息处理工具

我觉得每个人都应该学习一门编程语言。学习编程教你如何思考。 ——乔布斯

jobs

总结

本文介绍了计算机的概念,数据和指令的涵义,计算机程序和编程语言的含义及目的。

还有哪些问题?

本章我们尽量少地说明了编程需要的基本知识。我刻意省略了很多东西,这是为了可以让我们尽早地坐下来“享受编程”。

在接下来的章节中,会根据需求,补充关于计算机组成和体系结构、计算机网络等基础知识,也包含了工具链、IDE配置等编程技巧。


Comments

CONTENT