这篇文章讲了最近Elixir的火爆,同时也讲了编程语言的选择。同时,作为一个Erlang爱好者,不得不提Elixir。即使有这么多编程语言,Elixir也值得一试。现在开始使用Elixir对编程语言选择的一些看法Elixir的元编程和DSL许多有用的链接Elixir不是一种新的语言。但最近,Elixir的生态逐渐完善,越来越多的专家开始关注这门语言,并给予Elixir好评。现在接触Elixir一个小的Elixir示例并行处理JSON字符串输入,将其解析为可用变量,计算每秒的处理速度并输出。https://github.com/doubaokun/exsample使用entop监控Elixir应用状态对编程语言选择的一些看法作为语言爱好者,接触过Java、Erlang、Scala、PHP、JavaScript、C#、C、Python、Ruby等等一大堆各式各样的编程语言。有人说学那么多编程语言是为了做“翻译”?事实上,事情并没有那么简单。不同语言的背后,是风格迥异的类库群、技术栈、生态和工具链。不同的语言解决不同类型的问题。有些语言解决某些问题的成本比其他语言低得多。回归本质,学习编程语言仍然是为了高性价比地解决实际业务问题。我喜欢的编程语言风格可以近乎实时地更新和改变。它不需要长时间的编译来执行,应用程序启动很快。Java、C编译很慢,不适合经常修改的项目。而PHP和Node.js修改后马上就能看到,可以大大提高开发效率。***也可以hot-reload就像很多前端工具一样,只要源代码有一点改动,就会自动反映在浏览器中,不需要刷新页面。Play框架的类似自动加载功能也适用。再者,如果能在生产环境热加载,在不影响用户的情况下更新代码就更好了。看到这里,很多人都乐了,PHP默认就是这样的,部署之后刷新APC缓存就可以实现了。这是无状态、短链接HTTP应用程序的优势。虽然性能相对降低了,随之而来的是更多的TCP开销,但是问题简单多了。但是在许多其他语言中很难做到这一点,例如大多数Java应用程序。Elixir和Erlang可以在任何情况下更换跑车的轮子。关于热加载,请看另一篇文章:编程开发中常用的热加载工具。支持并发执行人们更习惯顺序执行的思想,大部分业务逻辑都是顺序执行的。但是为了减少延迟和提高性能,最好在语言层面支持并发执行。例如,一个操作可以在返回结果之前启动另一个操作。这样,调用远程API或远程RPC占用的时间最慢。从这点来看,大多数流行的语言都可以实现并发调用,但是PHP就难了。由于轻量级执行进程或线程的一定局限性,一些业务逻辑必然会因为海量计算、网盘IO等占用一个执行进程或线程。因此,希望这个执行主体能够尽可能的轻量化,以内存占用少,启动时间快,切换消耗小,最后可以在执行IO时自动放弃计算资源。并发与并行我们比较关注并发,较少关注并行。因为通过增加机器数量来抵制大量用户的请求比节省机器更容易也更紧迫。这也是很多动不动就有几百上千台服务器的互联网公司的现状。由于业务逻辑的不同,很难比较用户数和请求数,所以只能比较机器数。并发进程模型PHP就是这种模型的典型。我见过一个异步PHP框架的CS居高不下,甚至比业务逻辑的CPU占用率还高。并发线程模型这种模型比进程模型好很多,因为线程比进程轻很多,创建和切换也快很多。问题:线程和内核线程是多对多的关系,内核线程是有限的。可调度的用户线程有限,无法充分发挥多核性能。创建新线程是昂贵的。IO阻塞不能释放计算资源。每个CPU核同时只能运行一个线程,多个线程之间需要切换调度(CS)。如果是没有或者很少IO操作的CPU密集型计算,最好以CPU核数来启动线程。但是如果有IO操作,比如磁盘或者网络,CPU核过剩的线程是有效的,因为在IO操作的时候,可以切换到其他线程去执行CPU操作。ConcurrentFork-join轻量级进程模型:Fork-join创建自己的进程池来执行小粒度任务。与真正的Erlang抢占式调度VM实现或者操作系统的抢占式调度相比,fork-join模型非常简单,意味着效率相对较低。fork-join是为计算密集型操作而设计的,也就是说你不能因为IO等待而暂时告诉F/J框架释放计算资源。所以一般需要将异步IO操作放在另外一个线程池中,FJ只处理纯计算。基于Scala的Akka就是这样一个模型。因此,如果处理不当,Akka的Actor很容易阻塞执行线程。如果执行线程池中的线程被耗尽,整个应用就会卡在那里。Erlang没有这个问题。ConcurrentErlang轻量级进程模型:VM调度线程并将计算划分为非常小的执行单元。可以支持非常多的进程。IO阻塞可以自动释放资源。真正的抢占式调度。类型系统静态类型可以避免很多错误。动态类型通常会产生不可预测的结果,这违背了UNIX风格的最小意外原则。动态类型可以使开发更快。强静态类型系统会执行的很快,比如Java,但是必要的时候也可以使用反射,比如很多RPC框架的实现(当然还有更进一步的字节码修改技术)。每种语言的类型系统都有自己的特点。丰富的内置结构或容器类***可以区分Interface、Struct和Implementation。您可以轻松地以相对统一的方式定义您需要的结构。GC系统除了Erlang,没有可比的轻量级线程级GC。否则,你要么需要记住和理解复杂的GC调优参数,要么像PHP一样在一段时间后终止进程。元编程在语法层面的抽象和封装以及DSL的扩展性可以提高开发效率。如何在Elixr中实现DSL。执行速度和性能与并发并行模式和多核利用率密切相关。UNIX风格只是意味着模块化;每个模块完成相对单一的功能,复制任务由多个模块组合完成。项目设计就像搭积木。不同模块的输入输出可以拼接。另一种是极简风格。依赖和库管理系统Node.jsnpm是最好的依赖管理系统,这导致了Node.js社区库数量的爆炸式增长。因为创建和分发库非常容易,所以也很容易找到您需要的库。大大提高了开发效率。打包发布系统可以打包成一个文件,方便分发部署。比如Java应用被打包成FatJar包到处执行,或者像Golang一样编译成单个文件。日志系统的真实项目和日志非常重要。日志的重要性在之前的文章中已经提到过。所以一个好的内置日志系统或者说更统一高效的日志方式是非常重要的。***支持丝印、写入文件等功能。这可能不算是一种编程语言的特性,这取决于该语言是否有良好的日志库。Java的SLF是一个比较好的日志系统类库。工具链工程构建、编译、测试工具比较齐全。比如Java和Scala项目的maven和sbt。Erlang项目可以使用rebar,但是Elixir的混用要友好很多倍。另外一个好的REPL命令行工具非常重要,因为它可以很容易地进入应用程序进行调试,或者测试代码片段。比如PHP的php-a、sbt、Clojure的lein、Erlang的erl、Elixir的iex等。脚本执行这是脚本语言的一大优势。小任务可以通过创建脚本立即执行,无需修改、编译和部署现有的正在运行的应用程序。这对于小任务非常重要。Erlang和Elixir都支持运行escript或Elixir脚本。例如,连接到集群,读取状态或执行一次性数据操作,然后断开连接。测试系统***有比较标准的单元测试模型。例如Java、Node.js、Scala、Elixir等。说了这么多,回到Elixir。首先,Elixir的实现与Erlang没有什么不同。Elixir具有Erlang的所有优点。例如:真正的抢占式调度;充分利用多核并行执行;演员模型;监控树;透明分配;极高的稳定性;代码热更新部署;函数式编程;模式匹配;等等,而且Erlang下的很多工具也可以直接使用。比如恩托普。此外,Elixir相对于Erlang的优势在于更友好的语法、工具链和社区。许多以前写过Ruby的人开始写Elixir是因为他们的语法最接近。Elixir的元编程和DSL1。quote将代码转换为AST,很像LISP语法。quotedo:1+22.执行被引用的表达式Code.eval_quoted(quotedo:1+2)3.unquote用于引用范围外的变量quotenumber=13Macro.to_string(quotedo:11+unquote(number))Elixir成熟工具链组合:项目创建、构建工具hex:依赖和库管理系统媲美npmhttps://hex.pm/iex:Erl类似于Erlang既是EPRL又是应用程序启动命令exunit:单元测试工具提示:(Erlang\Elixir\Akka都需要注意不要让某个Actor的Queue积压太多消息成为系统瓶颈,监控Queue长度是非常有必要的。)Erlang,Elixir一些有用的工具和库entopgproc:observer.start()rebar更多有用的Elixir/Erlang库,比如网络库PhoenixWebframework,常见的MySQL,Redis,MongoDB库:https://github.com/h4cc/awesome-elixir很多有用的链接https://en.wikipedia.org/wiki/Strong_and_weak_typinghttps://en.wikipedia.org/wiki/Unix_philosophyhttps://en.wikipedia.org/wiki/Fork%E2%80%93join_modelhttps://en.wikipedia.org/wiki/Preemption_(计算)http://yosefk.com/blog/parallelism-and-concurrency-need-different-tools.htmlhttps://www.subbu。org/blog/2012/03/async-io-and-fork-joinhttp://www.slideshare.net/zacharycox/dont-blockhttp://stackoverflow.com/questions/4436422/how-does-java-使用多核http://cabol.github.io/programming-languages-and-multicore-crisis/http://www.neo.com/2013/08/27/two-days-with-长生不老药http://learningelixir.joekain.com/profiling-elixir/https://github.com/d0rc/exrabbit/blob/master/lib/exrabbit/dsl.exhttp://blog.jonharrington.org/elixir-and-码头工人/http://www.smashingmagazine.com/2013/04/编程类系统介绍/
