当我们谈论计算机科学

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏包子铺里聊IT

解锁 Leetcode 新题:寻找明星

Suppose you are at a party with n people (labeled from 0 to n - 1) and among the...

3686
来自专栏高性能服务器开发

去BAT,你应该要看一看的面试经验总结

首先是简单地了解下你之前的工作经历和项目经验,然后就是算法和数据结构题目,具体涉及到以下内容:

1752
来自专栏数据结构与算法

9.22模拟赛解题报告

T2读题就花了半个小时,而且一开始没认真理解题目的意思,前后各dp了一遍,后来仔细揣摩了一下题意,细心品味了一下出题人的语言,正着的dp好像是没用的。。。

863
来自专栏码神联盟

语音识别 | Java 实现 AI 人工智能技术 - 语音识别功能

说到语音识别、语音翻译、图像识别、人脸识别等等,现在已经非常非常非常普及了,看过‘最强大脑’的朋友,也应该对‘小度’这个机器人有所了解,战胜国际顶尖的‘大脑’-...

2K6
来自专栏人工智能LeadAI

讨厌算法的程序员 | 第四章 时间复杂度

增长量级 ? 函数的增长量级 上一篇算法分析基础中,我们分析了插入排序,知道了其最好情况下的运行时间为T(n) = an + b,最差情况下的运行时间为T(n...

2918
来自专栏TensorFlow从0到N

讨厌算法的程序员 4 - 时间复杂度

增长量级 ? 函数的增长量级 上一篇算法分析基础中,我们分析了插入排序,知道了其最好情况下的运行时间为T(n) = an + b,最差情况下的运行时间为T(n...

3093
来自专栏好好学java的技术栈

“365算法每日学计划”:01打卡

如果有小伙伴很少接触到这种题目的话,可能会觉得有点陌生,不知道从何下手,可能一开始我们能想到“最笨”的方法,但是也觉得挺有“娱乐性”的方法。

2743
来自专栏数据派THU

一文读懂PyTorch张量基础(附代码)

本文介绍了PyTorch Tensor最基础的知识以及如何跟Numpy的ndarray互相转换。

1043
来自专栏数据结构与算法

agc016B - Colorful Hats(智商题)

有$n$个人,每个人有一种颜色,第$i$个人说除了我之外有$a_i$种不同的颜色,问是否存在一组合法解

1142
来自专栏牛客网

个人的前端面经,回馈社会

酷家乐(10-20k) 电话一面 三十五分钟 如何学习前端,看了什么书 谈实习经历 谈项目,问为什么用那么多插件,有没有想过自己写 position有几个属性 ...

3725

扫码关注云+社区

领取腾讯云代金券