非典型性C语言教程- 0.3 计算机程序到底是什么

2024-02-08 05:18

本文主要是介绍非典型性C语言教程- 0.3 计算机程序到底是什么,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前几天上课又又听到了老师在宣扬“计算机行业没有经验”的论点。说计算机行业发展的太快,越老越不行,积累的经验转眼就过时。这种浮躁的言论已经听过无数次了,但是一个大学研究生课的老师在课堂上讲出来还是第一次。今天这个主题就和60年前计算机就出现的东西有关。

上次讲了,编译程序首先调用预处理程序处理C语言文件中的预处理命令,然后自己编译之生成目标文件,最后调用连接程序将目标文件和库文件连接成一个可执行程序。那么一段计算机程序到底是什么呢?

60年前阿兰.图灵,冯.诺依曼等人提出了计算机的体系模型,60年过去了目前实际运行的计算机都是注明的冯.诺依曼体系。首先讲图灵机的概念,下面是www.wikipedia.org 条目Turing machienes对通用图灵机的简介:

Turing machines are extremely basic abstract symbol-manipulating devices which, despite their simplicity, can be adapted to simulate the logic of any computer that could possibly be constructed. They were described in 1936 by Alan Turing. Though they were intended to be technically feasible, Turing machines were not meant to be a practical computing technology, but a thought experiment about the limits of mechanical computation; thus they were not actually constructed. Studying their abstract properties yields many insights into computer science and complexity theory.

A Turing machine that is able to simulate any other Turing machine is called a Universal Turing machine (UTM, or simply a universal machine). A more mathematically-oriented definition with a similar "universal" nature was introduced by Alonzo Church, whose work on lambda calculus intertwined with Turing's in a formal theory of computation known as the Church–Turing thesis. The thesis states that Turing machines indeed capture the informal notion of effective method in logic and mathematics, and provide a precise definition of an algorithm or 'mechanical procedure'.

这个条目有图灵机的形式化定义,以及关于图灵机几个著名问题的证明。简单来说图灵机由4部分构成:
  1. 一条无限长的纸带,分为一个一个单元,这条纸带可以左右移动。每个单元可以记录符号。
  2. 一个头,可以在纸带上读和写符号。
  3. 活动表,记录了纸带和头如何活动。
  4. 一个状态寄存器,记录活动表的状态。
图灵模仿了人解题的过程,解决一个问题时,头在根据活动表的内容读或写纸带单元的内容,并相应的移动纸带。这个模型就是现代计算机的鼻祖。后来冯.诺依曼提出了更具体的计算机体系。计算机由5部分组成:
  1. 执行单元
  2. 运算部件
  3. 内存
  4. I/O
  5. 程序计数器PC
执 行单元根据PC指示的地址去内存中读取指令,然后指令可以读写内存,将内存取出的数字交给运算部件运算。冯.诺依曼机器中指令和数据是同一存储的。人通过 I/O来与计算机交互。这个模型和图灵机基本类似:纸带就是内存,活动表也是内存的一部分,头就是执行和运算部件。程序就是活动表中左右移动纸带,读写纸 带的活动序列。同样本质上来讲程序就是内存中的指令序列。

后来编写程序的技术日新月异,各种概念技术层出不穷,但是本质上来说任何程序, 静态的如C, Forturn,Pascal,稍微动态一点的C++,Java,动态的Python, Lua,Ruby,传说中的 Lisp,Prolog最终都是内存中的指令序列。因为60年来计算机都是遵循冯.诺依曼模型的。

虽然人自己到底是怎么描述世界的还不是 很清楚,但是人描述世界的方式肯定和计算机描述世界的方式差别巨大,于是人们就不断的发展编程技术使得编程能更接近人描述世界的方式。首先是汇编。显然一 串数字是很不好记住的,于是用助记符去代表难以理解的数字。比如讲0xCC表示为int 3。后来发展出第一种高级语言Forturn。

60 年代人们发现单纯的跳转指令,使得程序很不好理解(人不好理解,机器一点问题没有),于是发展出结构化程序设计,使得调用子程序(很多名字过程,函数,方 法)有了标准。后来人们发现子程序一般要和程序处理的数据结合在一起,于是就发展了面向对象OO的技术。编译器自动完成在函数调用的时候传递this参 数,省去了自己写的麻烦。后来发现程序编译完成后,没有源代码就无法知道该怎么调用,于是加入元数据让编译完成之后的组建也能自己描述自己。

无论技术怎么更新,新技术只是自动的解决原来技术中不足的地方。比如用汇编照样可以写出面向对象的程序,但是用Java就方便的多,因为编译器帮你完成了许多工作,但是一个Java程序和一个汇编程序一样,最终执行的时候都是一条一条的计算机指令没有什么区比。

第0章说过,C语言重要的一条原因就是C语言最贴近计算机的模型。C语言由一组函数构成,函数就是一段一段的指令序列。函数中有一个叫main的,程序从main开始执行起,就是指令序列的起点。一直到结束,就是一个完成的指令序列。 

这篇关于非典型性C语言教程- 0.3 计算机程序到底是什么的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690001

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.