计算机科学是一个广泛而复杂的世界。它不仅不断地变化和发展,而且我们认为计算机科学的组成部分也在适应和调整。计算思维过程允许我们有目的、有重点地解决任何问题。无论问题是什么,我们都可以将其分解,找到能够帮助我们找到解决方案的模式,概括我们的解决方案,并设计能够帮助我们提供问题解决方案的算法。
在本书中,我们将仔细研究计算思维过程,解决多个领域的问题,并使用 Python 编程语言和相关的库和包来创建帮助我们解决这些问题的算法。然而,在讨论这些问题之前,我们将探讨一些重要的计算机科学概念,这些概念将帮助我们浏览本书的其余部分。
在本章中,我们将探讨以下主题:
- 计算机科学导论
- 理论计算机科学
- 系统软件
- 计算
- 数据类型和结构
您将需要最新版本的 Python 来运行本章中的代码。您可以在此处找到本章中使用的完整源代码:https://github.com/PacktPublishing/Applied-Computational-Thinking-with-Python/tree/master/Chapter01
当你寻找计算机科学的定义时,你会遇到多种变化,但所有这些都表明计算机科学包含计算机和计算概念的所有方面,包括硬件和软件。在计算机科学中,硬件设计大部分是在工程或计算机工程课程中学习的。计算机科学的软件方面包括操作系统和应用程序,以及其他编程领域。在本书中,我们将集中讨论计算机科学的软件方面。
在本章中,我们将了解一些基本的定义、理论和系统,它们在我们深入研究计算思维世界时非常重要。一旦我们确定了关键领域并定义了概念,我们将准备好继续研究我们在不断变化的技术世界中所面临的应用程序和现实世界挑战,同时探索可以帮助我们应对这些挑战的计算思维元素和 Python 编程能力。
计算机科学中广泛的主题既令人望而生畏又令人兴奋,而且不断发展。其中一些主题包括游戏设计、操作系统、移动或桌面设备应用程序、机器人编程等。计算机和计算领域持续不断的突破为我们提供了新的、令人兴奋的机会,其中许多是我们所不知道的。对计算机科学背后的系统有一个基本的了解可以帮助我们与技术互动,更有效地解决问题。
所有计算机将信息存储为二进制数据。二进制系统以开关的形式读取所有信息,开关可以是开或关、0 或 1。二进制是以 2 为基数的系统。要在计算机科学上取得进步,你需要对二进制数和二进制系统有一个基本的了解。
二进制系统转换所有数据,以便仅使用两个数字将其存储为字符串:0 和 1。数据使用位存储在计算机中。位(代表二进制数字)是计算机中可以找到的最小数据单位,即 0 或 1。
在二进制系统中计数时,前两个数字是 0(或 00)和 1(或 01),这与我们日常生活中使用的以 10 为基数的数字系统非常相似。如果我们继续用二进制数,下一个数字将是 10。在学习如何从一个数转换为另一个数之前,让我们先比较 10 进制和二进制中的前三个数:
图 1.1–基数 10 和二进制比较
10 进制系统中的下一个数字是 3。在二进制系统中,下一个数字是 11,读作一。10 进制和二进制中的前 10 个数字如下所示:
图 1.2–基数 10 和二进制比较(续)
如前所述,二进制系统是 base-2 系统。这意味着基数为 10 的系统中的每个数字都有一个 2 的幂,因此我们使用这些幂在数字之间进行转换。了解如何从 base-2 转换为 base-10,反之亦然,可以帮助我们更好地理解不同系统中数字之间的关系。
我们将从一个示例开始,将二进制数转换为 10 进制数。以 101101 号为例。要转换数字,将每个数字乘以相应的基数 2 幂。给定的二进制数有 6 位,因此我们将使用 2 的幂为 5、4、3、2、1 和 0。这意味着数字转换如下:
二进制数字 101101 相当于 10 进制中的 45。在日常生活中,我们以 10 为基数书写数字,因此我们理解数字 45 的书写形式。然而,我们的计算机将这些信息转换成二进制,以便能够对其进行处理,因此该数字成为二进制数 101101,以便计算机能够轻松读取。
再次,让我们从一个例子开始,演示从 10 进制数到二进制数的转换过程。以 591 号为例。要将基数为 10 的数字转换为二进制,我们必须迭代地将该数字除以 2。如果结果没有余数,则插入 0(如果它是第一个数字)或在现有数字的左侧插入 0。
如果结果的余数为 1,则插入 1(如果它是第一个数字)或在现有数字的左侧插入 1。
当我们把 591 除以 2,结果是 295,剩下的是 1。这意味着我们最右边的数字,也就是我们的第一个数字,是 1。
现在把 295 除以 2。结果为 147,剩余部分为 1。我们在 1 的左边插入一个 1。我们的号码现在是 11。
现在把 147 除以 2。结果是 73,余数为 1。我们的结果现在是 111。现在我们将进行进一步的划分:
- 剩余部分为 1。我们的号码现在是 1111。
- 没有剩余物。我们的号码现在是 01111。
- 没有剩余物。我们的号码现在是 001111。
- 剩余部分为 1。我们的号码现在是 1001111。
- 无余数。我们的电话现在是 01001111。
- 无余数。我们的电话号码是 001111。
- 剩余部分为 1。我们的电话号码是 1001111。
10 进制中的数字 591 相当于二进制中的数字 1001001111。
转换数字的另一种方法是使用分区表:
表 1.1–10 进制数字 591 到二进制的转换
使用表格,从最右边的列中提取数字,并从最后一行开始自下而上写入。结果是 1001111。
学习如何转换数字只是将数据转换为二进制的一小部分,但这是一个重要的部分。所有信息,包括字母和符号,都必须转换成二进制,以便计算机读取。ASCII(代表美国信息交换标准代码)是一种普遍采用的信息转换协议。也就是说,一些协议已经过时,所以其他协议使用 ASCII 作为扩展其功能的基础。Unicode 是一种广泛使用的基于 ASCII 的 16 位字符集。
如前所述,在本节中,我们了解到信息必须经过编码或转换,计算机才能读取它。存在多种系统和协议,但现在,我们将继续讨论计算机科学理论。但是,在解决问题时重新审视二进制、ASCII 和 Unicode 可能会有所帮助。
虽然你不需要成为一名数学家大师就可以热爱计算机科学,但这两门学科本质上是联系在一起的。计算机科学,特别是程序设计,使用的算法本质上是代数的。稍后我们将深入探讨算法,但这里的重点是它们是数学的。逻辑过程源于数学的哲学本质和历史。现在,如果你不喜欢数学主题,不要绝望。成为程序员和开发人员所需的逻辑过程可以在不必学习高等数学的情况下使用。对那些有高等数学背景的人来说,了解高等数学只是简化了一些概念。
理论计算机科学包含多个理论和主题。下面列出了一些主题和理论,但请记住,其他主题也包括在理论计算机科学中,本书可能不会讨论。以下列出的每个理论或术语的简短描述和解释供您审阅:
- 算法
- 编码理论
- 计算生物学
- 数据结构
- 密码学
- 信息论
- 机器学习
- 自动机理论
- 形式语言理论
- 符号计算
- 计算几何
- 计算数论
我们将在以下章节中介绍上述理论。
算法是计算机可以读取的一组指令。算法提供规则或指令的方式意味着计算机可以逻辑地处理作为输入提供的信息并创建输出。在大多数书籍中,通过创建*Hello World,您将了解算法和编程!*节目。我不会把这本书作为例外。
在 Python 中,代码要求我们将消息打印到屏幕上。由于 Python 语言易于学习和阅读,因此许多(如果不是大多数的话)代码都力求符合逻辑。因此,为了将消息打印到屏幕上,我们使用print()
命令。下面是我们将使用的代码:
print("Hello world!")
类似地,我们可以使用下面给出的代码:
print('Hello world!')
当涉及到字符串时,Python 将和读作相同的东西。**
**当我们运行 algorithm 时,前面代码的结果看起来像下面的屏幕截图:
图 1.3——“你好,世界!”Python 程序
别担心,稍后我们将在第 2 章计算思维要素中讨论 Python 编程语言,并在第 2 部分**中更深入地讨论应用 Python 和计算思维,从第 8 章开始、Python 简介。
虽然很长,但关于算法的讨论对本书和 Python 的发展至关重要。因此,我们将在本书的第 2 章、计算思维要素和第 3 章、理解算法和算法思维中对算法进行深入探索,as 算法是计算思维过程中的关键元素。
重要提示:
第二章计算思维要素将重点关注计算思维过程本身,其有四个要素:分解、模式识别、模式概括与抽象和算法设计。正如您所看到的,最后一个元素是算法设计,因此我们需要更多地了解算法是什么,以及我们如何创建算法,以便在使用 Python 解决问题时实现和设计算法。第三章理解算法和算法思维,重点是对算法定义的深入理解以及对设计过程的介绍。
接下来我们将研究编码理论。
编码理论有时也称为代数编码理论。在使用编码和编码理论时,研究了三个领域:数据压缩、纠错和加密。我们将在以下章节中更详细地介绍这些。
数据压缩的重要性不可低估。数据压缩允许我们存储最大数量的信息,同时占用最少的空间。换句话说,数据压缩使用最少的位数来存储数据。
重要提示:
请记住,位是计算机中可以找到的最小数据单位,即 0 或 1,而位组称为字节。一个字节通常有 8 位。我们使用字节作为计算机、存储设备(如存储卡或外部驱动器等)内存大小的度量单位。
随着我们的技术和存储容量的增长和提高,我们存储额外数据的能力也有所提高。从历史上看,电脑在首次引入家庭时有千字节或兆字节的存储空间,但目前它们有千兆字节和兆字节的存储空间。每个存储单元的转换如下所示:
图 1.4–字节转换
如果您在网上查找信息,您可能会发现一些来源指出,每 TB 中有 1024 GB。这是一个二进制转换。在十进制系统或 base-10 系统中,每 TB 有 1000 GB。为了更好地理解转换,了解适用于 base-10 系统的前缀和适用于二进制系统的前缀非常重要:
表 1.2–带值的 Base-10 和二进制前缀
如前所述,的目标始终是使用最少的位获得尽可能多的数据。因此,我们压缩或减少数据的大小,以便使用更少的存储。
那么,*为什么数据压缩如此重要?*让我们回到 2000 年。当时,一台售价约 1000 美元的笔记本电脑拥有 64MB 的RAM(随机存取存储器)和 6GB 硬盘。当我们使用数码手机的实际大小时,手机上的照片会占用 2 到 5 兆字节的内存。这意味着我们的计算机无法存储我们现在拍摄的许多(在某些情况下甚至是任何)现代照片。数据压缩的进步使我们能够存储更多的内存,创建更好的游戏和应用程序,以及更多,因为我们可以拥有更好的图形和附加信息或代码,而不必担心它们使用的内存量。
在计算机科学中,错误是生活中的一个事实。我们在流程、算法、设计以及两者之间的任何事情上都会犯错误。纠错,也称为错误处理,是指当数字数据传输错误时,计算机自动纠正一个或多个错误的过程。
一个纠错码(ECC可以帮助我们分析数据传输。ECC 定位并纠正传输错误。在计算机中,ECC 内置在存储空间中,可以识别常见的内部数据损坏问题。例如,ECC 可以帮助读取损坏的代码,例如QR(快速响应代码的缺失部分。类型的 ECC 是汉明码。汉明码是一种二进制线性码,最多可以检测两位错误。
重要提示:
哈明密码是以 1950 年发现它们的理查德·卫斯理·哈明命名的。哈明是一位数学家,从事与电信和计算机工程相关的编码工作。
另一种 ECC 类型是奇偶校验位。奇偶校验位检查数据的状态,并确定是否有数据丢失或被覆盖。错误更正对于所有开发的软件都很重要,因为任何更新、更改或升级都可能导致整个程序或程序或软件的部分损坏。
密码学在计算机科学中用于隐藏代码。在密码学中,信息或数据的写入方式使信息的预期接收者以外的任何人都无法读取。简单地说,密码学将可读文本或信息转换为不可读文本或信息。
当我们现在考虑密码学时,我们倾向于考虑数据的加密。编码人员通过将数据转换为未经授权的用户看不到的代码来加密数据。然而,密码学已经存在了几个世纪,也就是说,它早于计算机。从历史上看,密码学的最早应用是在公元前 1900 年左右在埃及的一座坟墓中发现的。非典型或不寻常的象形文字与普通象形文字混合在墓穴的各个部分。
这些不寻常的象形文字的原因尚不清楚,但这些信息在使用过程中被隐藏起来。后来,在战争和和平时期,密码学将被政府和间谍用于秘密通信。如今,加密技术用于加密数据,因为我们的信息是以数字格式存在的,因此保护敏感信息(如银行、人口统计或个人数据)非常重要。
我们将通过本书中提出的一些问题进一步探讨编码理论的主题。
计算生物学是理论计算机科学的领域,主要研究生物数据和生物信息学。生物信息学是一门允许我们收集生物数据并进行分析的科学。生物信息学的一个例子是遗传密码的收集和分析。在生物学研究中,人们探索并记录了大量的数据。
研究可以是广泛的主题和跨学科的。例如,基因研究可能包括来自整个州、整个种族或整个国家的数据。计算生物学的某些领域包括分子、细胞、组织和生物体。计算生物学允许我们研究这些东西的组成,从最基本的层次到更大的有机体。生物信息学和计算生物学为这些领域的实验研究提供了一种结构,创造了预测和比较,并提供了发展和检验理论的方法。
计算思维和编码使我们能够处理和分析这些数据。在这本书中,提出的问题将允许我们探索如何将 Python 与计算思维结合起来,找到复杂问题的解决方案,包括计算生物学中的问题。
在编码理论中,我们使用数据结构来收集和组织数据。目标是准备数据,以便我们能够高效地执行操作。数据结构可以是原始的,也可以是抽象的。软件具有内置的数据结构,即原始数据结构,或者我们可以使用编程语言定义它们。原始数据结构是预定义的。一些原始数据结构包括整数、字符(字符)和布尔结构。抽象或用户定义数据结构的示例包括数组和二维数组、堆栈、树和二叉树、链表、队列等。
用户定义的数据结构具有不同的特征。例如,它们可以是线性或非线性、均匀或非均匀、静态或动态。如果我们需要以线性序列排列数据,我们可以使用数组,这是一种线性数据结构。如果我们的数据不是线性的,我们可以使用非线性数据结构,如图。当我们有类似类型的数据时,我们使用同构数据结构。
请记住,例如,数组既是线性的又是同构的数据结构。非同质或异构数据结构具有不同的数据。用户可以创建的非同构数据结构的一个示例是类。静态数据结构和动态数据结构的区别在于静态结构的大小是固定的,而动态结构的大小是灵活的。为了更好地理解数据结构,我们将在本书中通过使用计算思维元素解决问题来探索数据结构。在本章末尾,我们将再次非常简要地回顾数据结构,因为它们与数据类型有关,我们将在后面进行讨论。
信息论被定义为一种数学研究,它允许对信息进行编码,以便通过计算机电路或电信信道传输信息。信息通过可能包含符号、脉冲甚至无线电信号的序列传输。
在信息论中,计算机科学家研究信息的量化、数据存储和信息通信。在信息论中,信息可以是模拟的,也可以是数字的。模拟数据是指由模拟信号表示的信息。反过来,模拟信号是在给定时间段内变化的连续波。数字信号将数据显示为二进制,即离散波。我们将模拟波表示为正弦波,将数字波表示为方波。下图显示了正弦曲线作为值随时间的函数:
图 1.5–模拟信号
模拟信号由正弦波的关键元素描述:振幅、周期、频率和相移:
- 振幅是曲线距离其中心的高度。正弦曲线无限重复。
- 周期是指正弦曲线一个周期的长度,即曲线开始重复之前的长度。
- 正弦曲线的频率和周期呈反比关系:
关于与的反向关系,我们也可以说:
- 正弦曲线的相移是曲线从 0 偏移的量。如下图所示:
图 1.6–相移示例
相比之下,数字信号图看起来像条形图或直方图。它们只有两个数据点,0 或 1,因此它们看起来像方形的山丘和山谷:
图 1.7–数字信号
数字信号具有有限组离散数据。数据集是离散的,因为它包含单个和不同的数据点。对于模拟信号,数据是连续和无限的。当使用计算机科学时,这两种类型的信号都是重要和有用的。我们将在本书后面的问题中探索数字信号在一些应用中的应用,特别是在第 16 章、高级应用计算思维问题中提出的问题中。
自动机理论是理论计算机科学中最吸引人的话题之一。它指的是对机器的研究,以及如何以最可靠、最有效的方式完成计算。自动机理论涉及简单机器的物理方面以及逻辑处理。那么,自动机到底是用来做什么的?它是如何工作的?
自动机是使用预定条件来响应外部输入的设备。当你看你的恒温器时,你是在用自动装置工作。您可以设置所需的温度,恒温器会对外部源作出反应,以收集信息并相应地调整温度。
自动机的另一个例子是外科手术机器人。这些机器人可以改善患者的手术效果,并且正在不断改进。由于自动机理论的目标是制造可靠和高效的机器,因此它是人工智能和智能机器人(如手术机器人)发展的关键部分。
形式语言理论通常与计算机科学中的自动机理论联系在一起。正式语言是对语法、语法、词汇以及与正式语言有关的一切的研究。在计算机科学中,形式语言是指计算机编程语言的逻辑处理和语法。关于自动机,机器处理形式语言以执行为其提供的任务或代码。
符号计算是处理计算机代数的计算数学的一个分支。术语符号计算和计算机代数有时互换使用。一些编程软件和语言专注于数学公式的符号计算。使用符号计算的程序执行诸如多项式因式分解、简化代数函数或表达式、查找多项式的最大公约数等操作。
在这本书中,我们将使用计算机代数和符号计算来解决一些实际问题。Python 不仅允许我们执行问题可能需要的数学计算,还允许我们探索这些计算产生的图形表示或模型。当我们探索现实世界问题的解决方案时,我们需要使用 Python 编程语言的各种库或扩展。在本书的第 2 部分**应用 Python 和计算思维中,我们将更详细地探讨 Python 编程语言。
与符号计算一样,计算几何也生活在计算机科学中处理计算数学的分支。我们在计算几何中研究的算法是那些可以用几何表示的算法。数据分析是通过几何图形、几何分析、遵循几何模式的数据结构等来完成的。需要计算几何的问题的输入和输出是几何的。
当我们思考几何时,我们通常会回到我们通常与该数学分支相关联的图形,例如多边形、三角形和圆。也就是说,当我们研究计算几何时,有些算法可以用点、线、其他几何图形或遵循几何模式的算法来表示。三角测量属于计算机科学的这一分支。
数据的三角测量对于光学 3D 测量系统等应用非常重要。例如,我们通过三角测量 GPS 信号来定位一部手机,用于执法。
在现代,三角测量有许多用途,其中一些我们将通过本书中介绍的真实和相关问题进行探索。
数论是研究整数及其性质的数学分支。计算数论那么是研究用于解决数论问题的算法。数论研究的一部分是素性检验。
为确定输入或输出是否为素数而创建的算法已用于多种目的。素性测试和数论最重要的用途和应用之一是用于加密目的。随着我们的生活转向以电子方式保存一切,我们的大部分个人信息,如银行信息、家庭信息,甚至社会保险号码,都存在于某种代码或算法中。加密此类信息非常重要,这样其他人就无法使用或访问它。计算数论和密码学本质上是联系在一起的,稍后您将能够探索这一点。
本文介绍的一些理论旨在帮助您了解计算机科学理论是如何相互交织的,它们的应用,以及它们与我们每天所做工作的相关性。
在本节中,我们学习了理论计算机科学。我们还了解了它的各种理论。
在本书中,我们将使用计算思维(在第 2 章计算思维元素中进一步讨论),通过定义和设计使用这些理论的适当算法,帮助我们解决从最基本的应用到一些复杂分析的问题。理论计算机科学用于研究系统的软件,我们将在下一步进行探讨。
系统软件用于执行多种功能,并在计算机的操作系统(操作系统)与键盘、鼠标等外围设备以及永久保存到设备中且设备运行所需的固件之间进行通信,除其他职能外。这是两种主要软件类型的部分:系统软件和应用软件。
系统软件允许计算机在硬件和应用程序之间进行通信。想想智能手机吧。手机由最基本的硬件组成,包括电池、摄像头、内存、屏幕以及所有物理组件和外围设备。操作系统允许应用程序使用这些组件。
以手机的摄像头应用程序为例。该系统的软件允许应用程序与手机通信,以使用相机拍照、编辑、保存和共享。计算机的操作系统也允许硬件与程序通信。设计程序将使用鼠标或其他可用于绘制、创建、使用触摸屏(如果可用)等的外围设备。
如果我们不知道系统的软件,我们就无法创建能够与硬件有效通信的应用程序,产生的错误可能从严重的或使外围设备无用到轻微的,其中一些组件可以工作,比如拍照,但其他组件可能无法工作,比如保存或共享图片。系统软件的创建方式为我们提供了在硬件和应用程序之间进行通信的最简单、最有效的方式。
操作系统执行多个任务。如果您还记得,错误处理是操作系统的一部分,它检查最常见的可能错误,以便在不造成更大问题或使应用程序毫无价值的情况下修复它们。错误处理是操作系统最重要的任务之一。此外,操作系统还负责计算机或设备的安全。如果你有一部智能手机,你知道很多操作系统的更新都是为了修复安全问题或防止安全漏洞。操作系统只负责允许授权用户与存储在设备中的内容进行交互。
除了安全性和错误处理之外,操作系统还负责为文件分配内存并组织它们。当我们保存和删除一个文件或程序时,已经使用的内存现在是空闲的。但是,可能会在之前和之后立即保存某些内容。操作系统分配和重新分配内存,以保持设备的最佳性能。内存管理不仅指用户保存的文件,还指 RAM。
设备的文件管理也由操作系统运行。操作系统将把信息作为文件系统进行分配,将信息分解成用户和设备容易访问的目录。文件系统负责跟踪来自操作系统和用户的文件的位置、访问设备的设置(这些设置不断变化),以及如何访问文件和了解文件的状态。近年来,对设备的访问发生了变化。
虽然计算机通常使用用户名和密码,但许多设备现在可以通过指纹、数字或字母数字密码、面部识别、图像、路径等进行访问。随着这些主题的发展,操作系统也在发展,需要更新或重新创建。操作系统还负责允许应用程序和设备之间的通信。
应用软件是指执行特定任务的软件应用。想想你可以从移动设备访问的应用程序。有数百种类型的应用程序,例如在设备上运行的静态游戏、允许您远程与他人玩的游戏、新闻应用程序、电子书阅读器、健身训练应用程序、闹钟、时钟、音乐等等!应用程序总是执行某种形式的任务,无论是个人用途、业务用途还是教育用途。
应用软件具有多种功能。您可能会发现适合生产力的套件,例如微软(办公)和谷歌产品。当我们需要在互联网上进行研究时,我们使用称为浏览器的应用程序,它允许我们访问信息并对信息进行索引,以便我们可以访问它。这些浏览器包括谷歌 Chrome、Safari、Firefox、Edge、Opera等。移动设备和计算机都使用浏览器。请记住,应用程序的目的是为最终用户执行特定任务。
重要提示:
另一方面,自从电脑成为家庭工具,手机开始被用于其他用途而不仅仅是打电话以来,应用程序呈指数级增长。早期的计算机仅用于计算,或计算数学分析和任务。这就是为什么了解计算机科学的发展和历史如此重要的原因之一。由于我们无法完全预测计算机科学和系统软件的未来用途,我们对它们了解得越多,就越能在技术进步发生时创造和适应。
在本节中,我们了解了系统的软件。我们还学习了操作系统软件和应用软件。在本书中,当我们对一些问题进行分类时,一些应用程序将更为重要,例如数据库、生产力软件、企业资源规划和教育软件。
在下一节中,我们将学习计算。
在计算机科学中,计算是指计算机为了交流、管理和处理信息而执行的活动。计算通常分为四个主要领域:算法、架构、编程语言和理论。
由于已经在前面的部分中讨论了理论和算法,现在我们将重点介绍定义体系结构和编程语言。
计算机架构指与计算机系统交互的指令集。从更基本的角度来说,体系结构包括允许软件和硬件交互的指令。计算机体系结构有三个子类:指令集体系结构(ISA)、微体系结构和系统设计。
ISA 是硬件和软件之间存在的边界。它有多种分类方式,但有两种常见的是复杂指令集计算机(CISC)和精简指令集计算机(RISC)。这些定义如下:
- CISC:这是一台计算机,它对许多任务都有明确的指令,例如简单的数学运算和从内存加载内容。CISC 包括 RISC 中未包含的所有内容。
- RISC:这台是一台架构为的计算机,每指令(CPI减少了周期。
CISC 试图用更少的步骤来完成指令,而 RISC 只使用简单的指令。CISC 是多步骤的,而 RISC 是单步的,一次执行一项任务。CISC 过程包括指令、微码转换、微指令和执行。相比之下,RISC 包括指令和执行。
在 CISC 中,微码转换是指在较低级别上对语言的解释。它考虑了创建微指令的硬件资源。微指令是微码中的单个指令。微码创建微指令后,可以执行微指令。下图显示了 RISC 和 CISC 的流程:
图 1.8–RISC 和 CISC 之间的差异
RISC 和 CISC 都是计算机程序员所必需的。与多步骤流程(CISC)相比,单步流程(RISC)有其优点和缺点。RISC 减少了每条指令的周期,一次只做一件事。CISC 减少了程序中的指令,但以每条指令的周期为代价。根据我们的需要,我们可以选择最佳的道路。
编程语言是我们为计算机和其他设备编写指令的方式。根据所需内容、易用性以及更多因素,可以使用不同的语言。编程语言的示例包括:
- Ruby和Python:Ruby 是一种主要用于 web 应用程序的编程语言。Ruby 稳定易用;然而,许多开发人员选择使用 Python 而不是 Ruby,因为 Python 速度更快。虽然 Ruby 还没有那么流行,并且存在一些性能问题,但该语言在 2019 年非常活跃,并继续增长。另一方面,Python 被广泛用于多种用途,例如 web 应用程序、用户界面应用程序和网站等。我们将在本书后面更深入地探讨 Python。
- C:C 语言是计算机科学中至关重要的一部分,因为 C 语言是使用最早的语言,也是使用最广泛的语言。C 语言自 1972 年丹尼斯·里奇发明以来就一直存在,但自 1978 年首次出版以来,它就被其他人使用。自那以后,其他语言越来越流行,而 C 语言在 2019 年仍在使用。它的一些用途包括操作系统、硬件驱动程序和应用程序等。C 是一种基本语言,这意味着它几乎不需要抽象。
- C++OrthT1:C++是由 Bjarne Stroustrup 开发的 Ty2 T2,作为 C 的延伸 T3 延伸到 1985。该语言的目标是添加面向对象的功能。在操作系统和其他软件中,该语言仍然广泛地与 C 语言结合使用。C++是一种中间级的程序设计语言。
- C#:C#(C sharp)是一种高级编程语言。与 C++一样,它具有面向对象的能力,是 C 语言的扩展。C++和 C 语言的主要区别之一是 C++使用机器代码,而 C 使用字节码。计算机可以直接执行机器代码。字节码必须编译,因此它被认为是需要解释的低级代码。
- Swift:Swift 编程语言由苹果公司于 2014 年开发。随着编程语言的发展,Swift 是最新的编程语言之一。苹果将其发布为开源编程语言,版本为2.2,于 2015 年发布。该语言被认为是一种通用的编译编程语言。
- Scratch:Scratch 是由麻省理工学院媒体实验室于 2002 年开发的一种可视化编程、块编码语言。作为一种块编程语言,它被广泛用于学校,教各个年龄段的学生如何编写代码。Scratch 现在已经适应了多种用途,包括一些机器人应用,如 Vex 代码、结合机器学习和人工智能等。它与流行的教室外围设备兼容,例如Makey Makey,这是一种与计算机交互的电路,可以通过 Scratch 程序完全控制。尽管出于教育目的,它很受欢迎,但编程语言的力量不容低估,语言本身及其功能也在不断增长。
- Java和JavaScript:JavaScript 是一种仅在浏览器中使用的脚本语言。它用于制作网站和 web 应用程序。另一方面,Java 是一种通用的编程语言。JavaScript 帮助我们制作网站动画或为其添加交互功能。相比之下,Java 被编译成字节码,并被广泛用于 Android 设备和应用程序的开发。
- PHP:PHP 是又称超文本预处理器。与 Java 非常相似,它是一种通用编程语言。由于它是开源的,所以可以广泛使用。PHP 被用于网站设计和应用程序,被认为是易于学习的,但它有许多高级特性。PHP 还可以用于编写桌面应用程序。
- SQL:SQL 或结构化查询语言是用于与数据交互的编程语言。SQL 是特定于域的。它已经存在了几乎和 C 一样长的时间,在 1974 年首次出现。SQL 的主要重要性在于它可以与其他语言无法与之交互的数据库进行交互。
在计算思维中,我们使用许多不同的编程语言,这取决于我们的目标是什么,我们拥有或需要什么信息,以及我们的应用程序或软件需求是什么。选择一种语言不仅取决于我们对该语言的了解,还取决于该语言可能的功能。
在本书中,我们将更广泛地使用 Python,因为它具有开源特性、易用性以及可用于的大量应用程序。然而,Python 并不是唯一的选择。了解其他语言很重要,特别是对于开发人员。
在本节中,我们学习了有关计算及其一些领域的知识,即架构和编程语言。我们还了解了 ISA 及其类型,并介绍了各种编程语言。在下一节中,我们将介绍数据类型和结构。
在计算机科学中,数据类型和结构是两种截然不同的东西:
- 数据类型是的基本分类。某些数据类型包括整数、浮点和字符串。
- 数据结构使用多种类型的数据类型。他们可以将信息组织到内存中,并确定我们如何访问信息。
让我们在下面几节中更详细地了解这些。
如前所述,数据类型是基本分类。它们是在整个程序中使用的变量,只能存在一种分类。有不同类别的数据类型。现在我们将重点讨论基本和抽象数据类型,但在讨论问题和设计解决方案时,我们将重新讨论这个主题。
原始数据类型包括字节、短、int、长、浮点、双、布尔和字符:
- 一个字节可以存储从-128 到 127 的数字。虽然这些数字可以存储为整数或int,但字节使用的存储空间较少,因此如果我们知道数字在这些值之间,我们可以使用字节数据类型。
- 短是介于-32768 和 32767 之间的数字。
- 整数int用于存储-2147483648 和 2147483647 之间的数字。
- 长用于存储-9223372036854775808 和 9223372036854775807 之间的号码。
- 浮点数允许我们保存一个十进制数。
- 十进制数字也可以保存为双精度,比浮点数精度更高。
- 布尔值是
True
或False
的数据类型。因此,可以保存变量,以便在打印其值时,将结果保存为 true 或 false。 - 字符用于将变量保存为单个字符。
我们将在下一节中查看数据结构。
正如本章前面提到的编码理论部分中的所述,数据结构用于以最高效的方式收集和组织数据。数据结构可以是基本的,例如软件中的内置数据结构,也可以是抽象的。原始数据结构也可以使用编程语言定义,但它们是预定义的。一些原始数据结构包括上一节中列出的数据类型,如字符和布尔结构。
抽象数据类型(ADTs)包括数据类型的结构和设计信息。摘要数据结构包括数组和二维数组、堆栈、树和二叉树、链表、队列等,如本章前面的编码理论部分所述。列表可以包含相同数据值的多个实例。这些列表是可计数的,因此我们可以找到列表中有多少元素,对它们重新排序,删除项目,添加项目,等等。列表广泛用作链表、数组或动态数组:
- 链表表示列表中的每个数据元素都连接或指向下一个数据元素,而不管它们存储在内存中的什么位置。
- 订购了一个阵列。读取这些元素是为了能够理解。想象一个数组在读这个句子。你不会把这个句子读成“数组,而是把阅读看作这个句子。”我们按照从左到右的顺序阅读这个句子,而不是按照杂乱无章的顺序。
- 动态数组可以调整大小,这在选择数据类型时很重要。
堆栈ADT 是元素的集合,有两个操作—推送和弹出。推送用于向集合中添加元素,而 pop 则删除最近的元素。
队列ADT 是线性数据结构。与堆栈一样,我们可以添加或删除元素。然而,在队列 ADT 中,删除点和插入点是在两个不同的端点完成的。
如前所述数据结构是数据类型的具体实现。例如,我们如何从集合中添加或删除元素是数据结构。
这可能会让人有点困惑,但我们将在后面的章节中通过示例了解更多。现在,理解定义和简单示例就足够了。
在本章中,我们学习了一些计算机科学的基础知识。我们看了如何从二进制转换为 10 进制。我们还探讨了理论计算机科学的主题和理论。我们学习了计算、数据类型和结构。这些章节将让我们从本书的第 2 章计算思维要素开始,了解计算思维过程以及如何解决所提出的所有类型的问题。
随着我们对计算思维世界和过程的深入研究,我们需要在研究问题、寻找解决问题的最佳方法以及决定如何编写算法时,重新审视本章的一些内容。
问题可能有无数种方法可以用算法来解决。了解流程如何工作以及哪些数据结构最适合我们的问题对于创建最佳解决方案至关重要。识别算法所需的数据类型以及计算机读取数据的方式只会帮助我们编写最有效的算法。
在下一章中,我们将学习计算思维过程以及如何分解问题以设计算法解决方案。**