Visual Prolog V7...1 1. Visual Prolog调试器 Visual...

89
Visual Prolog V7.3 集成开发环境 (下) 乙丁 译 2012.09

Transcript of Visual Prolog V7...1 1. Visual Prolog调试器 Visual...

Page 1: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

Visual Prolog V7.3

集成开发环境 (下)

乙丁 译

2012.09

Page 2: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

译者说明

这里译出的内容,取自 Visual Prolog V7.3 的主要帮助文件 VIP.CHM 中的

Integrated Development Environment (IDE)。

IDE 是 Visual Prolog 程序开发的主要工具,无论是学习 Visaul Prolog 还是应

用 Visual Prolog,都需要了解它、掌握它。Visual Prolog V5.x 的集成开发环境有

过中文的译著。那以后 Visual Prolog 软件本身发生了很大变化,它的集成开发环

境也随之改变了很多,但介绍它的资料除了 VIP.CHM,只见到一些零散在各类

介绍 Visual Prolog 的书中,没有系统性。译者将帮助文件中关于集成开发环境的

内容全部译出,希望对有兴趣学习了解 Visual Prolog 的人们有所帮助。

由于内容较多,所以分了上下册两个部分。分的时候没有按帮助文件中的顺

序,而是把调试器及编译链接等行命令工具相关内容摘在一起放在下册中了。

翻译过程中,得到了 PDC 的 Thomas Linder Puls 先生的耐心帮助,在此向他

表示衷心的感谢。

译者水平有限,错误再所难免,恳请大家批评指正。

乙丁 [email protected]

2012.9

Page 3: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

I

目录 1. Visual Prolog调试器.................................................................................................................1

1.1. 调试信息的生成.......................................................................................................1 1.2. 启动Visual Prolog调试器 .........................................................................................1 1.3. Debug菜单命令 ........................................................................................................2 1.4. 异常时中断...............................................................................................................4 1.5. 调试器视图...............................................................................................................5

1.5.1. 工程树...............................................................................................................6 1.5.2. 源代码窗口.......................................................................................................6 1.5.3. Run Stack窗口 ..................................................................................................8

1.5.3.1. Run Stack窗口中的条项 ..........................................................................8 1.5.3.1.1. Continue项 .....................................................................................9 1.5.3.1.2. BackTrack项 ................................................................................10 1.5.3.1.3. TrapTrack项 .................................................................................10

1.5.3.2. Run Stack的结构 ....................................................................................10 1.5.3.2.1. 连续运行栈..................................................................................11 1.5.3.2.2. 回溯运行栈..................................................................................12

1.5.3.3. 打开 Local Variables from the Clause 窗口..........................................13 1.5.3.4. 弹出菜单.................................................................................................13

1.5.4. Variable窗口 ...................................................................................................14 1.5.4.1. 变量窗口中的内容 .................................................................................15 1.5.4.2. 内置域变量.............................................................................................15 1.5.4.3. 变量的域.................................................................................................17 1.5.4.4. 变量的地址.............................................................................................17 1.5.4.5. 变化的变量.............................................................................................18 1.5.4.6. 复合域变量.............................................................................................20 1.5.4.7. List域变量...............................................................................................22 1.5.4.8. 保存对象的变量.....................................................................................24 1.5.4.9. This变量..................................................................................................25 1.5.4.10. 对象事实...............................................................................................25 1.5.4.11. 弹出菜单 ...............................................................................................27

1.5.5. Facts窗口 ........................................................................................................29 1.5.5.1. 类事实.....................................................................................................29 1.5.5.2. 对象事实.................................................................................................32 1.5.5.3. 弹出菜单.................................................................................................33

1.5.6. Breakpoints窗口 .............................................................................................33 1.5.6.1. 概述.........................................................................................................33 1.5.6.2. Breakpoints窗口中的内容......................................................................34

1.5.6.2.1. 断点举例......................................................................................35 1.5.6.2.2. 不同窗口中断点的差异 ..............................................................36

1.5.6.3. 断点属性.................................................................................................37

Page 4: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

II

1.5.6.4. 弹出菜单.................................................................................................38 1.5.7. Threads窗口....................................................................................................39 1.5.8. Disassembly窗口 ............................................................................................41

1.5.8.1. Disassembly窗口的内容 ........................................................................41 1.5.8.2. 弹出菜单.................................................................................................42 1.5.8.3. Disassembly窗口命令 ............................................................................44

1.5.9. Registers窗口 ..................................................................................................45 32-bit寄存器 ...................................................................................................45 段寄存器(16-bit): .....................................................................................45 状态标志位(1-bit): ...................................................................................45

1.5.9.1. 寄存器数据格式.....................................................................................46 浮点单元寄存器.............................................................................................46

1.5.9.2. 弹出菜单.................................................................................................47 1.5.10. Modules窗口...................................................................................................47 1.5.11. Memory Dump窗口 ........................................................................................48

1.5.11.1. Memory Dump窗口中显示的信息 ......................................................48 1.5.11.2. 弹出菜单 ...............................................................................................49

2. 命令行工具.............................................................................................................................55 2.1. Visual Prolog 编译器 .............................................................................................55

2.1.1. 使用编译器.....................................................................................................55 2.1.2. 命令行语法.....................................................................................................55 2.1.3. 命令行选项.....................................................................................................56

2.2. 命令行链接器.........................................................................................................62 2.2.1. 简介.................................................................................................................62 2.2.2. 使用链接器.....................................................................................................63 2.2.3. 命令行语法.....................................................................................................63 2.2.4. 命令行选项.....................................................................................................64 2.2.5. 使用响应文件.................................................................................................67

2.2.5.1. 举例.........................................................................................................68 2.2.5.2. 在IDE中调用链接器 ..............................................................................68

2.2.6. 定义文件.........................................................................................................69 2.2.6.1. 定义文件格式.........................................................................................69 2.2.6.2. 定义文件的指令.....................................................................................69

2.3. ProDoc ....................................................................................................................72 2.3.1. 概述.................................................................................................................72 2.3.2. 术语.................................................................................................................73 2.3.3. 输入文件.........................................................................................................74 2.3.4. 源文件处理.....................................................................................................74 2.3.5. 融合分别生成的文档集 .................................................................................75 2.3.6. 文档注释.........................................................................................................75

2.3.6.1. 文档注释的语法.....................................................................................75 2.3.6.2. 直接使用超文本标记 .............................................................................76 2.3.6.3. 文档标签.................................................................................................76 2.3.6.4. 加亮谓词(域)参数的名称 .................................................................78

Page 5: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

III

2.3.6.5. 给谓词名自动添加超链接 .....................................................................78 2.3.6.6. 给域名自动添加超链接 .........................................................................78 2.3.6.7. 增强的Prolog名称超链接 ......................................................................78

2.3.7. 生成文件.........................................................................................................79 2.3.7.1. 生成文档的结构.....................................................................................79 2.3.7.2. 生成目录表的结构 .................................................................................81

2.3.8. ProDoc命令行选项.........................................................................................81

Page 6: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

1

1. Visual Prolog 调试器

Visual Prolog 调试器(Debugger)是查找程序中错误的有力工具。有时,

修改程序中的错误会占到整个开发时间的 90%,这意味着:优良的调试工具太重

要了!

Visual Prolog 调试器可以调试 MS Windows 32bit 的图形用户界面及控制

台界面的应用程序。它可以跟踪程序的执行,可以设置断点,可以逐行执行源代

码并在 Prolog 和反汇编两个层面上观查跟踪的代码。调试器还可以检查被跟踪

子句所使用的变量、查看及取消事实、查看内存转储、查看谓词调用的栈、查看

插入程序中的断点、查看寄存器,等等。

Visual Prolog 调试器是 IDE 工具,可以用 Debug | Run 菜单命令启动,也

可以按 F5 键或点击 按钮启动。

1.1. 调试信息的生成

缺省条件下 Visual Prolog IDE 总是在编译程序模块时生成调试信息。调试

信息存放在与编译模块名称相同、扩展名为.DEB 的文件中。

如果使用 Visual Prolog 行命令编译器,应该使用/debug:full 选项指明产

生调试信息(参见本书上册“Make 工具”一章相关内容)。

注意!使用命令行编译器生成一个需要调试的工程时一定要记住:工程的所有调

试信息文件(.DEB)、目标文件(.OBJ)及映射文件(.MAP)在链接前都必须放

在同一个目录下。使用命令行编译器时这些文件可能会生成在不同的目录中。还

有,链接工程时 PDC 和 Microsoft 的链接器都可以用。

1.2. 启动 Visual Prolog 调试器

启动 Visual Prolog 调试器后,IDE 会构建工程(如果需要),并在调试器

中运行可执行代码至目标段的入口点,如下图示:

Page 7: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

2

如果在 Run Arguments 栏(在工程设置对话框的构建选项中)指定了命令行

参数,这个参数将会传递给程序。

1.3. Debug 菜单命令

Debug 菜单项用于控制被调试程序的执行。

Debug 菜单

Run (F5)

该命令继续程序的运行。IDE 当前没有调试程序时,发布这个命令就会构建

(需要时)并在调试器中运行程序。这个命令常与断点设置配合使用。

Stop Debugging (Shift+F5)

该命令停止程序执行,IDE 回到原来状态。

Break Program

当程序正在执行(程序的指令在执行、调试器等待直到程序停止并返回控制

给调试器),这个命令可以打断程序的执行并将控制返回给调试器。接着,可以

检查调用栈看程序实际做了些什么,或是设置断点。调试器有控制权时(不是在

执行程序指令时)这个命令无效。

Restart

这个命令重新开始应用程序在调试器中的执行。

Attach process...

Page 8: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

3

命令调试器连接一个进程。

Step Over (F10)

命令调试器执行下一行代码。若该行含有一个谓词调用,则会执行完整个谓

词后在该谓词之外的第一行代码上暂停下来。

使用这个命令,若碰到谓词调用时不会逐步执行谓词子句(不会进入谓词源

代码)。想要避免一步步执行谓词时可以使用这个命令。

Step Into (F11)

Step Into 与 Step Over 只有一个差别:如何处理谓词调用。Step Into 命

令调试器执行下一行代码。如果该行含有一个谓词调用,则只会执行这个调用本

身,然后在谓词内部的第一行代码上暂停下来。想要进入调用谓词的每条子句时

可以使用这个命令。

Step out of (Shift+F11)

这个命令完成当前执行谓词的子句执行并调用下一个谓词。

Run to Cursor (CTRL+F10)

它命令调试器运行程序到光标所在位置。这个光标位置可以是 Visual

Prolog 源代码窗口中的也可以是反汇编窗口中的。

将光标置于一行上并激活这个命令,程序将开始执行并一直运行到光标所指

示的那一行(如果可以达到这个谓词调用的话)。指令指针将指示在这一行上。

Go to Executing Predicate Source (Ctrl+E)

如果在程序源窗口中移动后找不到指令指针了,可以使用这个命令。它将使

光标落在含有当前执行谓词的行上(用指令指针指示)。

Break on Exception

如果勾选了这个选项,出现异常时在调用内置的 errorExit 谓词后会停止在

exceptionState::raise_WithPos/4 谓词上。这时,可以使用 Run Stack 窗口来

定位是哪个谓词发生了异常。请参看下面 1.4 章节的内容。

Toggle Breakpoint (F9)

这个命令可以在程序源文件任意可执行命令上设置断点。

Remove All Breakpoints

Page 9: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

4

该命令删除所有先前设置的断点。

1.4. 异常时中断

有时很难定位发生异常的源代码谓词,遇到这样情况 Break on Exception

选项就很有帮助。

启动程序调试,执行到接近要检查的异常位置时,打开 Break on Exception

选项(如果一开始就选了 Break on Exception 可能会因为其它一些不需要检查

的异常而增加麻烦)。

一但出现异常,调试器就会抓住它并停止被调试程序的执行。

接下来就可以使用 Run Stack 窗口定位出现异常的谓词、检查导致异常的调

用序列。Run Stack 窗口中 上边的行对应着 后执行的谓词。在这个窗口中可

以双击某个行来检查相应的谓词子句。如果Run Stack窗口项没有可用的源文件,

调试器则会在 Disassembler 窗口中显示相应的机器指令。

要注意,使用这个机制必须按标准编制程序。也就是说,程序应该使用标准

的 PFC 异常处理机制。要做到这点, 简单的办法就是用 IDE 生成程序框架,其

目标段会是下面这样:

goal mainExe::run (main::run).

Page 10: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

5

1.5. 调试器视图

在 View 菜单中可以打开调试器的检查窗口:

View 子菜单

调试器可以使用的窗口有:

• Run Stack (CTRL+Alt+C)

• Variables for Current Clause (CTRL+Alt+V)

• Facts (CTRL+Alt+F)

• BreakPoints (CTRL+Alt+B)

• Threads (CTRL+Alt+H)

• Modules

• Disassembly (CTRL+Alt+D)

• Registers (CTRL+Alt+G)

• Memory Dump (CTRL+Alt+M)

还有下面两个窗口调试中也会用到,当然它们并非仅只用于调试:

• Project Tree(工程树)

• Source Code Windows(源代码窗口)

Page 11: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

6

1.5.1. 工程树

启动调试器后,可以点击 View | Project Window 显示工程文件的树状结构

图(工程树)。

工程树视图

在这个视图中,可以双击文件或是谓词,其结果是打开源代码编辑器,光标

定位在指定的项上。

要看源代码,程序必须是用 Visual Prolog 编写的。其它源代码对应内容只

能在反汇编(Disassembly)窗口中查看。在某种特定情况下 C与其它一些语言

的源文件也是可以看到的,这里不讨论了。

1.5.2. 源代码窗口

IDE 开始调试一个工程时,会自动在调试器中运行工程的可执行文件,执行

到程序目标段的入口处停下来,接着在 IDE 的文本编辑器中打开相应的(包含有

目标段的)Visual Prolog 源文件。

Page 12: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

7

源代码视图

蓝色箭头 指示的是当前执行的谓词:

mainExe::run(main::run).

这个箭头就是指令指针,它在源代码窗口中总是指示出当前执行的谓词,可

以通过跟踪这个指令指针的移动来跟踪程序的执行。

调试器在执行谓词过程中会根据不同情况改变指令指针的颜色。当谓词失败

时箭头会变为红色,如下图:

而当谓词产生了运行时异常,箭头则会变为黄色,如下图:

Page 13: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

8

指令指针的箭头改变方向 表示这一步是程序刚刚从跟踪谓词中返回。通

常在这一步指令指针指示的是一个子句头部。

如果在程序源窗口中移动而找不到指令指针了,可以很方便地用菜单命令

Debug | Go to Executing Predicate Source (Ctrl+E) 找到它的位置。

源代码窗口中可以使用一些命令,这些命令可以在 Edit 或 Go To 菜单中激

活,也可以用鼠标右键激活。可以在文本中搜索(Edit | Find 等命令)、转到

某个指定位置或行(Go to | Go to Line Number、Go to | Go to Position on

Clipboard)、转到指定谓词的声明或子句(Go to | Go to Declaration、Go to

| Go to Definition),等等。

可以将选定的源代码复制到剪贴板中。还可以用 Edit | Copy Position 及

Go to | Go to Position on Clipboard 命令把鼠标指示的位置写到剪贴板中,

以便后面能直接跳到这个位置上。

1.5.3. Run Stack 窗口

Run Stack 窗口按程序堆栈内容形象化地显示了子句调用的历史(踪迹),

还可以观查到陷阱点及子句回溯分支。

1.5.3.1. Run Stack 窗口中的条项

Run Stack 由三种条项组成:

• Continue 项 – 以 为标识。它表示的是普通的可执行子句,这些子句不

会产生回溯点,也没有陷阱设置。

• BackTrack 项 – 以 为标识。它表示的是一个非确定性谓词的子句。若

这个子句程序执行失败了会执行该谓词的下一个子句。调用可以产生回溯

点(产生不止一个解)的谓词的一个子句时,就会出现这样的项。

• TrapTrack 项 – 以 或 为标识。这表示的是一个 continue 项(子句),

不管是否出现错误条件,这样的项都将继续进行下去。例如,某个谓词调

用被 trap/3 谓词捕获就会创建这样的项。 用于标识确定性谓词的捕获

子句而 用于标识非确定性谓词的捕获子句。

Page 14: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

9

BackTrack 项(以 标记)和 TrapTrack 项(以 标记)都是回溯点。这些

项标记的子句将继续进行,在相应的失败或错误出现后程序的执行会继续下去。

Run Stack 窗口典型的情形如下图示:

Run Stack 窗口

1.5.3.1.1. Continue 项

Continue 项由 标识,每一条项表示一个被调用的子句,调用的模式为:

PredicateName ( [Arguments] )

例如:

Continue 项例一

Continue 项例二

调用模式中的 PredicateName 有如下的形式:

Page 15: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

10

PredicateName : ScopeName '::' PredName

ScopeName(范围名称)

如果谓词 PredName 是在类或接口中声明的, ScopeName 就是该类或接口

的名称,比如在上面的例一中范围名称就是 window。如果它是 prolog DLL 中的

一个谓词则范围名称就是该DLL的名称,如上面例二中范围名称是VIP::Kernel。

对于其它动态链接库中的函数来说,没有 ScopeName 。

PredName(谓词名称)

谓词的名称,其子句就是用这个名称来表示的。在上面的例一和例二中分别

是 dispatchAutoHandler 和 CallEventHandler7。

而调用模式中的 Arguments 有如下的形式:

Arguments : Argument [ , Arguments ]

子句就是附带着这些参数调用的。参数的模式为:

Argument [ Domain ] Value

Domain 是参数的域。如果 Tools|Options|Debugger|Show Domains 选项被

选中则会显示出域的具体内容。

1.5.3.1.2. BackTrack 项

BackTrack 项由 标识。每个条项显示的模式与 Continue 项相同。

一个 BackTrack 项标示了一个分支,称之为一个 BackTracking Run Stack

(参见后面的介绍)。

1.5.3.1.3. TrapTrack 项

TrapTrack 项由 或 标识。每个条项显示的模式与 Continue 项相同。

1.5.3.2. Run Stack 的结构

Run Stack(运行栈)以一个树状结构来表示,它包含有两类子栈:

Page 16: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

11

• Continue Run stack(连续运行栈),这是运行栈的主要部分;

• BackTracking Run stacks(回溯运行栈),这是连续运行栈的分支。

后面的讨论参照如下的例子:

1.5.3.2.1. 连续运行栈

如果迭回 Run Stack 树的所有项就可以看到纯粹的连续运行栈。它是一种简

单的纵向结构,包含了所有类型的条项:Continue、BackTrack 及 TrapTrack 并

且没有分支。

Page 17: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

12

连续运行栈(自下而上)地显示出了被调用谓词入栈情况:

• 运行栈窗口 底下的一项是第一个被调用的谓词,

• 上面那项表示的是当前正在调试的子句(指令指针所指子句)。

跟踪进入一个谓词时就会在栈的项部添加一个项(被跟踪的谓词调用),而

结束跟踪一个(成功的)谓词就会删除 顶上的项使原先的下一项成为栈顶。

注意:由于编译器可能会进行某种优化(尤其是截尾调用优化),因此进入一个

子句不是必须在连续运行栈顶添加一个新项。

1.5.3.2.2. 回溯运行栈

回溯运行栈是连续运行栈的一个分支。每个回溯运行栈总是以 BackTrack

项为结束。

回溯运行栈是在分支顶端自上而下发展的,与连续运行栈不同:

• 每个回溯分支的末端总是 BackTrack 项。例如上图中可以看到回溯运行栈

的两个分支,它们结束于 main::t2(integer)和 main::t2(integer)。

• 回溯分支起始于连续运行栈的一个项。上图中是 main::run()。

Page 18: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

13

由于错误或失败触发回溯机制时, 近分支起点( 上边)的 BackTrack

项或 TrapTrack 项被激活。这是 后创建的 BackTrack 或 TrapTrack 项。接下

来相应的回溯分支被移到连续运行栈,丢弃回溯分支根部以上部分原来连续运行

栈的内容,而该分支顶部的 Continue 项就成了连续运行栈 顶上的项。例如,

在前一图的基础上按 F11,就会变成下面这样:

main::t2(integer) BackTrack 项激活了(指令指针指向它),而且移到了

连续运行栈的顶部。

1.5.3.3. 打开 Local Variables from the Clause 窗口

在运行栈树中选择一个项会打开 Local Variables from Clause 窗口显示这

个子句定义的所有局部变量。窗口的标题中显示了所选子句的谓词名。

如果已经打开了 Variables in the Current Clause 窗口,则此时这个窗

口的标题会变成为 Local Variables from Clause。

1.5.3.4. 弹出菜单

运行栈窗口有一个关联的弹出菜单:

Page 19: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

14

对于树中所选项来说,这个菜单所包含的项是:

Refresh

刷新 Run Stack 窗口内容,重建树结构。

如果 Variables 窗口(参见下一节)打开了,它也会刷新。

Go To Code

打开 Prolog 源编辑器并将光标置于 Run Stack 窗口中所选项相应 Prolog

子句上。若该项没有相应的 Prolog 模块调试信息,则会打开 Disassembly 窗口

并将光标置于相应的汇编指令上。在 Run Stack 窗口中双击一个谓词调用具有相

同的效果。

Copy Line

将所选的那一行内容复制到剪贴板中。

Show Domains

这个选项可以打开/关闭变量的域的显示。

这个命令与 Tools | Options -> Debugger 对话框中的 Show Domains 选项

作用相同。

Run Stack 窗口可以用 IDE 菜单 View | Run Stack 激活。

1.5.4. Variable 窗口

Variables(变量)窗口通常标题是 Variables in the Current Clause ,

当 Run Stack 窗口激活时标题会变成 Local Variables from Clause 。变量窗

口显示了来自被跟踪子句的所有变量及对象事实(事实变量),这些变量是被调

试程序已经创建的(并经由指令指针传递);还显示了子句可以使用的所有类事

实(事实变量)。它也显示了这些变量及事实当前已知的值。

其变量和事实显示在 Variables in the Current Clause 窗口中的子句可

以是:

• 当前调试的子句(指令指针指向它)。此时窗口的标题是 Variables in the

Current Clause。

• 在 Run Stack 窗口中选定的子句。此时窗口的标题是 Local Variables

from Clause (ClauseName)。 ClauseName 是子句描述,与在 Run Stack

窗口中显示的一样。

Page 20: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

15

1.5.4.1. 变量窗口中的内容

变量窗口中显示了来自被跟踪(或是 Run Stack 窗口中指定的)子句所有程

序变量及事实的树状结构,这些变量及事实是进行到当前跟踪的这一步程序已经

创建了的。它们包括:执行指令前子句中创建的所有变量及对象事实(事实变量)、

在类实现中声明的这个子句可以使用的所有类事实(事实变量)。变量窗口中也

显示了这些变量与事实在调试进行到当前这一步时已经知道的值。

窗口 上边一行显示的是谓词的声明,其子句是当前正在执行的或是被选中

的。例如,在下图中窗口第一行可以看到谓词 string::concat/2->的声明,其

子句正在被跟踪的过程中:

图 1

这也意味着指令指针正指向 string::concat/2->谓词的某个子句,如下图

示:

图 2

被跟踪谓词的这个声明(图 1中的 string::concat/2->)是变量窗口所显

示数据树的根。

下面我们来看不同情况下变量树是什么样的。

1.5.4.2. 内置域变量

简单的数据树,是类谓词所有变量的域都属于内置域时的情况。我们来看

string::concat/2->谓词的变量窗口:

Page 21: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

16

图 3

图 3 中我们看到的是只有一个层级的数据树。看一看前面图 2中谓词

string::concat/2-> 的子句定义,比较一下图 3和图 2,我们可以看出:显示

出来的所有树中的节点,对应于这个子句使用的局部变量,树中这些变量的顺序

完全对应子句执行时这些变量创建的顺序。在谓词子句的头部,有:

concat(S1, S2) = Output :-

相应地,在变量窗口中可以看到显示有变量 S1、S2 和 Output。

图 4

其后的变量 L1、L2 和 Off2 也可以在谓词子句中看到,树中它们出现的顺

序与它们在子句中被引出的顺序完全一样。

图 3中可以看到每个变量前有一个 图标,变量名后有冒号“:”,其后是

内置域的名称 string、unsigned 或 pointer(用户定义的域 stringSize 等效于

内置域的 unsigned)。

内置域名称之后有等号“=”,后面是变量值。

在图 3中,可以看到变量 S1 的值是“String0”, S2 的值是“String1” ,

这些值是子句被调用时所用的参数,在源程序里这个调用是这样的:

Output = string::concat(“String0”, “String1”),

所以在图中看到 S1 = “String0” 而 S2 = “String1”。

Page 22: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

17

1.5.4.3. 变量的域

要使变量窗口如图 3和图 4那样显示变量的域,需要在 Tools | Options ->

Debugger 菜单中勾选 Show Domains 选项,如下图示:

图 5

也可以在变量窗口中右击鼠标键激活弹出菜单,选 Show Domains。这个选

项可以开/关变量窗口中变量名称后面的域的显示。

1.5.4.4. 变量的地址

在 Tools | Options -> Debugger 中勾选 Show Variable Address(如上

图)可以显示变量的地址。

同样,也可以用右击鼠标键调出弹出菜单选 Show Variable Address。

这时,变量窗口与图 3有些不一样了,在每个变量名后面有一些十六进制的

数字,比如 S1 后面的 0x0012FEB8,这些十六进制数字是对应变量的虚拟内存地

址,Show Variable Address 选项可以开/关这些地址的显示。

Page 23: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

18

图 6

1.5.4.5. 变化的变量

现在,让程序再次调用谓词 string::concat/2-> predicate:

Output = string::concat("String0", "String1"),

将光标置于这一行上,按 CTRL+F10 (Run to Cursor)。之后,指令指针

会指向这个调用。此时按 F11(Step Into)来调试 string::concat/2-> 谓词

的子句。

把光标放在 Off2 那行上(参见图 2),按 CTRL+F10 。这个时候可以看到

如下图所示的变量窗口内容:

图 7

注意输出变量“奇怪”的值。这是因为 memory::allocStringBufferProfile

谓词分配的稍后要写入输入变量实际值的内存块中此时有其它不需要的数据而

造成的。

将光标置于子句 后一行再按 CTRL+F10。在变量窗口中可以看到输入变量

那一行显示的内容变了,有了新值“String0”:

Page 24: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

19

图 8

这个时候一开始的“奇怪”值变成了有些道理的值“String0”。按 F10,

调试器会走出 string::concat/2-> 谓词,可以看到输出变量的 终结果:

“String0String1”。

当然了,这只是底层跟踪时出现的现象。一般的 Prolog 代码不会有这种标

准变量的变化。

Page 25: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

20

1.5.4.6. 复合域变量

我们来调试一下下图所示的程序:

图 9

注意,变量 P1 及 P2 都属于用户定义的复合域 person。在变量窗口中它

们会如何显示呢?(要想在变量窗口中得到期望的显示形式,需要在弹出菜单中

将 Show Domains 和 Show Variable Address 两个选项都勾选。)下面这个图

对应的就是这个调试:

Page 26: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

21

图 10

P1 变量前可以看到加号图标 。这个图标表示这个树节点有子节点,点击加

号图标可以展开这个子节点的一层。这时加号图标就会变成减号图标 ,表示相

应的子节点开展了。只要节点前有 图标,就可以点击这个图标展开下面的子节

点。相应地,只有节点前有 图标,就可以点击这个图标收起相应的子节点。在

上图中可以看到 P1 复合变量展开的子节点树。

我们现在来看看“变量树的一层级”到底是什么。

来看 P1 变量的子树。通常情况下,调试器是这样看子树的:

P1 = person (Name, Address),

也就是说,调试器把 person 域的参数就当成 Name 和 Address 变量本身,

因此才为这些变量创建了子树节点。所以,我们可以说复合域的每个参数(子变

量)是相应子树的根。

各个显示出来的参数(函子)创建子树的第一层节点。如果这些参数本身又

属于某个复合域,其节点前又会出现加号图标 ,它还会有相应复合域参数的子

树。 后的节点对应于内置的简单域(integer、real、char、string、binary、

pointer,等等)。

在图 10 中结尾的节点是:

图 11

Page 27: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

22

我们再回头看看 P1 变量。在变量窗口中它显示为:

P1 [0X0012FEC4] : person = person ( name ("Jim","Black"), addr( street(1, "1st Street"), "New Town") ),

在等号的右边,person是person域的函子,P1变量就是属于这个域的。 addr

是 address 域的函子,person 域的第二个参数属于这个域。而 street 是 street

域的函子,address 的第一个参数属于这个域。对于 street 函子来说,其第一

个参数(等于 integer 的 1)是门牌号,第二个参数(等于 string “1st Street”)

是街名);addr 函子的第二个参数是 string “New Town”,这是城镇名。

1.5.4.7. List 域变量

我们再来调试下面这个程序:

图 12

由上图可知 Tail 变量属于表域 my_list。在变量窗口中它会如何显示?下

图是调试器第一次进入 length_of 谓词第二个子句时的情况:

Page 28: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

23

图 13

Tail 变量等于表[2,3,4,5]。点击 Tail 变量前面的加号图标,就可以看到

节点相应于 Tail 表各个元素的表的子树。进一步,表的元素还可以是复合域的

或是其它表域的,相应这样的元素就还会有自己的节点子树。

图中各表元素的名称依次为 Tail[1]、Tail[2]、Tail[3]和 Tail[4]。元素

名称之后是相应的虚拟内存地址。

Page 29: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

24

1.5.4.8. 保存对象的变量

我们来调试下图中的程序:

图 14

图中可以看到,Object 变量都是 my_interface 对象类型,这个类型的对象

都是在 my_class 类中由缺省构造器 new 创建的。我们来看一下变量窗口中变量

Object 的显示情况 :

Page 30: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

25

图 15

Object 变量名称后面是变量的地址[0x0012FEC8],之后是变量所属域的名

称 my_interface。my_interface 域是该类的构造类型接口,而正是这个类创建

了对象。等号右边有对象地址 0x0196DFE4 以及类的名称 my_class,这个类的构

造器用来创建对象。对象地址是程序内存保存对象数据的起始地址,就是说它仅

只是保存在 Object 变量中的一个指针的值。要查看它,需要在弹出菜单中勾选

Show Pointer Values 选项。注意,这是一个对象的地址,这个地址中保存有这

个变量的对象。可以通过这个地址使用 Disassembly 或 Memory Dump 窗口来查看

该对象中的数据。

1.5.4.9. This 变量

对象谓词总是要涉及对象,这个对象带有对象事实。在类实现中,对象谓词

隐含地带有这些对象而对象谓词的子句可以显式地访问这些隐含着的对象,这就

要用到特殊的变量 — This。

而 This 变量不过是前面讨论过的“保存对象的变量”的一种特殊形式。调

试对象谓词子句时在变量窗口中 This 变量总是显示为第一个变量(参见下面一

节的图)。

1.5.4.10. 对象事实

当调试器遇到保存对象的变量(包括 This 变量)、而这个对象又有对象事

实时,就会在变量窗口中显示对象事实的数据库。

在前面的章节中,已经讨论过了变量窗口如何显示保存对象的变量。不过在

那里讨论的是一种对象没有对象事实的简单情况。当对象有对象事实数据库时,

保存这个对象的变量就要显示出对象全部的事实数据库。

我们来调试下图中的程序:

Page 31: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

26

图 16

按 F5,接着把光标放在指令指针指向的那一行上,再按 CTRL+F10。在变量

窗口中可以看到下图这样的显示:

Page 32: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

27

图 17

点击 O变量前的图标 ,会出现对象事实数据库 dyn,再点击它前面的加号

图标 就会出现在 dyn 对象事实数据库中声明的事实列表:

图 18

1.5.4.11. 弹出菜单

Variables in the Current Clause 窗口有下面的关联弹出菜单:

图 19

Page 33: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

28

菜单中的项有:

Copy

把变量窗口选定行的内容复制到剪贴板中。

Add to Facts Window

允许在 Facts 窗口中查看对象事实。如果选定的变量不包含有对象标识则此

项无效。激活此项时,调试器会打开 Specify the Object Name 对话框,在这个

对话框中需要输入在 Facts 窗口中将指定给这个对象的名称。

什么时候需要将一个包含对象事实的对象变量添加到 Facts 窗口中呢?当

需要在程序离开含有这个变量的子句时还能看到对象事实的值,这个做法很有

用。因为当离开该子句时,这个变量(以及包含有所有对象事实的该对象)就会

由变量窗口中消失了。但是,只要这个对象存在,它所包含的对象事实就可以在

Facts 窗口中观查到,只要事先把这个对象添加到 Facts 窗口。

Show in Memory Window

打开 Memory Dump 窗口显示所选变量地址的第一行内容。

Show as Hexadecimal

以十六进制格式显示整数值。

Show as Decimal

以十进制格式显示整数值。

Show as Octal

以八进制格式显示整数值。

Show Domains

这个选项可以开/关变量名称之后域名称的显示。它的作用与图 5显示的

Tools | Options -> Debugger 对话框中的 Show Domains 选项功能相同。

Show Variable Addresses

这个选项可以开/关变量名称之后地址的显示。它的作用与图5显示的Tools

| Options -> Debugger 对话框中的 Show Variable Address 选项功能相同。

Retract

Page 34: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

29

这个命令只适用于事实。它撤消所选对象事实的所有实例,或是撤消在所选

对象事实数据库中声明的所有事实的所有实例(除了单个事实及单个事实变量)。

Go To Declaration

跳去查看所选事实或对象的声明。

每一跟踪步后变量窗口都会刷新。

变量窗口可以用 Ctrl+Alt +V 组合键打开,也可以使用 IDE 菜单中的 View

| Variables for Current Clause 打开。

1.5.5. Facts 窗口

Facts 窗口总是显示被调试程序中定义的所有类事实数据库的当前内容。程

序员可以使用变量窗口的 Add to Facts Window 命令将调试器已知的对象添加到

事实窗口中,以便显示对象的对象事实数据库。

1.5.5.1. 类事实

我们来调试下面这个简单的程序例子:

Page 35: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

30

按 F5,接着把光标放在指令指针指向的那一行上,再按 CTRL+F10。在 Facts

窗口中可以看到下图这样的显示:

Page 36: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

31

首先我们可以注意到,数据树根的名称是 test.exe,这是被调试程序的名

字。一级节点是一些类的名称,类事实段就是在这些类的实现中声明的。我们来

考查一下 fact 类实现中使用的事实。点击 fact 类前的加号图标,展开相应的子

树,再点击子树中出现的所有加号图标,我们会看到下面显示出的情况:

我们可以看到与 fact 类实现中声明的类事实段对应的二级树节点。比如,

有 stat 类事实段。注意一下 fact$classDB 节点,以此命名的节点通常是在一个

类实现中声明的所有未命名类事实段中声明的所有类事实的根节点。

还可以看到在相应的类事实数据库中声明(定义)的类事实的三级树节点:

cf1、cf2、cf3、cf4。这些节点几乎完全清楚地显示了事实的声明,比如 cf1

是事实变量而 cf2 是 single 事实。

对于 determ 和 nondeterm 事实的那些行来说,还有更多的信息。由于一个

determ 事实既可以有一个插入的实例也可以没有,因此 determ 事实的行还显示

了下述的描述符:

• 描述符 set 表示该事实有一个插入的事实实例;

• 描述符 unset 表示该事实没有插入的事实实例。

比如,cf3 determ 事实就包含有描述符 set。

后,nondeterm 事实可以有若干个插入的实例,因此 nondeterm 事实后

的描述符就是说明:

• 该事实有多少实例。

Page 37: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

32

例如,对于 cf4 nondeterm 事实,2 facts 描述符表示 cf4 事实有 2个实例。

事实树的第四层及更低层描述事实的实例。

对普通的不能有多于一个实例的事实(也就是事实变量和 determ 模式的单

个事实),节点第四层显示了事实参数的值。事实参数显示的格式与变量显示的

格式是一样的,那些格式我们在前一章节中介绍过了。

对可以有多个实例的非确定事实(nondeterm 模式的事实),再下一层节点

显示了事实现有的实例。例如,下面这个节点:

显示的是 cf4 事实的第二个[2]实例。非确定事实的第五层节点显示事实参数的

值,它显示的格式也与变量显示格式一样。

1.5.5.2. 对象事实

开始时,Facts 窗口的树中根本没有对象事实。因为可以查看对象事实的原

窗口是 Variables 窗口。

不过,只有在涉及容纳这个对象事实的对象变量在 Variables 窗口中时,

才可以看到对象事实。一般情况下,变量只在它被创建时才存在,离开包含这个

变量的子句时就不再存在了,这个变量(及它所包含的所有事实)会从 Variables

窗口中消失。不过,如果明确地把对象添加到 Facts 窗口就可以在该窗口中观查

到对象。

往 Facts 窗口中添加对象(包括对象事实),需要对欲观查的对象变量使用

Variables 窗口中的命令 View | Variables for Current Clause。步骤如下:

• 打开 Variables 窗口,

• 在窗口中选择对象变量,这个对象变量保存着包含对象事实的对象,我们

想要观查这其中的对象事实,

• 右击鼠标键调出窗口的弹出菜单,

• 在弹出菜单中选择 Add to Facts Window 命令,这时会出现 Specify the

Object Name 对话框,

• 在对话框中输入名称,在 Facts 窗口中要观查的对象就显示在这个名称

下。

对象会添加在事实树的 底部。添加对象的名称就是刚才 Specify the

Object Name 对话框中所指定的名称。点击名称前面的加号图标可以看到这个对

象中定义的对象事实段。这以后,就可以像查看类事实一样来查看对象事实和事

实变量了。

Page 38: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

33

当对象被销毁时,对象及所有的对象事实都会自动地从 Facts 窗口事实树中

删除。

1.5.5.3. 弹出菜单

Facts 窗口关联的弹出菜单如下图示:

Find...

在所选事实树部分中的事实、事实变量及事实段名称中搜索指定的串。

Go To Declaration

激活/打开源代码编辑器并将光标移到所选事实或事实变量声明的起始处。

Retractall

撤消所选事实的所有实例,或撤消所选事实数据库中声明的(除单个事实和事实

变量外的)所有事实的所有实例。

用 F6 键可以刷新 Facts 窗口。

Facts 窗口可以用 CTRL+Alt+F 组合键打开,也可用 IDE 菜单 View | Facts

打开。

1.5.6. Breakpoints 窗口

1.5.6.1. 概述

Breakpoints 窗口显示了设置在被调试程序中的所有断点。

程序源文件中任意可执行的程序行上(或在 Disassembly 窗口中被调试程序

的任意指令行上)都可以设置断点。断点在调试器里是物理内存地址的一种特殊

标记,执行到这标记地址上的指令时就激活断点。断点激活时会将程序暂停在断

点地址处以查看调试器中程序的状态。

Page 39: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

34

1.5.6.2. Breakpoints 窗口中的内容

窗口中每个断点独占一行显示,可以把这种显示看成是一个表格,每行描述

了一个断点。表格有六列,其标题分别是 Status、Source、Line、Count、Comment、

Action。

其中:

Status

显示该断点的状态是可用的还是禁止的。

Enabled

如果断点是可用的(enabled),当程序执行到断点相应地址上的指令时

就会激活断点。可用的断点用 或 (用于汇编)或 (用于重定位断

点)图标标记。

Disabled

如果断点是禁止的,程序执行到断点相应地址上的指令时不会激活断点。

禁止的断点用 或 (用于汇编)图标标记。

Invalid

如果断点设置行上没有可执行代码,它就是无效的。这样的断点用 图标

标记。

Source

这一列显示源代码。

其中:

SourceName

谓词所在地址空间的描述,断点就是设置在这个谓词的子句上的:

Page 40: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

35

• 如果断点是在 Prolog 源代码上设置的, SourceName 就是断点所在的文

件名。其显示形式为:

FileName '(' Path ')'

Path 可以使用构建脚本符号。

• 如果断点是在 Disassembly 窗口中设置的,SourceName 显示的形式为:

--- assembler: AddressValue

AddressValue 是十六进制地址,断点就是设置在谓词汇编代码的这个地

址上的。

Line

如果断点是在 Prolog 源文件中设置的,这里显示的就是断点所在行号。如

果断点是在 Disassembly 窗口中设置的,这里显示的行号就是 0。

Count

这列显示断点计数值。

Comment

这列显示断点的注释。

Action

这列显示断点脚本。程序每次碰到断点就会执行相应的脚本。

1.5.6.2.1. 断点举例

下面来看一下设置在源/ Disassembler 窗口中的断点和对应显示在断点窗

口中的信息。

Page 41: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

36

在上图中可以看到:

• Breakpoints 窗口各列的标题,上一节介绍过。

• 后一行显示了 math.pro 文件中第 68 行上的一个无效断点。可以在源窗

口中看到 math.pro 文件在这一行上是关键字 clauses。文件名后是其路

径($(ProDir)\pfc\math\),其中$(ProDir)是自动生成的 IDE 构建脚本

符号,表示 Visual Prolog 根目录 Prolog Root 的位置(也就是在 Project

Settings 中 Directories 设置的位置)。

• 其它行显示的是有效(可用的和禁止的)断点。注意一下在源窗口第 71

行设置的断点,该断点设置在截断符号上,而截断是不调用任何谓词的,

调试器也就无法在该行上停止程序的执行。因此,IDE 把该行上的断点向

下移了一行,并用 图标标示出原来的断点。

• 在 Prolog 源文件中设置的断点,Line 列显示了断点所在行号。

1.5.6.2.2. 不同窗口中断点的差异

断点可以在 Prolog 源文件中设置,也可以在 Disassembly 窗口中设置:

• Prolog 源程序中有效断点只能设置在包含有可执行指令的程序行上。也

就是说,断点只能设置在包含有谓词调用的谓词子句行上,设置在非子句

行上的断点会标记为无效的断点。而设置在不包含谓词调用的子句行上的

断点会移动到有调用的程序行上,并用 图标标示出原来的断点。有效的

断点在Prolog源文件中用 或 标示;在Disassembly窗口中用 或 显

示。如果 Prolog 子句有若干个汇编实现(比如子句有若干种流模式时),

Prolog 源的一个断点会在 Disassembly 窗口生成若干个断点。

• 在 Disassembly 窗口中设置的断点用 或 标示。这样的断点后来可以被

在 Prolog 源代码中设置的地址相同的断点(用 或 表示)覆盖。

Page 42: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

37

注意:工程的修改和重新编译可能会使在 Disassembly 窗口中设置的断点

被删除(如果原来断点地址处放置了别的指令)。

程序中设置的所有断点都可以在 Breakpoints 窗口中看到。

1.5.6.3. 断点属性

每个断点的属性都可以在断点属性对话框中修改:

对话框中第一行:

• 如果断点是在 Prolog 源文件中设置的,其形式显示为:

File: FileName Line: LineNumber

FileName是断点所在的Prolog源文件名,LineNumber是断点所在行号。

• 如果断点是在 Disassembly 设置的,其形式显示为:

Breakpoint Address: Address

Address 是在窗口中看到的程序内存的断点地址。

Count Value

显示断点自创建后被激活的次数。这个值用户无法修改,它是程序每遇到一

次该断点就自动加 1。

Enable Breakpoint

Page 43: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

38

这个勾选项控制断点的可用/禁止状态。不勾选此项,则可以不用删除这个

断点但暂时禁止这个断点。再勾选时就可以使用这个断点。如果是可用状态的,

则程序执行到断点地址的相应指令时就会激活断点。

Comment Comment string

这个编辑框内可以输入注释。缺省时它含有源程序相应行的内容。

Action Script text

在这里可以输入脚本文本。

注: 如果模块构建时没有包含调试信息(比如在源文件编译成目标文件或包文

件编译成目标文件时编译器命令行选项使用了/nodebug ),则无法在模块的源

文件中设置断点。

还要注意,在哪个窗口中删除断点都可以(Prolog 源,Breakpoints 窗口,

Disassembly 窗口),结果都是一样的,都会将该断点从程序中删除。

1.5.6.4. 弹出菜单

Breakpoints 窗口有如下关联的弹出菜单:

选择一个断点击鼠标右键可以弹出这个菜单。菜单中包含的项有:

Go to Source

若该断点是在 Prolog 源程序中设置的,这个命令会打开 Prolog 源程序编辑

器并将光标移到该断点相应的源代码行上。如果断点是在 Disassembly 窗口中设

置的,这个命令会将视图移到 Disassembly 窗口该断点上。在断点上双击鼠标或

按回车键与这个命令效果相同。

Properties

打开该断点的断点属性对话框。

Toggle (Enable / Disable)

Page 44: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

39

切换该断点的 Enabled / Disabled 状态。

Delete

删除该断点。

Enable All

将程序中所有断点的状态都设置为可用的。

Disable All

将程序中所有断点的状态都设置为禁止的。

Remove All

删除程序中所有的断点。

Breakpoints 窗口在断点更新后会自动更新。

Breakpoints 窗口可以用 Ctrl+Alt+B 组合键打开,也可以用 IDE 菜单命令

View | Breakpoints 打开。

1.5.7. Threads 窗口

Threads window 窗口显示被调试进程及其线程的信息。窗口显示如下图:

窗口各列标题行的名称如下:

TID

这一列中显示了被调试进程创建的所有线程的标识号。

current

Page 45: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

40

这一列中用星号*标识出当前的线程。在 Variables 窗口中只能看到在当前

线程中执行的谓词的变量。

State

这一列显示线程的状态。状态有三种: Running、Stopped 和 Suspend 。

Running 表示线程已经启动,没有被挂起(参看 thread::suspend/0->,

syncObject::wait/0->,syncObject::wait/1->)或终止(参看

thread::terminate/1)。

Suspend 表示线程处于挂起的状态(参看 thread::createSuspended/3,

thread::suspend/0->,syncObject::wait/0->,syncObject::wait/1->)。

Stopped 表示线程已经创建了但停止在断点上,不是挂起状态(参看

thread::suspend/0->, syncObject::wait/0->, syncObject::wait/1->)。

如果将一个 Stopped 状态的线程设置为 Suspend 状态,它就会进入 Suspend状态。

time

线程创建的时间。

User time

线程的用户模式所用处理器时间。

Kernel Time

线程的核心模式所用处理器时间。

Priority

线程的优先级。显示为如下的数字: 2、1、0、-1、-2。

显示数字 优先级名称 描述

2 Highest 优先于所有其它级别运行。

1 AboveNormal Highest 之后优先于 Normal 级别运行。

0 Normal 线程缺省的优先级别。AboveNormal 之后优先于

BelowNormal 级别运行。

-1 BelowNormal Normal 之后优先于 Lowest 级别运行。

-2 Lowest 所有其它级别之后运行。

Predicate

Page 46: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

41

这里显示了当前执行线程的谓词名称(如果可以确定出来的话)。

弹出菜单

Threads 窗口有一个关联的弹出菜单。在 IDE 任务菜单的 Thread 子菜单中

也有相同的命令可以使用。

Goto Source

打开文本编辑器并将光标置于创建所选线程的谓词上。

Set Current

将所选线程设置为当前线程。

Resume

重新运行所选线程。

Suspend

挂起所选线程。

Threads 窗口会在修改了任何显示的参数后自动刷新。

用组合键 CTRL+Alt+H 可以打开 Threads 窗口,也可以使用 IDE 菜单项 View

| Threads。

1.5.8. Disassembly 窗口

1.5.8.1. Disassembly 窗口的内容

Disassembly 窗口显示了被观查源代码的汇编语言指令。

反汇编由指定地址开始,朝向更高内存地址,每条指令占一行。每行显示的

形式为:

LineMarkers Address [ HexCode ] AssemblerCommand

Page 47: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

42

其中:

LineMarkers

是指令指针 及断点标记 (或 )。

Address

指令的起始地址。

HexCode

十六进制的指令代码。可以在弹出菜单中隐藏这个指令代码的显示。

AssemblerCommand

指令代码相应的汇编指令。它有 Intel 标准的汇编缩写。如果某个地址解释出了

一个外部名称,则这个名称也会显示在这一列中。比如在下面图中显示的

_test$Predicates$run$_s2。

指令指针 标记出了下一步要执行的指令。

图例:

1.5.8.2. 弹出菜单

Disassembly 窗口有一个关联的弹出菜单,菜单中有如下各项:

Page 48: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

43

Go To Address

调用如下对话框。

输入要显示为 Disassembly 窗口第一行的指令地址,地址要使用十六进制格

式。对话框中也可以使用符号化的外部链接名和符号化的 CPU 寄存器名。如果调

试器无法将输入的外部链接名转换为实际地址,对话框中的 OK 按钮就会是禁止

的。点击 OK 按钮后,调试器就会更新 Disassembly 窗口中的内容并将光标置于

指定地址的指令上。如果该指令原来在 Disassembly 窗口中是看不到的,现在会

显示在第一行上。

Go To EIP

刷新 Disassembly 窗口并置光标于程序执行被挂起的指令地址上(EIP 寄存

器指针指向它)。

Breakpoint…

用于处理光标指向的汇编指令的断点 (或 )。它有如下子命令:

Toggle Breakpoint

设置或删除光标指向地址处的指令的断点。

Enable / Disable

Page 49: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

44

使光标所指的断点可用或禁止。如果光标处没有断点,这项不可用。

Properties

调出光标所指断点的属性对话框。如果光标处没有断点,这项不可用。

Go To Source

打开IDE源代码编辑器并将光标移至Disassembly窗口中光标所指汇编指令

相应的谓词处(可能的话)。

Copy

将窗口中选择的内容复制到剪贴板中。可以用 Shift+上箭头键和 Shift+下

箭头键进行选择。

Show OpCodes

勾选或去勾选此项可以显示或隐藏十六进制指令代码。这个代码显示在

HexCode 一栏内。

Source Annotation

这项可以显示或隐藏对应于谓词入口点的对象名称。每个对象名都单独占用

一行,放在相应的指令行之前,比如前面图中的_test$predicates$run$_s2。

Show Hints

显示正在执行指令的附加信息。

调试器的每个跟踪步之后 Disassembly 窗口都会刷新。

1.5.8.3. Disassembly 窗口命令

Step Into (F11) 命令

在 Disassembly 窗口中跟踪程序运行时,使用 Step Into (F11)命令将执行

一条汇编语言的指令(如果有过程,则会进入到该过程中)。也就是说,如果

Step Over 命令把一个调用过程当成跟踪的一步的话,Step Into 命令则是把调

用过程中每条指令当成跟踪的一步。通常,这就是逐行地执行汇编语言的指令。

Step Over (F10) 命令

在 Disassembly 窗口中跟踪程序运行时,使用 Step Over (F10)命令将执行

一条汇编语言的指令(包括调用命令)。也就是说,Step Over 命令与 Step Into

Page 50: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

45

命令差不多,只不过它把一个调用过程当成一步来执行,如果调用过程返回到下

一行指令,这就将是它的下一步。

Run to Cursor (CTRL+F10) 命令

在 Disassembly 窗口中跟踪程序运行时,使用 Run to Cursor (CTRL+F10) 命

令会使调试器在光标所指的指令处放置一个不可见的断点并执行 Debug Run (F5)

命令。能否运行到这个指令处则要看程序的情况了。

Disassembly 窗口可以用以下方法打开:

• 按 Shift+Alt+1 组合键;

• 在可跟踪源代码上按 Ctrl+D 组合键。打开后的 Disassembly 窗口 上一

行反汇编指令地址对应于在源代码中光标所指的谓词。

• 使用 IDE 菜单的 View | Disassembly。

如果跟踪的代码没有调试信息,调试器启动时会打开 Disassembly 窗口,指

令指针 指向将要执行的汇编指令。

1.5.9. Registers 窗口

Registers 窗口显示 CPU(中央处理器)各寄存器的当前值。这些寄存器分

为三个功能组:

32-bit 寄存器

1. EAX – 累加器;

2. EBX, ECX, EDX, ESI, EDI – 通用寄存器;

3. EBP – 帧指针(与 SS 结合使用);

4. ESP – 栈指针(与 SS 结合使用);

5. EIP – 指令指针(与 CS 结合使用)。

段寄存器(16-bit):

6. CS – 代码段寄存器;

7. DS – 数据段寄存器;

8. ES – 扩展段寄存器;

9. FS, GS – 附加段寄存器;

10. SS – 栈寄存器。

状态标志位(1-bit):

11. CF – 进位;

12. PF – 奇偶;

13. AC – 辅助;

Page 51: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

46

14. ZF – zero:结果为零;

15. SF – sign:结果为负;

16. OF – 溢出。

1.5.9.1. 寄存器数据格式

所有寄存器显示形式为:

Name = Value

其中:Name 为寄存器的符号名(如“EAX”),Value 是寄存器的值,以十

六进制显示。值使用了两种颜色:

• 红色,表示这个值在上一个跟踪步过后改变了,

• 蓝色,与上述情况相反。

图 1

浮点单元寄存器

1. CTRL - 16-bit 控制字寄存器

2. STAT - 16-bit 状态字寄存器

3. ST0 - ST7 - FPU (浮点单元) 寄存器

CTRL 和 STAT 是标准的 FPU 寄存器,我们这里不讨论,可以参考其它资料。

ST0 - ST7 是 FPU 的物理寄存器,如下图示, 可以看到 ST1 的 ST2 中的内容。

Page 52: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

47

图 2

图 2 中可以看到 ST1 = 0.127264953033057。

1.5.9.2. 弹出菜单

Registers 窗口关联的弹出菜单中只有两项内容:

Copy All

将 Registers 窗口中所有内容复制了剪贴板中。

Floating Point

打开 / 关闭 FPU 寄存器的显示。

每一跟踪步后,Registers 窗口都会刷新。

Registers 窗口可以用 Ctrl+Alt+G 组合键打开,也可以使用 IDE 菜单的

View | Registers。

通常 Registers 窗口会与 Disassembly 窗口配合使用。

1.5.10. Modules 窗口

Modules 窗口显示了调试的当前期间载入的所有模块。它显示了文件名、路

径、基本地址范围、代码地址范围、调试信息类型等。

Page 53: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

48

1.5.11. Memory Dump 窗口

Memory Dump 窗口显示了被调试程序的虚拟内存转储的内容。内存转储就是

一段地址范围的内存内容。这段范围由起始地址及观查窗口大小来规定。

Memory Dump 窗口由用竖线分隔的两部分组成。左边的每一行是一个十六进

制数,表示右边第一个存储单元的地址,右边是存储单元中的内容。内容可以按

十六进制或 ASCII 字符显示,也可以同时显示这两种格式。

内存转储行的长度取决于 Memory Dump 窗口宽度,显示出来的行数则取决于

Memory Dump 窗口的高度。

1.5.11.1. Memory Dump 窗口中显示的信息

Memory Dump 窗口中每一行显示的内容形式如下:

Address | [ HexValues ] [ ASCIIcharacters ] [ UnicodeCharacters ]

其中:

Address 是显示在本行的第一个内存转储单元的十六进制数地址。

Page 54: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

49

HexValues 是内存转储的十六进制格式的内容。内容可以按一个字节、两个

字节或四个字节显示,可以在弹出菜单中进行选择。

ASCIIcharacters 是内存转储的 ASCII 符格式的内容。一个字符对应内存的

一个字节,表示一个内存单元的内容。非打印字符显示为点。

UnicodeCharacters 是内存转储的 Unicode 字符格式的内容。一个字符对应

内存的两个字节,表示两个内存单元的内容。非打印字符显示为点。

例如:

Memory Dump 窗口的标题中给出了当前内存转储的模块名。如果不能确定模

块名,则会显示为 Unknown module。

1.5.11.2. 弹出菜单

Memory Dump 窗口关联的弹出菜单内容如下图示:

Page 55: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

50

Go To Address

Ctrl+G 可以调出 Go to Address 对话框,如下图示:

在这个对话框中可以输入一个新的地址(十六进制数),也可以使用符号化

的外部链接名及 CPU 寄存器名。如果调试器无法将一个符号名解释为实际地址

时,OK 按钮将不可用。点击 OK 按钮后调试器会按所选择地址更新 Memory Dump

窗口的显示。在 Memory Dump 窗口中双击也会调出 Go to Address 对话框。

Go To Dword Ptr

Ctrl+Shift+G 可以刷新 Memory Dump 窗口的显示,显示由 Dword Ptr 所指

地址为起始地址的内存内容。Dword Ptr 是光标所指内存单元起连续四个单元的

内容所形成的一个地址。

当光标所指的是一个 ASCII 或 Unicode 字符时,或虽然所指是十六进制数但

选择了 Show as Byte 或 Show as Word 项时,这个菜单项不可用。

当光标所指的是一个十六进制数并且选择了 Show as Dword 项时,或是光标

在地址栏内,这个菜单项才可用。这时,菜单项显示为 Go to XXXXXXXX,其中

的 XXXXXXXX 是十六进制数的地址:

• 如果光标所指的是左栏中的一个地址,则 XXXXXXXX 就是这个地址起连续

四个单元的内容。注意,它也就是本行右边第一个 Dword 的值。

• 当光标所指为右栏中的一个 Dword 值时,XXXXXXXX 也就是这个值。

Undo Go to

Alt+左箭头键可以刷新 Memory Dump 窗口,重新显示先前显示的内容。如果

当前内容是首次显示的,则这个菜单项无效。与下面要介绍的 Redo Go to 菜单

项配合使用,可以得到一个双向列表,列表的内容是 Memory Dump 窗口显示过的

所有首行地址。

Redo Go to

Alt+右箭头键的运作与上面的 Undo Go to 相配对,它刷新 Memory Dump 窗

口,重新显示执行 Undo Go to 命令前的内容。如果没有做过 Undo Go to 操作,

这个项无效。

Copy

Page 56: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

51

复制所选行的内容到剪贴板。选择某行,需要按住 shift 键再点击该行。可

以同时选择多个行的内容。

Copy Dword Ptr

Ctrl+C 可以将指定地址以 Dword Ptr 格式复制到剪贴板中。Dword Ptr 是光

标所指内存单元起连续四个单元的内容所形成的一个地址。

当光标所指的是一个 ASCII 或 Unicode 字符时,或虽然所指是十六进制数但

选择了 Show as Byte 或 Show as Word 项时,这个菜单项不可用。

当光标所指的是一个十六进制数并且选择了 Show as Dword 项时,或是光标

在地址栏内,这个菜单项才可用。这时,菜单项显示为 Copy XXXXXXXX,其中的

XXXXXXXX 是十六进制数的地址:

• 如果光标所指的是左栏中的一个地址,则 XXXXXXXX 就是这个地址起连续

四个单元的内容。注意,它也就是本行右边第一个 Dword 的值。

• 当光标所指为右栏中的一个 Dword 值时,XXXXXXXX 也就是这个值。

Refresh

刷新 Memory Dump 窗口。

Write Block

这个命令会打开如下图示的 Write Memory Block 对话框:

Filename:在这里指定保存内存块内容的文件名。

Start Address:指定内存块的起始地址(十六进制数)。

Length:指定内存块的字节长度(十六进制数)。

Show Hex

显示右边内存转储的十六进制数格式的内容栏。

Page 57: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

52

选择了这一项,就会使得弹出菜单中的 Show as Bytes、Show as Word 和

Show as Dword 项变为可用的。

Show ASCII

显示右边内存转储的 ASCII 格式的内容栏。

Show Unicode

显示右边内存转储的 Unicode 格式的内容栏。

前面这三幅图分别显示了同一内存块分别用不同格式显示的情况。如果同时

选择了所有这三项,该内存转储显示的情形如下图:

Page 58: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

53

下面这三项只有选择了 Show Hex 项时才可用:

Show as Bytes

每个十六进制数是内存单元一个字节的内容。

Show as Word

每个十六进制数是内存单元连续两个字节的内容。

Show as Dword

每个十六进制数是内存单元连续四个字节的内容。

Update Speed...

定义 Memory Dump 窗口的刷新频度:

Page 59: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

54

High

0.5 秒刷新一次。

Normal

普通刷新频率。

Low

较低刷新频率。

Manual

不自动刷新。

Memory Dump 窗口可以用 CTRL+Alt+M 组合键打开,也可以使用 IDE 菜单

的 View | Memory Dump。

Page 60: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

55

2. 命令行工具 2.1. Visual Prolog 编译器

Visual Prolog 编译器用于编译 Visual Prolog 源文件以生成 Visual

Prolog 的中间文件,这些文件是:

• COFF 格式的对象文件(.OBJ),

• 调试器信息文件,

• 浏览信息文件,

• 其它。

2.1.1. 使用编译器

编译器是一个独立可执行文件,可以使用命令行选项,退出时还可以返回下

列代码:

• 0 – 编译成功;

• 1 – 因为错误而编译终止;

• 2 – 由于编译器内部错误或命令行选项的原因而导致编译终止。

可以在批命令文件的 if 命令中使用标准的 errorlevel 参数,处理由编译器

返回的退出代码。

2.1.2. 命令行语法

命令行的语法为:

VIP7Compiler [options] [files] [@responce_file]

命令行中包含:编译器选项、要编译的源文件名(不能有通配符,各文件的

顺序无关紧要)、响应文件名。

[options]

这些选项将作用于所有源文件。

每个选项前用“/”或“-”字符与文件名区分开。

如果选项后有值,选项字母与值之间不应有空格。

选项名称与值名称可以不必写全,但必须要保证简化后它们是唯一的。

Page 61: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

56

如果选项(或选项值)后跟着“-”字符,表示关闭这个选项。与之相反,

如果选项(或选项值)后跟着“+”字符,表示打开这个选项。

出现的数字被当成是非负整数。数字前不能有负号。数字可以是十进制的,

也可以是十六进制的(前缀 0x)。

[files]

命令行中没有用“/”或“-”字符为前导的所有内容都被当成文件名。

文件名可以包围以双引号。

不带扩展名的文件名都被当成 Prolog 源文件的名字。

@responce_file

使用这个选项将使编译器读取指定的响应文件。

文件中以“#”开头的内容被当成注释而忽略。编译器会逐个串联响应文件

中的文本串,换行符替换以空格。 终的结果会在命令行中替换掉选项@自身。

替换后会接着进行选项分析。处理响应文件时产生的任何错误都会导致选项

分析的终止。

响应文件不能够嵌套。

响应文件的总数没有限制。

2.1.3. 命令行选项

编译器可以处理以下选项:

/Help

这个选项会使编译器在屏幕上显示编译选项的简要说明。

如果没有对编译器给出任何选项或文件也会显示选项的帮助信息。

/VERsion

打开这个选项将会输出关于编译器版本的附加信息。

个人版中这个选项总是打开的。

/Goal:{PROC|DETerm}

Page 62: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

57

此选项决定程序目标(Goal)段的确定性模式。决定的模式可以是下列之一:

PROC --认为目标段是 procedure (这是缺省选择)。

DETerm --认为目标段是 determ (确定性的)。

/Check: {ALL|ON|RANge|NOne|OFF|INTegraloverflow|VARiable|STAck|FACts}

/NOCheck

此选项决定编译器要对目标文件生成哪些类型的检查。这些检查在目标程序

执行时进行。下列的各项多选时可用逗号分隔开:

ALL | ON -- 生成所有的检查。缺省是 /Check:all。

RANge -- 检查数值域的值是否在域所规定的范围内。

INTegraloverflow -- 检查计算中的整数溢出。选此项后,编译器将

产生一段代码检查整数算术操作结果是否发生了整数溢出

NOne | OFF -- 生成 少的程序执行过程中的检查。与/NOCheck 选项

相同。

VARiable -- 为所有谓词变量赋一特定值用于变量初始化检查。

STAck -- 由一个(determ 或 procedure)谓词返回后检查栈的状态。

它可以捕捉到调用转换的不正确使用或栈销毁时其它一些情况的错误。

当谓词不是在 Visual Prolog 中实现时这类情况是经常出现的。

FACts -- 检查未初始化的事实及确定性事实的重复插入。

选项举例:

/check:none 与 /NOCheck 或 /c:off 相同 /Check:all 与 /Check 或什么都不写相同(缺省就是它)

/MAXErrors:<N>

此项确定编译器可接受的 大错误数。在编译器处理一个编译单元时,产生

的错误数达到了这个数,编译器就会发出“Too many errors”消息并中止编译,

返回异常退出代码。

设为“0”值时,编译器不检查产生的错误数量。

缺省值是 20。The default value is 20.

/MAXWarnings:<N>

Page 63: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

58

此项确定编译器可接受的 大警告数。在编译器处理一个编译单元时,产生

的警告数达到了这个数,编译器就会发出“Too many warnings”消息并中止编

译,返回异常退出代码。设为“0”值时,编译器不检查产生的警告数量。

缺省值是 100。

如果设置了选项 /Warning:AsError,则编译器会将产生的警告视同错误,

忽略/MAXWarnings 选项。

/Include:[[<dir>;]*<dir>]

指示编译器将这些目录连接到已有的 include 目录列表中。

缺省的 include 目录是当前目录。

这个选项为编译器规定了搜索 include 文件的附加目录,这些文件是在编译

器源文件的预处理程序#include 指令中提到的。

在一个/Include 选项中可以规定多个目录,目录之间要用分号分隔开。如

果使用了多个/Include 选项,后面规定的各目录也会添加在 include 目录列表

中。 目录重复不是问题。

编译器按以下方式查找规定的 include 源文件:

• 如果文件名中包括有绝对路径,按其指定路径查找;

• 没有路径的,在当前目录中查找;

• 查找无果的,按/Include 选项规定的目录查找。查找的顺序按选项中给

出的顺序进行。在 IDE 中,还可以在工程设置对话框的 Directories 标签

中 Include Directories 指定要查找的路径。

/Warnings: {ASError|ASWarning|NOthing|warning_name [+|-|*]}

此选项规定编译器产生怎样的警告,可以使用以下的值:

ASWarning -- 所有警告只当成警告处理(这是缺省设置)。

ASError -- 所有警告当成错误处理。

Nothing -- 所有警告都被忽略。

{ warning_name | warning_number } [ warning_state ]

其中 warning_state 可以是如下情况之一:

+ 做为警告处理(这是缺省设置)。

Page 64: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

59

- 忽略(不检查该警告)。

* 该警告当成错误处理。

前三项值 ASError、ASWarning、NOthing 将影响所有警告,而

{ warning_name | warning_number } [ warning_state ] 可用于

逐个规定编译器对某一警告的处理要求。如果 warning_state 省略

了,则缺省设置为“+”。一个选项中可以指定多项值,这些值要

用分号分隔开。

warning_name 和 warning_number 可以是下列值:

INVALDig | 212

(在实数域声明的)数字的值太大了,被置为所能支持的 大值。

参见错误消息 c212。

SCOPERef | 213

在 SUPPORTS/PREDICATES FROM/OPENS/INHERITS 中的一个名称等

于一个范围名称。参见错误消息 c213。

ALREADYSup | 260

接口已经在一个类声明中支持过。参见错误消息 c260。

REAL2Int | 517

实数值转换为一个整数值。参见错误消息 c517。

SINGLEFact | 288

单个事实没有参数。参见错误消息 c288。

PREDRES | 259

谓词解被放弃了。参见错误消息 c259。

UNUSEDvar | 507

未使用的变量。参见错误消息 c507.

UNUSEDEnt | 654 | 661 | 662

未使用的实体。参见错误消息 c654、c661、c662。

SCOPE | 214

在 SUPPORTS/PREDICATES FROM/OPENS/INHERITS 中的重复名称。参

见错误消息 c214。

RESOLve | 228

在 PREDICATES FROM/RESOLVE 中的重复解。参见错误消息 c228。

PROCedure | 631

Page 65: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

60

声明的谓词模式不副实际。参见错误消息 c631。

CONVersion |656

多余的转换。参见错误消息 c656。

RANGe | 525

会出现超范围。参见错误消息 c525。

MORETHANonce | 313

多次使用的变量。参见错误消息 c313。

INITObject | 657

使用未完全初始化的变量会导致错误(缺省时是关闭的)。参见错

误消息 c657。

举例:

/W:aserror

/W:no,invaldig*,+scope

/W:-notgr

/Warn:631-

/Optimize:{ALL|None|FINal}

这个选项与优化有关,可用的值有:

ALL -- 完全优化。

None -- 不做优化。

FINal -- 对 后调用做优化。

/Listing: ALL,NOne,MIN,Include,UNICode,STATistics,MEssage,Requires

/NOListing

此选项规定哪些信息要放入列表文件。所有错误总是要放入列表文件的。警

告是否放入列表文件由/WARning 选项控制。

选项中可以指定多个值,各个值间要用分号分隔开。可用的值有:

ALL -- 所有的都写入列表文件。

None -- 都不要。

Page 66: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

61

MIN -- 小化的(除了强制指定的而外都不要)。这是缺省设置。

Include -- #include 指令

UNICode -- UNICODE 输出(缺省是 ANSI)

STATistics -- 生成统计信息。

Message -- #message 指令

Requires-- #requires 及 #orrequires 指令

举例:

/L:all

/L:min or /L

/L:all,message-

/NOL or /L:NO

/DEBug: {NONE|LINENO|FULL}

/NODEBug

此项规定调试信息的详细程度。可用的值有:

NONE

编译器不要把行号及调试信息放入目标文件。

LINENO

编译器应把行号信息放入目标文件。这可用于在老的 C调试器中(如 TD

或 CodeView)跟踪执行过程。要注意,只能对 Prolog 的主模块(包含

有目标段的模块)生成行号信息。

FULL

编译器应把行号信息及调试信息都放入目标文件。它就是在 LINENO 的

基础上再添加用于 PDC 调试器的信息。这是缺省设置。

/OBjectdir: <dir>

这个选项中可以指定目标文件的目录。

/DEBUGDir: <dir>

这个选项中可以指定调试信息的目录。

Page 67: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

62

/PRO2C

指定这个选项时,编译器会给每个被编译单元生成 C++头文件。例如,编译

一个包文件 Test.pack,生成的头文件名为 Test.pack.hpp。请注意,这还是一

个实验性的选项,请谨慎使用这样生成的.hpp 头文件。

/PROFILE: {OFF | MIN | ON}

为一个编译模块指定这个选项时,可以对这个模块使用取自 profile 包的

profileCount 类谓词。

/READOnlyterm

这个选项是由 IDE 自动处理的。当编译 DLL 类型的模块时总是需要使用这个

选项,而编译可执行类型的模块时一定不要用这个选项

一个编译模块使用这个选项时,在这个模块中一有可以被其它模块看到的常

数时,这个常数就会被从该模块的只读存储器(它原来存储的地方)复制到调用

第一个模块的那个模块的可写存储器中。

这种复制 DLL 只读存储中的常数到加载这个 DLL 的模块的做法,是为了避免

下述这样的问题:一个可执行程序可以载入 DLL,而且可执行程序子句可以接受

来自 DLL 的常数项;如果一个 DLL 模块不使用/READOnlyterm 选项,则常数就不

会由 DLL 只读存储中复制到加载 DLL 的那个可执行程序的存储区中(由于性能需

求的原因);可执行程序只创建一个指针指向 DLL 内存块,这个内存块中有常数

项的索引;当可执行程序卸载该 DLL 并试图使用索引的常数项时,可执行程序会

用创建的常数项指针访问 DLL 内存块,但卸载后的 DLL 内存对可执行程序来说是

不可访问的,这就有可能出现异常。

因此,编译器编译用于构建 DLL 的模块时,就需要用/ReadOnlyTerm 选项。

但是,如果编译的不是用于构建 DLL 的模块,为了提高性能,应该不用这个选项。

/WEAKTypecheck

这个选项使编译器执行弱类型检查。缺省是关闭这个选项。该选项用于与以

前编译器版本的兼容。如果以前编译成功而现在出现新的类型错误,那或是更正

这样的类型错误,或是打开这个选项。

2.2. 命令行链接器

2.2.1. 简介

PDC 的 Link Editor 是个组合目标文件 (.OBJ)、资源文件(.RES)及库

文件(.LIB)为单一可执行文件(.EXE)或动态链接库(DLL)的链接器。

Page 68: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

63

PDC Link Editor 可以接受以下类型的输入文件:

• (32-bits Borland 编译器生成的)OMF 格式目标文件和库文件,文件数

量没有限制。

• (由,比如说 Microsoft (C) 32-bits 编译器生成的)通用目标文件格

式(COFF)的目标文件,文件数量没有限制。

• 链接器可以链接 OMF 和 COFF 格式混合(有一定的调用规则限制)的目标

文件,生成有效的可执行文件。

• Microsoft 库格式的库文件,文件数量没有限制。

• 档案格式的库文件,文件数量没有限制。

• 标准的 Windows 32-bits 资源文件,文件数量没有限制。

• 定义文件(.DEF),文件数量没有限制。

PDC Link Editor 可以生成以下类型的文件:

• Windows 32 可执行文件。

• Windows 32 动态链接库(DLL)格式(PE)。

• Windows 32 创建 DLL 的输入库。

• A linker 映射(.MAP)文件。映射文件是一种文本文件,包含有所生成

的映象文件相关信息。

2.2.2. 使用链接器

链接器与标准的独立可执行文件一样,它可以接收命令行参数,在退出时会

返回下列代码之一:

• 0 – 链接成功完成;

• 1 – 链接因错误终止;

• 2 – 链接因链接器内部严重错误终止。

可以在批命令文件的 if 命令中使用标准的 errorlevel 参数,处理由链接器

返回的退出代码。

2.2.3. 命令行语法

命令行的语法为:

Vip6link.exe [options] [files] [@responce_file]

Vip6link.exe 是 PDC 链接器的可执行文件。

链接器 简单的使用方法,就是只给出目标文件名,其它参数全用缺省值。

链接器名之后什么都没有,会显示简要帮助。

Page 69: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

64

链接器命令行中的内容有:链接选项、要链接的目标文件名及库文件名(顺

序随意)、定义文件(.DEF)名、响应文件名。文件名可以用双引号包围。选项

作用于所有要链接的文件。

各选项前要前缀“–”字符以与文件名相区分。没有这个字符作前缀的内容

都被认为是文件名。

选项后面的值与选项名之间不能有空格。

选项要按规定大小写。

PDC Link Editor 从左至右扫视各选项,如果某些选项相互有冲突,链接器

将选用 右边的选项。如果某个选项对目标文件不切实际,则会忽略它。

如果定义文件(.DEF)中的指令与命令行中选项的功能是相同的,则以定义

文件中的指令覆盖命令行中的选项。

有些 PDC Link Editor 选项带有数值参数。这样的数值都是非负整数,不能

带有负号。PDC Link Editor 使用 C 语言风格的整数常数表示法(但不包括整

数后缀)。十进制数以非零数字开始,由若干位十进制数字构成。八进制数由前

缀 O及若干位 0-7 的十进制数字构成。十六进制数由前缀 Ox 或 OX 及若干十进制

数字和字母 A到 F(或 a到 f,分别代表十进制数的 10 到 15)构成。

如果一个选项(或选项值)后跟有“-”符号,表示关闭该选项。相应地,

如果一个选项(或选项值)后跟有“+”符号,表示打开该选项。

@ResponceFileName 表示使用响应文件 ResponceFileName。

2.2.4. 命令行选项

链接器可以处理下面形式的选项:

-TP[E]

目标文件应当是一个 Windows 32-bit 可执行文件(PE)。这是缺省值。TP

也可以使用(.EXE 是缺省扩展名)。

-TPD

目标文件应当是一个 Windows 32-bit 动态链接库(DLL)文件。缺省是 TPE

(生成 EXE)。

-S{GUI|CUI|NOVIO}[:Major[.Minor]]

指定目标模块需要兼容的操作系统类型:

Page 70: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

65

GUI

使用 windowing API (window 应用程序或 DLL)。

CUI

控制台应用程序(与 windowing API 兼容)。

NOVIO

控制台应用程序(与 windowing API 不兼容)。

:Major.Minor

操作系统(Windows)主版本号与次版本号。指定应用程序所期望可以正

常运行的 Windows 版本。

-O|o[OutFile]

目标模块(主输出)文件名。缺省是 out.exe 或 out.dll。

-L[ImpLibFile]

创建 MS 库(OMF)格式(与 BC 兼容)的引入库。ImpLibFile 指定引入库名,

缺省是 out.lib。

-l[ImpLibFile]

创建文档(COFF)格式(与 MSC 兼容)的引入库,只能用于 Windows 32 可

执行程序或 DLL 格式(PE)。ImpLibFile 指定引入库名,缺省是 out.lib。

-M|m[MapFile]

以 MapFile 为文件名生成链接映射(.MAP)文件,缺省是 out.map。映射文

件是一个文本文件,它包含所生成映象文件的相关信息。

-b[BaseAddrHexValue]

这个选项将模块的基地址设置为 BaseAddrHexValue。对可执行文件,缺省值

是 0x400000。

BaseAddrHexValue 指定基地址的十六进制值。例如:-b500000 表示基地址

是 0x500000。

操作系统一开始用这个指定的基地址或缺省值加载程序,如果空间不够,系

统会重定位程序。

注意,有些操作系统要求基地址是 64K 的整倍数。

-C

Page 71: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

66

可以随意大小写的记号。

-d

生成特殊段(用于 PDC Debugger)。

-E[Symbol]

将本选项中指定的 Symbol 设置为模块的入口指针。

-s[StackSize]

为生成的模块保留栈空间,大小为 StackSize 个字节。要注意,这个值在运

行时是增加不了的。

-q

不要把头写到输出(没有发生错误时它就是空的)里。

-F|f[ResponceFileName]

设置可选的响应文件名为 ResponceFileName。响应文件是一个文本文件,

其中有一个或多个选项的串,这些选项可用于 PDC Link editor 的行命令中。响

应文件的数量没有限制。

-DefToImportLib [:ImportLibFileName]

强制链接器由一个指定的定义(.DEF)文件创建引入库 ImportLibFileName。

不需要指定 object 文件。

-V[OutFileName]

UNICODE 输出到文件 OutFileName。本选项比–eFileName 选项的优先级高。

-e[FileName]

设置将错误消息输出到文件 FileName。如果选项里没有指定 FileName 则链

接器会将错误消息输出到标准的错误输出设备(stderr)上。(缺省是 stderr )。

-U[Major[.Minor]]

设置用户指定的模块版本号,目标模块会使用这个版本号。缺省是 0.0。

-u[Symbol]

Page 72: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

67

设置 Symbol 为未定义符号(从库中抽取某个模块时可能用得上)。将所有

未定义符号解释为 Symbol。

-t

将链接时间戳写到目标模块头部(缺省是 0)。

-W[I|M|U]

告警级别。这个选项确定了要报告哪些运行时链接器消息。选项可用以下各

项的任意组合:

I

未定义的空闲符号(缺省)。

M

当前处理的文件和模块名。

U

所有解决了的未定义符号。

例如,-WUM 将使链接器报告所有解决了的未定义符号及当前处理的文件及

模块名,但不会报告未定义的空闲符号。

2.2.5. 使用响应文件

响应文件是一个选项的文本文件,它包含的内容可以用于 PDC Link Editor

的行命令中。

要将响应文件传递给 PDC Link editor,应该使用如下方法:

Vip6Link.exe -FResponseFileName

其中的 ResponseFileName 是一个响应文件名。

参数 -FResponseFileName 会使 PDC Link Editor 对指定的响应文件

ResponseFileName 进行扫视,响应文件中的各参数会逐项带入到命令行。

响应文件中的各参数可以用以下各空白字符(一个或多个)相分隔:

• new-line,

• 空格,

• 水平或垂直制表符,

• 换页,

• line feed。

Page 73: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

68

包含有空白字符(文件名)的参数需要使用双引号,使用了双引号的参数必

须只占用一行(也就是说它其中不能含有 new-line 字符)。

两个没有被分隔的参数会被当成一个参数处理。

响应文件中可以包含注释行。一行的首字符为#表示这是注释行。

Visual Prolog 的链接器语法允许在命令行的任何位置使用多个响应文件。

也可以混合使用命令行选项及响应文件,唯一的要求是响应文件替换后的结果是

有效的命令行。响应文件不能嵌套。

2.2.5.1. 举例

# 目标: Windows 32 可执行文件,控制台应用程序 -TP -SCON # 入口指针 -E_VIPStartUp@0 # Object 文件 x1.obj x2.obj x3.obj # 库 C:\MSDEV\LIB\libc.lib C:\MSDEV\LIB\oldnames.lib C:\MSDEV\LIB\kernel32.lib C:\MSDEV\LIB\user32.lib C:\MSDEV\LIB\gdi32.lib C:\MSDEV\LIB\comdlg32.lib

2.2.5.2. 在 IDE 中调用链接器

用工程设置(Project Settings)创建 Visual Prolog 新工程时,提供了所

有需要的参数。

在工程设置 General 标签的 Linker Name 中如果选择了 PDC Linker,就会

在工程构建脚本中生成对 Visual Prolog 命令行链接器的调用。

IDE 的 Make 工具使用这些脚本在 IDE 中调用链接器来对工程进行链接。

工程设置也可用来更动已有工程的全局设置。工程设置会更新相应的调用链

接器的脚本。

可以在工程设置对话框 Build Options 标签的 Build Script 中预审调用链

接器的命令行内容:

"$(ProDir)Bin\VIP6Link.exe" -F<< -E_VIPStartUp@0 -d -TPE -SGUI -o"$(ExeDir)$*.exe" -M"$(ObjDir)$*.map" $(PROJECT_OBJ) "$(ObjDir)$*.res" $(PROJECT_LIB) "$(ProDir)Lib\unicows.lib" "$(ProDir)Lib\Win32.lib"<<

Page 74: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

69

注意,在<< ... <<之间的文本内容会被放入到响应文件中。

如果工程设置中生成的脚本不能完全满足需要,可以在缺省的对 PDC 链接器

调用中自行插入需要的内容。

下列 IDE 菜单项会使 IDE 调用 PDC 命令行链接器:

Build | Build

Build | Rebuild All

Build | Execute

Debug | Run

2.2.6. 定义文件

模块定义(.DEF)文件可以为链接器工作提供附加的输入内容。

模块定义文件描述了一个应用程序或库的基本特征。

2.2.6.1. 定义文件格式

如果模块定义文件中引用的符号与某个保留字相同(不论大小写),则必须

使用引号(单引号或双引号均可)。

除了上述的限制,文件的格式相当自由。定义文件中的注释由分号字符“;”

引入,一直扩展到这一行的结束。new-line 字符就相当于空白,没有什么特殊

的语法含义。

在一个定义文件中只能出现一次 NAME 或 LIBRARY 指令。如果这两个指令

都没有出现,缺省认为是 NAME,该模块被认为是一个应用程序。

2.2.6.2. 定义文件的指令

下面介绍定义文件中使用的重要指令:

• DESCRIPTION 模块的一行描述。

• EXPORTS 建立外引的函数。

• IMPORTS 建立引入的函数。

• LIBRARY 动态链接库名,不创建应用程序。

• NAME 指定应用程序名,不创建库。

• STACKSIZE 建立局部栈,以字节计。

Page 75: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

70

DESCRIPTION

DESCRIPTION 'text'

这个指令将相关的文本插入到被链接的应用程序或库中。文本 大长度为

254 个字符。

DESCRIPTION '(c) Copyright 1984-2003 Prolog Development Center A/S '

上面这个例子是把复制权标记嵌入到被链接的应用程序或库中。

EXPORTS

缺省时,模块中的函数在运行时对所有其它模块都是隐藏的。这个指令使指

定的函数可以为运行时其它模块引用。

EXPORTS function_definitions ...

外引函数定义的语法是:

ExtName [ = IntName ]

ExtName

函数对外的名称。

IntName

函数在本模块内的名称。如果没有给出 IntName,则认为与 ExtName 一样。

每个 function_definition 必须单独占用一行。EXPORTS 关键字可以与第一

个 function_definition 在同一行,也可以单独放在前一行。

EXPORTS GetString = StringIn

上面的例子指定了本模块中的一个函数可以为其它模块所用:GetString 就

是本模块中的 StringIn。

参看语言参考中 Exporting and Importing Classes 主题有关#export 预处

理指令的内容。

IMPORTS

这个指令按名称及模块列出所有本模块引用的其它模块中的函数。

IMPORTS [ Internal = ] module.funct ...

Page 76: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

71

IMPORTS

IMPORTS 指令独占一行,后面是引入的定义。

Internal

内部名称(可选)。

Module

外部模块名。

Funct

函数标识,它既可以是外引模块中 EXPORTS 列表定义的名称,也可以是一

个顺序值。如果是后者,则需要有内部名称。如果省略了内部名且 funct

是一个名称,则它也用于内部名。

每个引入定义包含有可选的内部名、外部模块名及函数标识。

IMPORTS read.CharInput NewString = read.GetString

上例中定义了两个由模块或库名为 read 引入到本模块的函数,一个是 read

中指令 EXPORTS 列出的 CharInput,另一个是 GetString。在本模块中使用它们

时,CharInput 使用的就是这个名称,而 GetString 则称之为 NewString。

参看语言参考中 Exporting and Importing Classes 主题有关#externally

预处理指令的内容。

LIBRARY

这个指令表明生成的目标文件是动态链接库,可以为其指定一个名称。

LIBRARY [libname]

在一个定义文件中只能出现一次 NAME 或 LIBRARY 指令。如果这两个指令

都没有出现,缺省认为是 NAME,该模块被认为是一个应用程序。

例:

LIBRARY mylib

上例定义了一个名为 mylib 的动态链接库。缺省情况下 mylib 是不带后缀的

输出文件名。

NAME

这个指令表明目标文件是一个应用程序,可以为其指定一个文件名。

Page 77: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

72

NAME [appname]

在一个定义文件中只能出现一次 NAME 或 LIBRARY 指令。如果这两个指令

都没有出现,缺省认为是 NAME,该模块被认为是一个应用程序。

NAME myapp

上例定义了一个名为 myapp 的应用程序。缺省情况下 myapp 是不带后缀的输

出文件名。

STACKSIZE

STACKSIZE 指令为所生成的模块保留若干字节的栈空间。

STACKSIZE nnn

STACKSIZE 指令与命令行选项-s 功能完全一样,但前者可以覆盖后者。

下面的例子中,不管链接器运行时在命令行中设置的是多少,STACKSIZE 为

所生成的模块设置了 100000 字节的栈空间。

STACKSIZE 100000

指定的值 nnn 必须是一个整数,而且还应当是个偶数,因为栈的运作通常

都是以双字节为一个单元的。缺省时认为 nnn 是个十进制数,但也可以使用 C

语言协议中的十六进制数或八进制数。STACKSIZE 必须大小 70 K。

2.3. ProDoc

2.3.1. 概述

ProDoc 是 Prolog 文档工具软件,用于从包含有特殊注释的 Visual Prolog

源代码文件制作在线索引资料。

Prolog 编程人员在设计时就可以用 ProDoc 从自己编写的代码中生成文档,

就如同 Java 编程人员使用 javaDoc 那样。这样的工具可以帮助人们在设计时就

得到良好的代码文档。还可以用 ProDoc 给一组 Visual Prolog 源文件生成包括

总览的 API(应用程序接口)文档。

ProDoc 工具可以对组织形成链接包的 Visual Prolog 源文件进行分析,生

成相应的 HTML 文档,文档中描述了包的嵌套层次结构及包的概览,其中包括类,

接口及接口支持关系。在接口与类中,还描述了所声明的域、谓词、构造器及常

数。接口与类中也描述了名称的可见范围(open 限定的描述)。

生成的 HTML 文档可以使用任何 Web 浏览器阅读。

Page 78: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

73

ProDoc 工具还可以处理 HTML 文件,将 HTML 文档中的 Prolog 名称(接口、

类、域、常数、谓词)与先前 ProDoc 由 Visual Prolog 源文件生成的文档文件

中这些名称的声明之间建立超链接关系。

ProDoc 还生成的一些附加文件,这些文件可用于生成 Microsoft HTML 帮助

格式 (.CHM)的文件。

ProDoc 工具可以帮助:

1. 代码文档的处理标准化,

2. 在一开始就使代码很好地归档,

3. 尽可能缩短程序员与 technical writer 之间的距离。

2.3.2. 术语

generated document (生成文档)

ProDoc 工具由 Visual Prolog 源代码文件的文件注释中生成的文档。生成

文档是 HTML 格式的。注意,还会生成一些服务文件。

name (名称)

Visual Prolog 语言中程序元素的名称,如:包的名称,类及接口的名称,

域和域函子的名称,构造器、谓词或常数的名称。名称可以带有完整的限定描述

(声明的范围),如 vpiDomains::e_Create 或不完整的限定描述如 write/3->。

documented classes & interfaces(备案的类与接口)

那些 ProDoc 运行时生成了详细文档的类与接口。要能备案,其源文件必须

可用,源文件名或包名要传递给 ProDoc 命令。它还被称之为包括在 ProDoc 输出

的类,或包括的类。

referenced names (引用名)

declaration information (声明信息)

(类、域、谓词等的)引用名就是在 Visual Prolog 声明或被处理文件的文

档注释中明确提到过的名称。引用的例子包括参数域、构造类型、支持的接口等。

ProDoc 工具运行时,为要能够创建所有引用名的超链接,它会(生成)载入相

关的声明信息。 ProDoc 生成被处理文件中声明的名称相关的声明信息并将它放

入到特殊的数据库文件中(缺省文件名是 default.dba,也可以在命令行中使用

-db dbname 选项指定文件名)。这以后,有关 ProDoc 处理的名称的声明信息就

可以用-resolve external.dba 选项在再运行 ProDoc 时载入。这些声明信息也

可以用于确定引用名的超链接。

external referenced names (外部引用名)

Page 79: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

74

那些 ProDoc 运行时没有生成文档的引用名。换名话说,这些名称的声明没

有传递给 ProDoc 工具。生成文档中这些类的链接被称为外引的或外部链接的。

documentation comments (文档注释)

Visual Prolog 源代码中包含有@xxx 文档标签的特殊注释。ProDoc 工具对

这些注释进行处理生成相应的文档。

2.3.3. 输入文件

ProDoc 工具由几种不同类型的输入文件来生成输出 HTML 文件:

• 接口及类的 Visual Prolog 源文件 .i 和 .cl。

• 链接的接口及类的集合可以组成包。ProDoc 可以用特殊方式处理这样的

包,生成包的概览。这个包概览必须在包的根目录下作为 HTML 格式源文

件以特定的文件名 packPackageName.HTM 传递给 ProDoc。其中的

PackageName 部分要与处理的包名称相同。可以看看 PFC 包的例子。

• HTML 格式文件,文件中标签<a> </a>之间包含有 Visual Prolog 名称。

如果这些Visual Prolog名称与声明在不同的被处理源文件包中, ProDoc

可以生成名称和声明间的超链接。

• 包也可以含有实现及其它文件,这些文件就在源目录中,但又不需要对它

们编制文档。

用于 ProDoc 的输入文档(源文件)必须是纯文本文档,其中包含有特殊的

带文档标签的注释,这类注释称之为文档注释。

2.3.4. 源文件处理

ProDoc 工具应用命令行选项处理 Visual Prolog 源文件。如果运行 ProDoc

工具时明确指定了源文件名,则可以严格地确定哪些文件要处理。不过,通常这

不是大多数开发者想要做的,简单的办法就是提供包名(文件夹的名字)。

ProDoc 工具在运行中分析 Visual Prolog 的源文件,理解接口、类、域、

谓词、构造器及常数的声明。检测到 Prolog 实体名称的声明时,就会把后续链

接声明及其名称应用所需要的信息保存在内部数据库中(数据库保存文件的名称

可以在命令行-db 选项中指定)。ProDoc 工具可以自动添加在其它声明中使用的

接口、类及域的名称与这些名称声明间的交叉索引链接。

超链接出现在以下一些地方:

• 在谓词、域、常数的声明中。所有参数的域及子域会有超链接到它们的声

明。

Page 80: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

75

• 接口与类的声明中。声明过的 Prolog 实体所有使用过的名称会有超链接

到它们的声明。

• 在文档注释谓词名中,如 like scopeName::predicateName[Arity]会自

动添加超链接。这里的[Arity]是可选的元维,其形式对于谓词来说是

/numberOfArguments 而对函数来说则是/numberOfArguments-> 。

• 在文档注释与 HTML 格式文本文件中用于名称的<a> </a>标签中,如

<a>scopeName::entityName</a>。

• 域、谓词、构造器及常数的摘要表中。

• 包、接口及类的层级及相互关系结构树中。

• 目录及索引等。

2.3.5. 融合分别生成的文档集

每次 ProDoc 工具运行会生成一个完整的文档集。它做不了增长型的构造,

也就是说,它不能修改或直接合并以前运行生成的结果。不过,使用命令行选项

-db projectDataBase.dba 及-resolve externalDataBase.dba!prefix 可以使

ProDoc 生成标签<a> </a>中的名称与这些名称在先前生成文档中声明间的超链

接。

可以使用 mergeMPJ.exe 工具将几个分别生成的文档集合并成一个,合并后

会有合并目录表及合并索引。

2.3.6. 文档注释

2.3.6.1. 文档注释的语法

文档注释必须放在普通的 Visual Prolog 注释中间。Visual Prolog 的注释

可以是多行的也可以是单行的。多行注释以/* (斜杠加星号字符)开始,后面

是注释内容(可以有换行),以*/(星号加斜杠字符)结束。单行注释以%(百

分号字符)开始,后面是注释内容,到本行尾结束。

文档注释带有特定的文档起始标签关键字加前缀符号@,直到可选用的文档

结束标签@end 为止,或是到下一个文档起始标签前缀@符号为止,或是到普通

Visual Prolog 注释结束为止。注意:如果出现几个连续的单行注释,没有直接

写明结束符号时文档注释的结束是在 后一个单行注释的结尾。可参看后面的例

子。

文档注释的语法形式是:

文档注释 := 起始标签 注释文本 [结束标签] 起始标签 : @标签关键字

Page 81: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

76

结束标签 : @end 标签关键字:下列之一 short detailed author arg flow return fail error version example link include withdomain

描述类/接口声明的文档注释应该放在包含有该类/接口声明的 Prolog 文件

中,就在该类/接口声明之前。

描述其它名称的文档注释应该放在紧随这些名称(域、谓词等)声明之后的

位置。也可以放在段的起始关键字(如 predicates)与名称声明之间。可以参

看后面的例子。在 PFC 包源文件中也可以看到很多文档注释。

文档注释举例

下面是正确的文档注释:

predicates getControlCoordinates : (rect DialogBasedUnitsCoordinates) -> rect procedure (i). % @short Converts rectangle coordinates from dialog base units to pixels. % @end getWindowRect : () -> rect procedure (i). % @short Returns the window rectangle . % @end

下面是一个不正确的文档注释:

predicates getControlCoordinates : (rect % @short Rectangle domain (这样的注释无效) DialogBasedUnitsCoordinates) -> rect procedure (i).

2.3.6.2. 直接使用超文本标记

为了在生成文档中含有各种 HTML 格式、映象等内容,文档注释可以使用几

乎所有原态的 HTML 标记。后面章节第二个例子就演示了使用一些简单的 HTML

标记的情况。更复杂的情况可以参看 PFC 源文件。

2.3.6.3. 文档标签

ProDoc 工具可以识别以下标签:

@short

这个标签开始一段声明实体的简要描述。建议这个简要描述就是一句话。这

个描述会放入到相应的摘要段(Domain Summary、Predicate Summary、Constant

Summary)。

Page 82: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

77

@detailed

这个标签开始一段声明实体的详细描述。这就是名称描述的 Description

段的文本。

@fail

这个标签说明谓词什么时候会失败。它就是名称描述的 Fails 段的文本。

@exception

这个标签描述该谓词可能出现的异常。它就是名称描述的 Exceptions 段的

文本。

@example

这个标签开始一个举例的描述。它就是名称描述的 Example 段的文本。该标

签后的所有文本都将按预先格式化的段落显示,并且加亮。

@withdomain domainName

这个标签告诉 ProDoc :这个常数段描述必须放在紧随 domainName 域描述

之后的位置。domainName 域以及这个常数段应该是范围相同的,这样才有意义。

例如:

constants % @withdomain scrollCode % @short Constants describing scroll bar actions used in scroll bar events: % @end sc_None = 0. ... sc_Bottom = 8.

@withdomain 标签用于需要把预定义常数描述直接放在常数所使用的域描

述中。例如:

domains scrollCode = integer. % @short Specifies types of scroll events. <br> % % @detail Predefined constants are: <br> % <b>sc_None</b> Nowhere (event should be ignored). <br> % <br> % <b>sc_LineUp</b> The user clicks the top scroll arrow. % Decrements the scroll box position. Scrolls one line up. <br> % <br> % ...

@overview

Page 83: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

78

这个标签可用于文件的头部。它指明了包含概览文档的文件名。缺省时每个

包有一个概览文件,这个文件必须在包的根目录下作为 HTML 格式源文件以特定

的文件名 packPackageName.HTM 传递给 ProDoc。这个标签为个别源文件使用不

同概览文件提供了方便。这个概览可以用在类/接口描述头部的 Overview 超链接

打开。

@author

这个标签后是文件作者的描述。这是个废弃了的标签,现在其信息并没有采

集到生成的文档中,不要再用它了。

2.3.6.4. 加亮谓词(域)参数的名称

#ArgumentName

ProDoc 可以识别文档注释中以#为前缀的名称。它会把所有带有前缀#的名

称 #ArgumentName 视为谓词/域的参数,并用在 Prolog 代码中用于谓词/域参数

显示的配色突出显示这样的参数名称。

2.3.6.5. 给谓词名自动添加超链接

scopeName::predicateName/n

scopeName::predicateName/n->

ProDoc 可以识别 Prolog 源文件文档注释中明确指出元维的谓词名称。它能

辨识类似scopeName::predicateName/n和 scopeName::predicateName/n->这样

的串是 Visual Prolog 谓词名,如果这个谓词名的声明信息它已经知道,就会创

建谓词名与其声明间的超链接。注意,需要正确指明谓词的元维/n 或/n->。

如果predicateName/n或 predicateName/n->中的谓词名在其声明的范围内

使用,即使没有显式地加上范围名(scope name)也可以建立相应的超链接。

2.3.6.6. 给域名自动添加超链接

如果 Prolog 实体声明中使用了域名,而 ProDoc 工具能够确定其相应的声明

时,就会建立两者间的超链接。

2.3.6.7. 增强的 Prolog 名称超链接

<a>scopeName::entityName</a>

Page 84: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

79

与在 Visual Prolog 源文件中的文档注释一样,ProDoc 也能识别 HTML 格式

生成文档中的<a> ... </a>标签。当遇到类似<a>scopeName::entityName</a>

这样的标签时,ProDoc 会在已经载入的(生成的)已知声明信息数据库查看是

否包含有 Visual Prolog 名称 scopeName::entityName 的声明。如果有,就会建

立它们之间的超链接。

这可用于建立名称与 Visual Prolog 源文件之间的超链接。而且,它还可以

用于从包括的(included)HTML 文档中自动建立对某些实体声明的超链接,在

这些 HTML 文档中含有一些概览或指南之类的内容。

ProDoc 使用的规则如下:

1. 名称必须在 <a> </a> 标签内。

2. 如果在 <a> </a> 标签内有双冒号::,则认为这个串表示的是某个接口或

类中的项名称。例如, <a>myInterface::pred/2</a>,双冒号前的子串

myInterface 被认为是一个接口或类的名称;而双冒号后的子串 pred/2

则被认为是声明过的 Visual Prolog 实体(谓词、常数、域、域函子、构

造器)的名称。

3. 如果在 <a> </a> 标签内没有双冒号,则认为这个串表示的是一个实体接

口或类。

4. 强烈建议对谓词和构造器显式地添加元维内容(函数还要添加->符号)。

如果元维内容省略了(<a> </a>标签之间没有/符号),ProDoc 会尝试将

第一个匹配上的任意元维的谓词声明与之建立超链接;如果没有匹配的谓

词声明,则尝试构造器或域的声明。

在 <a> </a> 标签之间不仅可以使用在 PFC 及用户的(被 ProDoc 处理的)

包中声明过的 Visual Prolog 名称,还可以使用:

• 形如 name/arity 的内置谓词,如: assert/1、bound/1 等。

• 内置的域,如:string、char。

2.3.7. 生成文件

ProDoc 产生以下的输出文件:

• HTML 格式的类/接口/包的索引,

• 处理文件集的目录表,

• 处理文件集的索引(关键字表),

• 关于每个包及整个处理的文档集的概览文档,

• “start up”文档(default.htm)。

2.3.7.1. 生成文档的结构

Page 85: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

80

ProDoc 生成的文档包含如下内容:

1. 包概览文档,

2. 分别放在各自文件中的各个接口或类的描述。每个文件中有:

• 文档头(Document Header)。构成如下:

• 文档 头上的是文档主要部分的超链接,也就是对摘要表的、对详

细描述的、对概览的超链接。

• 主题标题(如 Class VPI)。

• 当前包中的接口/类的层次关系图。

• 备案接口的类实现列表,或是有支持的接口列表。

• 类/接口的简要描述。

• 类/接口的详细描述。

• 域摘要(Domains Summary)。这是一个有两列的表,左边一列是域名,

右边一列是其简要描述。每个域名都带有超链接指向其详细描述。若干个

链接的域可以整合为一组。

• 常数摘要(Constant Summary)。这是一个有两列的表,左边一列是常数

名,右边一列是其简要描述。每个常数名都带有超链接指向其详细描述。

若干个链接的常数可以整合为一组。

• 构造器摘要(Constructor Summary)。这是一个有两列的表,左边一列

是构造器名,右边一列是其简要描述。每个构造器名都带有超链接指向其

详细描述。

• 谓词摘要(Predicate Summary)。这是一个有两列的表,左边一列是谓

词名,右边一列是其简要描述。每个谓词名都带有超链接指向其详细描述。

• 域详细描述(Domain Details)。这部分由一些域(或域组)的描述构成,

它包含有:

• 域的声明。它是用 Prolog 语法使用的标准配色标示的。

• 域的简要描述。

• 域的详细描述。

• 常数详细描述(Constant Details. )。这部分由一些常数(或常数组)

的描述构成,它包含有:常数定义,常数简要描述及详细描述。

• 构造器详细描述(Constructor Details)。这部分由一系列的构造器描

述构成,包含有:

• 构造器声明。它是用 Prolog 语法使用的标准配色标示的。

• 构造器简要描述。

• 构造器详细描述。

• 该构造器可能出现的错误。

• 该构造器的用例。这也是用 Prolog 语法使用的标准配色标示的。

• 谓词详细描述(Predicate details)。这部分由一系列的谓词描述构成,

包含有:

• 谓词声明。它是用 Prolog 语法使用的标准配色标示的。

• 谓词简要描述。

• 谓词详细描述。

Page 86: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

81

• 对于不是声明为 procedure、multi 或 erroneous 的谓词,还有失

败情况的描述。

• 该谓词可能发生的错误。

• 谓词用例。这也是用 Prolog 语法使用的标准配色标示的。

2.3.7.2. 生成目录表的结构

由 ProDoc 工具生成的这个 HTML 格式目录表是 HTML (.HHC)嵌套的无序表,

表中首先列出了包含有包概览的 PFC 包,接着是包中的类与接口。每个类与接口

又列出了域、常数、构造器及谓词。具体的例子可以参看 PFC 部分的帮助文件。

2.3.8. ProDoc 命令行选项

命令行选项的一般使用方式为:

prodoc [-option [value]]* @ResponceFile

各选项介绍如下:

*.extension

只处理指定扩展名的文件。如,*.cl 规定 ProDoc 仅由扩展名为.cl 的文件

中的文档注释生成 HTML 文档。

-2

ProDoc 进行两遍扫瞄以便建立完整的声明信息内部数据库。

-f FileName

处理单个文件 FileName 。

-d Folder

处理指定目录下的所有文件。可以与-r 和*.extension 选项配合使用。

-r

回归扫瞄由-d Folder 选项指定的目录中的子目录。

-o Folder

为生成的输出文档指定 Folder 子目录。与-r 选项配合使用时,输出目录

树与输入目录树一样。

Page 87: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

82

-c Documents

原样复制指定的 Documents 文档。这里的 Documents 串中可以带有通配符。

-v

指定 WEB 浏览器使用的起始文档。缺省是 index-hhc.htm。

-b FileName

为 FileName 文件设置缺省主题。打开帮助系统时显示的该文件标识就包含

有这个缺省主题。

-db DeclarationInformationDataBase

这个选项用于指定一个文件名,ProDoc 使用这个文件保存它所处理的文件

中声明过的 Visual Prolog 名称的声明信息。(缺省是 default.dba)。

-css FileName

这个选项用于指定样式表文件名。样式表文件名 FileName 的指定方式与主

题指定样式表文件名的标记一样:

<LINK rel="stylesheet" href="../style/vip6.css" type="text/css">

这个标记会添加到生成的所有 HTML 文件中。样式表文件 FileName 中的样式适用

于生成的所有 HTML 页。

-resolve external.dba!prefix

这个选项用于解决这样一个问题:在本次 ProDoc 运行处理文件中的名称与

以前 ProDoc 运行处理的 Prolog 源文件中相应名称声明之间建立超链接。

external.dba 是数据库文件名,这个数据库中含有以前 ProDoc 运行时生成

的 Visual Prolog 名称声明的声明信息。数据库的文件名是以前 ProDoc 运行时

在命令行中用-db external.dba 选项指定的。ProDoc 由指定的数据库中读取数

据以确定文档集中文件间的恰当超链接路径。

选项中指定的前缀串会添加到这样的超链接中以便由新的(外部的)HTML

文档集中生成正确的超链接。

举个例子。假设先运行 ProDoc 处理 PFC 文件,生成的声明信息数据库用选

项-db pfc.dba 放 pfc.dba 文件中。然后,再运行 ProDoc 处理 IDE 的 HTML 格式

的帮助文件,这个文件有涉及在 PFC 文件中声明的域及谓词的内容。假设 PFC

的文档文件是在合并后的工程帮助文件子目录 PFC 中,而 IDE 文档文件是在 IDE

子目录中。这时,可以这样使用选项:

Page 88: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

83

-resolve .\pfc\pfc.dba!/pfc

这里的 .\pfc\pfc.dba 是指以前处理PFC文件时生成的PFC的声明信息数据库,

前缀/pfc 会添加到每个超链接中。如:

<A href="/pfc/vpi/vpieditor/vpieditor_cl.htm#create_12_ret">vpiEditor::create/12-&gt; </A>

这个前缀/pfc 是需要的,因为在超链接中需要特别指明 PFC 目录。

-mpj RoboHTMLProjectFile

这个选项规定 ProDoc 应该生成 RoboHelp HTML 工程文件。这个文件可以使

得在 RoboHelp HTML 工具中载入生成的 HTML 文档页,而该工具可用来生成.CHM

格式的 Microsoft HTML 帮助文件。

-ext external.chm=external.dba!prefix

解决与外部的.CHM 格式 Microsoft HTML 帮助文件间的链接关系。选项中指

定的前缀串会添加到生成的 HTML 文档与 external.chm 的超链接中。

-e ErrorLogFile

将 ProDoc 错误消息打印到指定文件 ErrorLogFile 中。

-y

对所有询问回答“yes”。

-[h|help|?]

显示 ProDoc 命令行选项的简要说明。

@ResponseFileName

指定使用响应文件 ResponseFileName。ProDoc 将从指定文件中读取命令行

选项。显式地写在命令行上的选项,其优先级高于响应文件中相同选项的优先级。

响应文件举例

下面的响应文件用来由 PFC 的 Visual Prolog 源文件生成文档:

-2 -d ".\prodir\pfc" -c *.png -r -o help -e prodoc-err.log -v

Page 89: Visual Prolog V7...1 1. Visual Prolog调试器 Visual Prolog调试器(Debugger)是查找程序中错误的有力工具。有时,修改程序中的错误会占到整个开发时间的90%,这意味着:优良的调试工具太重

84

-db help\pfc.dba -b .\prodir\pfc\pfcOverview.htm -mpj pfc.mpj -css vip6.css -y *.cl *.i

下面这个响应文件用于自动生成 Visual Prolog 名称(在 IDE 部分的帮助文

件中)与这些名称的描述(在 ProDoc 生成的 PFC 部分的文档中)的超链接(参

见-resolve external.dba!prefix 中的举例):

-2 -d ".\_vde" -c *.png -r -o vde_resolved -e prodoc-err.log -resolve c:\help\pfc.dba!/pfc -v -css vip6.css -y *.HTM