我对“什么是程序(Program)”的理解
程序(Program)——分为内在层面和外在层面。内在层面为指令,外在层面为需要解决的问题和环境参数约束。
所以程序就是在某些环境参数的约束下,针对需要解决的问题而编制的一系列指令、数据的集合。
流行的解释:“程序=数据结构+算法",我觉得作者仅仅看到指令本身,而忽略了指令的最终目的和环境约束。也就是说,“数据结构+算法”只是手段,属于上面所说的内在层面,不是程序的目的。
举个可能不太恰当的例子,先破后立:A君对B君说:“麻烦写一个加法器,能让用户输入两个int类型的参数,然后这个加法器返回结果给用户”。
——“写一个加法器,返回结果给用户”是B君需要解决的问题,“输入两个int类型的参数”是B君的环境约束(用户输入类型是int,个数是2个)。
此时B在干什么?B像一个呆子一样,仿佛听不见,喃喃自语地说着“我应该再做一个数据结构,用某种算法”,写着天书一样的程序,程序上满是数据结构和算法,可是这个对A君有没有用?没用!
A君比喻的就是外在层面,B君比喻的就是内在层面,两者不能割裂。B君写的指令是为了能让A君用,而不是自顾自地写程序——因什么而写(解决的问题)?为什么这么写(环境参数约束)?
环境,根据个人看法分为真实环境、硬件环境、指令环境和文法环境,它们因为需求和被需求的关系而结合。举个例子来解释,一台打印机打印出了一张报纸。真实环境是一张白纸,硬件环境是打印机,指令环境是驱动程序。白纸需要打印机打印,打印机需要驱动程序发出中断信号。函数Function A调用另一个函数Function B,Function A是Function B的指令环境。Function A、Function B定义了两个函数,写法本身是文法环境。
也许在《深入理解计算机系统》中一段话可以用来印证上文:“信息就是位加上下文”。一个“位”本身无意义,必须联系上下文才能显示它的意义。一段指令本身也无意义,联系它需要解决的问题和环境约束才有意义,解决的问题和环境约束就是指令的上下文。
这个对程序的解释,我们也可以引申到日常学习当中去。A君在公司里,每天的编程工作是做网站开发,具体需求无非是展示各种信息——需要解决的问题;工具是ASP.NET,面对的受众范围仅限在本城市,网站性能要求不高,开发进程不能太慢,老板不重视有没有bug,快点做出来赚到钱才要紧——环境参数约束。好,这时候,A君他很好学,买一堆书来看——《设计模式》、《计算机程序设计艺术》、《TCP/IP详解》、《C++ Primer》、《鸟哥的Linux私房菜》。请问,这些对他的开发有用吗?没有用!因为他要开发的程序,主要无非是对数据库进行增删改查而已,又不需注重性能,又不重视bug。所以不需要多么高深、完美的代码。工作平台又是ASP.NET、Windows系统,所以《C++ Primer》、《鸟哥的Linux私房菜》这些对他都没用,写代码用不到。
许多大公司,比如百度、阿里巴巴、腾讯(俗称“BAT”),他们可能要求真正精通一门语言(用C++举例),为何?在我看来,就是因为他们——需要解决的问题很多,环境参数约束很少——项目规模大,受众多,功能丰富,性能要求极高,等等。这些很大程度上主动决定了他们涉及的C++语法非常全面,对C++的理解必须非常深入(保证质量和性能是主要原因)。于是要求精通语言,也就在情理之中了。
我对“什么是程序(Program)”的理解相关推荐
- java程序运行三步骤 理解编译
java程序运行三步骤 理解三步骤 中国人向日本人采购口罩的案例 二人直接沟通 语言不通,鸡同鸭讲 有了翻译以后 可以正常沟通 可以正常处理事情了 回头看三步 通过类比的方式,描述三步骤 什么是源码 ...
- (39)System Verilog程序Program设计实例
(39)System Verilog程序Program设计实例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog程序Program设计实 ...
- matlab零交叉块,[MATLAB基础] 关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈...
关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈 %**************************************求正负极大值对*********** ...
- 【OpenGL ES】着色器Shader与程序Program
在OpenGL ES 3程序中,Shader和Program是两个重要的概念,至少需要创建一个顶点Shader对象.一个片段Shader对象和一个Program对象,才能用着色器进行渲染,理解Shad ...
- python导包顺序_2019-03-21 python导入包以及Python程序执行顺序理解
http://codingpy.com/article/python-import-101/ https://segmentfault.com/a/1190000009842139 (一)Python ...
- 线程运行程序c语言,理解线程1 C语言示例的程序
一个简单的C语言实现的线程示例 在看<Beginning Linux Programming>时,为了更好的理解线程的概念,书中列举了这样一个小例子: #include #include ...
- .NET程序员应该理解的几种软件保护方法 辛苦开发的程序需要建立有效的保护机制...
使用.NET开发程序,因为元数据存在于程序集中,可以轻易的被反编译成源代码.在分发给客户之间,会应用加密软件混淆程序集,这样让程序集被反编译时, 理解起来困难一些,增加一点破解难度.以下列举我常见到的 ...
- 程序员如何理解客户需求
作为A8U扎金花技术人员,精力都投入到技术上,那么我们,程序员,热爱计算机技术.当你的客户或老板,大声的脱口说出他们想要的东西时,我们无法阻止,我们只能想象如何去实现它们. 但是,我们需要用更全面的眼 ...
- 浅谈对程序员的认识_8年编程生涯回顾:谈谈我对程序员的理解
点击右上方关注我们,每天都能收到这样有趣有料的推文啦! (全文2000字,建议阅读时长5分钟) [文章为语录体问答形式] hello,大家好,我是阿琰. 今天这个文章主要是想讲一下我作为程序员对这个职 ...
- openFOAM中时间步长计算参数是怎样读进程序的——初步理解框架
内容如题,在阅读完大量的基础代码之后,我们现在可以尝试解读一下chemFOAM中的程序流程.因为内容很多,所以会分好几个子标题讲完. 我们使用openFOAM的过程中,通常是从tutorials中找到 ...
最新文章
- 用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?
- 为什么建议大家使用Linux开发?
- Nat. Mach. Intel. | 突变后蛋白蛋白结合力的拓扑网络树预测模型
- Aix6.1安装openssh
- CryptoAPI与openssl数字签名与验证交互
- IOCP 浅析与实例
- jboss eap 7_EAP 7 Alpha和Java EE 7入门
- 2021中国到店消费新趋势洞察报告
- java算法之希尔排序
- “落花有意随流水,流水无情恋落花。”出处
- Java并发编程笔记—摘抄—基础知识
- APT linux必知必会
- python启动文件_Python启动文件配置
- K_Nearest_Neighbot(knn)方法及其Pyhon 实现
- 视觉感知「挑战」天花板,多摄像头环绕方案同比增长近100%
- SICP中关于兑换零钱的练习
- 云会议是什么?如何提升云会议的协同能力?
- 合肥工业大学2020-2021学年《数据挖掘》实验报告(Python实现)
- 实现表单form提交前进行确认提示 表单提交 确认对话框
- 软件测试五大特性,《软件测试52讲》——代码测试篇
热门文章
- SJTU 《综合英语一》备考题
- http://www.189qq.cn/soft?54563.htm
- Mysql高级查询语句练习
- mysql 学习小札(1)
- mmdetection运行demo出现 no attribute ‘__version__‘
- 建设工程法规专科【6】
- 惠普打印机打印不出来
- 全球BT下载网站排名
- 原码、反码、补码、移码之间的转换
- 外贸邮箱的格式是什么样的?邮箱的注册方式有哪些?