AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
88 stars 11 forks source link

第一次对计算机科学的懵懂 #58

Open AlexiaChen opened 4 years ago

AlexiaChen commented 4 years ago

title: 第一次对计算机科学的懵懂 date: 2017-03-23 12:01:23 tags:

我的大学

刚上大学的时候,在大教室上的第一堂课是计算机科学系的系主任给我们上的一堂“思想开导课”。是这么说的,我们专业是计算机里面最古老,历史最久远的一个专业,比之软件工程,网络工程历史久远的多,也是最博大精深的专业,因为它是计算机科学!是一门理论性质比较强的学科。

这由此真正打开了我对计算机世界的憧憬,刚开始我确实不懂什么是计算机科学,以为就是写写代码,懂点数据结构和算法,也不去管什么叫图灵,丘奇的人物。

但是后来,由于工作以后,随着业余研究的深入,我发现我真不懂计算机科学,其实呢,在学校的时候包括现在,大部分同学和教授也对什么是计算机科学也是差不多一窍不通的(因为我的学校真的很次,不是牛校,不会出现什么特别有名的牛人)。

不过,他们懂与不懂也与我无关了。随着后来我逐渐对函数式语言的理解,以及程序语言理论的了解,接触了计算理论的一些皮毛,才慢慢打开了计算机科学的大门。

计算模型与计算能力

因为我以前对C++模板元编程很不熟悉,最近的工作业余喜欢写些有趣的C++模板代码来表达实现我以前的一些思想(算法)。可能遭到了一些不理解实情的人的好奇,他们可能想,玩这样的trick有什么意思吗? 不要注重这些或有或无的东西,工程经验才是王道!语言只是工具!最重要的还是数据结构与算法,还有项目经验。

我当然知道这些人的意思,其实他们的初衷是好的,不希望我沉迷语言的某些技巧不能自拔。

其实呢不是这样的,因为C++的模板元本身就是自成一套体系的,它对比之C++可能说是“另外一门语言”,最重要的是模板这套“符号系统”本身就是图灵完备的。也就是说,模板本身的计算能力与Java,Python等图灵完备的语言计算能力等价,它们能做的事情,模板也能做。

所以,当我在用模板解决问题的时候,我所思考的是如何将自身的想法在这套“计算模型”上表现。我是在尝试模板自身的计算能力到底有多强?什么问题模板可以计算?什么问题又不可计算?

fix = lambda f.(lambda x f(lambda.x x y)) (lambda. f (lambday. x x y))
g = lambda fct lambda n if reqleq n c0 then c1 else (times n (fct(prdn)))
factorial = fix g

上面是通过lambda演算求不动点定义阶乘算子,这种表达能力是lambda演算的计算能力所体现的,这个东西最核心的就是:不动点算子。

其实举着例子,我也只是想把问题又转移到C++模板元上,还是上面那个问题,模板的计算能力有多强?同样一个计算问题在模板这种另一种计算模型上该如何表现?这并不是无趣的自我提问,因为它的本质甚至涉及到了我们今天电子数字计算机的诞生,图灵和丘奇这两位前辈的研究成果。

在计算机的世界,有可计算问题,有不可计算问题(例如著名的停机问题)。如果可计算那么它的计算复杂度是多少?如果不可计算,这又是为什么不可计算? 我在试图探讨更本质的一些东西,换句话说,对一些问题,模板是否能计算?如果是,是为什么? 如果不是,又是为什么?

路漫漫其修远兮

什么是计算?以及以上的自我式提问。

当然这些问题不是我现在就能说得清楚的,还得继续,路漫漫其修远兮。