对于处在编程世界的来说 现在已经走到了一个转折点。十年前 程序员们对动态语言趋之若鹜。对中的大部分人来说 动态语言不仅使编程变得更加简单 同时也意味着一种时尚。时至今日 动态语言不再享有特别的青睐 现在的程序员使用新语言和旧语言的搭配来开发项目。我不禁要问 为了保持自身的竞争力 哪些编程语言是程序员们最需要永久掌握的?

在讨论哪些编程语言在未来会吃香这个问题之前 先来看看不同编程语言之间的的异同。

静态语言 vs. 动态语言

当说到动态语言时 这个"动态"实际上说的是变量类型。使用动态语言编写程序的时候 可以声明一个变量 在程序运行的过程中又可以改变这个变量的类型。与动态语言相对的是静态语言 或者叫强类型语言。比如C++和Java就是强类型的语言 而JavaScript PHP和Perl是动态类型的语言。

在C++中 声明变量的时候必须同时指定变量的类型。在程序运行的过程中 如果试图去改变这个变量的类型 编译器就会报错。这在Java中也是一样。

53e16d183fc19

但是JavaScript不一样 在JavaScript程序运行过程中可以改变变量的类型。事实上 在声明变量的时候就不需要指定这个变量的类型 在使用变量的时候 可以先把一个整数赋值给这个变量 然后又用一个字符串覆盖这个整数 这在动态类型的语言中都是允许的。

尽管动态语言在最近才大行其道 可实际上这个概念在50年前就已经提出来了。

函数式语言

随着动态语言的发展 人们对函数式语言的兴趣也越来越大。在函数式语言中 函数本身可以被存储在变量中 存储在变量中的函数又可以作为参数传递给另外的函数。现在的大多数语言都在一定程度上支持函数式编程。比如说C++ C++允许程序员将指针传递给函数。JavaScript等一些语言使函数的传递变得更加容易。所以 一般认为C++不是一个真正意义上的函数式语言 而认为JavaScript是函数式语言 而Haskell一般被认为是函数式语言的绝佳示例。

垃圾回收机制

理论上来说 只要你正确书写代码 你就不会有任何bugs。这听起来很美好。可实际上 当你和许多其他程序员合作完成一个大项目时 有一个bug会经常出现 这就是内存泄露。你定义了一个变量 使用完这个变量之后却没有及时回收这部分内存 这时就说发生了内存泄露。如果发生了内存泄露又没有及时发现 随着程序运行时间的增加 程序越来越大 直到消耗完系统的所有内存 然后系统崩溃。sounds terrible!

53e16c8e8239c

你可能会说 每次使用变量之后及时释放内存 内存泄露不就不会发生了?想法是好的 可实际情况可能比这要复杂的多。比如说 你申请了一个链表来存储数据 这个链表被传递到另外一个函数 这个函数是别人编写的 在别人编写的这个函数中 将这个链表复制了一份 但是你并不知道 你说是应该删除这个链表还是继续保留?基于这种情况 程序员们想到了一个变通的办法:将内存回收的工作交给系统来做。当你不再使用某个变量 系统通过扫描内存找到这个不再使用的内存 然后主动回收 这就叫做垃圾回收机制。对新开发出来的语言来说 这是一个非常重要的特征。垃圾回收背后的思想是使编程更加容易 从而让程序员将精力放在创造伟大的软件之上。

需要说明的是 确实存在几种不同的垃圾回收机制:一种是系统定期扫描内存 发现那些不再使用的内存;另外一种是系统为每一个变量保留一个tab 一旦发现变量不再使用 马上删除之。从技术上来说 后者并不是一种垃圾回收机制 而是"引用计数" 但是达到的效果是一致的。

虚拟机

53e16cae29817

当Java在20世纪90年代中期横空出世的时候 人们对它不是直接将代码编译成汇编语言这一点十分在意。和C++相反 Java在编译的时候先把程序编译成一个叫字节码的中间代码。在运行的时候 系统调用虚拟机执行字节码 有时候甚至只是将字节码编译成汇编代码。这种编译方式刚刚出来的时候 程序员们抱怨其速度慢 当然现在已经不成问题。许多语言采用虚拟机的方式运行 比如说前面提到的Java、C#等。现在这种类型的语言在速度上得到了长足的发展。

语言

说了这么多 那么程序员到底应该学习哪些语言呢?下面列举了五种在未来工作中有丰富需求的语言。除此之外 我还列举了第六种语言 作为一个"honorable mention"。

53e16cda02d86

JavaScript、HTML5和CSS3

从技术上来说 HTML5并不是一种语言 而是一项技术 这项技术和CSS3、JavaScript一起使你能够构建基于Web的应用。你可以创建运行在浏览器中的软件 这样做的好处是 你构建的应用将会拥有前所未有的移植性——几乎可以在所有的设备上运行 包括手机。几年前 Facebook开始使用HTML5来构建他们的手机应用 他们超前了这个时代 那时HTML5还不成熟。一段时间后 他们回归了传统模式。过去两年中 浏览器纷纷开始实现最好的HTML5技术 对JavaScript的需求随之增加。如果想保持你的竞争力 这是一项你必须学习的技术。(在服务器端 很多大公司以Node.js的方式使用JavaScript)。

JavaScript 示例:

下面这个例子展示了JavaScript是怎么将一个函数存储到变量中 然后又传递给另外一个函数的。学习JavaScript 参阅:JavaScript 教程

var myfunc = function() {   alert('hi');};setTimeout(myfunc, 2000);

C#

在15年前 Microsoft创造了C# 从那时起 C#不断发展壮大。C#的语法类似于Java(同时也类似于C++)。C#编程软件首选Visual Studio 免费版和付费版都有。

C#是一种强类型的语言 带有一个虚拟机。最初的发行版对函数式编程的支持非常少 在2006前后 Microsoft为这门语言加入了一些函数式编程的特征。和Java一样 C#也有自己的垃圾回收机制。

C# 示例:

示例定义了一个叫做Program的类 Program包含一个叫做Main的函数。程序从Main函数开始运行。Main函数定义了一个强类型的整形变量x 并且在屏幕上打印x的值。学习C# 参阅:C# 教程

using System;class Program{     static void Main(){int x = 1000;Console.WriteLine(x);}}

Java:

Java即将迎来自己的20岁生日 时至今日 Java还在不断的发展、成熟。在2004年 我的一位同事说这是一门"玩具语言"。经历了早期的成长之痛后 Java早已不是一门玩具语言:它支撑起了不可胜数的网站和数据库 开源office套件也是用Java开发的。现在来看 Java的前景依旧一片光明。

Java是一种强类型的语言 运行在自带垃圾回收机制的虚拟机中。尽管不是一种函数式语言 还是带有一些函数式编程的特征。

Java 示例:

Java和C#在很多方面类似。在Java程序中 从main函数开始运行。像上面提到的C#示例一样 在main函数中定义了一个整形的强类型变量x 并且在屏幕上打印x的值。学习Java 参阅:Java 教程

public class HelloWorld{      public static void main(String[] args) {    int x = 1000;|   System.out.println(x);  }}

PHP:

PHP是一种易用的通用编程语言。其语法和Java、C++类似。在一个非常简单的层次上来说 PHP用于在网页中嵌入可变化的文本内容。比如说 在你的网页中可能存在打印当前日期的PHP代码 当你把网页代码送到浏览器 相应的PHP代码就会在屏幕上打印出当前日期。PHP能做的远比在网页上打印日期多。PHP的类库能够操作数据库(几乎你能想到的任何数据库都能处理) 能进行科学计算 能处理文本。PHP的未来依旧一片光明。

PHP 示例:

PHP代码嵌入在HTML文档之中。这段PHP代码将时区设置为Los Angeles 然后打印出当前时间。浏览器解析HTML文档的时候 PHP代码部分被代码的输出结果所取代。所以最终显示在屏幕上的是"Hello! The current time is" 后面是当前时间。学习PHP 参阅:PHP 教程

<html><body>Hello! The current time is<?php   date_default_timezone_set('America/Los_Angeles');   echo (strftime('%c'));?></body></html>

Swift:

这是一门全新的语言 苹果制造。一般来说我不会推荐人们学习一门全新的语言。但是要知道说的是苹果 并且现在你已经能使用这门全新的语言来创建iOS应用了。事实上 已经有迹象显示Swift将会成为iOS平台编程的未来。Swift的语法非常像JavaScript 但是没有分号和括号。

53e16d600894a

Swift是一种强类型的语言 运行在带垃圾回收机制的虚拟机中。

Swift 示例:

示例中定义了一个叫做str的变量 存储一个字符串。尽管没有明确指出str的类型 但是Swift是强类型的 编译器通过赋值语句右边的字符串判断出str是字符串类型。学习Swift 参阅:Swift 入门教程

var str = "Hello, World!"println (str)

Erlang:

Erlang是爱立信的工程师在1986年发明的编程语言。这本来是通信领域专用的编程语言 现在已经发展成一门通用的编程语言 并且在基于云的、高性能的并行计算中大行其道。现在人们使用Erlang编写出了一些强大的软件 比如说CouchDB和Riak。这是一门与众不同的语言 其处理字符串的方式非常奇怪 但是也很容易学习。

应该学习Erlang吗?虽然需要Erlang的工作不多。但是 如果你真正掌握了这门语言 那你很可能得到一份极好的工作。这是一个抉择。在真正掌握这门语言之前 你需要投入大量的精力 一旦你学成 回报也很高。

Erlang 示例:

下面是"hello world"示例的复杂版本。记住 Erlang是一门成熟的语言 如果你真的打算学习这门语言 请访问:http://learnyousomeerlang.com

-module(hello).-export([start/0]).start() ->   spawn(fun() -> loop() end).loop() ->   receive    hello ->    io:format("Hello, World!~n"),    loop();  goodbye ->  ok

写在最后

程序员肯定是在哪都能找到工作 但不一定是你特别喜欢的职位 关键还在于学习真正能用得着的技术 找到那份属于你的好工作。学习JavaScript、C#、Java、PHP、C++不会有错。如果你开始学习Swift 未来的就业形式一片大好。如果你想尝试一把高性能编程 看看Erlang 尽管需要Erlang的工作可能不会马上出现。不管你现在在致力于哪一门语言 都要脚踏实地的学到精 这是关键。

(英文出处:News.Dice 译者:moqiguzhu)