`
andyhu1007
  • 浏览: 194334 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

动态语言

阅读更多

1. 语言的动态特性表示语言具有在运行时确定绑定关系的性质。

 

2. “静态”是一个相对的概念,任何程序设计语言都可以看作具有某种程度的动态特性。一个变量能够在运行时改变自身的值,可以说它具有动态特性,比如最简单的赋值语句:
char ch;
int  m;
ch = cin.get();//从输入流中接收一个字符
m  =  func();  //将func的返回结果赋给m
对字符型变量ch与值的绑定关系要推迟到程序运行时检测到标准I/O流的输入数据才能确定下来,整型变量m的值也要到程序运行时执行了函数func后才能确定。

 

3. 以下都是一些动态特性:

 

    a. 在运行时进行的动态类型检查、动态内存分配都是语言的动态特性的具体表现。

    b. 变量的寻址方式也是一个动态的过程。程序经编译后,获得了变量的相对于程序代码 段(CS)或数据段(DS)的偏移量信息,在程序执行时,操作系统首先将程序装载到内存中足够大小的某个单元中,这个单元的首地址加上变量的偏移量就形成 了变量的存储单元地址。

    c. 此外,面向对象语言中运行时多态性是一个重要的动态特性。

 

    从这个意义上说,早期Fortran语言、C、Pascal都具备一定程 度的动态特性,但比较弱,而Smalltalk、Lisp、Python等语言在运行时可以改变变量的类型甚至时自身的程序结构,我们就认为这样的语言具 有更强的动态特性。

 

4. C++的动态性

 

    比Fortran动态性更强的C/C++语言提供了指针,支持堆栈,提供了malloc/new和free/delete操作,运行时可以动态分配和释放 内存,可以比较灵活地动态生成对象并分配存储空间。此外,C++语言中的RTTI(RunTime Type Identification)机制可以在只有指向某个对象的基类指针的情况下,根据驻留在虚函数表中的类型信息,在运行时确定该对象的准确类型。然 而,C/C++程序中的变量类型仍然需要在编译时确定下来,大部分类型检查也是在编译时完成的,执行前完成了大部分的绑定工作。

 

5. Java和C#的动态性

 

    现在流行的Java和C#语言的动态特性之所以要比C/C++强,是因为Java/C#提供了更强的反射Reflection机制,可以在运行时通过 Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现的interfaces(例如Cloneable),也包括fields和methods的所有 信息,并可于运行时改变fields内容或唤醒methods。

 

6. "动态语言"们

 

    这些语言的变量的类型绑定和类型检查都是在运行时进行的。Perl、Python和Ruby语言可以在运行时修改类的结构或定义, 变量的类型可以按需改变,编写程序时无须声明变量类型。Lisp语言甚至可以在运行时动态地改变自身的代码, Lisp语言对程序代码和数据一视同仁,都看作是存储在内存中的对象,这样数据结构既可作为程序执行,程序也可作为数据进行修改。

 

7. 泛指的动态语言是指:能够在运行时改变程序结构和变量类型的语言。与之相对的概念“静态语言”指的是在编译阶段确定变量或数据对象类型的语言。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics