2007/02/28

Erlang 的运行时更新

Erlang 作为电信级开发语言,在设计之初就有了在运行时自动更新程序,也就是不停机打patch的能力。 首先这种功能对于电信级别的程序来说,是非常必要的,如果不能做到这个5个9基本上就是空谈了。

然而对于传统的使用C/C++或者Java开发的程序而言,全面支持这种能力是非常复杂的,这种复杂性主要是有由于C/C++ 语言的自身特性所决定的。由C语言开发的程序的运行态,在地址空间中一般都具有4个以上的sections:
  1. text/代码段 就是程序本身
  2. data/数据段 用来保存全局变量,静态变量,以及未初始化的变量;
  3. stack/程序堆栈 用来保存当前线程的临时变量 对于C/C++ 来说它保存了程序的运行状态;
  4. heap/堆 用来保存程序运行中分配的临时变量;

text 在连接程序完成之后就确定的,对于同一份源程序产生的都是完全一样的。
data 在程序的连接完成之后,它在内存中的位置也已经确定,但是内容可能会随运行态改变。
stack 和 heap 则是完全动态的,而一个运行程序的stack数量和他所具有的thread数量相对应。基本上可以认为这两个段不能够采用认可以预定义——简单替换的方式进行更新,它们的内容对于非运行系统而言是不可知的。

因此为一个处在正在运行中的应用打补丁,需要:
  1. 不改变text代码段中的函数的入口地址。因为在stack中会保存这些函数的入口地址,如果改变了它们的地址,必将导致程序跑飞。
  2. 不能改变text代码段中所有已有函数的参数或者调用方式。
  3. 不能在中间增加数据段中全局变量。因为这将改变已有的全局变量的地址,使代码引用错误的变量。
  4. 不能简单替换数据段中的变量内容,即不能随意修改源程序中非const全局变量的内容。
然而对于C/C++程序而言,如果需要不停机打patch,这是最基本的要求。而在实际工作中,很难要求所有的fix都满足上面的要求! 其实也能做,但是代价太高了~~~。

Erlang 只有代码段,没有数据段,所有数据都动态,实现这样的功能确实要简单很多。而且 Erlang 又是已虚拟机的方式运行,替换代码段的难度又有所降低。

对于 Erlang 而言,运行时程序更新,这样的功能就算是水到渠成吧!

2007/02/11

关于 Erlang

在国内小程序员的圈子里,高水平的不多,但是跟风的水平还是不低的,C/C++, VB, Delphi, Java, C#, Perl, Python, PHP, Lua, JavaScript, Rudy, Haskell, Erlang...... 随风而来。不才也跟了一把风 Erlang 了一把! 说起这个 Erlang 真正令我感兴趣的地方是——它是由 Ericsson 开发出来的用于电信级应用程序开发的语言。说来惭愧现在也算是在电信圈子里面(当然不在Ericsson) 讨生活的菜鸟吧! 不由自主地对别人如何做同样的东西有兴趣。 算起来也在上面画了N个小时了,有点感受也记录下来总也不算是枉费了这些时间。

首先,Erlang 诞生于于1980年代,在 Ericsson Computer Science Laboratory,虽然没有官方的说明,当时我个人感觉,Erlang的根本源于LISP,虽然语法上作了一些变化,但是语言的本质上确是不可回避的LISP风骨:函数语言,自动内存管理,原子概念,LIST/表操作,不一而足,虽然从语法上作了一些改变,摒弃了繁复的"()", 引入了 "->", ",", ";", "." 这样只是更加突出了函数的定义和使用时的方便性。

其次,为了函数语言能够在工程实践中具有实际应用,Erlang在语言层次上引入了许多辅助的功能。1)Erlang从语法层次上定义了一种引入副作用(side effect)的方法进程间消息的发送—— Pid ! Message , 与接收 Receive。这与 Erlang 虚拟机的轻量级进程相结合,无疑是提供了一个颇具工程价值的强悍的函数式语言;2)引入的模块(module),函数输出/输入定义(export/import),引入宏; 3)增强的 Term 匹配; 4)引入异常处理机制(try/catch),5)引入 tuple 以及 record 数据类型。
不过坦白的讲,除了第一点进程间消息的发送与接受具有些实质上的意义之外,异常及其处理机制,tuple数据类型,感觉上却有些画蛇添足之感,这些变化只是让程序设计的复杂性有所增加,并没有什么实质性的提高。
特别是异常这样的东西,很有可能是受了这些年 C++/Java语言的毒害吧,就结构化程序而言,我们还可以异常可以简化程序的正常流程,增加可读性。可是对于函数式语言除了需要多些try/catch这样的另类语法,我们又得到了什么呢?赫赫,只能是仁者见仁智者见智了!

还有,Erlang/OTP 为程序开发人员提供了一个相当完善的,可以李可使用的程序库 OTP。在当前的这个软件开发时代。一个高质量,高易用性的 library 对于语言的发展有着非常大的推动作用,Java语言,也正是凭借着功能丰富,充分文档化的Java API在当今程序设计领域占据着重要地位的。对于一个电信设备专用语言而言,OTP已经为我们提供了,SNMP Agent, CORBA, CORBA IDL, CORBA Event, 数据库。确实极大的方便了设备开发人员的工作。

再就是 Erlang 的 soft real-time 特性。 以及 Erlang 的虚拟机。基本上可以认为Erlang编译出来的程序式平台无关的, Erlang设计的程序可以运行在Linux/Windows/Solaris平台。 这样就可以构造 Linux + Erlang 德超强组合。也算是开拓了电信设备设计的一种新思路吧!

Ericsson 会把这样的东西放出来还真是很有意思的,就如同在 Erlang 的 FAQ 中写的

10.4. Why is Ericsson giving away Erlang?
(The following is my personal impression. I don't speak for Ericsson!)

Nothing to lose: Ericsson's core business is telecommunications products, selling programming tools is not really a business Ericsson is interested in.

Stimulate adoption: Erlang is a great language for many sorts of systems. Releasing a good, free development environment is likely to make Erlang catch on faster.

Generate goodwill: Giving away cool software can only improve Ericsson's image, especially given the current level of media attention around "open software".

2007/02/03

Common Lisp HyperSpec

曾经在研究生阶段上过一门计算机系开设的人工智能基础的课程。
在课程的最后还用clisp完成了一个寻找最佳乘车路线的程序作为课程设计。
当时对clisp真的没什么感觉,就是一堆的括号 (((((...).(...)))))
CLISP 就是 Common List 是 ANSI X3J13 标准化之后的Lisp语言
这也算是我对Lisp的一点儿初步的认识吧!

说起来 LISP 也算是自成一派的人工智能语言, 函数语言的基础。
Lisp之根源中文版
,以及英文原版 The Root of Lisp 可以算是Lisp入门必读了吧!

看到Lisp就会感觉到人类智慧的伟大!
于lisp相比 XML就有点儿太丑陋了!

BlockChain 相关电子书

@copyright of Sam Chadwick   - https://thehub.thomsonreuters.com/groups/bitcoin/blog/2017/09/10/blockchain-paper Blockchain Papers A c...