Elixir官网:http://elixir-lang.org/

Elixir是一种函数式动态语言,用于构建可伸缩、易维护的应用程序。

Elixir是基于Erlang VM的,其广为人知的特点是运行低延时、分布式、可容错的系统,并成功用于Web开发与嵌入式软件领域。

1. 平台特性

1.1 可伸缩

所有Elixir代码运行于相互隔离的轻量级线程中,相互间通过message通信:

parent = self()

# Spawns an Elixir process (not an operating system one!)
spawn_link(fn ->
send parent, {:msg, "hello world"}
end) # Block until the message is received
receive do
{:msg, contents} -> IO.puts contents
end

1.2 容错性

关于软件运行在产品环境的一个无法避开的真相:总是会出错,加上网络、文件系统及其他第三方资源的问题会更多。

为了应对各种失误,Elixir提供了supervisor - 描述当事情变得扭曲时如何重启你的系统的某些部分,返回已知的能保证正常运行的初始状态:

import Supervisor.Spec

children = [
supervisor(TCP.Pool, []),
worker(TCP.Acceptor, [4040])
] Supervisor.start_link(children, strategy: :one_for_one)

2. 语言特性

2.1 函数式编程

函数式编程提升了编码风格、帮助开发者写出简短、快速及可维护的代码。例如,模式匹配允许开发者轻易就能结构数据并访问它的内容:

%User{name: name, age: age} = User.get("John Doe")
name #=> "John Doe"

当你想加入guard时,模式匹配允许我们优雅的匹配与声明某些代码执行的特定条件:

def serve_drinks(%User{age: age}) when age >= 21 do
# Code that serves drinks!
end serve_drinks User.get("John Doe")
#=> Fails if the user is under 21

Elixir强烈依赖那些特性,来确保你的软件运行于预期的约束下。如果没有,也别担心,supervisors会帮你擦屁股。

2.2 可扩展能力及领域编程语言(DSL)特性支持

Elixir被设计成了可扩展的语言,让开发者自然的扩展语言到特定领域,以便增加他们的生产力。

举个例子,让我们使用Elixir的测试框架-ExUnit来写个简单的测试用例:

defmodule MathTest do
use ExUnit.Case, async: true test "can add two numbers" do
assert 1 + 1 == 2
end
end

async: true 选项允许测试运行在并行模式,尽可能使用更多的CPU核,同时断言函数可以内省(introspect)你的代码,提供失败情况下的强大报告。那些特性是用Elixir的宏来构建的,让其可以添加新的结构并作为语言本身的一部分存在。

3. 工具

3.1 发展中的生态系统

Elixir发布了整套工具来简化开发。Mix是一套build工具,它让你很简单的就能创建项目、管理任务、运行测试以及更多:

$ mix new my_app
$ cd my_app
$ mix test
. Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

Mix也能管理依赖 - 通过与Hex包管理器整合来实现,其提供了依赖解决、远程抓取包的功能。

3.2 交互式开发

像IEx (Elixir的交互式shell)能提供语言和平台各方面的特性,如自动完成、调试工具、代码重新载入、良好格式化的文档:

$ iex
Interactive Elixir - press Ctrl+C to exit (type h() ENTER for help)
iex> c "my_file.ex" # Compiles a file
iex> t Enum # Prints types defined in the module Enum
iex> h IEx.pry # Prints the documentation for IEx pry functionality

3.3 兼容Erlang

Elixir运行于Erlang VM,给开发者提供了Erlang生态系统的完整访问能力,Heroku, Whatsapp, Klarna, Basho等等很多公司都在使用它来构建分布式、高容错的应用程序。Elixir程序员可以调用Erlang函数并且没有任何运行时开销:

iex> :crypto.md5("Using crypto from Erlang OTP")
<<192,223,75,115,...>>

基于Erlang VM的函数式编程语言Elixir的更多相关文章

  1. 函数式编程语言(functional language)

    内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...

  2. 函数式编程语言(Fuction Program Language)

    一.什么是函数式编程语言 函数式编程语言(functional progarm language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. ...

  3. 函数式编程语言(Functional Program Language)

    (一) 什么是函数编程语言 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 是一种编程典范, ...

  4. Linux下基于Erlang的高并发TCP连接压力实验

    1.实验环境: 联想小型机: 操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本号:Linux server1 2.6.32-35 ...

  5. Functional language(函数式编程语言)初步了解

    对于函数式语言并不太了解,查询了百度.博客.知乎等做了以下总结. What 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分 ...

  6. Frege-基于JVM的类Haskell纯函数式编程语言

    Frege是一门受Haskell语言启示而设计的纯函数式编程语言.Frege程序会被编译为Java,并执行于JVM上.它与Haskell是如此的类似.以至于有人称它为JVM上的Haskell.取Fre ...

  7. swift是面向对象、面向协议、高阶类型、灵活扩展、函数式编程语言

    swift是面向对象.面向协议.高阶类型.灵活扩展.函数式编程语言

  8. 【AMAD】coconut -- 简单,优雅,pythonic的函数式编程语言

    动机 简介 个人评分 动机 作者的话: 我喜欢函数式编程,我认为函数式编程提供了一个更自然的方式来思考问题,并且代码也更加优雅,易读.不过如果你看过前20个最受欢迎的编程语言,你会发现没有一个式函数式 ...

  9. 函数式编程语言LISP,python,haskell,clojure

    说说我自己的背景吧,我是个半吊子的程序员,做任何事情喜欢比较了解然后再尝试,我接触过很多语言,大多数都把它当成工具来使用 我现在的工作大部分主要在于数据挖掘与机器学习方面,也学习web开发,我第一个拿 ...

随机推荐

  1. 04- Shell脚本学习--条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

  2. cmder设置打开时的默认目录

    cmder设置打开时的默认目录 打开cmder自动进入工作目录,怎么配置? http://superuser.com/questions/1005285/run-a-bat-file-with-cmd ...

  3. SVN批处理更新文件夹

    SVN批处理更新文件夹 "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:&quo ...

  4. KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定

    本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...

  5. java集合框架之Set

    Set集合 元素不可以重复,是无序. 方法与list相同 HashSet:不保证set的迭代顺序,不同步,内部数据结构是哈希表 如果存自定义对象则需要覆盖equals和hashCode方法 先比较ha ...

  6. 移动web开发之视口viewport

    × 目录 [1]布局视口 [2]视觉视口 [3]理想视口[4]meta标签[5]总结 前面的话 在CSS标准文档中,视口viewport被称为初始包含块.这个初始包含块是所有CSS百分比宽度推算的根源 ...

  7. Suse碎碎念

    1. 如何查看Suse的版本号 vmpbos01:~ # lsb_release -d Description: SUSE Linux Enterprise Server 11 (x86_64) vm ...

  8. Js杂谈-DOM

    前言 对jQuery的依赖.导致js的原生方法的淡忘,如果是封装自己的库,那势必要用到js的许多原生方法.从Jquery强大的dom处理开始,我们开始回顾javascript那些古老而坚挺的DOM方法 ...

  9. nodejs字符与字节之间的转换

    new Buffer("Hello World").toString("base64"); /* yields SGVsbG8gV29ybGQNCg== */ ...

  10. NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版

    nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...