• 当我们谈论计算机科学


    下午偶有所悟,特作此文防止青年痴呆。
    这学期的学习算是走了一半计算机科学概论。广度的学习通常会被指责为广而不精,但对我而言这是毫无意义的,因为
    我没有任何社会工作压力,仅仅是强烈的兴趣驱动,子非鱼安知鱼之乐如是。广度学习带来的好处是突破眼界的限制,
    但也随之带来了超出眼界的感受,每次学习一个新领域的知识总能让我找到之前学习的其他领域上的既视感,今早玩了下Mathematica,当我看到它强大的符号计算时突然想到一个词概括这种难以名状的感受:抽象。

    在Mathematica中可以输入Limit[Sin[x]/x,x->0]求它的极限,Mathematica对给定的输入字符串使用洛必达再代入x的趋近值进行运算,这个流程中它把字符(Character)抽象成了真正的变量符号,如果不使用抽象就只能使用数字常量宏替换x然后进行计算。对于学过编程的同学来说很平常,几乎没有任何值得赞颂的地方,但是这种平凡的手段确实构建了整个计算机科学,其他学科也有很多这种通过基础设施构建学科的例子,但没有哪一个像计算机科学这样彻底,虽然我想举例说明,单奈何我蒟对其他学科都不太了解,只能学着CS(Computer Science)论CS.
    
    一花看世界在计算机科学中尤其正确,当你浏览这篇文章时,在高层次上,一个浏览器提供一个抽象,我们只需输入一个合法链接然后回车浏览器就会正确显示页面,而不必让我们关心它是如何解析链接,如何与服务器进行数据交互的,服务器返回了哪些内容,该如何渲染这些内容等等,这给我们造成一种真的存在浏览器这种东西的假象。虽然没有浏览器也可以做到这些,但是如果真的关心这么多细节,绝对不会有当今辉煌的互联网产业。
    稍微低一个层次的抽象则是我们非常熟悉的编写代码,预处理,编译,链接系列行为,我们通过对编程语言允许的字符的笛卡尔内积中进行字符排序,可构建出一个浏览器,这里给我们造成一种编程语言真的存在的假象。
    然而事实上哪有什么编程语言,所谓C++,Java,Lisp不过是它的下一层即编译器提供的抽象,编译器把词法分析,语法分析,上下文相关分析,中间代码生成,代码生成等抽象为编程语言,编程语言告诉我们什么语法是它允许的什么是不允许的,一个权威的论证即只要你完全理解编译器源代码,你就能写出编程语言没有提到或者并不允许的代码(实际上这几乎是不可能的)。
    值得一提的是,在我们所言的广义编程中,链接执行也需要操作系统的参与,操作系统提供一个硬件的抽象相关,它把一系列硬件动作综合,分解为进程调度,I/O交互,虚拟内存管理,然后进行管理,在当前这个例子中,操作系统提供ABI接口(ABI接口又是一个抽象),运行时环境,以便程序运行。
    进一步,这里硬件动作是我杜撰的名词,我所想表达的是如内存管理单元结合操作系统进行寻址动作,CPU各级高速缓存和物理内存提供数据存储动作,算术逻辑单元等提供计算动作等,而这些单元不同功能的划分又是冯洛伊曼模型的实现,也即是说冯洛伊曼模型提供形式上的计算机抽象。
    这些单元的动作是计算机ISA的抽象,它们通过对指令进行适当排序实现这些动作,我们常说的指令集并行也发生在这个层次,计算机ISA是01数字流的抽象,不过这个抽象稍微有点弱,是否真的算是一个抽象请自行甄别。最后和我们熟知的一样01数字流是高低电平的抽象。
    

    计算机科学差不多就到这一步,更深入的内容则是物理的领域,通过自顶向下观点我们可以看到计算机或者说计算机科学完全是通过不断的抽象构成出来的,其中很多部分甚至有不止一个抽象,实例请参见冯洛伊曼模型与哈弗模型,抽象使我们忽略大量细节而只关心具体动作。
    再如深刻点的例子,我们天天都在面向对象,不难发现面向对象也是一种抽象,它忽略真实世界的大量细节而只保留我们关心的细节并以此构建出对象,当想表达一个小学生在课堂读书,我们会考虑

    public class PrimaryStudent{
        private String name;
        private List grade;
        private Env environment;
    
        public void readBook();
    }

    在这个例子中我们抽象出了具体模型,真实世界是复杂, 这个小学生可能读书会打瞌睡,可能会逃课等等,要想完整模拟真实世界不吃不喝写上一万年代码也写不完,感谢上帝,抽象使得我们关心需要的内容而不必事无巨细一一罗列,如果没有抽象我们根本不可能写出代码。

    当我们谈论计算机科学,实际上我们是在谈论一门关于抽象的方法学。

    2016.12.30

  • 相关阅读:
    Uncaught TypeError: Cannot set property 'onclick' of null
    Linuxe lftp命令(七)
    linux yum 命令(六)
    Linux vi/vim(五)
    Linux 文件与目录管理(四)
    Linux 文件基本属性(三)
    Linux 系统目录结构(二)
    Linux 系统启动过程(一)
    Java基础语法知识(笔记)——(三)泛型,String与正则
    Java基础语法知识(笔记)——(二)类与对象,接口,多态,继承,异常
  • 原文地址:https://www.cnblogs.com/ysherlock/p/7822283.html
Copyright © 2020-2023  润新知