《计算机程序的构造和解释》学习笔记——过程抽象

2023-05-16

    这篇博文里说到程序=数据+过程,数据分为不同类型,每种类型有不同的操作过程。例如,两个指针变量相加是无意义的,所以对指针类型来说加法操作是“不允许”的。在汇编层,每一个数据,每一步数据操作过程都是原子级的,更高层次的数据和操作概念需要“高级”语言的支持,也就是这个语言配套的编译器/解释器能将这个“新”类型数据、“新”过程解释/编译成底层概念,才能实际运行。这里的两个“新”字就体现了程序的抽象机制。程序抽象可以“粗暴”的分为两类:过程抽象和数据抽象。之所以说粗暴是因为数据和过程的界限有时是模糊难以清晰划分的。
    计算机里的过程是对真实世界过程的抽象,在现实中需要处理事务、需要绘画、需要传递信息、需要运算……。 这些在计算机上都可以完成,对应的有计算机辅助设计、email、IM、大型运算中心等等。这些过程的操作对象就是真实世界的数据抽象。这些数据或多或少、或显著或隐晦的表示着真实世界的某种状态。数据抽象和过程抽象共同模拟了真实的世界,在现代社会的各行各业,计算机技术都在发挥着作用,助推人们更好更便捷的处理任务。而编程语言就是描述“如何做”的工具,工具反过来也会影响“如何描述”和“如何做”。不同语言有各自的特点,但目标是一样。就像自然语言一样,发音、字形、语法不同,但都是人类沟通的工具。语言反过来也会影响人的思维。计算机语言也有同样的效果,它影响程序员的编程思想,所以程序语言也在不断进化中。
    任何语言都必须包含三种机制:
  • 基本表达式,用于表示最简单的个体
  • 组合的方法,通过组合方法可以从简单的元素构造复合的元素
  • 抽象的方法,保证可以将复合对象作为单元去操作的机制。
所有的表达式都有值,程序的运行过程即是表达式的求值过程。数据表达式的值就是数据的表示方式,简单数值表达式如25,它的值就用整数25表示,复合表达式如结构体struct,它的值就是这个结构体内的数据表示形式;过程表达式的值就是对数据的“操作”,也就是过程体,如“+”加法表达式,它的值就是将它左右(或者其他,不同语言的表示方式不同)的其他表达式的值做相加操作。
/**
*
*scheme语言举例
*自定义了一个加法过程,它接收两个参数,相加并将结果返回
*下面是求值组合表达式,它的左边运算符就是刚才定义的过程
*参数1为另一个复合过程( + 1 2 ),参数2为最简单数值表达式
*/
( define mysum
    ( lambda ( a b ) ( + a b ) ) )

( mysum ( + 1 2 ) 3 )
这段程序就包含了上面描述的三个机制,define代表了一种抽象的方法,它表示自定义了一个过程,它类似于重写了加法,但这里mysum只允许两个参数;1、2、3和“+”是基本的表达式;而(+ 1 2)是组合的方法,将基本的表达式组合起来,它的值就是将“+”加法运算符运用于操作数1、2上得出的结果。

过程抽象

    上面描述了第一层次的过程抽象:将为实现目的的若干操作封装成一个过程,使得过程的使用者不需要了解该过程内部实现细节,而只要了解过程的接口,传入适当的参数,就能得到预期的结果。这里的define规则给该过程命名,mysum就如同“+”、“-”、“*”、“/”等内部过程一样,可以看作自定义的运算符,在表中的最左位置,它的值就是作用于其他数据对象的结果。
    下面考虑另一个层次的抽象问题,定义以过程作为参数或者返回值的过程。对比下面的代码:
/*
*求和公式
*/

( define square
    ( lambda ( x ) ( * x x ) ) )
( define cube
    ( lambda ( x ) ( * x x x ) ) )
( define sum-square
    ( lambda ( a b )
        ( if (> a b)
            0
            ( + (square a) ( sum-square ( + a 1 ) b ) ) ) ) )
( define sum-cube
    ( lambda ( a b )
        ( if (> a b)
            0
            ( + (cube a) ( sum-square ( + a 1 ) b ) ) ) ) )
上面的代码定义了四个过程,其中square(x)、cube(x)分别计算x的平方和立方,sum-square(a b)、和sum-cube(a b)计算从a到b的平方和与立方和。仔细看会发现求和的过程中的模式很相似。求平方和的过程中,先比较a是否大于b,如果大于b则返回0,否则求a的平方,然后递归调用sum过程,并将这两个结果相加,递归的过程中参数a加1。求立方和的过程就是在求a的立方时不同,其他部分很相似。这里面是否隐藏了某种模式,可以综合处理上述两个过程?
( define <name> 
    ( lambda ( a b )
        ( if ( > a b )
             0
             ( + ( <term> a )
                   ( <name> ( <next a) b )))))
上面的代码就是计算平方和与立方和的公共模式,term、name和next是需要填入的过程,以满足新的求和公式。这就是第二次的过程抽象,以过程作为过程的参数,使得语言编程的威力大增。
    在《计算机程序的构造和解释》第一章求方程的不动点例子中,将过程的抽象再提高一个层次。所谓不动点就是满足x=f(x)方程的x值。求解的方法就是首先猜测一个值x,然后计算f(x)、f(f(x))、f(f(f(x)))...,直到值的变化不大,就找到它的不动点了。看代码:
( define tolerance 0.00001)
( define ( fixed-point f first-guess)
    ( define ( close-enough? v1 v1 )
        ( < (abx ( - v1 v2 )) tolerance))
    ( define ( try guess )
        ( let (( next ( f guess )))
            ( if ( close-enough? guess next)
                 next
                 ( try next ))))
    ( try first-guess))
上面的代码在fixed-point过程内部定义几个辅助过程,首先是close-enough?会比较v1和v2是否足够接近;然后在try过程中,给next赋值为f(guess)的值,然后比较guess和next是否接近,如果是则返回next,否则继续求f(next)的值,直到close enough。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《计算机程序的构造和解释》学习笔记——过程抽象 的相关文章

  • Nginx 使用naxsi 防xss、防注入攻击配置

    61 61 对于nginx有相应模块来完成WAF构建 xff0c 此处使用的是naxsi模块 61 61 Naxsi是一个开放源代码 高效 低维护规则的Nginx web应用防火墙模块 Naxsi的主要目标是帮助人们加固他们的web应用程序
  • pytorch 把tensor转换成int

    直接在tensor变量的后面加 item xff0c 就能把tensor类型转换成int类型 xff0c 我也不知道为什么 xff0c 试了别的都不行 准确的说是把Tensor 转化成Python scales
  • 最新软件设计师知识点分析(思维导图)

    大家好 xff0c 作为一个考取软件设计师的过来人 xff0c 今天我给大家分享一下关于软件设计师考题的复习经验 1 多做多分析多总结近年来习题 xff08 达到看到题就知道考点是什么怎么解 xff09 2 知道怎么在题中怎么找答案 3 梳
  • 记一次阿里云服务器被攻击导致无法ssh登陆(root也不行)

    服务器被攻击导致无法ssh 博主早上登陆准备做一些骚操作 xff0c 结果突然发现ssh不上服务器 xff0c 并且收到短信说服务器被挖矿病毒攻击 xff0c 然后服务器就斯密达了 xff0c 发现报错如下 xff1a Permission
  • Python geometry_msgs.msg.PoseStamped() Examples

    https www programcreek com python example 70252 geometry msgs msg PoseStamped
  • github 下载历史版本的代码

    操作如下所示 xff1a 根据历史commit xff0c 找到历史版本 xff0c 然后下载
  • 欢迎使用CSDN-markdown编辑器

    转 Eclipse下tomcat输出路径配置 标签 xff1a tomcateclipseserverpath 2012 07 12 16 09 7256人阅读 评论 0 收藏 举报 分类 xff1a eclipse tomcat xff0
  • 那根你想顺着去打人的网线是怎么制作的?

    更多精彩关注微信公众号 xff1a 信息技术员 现代社会大家都很浮躁 xff0c 总有人嚷嚷着要顺着网线去打人 xff0c 也不问问自己会做网线么 xff1f 本文手把手教你怎么制作一根网线 一 准备工作 1 网线一根 2 网线钳一把 3
  • Linux下动态库使用小结

    1 xff0e 静态库和动态库的基本概念 静态库 xff0c 是在可执行程序连接时就已经加入到执行码中 xff0c 在物理上成为执行程序的一部分 xff1b 使用静态库编译的程序运行时无需该库文件支持 xff0c 哪里都可以用 xff0c
  • 傻瓜式教学——手把手教你电脑三种方式连接打印机

    如何判断打印机和电脑的连接方式 xff1f 电脑连接打印机有三种方式情况 xff0c 一是通过USB直连 xff0c 二是通过网络连接 xff0c 三是通过共享连接 可通过下面方法判断连接方式 如果通过 口和电脑连接 xff0c 则是USB
  • 服务器为什么能够稳定可靠运行?

    前几天github服务器故障 xff0c 传言服务器被偷走一度上了热搜 xff0c 后证实传言是P图 xff08 下图为假 xff09 但确实每次大型互联网公司服务器故障都引发了人们的广泛讨论 其中还有不少上了热搜 那么服务器到底是何方神圣
  • Yanmar(洋马)发动机SPN-FMI代码在仪表显示

    分享一个自己在仪表上显示洋马发动机SPN FMI代码过程的记录 1 问 xff1a SPN和FMI什么意思 xff1f 答 xff1a 见SAE J1939 73 5 6 诊断故障码定义 诊断故障代码 xff08 DTC xff09 由4
  • APM调试,地面站随手记

    最近随公司调试4轴和8轴APM多旋翼 xff0c 本文将心得记录下来 xff0c 以备自己和他人查阅 xff0c 水平有限 xff0c 如有错误 xff0c 请不吝赐教 本文不定期更新 xff0c 转载请注明出处 2016 9 8 一 自检
  • 解决同一局域网下不同网段能ping通但是ssh不上服务器的情况

    一 xff1a 问题描述 xff1a 在公司的局域网网络环境下有四个ip网段 xff0c 分别是192 168 1 0 2 0 3 0 5 0 xff0c 服务器用的是5 0网段的 xff0c 而个人电脑用的则是1 0网段的 xff0c 在
  • STM32单片机电源端并联电容的重要性

    如图 xff0c 笔者用TQFP 32 100PIN 0 55MM转直插的转接板焊了一个STM32F207VET6的板子 板上引出了SWD调试接口 xff08 仅占用PA13和PA14 xff09 xff0c USART1串口引脚 xff0
  • Linux信号量常用操作表

    以下函数失败时均返回 1 xff0c 所在头文件为 include lt sys sem h gt 创建用于区分信号量的键值key xff1a key t key 61 ftok 34 foo bar 34 39 a 39 xff0c 第一
  • 一文加强对React的记忆(2021 年 6 月更新),收藏再也不用查看文档、教程了

    我不经常使用 React xff0c 所以每当我需要在 React 中做最小的事情时 xff0c 我都必须查看文档 教程或在论坛上发布问题 这就是我决定做这个记忆辅助工具的原因 xff0c 鉴于我的记忆力不是那么好 xff0c 我想为什么不
  • 13.实现鼠标中断处理

    简介 上节实现了对键盘中断服务子程序的处理和修改优化了中断程序 xff0c 但只是简单的在中断服务子程序中记录断码或通码 xff0c 缓冲区使用效率不高 目标 实现鼠标中断处理 优化中断缓存 pc中8259A中断控制器连接模型如下 1 鼠标
  • 【Linux】在Linux上安装VNC

    有幸能够亲自在服务器上面操作一下 xff0c 这篇博客来说一说 xff0c 如何在Linux上安装VNC 首先要知道的是 xff0c VNC是什么 VNC xff08 Virtual Network Computing xff09 xff0
  • win10开启自带的手机投屏功能方式

    本篇文章主要讲解win10开启自带的手机投屏方式 日期 xff1a 2023年1月15日 作者 xff1a 任聪聪 开启后效果 点击连接 打开连接或通过手机其他网络进行连接 连接步骤 xff1a 步骤一 打开手机端的wifi网络设置 xff

随机推荐

  • TensorFlow学习(三):tf.scatter_nd函数

    scatter nd indices updates shape name 61 None 根据indices将updates散布到新的 xff08 初始为零 xff09 张量 根据索引对给定shape的零张量中的单个值或切片应用稀疏upd
  • text to image(八):《Image Generation from Scene Graphs》

    最近在翻阅文本生成图像的相关工作 xff0c 目前比较新的有突破性的工作是李飞飞工作团队18年cvpr发表的 Image Generation from Scene Graphs 论文地址 xff1a https arxiv org abs
  • text to image(四):《Stackgan》

    继续介绍文本生成图像的相关工作 xff0c 本文给出的是2016年12月10日发表于 arXiv 的文章 Stackgan Text to photo realistic image synthesis with stacked gener
  • text to image(六):《AttnGAN》

    继续介绍文本生成图像的工作 xff0c 本文给出的是CVPR 2018 的文章 AttnGAN Fine Grained Text to Image Generation with Attentional Generative Advers
  • image caption笔记(二):《Show and Tell : A Neural Image Caption Generator》

    一 基本思想 CNN 43 RNN CNN用的是VGG16 RNN部分用的是LSTM 换成resnet101效果会更好 二 模型结构 四 代码分析 xff1a 首先是训练的部分 xff08 1 xff09 准备数据 COCO数据集中的cap
  • L1惩罚项和L2惩罚项

    x即为参数 L2正则化参数 从公式5可以看到 xff0c 越大 xff0c j j衰减得越快 另一个理解可以参考图2 xff0c 越大 xff0c L2圆的半径越小 xff0c 最后求得代价函数最值时各参数也会变得很小
  • COCO数据集介绍

    转载自 xff1a https zhuanlan zhihu com p 29393415 COCO的 全称是Common Objects in COntext xff0c 是微软团队提供的一个可以用来进行图像识别的数据集 MS COCO数
  • image caption笔记(九):《Unsupervised Image Captioning》

    无监督的caption 文章使用一个图像数据集 xff08 MSCOCO xff09 和一个文本语料库 xff08 从Web上抓取的200多万个句子组成图像描述语料库 xff09 来做无监督caption 没有任何配对集合 1 模型结构 x
  • PyTorch中使用指定的GPU

    转载自 http www cnblogs com darkknightzh p 6836568 html PyTorch默认使用从0开始的GPU xff0c 如果GPU0正在运行程序 xff0c 需要指定其他GPU 有如下两种方法来指定需要
  • 七大主流排序算法时间效率比较(基于C语言)

    这段时间在温故一些常见的排序算法 xff0c 顺手便把常见的一些比较著名的排序算法对同一个目标样本做了个比较 样本存于文件中 xff0c 可以根据需要进行替换 我调试的数据量较小 xff0c 发现简单算法 xff08 冒泡 xff0c 选择
  • image caption笔记(十):一些实现过程中的小细节

    1 beam search 一方面可以提升指标 xff0c 另一方面也可以解决生成的句子不通顺的问题 因此 xff0c 不管是在训练测试的过程中都要开beamsearch xff0c 对提高指标有帮助 还有就是 xff0c 如果训练的时候
  • C# 多进程之间的通讯方式

    前言 C 中可能大多数人针对于多线程之间的通讯 xff0c 是熟能生巧 xff0c 对于AsyncLocal 和ThreadLocal以及各个静态类中支持线程之间传递的GetData和SetData方法都是信手拈来 xff0c 那多进程通讯
  • setInterval()之坑

    首先看下面这个例子 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt
  • window.open()session丢失问题解决方法

    最近要实现两个项目间的跳转 xff0c 避免二次登录 xff0c 出现了window open session丢失问题 xff0c 说下解决方法 一开始是这样写的 A项目调用B的登录请求 xff0c 返回成功 xff0c 即跳到B项目相应页
  • Java解析XML和json几个小例子

    一 DOM4J解析xml 案例1 xff1a 解析如下xml lt xml version 61 34 1 0 34 encoding 61 34 UTF 8 34 gt lt employee gt lt name gt 张三 lt na
  • Struts2拦截器简单实例

    利用拦截器实现权限控制 用户 admin 有全部的访问访问权限 用户 zhangsan有 a jsp b jsp的 访问权限 用户 lisi有 a jsp c jsp的 访问权限 如果用户没有访问权限 页面统一跳转到 permissionD
  • http请求循环调用返回数据抓取不全解决

    最近碰到一个问题 xff0c 就是频繁调用http请求 xff0c 返回的数据出现缺失的情况 特此记录下解决过程 先上代码 普通的get调用方法 public String sendGet String urlStr throws Inte
  • shiro 报错

    最近 xff0c 在学shiro的碰到如下报错 xff1a 登录认证失败 xff01 xff01 xff01 org apache shiro authc AuthenticationException Authentication fai
  • Oracle修改用户密码引发的问题

    前几天通过plsql登录数据库时 xff0c 提示密码过期 xff0c 需要修改密码 xff0c 那就修改呗 改完过了会 xff0c 再登录 xff0c 发现用户被锁了 那就去解锁下吧 一 登录数据库服务器 su oracle sqlplu
  • 《计算机程序的构造和解释》学习笔记——过程抽象

    这篇博文里说到程序 61 数据 43 过程 xff0c 数据分为不同类型 xff0c 每种类型有不同的操作过程 例如 xff0c 两个指针变量相加是无意义的 xff0c 所以对指针类型来说加法操作是 不允许 的 在汇编层 xff0c 每一个