学计算机的有用教程(学计算机必读)
编了这么久的程序,一直想找机会总结下其中的心得和方法,但回想我这段编程道路,又很难说清楚,如果按照我走过的所有路来说,显然是不可能的!当我看完了云风的《游戏之旅--编程感悟》和梁肇新的《编程高手箴言》我突然知道我要从何说起,我要怎么说了!
C/C 学习交流群,欢迎大家一起来交流提升。565122788进群就能获取C语言新手学习大礼包
从接触编程到现在已经至少要6年,,虽然时间短,但我几乎每天都在编,而编程上突飞猛进的还是最近一两年,单纯编程上的进步,很简单就是经验,但你要理解才可以进步的快!这就是说,你的理论课要学好,才能学好编程,操作系统,网络原理,计算机体系结构,数据结构,编译原理,你哪个学的不好,你根本不配成为编程高手,我见过的高手,这些学的都不错!这些都是计算机的支柱,你连它的支柱都不了解,怎么编程,即使你编写的程序好——只有一个原因,你用的是高级语言或脚本语言,因为它们封闭大量低层语言细节,让你不用了解就可以编写,你不了解低层细节你咋成为高手!
学习交流群(565122788)
四。要想成为高手,一定要从底层学起,底层是什么?CPU,汇编等硬件指令!
这个方面我可能要多说一点,其实编程这个概念真是有点广义,做FLASH有FLASH语言,也能编程,做网页有HTML语言和ASP,JSP等也能编程,其实这些都是低级的编程,不用了解底层结构,就可以书写!当然,你也不可能了解这些语言能封状了什么东西,你也不能了解真正出了问题时,该怎么办?举个MFC例子,如果你对MFC的内部结构不了解,对WINDWOS编程不了解,一旦出了问题,很难找到!有时,为了挽救,就要从建工程,从新把编写的模块加载到工程下!虽然你解决了问题,但你没有解决导致你从新编写程序的根本问题!语言就一个,高级语言封状了,内部的太多细节!
现在很多语言有万能类型,其实这是个垃圾类型,高手一般都不会用,只有菜鸟,觉的使用方便才用它!
所以你一定要学习汇编,确切的说硬件指令。你学会了汇编,其他硬件指令都是相通的,如果代码详细到汇编的级别,不可能有问题发现不了,一定可以发现!
学习汇编,你一定要对计算机的体系结构有深刻的了解,具体说CPU和内存构造!现在的CPU都是逻辑运算器和算术运算器和积存器组成,CPU的发展史应该看一看,对你有很大的帮助,你用汇编编程就是用硬件指令,内存和积存器!
对于汇编,你要了解语言的语法,当然所有的指令,我们不一定要记住,用时会查就可以了!如果你能用汇编语言写个递归函数就符合要求了,其他没有什么难的!
编写一个递归函数,要求你会灵活运用各种指令,还要了解函数在内存中究竟是怎么实现的,栈到底是什么东西!我下面举个简单的例子:
数据在内存的分配
最早的计算机数据段和代码段区分的很严格,现在似乎没有这么严格了!对于全局变量和静态变量它的分配完全在数据段分配,知道运行结束才会收回内存!而对于自动变量(包括函数参数和函数中定义的变量)则在堆栈中分配!一般的分配情形是这样的:从栈下到栈顶依次是函数参数,函数结束后下一条指令的地址,寄存器保护,然后是函数中定义的变量!
例如:
void main()
{
int m=3,n=4,s=0;
s=f(m,n);
}
int f(int a,int b)
{
int c=2;
return a b c;
}
我们从s=f(3,4)开始
它的汇编代码大致是这样:
push n
push m
call f
push bp
mov bp sp
push ax //保护寄存器
'
'
'
为c开辟存储空间
计算a b c
弹出c的空间
' //弹出寄存器值
'
'
pop ax
pop bp
ret 8
数据存储栈的示意图
_________
|___c___|<--sp
|___'___|
|___'___|
|___'___|
|__ax___|
|__bp___|<--bp
|IP next|
|___m___|
|___n___|
首先压栈m,n,这个压栈的顺序c和c 是从右到左,而PASCAL则是从左到右,其实哪个顺序是无所谓的
接下来是call f这个是让IP指针指到函数的入口地址,这个入口地址是在连接时候完成的
接下来是把BP压入栈中,这里为什么要把BP值压入,因为函数要使用BP这个寄存器,计算机里的寄存器个数是有限的每个函数都使用,可能造成值的丢失,所以先把BP的值保存起来,以免丢失,在弹栈时,把这个值在放回BP中!后面的AX等寄存器压入栈都是这个原理,一般BP用做栈基指针,用来使用栈中当前函数的变量值这个很方便mov bp sp,SP是栈顶指针,这时BP就指向了BP寄存器压入值的位置BP 4(之所以加4因为整形占4个字节)就指向IP NEXT(函数返回时,IP要接着函数结束的后一条指令执行,这个地方就存储的这条指令地址)BP 8就指向m,BP-20就指向c
函数执行完后要弹栈,按入栈的反方向弹出,然后IP等于IP NEXT的值,ret 8是告诉系统要把m,n也弹出,8是字节数
这个模型是一个简单的函数调用模型,它是你必须要掌握的模型,其他的和它实质上都是一样的c 的函数调用也是这样,只不过在找函数入口时不一样!
汇编和现在一些常用的指令集合
我又开始说汇编了,因为它实在太重要了!你不学好它,你是学不好其他高级语言的,但要学好汇编又要了解计算机的体系结构,计算机的CPU和内存和外设之间的关系,及其它们的构造!现在CPU的寄存器已经达到了64位,算术运算器和逻辑运算器都比以前工作快的多,而且提供专门执行浮点数的各种运算!学汇编是个基础,有时候,你还要联合用MMX和SIMD或FFD等多种CPU指令
很多人学过c,c ,其实它们最后都要被编译器转化成汇编语言的,现在的编译器已经很好了,完全可以转化高效的汇编代码,机器是机器,始终是不会有人做的好的,有时确实学要我们人来手工编写代码!
很多人始终反对这个观点——成为高手一定要学汇编,有人用JAVA,c ,c,挺顺手的!JAVA我先不提,对于c,和c 因为保留了指针,你不学编译原理,你不了解汇编,你能学好这门语言吗?根本就学不好,你用着顺手是顺手,真正讲原因,恐怕你说不出来,如果你是做游戏,做一些需要很高时间和空间效率的程序,c 和c 有时根本就解决不了问题!
现在很多人学JAVA,有几个知道JAVA的从JAVA这样语言从源程序——词法分析——语法分析——语意分析——中间代码——中间代码优化——目标代码——目标代码在虚拟机执行,这一系列的整个过程的,几乎没有,我们现在抛开面向对象对象语言,来说说象JAVA一样支持多线程的面向过程脚本语言(其实JAVA也可以理解为角本语言),因为相对面向对象,和面向过程,唯一不通就是源程序——词法分析——语法分析——语意分析——中间代码这个阶段不一样,往后都是一样的,有了中间代码,有利于跨平台,有利于移植,对不同平台我们只需要编写中间代码——中间代码优化——目标代码——目标代码在虚拟机执行这个部分就可以了!
上面过程,你不了解(精通很难)怎么能学好语言,怎么能说JAVA用的好呢!汇编也是一种中间代码,所有的中间代码几乎都是模仿它的模式来做的!
五。编程需要经验积累,学会调试对你尤其重要!
学好编程那就是编程,编程再编程!我还是那句话,单纯的编程很容易学,调试也是编程的一部分,程序是调试出来的一点也不假,我要讲的是一些常用的调试方法,但这里更多针对c 和c 相关的,用 MS的编译器!
你要想调试,首先要对你用的编译器有充分了解,我现在经常用visual c 6.0 sp5 msdn,这里建议大家用英文版!因为中文版的有时有问题!
经常调试的方法,要针对,具体问题!
这里编译没有通过的程序 我 不说,那是你语法不过关,出了问题,自己仔细看书去!
我大致分了两类,1。能运行的,结果不对,2。根本不能运行!
对于1,有两种可能错误:
a是逻辑错误,你的程序算法就不对。也就是说,你程序从总体框架可能就不对,或者算法根本就是错误的
b是语法你还没有掌握!容易出现这个错误的就是,类型转换!c和c 是强语言类型,有时提供隐式类型转换,float c=3.06f; inta=c;这里的a=3不是3.06,但你有时不知道发生了转换,所以出错了!还有就是指针类型转换,这里建议要学好指针,这些语法问题,一定要过关!
对于这种问题调试方法就是:跟踪程序,逐渐缩小出错的范围 ,最后发现出错点!这里你必须有个良好的习惯,写一点代码就或一个小模块就要验证它的正确性,如果你把写的程序,一堆不知道对错都放在一起,很难调试!
跟踪程序,就是跟踪程序的具体变量值是否正确,用设置段点的方法执行跟踪,发现错误出现在具体哪个模块,然后单步跟踪,visual c 6.0 编译器给了我们很多调试信息,变量变化,栈和寄存器值,函数调用关系,足够我们找出错误!
对于2,很大一部分原因就是指针问题,指针问题,一般都是由于使用者使用不慎造成的,比如访问越界,没有释放了等等把!
这里我教大家一个解决方法,在不设置任何断点时,调式运行程序,编译器,执行到出错地方,马上就会停止,你就能找的出错的地方在那里,但出错的地方不是出错的原因所在,一般能找到是哪个指针有问题(但有时编译器也找不到,这时,你要自己想一下指针在程序流程,逐个分析)你要根据程序的运行流程,观察这个指针,一定就可以发现问题的!
其实基本调试方法也就这些,可能还有很多,具体的都是在这些方法上的操作或演变,其他的经验因人而异!
六。全局把握整个工程,具体到每个类的属性和方法以及各个类的关系!一定确保你设计的类和类模式和类间关系能够有效,利于修改和升级!概括说就是软件工程
对于这个我不想多说,因为我很清楚,这个很难说明白,没有经过项目的训练很难理解,大学里学软件工程,学完了之后基本空白,不知道怎么用,有什么用,说白了,就是把你的系统做的很合理,很简便,很利于升级!对于这些没有严格的标准!这个还是大家在项目中漫漫体会!
长篇大论终于写完了,其实我可能要说的还很多,但作为一篇文章,我主要是把纲写下来,告诉你们怎么做,不再迷茫,做到一个真正程序高手!
作一个优秀的程序员很难,他需要了解太多知识,而知识又不断的更新,你还要不断的学习,你要有这种热情,你要有这种激情,才能把他学好,学通,学懂!
计算机行业每年需要大量的人才,中国高层人才少的要命,给你黄金你都拿不走,你知道为什么吗?所以你要装备你自己的能力,总是抱怨,不如使自己更强!
梁肇新有一句话说的好“雄心的二分之一是耐心,我认为应该是三分之二”,你做事情 要有耐心,有忍耐力,才可以,大学每天吃喝玩乐,不去学,说明你根本没有耐心,所以也很难成就事业
学习交流群(565122788)
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com