# 按语法分类

  • C族静态语言
C
C++
Java
C#
D
  • 非C族静态语言
VB
Delphi
  • 动态语言
Perl
PHP
Python
Rudy
JavaScript

# 按应用分类

  • 语言的层次

  • 系统语言

—— 权力的双刃剑

    • 特征
主要为底层系统的开发服务
与机器进行交互
在系统运行效率和生成开发效率上,系统语言更看重前者
    • 理念
优化机器的时间而不是人的时间,优化机器的记忆而不是人的记忆
假设编译器是愚蠢的而程序员是聪明的,因此赋予程序员更多的权力、义务和责任
    • C
纯过程式编程语言

优点 
简洁实用,灵活高效

缺点
过于宽松的类型检查
容易出错的内存管理
相对贫乏的语言特征

发展
可以借鉴C++ 的命名空间、重载、异常处理 和 STL等非OOP特性
    • C++
      • 发展背景
在过程式基础上引入了对象式和泛型式,又保留了C的高效和底层开发能力
C++一个重要的成功的原因是对C的兼容,吸引了大批的C程序员,但这是有代价的,兼容也同时保留了C的许多缺陷
      • 特点
由于C++对C的改革不彻底,又过于庞杂,并且效率不如C,这使得C仍有其存在空间
提供了一马平川的大路,也提供了陷阱密布的小道
      • 诟病&背景

语法过于复杂,学习曲线陡,开发效率低

一种语言不够复杂是因为其还不够成熟
C++语言复杂度确实高于其他语言,当并非高不可攀

开发效率低,主要在于两个方面
标准库不够完善  C++只依靠效率低下的标准委员会来维护,没有大公司的鼎力支持
手工回收垃圾 
C++程序员也可以不用手工垃圾回收,更好的办法是遵循RAII惯用法(idom),通过智能指针来解决内存释放问题

RAII
Recourse Acquisition Is Initialization 直译 “资源获取即初始化” 
更准确的叫法是RRIF(Recourse Release Is Finalization)资源释放即终结化
将资源的释放与某一对象的生命周期绑定,初始化对象时获取资源,终结化对象时释放资源
用户代码不直接管理资源,只需控制相应的对象即可。
这样代码可以简化,资源有效性也得以保障,并且还是异常安全的(exception-safe)

支持范式过多

程序员过于自由,代码不标准难维护,这就好比责怪餐馆提供的菜式过多一致难以摆出一桌酒席一样可笑

OOP不彻底

试图把一切装进OOP的箱子里的想法无异于削足适履

如Java的Math类压根儿就不存在Math对象,清一色的static和常量
C++ 只要在math 的namespace中定义一些自由函数即可,自然而简洁
Java 在J2SE 5.0引入了静态导入,C#也在2.0增加了静态类,不仅在形式上简化了代码,也在思维上容忍了非OOP的过程式

反射功能不足

因为追求效率,不在元数据上花费时间和空间

支持指针操作导致安全隐患

指针是C和C++的特色,其它语言要么不支持,要么支持有限
C和C++ 可以说成也指针 败也指针,用的好可以是削铁如泥的神兵利器,用的不好就是自我毁灭的罪恶深渊
但C和C++定位于系统语言,所以指针是必不可少的,同样二者的数据类型转换比其它静态型语言更自由也是源自于此

能力越大 责任越大 风险越大

没有垃圾回收,容易导致内存泄漏

自动垃圾回收机制由于其不定时性也不是完全不会发生内存泄漏的
自动垃圾回收机制带来时间和空间上的性能损耗,有可能会影响C++所肩负的底层开发任务

没有线程支持

没有丰富的标准库支持图形界面、网络编程等

    • D
      • 发展
虽然天生丽质,苦无豪门青睐,只好一直待字闺中
      • 对C++的改进
可控的垃圾回收
支持线程同步
支持动态数组
支持嵌套函数
支持契约式设计
废除C++令人头痛的头文件
    • 总结

硬件的发展,对效率的追求为什么还有必要

纵向看,用户的耐心和电脑的性能成反比(电脑性能的发展促使用户的耐心变得更低)
横向看,占用资源过多,运行相对缓慢的软件竞争力低
在一些应用领域如人工智能、大型计算方面,普通电脑的性能还远远不能满足需求,超级计算机的存在就是一个很好的证明
仍然有些程序跑着资源有限的机器上,如嵌入式系统
  • 后台语言
为前台提供服务的同时,又需要底层系统服务的支持

平台语言和后台脚本语言的划分是基于程序和脚本、静态和动态来分的
实际上后台脚本语言也都有自己的虚拟机,从这点上看他们也可以作为平台语言
实际应用中,它们的虚拟机没有Java平台、.NET平台那种整合凝聚力核心作用,
通常作为轻量级的解决方案
    • 平台语言

—— 先搭台后唱戏

      • Java
        • 背景
继承了C++的有点,又克服了C++的复杂性,虽然底层开发效率有所减弱,但具备平台无关性
Java 成功的一个不容忽视的因素是它完全脱离了与C兼容的桎梏

Java对C++改进的原则:
让语言变得简单具有亲和力
降低程序员门槛
提升生产效率
        • 目的
让一种语言在多平台上运行
注重语言,让语言向平台扩散(Sun公司的状况决定的)
        • 特点
在大路上铺设水泥,同时封锁了捷径小道
运行于以JVM 为核心的Java平台
        • 优点
自动垃圾回收

但是也存在缺陷
一个Java程序如果在一段时间内极耗内存,由于自动垃圾回收的不定时性,可能会抛出OutOfMemoryError
Java程序一样会发生内存泄漏,甚至于几率比C++更大,C++程序员对此更有戒心,Java程序员大多被惯坏了,环保意识要单薄
        • 对C#的借鉴
增加版的for循环
可变长参数(varargs)
自动装箱(autoboxing)
类型安全的枚举(typesafe enum)
支持元数据的注释(annotation)和C#的特性(attribute)大同小异
C#从Delphi引入的属性(property)也出现在Java 7的提案中
      • C#
        • 背景
兼具了C++和Java各自的优点,但效率不如C++,跨平台不如Java
        • 目的
让多种语言在一种平台上运行
注重平台,让平台凝聚语言(微软公司的状况决定的)
        • 特点
填平了大道上的坑坑洼洼,但把一些小道上的“此路不通”的牌子换成了“此路危险”
运行于以CLR(Common Language Runtime)为核心的.NET平台
可以这么说,C# 看起来像C++,用起来更像Java
        • 对Java的借鉴,对C++的改进
更加安全——禁用或限用指针;检查字符串和数组的边界;增加类型安全;禁用未初始化变量;增加对资源的安全管理
更加简单——自动垃圾回收;废除头文件和宏;支持接口;废除多继承和非公开继承;摒弃C++中一些难用、生僻的语法
更加中性——编译成机器无关的中间码;运行于统一平台
更加OO——不支持全局变量和自由函数;所有的类都可以上溯到Object类;对象一般通过new分配在堆上
更加标准——更好的支持unicode;支持注释性文档;类和方法可以被废弃(deprecated)
        • 对C++特性的保留(大多是明智之举)
除支持引用类型外也支持值类型
除了按值传递,也支持引用传递
支持操作符重载(operator overloading)
在一定条件下保留指针和指针运算
访问权限默认是私有
将关键字extends 和implements 统一为 :
支持预处理指令
C# 4.0还将引入可选参数
        • 创新之举
Visual J++中的委托(delegate) 和相关的事件
第一个支持组件导向(Component-Oriented)的C族语言
支持索引器(Indexer)、版本控制(versioning)、XML注释、特色指令如#region、特色关键字如checked yield等
引入了查询句法(query syntax)、匿名类型(anonymous type)、扩展方法(extend method)等新特征
对函数式编程支持力度不断加大,1.0的delegate可以座位头等函数(first-class function),
2.0的匿名delegate可以作为闭包,3.0引入了Lambda表达式,几乎可以号称是函数式编程语言了
至C# 4.0逐步向动态语言靠拢,将引入关键字dynamic支持动态类型和动态操作
      • 共同特性
编译成机器无关的托管码(Managed Code)或称为字节码(bytecode),运行于虚拟机上

禁用或限制使用支持,支持垃圾回收机制
一开始是存在争议的,但随着机器性能的提升和软件规模的扩大,对软件的健壮性、安全性和生产率的要求超过了对运行效率的要求,逐渐得到认可
尽管如此,对于指针运算和手动内存管理对于系统软件和在性能、实时性方面的要求极高的软件还是必不可少的,
所以C#允许标有修饰符的unsafe代码包含指针操作
      • 发展
如今的 Java和C#都不再简单,以前人们试图在语言的威力和生产率寻找平衡点,但现在更像是鱼与熊掌都想兼得
编程语言是技术和商业合理推动的结果
    • 后台脚本语言

—— 敏捷的开发利器

理论上动态语言同样能承担大型应用,但实践上它们大多作为粘合语言或用于中小型应用,暂时还是主流的配角或非主流的主角

在运行效率、类型安全、可用资源、开发工具、技术支持方面与Java、C#有一定的差距
它们属于“草根”,虽然有开源社区的强大支持,但影响力上和Java、C#还是有差距的
动态语言有可能在将来成为一直也素未可知,但语言的发展趋势 一定是 动静结合 刚柔并济
      • 应用
最活跃的舞台当时LAMP
开发灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等特色与Java平台、.Net平台鼎足三分,尤其受到中小企业欢迎
      • Perl
        • 特点
凝练晦涩

博采众家之长,综合了C语言的结构、sed的正则表达式、awk的关联数组、Lisp的表(List)和Unix Shell 的命令

另外还有不少C++的影子,5.0之后开始引入对象模型,不过是典型的半路出家,远不如前面那些特征自然,
与其说是一种自然而然的发展,不如说是OOP潮流裹挟下的一种身不由己的迎合

真正深入骨髓的借鉴是自然语言
发明者Larry Wall是一名语言学家,他认为程序语言应该和自然语言一样简洁自然,易读易写,表达多样,不拘一格
Perl语言有不少的格言和哲学,是的编程语言一改严谨刻板的面孔,散发出浓郁的人文气息

极强的粘合能力,被称为“Internet 上的胶带(duct tape)”,又被称为瑞士军刀,精炼而复杂,实用而强大
        • 哲学
做一件事可以有多种方法
喜欢隐性暗示
强调紧凑
语法和语义丰富
        • 劣势
过于灵活自由,缺乏规范,影响了程序的可读性、一致性、整洁性和可维护性
        • 应用
最初应用于Unix系统管理
后来广泛应用于CGI
      • Python
        • 特点
优雅明晰
天然的OO设计和丰富的类库
对程序员的友好度大大超过Perl
        • 禅(Zen)
很多和Perl哲学相对
认为做一件事最好只有一种方法
喜欢显性明示
	自引用 self 很多,这是一种显性表达的体现
强调松散
语法语义简单而类库丰富
        • 劣势
总体看还是在性能效率上不尽如人意
      • Ruby
        • 特点
精巧灵动
兼具Perl的灵活性和Python的可读性
	Ruby的元编程能力特别强
	很多的代码实现Ruby的代码最为赏心悦目
        • 理念
关注程序员使用语言时感受超过语言本身的功能,通俗说,兵器的称手比锋利更重要,文雅说,就是给予程序员更多的人文关怀
        • 劣势
性能还有待提升
线程由用户空间而不是内核空间来管理(被称绿色线程或伪线程),不能充分利用多核或多CPU
        • 应用
web应用框架Ruby on Rail(RoR)的成功,让Ruby炙手可热,催生了Java平台下的Groovy语言和Groovy on Grails框架

RoR

	奉行SoC和DRY原则,以及MVC框架看似无心意,但与Ruby结合后,便如一只揉身而上的灵猫,立刻衬托出Java和.NET大象般的身影

	流行的背景
		正值web2.0和敏捷开发概念的流行之际,RoR将AJAX和Ruby组合在一起形成极佳的回应
		以前web应用框架不少,但RoR之前轻量级套餐式解决方案并不多,Perl中的Catalyst,Python的Pylon,还有PHP的CakePHP都是效仿之作
		Perl和PHP过于流行,因此背负了不少历史的包袱,人们习惯了将表示逻辑和业务逻辑交织在一起
		Java的企业级解决方案,框架太多,搭配组合更多,增加了选择的难度。
    即使采用最轻量级的SSH(Struts +Spring + Hibernate)组合,维护起来也比RoR繁杂的多
    
	挑战
		目前应用深度和广度上都不能与Java相提并论,Java在性能、安全等方面的优势,对于大型和关键性应用是至关重要的
		即使在中小型web应用中,RoR也远不及PHP
      • PHP
        • 背景
与python、Ruby开始的定位通用语言相比,PHP专为网络而生
与perl一样,期初主要扮演文本过滤器的角色,但perl主要处理文件流,PHP主要处理套接字流
        • 特点
简明单纯(简单专一)
语法简单,为网络应用度身定做
        • 劣势
变量大小写敏感而函数名大小写不敏感
函数命名规则不一致
不支持namespce和Unicode(5.3.0支持namespace,6.0支持Unicode)
对象模型也不是先天的,PHP5才真正完善
对线程支持不足
相比perl python ruby 在功能上稍显单薄
      • web框架的作用
如果web应用中的动态页面较少或业务逻辑不复杂,框架的价值不大
以前的CGI编程就是往Perl代码嵌入HTML代码,如同Java中的Servlet
PHP就是在HTML代码中插入PHP代码,如同早起的JSP
没有MVC,更没有ORM

一旦逻辑业务变得复杂,开发人员增多,手工作坊变得捉襟见肘,引入框架这个流水生产线来提供生产力便是大势所趋
  • 前台语言

—— 视觉与交互的艺术

与用户交互

    • Delphi
又称 Object Pascal,前身是教学语言Pascal

特点
由于擅长可视化快速应用开发(RAD),才被当做前端语言来使用
事实上它不单单是开发语言,也是开发环境(IDE)
Delphi让复杂的事情变简单
优秀的VCL框架使得它作为前端语言更胜一筹,更高的运行效率也使它同样能胜任后台工作
可以移植到Linux下的Kylix,对指针的支持则是便利和复杂的双刃剑
    • VB

前身是入门语言BASIC,故具有易学易用的特点

特点
多应用于前台的可视化开发,对运行效率要求相对较低
VB让简单的事情变得更加简单,学习曲线短
仅限于Windows平台,如果专注于微软技术,VB更便于扩展开发,包括Ms Office在内的应用程序,VB.NET更能利用.NET平台上的资源
版本更新较快,紧跟时代的同事,也给程序员带来了兼容的烦恼

优点
易学易用,上手快,对非计算机专业人事尤其具有吸引力

发展
VB发展到VB.NET之后,从单纯的事件驱动编程反正发展为对象式、泛型式和函数式多种范式,
越来越强大,越来越严格,也越来越复杂,不再是人们戏称的“玩具语言”了
    • JS
      • DHTML (Dynamic HTML 动态HTML技术)
在静态标记语言基础之上如HTML、XHTML等基础上,添加客户端脚本如JavaScript、VBScript等,并辅以样式语言CSS

和动态网页区别
前者的动态效果来自于客户端,后者的动态效果来自于服务端
      • AJAX (Asynchronous JavaScript And XML)
实际上比DHTML多了一个XHR(XMLHttpRequest)的API

XHR
	最大的功能是能和后台服务器通信,从而实现页面的局部刷新(刷新的数据来之于XHR),之前此类的效果只能通过IFrame来实现
	正是这种异步技术大大提升了用户体验,使得网页效果也是前所未有的逼近桌面效果
      • 背景
极无个性的名字,为了占Java的光,Netscape楞将LiveScript改成了JavaScript,引起了不少混乱
      • 特点
看起来加单、写起来随意、用起来头疼
	从JavaScript语言本身说
		其弱类型和动态语言特征给了程序员很多自由,也带来了更多的混乱
		基于原型(prototype-based)的OOP特征不如基于类的OOP那样为人熟知
		缺乏丰富的API
		不同的浏览器不同的版本之间兼容性差
	JavaScript一直被严重低估和误解,自视甚高的程序员一般不屑去编写网页,大多数JavaScript代码由不那么专业的程序员编写
	IDE和调试工具的缺乏也给开发带来了掣肘(chezhou)
集过程式、对象式、函数式、事件驱动式、元编程于一身,其强大是超乎想象的
      • 现状
暂时没有替代品
	VBScript仅限于微软的浏览器IE,在追求跨浏览器和强调标准的今天是不具备竞争力的
	ActionScript具有强大的多媒体功能,但必须借助于Flash插件,与JavaScript是互补共生的关系
      • 前景
JavaScript在网络技术中的主流地位在很长时间内恐怕很难撼动
	相较于其他的RIA(Rich Internet Application)技术,如Adobe的Flex、微软的Silverlight、Sun的JavaFX等,
  以Java为核心的AJAX技术最大的优势在于:标准、普及、成熟;
  不须安装插件,只要浏览器支持JavaScript即可;
  因其文本特征对搜索引擎更加友好

# 发展

现代的程序都有自己的专长,又向通用化和全能化发展,以争取更大生存空间
现代的程序员也是如此
静态语言和动态语言从语言特征到运行环境都在逐步的融合

# 总结

在以网络为中心的企业解决方案中,桌面应用式微
Java 和 C#是两棵比肩的大树,周围生长着郁郁葱葱的动态语言小草

待友之道,贵在放大其优点而缩小其缺点,对待语言亦是如此。
这既是一种态度,也是一种境界。

编程语言惯用法、哲学理念和编程范式形成了语言的编程风格
  • 语言
没有最好的语言,只有最合适的语言
没有槽糕的语言,只有糟糕的程序员
没有一种语言是万能的,只会一种语言是万万不能的
废除对语言的宗教信仰,建立对语言的哲学思维
编程就是在人脑和电脑之间寻找平衡的过程