没有合适的资源?快使用搜索试试~ 我知道了~
理解NS2中的OTcl&tclCL
5星 · 超过95%的资源 需积分: 3 24 下载量 73 浏览量
2011-02-11
11:04:14
上传
评论
收藏 102KB PDF 举报
温馨提示
试读
18页
真正触动我写这篇短文的原因是试图理解NS2的基本原理. 在"the NS2 manual"中, 解释了为 什么采用了两种语言来建构整个系统, 然后在第三章描述了tclcl的六个类. 这个手册中的对各个 类描述性文字让我如坠雾里, 不明所以. 我查找了一些NS2的文章和站点, 有一些ppt倒是很形 象, 但我的认识上总有些模糊. 后来, 我逐渐明白到OTcl/Tcl的嵌入特性. --- 这才是理解NS2框 架的关键. Abstract
资源详情
资源评论
资源推荐
理解
NS2
中的
OTcl/tclCL
题记
真正触动我写这篇短文的原因是试图理解NS2的基本原理. 在"the NS2 manual"中, 解释了为
什么采用了两种语言来建构整个系统, 然后在第三章描述了tclcl的六个类. 这个手册中的对各个
类描述性文字让我如坠雾里, 不明所以. 我查找了一些NS2的文章和站点, 有一些ppt倒是很形
象, 但我的认识上总有些模糊. 后来, 我逐渐明白到OTcl/Tcl的嵌入特性. --- 这才是理解NS2框
架的关键.
Abstract
本文的主要目的是理解
NS2
的
architecture,
了解
NS2
的基本原理
. NS2
采用了
Tcl/C++
分裂
的模型
,
在这种模型中
OTcl
是处于比较关键的位置
, NS2
采用了
Tcl
的编程模式
.
使用
C++
来编
写应用实例
,
使用
OTcl
来操纵这些实例
.
理解了
OTcl
就理解了
NS2
的框架
.
本文先简述
Tcl
语言
的嵌入特性
,
然后描述了
NS2
的应用场景
,
进而分析
NS2
的架构
,
以及实现该架构采用的技术
.
Introduction
NS2
是
MIT
的一个作品
,
它是一个面向对象的网络仿真工具
.
使用
NS2
可以完整的仿真整个网络
环境
,
只要你的机器足够快
:-) NS2
使用一整套
C++
类库实现了大多数常见的网络协议以及链
路层的模型
,
使用这些类的实例我们就可以搭建起整个网络的模型
,
而且包括了各个细节
. ---
这简直就是一种梦想的实现
,
试想如果手头能有这样一个工具
,
我们就可以在单机环境中模拟网
络的各个元素
,
加深对网络的了解和认识
;
同时
,
加快我们开发新协议的速度
.
与NS2类似的软件有OPNET, 这是一个商用的网络仿真软件, 据说它能够针对各款交换机和路
由器来搭建网络, 够牛x. 与之相比, NS2是一个免费的软件, 它可以在Windows/Unix上运行,
我们可以看到NS2的所有源代码, 另外在学术界更多的是采用NS2来做仿真.
NS2
采用了
Tcl/C++
分裂的模型来建构它的应用
,
这样做的好处是显而易见的
.
使用
Tcl
语言我
们可以灵活的配置网络环境
,
定制系统
;
而采用
C++
来编程满足了我们对仿真效率的需要
.
缺点
也是明了的
,
要同时维护两套代码
,
对使用者要求较高
.
NS2的Tcl/C++架构与Windows下的COM/VBScript编程模式有些类似, 使用VC来编写和实
现
COM对象, 然后使用VB来操纵COM对象. Windows提供了COM接口, 这就在系统范围内保
证了这种机制的有效性. --- 这就是Windows的高明之处. 与之相比, NS2则能够使Tcl脚本解
到它的C++类库结构, 同时按照它的类分级来创建对象. --- 这也很了不起.
要使用
NS2
来仿真开发一个新协议
,
就必须对
NS2
的类库进行某些扩展
.
撇开各个协议或链路的
细节不谈, 对NS2的实现机制的了解是一个关键, 否则难免会疏漏百出. 如果不了解NS2的机制,
在刚开始开发协议时, 你看着NS2的代码可能会感觉到无处下手.
NS2
的手册中对它的机制和原理主要在
"the NS manual"
一书的第三章
,
但是这一章的内容写
来就象
tclcl
类的简单介绍
,
读来非常费解
.
它对
NS2
的整体设计思路并没有交待的很清楚
,
本文
就打算解析这第三章背后的话
.
以下的内容安排如下, 首先简单介绍Tcl语言的嵌入特性, 然后描述NS2的应用场景, 分析NS2的
框架, 然后考察实现这个NS2框架所遇到的问题. 最后以一个新协议的添加作为例子, 感受NS2
的仿真开发过程.
嵌入的
Tcl
OTcl
称为
Objected Tcl,
它是在
Tcl
基础上的一个面向对象的封装
. Tcl
语言本身比较简单
,
在
NS2
的主页上有一些相关的链接
,
可以快速了解它的基本语法
,
这里对
Tcl
的语法并不感兴趣
.
Tcl是一种脚本语言, Tool Cammand Language. Tcl语言的吸引人之处在于它简单同时支持
嵌入式应用
.
大家都用过
Ms Word
或
Emacs,
这两种编辑器之所以如此强大
,
很大的原因是因
为它们内嵌了
VB
或
Lisp
语言
.
这些内嵌的脚本能够定制编译器的环境
,
使应用变的非常灵活
.
你可能还听说过
Windows
下的脚本引擎
,
把一个脚本引擎嵌入到
Windows
应用中
,
就可以使这
个应用具有类似
Word
的这种能力
.
在
Unix
下类似的脚本语言嵌入很早就有
,
上面提到的
Emacs
就是一个例子. Tcl语言也支持内嵌, 具体做法是把Tcl的库链接到应用程序中去, 从而使应用具
有解释Tcl语言的能力. 当然仅仅这么做是不够的, 你还要为这个应用定制开发一些Tcl命令.
(NS2
为什么不使用
Lisp
作为内嵌
?
这可能与
OTcl
语言本身也是
MIT
的作品有关
,
而且是
MIT
的
近期作品
.
但是如果采用
Lisp
的话
,
就可以在
Emacs
做这个仿真了
,
呵呵
,
想想都要偷笑了
,
可
惜呀
.
毕竟我是个
Emacs
的拥护者
.)
Figure 1是Tcl C与应用程序集成的原理图. Figure 1中黑线表示C的调用, 红线表示Tcl脚本的
调用. 为了使应用能够解释Tcl语言, 必须在应用程序的源代码中嵌入Tcl C库, 这个库的主要目
的是实现一个Tcl语言的Parser, 并且实现了Tcl语言的一些关键命令, 如set, while, proc等.
应用程序必须还要编写一些针对应用扩展的Tcl命令, 然后注册进Tcl C库, 同时, 应用程序可以
使用Tcl_LinkVar使某些C变量与Tcl库中的环境变量绑定起来.
Tcl C
库的一些函数接口如下
:
z
Tcl_CreateInterp 创建Tcl的Parser;
z
Tcl_CreateCommand/Tcl_CreateObjCommand
注册应用相关的命令
;
z
Tcl_Eval
执行一条
Tcl
命令
;
z
Tcl_LinkVar
将应用程序中的变量与
Tcl
库环境中的变量绑定
;
z
Tcl_GetVar/Tcl_SetVar
设定
/
获取
Tcl
库环境中的变量
;
下面是一个取自文献
2
的例子
:
/*
* Example 47-1
* The initialization procedure for a loadable package.
*/
/*
* random.c
*/
#include <tcl.h>
/*
* Declarations for application-specific command procedures
*/
int RandomCmd(ClientData clientData,
Tcl_Interp *interp,
int argc, char *argv[]);
int RandomObjCmd(ClientData clientData,
Tcl_Interp *interp,
int objc, Tcl_Obj *CONST objv[]);
/*
* Random_Init is called when the package is loaded.
*/
int Random_Init(Tcl_Interp *interp) {
/*
* Initialize the stub table interface, which is
* described in Chapter 46.
*/
if (Tcl_InitStubs(interp, "8.1", 0) == NULL) {
return TCL_ERROR;
}
/*
* Register two variations of random.
* The orandom command uses the object interface.
*/
Tcl_CreateCommand(interp, "random", RandomCmd,
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
Tcl_CreateObjCommand(interp, "orandom", RandomObjCmd,
(ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
/*
* Declare that we implement the random package
* so scripts that do "package require random"
* can load the library automatically.
*/
Tcl_PkgProvide(interp, "random", "1.1");
return TCL_OK;
}
这个例子完整的体现了如何初始化
Tcl C
库
,
如何向
Tcl
库中注册命令
.
这里不打算继续讨论
Tcl C
库的详细问题了
.
毕竟
,
我们的目的是为了理解
Tcl
的嵌入能力
,
上面的原理图已经足够
.
NS2采用的是OTcl来实现它的脚本语言内嵌, 原因是NS2还有一套C++类库. 这个C++类库实
现了网络仿真的各个元素, 仅仅是Tcl来操纵这套类库有些困难. 这关系到NS2的实现, 我们在后
面谈.
OTcl
的语法设计
这一部分的内容主要取自文献
1
,
放在这里的目的有两个
:
一是为了了解
OTcl
的面向对象扩展
,
从而能够方便的理解一些
NS2
的代码
;
二是理解
OTcl
的实现原理
.
文献
1
中主要介绍的是对
Tcl
语言本身的面向对象扩展
,
它没有讲述实现如何操纵一个
C++
的对
象
.
从代码上来看
OTcl
本身好象并没有实现对
C++
对象的操纵
.
OTcl
和
tclCL
的相关文献都比较少
,
这也许就是对
NS2
诟病较多的原因
. OTcl
是
MIT
的一个流媒
体项目
VuSystem
的辅产品
,
它并不是最早提出的
Object
概念的
Tcl,
文献
1
认为
OTcl
的特点是
Dynamic, 能够动态地创建一个对象.
OTcl的语法扩展
对
OTcl
的语法描述
,
更详细的见网页
45678
.
OTcl
的语言设计采用了称为
"Object Command"
的方法
.
每个命令可能被解释成对象
,
而子命
令被解释成传递给对象的消息
.
文献
1
中认为这样做可以比较方便的实现
Tk
的消息机制达到某种
一致
,
同时对象作为
Tcl
语言中
array, list, proc
等要素的补充
,
这种扩展显得比较自然
.
下面是OTcl一个一段示例代码, 我们可以看到对象astack的子命令set, proc等作为消息传递给
对象. 而且要注意它确实是动态的, 在代码解释过程中动态的添加属性和方法.
Object astack
astack set things {}
astack proc put {thing} {
$self instvar things
set things [concat [list $thing] $things]
剩余17页未读,继续阅读
fate0000
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Surfer,线性函数
- MyBatis 的动态 SQL 是其核心特性之一.txt
- 时代的sdddsddsddsd
- 基于哈希链表的简单人员信息管理系统
- 其他类别JdonFramework开源框架 v5.1 Build20071025-jdonframework-5.1.rar
- 2001~2022年上市公司数字赋能指数.dta
- 2001~2022年上市公司数字赋能指数.xlsx
- 信息办公石大在线财务管理系统(含源码)-shidacaiwu.rar
- 信息办公电信计费系统完整代码-netctossconformity.rar
- matlab实现TD-SCDMA中初始同步捕捉DwPTS下行同步导频时隙的仿真.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2