程序是什么?

写在前面

这篇文章的标题实在是太大了,也许你第一个疑问就是你能回答好这个问题吗?我想说,我不能,我也不打算把它回答好,因为我知道他并没有标准答案。或者更准确的说,每个人心中都有一个令自己感觉满意的答案。并且这个答案会随着自身感悟的变化而不断发生变化。

为什么问这个问题

写东西总归要有一个触动点?当然这篇blog也不例外。闲来无事总是喜欢思考点什么,有些问题能够通过简单的思考得出一个让自己满意的答案。但是前段时间突然冒出一个问题,这个问题咋一看,凡是接触过计算机的朋友都能回答。但是我却发现自己没法找出一个让我自己满意的答案。这个问题就是——程序是什么?经过一段时间的琢磨,只能说找到了一个马马虎虎的答案,也许继续纠缠下去,也不会有什么让我满意的答案出现。

我的思绪

我只能说接下来的一些问题是我在寻找答案的过程中的一些思绪,谈不上思考。我认为思考是需要有严格谨慎的逻辑来支持的思维过程,而我的一些想法看上去是零散的,不完备的。

  1. 关于程序的产生过程
    你也许会不假思索的说,是写出来的。恭喜你答对了,但是很抱歉,我不满意这个答案。程序的产生一般都是由问题驱动的。比如,我们常常遇到的“从一堆电话号码中,查找某位朋友的电话号码“这个问题。我们遇到问题之后一般会设法思考这个问题的解决方案。假设,解决方案是挨个查看每一个名字,如果名字正好是我要找的那个朋友的名字,那么该名字对应的电话号码就是我要找的电话号码。这个解决方案很抽象,与具体如何实施没有任何关系。得到该解决方案之后。这时,不同的人会采用不同的方法来解决这个问题。比如,A是一个生活在18世纪的人,那么它很自然的想到拿出电话号码薄,找出朋友的名字,然后查看对应的电话号码就可以了。再比如,B是一个生活在21世纪的IT程序员,那么它很自然的会想到把电话号码薄存入到电脑中,然后通过写程序的方式来解决这个问题。
    这时,我们发现,程序是在我们对某个问题已经形成抽象解决方案之后,实施该抽象解决方案的一种手段。从这个角度看,程序是一种手段。既然程序是抽象解决方案的一种实现手段,那么我们可以讲程序是抽象解决方案的一种映射。映射(描述/表述的过程其实就是采用某种程序设计语言编写程序的过程。前提是,程序设计语言必须有能力表述抽象的实施方案,即程序设计语言需要有足够的表达能力。

  2. 关于程序的执行过程
    在看一下上面例子中程序的执行过程。假设程序将电话薄组织成一个map的形式,key是人名,value是电话号码。那么程序执行的过程就是在map中查找对应的人名,然后返回其对应的电话号码。从这个角度看,程序执行过程就是根据输入,在数据上执行特定的操作,然后返回结果。程序的执行过程可以看成抽象解决方案的具体实施过程。关于程序的执行过程,其实就是一个计算的过程。只是这个计算并不是我们通常所说的算术计算,而是通用计算。这其实也是我们把电脑称为计算机的原因。

  3. 为什么看上去几乎所有的事情都可以通过写程序来解决?
    这个问题背后意义深刻,且曾经深深困扰着我们一代又一代的数学家。我们现在所使用的计算机本质上是实现了一个通用计算模型。通用计算模型其实是现代计算机的灵魂,而计算机只是通用计算模型的一个物理实现。计算模型本质上是一个纯数学问题,一代又一代的数学家尝试发掘出一个通用计算模型,这个模型不但可以解决算术问题,还可以解决逻辑推理问题,还可以解决文字编辑问题,还可以解决数据排序问题等等一系列通用计算问题。寻找出这个通用计算模型的前提是数学家一直在尝试探索计算的本质是什么?终于阿兰·麦席森·图灵在1936年发表了一篇题为《论数字计算在决断难题中的应用》的论文,这篇论文中图灵提出了一个计算模型,”图灵机“。“图灵机”不是具体的物理机器,而是一种思想模型,可制造一种十分简单但运算能力极强的逻辑计算装置,用来计算所有能想象得到的可计算函数。其基本思想是用机器来模拟人们用纸笔进行数学运算的过程。图灵机还是停留在理论层面,而冯诺依曼则将这个逻辑计算装置转换成了物理实现。现在我们使用的计算机都是基于冯诺依曼计算机体系结构。如此看来,”几乎所有事情都可以通过在计算机上写程序的方式来解决“并不是一个偶然,而是有严谨的数学理论支持。

我的总结
上面三个问题看上去没有什么逻辑关系?但是想清楚这三个问题对于我理解”程序是什么“这个问题至关重要。

如此看来程序是:

  1. 描述抽象问题解决方案的一种手段

  2. 程序的运行过程,就是我们解决问题的过程,更是一个广义的计算过程。

  3. “什么东西都可以通过写程序来解决”,看上去是形容程序的强大,其实程序只是一个指挥计算装置进行操作的指令集合。真正强大的是现代计算机提供了通用的计算模型。这个计算模型可以模拟人的思维过程,它几乎可以帮助我们解决我们人脑所能解决的所有问题。

先写到这里,后面还会整理我的一些思路,继续更新这篇blog。

时间: 2024-08-07 08:12:45

程序是什么?的相关文章

『默哀』你的梦或许因为这个新闻而碎了【用你的程序语言 抛出一行异常】

对很多程序猿而言: 提升技术,构思产品,熬夜编码,拉到风投,艰苦创业,做大公司 —— 这是很多程序猿的梦想. 2017-09-09最新新闻 —— 你的梦或许碎了: <传WePhone创始人自杀,去世前称被前妻勒索1000万> 立两个Flag先: > 新闻最新发生,目前民意是 95%支持 创业者.但!目测两天之内,其妻翟某某 就会请 水军 赶赴战场 —— 祸乱三观. > 逼丈夫自杀,目测 翟某某 可能会成为遗产继承人(如果离婚手续还没办完) —— 完蛋!逼死人的人,拿完 离婚协议款,

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇

微信小程序——豆瓣电影——(2):小程序运行部署

Demo 预览 演示视频(流量预警 2.64MB) GitHub Repo 地址 仓库地址:https://github.com/zce/weapp-demo 使用步骤 将仓库克隆到本地: bash $ git clone https://github.com/zce/weapp-demo.git weapp-douban --depth 1 $ cd weapp-douban 打开微信Web开放者工具(注意:必须是0.9.092300版本) 必须是0.9.092300版本,之前的版本不能保证正

微信小程序开发初探

一.关于微信小程序 1.1 小程序诞生的背景 张小龙说道: (1)一切以用户价值为依归→用户是微信的核心,所以微信中没有很多与客户无关的功能,比如QQ中的乱七八糟一系列东西. (2)让创造发挥价值→所有围绕微信的创造比如公众号都应该发挥其应有的价值. (3)用完即走的高效服务→这一点就厉害了word天,微信要打造一个以微信为中心的生态链,不以绑定用户为目标.比如生活中有一些不太常用的app,我们可能一年也使用不了几次,但是有时候就需要用到,微信就想要提供这样一个平台,让你可以在微信中使用这中所谓

【小程序】获取微信 自带的 收货地址获取和整理

1.wx.chooseAddress(OBJECT) if(wx.chooseAddress){ wx.chooseAddress({ success: function (res) { console.log(JSON.stringify(res)) }, fail: function(err){ console.log(JSON.stringify(err)) } }) }else{ console.log('当前微信版本不支持chooseAddress'); } 2.数据处理,仅供参考 /

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

Java程序性能分析工具Java VisualVM(Visual GC)—程序员必备利器

VisualVM 是一款免费的\集成了多个JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回收器.执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作. 在内存分析上,Java VisualVM的最大好处是可通过安装Visual GC插件来分析GC(Gabage Collection)趋势.内存消耗详细状况. 一  Visual GC(监控垃圾回收器) Java Visu

Windows 10 UWP程序标题栏设置

原文:Windows 10 UWP程序标题栏设置 在Windows 10程序中,以前只能用于全屏方式的Metro程序现在可以运行在窗口模式下了,并且改了个新名字,叫Windows 通用程序(Universal Windows app),简称UWP程序.新的UWP程序虽然大体上还是和以前的Metro程序差不多的,但还是引入了一点新东西的,本文这里就介绍一下它的标题栏设置的几个特性. 隐藏标题栏: 将应用界面扩展至 Titlebar 区域 CoreApplication.GetCurrentView

程序媛计划——python socket通信

定义 socket 是进程间的一种通信方式,可以实现不同主机间的数据传输 #写服务期端程序server.py #实现服务器向客户端连接 1 #!/usr/bin/env python 2 #coding:utf-8 3 import socket 4 s= socket.socket() 5 #127.0.0.1是本地主机,1234是随意设置到一个端口号 6 s.bind(('127.0.0.1',1234)) #绑定端口号为1234 7 8 #等待客户端连接 9 s.listen(5) 10

自动生成简单四则运算的C语言程序

该程序是在博客园里面找的,具体是谁的找了半天没找到,无法提供它原本的链接.由于自己写的过于简单,且有一些功能暂时无法实现,所以就找了一个来应付作业,望原谅.在这个程序的源码中我改了一个错误的地方,源码中有这样一个随机数发生器的初始化函数的语句:"srand((unsigned)time(NULL))".srand函数是随机数发生器的初始化函数.但是正确的写法应该是:srand(unsigned( time(NULL))):为了防止随机数每次重复,常常使用系统时间来初始化,即使用time