Print This Page

D应用程序的二进制接口

News

Google
2008-03-03
Category: 更新(update)
Posted by: 刘策(yayv)
2007-04-24
Category: 更新(update)
Posted by: 刘策(yayv)
新设栏目 D语言高级教程 , 并转贴一篇 深入分析D语言接口与COM接口的关系 精华文章
2007-04-24
Category: 更新(update)
Posted by: 刘策(yayv)
新增2篇文章,均是对D语言数组进行探索的。一篇主要探索D语言数组长度修改时产生的影响, 另一篇主要探索D语言数组在多维的情况下如何初始化。

www.digitalmars.com [Home] [Search] [D]
Last update Jul 16, 2004

D 应用程序二进制接口

如果 D 实现符合 D ABI (应用程序二进制接口)的话,就可以生成可以同其他实现互操作的库、DLL等。

这份规范的大部分都处于 TBD(尚δ完成)状态。

C ABI

本规范中提到的 C ABI 指的是目标系统中的 C 应用程序二进制接口。C 和 D 代码应该能够自由地链接到一起,尤其是,D 代码应该能够访问所有的 C ABI 运行时库。

基本型别

尚δ完成

结构

符合目标平台上的 C ABI 结构分布。

一个对象的组成如下:
	偏移量	内容
------ --------
0: 指向 vtable 的指针
4: monitor
8... 非静态成员
vtable 的组成为:
	0:	指向 ClassInfo 类实例的指针
4... 指向虚拟成员函数的指针
类定义:
	class XXXX
{
....
};
生成了:
  • 一个叫做 ClassXXXX 的 Class 类的实例。
  • 一个叫做 StaticClassXXXX 的定义所有静态成员的类型。
  • 一个叫做 StaticXXXX 的 StaticClassXXXX 的实例,用于静态成员。

接口

尚δ完成

数组

动态数组的组成为:
	0:	数组大小
4: 指向数组数据的指针
动态数组的声明:
	type array[];
静态数组的声明:

type array[dimension];
因此,静态数组总是静态的将大小作为型别本身的一部分,所以它的实现跟 C 中的实现相同。静态数组和动态数组之间可以轻松的相互转换。

关联数组

尚δ完成

引用型别

D 有引用型别,但是它们是隐式的。例如,类总是通过引用访问的;这意ζ着类的实例决不会λ于堆栈上或者作为函数参数被传递。

当给函数传递一个静态数组时,将会隐式的把它转化为静态数组的引用。例如:

	int abc[3];
当将 abc 传递给函数时,会造成下面的隐式转换:
	void func(int array[3]);	// actually 

void func(int *p); // abc[3] 被转换为指向第一个元素的指针
void func(int array[]); // abc[3] 被转换为一个动态数组

名字变换

尚δ完成

函数调用约定

尚δ完成

异常处理

Windows

符合 Microsoft Windows 结构化异常处理约定。尚δ完成

Linux

使用静态地址范Χ/处理程序表。尚δ完成

垃圾收集

尚δ完成

运行时辅助函数

尚δ完成

模块初始化和终止

尚δ完成

单元测试

尚δ完成
Copyright (c) 1999-2004 by Digital Mars, All Rights Reserved


Previous page: 在HTML中嵌入D
Next page: D语言字符串