程序(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)”的理解相关推荐

  1. java程序运行三步骤 理解编译

    java程序运行三步骤 理解三步骤 中国人向日本人采购口罩的案例 二人直接沟通 语言不通,鸡同鸭讲 有了翻译以后 可以正常沟通 可以正常处理事情了 回头看三步 通过类比的方式,描述三步骤 什么是源码 ...

  2. (39)System Verilog程序Program设计实例

    (39)System Verilog程序Program设计实例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog程序Program设计实 ...

  3. matlab零交叉块,[MATLAB基础] 关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈...

    关于心电信号奇异点与其小波变换模极大值对的零交叉点的关系?请教下面程序应该如何理解哈 %**************************************求正负极大值对*********** ...

  4. 【OpenGL ES】着色器Shader与程序Program

    在OpenGL ES 3程序中,Shader和Program是两个重要的概念,至少需要创建一个顶点Shader对象.一个片段Shader对象和一个Program对象,才能用着色器进行渲染,理解Shad ...

  5. python导包顺序_2019-03-21 python导入包以及Python程序执行顺序理解

    http://codingpy.com/article/python-import-101/ https://segmentfault.com/a/1190000009842139 (一)Python ...

  6. 线程运行程序c语言,理解线程1 C语言示例的程序

    一个简单的C语言实现的线程示例 在看<Beginning Linux Programming>时,为了更好的理解线程的概念,书中列举了这样一个小例子: #include #include ...

  7. .NET程序员应该理解的几种软件保护方法 辛苦开发的程序需要建立有效的保护机制...

    使用.NET开发程序,因为元数据存在于程序集中,可以轻易的被反编译成源代码.在分发给客户之间,会应用加密软件混淆程序集,这样让程序集被反编译时, 理解起来困难一些,增加一点破解难度.以下列举我常见到的 ...

  8. 程序员如何理解客户需求

    作为A8U扎金花技术人员,精力都投入到技术上,那么我们,程序员,热爱计算机技术.当你的客户或老板,大声的脱口说出他们想要的东西时,我们无法阻止,我们只能想象如何去实现它们. 但是,我们需要用更全面的眼 ...

  9. 浅谈对程序员的认识_8年编程生涯回顾:谈谈我对程序员的理解

    点击右上方关注我们,每天都能收到这样有趣有料的推文啦! (全文2000字,建议阅读时长5分钟) [文章为语录体问答形式] hello,大家好,我是阿琰. 今天这个文章主要是想讲一下我作为程序员对这个职 ...

  10. openFOAM中时间步长计算参数是怎样读进程序的——初步理解框架

    内容如题,在阅读完大量的基础代码之后,我们现在可以尝试解读一下chemFOAM中的程序流程.因为内容很多,所以会分好几个子标题讲完. 我们使用openFOAM的过程中,通常是从tutorials中找到 ...

最新文章

  1. 用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?
  2. 为什么建议大家使用Linux开发?
  3. Nat. Mach. Intel. | 突变后蛋白蛋白结合力的拓扑网络树预测模型
  4. Aix6.1安装openssh
  5. CryptoAPI与openssl数字签名与验证交互
  6. IOCP 浅析与实例
  7. jboss eap 7_EAP 7 Alpha和Java EE 7入门
  8. 2021中国到店消费新趋势洞察报告
  9. java算法之希尔排序
  10. “落花有意随流水,流水无情恋落花。”出处
  11. Java并发编程笔记—摘抄—基础知识
  12. APT linux必知必会
  13. python启动文件_Python启动文件配置
  14. K_Nearest_Neighbot(knn)方法及其Pyhon 实现
  15. 视觉感知「挑战」天花板,多摄像头环绕方案同比增长近100%
  16. SICP中关于兑换零钱的练习
  17. 云会议是什么?如何提升云会议的协同能力?
  18. 合肥工业大学2020-2021学年《数据挖掘》实验报告(Python实现)
  19. 实现表单form提交前进行确认提示 表单提交 确认对话框
  20. 软件测试五大特性,《软件测试52讲》——代码测试篇

热门文章

  1. SJTU 《综合英语一》备考题
  2. http://www.189qq.cn/soft?54563.htm
  3. Mysql高级查询语句练习
  4. mysql 学习小札(1)
  5. mmdetection运行demo出现 no attribute ‘__version__‘
  6. 建设工程法规专科【6】
  7. 惠普打印机打印不出来
  8. 全球BT下载网站排名
  9. 原码、反码、补码、移码之间的转换
  10. 外贸邮箱的格式是什么样的?邮箱的注册方式有哪些?