在运营过程中进行代码替换是“软”实时控制系统的普遍需求,这些系统往往运营时间很长,代码体积也很大。而在特殊处理器上运行或烧录在ROM里的硬实时系统则往往没有这种需求。

    考察程序9.1。

    我们首先编译并加载code_replace的代码。然后我们启动程序,并向创建出来的进程发送消息helloglobalprocess

    最后我们再次编辑程序,将版本号从A改为B,重新编译、加载程序,并向进程发送消息hello

    会话结果如下:

    这里我们看到,在loop/1的执行过程中,虽然我们重新编译、加载了它的代码,但作为loop/1的参数的局部变量N的值仍被保留了下来。

    这与下面这样的写法有细微的差异:

    第一种情况中调用xyz:loop(…)意味着总是使用模块xyz最新loop版本。第二种情况中(不显式指定模块名)则只调用当前执行模块中的loop版本。

    显式使用模块限定名(module:func)使得module:func动态链接至运行时代码。对于使用完整模块限定名的调用,系统每次都会使用最新版本的可用代码进行函数求值。模块中本地函数的地址解析在编译期完成——它们是静态的,不能在运行时改变。