基于Erlang VM的函数式编程语言Elixir
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的更多相关文章
- 函数式编程语言(functional language)
内容根据百度词条整理! 转载请声明来源:https://baike.baidu.com/item/%E5%87%BD%E6%95%B0%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8 ...
- 函数式编程语言(Fuction Program Language)
一.什么是函数式编程语言 函数式编程语言(functional progarm language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型. ...
- 函数式编程语言(Functional Program Language)
(一) 什么是函数编程语言 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论. 是一种编程典范, ...
- Linux下基于Erlang的高并发TCP连接压力实验
1.实验环境: 联想小型机: 操作系统:RedHat Enterprise LinuxServer release6.4(Santiago) 内核版本号:Linux server1 2.6.32-35 ...
- Functional language(函数式编程语言)初步了解
对于函数式语言并不太了解,查询了百度.博客.知乎等做了以下总结. What 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分 ...
- Frege-基于JVM的类Haskell纯函数式编程语言
Frege是一门受Haskell语言启示而设计的纯函数式编程语言.Frege程序会被编译为Java,并执行于JVM上.它与Haskell是如此的类似.以至于有人称它为JVM上的Haskell.取Fre ...
- swift是面向对象、面向协议、高阶类型、灵活扩展、函数式编程语言
swift是面向对象.面向协议.高阶类型.灵活扩展.函数式编程语言
- 【AMAD】coconut -- 简单,优雅,pythonic的函数式编程语言
动机 简介 个人评分 动机 作者的话: 我喜欢函数式编程,我认为函数式编程提供了一个更自然的方式来思考问题,并且代码也更加优雅,易读.不过如果你看过前20个最受欢迎的编程语言,你会发现没有一个式函数式 ...
- 函数式编程语言LISP,python,haskell,clojure
说说我自己的背景吧,我是个半吊子的程序员,做任何事情喜欢比较了解然后再尝试,我接触过很多语言,大多数都把它当成工具来使用 我现在的工作大部分主要在于数据挖掘与机器学习方面,也学习web开发,我第一个拿 ...
随机推荐
- 04- Shell脚本学习--条件控制和循环语句
条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...
- cmder设置打开时的默认目录
cmder设置打开时的默认目录 打开cmder自动进入工作目录,怎么配置? http://superuser.com/questions/1005285/run-a-bat-file-with-cmd ...
- SVN批处理更新文件夹
SVN批处理更新文件夹 "C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:&quo ...
- KnockoutJS 3.X API 第四章 数据绑定(5) 控制流component绑定
本节目录: 一个例子 API 备注1:仅模板式的component 备注2:component虚拟绑定 备注3:传递标记到component绑定 内存管理 一个例子 First instance, w ...
- java集合框架之Set
Set集合 元素不可以重复,是无序. 方法与list相同 HashSet:不保证set的迭代顺序,不同步,内部数据结构是哈希表 如果存自定义对象则需要覆盖equals和hashCode方法 先比较ha ...
- 移动web开发之视口viewport
× 目录 [1]布局视口 [2]视觉视口 [3]理想视口[4]meta标签[5]总结 前面的话 在CSS标准文档中,视口viewport被称为初始包含块.这个初始包含块是所有CSS百分比宽度推算的根源 ...
- Suse碎碎念
1. 如何查看Suse的版本号 vmpbos01:~ # lsb_release -d Description: SUSE Linux Enterprise Server 11 (x86_64) vm ...
- Js杂谈-DOM
前言 对jQuery的依赖.导致js的原生方法的淡忘,如果是封装自己的库,那势必要用到js的许多原生方法.从Jquery强大的dom处理开始,我们开始回顾javascript那些古老而坚挺的DOM方法 ...
- nodejs字符与字节之间的转换
new Buffer("Hello World").toString("base64"); /* yields SGVsbG8gV29ybGQNCg== */ ...
- NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版
nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...