“Languages”的版本间差异

来自osdev
跳到导航 跳到搜索
(创建页面,内容为“There are many '''programming languages''', some more suited for OS development and kernel writing than others. 本页将对此进行深入讨论。 == History == 早期的操作系统完全是用各自CPU的Assembly语言方言编写的,对于当前愿意投入时间和精力使用它的开发人员来说,这仍然是一个选择。 即使操作系统主要是用高级语言编写的,仍然有一些部分只能在汇编中…”)
 
第1行: 第1行:
There are [[:Category:Languages|many]] '''programming languages''', some more suited for OS development and kernel writing than others. 本页将对此进行深入讨论。
[[:Category:Languages|许多]]'''编程语言''',其中有些比其他的更适合操作系统开发和内核编写。 本页将对此进行深入讨论。


== History ==
== 历史 ==


早期的操作系统完全是用各自CPU的[[Assembly]]语言方言编写的,对于当前愿意投入时间和精力使用它的开发人员来说,这仍然是一个选择。 即使操作系统主要是用高级语言编写的,仍然有一些部分只能在汇编中完成。 操作系统开发人员的一个重要子集选择专门在汇编中工作,至少有一些直接在机器语言中工作(尽管这在今天是罕见的)。
早期的操作系统完全是用各自CPU的[[Assembly|汇编]]方言编写的,对于当前愿意投入时间和精力使用它的开发人员来说,这仍然是一个选择。 即使操作系统主要是用高级语言编写的,仍然有一些部分只能在汇编中完成。 甚至一部分很特殊的操作系统开发人员专门选择在汇编中工作,还有一些直接在机器语言中工作(尽管这在今天是罕见的)。


在过去,许多高级语言被用于操作系统开发,包括[[C]]、Forth、Lisp、[[CSharp | C#]]、[[C++]]、Modula-2、[[Ada]]、Bliss、Smalltalk和PL/1。然而,并非所有语言都适合于操作系统开发,而且在C以外的许多语言中,为了提供支持语言抽象的适当运行时环境,需要进行大量的汇编开发。 诸如C、Modula-2、Ada、Bliss、PL/M和XPL之类的语言都是专门为底层系统编程而设计的,无论是在OS-dev还是嵌入式系统中,而诸如Forth之类的语言都包含了必要的底层功能,即使它们不是专门用于此目的。
过去,许多高级语言被用于操作系统开发,包括[[C]]、Forth、Lisp、[[CSharp | C#]]、[[C++]]、Modula-2、[[Ada]]、Bliss、Smalltalk和PL/1。 然而,并不是所有的语言都适合OS开发,并且在除C之外的许多语言中,为了提供支持语言的建模抽象能力需要提供适当的运行时环境,这又会需要进行相当数量的汇编语言开发。 无论是在OS-dev还是嵌入式系统中,诸如C、Modula-2、Ada、Bliss、PL/M和XPL之类的语言都是专门为底层系统编程而设计的。而诸如Forth之类的语言都包含了必要的底层功能,即使它们不专门用于此目的。


== 警告 ==
== 警告 ==


不是所有的语言都适合于低级系统编程{{{},没有合适的低级开发工具可用,或者需要特定的运行时支持,C不会遇到这样的问题。 此外,绝大多数与操作系统相关的资源(如教程和操作示例,包括本wiki)都假定C是主要的开发语言,因此操作系统开发人员至少应该能够阅读C代码。
不是所有的语言都适合于低级系统编程{{which}},它们要么没有合适的低级开发工具可用,要么需要特定的运行时支持,而C不会遇到这样的问题。 此外,绝大多数与操作系统相关的资源(如教程和操作示例,包括本wiki)都假定C是主要的开发语言,因此操作系统开发人员至少应该能够阅读C代码。


使用C以外的语言需要付出大量额外的努力。 但也有[[Alta Lang |一些开发者]]愿意投入这一努力,以使操作系统的开发符合他们的思维方式(例如:[https://en.wikipedia.org/wiki/Programming_paradigm编程范例)。
使用C以外的语言需要付出大量的额外努力。 但也有[[Alta Lang |一些开发者]]愿意投入这一努力,以使操作系统的开发符合他们的思维方式(例如:[https://en.wikipedia.org/wiki/Programming_paradigm 编程范例)。


另一方面,试图用解释语言或字节码语言(如Perl或Java)编写操作系统具有极大的挑战性,因此不太可能成功。 当然,有一些关于它的研究项目,但迄今为止,没有任何东西完全改变我们编写内核的方式。 如果要尝试用HTML编写操作系统……我觉得你还是先再学习一段时间再来弄。
另一方面,试图用解释语言或字节码语言(如Perl或Java)编写操作系统具有极大的挑战性,因此不太可能成功。 当然,有一些关于它的研究项目,但迄今为止,还没有任何东西完全改变我们编写内核的方式。 如果要尝试用HTML编写操作系统……我觉得你还是先再学习一段时间再来弄吧。


所以,你被警告了。现在你应该做出选择,希望是明智的选择。
所以,忠告已经传达了。现在你应该做出选择,希望是明智的选择。


== 我可以使用XYZ语言吗? ==
== 我可以使用XYZ语言吗? ==


; 如果你想知道你最喜欢的语言是否适合OSDeving,请考虑最重要的原则—— 应该有一种用你的语言做低级事情的方法。
; 如果你想知道你最喜欢的语言是否适合开发操作系统,请考虑最重要的原则—— 应该有一种用你的语言做底层工作的方法。


Also before you start it worth to answer the following questions:
同样,在开始之前得回答以下问题:
* 您能否处理具有特定位和字节排列的数据结构(例如,MMU结构和类似的东西是必需的)?或者你有相应的工具吗?
* 你能否处理具有特定位和字节排列的数据结构(例如,MMU结构和类似的东西是必需的)?或者你有相应的工具吗?
* 你能控制内存分配/释放吗?或者,您至少可以将一大块内存细分为其他函数可以透明使用的小块内存(对于任何类型的内存管理都是必需的)?这里的重要结果是——你的语言对你的个人记忆管理器有什么支持吗?
* 你能控制内存分配/释放吗? 或者,你是否可以至少将大块内存细分为其他函数可以透明使用的较小块(对于任何类型的内存管理都是必要的)? 这里的重要后果是-你是否能以自己的语言获得个人内存管理器的某种支持?
* 您是否能够构建一个自给自足的运行时库来支持所需的语言功能?
* 你是否能够构建一个自给自足的运行时库(run-time library )来支持所需的语言功能?
* 您能否轻松地将XYZ与一些汇编代码连接起来(是的,您将拥有“some”,至少在您必须编写的运行时库中是这样的)?
* 你能否轻松地将XYZ与一些汇编代码连接起来(是的,你将拥有''一些''汇编代码”,至少在你编写底层运行时库(run-time library)时必须是这样的)?
* 如果XYZ适合其他点,并且是一种解释语言,那么您能否使用XYZ调用来自原始数据字节的代码,即在特定地址跳转并继续执行(这对于加载和运行程序是必需的)?
* 如果XYZ适合其他点,并且是一种解释语言,那么你能否使用XYZ调用来自原始字节的代码,即向特定地址跳转并继续执行(这对于加载和运行程序是必需的)?


如果这些问题中的任何一个被证明是“哎呀,不,我不能用语言XYZ做到这一点”,那么XYZ很可能对操作系统开发没有帮助。 这一特殊问题通常通过修改语言和编写新的编译器来解决。
如果这些问题中的任何一个被证明是'哦不,我不能用语言XYZ做到这一点',那么XYZ很可能无助于操作系统开发。 这些特殊问题通常都需要通过修改语言和编写新的编译器来解决。


== 我能不能为XYZ编写编译器? ==
== 我能不能为XYZ编写编译器? ==


编译器是软件中少数几个与操作系统具有相似复杂性的东西之一。 既然你已经在计划写一个操作系统,那么决定做一个编译器就好像找到了锻造金属的新方法来制造一辆更好的汽车。 尽管如此,还是有[[Alta Lang |一些OSDevers]]认为自己能够迎接挑战。 规范的起点是“龙之书”([[Books]]页上的“编译器-原理、技术和工具”)。
编译器是软件中少数几个与操作系统具有相似复杂性的东西之一。 既然你已经在计划写一个操作系统,那么决定做一个编译器就好像是去找锻造金属的新方法来制造一辆更好的汽车。 尽管如此,还是有[[Alta Lang|一些OSDevers]]认为自己能够迎接挑战。 经典的教程是"龙书"(参考[[Books|书籍]]页上的''编译器-原理、技术和工具'')。


然而,这并不意味着您可以忽略C和汇编;事实上,汇编对于编译的代码生成步骤比对于操作系统开发更为重要(除非您完全避开高级语言),对于编译器设计者来说,必须牢牢掌握目标语言。 另外,正如已经说过的,关于OS-dev的大部分信息都是面向C开发人员的,除非您打算完全独立工作,否则至少必须具备阅读C的扎实能力。
然而,这并不意味着你可以忽略C和汇编; 事实上,对编译的代码生成阶段来说,理解汇编比对操作系统开发更重要(除非你完全避开高级语言), 对于编译器设计人员来说,扎实掌握目标语言(译者注:这里指汇编语言)是必须的。 另外,正如已经说过的,关于OS-dev的大部分信息都是面向C开发人员的,除非你打算完全独立工作,否则至少必须具备阅读C的扎实能力。


同时,考虑一下:你的编译器会用什么语言编写?汇编语言很笨重,所以您可以选择C语言,或者您最喜欢的语言XYZ。 如果您使用后者,您将如何引导自己?如果使用前者,则需要移植libc和GCC——您“确实”希望成为自托管。。。正当
同时,再考虑一下:你的编译器会用什么语言编写?汇编语言当然不是首先,所以你又得选择C语言,或者还是你最喜欢的语言XYZ。 如果你使用后者,你将如何引导自己?如果使用前者,则需要移植libc和GCC——到现在你还“确定”希望开发自托管的语言吗?


== 但我听说过一个用XYZ语言编写的操作系统,不是吗;它不是被解释的吗? ==
== 但我听说过一个用XYZ语言编写的操作系统,它不是解释语言吗? ==


这是一个骗局。  没有所谓的“解释语言”。 任何语言都可以使用解释器或编译器来实现;即使在一个操作系统项目中,也有一些形式的“解释”可以应用于系统操作。
这是一个骗局。  没有所谓的'解释语言'。 任何语言都可以使用解释器或编译器来实现;即使在一个操作系统项目中,也有一些形式的'解释'可以应用于系统操作。


您可能会不时听到用语言编写的操作系统,这些语言通常会被解释,或者使用某种解释器:JavaOS, [http://en.wikipedia.org/wiki/Genera_%28operating_system%29 Genera] (the Symbolics Lisp Machine OS), Pilot-OS (the system for the [https://en.wikipedia.org/wiki/Xerox_Star Xerox Star] workstation, written mostly in the Mesa language), UCSD Pascal, the various Forth systems, etc. Most of these fall into one of three categories :
你可能会不时听到用某些语言编写的操作系统,这些语言通常是解释执行的,或者使用了某种解释器的:JavaOS, [http://en.wikipedia.org/wiki/Genera_%28operating_system%29 Genera] (the Symbolics Lisp Machine OS), Pilot-OS ([https://en.wikipedia.org/wiki/Xerox_Star Xerox Star] 工作站的系统,主要用Mesa语言编写),UCSD Pascal,各种Forth系统等。 其中大部分可分为三类:
* The operating system runs in a low-level interpreter, written in Assembly or some systems language like C, which is what actually interacts with the hardware. In effect, the 'operating system' is just an application running on top of another, lower-level OS. Pilot-OS, UCSD Pascal, and some Java OSes work like this, though they also have some modules which are compiled to native code as well (see below).
* 操作系统运行在用汇编语言或某些系统语言(如C)编写的低级解释器中,这实际上才是与硬件交互的语言。 实际上,这里的所谓'操作系统'只是在另一个较低级别的操作系统上运行的应用程序。 Pilot OS、UCSD Pascal和一些Java操作系统都是这样工作的,不过它们也有一些编译成本机代码的模块(见下文)。


* 全部或部分代码已编译为本机代码。 这可能涉及到使用语言的子集,以减少运行时需求 (e.g., [http://www.citeulike.org/user/hamish/article/201596 Pre-Scheme], or [http://www.squeak.org/features/vm.html Slang] - 虽然到目前为止,它们还没有用于操作系统开发,但它们确实演示了这种低级别的实现语言,可以这样使用)。
* 全部或部分代码已编译为本机代码。 这可能涉及使用具有减少的运行时要求的语言的子集(例如,[http://www.citeulike.org/user/hamish/article/201596 预方案], 或者 [http://www.squeak.org/features/vm.html Slang] - 虽然到目前为止,它们还没有用于操作系统开发,但它们确实演示了这种低级别的实现语言,可以这样使用)。
   ** 基于'''Forth'''-的操作系统就是这种情况的特例。 尽管通常被描述为一种解释性语言, [http://en.wikipedia.org/wiki/Threaded_code线程代码解释器]许多FORTH系统使用的工作方式与大多数其他解释器不同;实际上,解释器将遍历代码所包含的各种Forth“字”,直到它到达在汇编或编译代码中实现的低级字,这就是实际执行的字。 此外,Forth系统包含一种特殊类型的汇编程序,它生成专门供解释器使用的代码;此外,常用的“单词”可以根据需要编译成本机代码。 Finally, many embedded Forth systems use special-purpose hardware (see below) to support the language.
   ** '''Forth'''-基于Forth的操作系统是这种情况的特例。 尽管通常被描述为一种解释性语言, [http://en.wikipedia.org/wiki/Threaded_code 线程代码解释器],许多FORTH系统使用的工作方式与大多数其他解释器不同;实际上,解释器将遍历代码所包含的各种Forth 'Words',解析到在汇编或编译代码中实现,然后再实际执行。 此外,Forth系统包含一种特殊类型的汇编程序,它生成专门供解释器使用的代码;此外,常用的“Word”可以根据需要编译成本机代码。 最后,许多嵌入式系统是使用专用硬件(见下文)来支持该语言。
   ** 大多数“Lisp”系统可以自由地混合解释和编译代码,自20世纪70年代末以来,在几乎所有“严肃”的Lisp系统中,Listener REPL(Lisp系统的“命令行”)不是一个解释器,而是一个编译系统——每一段代码至少都是动态编译的。 虽然没有任何重要的Lisp操作系统是在不使用特定语言的硬件支持(见下文)的情况下开发的,但如果有,它肯定不是一个纯粹的解释系统。
   ** 大多数'''Lisp'''系统可以自由地混合解释和编译代码,自20世纪70年代末以来,在几乎所有'严肃'的Lisp系统中,Listener REPL(Lisp系统的'命令行')已不再是一个解释器,而是一个编译系统——每一段代码至少都是动态编译的。 虽然没有任何重要的Lisp操作系统是在不使用特定语言的硬件支持(见下文)的情况下开发的,但如果有,它肯定不是一个纯粹的解释系统。
* 该系统运行在专门的硬件和微码上,这些硬件和微码充当其主要语言的硬连线“解释器”,或它通常使用的可移植字节码。 这种类型的系统包括SOAR(RISC上的Smalltalk)、Recursiv系统、Lillith Modula-2系统和Burroughs 6500(60年代设计用于运行Algol-60的大型机)。 这些系统的编程技术无法在库存硬件上工作。 For example:
* 这类非通常概念上的解释系统运行在专门的硬件和微操作码(microcode)上,这些硬件和操作码充当其主要语言的固化'解释器',或它通常使用的可移植字节码。 这种类型的系统包括SOAR(RISC上的Smalltalk)、Recursiv系统、Lillith Modula-2系统和Burroughs 6500(60年代设计用于运行Algol-60的大型机)。 这些系统的编程技术无法在常规硬件上工作。 例如:
   ** The '''[http://en.wikipedia.org/wiki/MIT_CADR MIT CADR] Lisp machine architecture''' had an extensive instruction set with hardware support for certain high-level operations such as type-tag checking and GC. It had a [http://en.wikipedia.org/wiki/Tagged_architecture tagged architecture] meaning that a portion of the 36-bit addressing word was designated for type information. Typically these machines had a variety of compilers including one for the system language Lisp which was capable of taking advantage of the additional instruction set.
   “”[http://en.wikipedia.org/wiki/MIT_CADRMIT CADR] Lisp机器体系结构''' 有大量的指令集,由硬件支持某些高级操作,如type-tag checking和GC。 它有一个[http://en.wikipedia.org/wiki/Tagged_architecture 标记体系结构]意味着36位寻址字的一部分被指定用于类型信息。 通常,这些机器有多种编译器,包括一个用于系统语言Lisp的编译器,该编译器能够利用额外的指令集。
   ** The '''Rekursiv Single-Board Computer''' had hardware support for a writable instruction set (that is, you could dynamically add microcode instructions) and associative memory dispatch tables for supporting object-oriented programming.
   ** '''Rekursiv Single-Board Computer'''硬件支持可创作指令集(即,你可以动态添加微操作码指令)和关联内存调度表,以支持面向对象编程。
   [[Category:Languages]]
   [[Category:Languages]]
   [[Category:OS Development]]
   [[Category:OS Development]]
   [[Category:FAQ]]
   [[Category:FAQ]]

2022年2月19日 (六) 00:06的版本

许多编程语言,其中有些比其他的更适合操作系统开发和内核编写。 本页将对此进行深入讨论。

历史

早期的操作系统完全是用各自CPU的汇编方言编写的,对于当前愿意投入时间和精力使用它的开发人员来说,这仍然是一个选择。 即使操作系统主要是用高级语言编写的,仍然有一些部分只能在汇编中完成。 甚至一部分很特殊的操作系统开发人员专门选择在汇编中工作,还有一些直接在机器语言中工作(尽管这在今天是罕见的)。

过去,许多高级语言被用于操作系统开发,包括C、Forth、Lisp、 C#C++、Modula-2、Ada、Bliss、Smalltalk和PL/1。 然而,并不是所有的语言都适合OS开发,并且在除C之外的许多语言中,为了提供支持语言的建模抽象能力需要提供适当的运行时环境,这又会需要进行相当数量的汇编语言开发。 无论是在OS-dev还是嵌入式系统中,诸如C、Modula-2、Ada、Bliss、PL/M和XPL之类的语言都是专门为底层系统编程而设计的。而诸如Forth之类的语言都包含了必要的底层功能,即使它们不专门用于此目的。

警告

不是所有的语言都适合于低级系统编程[待列出?],它们要么没有合适的低级开发工具可用,要么需要特定的运行时支持,而C不会遇到这样的问题。 此外,绝大多数与操作系统相关的资源(如教程和操作示例,包括本wiki)都假定C是主要的开发语言,因此操作系统开发人员至少应该能够阅读C代码。

使用C以外的语言需要付出大量的额外努力。 但也有一些开发者愿意投入这一努力,以使操作系统的开发符合他们的思维方式(例如:[https://en.wikipedia.org/wiki/Programming_paradigm 编程范例)。

另一方面,试图用解释语言或字节码语言(如Perl或Java)编写操作系统具有极大的挑战性,因此不太可能成功。 当然,有一些关于它的研究项目,但迄今为止,还没有任何东西完全改变我们编写内核的方式。 如果要尝试用HTML编写操作系统……我觉得你还是先再学习一段时间再来弄吧。

所以,忠告已经传达了。现在你应该做出选择,希望是明智的选择。

我可以使用XYZ语言吗?

如果你想知道你最喜欢的语言是否适合开发操作系统,请考虑最重要的原则—— 应该有一种用你的语言做底层工作的方法。

同样,在开始之前得回答以下问题:

  • 你能否处理具有特定位和字节排列的数据结构(例如,MMU结构和类似的东西是必需的)?或者你有相应的工具吗?
  • 你能控制内存分配/释放吗? 或者,你是否可以至少将大块内存细分为其他函数可以透明使用的较小块(对于任何类型的内存管理都是必要的)? 这里的重要后果是-你是否能以自己的语言获得个人内存管理器的某种支持?
  • 你是否能够构建一个自给自足的运行时库(run-time library )来支持所需的语言功能?
  • 你能否轻松地将XYZ与一些汇编代码连接起来(是的,你将拥有一些汇编代码”,至少在你编写底层运行时库(run-time library)时必须是这样的)?
  • 如果XYZ适合其他点,并且是一种解释语言,那么你能否使用XYZ调用来自原始字节的代码,即向特定地址跳转并继续执行(这对于加载和运行程序是必需的)?

如果这些问题中的任何一个被证明是'哦不,我不能用语言XYZ做到这一点',那么XYZ很可能无助于操作系统开发。 这些特殊问题通常都需要通过修改语言和编写新的编译器来解决。

我能不能为XYZ编写编译器?

编译器是软件中少数几个与操作系统具有相似复杂性的东西之一。 既然你已经在计划写一个操作系统,那么决定做一个编译器就好像是去找锻造金属的新方法来制造一辆更好的汽车。 尽管如此,还是有一些OSDevers认为自己能够迎接挑战。 经典的教程是"龙书"(参考书籍页上的编译器-原理、技术和工具)。

然而,这并不意味着你可以忽略C和汇编; 事实上,对编译的代码生成阶段来说,理解汇编比对操作系统开发更重要(除非你完全避开高级语言), 对于编译器设计人员来说,扎实掌握目标语言(译者注:这里指汇编语言)是必须的。 另外,正如已经说过的,关于OS-dev的大部分信息都是面向C开发人员的,除非你打算完全独立工作,否则至少必须具备阅读C的扎实能力。

同时,再考虑一下:你的编译器会用什么语言编写?汇编语言当然不是首先,所以你又得选择C语言,或者还是你最喜欢的语言XYZ。 如果你使用后者,你将如何引导自己?如果使用前者,则需要移植libc和GCC——到现在你还“确定”希望开发自托管的语言吗?

但我听说过一个用XYZ语言编写的操作系统,它不是解释语言吗?

这是一个骗局。 没有所谓的'解释语言'。 任何语言都可以使用解释器或编译器来实现;即使在一个操作系统项目中,也有一些形式的'解释'可以应用于系统操作。

你可能会不时听到用某些语言编写的操作系统,这些语言通常是解释执行的,或者使用了某种解释器的:JavaOS, Genera (the Symbolics Lisp Machine OS), Pilot-OS (Xerox Star 工作站的系统,主要用Mesa语言编写),UCSD Pascal,各种Forth系统等。 其中大部分可分为三类:

  • 操作系统运行在用汇编语言或某些系统语言(如C)编写的低级解释器中,这实际上才是与硬件交互的语言。 实际上,这里的所谓'操作系统'只是在另一个较低级别的操作系统上运行的应用程序。 Pilot OS、UCSD Pascal和一些Java操作系统都是这样工作的,不过它们也有一些编译成本机代码的模块(见下文)。
  • 全部或部分代码已编译为本机代码。 这可能涉及使用具有减少的运行时要求的语言的子集(例如,预方案, 或者 Slang - 虽然到目前为止,它们还没有用于操作系统开发,但它们确实演示了这种低级别的实现语言,可以这样使用)。
 ** Forth-基于Forth的操作系统是这种情况的特例。 尽管通常被描述为一种解释性语言, 线程代码解释器,许多FORTH系统使用的工作方式与大多数其他解释器不同;实际上,解释器将遍历代码所包含的各种Forth 'Words',解析到在汇编或编译代码中实现,然后再实际执行。 此外,Forth系统包含一种特殊类型的汇编程序,它生成专门供解释器使用的代码;此外,常用的“Word”可以根据需要编译成本机代码。 最后,许多嵌入式系统是使用专用硬件(见下文)来支持该语言。
 ** 大多数Lisp系统可以自由地混合解释和编译代码,自20世纪70年代末以来,在几乎所有'严肃'的Lisp系统中,Listener REPL(Lisp系统的'命令行')已不再是一个解释器,而是一个编译系统——每一段代码至少都是动态编译的。 虽然没有任何重要的Lisp操作系统是在不使用特定语言的硬件支持(见下文)的情况下开发的,但如果有,它肯定不是一个纯粹的解释系统。
  • 这类非通常概念上的解释系统运行在专门的硬件和微操作码(microcode)上,这些硬件和操作码充当其主要语言的固化'解释器',或它通常使用的可移植字节码。 这种类型的系统包括SOAR(RISC上的Smalltalk)、Recursiv系统、Lillith Modula-2系统和Burroughs 6500(60年代设计用于运行Algol-60的大型机)。 这些系统的编程技术无法在常规硬件上工作。 例如:
 “”CADR Lisp机器体系结构 有大量的指令集,由硬件支持某些高级操作,如type-tag checking和GC。  它有一个标记体系结构意味着36位寻址字的一部分被指定用于类型信息。  通常,这些机器有多种编译器,包括一个用于系统语言Lisp的编译器,该编译器能够利用额外的指令集。
 ** Rekursiv Single-Board Computer硬件支持可创作指令集(即,你可以动态添加微操作码指令)和关联内存调度表,以支持面向对象编程。