《Java 7程序设计入门经典》一1.1 计算基础

简介: 本节书摘来自华章出版社《Java 7程序设计入门经典》一书中的第1章,第1.1节,作者(美)Herbert Schildt Dale Skrien,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.1 计算基础

考虑到你正在修一门编程课程,你可能已经对计算科学的基础知识有了一定的了解。但是,不是所有人都有同样的知识,或某些知识可能是不准确的。为此,在介绍Java语言之前,先介绍计算科学中的一些核心概念。在这个过程中,本章会定义一些关键术语。

1.1.1 计算机的硬件组成

由于计算机最终会运行编写的程序,因此了解计算机各部分运行的基本方式是有帮助的。任意一台计算机都由一系列的部件组成,它们协同运作,形成一个计算机整体。尽管计算机组成的部件随着时间推移不断演进,但是计算机仍有许多共同的关键特性。例如,一个台式计算机包含的基本元素在智能手机中也能找到。
为了有效工作,一台计算机至少包括要有以下组成部分:
中央处理器(CPU)
内存
输入/输出设备
下面逐一进行介绍。
CPU提供了计算机基本的计算能力。它通过执行组成程序的指令实现计算。所有的CPU都能识别某一种特定的指令集(instruction set)。指令集定义了CPU能够执行的操作种类。例如,许多CPU支持的指令有:基本算术运算、从内存中载入和存储数据、进行逻辑比较、改变程序流等。另外,为了访问内存,许多CPU包括有限数量的寄存器(register),为数据提供快速的短期存储。
CPU执行的指令称为机器指令(machine instruction)或机器码(machine code)。一个机器指令能执行的运算很少。例如,一个指令也许只能把一个寄存器的值移动到另一个寄存器上,或把一个值从寄存器移动到内存中,或对两个寄存器的值进行比较。一般情况下,一类CPU的指令集与其他类型的CPU的指令集并不相同。所以,为一类CPU设计的指令集通常不能用于另一类CPU上。有时存在一些CPU系列,它们保持后向兼容性,但无关的CPU的指令集通常不同。
机器指令通常不易于人类阅读。它们具有为方便计算机使用而编码的形式。但是,有可能用助记符来表示这些指令,使机器指令适于人类阅读。这种形式称为汇编语言(assembly language)。例如,将数据从一个地方移动到另一个地方的指令可以用助记符表示为MOV,比较两个值的指令可以记为CMP。将汇编语言转换为计算能执行的形式的程序称为汇编程序(assembler)。但是,像Java这样的语言通常是一种更好的选择,所以当今很少有人编写汇编语言。
计算机内存用于存储指令和数据,其中指令是用机器指令的形式存储的。内存主要用于在程序执行的过程中保存信息。它并不用于长期存储。计算机中的内存是可寻址的(addressable),即CPU可以通过给定地址来访问内存中的某一特定位置。内存常常又称为RAM,它是随机存储器(Random Access Memory)的缩写。
当CPU执行程序时,它先从内存中获得指令,然后执行指令指定的操作。接着,它在获得下一条指令,执行它,循环往复。在默认情况下,指令从内存中顺序读取。但是,有些指令能够改变执行流,跳转到一个不同的内存区域。
现在,人们使用着各种各样的输入/输出(I/O)设备,包括键盘、显示器、鼠标、触摸屏、语音输入和声音输出等。它们事实上有着同样的功能,它们使计算机能够收发信息。输入/输出设备常常用于使人们能同计算机交互。但是还有一些输入/输出设备是计算机用于与其他设备通信的,比如存储设备、网络适配器和像机器人似的控制接口。
除了以上描述的几种关键部件外,许多计算机还有存储设备,例如硬盘、DVD和闪存。许多计算机还能联网,连接到Internet或局域网。为了使计算机能够联网,计算机需要网络适配器。

1.1.2 位、字节和二进制

当今,几乎没有人没听说过位(bit)、字节(byte)和二进制(binary)。这些词汇已经成为人们的日常用语。由于它们是计算领域中非常基础的概念,因此正规地定义它们非常重要。
1)二进制计数系统
在最底层,计算机使用0和1工作,所以它需要基于0和1的计数系统。这个计数系统称为二进制计数系统。二进制计数系统就如我们通常使用的十进制计数系统一样工作,除了每个数位的权重不同。你也许已经知道,在十进制中,每从右往左移动一位,其表示的值的个数总比上一位表示的值的个数大十倍。于是,十进制数基于10的幂次:最右边的数位表示1的个数,其左边一位表示10的个数,然后是100的个数,等等。例如,数423表示四百二十三,因为其中有4个100,2个10和3个1。
二进制有着相同的工作原理,只是每从右往左移动一位,其表示的值的个数增加为上一位的2倍。于是,第一个二进制位(指最右边的位)表示1的个数,往左一位表示2的个数,然后是4的个数,8的个数,等等。这意味着,一个二进制的前8位表示以下数值:
128 64 32 16 8 4 2 1
例如,二进制数1010就是十进制数10。其原因是,二进制数1010有0个1,1个2,0个4,1个8。所以,0+2+0+8等于10。再来看一个例子:二进制数1101就是十进制数13,因为它有1个1,0个2,1个4和1个8,所以1+0+4+8等于13。正如你所见到的,如果要把二进制数转化为十进制数,只需要把1所在的数位表示的值相加即可。
2)位和字节
在计算机中,位可以用来表示一个二进制数位。一个位可以置位,也可以复位。置位的位是1,复位的位是0。位可以进行分组。一种最常见的形式是字节。通常认为一个字节含有8个位。这意味着字节可以表示0~255之间的数值。
另外,还有一种组织形式称为字(word)。通常认为,一个字的大小与特定的CPU架构兼容。例如,32位计算机上每个字有32位,即4个字节。
为了方便,二进制数常常每4个一组(有时每8个一组)进行分组,例如:1011 1001。这使得数字更加容易阅读和理解。但是,这样的分组对其表示的数值没有任何影响。

1.1.3 操作系统

计算机的硬件部件由操作系统(operating system)管理和访问。操作系统是一个控制计算机的主程序。操作系统是计算机科学的核心研究内容之一,在这里不可能详细介绍。幸运的是,只需要一点简单的概述知识就够我们使用了。
操作系统主要有两大功能。首先,它提供底层功能,使其他程序能够使用计算机的资源。例如,可以通过使用操作系统提供的服务,将信息保存在硬盘上。其次,操作系统能够控制其他程序的运行。例如,它为其他运行的程序提供内存空间、为其运行调度CPU时间,监控其资源使用状况。
有许多常见的操作系统,如:Windows、UNIX、Linux、Mac OS、iOS和Android。一般来说,程序在设计时必须运行于一个特定的操作系统。例如,以Windows为运行平台的程序不能在UNIX操作系统上运行,除非该程序经过特别的移植。
image

相关文章
|
2月前
|
Java 测试技术 开发者
💡Java 零基础:彻底掌握 for 循环,打造高效程序设计
【10月更文挑战第15天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
125 63
|
1月前
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
60 2
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
89 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
2月前
|
机器学习/深度学习 算法 搜索推荐
让星星⭐月亮告诉你,Java冒泡排序及其时间复杂度计算
冒泡排序是一种简单的排序算法,通过多次遍历数组,每次比较相邻元素并交换位置,将较小的元素逐步移至数组前端。第一轮结束后,最小值会位于首位;第二轮则将次小值置于第二位,依此类推。经过 (n-1) 轮遍历后,数组完成排序。冒泡排序的时间复杂度为 O(n²),在最优情况下(已排序数组)时间复杂度为 O(n)。示例代码展示了如何实现冒泡排序。
56 1
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
Hadoop-10-HDFS集群 Java实现MapReduce WordCount计算 Hadoop序列化 编写Mapper和Reducer和Driver 附带POM 详细代码 图文等内容
109 3
|
1月前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
37 0
|
2月前
|
消息中间件 Java Kafka
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
Flink-04 Flink Java 3分钟上手 FlinkKafkaConsumer消费Kafka数据 进行计算SingleOutputStreamOperatorDataStreamSource
55 1
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
4月前
|
Rust JavaScript Java
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
下一篇
DataWorks