作者在 2010-12-31 14:35:52 发布以下内容
我常上网看初学者发帖提问,很多都是类似这样的问题,“我想学编程,我应该如何开始”?我猜想很多人都找过编程的书来看,也能想象大部分人在看到第二十页左右时放弃的情景。因为这些书都没给初学者答案,而是直接了当进入“主题”,让初学者看得一头雾水。我的答案是:要想学编程,应该从“编程”这两个字开始。
程序
“程”就是程序,也就是我们要编的东西,那首先就应该理解程序是什么。
“程”就是程序,也就是我们要编的东西,那首先就应该理解程序是什么。
我问过很多学生什么是程序?从来没有过两个完全相同的答案。
人的角度
程序是做什么用的?想想你最常使用的一些程序。QQ?迅雷?计算器?程序通常用来实现某一特定功能,所以从使用的角度看程序就是模拟和解决现实问题的。这就说明学编程不能只懂编程,你需要对现实问题中的规律和知识有所了解。比如做金融软件你得懂金融常识,做企业管理软件你要懂什么是ERP。举个离你最近的例子,要做个日历的小程序,你总要知道什么是闰年吧。
程序是做什么用的?想想你最常使用的一些程序。QQ?迅雷?计算器?程序通常用来实现某一特定功能,所以从使用的角度看程序就是模拟和解决现实问题的。这就说明学编程不能只懂编程,你需要对现实问题中的规律和知识有所了解。比如做金融软件你得懂金融常识,做企业管理软件你要懂什么是ERP。举个离你最近的例子,要做个日历的小程序,你总要知道什么是闰年吧。
计算机的角度
能够从计算机的角度理解程序更重要,也更复杂。
能够从计算机的角度理解程序更重要,也更复杂。
指令的集合
CPU(中央处理器),计算机的“大脑”,数据运算和处理的中枢,每秒钟可以处理以G为单位数量的指令,听上去很强大,但它仍旧听命于人类。人类发号施令,CPU俯首帖耳。
人类如何命令CPU做事?人类通过编程,给CPU发送的其实是一条一条的指令。
指令也就是命令,它包含两部分——操作码和操作数。“吃饭”,这就是条指令,“吃”就是操作码部分,表示让CPU去做什么。“饭”就是操作数部分,表示完成“吃”这个操作所需要的一些数据。给“吃”这个操作码可以配合“饭”、“菜”、“糖”等许多操作数,形成了不同的结果。目前的主流的CPU所支持的指令的种类(也就是操作码的种类)约几百种,计算机的所有功能都是这几百种指令排列组合的结果,程序就是若干指令的集合。指令的数量庞大,即使很小的程序也需要上百条。
很多人听到这时都会问我“我们怎么编指令呢”?
编程编的不是指令,如果是的话那将很痛苦,几十年前的程序员才那么做。指令是二进制的数据,人类难以记忆和理解,人类通过编程语言编写源代码,由专门的程序翻译成指令。关于这些概念会在后面介绍。
存储器中的数据
前面说过,指令是二进制的数据,它们被放在计算机的存储器当中。
前面说过,指令是二进制的数据,它们被放在计算机的存储器当中。
我们常听的存储器有硬盘和内存,它们有所区别。从存储容量看,一般硬盘大内存小。从存取速度看,硬盘慢内存快,这样的设计是为了是计算机处理速度更快。除此之外,还有一个更重要的区别,关闭计算机后,硬盘上的数据还在,内存中的数据全没。
掌握了这些基本常识之后,请你想想程序存储在哪里。
程序是存储在硬盘上的,当程序运行时会被读入内存中,编程考虑的更多是程序运行时在内存中的问题。
语言
计算机有计算机的语言,人类有人类的语言,编程需要编程的语言。
计算机有计算机的语言,人类有人类的语言,编程需要编程的语言。
机器语言
指令是二进制的数据,是给CPU的命令,也就是计算机能够理解的“语言”,我们称之为机器语言。机器语言是计算机可以直接识别并运行的语言,是二进制的数据。
指令是二进制的数据,是给CPU的命令,也就是计算机能够理解的“语言”,我们称之为机器语言。机器语言是计算机可以直接识别并运行的语言,是二进制的数据。
你有可能不了解什么是二进制,但应该听过十进制。这两个都是数字的表示方法,十进制是我们平时用的方法,它的含义是所有的数由0、1、2、3、4、5、6、7、8、9十个数字来表示,逢十进一,也就是9加1成10,进了一位。二进制就是所有的数由0和1两个数字组成,逢二进一,也就是1加1成10。再次强调,二进制和十进制只是数的不同表示方法,它们之间可以相互转换,转换的规则从很多计算机书和网上都会找到到,并不一定非要了解才能编程。
编程语言
二进制的机器语言并不易于人类理解和记忆,因此人类发明了编程语言,随着技术进步,编程语言越来越多,功能更强大且更易用,你所听过的C、C++、Java、C#、PHP等都是编程语言,它们分别有各自的语法和特点。
初学者也常会问关于应该先学哪种语言的问题,或者问哪种语言好。其实,编程最主要学的是思想,各种语言在思想层面是相通的。用人类的语言举个例子,汉语中有“苹果”,英语中“apple”(英语中的“苹果”),日语中有“りんご”(日语中的“苹果”),如果你在世界上从来没见过苹果这东西,你也就不会想到它,也就不会说出它,也就不会用到上面列出来的任何一个单词。初学者在购买了市面上的很多编程书籍之后,认真阅读努力学习,仍旧不会编程,因为大多数书籍都是编程语言词汇和语法的罗列,并没有教给你如何思考,如何解决问题。再打个比方,编程就好像是写文章,从小学我们就开始学语文,其中学习的语法内容只能保证你写文章是通顺的,无法保证它是精彩的,精彩的文章需要思想内涵。所以在我的教学过程当中,都是尽量传递编程的思想,语法只是起到支撑的作用。
编程的语言也没有优劣之分,要具体问题具体分析。你要去法国,最佳的当然是学法语,要去日本,学习俄语不会有什么用处。编程也需要你根据你现实问题来决定选择哪种语言。
运行程序
编程语言是如何变成机器语言并运行的?
编程语言是如何变成机器语言并运行的?
编译
现在有两种语言了,编程语言和机器语言,它们互不相同。如果让你去立刻读本法文书,你会怎么做?是的,找个翻译应该是最佳的选择。编程语言需要被翻译成机器语言,这个翻译的过程被称作编译。负责编译的不是人,它也是一种程序,我们称之为编译器。严格的说,编译器的作用就是就是把编程语言编译成目标语言,目标语言可能是机器语言,也可能是某种中间语言,下面马上我们会解释。
现在有两种语言了,编程语言和机器语言,它们互不相同。如果让你去立刻读本法文书,你会怎么做?是的,找个翻译应该是最佳的选择。编程语言需要被翻译成机器语言,这个翻译的过程被称作编译。负责编译的不是人,它也是一种程序,我们称之为编译器。严格的说,编译器的作用就是就是把编程语言编译成目标语言,目标语言可能是机器语言,也可能是某种中间语言,下面马上我们会解释。
解释
程序的运行方式有三种。编译运行、解释运行、编译解释运行。
程序的运行方式有三种。编译运行、解释运行、编译解释运行。
还是用看法文书的例子来说。要看法文书,你需要找翻译。翻译帮你可能有这么几种方式。
编译运行
一种是翻译把整本书都翻译并写成中文,然后给你读,这种就好像编程语言经编译器编译成机器语言直接被计算机运行,称作编译运行。
一种是翻译把整本书都翻译并写成中文,然后给你读,这种就好像编程语言经编译器编译成机器语言直接被计算机运行,称作编译运行。
解释运行
另一种是你读一句,翻译给你解释一句,这种方式就是解释执行,用来解释的程序叫做解释器。显然,从速度来讲肯定是编译运行的方式更快,但灵活性是解释运行的方式高,因为很多的改变都可以在运行的过程当中做,而已经被编译好的程序可改变的空间很小了。C 、C++两种语言编写的程序都是编译运行的。PHP等脚本语言(关于脚本语言的概念超出本书范围,请通过网络搜索)的程序都是解释运行的。
另一种是你读一句,翻译给你解释一句,这种方式就是解释执行,用来解释的程序叫做解释器。显然,从速度来讲肯定是编译运行的方式更快,但灵活性是解释运行的方式高,因为很多的改变都可以在运行的过程当中做,而已经被编译好的程序可改变的空间很小了。C 、C++两种语言编写的程序都是编译运行的。PHP等脚本语言(关于脚本语言的概念超出本书范围,请通过网络搜索)的程序都是解释运行的。
编译解释运行
人们为了得到接近编译运行方式的速度和解释运行方式的灵活性,采取了先将编程语言编译成中间语言,这种中间语言比编程语言更容易被解释,之后再进行解释运行,我们称这种方式为编译解释运行。Java和C#语言就是采用编译解释运行的方式。
人们为了得到接近编译运行方式的速度和解释运行方式的灵活性,采取了先将编程语言编译成中间语言,这种中间语言比编程语言更容易被解释,之后再进行解释运行,我们称这种方式为编译解释运行。Java和C#语言就是采用编译解释运行的方式。
明白了这些,当网上再次讨论C++和Java哪个好的时候,你可以辩证的告诉他们了。
编程工具
要编程,我需要装什么软件?
要编程,我需要装什么软件?
编译器
编译器在前面已经介绍过,它是用来把编程语言翻译成目标语言的程序,使用某种编程语言编程,你一定需要下载安装该语言的编译器。
编译器在前面已经介绍过,它是用来把编程语言翻译成目标语言的程序,使用某种编程语言编程,你一定需要下载安装该语言的编译器。
实际上,对于你来讲,编译器还有一个更重要的作用,这个作用将伴随你整个程序员生涯。
语法错误
编译器负责检查你编程时的语法错误,并告诉你错误的位置和原因。语法错误是不可避免的,我的意思是说,即使比尔盖茨来,让他编哪怕一百行代码,他也无法保证不出语法错误。一个现在在软件公司工作的程序员每天都要犯很多次语法错误,因为人难免疏忽犯错,而编程又是相对教条死板的,编译器不会放过任何一个它认为是错误的地方,哪怕只是少了标点符号。
编译器负责检查你编程时的语法错误,并告诉你错误的位置和原因。语法错误是不可避免的,我的意思是说,即使比尔盖茨来,让他编哪怕一百行代码,他也无法保证不出语法错误。一个现在在软件公司工作的程序员每天都要犯很多次语法错误,因为人难免疏忽犯错,而编程又是相对教条死板的,编译器不会放过任何一个它认为是错误的地方,哪怕只是少了标点符号。
初学者对语法错误很头痛,因为不熟悉,经常会出现一个错误卡住几个小时时间的情况。但是,随着你编程经验的逐渐丰富,语法错误虽然仍无法避免,但是你可以很快的解决了。
对于语法错误,没有思想可言,只有一种方法克服它——在大量的练习中逐渐积累经验。你需要从你第一天开始编程做起,认真的记录下你每次犯的错误,记住编译器提示的信息和你解决的方法,一定时间后你就会发现,语法错误也就是有限数量的几种,不会在成为你编程的主要障碍。
这里还要提示一点,编译器毕竟是过程序,并不聪明,它所提示的错误位置和原因并不一定总是正确,往往一下子出现上百个错误,但实际上你至少少写了一个标点,这也许要靠你的编程经验来判断。至于为什么会这样,如果你想了解,请参考编译原理方面的书籍。
调试器
语法错误只是让初学者很头痛,但其实还有一类错误,无论对新手还是老手都是灾难,这就是程序运行中的错误。
语法错误只是让初学者很头痛,但其实还有一类错误,无论对新手还是老手都是灾难,这就是程序运行中的错误。
运行错误
编译器在把编程语言编译成目标语言时进行语法检查,如果有错误就不会产生目标语言,所以编译错误都是在编程阶段产生的。运行错误是编译结束,直接运行或解释运行程序时发生的错误,这种错误不易捕捉,一旦是一个发布的程序,那错误只有靠升级程序或打补丁才能避免。
编译器在把编程语言编译成目标语言时进行语法检查,如果有错误就不会产生目标语言,所以编译错误都是在编程阶段产生的。运行错误是编译结束,直接运行或解释运行程序时发生的错误,这种错误不易捕捉,一旦是一个发布的程序,那错误只有靠升级程序或打补丁才能避免。
在编程阶段,运行错误必须靠一种被称作调试器的程序来捕捉。调试器能够监控程序运行时内存中数据的变化,并通过可视化的方式呈现给程序员,程序员通过检查内存中的数据来判断错误的原因和位置。
调试器也是你必须掌握使用的工具,但对于初学阶段,它的作用并不大,因此你可以暂时忘掉它。
解释器
解释器的作用前面已经介绍了,这里只再多提示一句,一种解释执行的程序,程序和解释器一般是在同一个进程中的,换句话说先运行的是解释器,程序是在解释器之上运行的。关于进程的详细概念请参考有关操作系统的书籍。
解释器的作用前面已经介绍了,这里只再多提示一句,一种解释执行的程序,程序和解释器一般是在同一个进程中的,换句话说先运行的是解释器,程序是在解释器之上运行的。关于进程的详细概念请参考有关操作系统的书籍。
编辑器
程序员大部分时间做的事情是向计算机中录入源代码,源代码其实就是普通的文本文件,所以编写源代码时并不一定需要特殊的工具,Windows下的写字板、记事本、Word都可以用。
程序员大部分时间做的事情是向计算机中录入源代码,源代码其实就是普通的文本文件,所以编写源代码时并不一定需要特殊的工具,Windows下的写字板、记事本、Word都可以用。
集成开发环境
现在要开始编程,你需要一个编辑器、一个编译器、一个调试器,如果是编写解释执行的程序你还需要一个解释器,麻烦,而且它们之间没有联系。人们要开发出了另一类软件——集成开发环境,英文缩写是IDE,顾名思义,集成开发环境把编程需要的很多功能都集于一身,用来方便程序员工作。著名的集成开发环境有Visual C++、Visual Studio.NET、Eclipse、Netbeans等,其中VC常被很多初学者误认为是一种编程语言。
现在要开始编程,你需要一个编辑器、一个编译器、一个调试器,如果是编写解释执行的程序你还需要一个解释器,麻烦,而且它们之间没有联系。人们要开发出了另一类软件——集成开发环境,英文缩写是IDE,顾名思义,集成开发环境把编程需要的很多功能都集于一身,用来方便程序员工作。著名的集成开发环境有Visual C++、Visual Studio.NET、Eclipse、Netbeans等,其中VC常被很多初学者误认为是一种编程语言。
当你确定了你要使用的编程语言时,安装一个集成开发环境就可以比较舒服的编程了,很多编程书都不赞成初学者使用,因为这需要初学者花一部分精力在学习集成开发环境的使用上,而忽视了编程语法已经思想,我觉得这不是必然。好了,去找一个IDE安装吧。
1、编程初学者,要学好面向对象编程思想
2、数据结构与算法——编程思想的核心,学生的噩梦
3、初学编程,你必须深刻理解的几个词
4、答“大学生学习程序设计问题”
5、编程基础,你必须深刻理解的概念