Pascal

来自osdev
跳到导航 跳到搜索

历史说明

最初的标准Pascal语言在很多方面都不同于今天大多数人所熟悉的Object Pascal语言,它简单得多,但也更有限。

Wirth博士本人并不打算将Pascal用于系统编程,他正在进行的语言进化研究是MODLA-2和OBERON语言。 两种语言都与Pascal以与C相似的方式相关,C# 和Java与C相关。 Oberon-2支持面向对象编程的所有概念。 与C语言家族相比,在从Pascal到Oberon的过程中,语言的定义变得更加紧凑,但语言本身变得更加强大。

Pascal的继任者是为了解决Pascal在这方面的弱点而开发的。 然而,随着Object Pascal扩展(例如,单元、位运算符)的广泛采用,许多缺点(尤其是缺乏对单独编译的支持)都被消除了。 然而,在许多地方,Pascal作为玩具语言的名声一直存在,这是不公平的。

过去在操作系统开发中的使用

Pascal在早期的Apple Mac中用作实现语言。

OBERON作为PASCAL的继任者,已经被广泛地用于开发和研究操作系统(参见OberonBlueBottle)。

常用工具

今天最流行的pascal编译器似乎是Delphi和FreePascal编译器,还有少量的Turbo pascal。

有一个商用的(显然是专有的)操作系统正在用Delphi语言开发,ClassiOS是Windows的克隆(以前是Petros®,用内部的Pascal编译器开发的),由Peter Tattam(最出名的是他在DOS上的tcp/ip协议栈,trumppet系列产品)开发。 他也将Delphi定制为 生产Windows设备驱动程序

不管怎样,FPC(FreePascal编译器)似乎更适合开发一个可移植的操作系统,因为它具有高度的可配置性,可以为大量平台生成代码。

PASCAL与汇编语言的接口

就像在C中做内核时一样,Pascal编译器会破坏函数名称以使它们传达更多信息 (例如参数和返回类型)。 这意味着如果你只是写

unit KernelMain;

interface

implementation

procedure kernel_main;
begin
    ...
end;

end.

你最终可能会得到“THREADVARLIST_P$KERNEL_Main”,而不仅仅是“KERNEL_Main”作为函数名。 如果你使用的是FreePascal,则工具 objdump 可以向你显示的符号表.o由编译器生成的文件,它将为你提供函数的 “真实” 名称。

或者,你可以使用编译器附加语句来强制函数使用“公共名称”:

unit KernelMain;

interface

implementation

procedure kernel_main; [public, alias: 'KERNEL_MAIN'];
begin
    ...
end;

end.

最后,简单地声明一个程序,就像你在为任何普通平台编写Pascal代码时所做的那样,将创建一个名为PASCALMAIN的主例程。

program Kernel;

uses Console,Stuff,Etc;

var
 stuff: type;

begin
{Your kernel here.}
end.

也要注意,C和PASCAL不共享相同的调用约定。 最值得注意的是,PASCAL中的参数是从左向右推的,而C则是从右向左推的。 如果这给你带来了麻烦,你可以使用cdecl修饰符来强制编译器,因为你的Pascal过程的工作方式类似于C函数(这应该主要用于将Pascal代码与C代码接口)。 此外,在PASCAL中,被调用者函数由堆栈清理 负责,而这通常是C/C环境中调用者的工作。

另见