【IT168技术文档】
作为程序员现在该考虑一下静态语言和动态语言了.当然GIS程序员也是程序员.看语言排行, 疯狂上升的绿箭头语言,再看看国内外媒体宣传ruby、ROR,jvm,.net增加支持脚本语言、动态语言等等.虽然有媒体炒作之闲,但热闹中也能表现出一些东西来。
国内GIS圈,基本对于语言选择基本没什么冲突,最多也就是j2ee .net 无结果的争论一下,python无病呻吟的露一下面。总之我们GIS程序员该好好修炼内功.
进入正体。
一、定义
通常我们所说的动态语言、静态语言指 动态类型语言(Dynamically Typed Language)和 静态类型语言Statically Typed Language)。
还有一个 Dynamic Programming Language (动态编程语言),静态编程语言。
动态类型语言:在运行期间检查数据的类型的语言。用这类语言编程,不会给变量指定类型,而是在附值时得到数据类型。如:Python和ruby就是典型动态类型语言。很多脚本语言vbscrīpt,javascrīpt也是这类语言。看下面javascrīpt代码:
静态类型语言:相反静态类型语言是在运行前编译时检查类型。在写代码时,没声明一个变量必须指定类型。如:java,c#,c,c++等等。function add(a,b){ return a+b; } add(1,2); add('1',2);
public int add(int a,int b)
{
return a+b;
}
其实比较一下代码,你很快就会发现,其实区分动态静态类型语言从语法上就够了,语言语法格式基本就可确认动静态类型。
而Dynamic Programming Language (动态编程语言)指在程序运行过程中可以改变数据类型的结构,对象的函数,变量可以被修改删除。比如:javascrīpt就是这类语言,ruby, python也属于这类语言。而c++,java不属于这类语言。看javascrīpt代码:
当然静态编程语言 是运行时不可改变结构了。function Person(name){ this.name=name; } Person.prototype.getName=function(){ return this.name; } var person=new Person("okok"); alert(person.getName()); person.getName=function(){return "nono"}; alert(person.getName());
网上有人说 类型检查和改变结构 是静态语言和动态语言两个区别点。基本概念上应该就这些,是我个人理解,不一定完全正确。个人感觉没必要很清晰分门类,掌握优点、特点就好了。这个话题说开根本不是我能说清楚的。总结思考一下。
二,什么事情都不是绝对的
从概念上是一回事,实际操作编码过程中,各种类型语言的优点可以借鉴,模仿实现。
静态类型语言优点是结构非常清晰规范,方便调式,特别适用与新手开发。高校教育一般也从静态类型语言开始。所以静态类型语言特别深入人心,也很好理解。缺点是完成个小功能,可能需要很多的代码,不便于阅读,维护。而动态语言不需要写很多类型安全代码,代码量少,一般设计都比较巧妙,很难读懂,新手很难学习。 两类语言最大的区别是 编辑器的支持。当然很容易为静态类型语言 编写IDE。
其实最重要的是编程技巧,不要盲目的跟从技术,而要从根本上理解新的技术。从优雅性来讲,我很喜欢动态语言,也充满期望。通过对javascrīpt的研究,对ruby的了解,还有对java之流的学习,盼望我的质变过程赶快来临。 [点击图片可在新窗口打开]
下面我试着举几个例子,其实学的东西多了,很多新技术,新概念都是换个名词,再出来炒作的 。
三,关于aop
前几年风风火火的 AOP 技术。
在java中实现,可以使用动态代理接口,或用cglib等增强类,还有用别的如AspectJ自己编译器。在.net中,好像叫属性定制吧。也是些类似的障眼法。如果你回头在看看动态语言中动态改变结构的特性的话, o my god.java,c#中费了半天的牛劲其实就是想实现一个动态语言本来就有的特性呀,真是晕倒。如果还没明白开我下面例子代码:
interface service{ abstract void method(); } class serviceImpl implement service{ public void method(){ System.out.println("hahaha"); } } aop,动态代理后,其实就是类似的代码。(我们这里logging模块为我们切面,我们需要在日志前后加日志) class serviceProxy{ public void method(){ //logging System.out.println("hahaha"); //logging } }