热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Erlang还是蛮有趣的

最近抽时间看了些Erlang的东西,蛮有趣,纯正的函数式编程,进程消息的编程模型。当然,我最关心的的还是隐藏在语言设计背后关于构建健壮的系统基本哲学。函数式编程这个东东已经算

最近抽时间看了些Erlang的东西,蛮有趣,纯正的函数式编程,进程/消息的编程模型。当然,我最关心的的还是隐藏在语言设计背后关于构建健壮的系统基本哲学。

 

函数式编程这个东东已经算不上新鲜了,本来也不新鲜,Lisp里面早就有了。Erlang看上去是很纯正的FP语言,looks good!不过我个人对FP一直有点担心的就是这个东西离机器模型实在是太远,很多操作看上去倒是很美很直观外加简洁,比如用三两行代码就可以搞定快速排序,不过它底下到底是如何实现的就不清楚了,效率如何也不知道。尽管是开源的,老是去看源代码也不现实吧。理解它代码模式匹配的时候倒是让我想起了C++里面的template,模板元编程这鬼东西不就是这样一个匹配再匹配的过程吗。当然,如果FP实现的东东成为效率瓶颈的时候,一可以换算法(这里指的实际是换写法,比如快牌的算法不变,但是可以采用不同的表达),二可以用其它语言比如C实现后混合语言调用,现在不是提倡混合语言开发嘛。如果考虑到80/20法则,其实更重要的还是需要大家转变思维。

 

其实以前也看过些介绍Erlang的小文章,听说它可以随意创建进程,当时就是一惊,要知道OS里面创建、管理和销毁进程可都是些绝对重量级的操作啊。深入了解后才发现Erlang里面的进程并不是操作系统里面的进程。学过操作系统原理的人都知道,任何程序实际上都是在一个线程(Thread)里面运行,或者说任何一段code执行的时候总是对应着一个ThreadInfo,里面记录了code当前运行的一陀信息。而进程只是一堆资源的集合,换个说法就是进程里面的这些资源只能在进程内部访问,跨进程访问一般都是非法的,Windows下应用程序偶尔会出现的非法地址访问,其实就是试图访问不属于自己进程的资源被操作系统reject了:) Erlang里面的进程实际上就是在Erlang虚拟机上面的资源集合,因为这个进程只是属于Erlang专用的,它只需要对Erlang虚拟机负责,所以直觉上可以想象它只需要支持有限的操作,也不需要考虑什么兼容性等烦人的问题,所以就是一个最原始也最标准概念上的进程。现在回过头来想想也是,就是表示一个资源的集合,本就应该和OO里面的一个Object没什么区别。一个Object表示的是数据和相关的操作,进程表示的是资源的集合。我们在任何一种OO语言里面编程的时候99.99999...%的时间是不用担心创建对象的数量的,当然我们在Erlang里面创建进程的时候也不应该有什么担心。

 

Erlang的目标是用以构建安全、稳定大规模系统,但是任何有理智的人都知道,大型系统是决不可能bug free的(简单的程序有没可能?我不知道)。即便除开硬件等其它因素,但就软件本身而言,无论语言怎么设计,developer如何高超,测试如何系统,anyway,传说中的臭虫总会在夜深人尽的时候跳出来捣乱。Joe爷爷在Erlang里给出的解决办法本质上还是降低模块间的耦合度,既然错误不能避免,那就应该尽可能地让错误限制在更小的范围内,而且最好是能够从错误中恢复过来。进程的概念本身就是用来管理资源访问的,Joe爷爷把它用到Erlang里面自然是理所当然。像我等凡夫俗子,一直都天真地认为进程是属于操作系统的,差距啊!

 

至于消息就没什么可说的了,既然一切都是进程,而内存又无法在进程间共享,消息机制当然就是进程间合作的最佳选择了。


另外值得一提的是“进程+消息”这种模型最近可是没少露脸。除了Erlang,微软研究院(MSR)开发的singularity原型操作系统,IE8,Google chrome,包括周鸿祎的360浏览器据说都使用了类似的思想。而且像COM,.NET中的AppDomain等也都可以说是神似。另一门语言Python采用的是OS原生的线程+锁机制,不过据说Guido也有意在未来采用多虚拟机+IPC通信的方式来增强Py的scalability,看来这种模型已经是被大家公认的解决方案了。

 

关于构建大型系统的基本思想,Joe的博士论文《面对软件错误构建可靠的分布式系统》讲的深入浅出(链接里面中、英文版的都有),推荐大家有空读下,相信一定和我一样受益匪浅 (题外话:不知道Joe的这种没有一个公式的论文在国内能否通过评审,呵呵...)


推荐阅读
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • MySQL笔记_MySQL笔记1|数据库17问17答
    本文由编程笔记#小编为大家整理,主要介绍了MySQL笔记1|数据库17问17答相关的知识,希望对你有一定的参考价值。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
author-avatar
万花_筒乙姬睦美
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有