TITLE: 编程语言乱炖
码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快!
有时候还是蛮怀念十几、二十年前的软件开发环境,好像你只要会C或C++就可以了。但时光早已不同,尤其是近年的语言趋势更是呈现出许多新特性。这些新特性的流行,得益于2000年代的动态语言,比如PHP、Python、Ruby。而这些语言的日益流行,又得益于互联网应用的兴起。PHP在网站构建方面占据大半壁江山,Python因应互联网数据量的喷发在科学计算领域得以重用,而RoR成就了多少初创公司的创业荣光。当年被人不看好的小脚本,却在互联网时代找到了大展身手的好时机。现在你不会一门动态语言都不好意思说自己是程序员了。
还必须提一下JavaScript,当年几乎人人不待见的丑小鸭,谁能想到今天的地位如此突出呢?甚至还延伸出了Node.js这样一个优质平台。一时间多少JavaScript开发者希望借助它实现心中的“全栈”梦想。同样,没有互联网,也就不会有JavaScript的大行其道。我认为,JavaScript在当代的价值,不会输给十几年前的Java。
动态语言的流行,也让许多组织和个人认识到了其存在的价值——那就是开发效率大大提升。以前编程需要为1M、甚至几百K的内存绞尽脑汁,运用各种Hack技巧。但遵从摩尔定律,硬件的发展速度非常快,于是,开发者逐渐将眼光转到了开发效率上。动态语言中广泛应用的filter、map和reduce等具有浓郁函数式风格的高阶函数,被认为是提升开发效率的有效手段。当然,苹果的Swift,同样也大量应用了这些特性。
就目前编程语法发展过程的几个关注点,我的理解如下:
不止是面向对象,函数式的回归正在进行时。过去十几年时间里,Java和C#两种语言占据主流,面向对象编程被赋予至高无上地位。但现在大家越来越认识到,面向对象编程达到一定规模时,复杂度也伴之而来。因此,旧有的函数式风格又重出江湖,特别是一些函数式特性在动态语言中得到了良好验证。现在,开发者对待面向对象与函数式两种风格,已经不是非此即彼的印象了,而是认识到它们是可以相辅相成的,比如Scala。即使是Java,也开始引入一些函数式特性,更不用说先行一步的C#。再进一步,抛开风格之争,遵从应用为先,从而采取实用的编程模式,比如Golang、Rust。
并发特性的增强。多核及大数据时代的来临,现实对并发特性提出了新需求。新出现的系统级语言如Scala、Clojure、Erlang、Go及刚正式发布的Rust,都对并发特性给予极大关注,并各有各的解决方案。即使是动态语言如PHP、Python和Ruby等,也在这方面不断尝试。同样的,函数式语言中的不可变性概念,能够较好地符合并发实现的现实需求。
苹果公司2014年开发者大会上推出的Swift语言,一经推出,便引起轰动。这是编译器大师,LLVM的作者Chris Lanttner主持开发的,而且集众多现代高级语言之长,更由苹果公司大力扶持,可谓系出名门。因此一经推出,便在编程语言排行榜上蹿红。
SWIFT惹人喜爱的特性包括:
- 简洁明快的语法(连句尾的“;”都去掉了),像脚本语言生动而富于表现力;
- 一个面向对象的C,且不受C语言兼容性的限制;
- 可直接调用苹果系统的Coca和Coca Touch框架,也就是说,可以直接编写桌面(Mac)和移动端(IOS)
程序; - 在Xcode内自带REPL环境,可以实时查看运行结果;
- 基于LLVM编译器,具有工业级性能;
- 拥有完整的面向对象、函数式编程、闭包、泛型等强大功能;
- 是一个类型安全的语言;
- 编译器强大而友好,最大可能消灭bug;
……
这简直是我追求的完美的实用语言。2015年底,Swifi他开源,还有什么理由不选它呢?当然,它还年轻,还面临众多成熟语言的强大挑战。
再看JavaScript。话说ES6(EMCA Script version 6)在2015年发布了。经过持续几年的磨砺,它已成为JS有史以来最实质的升级,新的语言和库特性就像无主之宝,等待有识之士的发掘。新的语言特性涵盖范围甚广,小到受欢迎的语法糖,例如箭头函数(arrow functions)和简单的字符串插值(string interpolation),大到烧脑的新概念,例如代理(proxies)和生成器(generators)。本来有了node.js的javascript已如虎添翼,现在ES6的到来使其更加强大。看来,将来的江湖,必将是Swifit与EMCAscript(Javascript)的对决!
好啦,我们将从各个角度审视一下各种编程语言,看看到底选择哪个好。
从汇编到高级语言
计算机不能理解人类语言,只能理解为它们专门开发的程序语言。机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。最初的机器语言就是打孔纸带,后来是二进制源码。但这些都非常难以编写和阅读,于是人们发明了汇编语言,这是面向寄存器操作的助记符组成的语言。今天主要是x86汇编和arm的汇编两类,与芯片类型相关。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。
操作:寄存器BX的内容送到AX中
1000100111011000 //机器指令
mov ax,bx //汇编指令
此后,程序员们就用汇编指令编写源程序。可是,计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?这时,就需要有一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器
指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以 识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状
态,也能控制其它外围电路的工作状态。汇编语言的另一个特点就是它所操作的对象不是具体的数据,而 是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言
一样直接使用数据,而是先要从相应的寄存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。
但汇编语言的操作太“基本”,还是不利于编写应用程序,于是人们发明了高级语言。高级语言是面向要处理的“对象”,如数字、字符串和组合对象的语言,这些对象都要存放在内存里,因此 也向面向内存操作的语言。高级语言需要编译器或解释器来“翻译”成机器语才能被计算机所理解和执行。因此,一门高级语言的性能取决于其编译器或解释器。如果你能搞出一个编译器,就等于搞出一套高级语言。
程序设计语言的类型:
命令式语言。这种语言的语义基础是模拟“数据存储/数据操作”的图灵机可计算模型,十分符合现代计算机体系结构的自然实现方式。其中产生操作的主要途径是依赖语句或命令产生的副作用。现代流行的大多数语言都是这一类型,比如 Fortran、Pascal、Cobol、C、C++、Basic、Ada、Java、C# 等,各种脚本语言也被看作是此种类型。
函数式语言。这种语言的语义基础是基于数学函数概念的值映射的λ算子可计算模型。这种语言非常适合于进行人工智能等工作的计算。典型的函数式语言如 Lisp、Haskell、ML、Scheme 、F#等。
逻辑式语言。这种语言的语义基础是基于一组已知规则的形式逻辑系统。这种语言主要用在专家系统的实现中。最著名的逻辑式语言是 Prolog。
面向对象语言。现代语言中的大多数都提供面向对象的支持,但有些语言是直接建立在面向对象基本模型上的,语言的语法形式的语义就是基本对象操作。主要的纯面向对象语言是 Smalltalk。现代融合了命令式和面向对象能力的语言主要是c++和java。这也是两门主要的工业级程序设计语言。
虽然各种语言属于不同的类型,但它们各自都不同程度地对其他类型的运算模式有所支持。
C
C语言是最具有代表性的高级语言,C系语言家族的鼻祖。C语言是典型的命令式语言和编译型语言,也是学习任何高级语言的基础,号称程序语言的“普通话”,常年居于编程语言排行榜榜首。C语言非常接近系统底层,具有操作系统接口(特别是unix系统)和汇编接口,是编写操作系统的语言,也被称为“系统编程语言”。正因为接近系统底层,所以c语言执行效率非常高。C语言具有最广大的硬件支持,可以运行在任何cpu和嵌入式SoC上,也具有最广大的软件支持,几乎各种操作系统/数据库/编译器/图形库等都可以调用C语言或用C语言扩展。从这个意义上讲,C语言是最“跨平台”的语言。只要那种架构的处理器具有对应的C语言编译器和库,然后将C源代码编译、连接成目标二进制文件之后即可运行。
标准:ANSI C (美国国家标准委员会,1989);C11 (ISO/IEC9899: 2011)
�����C语言提供了很多数据类型,其基本类型包括字符、具有多种长度的整型和浮点数等。另外,还有通过指针、数组、结构和联合派生的各种数据类型。表达式由运算符河操作数组成。任何一个表达式,包括赋值表达式或函数调用表达式,都可以是一个语句。C语言为实现结构良好的程序提供了基本的控制流结构:语句组、条件判断(if-else)、多路选择(switch)、循环(while,for)等。函数可以返回基本类型、结构、联合或指针类型的值。任何函数都可以递归调用(但C不是函数式语言)。编译的预处理阶段将对程序文本进行宏替换,包含其他源文件以及进行条件编译。
C语言的弱点:“没有银弹”。C语言当然也存在一些自身无法解决的问题。C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷;C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握;此外,作为C语言的一大特色,指针可以说是C语言优于其它高级语言的一个重要原因。就是因为它有指针,可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。基本功能简单,不提供直接处理诸如字符串、集合、列表或数组等复合对象的操作,没有定义任何存储器分配工具,也不提供堆和无用内存回收工具,也没有多道程序设计、并行操作、同步和协同例程。这些“高级”功能都需要调用函数来完成(当然C语言有强大的函数库)。C语言采用结构化编程方法,遵从自顶向下的原则。在操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,但在编写大型程序时,由于C语言不是面向对象的,显得力不从心。C语言的指针提供了对内存地址进行操作的能力,这既是强大的工具也对初学者构成了难点。另外,C程序的源代码分散在各种头文件和源文件中,变量可以只在函数内部有效,也可以在函数外部但仅在一个源文件中有效,还可以在整个程序中都有效。这对源程序的管理提出了挑战。C的类型化和强编译要求,既是减少错误的保证,使它不够灵活。
C语言目前广泛应用在系统编程(如操作系统扩展、底层库、驱动程序等)、嵌入式编程(特别是为各种智能硬件)和语言教学领域。
编译器
GCC,GNU组织开发的开源免费的编译器
MinGW,Windows操作系统下的GCC
Clang,开源的BSD协议的基于LLVM的编译器
Visual C++ :: cl.exe,Microsoft VC++自带的编译器
集成开发环境(IDE)
CodeBlocks,开源免费的C/C++ IDE
CodeLite,开源、跨平台的C/C++集成开发环境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Stdio系列
Hello World
下面是一个在标准输出设备 (stdout) 上,印出 "Hello, world!" 字符串的简单程序。类似的程序,通常作为初学编程语言时的第一个程序:
#include <stdio.h>
int main(void)
{
printf("Hello, world!");
return 0;
}
C++
对于开发人员,他们一直被软件开发的效率问题困扰,软件如何得到更好更高效的维护?如何让已有资源的得到更好的复用?答案是面向对象。面向对象程序设计在某种程度上通过强调可重复性解决了这一问题。向对象程序设计可以被视作一种在程序中包含各种独立而又互相调用的单位和对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,或者说是负有责任的角色。
为了弥补C语言在开发大型项目上的不足,1983年,贝尔实验室的Bjarne Stroustrup在C语言基础上推出了C++。 C++进一步扩充和完善了C语言,是一种面向对象的程序设计语言。
C语言是C++的基础,C++和C语言在很多方面是兼容的。
C语言是一个结构化语言,它的重点在于算法与数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事物)控制)。C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制。所以C语言和C++的最大区别在于它们解决问题的思想方法不一样。
C++对C的“增强”,表现在六个方面:
(1) 类型检查更为严格。
(2) 增加了面向对象的机制。
(3) 增加了泛型编程的机制(Template)。
(4) 增加了异常处理。
(5) 增加了运算符重载。
(6) 增加了标准模板库(STL)。
C++又被称为“带类的C”(“C with Class”),研制者在C语言的基础上加进去的特征主要有:类及派生类、共有和私有成员的区分、类的构造函数和析构函数、友元、内联函数、赋值运算符的重载等。1985年公布的C++语言1.0版的内容中又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等。1989年推出的2.0版形成了更加完善的支持面向对象程序设计的C++语言,新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等。
1993年的C++语言3.0版本是C++语言的进一步完善,其中最重要的新特征是模板(template),此外解决了多重继承产生的二义性问题和相应的构造函数与析构函数的处理等。
最新标准: C++ 11 《ISO/IEC 14882:2011》
C++语言最有意义的方面是支持面向对象的特征。虽然与C的兼容使得C++具有双重特点,但他在概念上完全与C不同,更具面向对象的特征。
出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,Bjarne Stroustrup的《C++语言的设计和演化》(1994)里做了详尽的陈述。
C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括Boost、Qt、MFC、OWL、wxWidgets、WTL就是使用的C++。
缺点
C++由于语言本身复杂。C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器如果存在问题,可能难于被发现。
由于本身的复杂性,复杂的C++程序的正确性相当难于保证。
C++对于安全性也无法保证,所以,很容易依靠C++编译出病毒来。
应用领域
其编程领域众广,常用于系统开、大型项目、引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一
集成开发环境(IDE)
Microsoft Visual Studio(Visual C++)
当前流行的编译器只有五种:Intel C++ 编译器、微软的cl.exe编译器(捆绑于Visual Studio套装中)、GNU的GCC编译器(在Linux系统中叫G++)、LLVM的Clang编译器(Xcode中包含)、Borland公司的bcc.exe编译器(捆绑于Borland C++ Builder套装中)。
Hello World
#inlcude <iostream>
int main()
{
using namespace std;
cout << "Hello World." << endl;
return 0;
}
'C#'--微软的C++
C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。
C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。
C#使得C++程序员可以高效的开发程序,且因可调用由 C/C++ 编写的本机原生函数,因此绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。
C#所开发的程序源代码并不是编译成能够直接在操作系统上执行的二进制本地代码。与Java类似,它被编译成为中间代码,然后通过.NETFramework的虚拟机——被称之为通用语言运行时(CLR)——执行。 所有的.Net编程语言都被编译成这种被称为MSIL(Microsoft Intermediate Language )的中间代码。因此虽然最终的程序在表面上仍然与传统意义上的可执行文件都具有“.exe”的后缀名。但是实际上,如果计算机上没有安装.Net Framework,那么这些程序将不能够被执行。 在程序执行时,.Net Framework将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终的二进制代码被存储在一个缓冲区中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度明显加快。
应用领域:Windows平台的应用软件(桌面应用软件)。
集成开发环境(IDE)
Microsoft Visual Studio(Visual C++)
缺点:只能运行于Windows平台的.netFramework上。基本就是.Net开发。
Java
Java是面向对象语言的后起之秀和典范。具有严谨的结构和众多的框架,是目前企业应用最广泛的语言。
Java编程语言的风格十分接近C、C++语言。Java是一个纯粹的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
主要特性
Java语言是易学的。Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而担忧。
Java语言是强制面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。
Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。[8]
Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java是性能略高的。与那些解释型的高级脚本语言相比,Java的性能还是较优的。
Java语言是原生支持多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
Java语言是动态的。Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
差异
熟悉C语言和C++语言的读者一定想搞清楚这个问题,实际上,Java确实是从C语言和C++语言继承了许多成份,甚至可以将Java看成是类C语言发展和衍生的产物。比如Java语言的变量声明,操作符形式,参数传递,流程控制等方面和C语言、C++语言完全相同。尽管如此,Java和C语言,C++语言又有许多差别,主要表如下几个方面:
Java中对内存的分配是动态的,它采用面向对象的机制,采用运算符new为每个对象分配内存空间,而且,实际内存还会随程序运行情况而改变。程序运行中 Java系统自动对内存进行扫描,对长期不用的空间作为”垃圾”进行收集,使得系统资源得到更充分地利用.按照这种机制,程序员不必关注内存管理问题,这使Java程序的编写变得简单明了,并且避免了由于内存管理方面的差错而导致系统出问题。而C语言通过malloc()和free()这两个库函数来分别实现分配内存和释放内存空间的,C++语言中则通过运算符new和delete来分配和释放内存。在C和C++这种机制中,程序员必须非常仔细地处理内存的使用问题。一方面,如果对己释放的内存再作释放或者对未曾分配的内存作释放,都会造成死机;而另一方面,如果对长期不用的或不再使用的内存不释放,则会浪费系统资源,甚至因此造成资源枯竭。
Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。
Java不用goto语句,而是用try-catch-finally异常处理语句来代替goto语句处理出错的功能。
Java不支持头文件,而C语言和C++语言中都用头文件来声明类的原型、全局变量、库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。
Java不支持宏定义。Java只能使用关键字final来定义常量。
Java对每种数据类型都分配固定长度。比如,在Java中,int类型总是32位的,而在C语言和C++语言中,对于不同的平台,同一个数据类型分配不同的字节数,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位。这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性)。
类型转换不同。在C语言和C++语言中,可通过指针进行任意的类型转换,常常带来不安全性,而在Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。
结构和联合的处理。Java中根本就不允许类似C语言的结构体(struct)和联合体(union)包含结构和联合,所有的内容都封装在类里面。
Java不再使用指针。指针是C语言和C++语言中最灵活,也最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性。而Java用“引用”的方式,对指针进行完全地控制,程序员不能直接进行任何指针操作。
避免平台依赖。Java语言编写的类库可以在其它平台的Java应用程序中使用,而不像C++语言必须运行于单一平台。
在B/S开发方面,Java要远远优于C++。
最新版本:2014年3月19日,甲骨文公司发布Java 8.0的正式版。
应用
企业级web应用开发:J2EE(JSP,JavaBean,Servlet)+SSH(Struts,Spring,Hibernate)
安卓系统程序开发。
缺点
java 2009年 被Oracle收购,丧失了独立性。Oracle对Java未来的态度难以预测。Java版本太多,有兼容性的问题。Java的代码相对于其他的代码来说过于冗长,这与它的轻便化声明相违背。使用Swing平台编写的带有GUI(图形用户接口)的程序和其他原始程序非常不同。性能问题:由于Java编译器和虚拟机的不同对Java代码的性能影响比语言本身的影响大的多,所以统一讨论Java的程序的性能经常是有误导性的。据IBM的数据,在同样的硬件上2001年时的IBMJDK版本的性能是1996年的JDK版本的十倍左右。即使是在同一时期,不同公司的JDK和JRE的性能也不一样,比如SUN、IBM、BEA等公司都有自己开发的JDK和JRE。
开发工具
IntelliJ IDEA【Java开发工具】
IntelliJ IDEA是JetBrains公司的产品,比老一代Java开发工具Eclipse更漂亮,更智能。Google官方Android开发工具Android Studio就是基于intellij IDEA开发的。Intellij IDEA拥有出色的界面设计,使用Darculah黑色界面主题会让你爱不释手。在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。IntelliJ IDEA分为商业版本,个人版本,与community社区版本。其中,community社区版本是免费的,但是功能性并不弱,对于学习者和个人开发者来说完全足够了。
Eclipse 【Java开源开发工具】
Eclipse平台是IBM向开放源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数 —4千万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的以及可扩展的体系结构。
NetBeans【Java开源开发工具】
NetBeans IDE 是一个为软件开发者提供的自由、开源的集成开发环境。您可以从中获得您所需要的所有工具,用Java、C/C++ 甚至是Ruby 来创建专业的桌面应用程序、企业应用程序、web 和移动应用程序。此IDE 可以在多种平台上运行,包括Windows、Linux、Mac OS X以及Solaris;它易于安装且非常方便使用。
Hello World
下面看一个简单的Java程序,它将打印字符串 Hello World
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World"); // 打印 Hello World
}
}
JavaScript
JavaScript一种解释型脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
组成部分:其实Javascript技术分为三个组成部分。
- ECMAScript,描述了该语言的语法和基本对象。
- 文档对象模型(DOM),描述处理网页内容的方法和接口。
- 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口。
JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
- 是一种解释性脚本语言(代码不进行预编译)。
- 主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。[4]
- 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。[4]
- 跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。
JavaScript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Node.js的推出,使得Javacript摆脱了浏览器的束缚,成为一种独立的全功能语言。
关于对象操作:JavaScript不是一门纯面向对象的语言,它没有提供面向对象的许多功能,如类、接口、继承等,因此把它称为“基于对象”更合适些。
标准
发展初期,JavaScript的标准并未确定,同期有Netscape的JavaScript,微软的JScript和CEnvi的ScriptEase三足鼎立。1997年,在ECMA(欧洲计算机制造商协会)的协调下,由Netscape、Sun、微软、Borland组成的工作组确定统一标准:ECMA-262。ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现(另外的ECMAScript方言还有Jscript和ActionScript)。在日常场合,这两个词是可以互换的。
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。标准的制定者有计划,以后每年发布一次标准,使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015
优点
- 简单:JavaScript本来是为网页设计人员开发的,语句简洁,学起来非常简单。但学精不容易。
- WEB支持:天生的Web语言,无论在网页浏览器中还是在服务器端,都如鱼得水。而且还有众多Web框架。
- 解释型:无须编译,立即执行,改动源码只需刷新一下浏览器,比起编译型语言不知方便了多少。
- 函数式语言:号称“披着C外衣的LISP ”,函数是一等公民。
- 基于对象:虽然不是完全面向对象,但其“对象”功能十分强大,通过列出对象的组成部分,就能简单地创建出来,而且原生支持json。
缺点
- 性能:比起编译后生成的机器码,解释型语言“边译边执行”,速度慢些。
- 不便于编写带GUI的桌面程序。
- 弱类型:没有数据类型,解释器不能检测出类型错误。甚至没有整型!所有数字都被表示为64位双精度浮点数。也没有字符类型,所有字符只能用包含一个字符的“字符串”来表示。
- 不是完全面向对象:没有“类”,基于原型继承,对象直接从其他对象继承属性,这对于应用基于类的设计十分不便。
- 全局变量:依赖于全局变量进行连接,函数外创建的变量默认为全局变量,容易导致错误。
- 缺乏块级作用域:没有提供块级作用域,代码块中声明的变量在包含此代码块的函数的任何位置都是可见的。
自动插入分号。 - 对Unicode支持不全:JavaScript的字符是16位的,不足以覆盖全部Unicode字符(有100多万个)。
- 伪数组:没有真正的数组,虽然也具备数组的一些功能,但性能差些。
ES6的革命化升级
所幸,上述Javascript的各种缺点在最新版的EMCAScript6中得到了弥补。
ES6 包含了以下这些新特性:
- Arrows 箭头函数:箭头函数是使用=>语法的函数简写形式。这在语法上与 C#、Java 8 和 CoffeeScript 的相关特性非常相似。它们同时支持表达式语句块体和返回表达式的值的表达式体。与(普通的)函数所不同的是,箭头函数和其上下文中的代码共享同一个具有词法作用域的this。
- Classes 类:ES6 的类是在基于原型的面向对象模式之上的简单语法糖,它有唯一的、便捷的声明形式,这使得类模式更容易使用,并且鼓励了互操作性。class定义的类支持基于原型的继承、super 调用、实例和静态方法以及构造函数。
- Enhanced Object Literals 增强的对象字面量:对象字面量被扩展以支持以下特性:在构建的时候设置原型、foo: foo赋值的简写形式、定义方法、进行super 调用以及使用表达式计算属性名称等。这样就使得对象字面量和类的声明的联系更加紧密,使得基于对象的设计更加便利。
- Template Strings 模板字符串:模板字符串提供构造字符串的语法糖,这与Perl、Python等许多语言中的字符串插值功能非常相似,你也可以通过添加标签(tag)来自定义构造字符串,避免注入攻击,或者基于字符串构建更高层次的数据结构。
- Destructuring 解构:解构允许在(变量-值)绑定时使用模式匹配,支持匹配数组和对象,解构支持失效弱化,与标准的对象查询foo["bar"]相似,当查询无结果时生成undefined值。
- Default + Rest + Spread 默认参数+不定参数+参数展开:支持由被调用函数进行求值的参数默认值。 在函数调用时使用...运算符,可以将作为参数的数组拆解为连续的多个参数。 在函数定义时使用...运算符,则可以将函数尾部的多个参数绑定到一个数组中。 不定参数取代了arguments,并可更直接地应用于通常的用例中。
- Let + Const 操作符:let 和 const 是具有块级作用域的绑定用构造,let 是新的 var,只在块级作用域内有效,const 是单赋值,声明的是块级作用域的常量。此两种操作符具有静态限制,可以防止出现“在赋值之前使用”的错误。
- Iterators 迭代器 + For..Of 循环:迭代器对象允许像 CLI IEnumerable 或者 Java Iterable 一样自定义迭代器。将for..in转换为自定义的基于迭代器的形如for..of的迭代,不需要实现一个数组,支持像 LINQ 一样的惰性设计模式。
- Generators 生成器:生成器通过使用function和yield简化迭代器的编写, 形如function的函数声明返回一个生成器实例,生成器是迭代器的子类型,迭代器包括附加的next和throw,这使得值可以回流到生成器中,所以,yield是一个返回或抛出值的表达式形式。
- Unicode 统一码:字符串支持新的Unicode文本形式,也增加了新的正则表达式修饰符u来处理码位,同时,新的API可以在21bit码位级别上处理字符串,增加这些支持后可以使用 Javascript 构建全球化的应用。
- Modules 模块:ES6 在语言层面上支持使用模块来进行组件定义,将流行的JavaScript模块加载器(AMD、CommonJS)中的模式固化到了语言中。运行时行为由宿主定义的默认加载器定义,隐式异步模型 - 直到(全部)请求的模块均可用且经处理后,才会执行(当前模块内的)代码。
- Module Loaders 模块加载器:支持动态加载模块,默认的模块加载器是可配置的,也可以构建新的加载器,对在隔离和受限上下文中的代码进行求值和加载。
- Map + Set + Weakmap + Weakset 数据结构:用于实现常见算法的高效数据结构,WeakMaps提供不会泄露的对象键(对象作为键名,而且键名指向对象)索引表 注:所谓的不会泄露,指的是对应的对象可能会被自动回收,回收后WeakMaps自动移除对应的键值对,有助于防止内存泄露。
- Proxies 代理:代理可以创造一个具备宿主对象全部可用行为的对象。可用于拦截、对象虚拟化、日志/分析等。
- Symbols 符号:符号(Symbol) 能够实现针对对象状态的访问控制,允许使用string(与ES5相同)或symbol作为键来访问属性。符号是一个新的原语类型,可选的description参数可以用于调试——但并不是符号身份的一部分。符号是独一无二的(如同gensym(所产生的符号)),但不是私有的,因为它们可以通过类似Object.getOwnPropertySymbols的反射特性暴露出来。
- Subclassable Built-ins 可子类化内建对象:在 ES6 中,内建对象,如Array、Date以及DOM元素可以被子类化。
- Promises 对象:Promise是用来进行异步编程的库。Promise是对一个“将来可能会变得可用”的值的第一类表示,Promise被使用在现有的许多JavaScript库中。
- Math + Number + String + Object APIs:新加入了许多库,包括核心数学库,进行数组转换的协助函数,字符串 helper,以及用来进行拷贝的Object.assign。
- Binary and Octal Literals 二进制和八进制字面量:加入对二进制(b)和八进制(o)字面量的支持。
- Reflect 反射 API:完整的反射API。此API在对象上暴露了运行时级别的元操作,从效果上来说,这是一个反代理API,并允许调用与代理陷阱中相同的元操作。实现代理非常有用。
- Tail Calls 尾递归调用:(ES6)保证递归尾部调用时栈不会无限增长,这使得递归算法在面对未作限制的输入时,能够安全地执行。
有了这些增强,JavaScript几近完美。加之它天然的简单性,在GitHub上的开发语言中一路领先。以至于有人总结了一条定律:“一切能用JavaScript编写的程序最终都会被用JavaScript编写“。
Swift
Swift是最年轻的通用计算机编程语言,现代语言集大成者,无缝集成Coca和CocaTouch图形框架,苹果公司的当家花旦,虽然植根于MAC/IOS系统,现已开源。
2010年的夏天,Chris Lattner 接到了一个不同寻常的任务:为 OS X 和 iOS 平台开发下一代新的编程语言。那时候乔布斯还在以带病之身掌控着庞大的苹果帝国,他是否参与了这个研发计划,我们不得而知,不过我想他至少应该知道此事,因为这个计划是高度机密的,只有极少数人知道,最初的执行者也只有一个人,那就是 Chris Lattner。
从2010年的7月起,克里斯(Chris)就开始了无休止的思考、设计、编程和调试,他用了近一年的时间实现了大部分基础语言结构,之后另一些语言专家加入进来持续改进。到了2013年,该项目成为了苹果开发工具组的重中之重,克里斯带领着他的团队逐步完成了一门全新语言的语法设计、编译器、运行时、框架、IDE 和文档等相关工作,并在2014年的 WWDC 大会上首次登台亮相便震惊了世界,这门语言的名字叫做:「Swift」。
根据克里斯个人博客(http://nondot.org/sabre/ )对 Swift 的描述,这门语言几乎是他凭借一己之力完成的。这位著名的70后程序员同时还是 LLVM 项目的主要发起人与作者之一、Clang 编译器的作者,可以说 Swift 语言和克里斯之前的软件作品有着千丝万缕的联系。
同样是70后程序员,差别怎么那么大呢?
关于作者
克里斯可以说是天才少年和好学生的代名词,他在2000年本科毕业之后,继续攻读计算机硕士和博士。但克里斯并不是宅男,学习之余他手捧「龙书」游历世界,成为德智体美劳全面发展的好学生。之后就是一篇又一篇的发表论文,硕士毕业论文即提出了一套完整的运行时编译思想,奠定了 LLVM 的发展基础,读博期间 LLVM 编译框架在他的领导下得到了长足的发展,已经可以基于 GCC 前端编译器的语义分析结果进行编译优化和代码生成,所以克里斯在2005年毕业的时候已经是业界知名的编译器专家了。
注:很多计算机专业的大学生经常问我在大学里学点什么好,看看克里斯就行了。以目前的科技信息开放程度,如果你在自己感兴趣的领域里用心耕耘,再加上那么一点点天分,毕业时成为某一个专有领域的专家应该不是问题。那时就不是你满世界去找工作了,而是工作满世界来找你!
克里斯毕业的时候正是苹果为了编译器焦头烂额的时候,因为苹果之前的软件产品都依赖于整条 GCC 编译链,而开源界的这帮大爷并不买苹果的帐,他们不愿意专门为了苹果公司的要求优化和改进 GCC 代码,所以苹果一怒之下将编译器后端直接替换为 LLVM,并且把克里斯招入麾下。克里斯进入了苹果之后如鱼得水,不仅大幅度优化和改进 LLVM 以适应 Objective-C 的语法变革和性能要求,同时发起了 CLang 项目,旨在全面替换 GCC。这个目标目前已经实现了,从 OS X10.9和 XCode 5开始,LLVM+GCC 已经被替换成了 LLVM+Clang。
Swift 是克里斯在 LLVM 和 Clang 之后第三个伟大的项目!
关于语言
2007年之前,Objective-C 一直是苹果自家院落的小众语言,但是 iOS 移动设备的爆发让这门语言的普及率获得了火箭一般的蹿升速度,截止到今天,Objective-C 在编程语言排行榜上排名第三,江湖人称三哥,大哥二哥分别是 C 和 Java 这样的老牌语言。同时,苹果在2012年和2013年分别对 Objective-C 进行了大规模的优化和升级改进,增加了各种现代语言的特性,让编写 App 更加容易,更多的程序员投入到了 App Store 的生态圈里……
在这种情况下,苹果公司为什么会发布一门新语言呢?
这个问题没有标准答案,不过我们可以试着去分析一下,谈谈苹果的心路历程……
Objective-C 是80年代初 Brad Cox 和 Tom Love 发明的,1988年乔布斯的 Next 公司获得了这门编程语言语言的授权,并开发出了Objective-C 的语言库和NEXTSTEP的开发环境。后来 Next 被苹果收购,Objective-C 阴差阳错成了苹果的当家语言。掐指一算,三十年倏忽而过,OC 也成长为爷爷辈儿的编程语言了。
为了伺候好这位「爷爷」,苹果煞费苦心,把 GCC 的编译链先替换成 LLVM +GCC,又替换成 LLVM+Clang,做语法简化、自动引用计数、增加 Blocks 和 GCD 多线程异步处理技术……终于,OC 在30年后重新焕发出勃勃生机,并占据了兵器谱排名第三的位置。但是,苹果却有点烦了,OC 改进了这么多年,怎么看都像是在修修补补,用 Blocks 去实现一个类似 Python 的 lambda 闭包功能,看起来总是那么别扭。好吧,既然已经全盘掌握了 LLVM 和 Clang,为什么我们不去基于现在的编译器设计一门全新的语言呢?一门属于苹果的语言!你看,邻居谷歌家里叫做 Go 的孩子不是玩耍正酣么?
于是 Swift 诞生了……
当然,事实的真相也可能是行动缓慢的乔老爷子把克里斯拉到一边说:
「I want to be swift to……」
「 行了,您别说了,不就是想要 swift 吗,我这就给您做一个去」
于是 Swift 诞生了……
语法
Swift 是一门博采众长的现代语言,在设计的过程中,克里斯参考了Objective-C,Rust,Haskell,Ruby,Python,C#等优秀语言的特点,最终形成了目前 Swift 的语法特性。我在阅读了官方教程和做了些代码实验之后,自我感觉会喜欢上这门语言,在这里简单谈点感想,更深入的内容需要你们自己去深入学习。
1、Swift 是面向 Cocoa 和 Cocoa Touch 的编程语言,编译型语言,生产环境的代码都需要 LLVM 编译成本地代码才能执行,但是Swift又具备很多动态语言的语法特性和交互方式。
2、Swift 是一门类型安全的语言,可以帮助开发者清楚的掌控代码片段中的值类型。如果你期望输入的是字符串,类型安全的特性会阻止开发者错误地为其传递一个整数。这一切使得开发者能够更早的发现和修复错误。
3、支持各种高级语言特性,包括闭包、泛型、面向对象、多返回值、类型接口、元组、集合等。
4、Swift 能与 Objective-C 进行混合编程,但代码分属不同的文件。
5、全面的Unicode支持,你甚至可以用一只🐶作为变量名,实现以下操作:
let 🐶 = "大狗菠萝"
for n in 🐶{
println( n )
}
控制台会输出「大狗菠萝」四个字。
6、编程语句取消了大部分语言使用的「;」分隔符,只有一行写多条语句时才需要分号。
7、很多人简单阅读了 Swift 的数据类型,就认为 Swift 没有类似 Set、List 这样的数据结构,其实Swift 提供了两种 Collection 的数据类型:数组(Array)和字典(Dictionary),两个数据类型的表达式都用中括号标识。其中数组可以存储任意类型的变量,也可以强制声明存储同一种类型的变量。同时数组提供了类似 Set 功能,你可以修改、追加、替换和删除数据的元素。另外,Swift 还提供了元组(Tuple)的功能支持函数多返回值。
8、Swift 没有提供显式的指针,参数传递根据数据类型的不同分为值类型和引用类型,值传递进行内存拷贝,引用传递最终传递的是一个指向原有对象的指针。这一点和 Java 的参数传递是类似的。需要注意的一点是,Swift 里的数组和字典虽然都是结构体(struct),但在参数传递过程中处理方式却不一样,默认 Array 是引用传递,Dictionary 是值传递。而在 Java 中,由于数组和 Map 都是对象,所以传递的都是指针。
在 Swift 中,如果你不想传递数组引用,可以用 copy() 方法先复制一份出来,另外,也可以用 unshare() 表示,本变量不传递指针。
9、闭包,Swift 终于提供了一种优雅的闭包解决方案,比如在排序函数 sort 中进行函数传递:
let names = ["D", "B", "R", "C", "A"]
func backwards(s1: String, s2: String) -> Bool {
return s1 > s2
}
var rnames = sort(names, backwards)
事实上更简单的写法是:
var rnames = sort( ["D", "B", "R", "C", "A"] ) { $0 > $1 }
10、可选变量(Optional)的引入主要是为了应对一个变量可能存在也可能是 nil 的情况,这种情况在很多高级语言里都存在。比如你想使用String的toInt方法将String转化为 Int 类型,但是你并不知道这个转化是否正常,这时候系统会返回一个可选变量,如果转换成功就返回正常值,转换失败就返回 nil,如下:
let str = "123A"
let nn = str.toInt()
这是 nn 就是可选变量,想得到 nn 的值,可以通过 if 进行判断并通过追加感叹号获取变量值,如下:
if nn {
println(nn!)
}
可选变量的引入解决了大部分需要显式处理的异常,这部分工作也扔给编译器去做了。想了解更多可选变量的用法,请阅读苹果的官方文档。
11、Swift 中的 nil 和 Objective-C 中的 nil 不同。在 Objective-C 中,nil 是指向不存在对象的指针,而在 Swift 里,nil 不是指针,它表示特定类型的值不存在。所有类型的可选值都可以被设置为nil,不仅仅是对象类型。
12、Swift 没有从语言层面支持异步和多核,不过可以直接在 Swift 中复用 GCD 的 API 实现异步功能。另外没看到 Swift 的异常处理机制,可能有了可选变量,异常的使用会非常少吧。
13、还有一点不得不提:Swift特别适合教学,尤其在playground中。
基本上,Swift 绝对不是玩具语言,而是一门可以被大众接受的工业级编程语言。相信假以时日,Swift 必将在 App 开发领域大放异彩。
但是,对于热爱自由的人们,Swift还有两点让人不放心:苹果的控制和生态依赖,以及编译型语言的不灵活。
2015年12月4日,苹果宣布Swifit开源,swift开源不到一天的时间,swift项目在github收到了13087个star,1351个fork。并且还在快速增长中...... 这表示了众多开发者对swift这个语言的关注和热情十分的高涨,并且全球的开发者都会为swift贡献自己的代码和力量。而且,很快,Ubuntu Linux支持Swift了。目前已经出现了很多Swift语言编写的库:网络、图形处理、数学、人工智能……很快Swift就会形成一个大的生态系统。
编程语言的一般架构
编程语言,作为人类指挥计算机工作的指令,一般就干这么几件事:
- 读取人类的信息(输入);
- 处理人类的信息,执行必要的操作;
- 将处理结果反馈给人类(输出);
为了干这几件事,必须:
- 生成一套人机交互的界面(现在以图形界面为主流);
- 对人类输入的信息,主要是数字和文本,进行处理;这又需要:
-- 对信息进行校验和过滤;
-- 存储输入的信息(内存中):涉及数据结构
-- 数学运算;
-- 文本处理的方法;
-- 综合上述形成算法; - 程序本身的管理,涉及到:
-- 语法;
-- 功能单元的组织:函数式、对象化;
-- 程序的错误检查和测试; - 程序与操作系统之间的交互
- 数据的持久化存储(数据库和文件)
-- 文件的操作
-- 数据库的操作
看看各大语言在上述各层面的表现,就知道其优劣了。面向对象之所以盛行,就是因为其对象-类-接口-API的组织形式更灵活便捷。
在这里,我选取Java、JavaScript、Swift三种语言作为代表。
- Swift,编译型语言,面向过程与面向对象
- JavaScript,解释型语言,函数式语言
- Java, 虚拟机型语言,面向对象
后面,我将在上述层面上对三大语言进行对比以分析各自优劣。
附: 多语言编程环境
要编写一个程序,只需要一个文本编辑器,当然你可以使用全功能的IDE,各种语言都有自己强大的IDE,但文本编辑器更小巧灵活。我推荐Sublime Text,它支持多种语言,也有相应的插件。
编译和运行:
C/C++/Object C用clang,这是比gcc更优秀的新一代编译器,实现了快速编译和较少内存占用;有诊断功能;兼容GCC。
编译C文件:clang demo.c -o democ 编译完成后会生成democ可执行文件,./democ即可运行。
编译C++文件:clang++ demo.cpp -o democpp 编译完成后会生成democpp可执行文件,./democpp即可
运行。
java的开发和编译需要安装JDK,里面包含了JRE和JVM。
编译java文件: javac demo.java,生成demo.class,再java demo,就可以运行了。
javascript不需要编译,在浏览器里可以直接运行,但独立运行需要安装node.js。
至于SWIFT语言,只能在Xcode的Playground里试验了。