关于编程语言

上一篇 / 下一篇  2012-08-06 00:10:42 / 个人分类:编程语言

经常被人问,为什么你不学这个语言?为什么你们要采用这个语言而不用那个语言?哪个语言最好?我应该学哪门语言呢?看看自己这几年编程之路一些心得。

其实26个字母,每一个字母背后至少有一门语言?为什么会这么多种编程语言呢?因为没有一门语言是万能的。编程语言也是不断向前演化的。随着人们对计算机需求的发展而不断向前发展,没有最好,只有更好。

每一门语言都它自己特有的应用环境。但是编程语言也有共性:所有的语言都会由这些基本元素组成:变量,循环,分析,顺序,函数。以及常规数学运算以及逻辑支算。如果说你的需求是这种大众化的。任何一门语言都能满足你。如倮你的需求不是这么的简单是特定领域的。:就找到在这方面应用比较广泛的语言。例如你的应用环境是办公软件(msoffice)学习办公软件支持的脚本语言VBA,以及相关的API.是最好的选择。如果你要文本处理,并且需求简单,常用的shell语言都能实现,复杂的用perl,tcl来处理。对速度有要求用java,C++还处理。如果是做嵌入式那么C语言是更好的选择。同时也要看你的应用环境支持哪些语言。对于是同一系列的语言,后出来的语言会之前的语言要强大一些,并且易用性会好一些。如果没有特殊的需求,只是为了学语言而学,那就学习C/C++或者scheme,python吧,因为这两种语言计算模型是不一样的,学会这种两种计算模型,对于你学习其他语言都会有莫大的帮助。

根据个人编程经验分三个方面的总结希望对大家有帮助:

编程语言的组成,

语言学习发展曲线,分三个阶段吧,

以及自己这几年用过的编程语言一些体会吧。

(一)        编程语言的组成

变量:

从编码的脚度变量本质就是替换,一般变量赋值就是一次替换,指针类型变量的赋值是二次替换,动态语言经常会用到三次替换。但是大部分情况下,用不到三次以上替换,这也就是什么一般编程语言对二次以下替换支持很好。三次以上替换需要靠自己去实现了。(3这个数字是特殊的,俗话事不过三,这个是有原因的,根据一般人的思维能力的来的,就拿最简单的yes/no的逻辑判断来说,连续三次,就是八种情况,但是一般人思维能力同时关注最多九种情况,再多了人的思维就会混乱容易出错了,这也就是为什么,一般人下栱只看二三步的原因,很公司的编码规范会要求禁用或者少用三层以上if else/ for嵌套。并且学编程最头疼的内存管理也是三层管理,这样的例子到处都是不多举了)。

从物理的存储角度看:变量又为简单标量,复杂变量列表,哈希。再复杂一些树,栈,表等数据结构。一般的编程语言都对简单标量,复杂点的列表,哈希支持的很好。对于标量来说,常见的应用就是字符串的处理,与数值变量各种数学逻辑运算的。而对于树,栈,表都复杂的数据结构都自己去实现。并且数据量再大一些数据结构就需要专门的工具数据库来管理了。

 

流控与表达式:

程序代码的本质是思维与知识的固化。所以程序的结构是根据人的思维习惯来的。三种最基本结构:顺序,条件分支,循环。就拿人走路来说吧,人沿着路一直走到下,这就是顺序结构,走到一个交叉路口,要选择走哪条路,这个选择的过程就是条件分支。选好了路继续走前走,来到一个大山的脚下,然后顺着盘山公路,一圈一圈的往上走,这就是循环。每一种编程语言都对三种基本结构最具有很好的支持。但是每个领域都除了这些基本处理逻辑外,都会自己特殊的处理逻辑。人们对这些处理逻辑进行抽象建模,然后再根据模型,开发出来的相应的语言。例如perl对文本处理的优化,为了测试集成电路而开发出来tcl语言,针对集成电路中时序与状态转换处理逻辑,对于定时器与事件驱动的状态转换机制提供了很好的支持。数据库对大规模数据的集合运算,以及并发操作,原子操作都提供了很好的支持。Matlab对于大型数值计算支持与优化。以及coroutine机制支持的erlangGO语言。当然随着技术发展,每门编程语言应用范围越来越广,同时随着人们的计算需求的发展,还会更多的语言被开发来应对这些新需求。

 

代码块的复用:

每一种语言都会提供代码复用的机制,邮最初的汇编语言的那些中断函数开始。到C语言等等函数的功能,以到C++,java等面向对象的机制。都是为了解决代码的复用性与易读性问题。我们编程与在框架设计的时候原则,对于功能比较小公用模块,例如一个计算公式就可以函数来实现。但是公用模块的复杂度提高,利用面向对象类的机制,对其实现比较适合。对于更加复杂的共用模块,但又不适合用函数与类实现,可以考虑用模板来实现,例如你会发现IDE工具生成各种各样样版代码,这就要元编程,你可以用lex/yacc来实现,可以利用scheme来实现。为了进一步提高提高代码灵活性,把数据与函数是不区分了,也就产生了函数式编程。对于代码动态调用:尤其是脚本语言,是灵活复用性,采用动态生成代码,直接运行。对于整个过程自动化,很有帮助,例如每一个脚本语言都会一个eval指令。基于不同的计算模型,编码的方式也是不一样的。

 

(二)        语言学习发展曲线的三个阶段

阶段一,厚积薄发

写代码,就像写小说,要想写好小说,不读个百八十本小说,肯定也是写不出来的。写软件也是一样,不去研读几个一些经典软件代码,想学好软件开发是不可能的。通过读别人的优秀的代码来学习编程是直接高效的。现在优秀开源代码多的是,你可以根据自己的能力与兴趣来研究那些源码小说,首先是运行一下,看看它长什么样,了解其运行原理,然后再理解其软件架构,好的开源代码,都会相关的文档来讲述其架构呢。有问题去找度娘与谷姐。同时手边放本编程语言的书籍,开始你的代码阅读之旅。根据个人经历,如果对你操作系统比较感兴趣,可以去linux内核与minix内核源码(个人感觉minux是会更具启发性)。如果你对网站比较兴趣,去读一个wiki的源码去看看吧。如果没有特别感觉兴趣的,那就去读coreutils吧,这里面包含操作系统最基本的cd,ls,sort,catfind,grep之类的源码。了解这些最常用命令的实现原理,对你使用这些命令会更加得心应手,并且在开发大的系统的时候,都会需要这些需要这些常用的功能。你可以容易把这些功能移值进来。

这样的学习好处,在学会了一门编程语言的同时也学习一种构架设计与一个好代码风格。通过研究这些经典代码,对你自己编程技巧也会有很大的提高。你会熟悉常用的一些算法,以及经典设计模式。以后遇到复杂的算法,也知道如何把它拆分几个子算法用这些常用算法来实现。此外也能通过此对一个软件熟练精通,知其然,且其所以然。可以说是一举多得。

 

阶段二:提高效率

到时候,就会感觉只要给时间与精力,老子什么都能实现,但是现实往往是没有那么多时间与经历,慢慢你会感觉到效率的重要性。并且开始修炼自己的效率。

文本处理处理的能力你与计算机交互大部分都是通过文本与编辑器来实现的。所以文本处理效率高低,直接决定了你工作效率。如何实现批量处理呢。对于文本处理,核心的技术就是正则式,并正则式是在编程武器排行老大:长生剑。对于正则式,光知道是不行的,必须熟练才行,熟才能生巧,才能出效率。所以熟练使用一种支持正则式的编辑器。两大编辑器中的神器,vimemacs.两者都对正则式具有完美的支持。至于选择两个根据自己偏好(本人在纠结了一年后,最终选择了vim.对工具本身也达到能做二次开发,例如写个语法文件呢,随时写些小的插件,来尽可能使一些重复文本编辑工作自动化。

数据处理能力两组数据的集合集合运算.最常用的交并补。别小看这些东西,经常见一些在分析log,定位问题的时候,人为了找到两组数据差异,就纯粹用两眼一行行对比的。心里在想如果两种数据在数据库里,可以用数据库多方便了。其实那些常用的交并补运算,完全可以用sort,uniq,diff,再加上正则式做一些格式化来实现。三两行就完成了,要比你用眼一行一行对比,快千倍了。同时也要熟练一些小型数据库技术,例如sqlite(因为如果用mysql,postgres用于临时分析用的话overhead太高),因为在定位问题时候,数据量比较大的情况下,你可以用正则式把原数据进行格式化处理,导到sqlite中,利用sql来进行分析。

Debug能力代码不是写出来的,而是调出来的,调试快慢基本上决定写代码的速度。你如果达不到下面Debug合格水平,就要好好修炼了。标准如下:

1.      批量给添加断点:例如在所有ABC开头的函数前面添加一个断点。

2.      自动检测常个变量或命令的状态变动,并保存相应的log,(对于一些复杂的,sometimes ,不容易重现的问题,log是对于定位问题是关重要的)。而不是靠人眼去盯着。

3.      半自动化调试,在定位关键问题的前期一些步骤是不是能够自动化,执行到关键自动停下来。

Template与元编程:走到遇到大的一些软件功能,有些功能具有通用性,但是有点复杂又很难抽象成函数或类。这时候就要用template与样板代码。例如对于共性比较大,IDE开发环境,会自动为你生成代码模板。但是对通用性还没有达到你让IDE开发工具提供商帮助实现这些模板代码。但是这些功能对于你说,很通用,经常遇到。特别生成配置文件的时候。这个时候,template与元编程就很有用了。如果功能只需要一个静态的template,那么一般template技术就好可以搞定了(建议去研究一下,perl toolkit template库)。如果需要动态的template就用到元编程了(这个建议去研究一下,scheme语言,它做这个比较擅长)。

在这个阶段你要经常到开源社会区去转一转,加入一些邮件组,看看有什么时最新的发展,例如我个加入vimfowiki,graphviz的邮件组。定期去sourceforge上去看看当前有什么新的软件与技术出现。

阶段三:创造自己的语言

等你走过了第二个阶段,你的手指在键盘键指如飞,能做到指随心动。走到这个时候会感觉效率进一步提升遇到瓶颈了,并且慢慢发现原来编程语言以及工具的一些不足了。会有一种改进这门语言,甚至是重新造一门语言的冲动了。

到了这个时候,你已经对一个领域有了深入透彻的认识。你还需要学习巴斯特范式,编译原理以及lex/yacc做一些词法/语法分析,内存数据库(在构建符号表的时候会用到)。经常用google学术看看最新论文找一些启发与灵感。等这些东西准备好了,就可以对这个领域抽象建模了,基于模型去创建一门小的DSL语言。并为之开发出相应debug工具等。并在实践的应用中不断完善它。再往后如何走,本人也还在探索。目前还是止步于此。

(三)        自己这几年用过的编程语言一些体会

C语言,最经典的高级编译型语言言之一,性能是脚本语言所无法企及的(只有手工调优的汇编程序的性能才能超过它)。操作系统和设备驱动程序以及嵌入式系统中只能使用编译代码来高效地实现。实际上,当软件和硬件需要进行无缝地连接操作时,程序员本能地就会选择C编译器:灵活的指针应用并且可以直接操作内存,距离原始金属材料非常近” ——即可以操作硬件的很多特性——并且C的表现力非常强大,可以提供高级编程结构,例如结构、循环、命名变量和作用域。虽然目前随着嵌入式性能的提升也开始对C++,java的支持。但是支持最好的还是C.在这方面你会找到大量的C库来供你使用而避免你重复造轮子的工作。

 

java语言可以一次编写可以到处运行,如果你的应用环境需要跨平台的,可能你的java是你最好的选择。并且在金融行业,以及ERP软件,以及互联网行业对java的应用库多一些。不过本人只是学生时代学过,没有项目应用经验就不做评论。

 

C#语言是与面向对象,与java相抗行一门语言,这门语言的产生根源于商业竞争。如果你是windows平台的应用程序,C#C#.net就是一个巨无霸。可以在windows平台做任何事情。

 

perl文本处理之王由于本人擅长文本处理。对于perl的了解深入一些。那就谈个人愚见了。

1.        对正则式的完善支持。对于文本处理,正则表达式是核心。一般语言正则表达式只能硬编码或者对动态生成正则式支持很弱,而perl的正则式是完全可以动态生成。这对于复杂的文本处理极其有用。

2.        .对于perl的诡异符号的解读。每一个诡异符号的背后都是一对常见问题抽象。当你学会一个诡异符号,你就可以简单用一行命令来解决这一类抽象的问题。由于perl自身历史较长,一些常用符号已经常用功能给占用了。所以才看到这诡异符号。当你解决问题时,遇到perl的这些诡异符号,这说明你的遇到问题,已经被历史上的大牛们给完美解决了,简化为几个符号了,而你不必要重复造轮子了。而在别的编程语言中你可能为这个功能再写一坨代码。所以爱上这些诡异符号吧,当然有人会说代码不易读,其实perlpod文档,让你他随时随地写文档来说明它。

3.        对于报表格式的支持。如果报表与图表话,你使用perl format指令就知道会有多方便.对于更复杂一些paper工作,例如一些user manual的编写排版。perltemplate toolkit模板系统,让你消除排版与多种格式(html,pdf,xml)输出问题。

4.        pod文档系统。大家经常代码没有注释,不易读。另外在编程语言中对没有什么排版支持。那么你来看看perl中,perl语法的灵活性再加上pod文档系统。让你感觉不是在写代码,而是在写文档。把代码嵌在文档中,而不是注释写在代码中。编程界一个倾象文学化编码。可能对它是天生的支持吧。把代码嵌在文章中。并且将来生成多种格式(html,txt,pdf).

5.         web编程。perl是最早用于web编程语言之一。如果你对perlweb编程还是停留在CGI编程,就像你对C语言的认识只是能写hello Word!阶段。perl Catalyst框架,就像MFC之于VC. AWP可以轻松实现web client端编程。

6.         CPAN,windows编程之所以强大是因为有MSDN库。而CPAN就是perl"MSDN".

 

tcl/tk自己的工作语言。工业自动化的标准.以及Expect对于命令行交互的终极武器。

1.      交互式协作,特别是关于时序与状态的编程是天生的支持。因为tcl/tk发明它的目的就是为了测试电路的。

2.      所有的事物可以重新定义和重载,所有的数据类型都可以看作字符串。

3.      可以容易嵌入其他语言中,在大型系统中作为二次开发的脚本语言。

4.      通用SWIG很容易用C/C+

5.      tcl扩展Expect利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在图形用户界面中。

 

Scheme语言 作为元编程中主力语言,本身是一种函数式范型语言。Emacs扩展脚本语言,(schemeLisp主要方言之一)。DocBook的样式表DSSSL语言。

 

Lex/yacc  如果想自己实现一门小的语言,那么就来研究lex/yacc吧。也许你会奇怪linux下面的小语言为什么那么多,awk,sed都有自己的语言,就连bc这个小算器都有自己的语言。是不是感觉老外实现一门语言就像家常便饭一样,而对于国人,操作系统还有人敢说自己动手做,但是对动手实现一门语言,还是就充满了神秘与敬畏。其实设计一门语言也没有那么难。如果你想打破这个设计语言这个神秘的面纱,就来看看lex/yacc吧。如果实现多语言的翻译与转换,也可以参考一下antlr.


python, 最近开始使用做代替matlab做一些计算,由于是比较新的语言,集成了之前的语言的各种优点,并且再接近人的自然语言。并且有google这样的大公司的支持。前途不可限量。


TAG: 文本处理 Perl perl scheme 编程语言

 

评分:0

我来说两句

日历

« 2024-04-15  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 11612
  • 日志数: 11
  • 建立时间: 2012-04-18
  • 更新时间: 2012-08-06

RSS订阅

Open Toolbar