第15章与其他编程语言接口 2021/223 A程序设计
2021/2/23 AI程序设计 1 第15章 与其他编程语言接口
第15章与其他编程语言接口 ●本章介绍 Visual Prolog与其他编程语言的接口,帮助 读者学会如何在vsua| Prolog中调用WIN32API,打 开更广阔的编程世界的大门。 2004.11.3 AI序设计
2004.11.3 AI程序设计 2 第15章 与其他编程语言接口 ⚫ 本章介绍Visual Prolog与其他编程语言的接口,帮助 读者学会如何在Visual Prolog中调用WIN32 API,打 开更广阔的编程世界的大门
第15章与其他编程语言接口 15.1外部代码 15.2关键问题 15.3调用约定和链接名 154数据表示 15.5存储管理 15.6Win32API函数 2004.11.3 AI序设计
2004.11.3 AI程序设计 3 第15章 与其他编程语言接口 15.1 外部代码 15.2 关键问题 15.3 调用约定和链接名 15.4 数据表示 15.5 存储管理 15.6 Win32 API函数
15.1外部代码 ●所谓“外部代码”是指用其它编程语言(而不是用 Visual Prolog 所编写的代码。 Visual prolog能直接调用其它语言代码。本章就来解释这些概念 和细节。直接调用外部代码是一种二进制级的底层调用,而非高级 语言层面的高级调用。这在简单的例程中相当简单,但也可能出奇 的复杂。可以肯定的一点是:处理复杂调用需要非常熟悉 isual Prolog和其它编程语言。但是不要担心,实际上,在许多例程中 所需要的交互是相当简单的 2004.11.3 AI序设计
2004.11.3 AI程序设计 4 15.1 外部代码 ⚫ 所谓“外部代码”是指用其它编程语言(而不是用Visual Prolog) 所编写的代码。 ⚫ Visual Prolog能直接调用其它语言代码。本章就来解释这些概念 和细节。直接调用外部代码是一种二进制级的底层调用,而非高级 语言层面的高级调用。这在简单的例程中相当简单,但也可能出奇 的复杂。可以肯定的一点是:处理复杂调用需要非常熟悉Visual Prolog和其它编程语言。但是不要担心,实际上,在许多例程中 所需要的交互是相当简单的
15.2关键问题 其它语言编译器和 isual Prolog编译器有很大的不同,这是由于 它们是由不同的人所制作的,而且它们必须支持不同的语言特性。 Visual Prolog不可能和所有的外部语言代码交互,因为它不可能 知道其他编译器所采用的规则。所以,要实现 Visua| Prolog和其 他语言代码的交互,就要求这些代码必须遵循规定的方式。 为了调用外部代码(异种语言代码),我们就必须访问这些代码。本 章我们要处理的代码是直接链接到程序里,或者位于一个动态连接 库DLL中。 2004.11.3 AI序设计
2004.11.3 AI程序设计 5 15.2 关键问题 ⚫ 其它语言编译器和Visual Prolog编译器有很大的不同,这是由于 它们是由不同的人所制作的,而且它们必须支持不同的语言特性。 Visual Prolog不可能和所有的外部语言代码交互,因为它不可能 知道其他编译器所采用的规则。所以,要实现Visual Prolog和其 他语言代码的交互,就要求这些代码必须遵循规定的方式。 ⚫ 为了调用外部代码(异种语言代码),我们就必须访问这些代码。本 章我们要处理的代码是直接链接到程序里,或者位于一个动态连接 库DLL中
15.2关键问题 首先,我们必须查找这些代码的位置。这通过一个名字来实现。如 果代码是直接链接到你的程序里,就必须使用链接名;如果代码位 于一个DLL,则可以使用导出名。无论是用链接名还是用导出名, 对 Visual Prolog来说没有区别,但是当你试图在外部代码(或系 统)中寻找这个名字时,就有了区别。我们这里提到系统,是因为 有时你必须使用的名字在代码中根本不存在。因此,对于这个概念, 我们仅使用链接名。 2004.11.3 AI序设计
2004.11.3 AI程序设计 6 15.2 关键问题 ⚫ 首先,我们必须查找这些代码的位置。这通过一个名字来实现。如 果代码是直接链接到你的程序里,就必须使用链接名;如果代码位 于一个DLL,则可以使用导出名。无论是用链接名还是用导出名, 对Visual Prolog来说没有区别,但是当你试图在外部代码(或系 统)中寻找这个名字时,就有了区别。我们这里提到系统,是因为 有时你必须使用的名字在代码中根本不存在。因此,对于这个概念, 我们仅使用链接名
15.2关键问题 其次,在我们已经确定了外部代码的位置之后,接着必须传递输入 参数并调用代码,代码被执行后,还必须获取其输岀等等。有许多 不同的途径去完成此过程。显然,调用者和被调用者必须在这一点 达成一致,即双方必须有调用约定。 第三,关于数据表示。但是,不仅调用双方必须在参数等的传递上 相一致,更重要的是双方要以相同方式解释所传递的字节。换句话 说就是,双方的数据表示必须相同。 2004.11.3 AI序设计
2004.11.3 AI程序设计 7 15.2 关键问题 ⚫ 其次,在我们已经确定了外部代码的位置之后,接着必须传递输入 参数并调用代码,代码被执行后,还必须获取其输出等等。有许多 不同的途径去完成此过程。显然,调用者和被调用者必须在这一点 达成一致,即双方必须有调用约定。 ⚫ 第三,关于数据表示。但是,不仅调用双方必须在参数等的传递上 相一致,更重要的是双方要以相同方式解释所传递的字节。换句话 说就是,双方的数据表示必须相同
15.2关键问题 最后要注意的一点是内存管理。调用者和被调用者必须明确在必要 时由哪一方分配和释放内存。如果释放內存和分配内存不是由同一 方进行,那么释放内存一方必须以正确的方式释放内存。 总之,调用外部代码有四个关键问题需要考虑: 链接名 调用约定 数据表示 存储管理 2004.11.3 AI序设计
2004.11.3 AI程序设计 8 15.2 关键问题 ⚫ 最后要注意的一点是内存管理。调用者和被调用者必须明确在必要 时由哪一方分配和释放内存。如果释放内存和分配内存不是由同一 方进行,那么释放内存一方必须以正确的方式释放内存。 ⚫ 总之,调用外部代码有四个关键问题需要考虑: ⚫ 链接名 ⚫ 调用约定 ⚫ 数据表示 ⚫ 存储管理
15.3调用约定和链接名 链接名(或导出名)用于识别你想要调用的代码。不同的编译器用 不同的缺省链接名,许多编译器有多种指定链接名的途径。在 Vsua| Prolog中,你可以用保留字“as”为一个谓词声明一个链接 名。如: predicates pppp: (integer)as"LinkName 在 Visual Prolog程序中,上面的谓词被命名为“ pppp,但是它的 链接名是“ LinkName 2004.11.3 AI序设计
2004.11.3 AI程序设计 9 15.3 调用约定和链接名 ⚫ 链接名(或导出名)用于识别你想要调用的代码。不同的编译器用 不同的缺省链接名,许多编译器有多种指定链接名的途径。在 Visual Prolog中,你可以用保留字“as”为一个谓词声明一个链接 名。如: predicates pppp : (integer) as "LinkName". ⚫ 在Visual Prolog程序中,上面的谓词被命名为“pppp”,但是它的 链接名是“LinkName
15.3调用约定和链接名 注意:仅类谓词有一个链接名,这意味着它必须在一个类中进行声 明或在一个类实现的类谓词( class predicates)段进行声明。 Visua| Prolog支持大量不同的调用约定。这些约定也在谓词中声 明,但用的是 language保留字。 predicates gaga:(integer)language C 2004.11.3 AI序设计 10
2004.11.3 AI程序设计 10 15.3 调用约定和链接名 ⚫ 注意:仅类谓词有一个链接名,这意味着它必须在一个类中进行声 明或在一个类实现的类谓词(class predicates)段进行声明。 ⚫ Visual Prolog支持大量不同的调用约定。这些约定也在谓词中声 明,但用的是language保留字。 predicates qqqq : (integer) language c