大学四年

进入大学第一门要学习的专业课程就是C语言。大一那时候学的C语言基本上就是讲讲语法,没有任何其它内容。

晃荡了一年半之后,大二下学期来了一门重量级的课程--数据结构。其实学习数据结构的时候C语言基本的内容就已经忘记差不多了,没办法只能重新学。连C语言语法如此简单的语言都会忘记,那只能说明当初学习的不够深入。这时候带着使用C语言的目的去学习,让我进步的非常快。其实数据结构中,除了一些简单的算法知识,主要是对指针的运用。特别是链表和二叉树这两种数据结构。指针这东西,我在一开始写链表的程序时候就非常疑惑。为什么一个结构体的内部可以有指向这个结构体的指针,这不是有点进入先有蛋还是先有鸡的死循环中吗?另外一个让人困惑的就是函数指针。一个变量有指针这很容易理解,表示的是这个变量的地址。那为什么函数也有指针?函数不就是源程序中的一个代码块吗,那么它的指针表示的是这块代码的地址吗?

我带着一系列的问题学习着数据结构,当我在开学两个月后看完教材的时候发现这本科并不能解释任何问题。它只是不厌其烦得讲解着各种算法,各种数据结构的运用场合。教材最后几章一直在讲各种排序和查找算法,我承认那些那些算法更精妙也很重要,但是一个连指针是什么都没弄清楚的人这些东西又有什么用呢?我不应该再继续往算法方向学习下去了。

我开始学习汇编。我看的书是王爽的《汇编语言》。不得不提一下这一本绝对是学习计算机人士必备书籍。用了一个月时间看完了这本书,也完成了书上大部分的联系,也写了书上所有要求的汇编程序。一次又一次的使用mov, add, sub, loop, jmp,cmp等指令,我不知道从什么时候开始突然明白了指针的本质。指针就是内存中的数据数据单元,和int, char等数据类型并没有本质的不同,定义了指针类型的变量和普通类型的变量都是在内存中开辟了一定的空间。指针和普通类型不同的地方就是它并不直接表示一个变量值,而需要处理器经过二次运算才能找到对应的值。在intel 32位处理器下,指针一般都是4个字节。学习了汇编之后才能明白原来程序运行流程不是按照一个函数一个函数进行跳转的,使用jmp指令可以让程序跳转到任何地方。甚至用机器码写一段指令,让程序跳转到这个位置。在汇编语言和机器语言的级别上根本没有int, float, double, char的类型含义,有的只有字节,字和双字。CPU根据指令从内存中拿取不同的数据,这里让人有点不适应的就是intel 机器放在内存的数据使用大端模式。在这个层次上像C语言这种高级语言的一部分语义就消失了。

因此,之前的疑问就很容易理清楚了。在一个结构体中定义指向这个结构体的指针还这么让人不可理喻吗?不是的,很容易理解。编译器碰到这种定义只需要给这个成员变量4个字节的空间就行了,因为在CPU指令级别上并不包含指针类型这种东西,需要的只是一定大小的占位符。编译器还需要在源文件中检查对这个指针的赋值是不是指向这个结构体的地址。可以这么说,我的这个问题其实就是来源于C语言引入的变量类型系统,当真正弄清楚C语言的类型和真正的CPU指令的关系后,一切就豁然开朗了。

大二的暑假我开始学习C++。C++是一门非常复杂的语言,和C的简洁截然不同。C++对于C语言在编译器级别上做了相当多的改进。当定义一个类的实例时,编译器自动在这里调用这个类的构造函数。对于每个类的成员函数,C++编译器不仅仅修改了函数名,还对函数的参数做了修改,在每个函数参数列表的最后都增加了一个指向自己这个类的指针。C++实现多态的原理就是根据每个函数参数列表类型修改函数名,因此在源代码级别上产生了调用同名函数的错觉。C++还会修改每个类的内存模型,如果类中没有定义虚函数,那么这个类的内存模型将和定义同样成员变量的结构体一致。如果定义了虚函数,那么会在每个类的开头分配4个字节指向虚函数地址的指针。正事由于这个特点,C++就实现了多态和子类的动态绑定。

大三这一年可以说是我在大学收获最多的一年。大三的课程也是最多的,有操作系统,数据库,微机原理,计算机通信和多媒体基础。网络上关于大学计算机专业的课程有多么没用的评论到处都是,这写文章我也看了很多。但是我一直不同意这样的观点,因为学校的课程对我的帮助非常大,特别是大三这一年。

微机原理介绍了各种可编程的芯片,并且使用的是我非常熟悉汇编语言。我那时候开始就对单片机,ARM等嵌入式设备感兴趣。遗憾的是我到现在都还没有实践的经验。计算机通信让我对网络编程有了基本的了解,并且是从下之上一层一层的理解互联网的运作原理。学习了各种协议基本结构和各种网络设备的用途的原理。也许学校里学习的知识不能马上投入使用,但是从长远来看这些才是计算机科学的核心,不管是ASP, JSP,PHP等网络应用层的编程都是在这些基础之上的。

大三的暑假我和一个同学留在学校里没有回家。我们每天中午12点起床去实验室,然后晚上10点回寝室。这样的日子整整持续了两个月,这是我第一次暑假没回温州,这才感受到杭州的夏天是多么的炎热。每天从寝室到学校C区的612,需要半小时左右,到那里已经满头大汗了。而晚上睡觉时候寝室又没有空调,真是惨不忍睹。

但是这个暑假我学到了很多关于Web的知识。在这个数据学习了JAVA,HTML, CSS,JAVASCRIPT等,大大拓展了我的视野。学习了这些使用的技术后才对现实世界中使用的软件,浏览的网站有了更清晰的认识。对它们不再感觉神秘。在初学习C语言的时候,对于windows下面的图形化的软件感觉是可望而不可及的。学习了windows下编程之后才能知道这些界面是如何做出来了,才会对计算机技术有个更深刻的认识。同样学习了浏览器对HTML,CSS,JS是如何解释的之后,才会理解绚丽多彩的网页是怎么产生的。所以我始终认为在平时工作和学习中不能局限于自己熟悉的技术。windows程序开发人员也应该了解一下linux的开发方式。写桌面应用的人员也应该了解一下网络程序的开发。

慢慢我开始对计算机有一些更本质的认识。如今在图形界面下的程序已经不是简单的数据+算法了,应该是数据+算法+显示。其实网络给浏览器传输的是一些文本数据,之所以能向用户展示页面是由于浏览起对HTML标签做了特殊的解释。也就是说屏幕上显示的画面和实际的数据并没有直接联系,只是人们发挥主观能动性,让屏幕上显示的画面和内存中的数据产生联系。就好像一个HTML文件用记事本打开,它就是含有一堆标签的文本,如果用浏览器打开那么就是一张漂亮的页面。这种思想在计算机内部随处可见。计算机只有一种内存,但是内存中却又三种类型的数据:地址,指令和数值。内存存放这三种数据的时候并没有任何区别,都是二进制数据。这三种数据的区别体现在CPU对这些数据的解释。

如今,已经大学毕业了,我在大学期间学习的知识和技能虽然现在能应付工作的需要,但是我并不因此满足。计算机肯定还有更有趣,更深奥的东西需要理解和学习:

关系数据库已经在全是风行了几十年,近期为了解决大型网站可拓展性的需要又出现了NoSQL数据库。

Python为什么这么流行?它有什么优先?动态类型的解释性语言。

函数式语言越来越重要,应该挑一门函数语言来学习。

Linux内核。

嵌入式开发。

GPU编程。

windows 驱动开发。

。。。。

Stay Hungry. Stay Foolish.

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页