四类程序

简介: 前几天读了沈公的《也谈写写编译器》,很认同其观点。我也赞同“编译原理”就像数据结构一样是很基础、很实用的课程:“unix/linux 下随便哪个项目为了方便都可能随手做一个, 这是 unix 程序员的基本功”。但很可惜我们学校软件工程专业不开设编译原理,理由是学了没用。 我们都知道“程序=数据结构+算法”,我们姑且通俗地说是程序由“数据”和处理数据的“行为”组成。根据程序对数据和行为的控制,

前几天读了沈公的《也谈写写编译器》,很认同其观点。我也赞同“编译原理”就像数据结构一样是很基础、很实用的课程:“unix/linux 下随便哪个项目为了方便都可能随手做一个, 这是 unix 程序员的基本功”。但很可惜我们学校软件工程专业不开设编译原理,理由是学了没用。

我们都知道“程序=数据结构+算法”,我们姑且通俗地说是程序由“数据”和处理数据的“行为”组成。根据程序对数据和行为的控制,可以将其归类为“硬编码”、“可配置”、“可控制”以及“可编程”四类。下面以简易计算器为例依次讨论。

硬编码

此级别的程序,数据和行为都是硬编码到代码中,执行时用户不能改变。比如在C程序中直接printf ( "%d/n", 1+2 );。这时候程序的数据“1”、“2”和行为“+”都是固定不必的。

硬编码的程序在实际应用中不常见。

可配置

到了可配置级别,程序的行为依然固定,但数据由用户来决定。比如ACM的经典入门题“a+b”:scanf ( "%d%d", &a, &b ); printf ( "%d/n", a + b );。此时程序行为依然是求和,但数据是运行时才确定,程序变得比较灵活。

为可配置的程序提供的数据文本,可以看作是一种数据格式(Data formats)。比如 /etc/passwd。

可控制

可控制的程序比可配置更灵活,运行时用户不仅可以指定数据,还能指定处理该数据的行为。即运算符“+、-、×、÷”也由用户指定。例如scanf ( "%d%c%d", &a, &c, &b );,接下来用switch (c) 分别处理四则运算。可控制就是指程序的行为可控制,但行为的范围依然是固定的。也就是说用户指定的行为必须是程序本身提供的,程序只能进行四则运算,求根、阶乘等运算行为程序没提供,因此就无法使用。

此时,程序的数据文本具有隐式操作,可以理解成一种暗含控制流的声明性语言。例如 fetchmail(1) 的运行控制语法可视为一种很弱的命令性语言。

可编程

可编程的程序,已经同时具备“输入输出、算数运算、内存管理、按条件跳转”四种性质(请参考前文《用DOS批处理来做数字图像处理)。此时程序的行为是可扩展的,例如能通过迭代来运算阶乘。

此时的程序已经发展到命令性(具有显示操作)的微型语言范畴,几乎快成为通用解释器。bc(1) 和 dc(1) 都是完备图灵机语言的好例子,它们都是命令性微型语言。


版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者“redraiment”和主站点上的本文原始地址


我的邮箱,欢迎来信(redraiment@gmail.com
我的玩具箱(子清行
我的百度空间(梦婷轩

目录
相关文章
|
存储 缓存 Oracle
常识四堆外内存
常识系列,作为一名互联网门外汉的科普系列 堆外内存除了在像netty开源框架中,在平常项目中使用的比较少,在现前的项目中,QPS要求高的系统中,堆外内存作为其中一级缓存是相当有成效的。所以来学习一下,文中主要涉及到这三分部内容 1. 堆外内存是什么?与堆内内存的区别 2. 怎么分配,与GC的影响 3. 开源框架使用 这篇文章写到最后,发现还只是回答了开源框架OHC的Why not use ByteBuffer.allocateDirect()?
1345 1
常识四堆外内存
|
3月前
|
测试技术
探索软件测试的多维视角:从单元到系统,从静态到动态
【8月更文挑战第27天】本文将带领读者穿越软件测试的迷宫,从最微小的单元测试开始,逐步扩展到复杂的系统测试。我们将一起探索静态测试和动态测试的不同面貌,以及它们如何互补地确保软件质量。通过实际代码示例,我们将揭示测试用例的设计思路和执行过程,旨在为读者提供一个全面而深入的软件测试全景图。让我们开始这段旅程,解锁软件测试的秘密,确保我们的代码不仅能够运行,而且能够完美运行。
|
5月前
|
算法 程序员 编译器
C++的四类循环分享
C++的四类循环:Entry or Exit controlled, Ranged-based or For_each
|
存储 算法 C语言
程序组织单元及其组成编程
程序组织单元及其组成编程
|
程序员 人机交互 C++
操作系统的发展和分类,概念,它的运行机制和体系结构,以及和它相关的特征,功能和目标,
操作系统的发展和分类,概念,它的运行机制和体系结构,以及和它相关的特征,功能和目标,
126 0
|
编解码
失真的概念和定义
失真的概念和定义
219 0
|
安全 Java API
了解程序运行逻辑的必要性及应用和硬件的关系
了解程序运行逻辑的必要性及应用和硬件的关系
108 0
|
关系型数据库 MySQL 数据库
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
中国科大实现两类不同量子资源间的相互循环转化
中国科学家提出量子相干性与量子关联之间的循环转化方法,并在光子系统中实验验证了该方案,相关研究成果在线发表在《物理评论快报》上。
1346 0