有段时间没有更新博客了,最近稍微接触了下一门相对小众的语言Erlang,个人感觉学习一段时间有必要总结总结,本文作为该系列的开篇,仅仅列举一些与Java的一些不同点和个人对Erlang的一些主观印象,权当自己学习之路上的一丝痕迹。
Erlang的来历?
Erlang is a general-purpose concurrent, garbage-collected programming language and runtime system. The sequential subset of Erlang is a functional language, with strict evaluation, single assignment, anddynamic typing. For concurrency it follows the Actor model. It was designed by Ericsson to support distributed, fault-tolerant, soft-real-time, non-stop applications. It supports hot swapping, thus code can be changed without stopping a system.[1] |
----以上摘自维基百科
源于1981年开始的一个研究项目,该项目的目的是探索更好的编写电信应用软件的方法。电信类应用都是一些大型的程序,虽然经过了严密的测试,但是投入运行后还是难免会有许多错误。我们假设这些程序不可避免地会含有错误,进而寻求在软件包含错误的情况下构建可靠系统的方法。该项研究的成果是开发出了一种新的编程语言(Erlang),一门设计方法学,和一个用以构建健壮系统的程序库(OTP)
----以上摘自Erlang之父Joe Armstrong于2003年发表的论文:Making reliable distributed systems in the presence of software errors
Erlang与主流语言的区别?
Erlang是一门面向消息的语言(message-oriented language);
没有for,控制逻辑简单只有if 和 case,没有else,没有continue break goto,what???(想迭代用递归);
万物皆进程,并发靠通信;
进程具有强隔离性(strong isolation),一个进程因错误而结束,不会影响到其他进程;
唯一的一门并发上做到公平调度的语言;
没有共享内存,没有锁(但不代表不存在竞态条件,需求导向下,依然会隐式地使用锁的替代机制);
快排只需5行(???);
变量Immutable(没想到吧);
不存在布尔类型,平时我们用的true和false都是原子而已(???);
不同类型不能相加,但可以比较(1<false返回true,抓狂了吧);
将同名,但参数不同数量的方法视为不一样的两个方法(不同于Java的方法重载,经常弄错结尾符号);
进程要么好好跑,要么死翘翘;
神奇的模式匹配(读写记录,加载函数,处处都用的到);
丰富的工具集;
内存缓存解决方案ETS(检索时间为常量而且为常量值);
极其轻量的进程(一个Erlang进程大概300个字,创建只需几微秒);
系统高容错;
支持代码热更新(不用等到凌晨没人的时候更新了);
适合构建分布式并行计算系统;
大佬们评价Erlang就是并行计算的未来(火钳刘明)。