FFI
本文档解释在Wave语言中调用外部实现函数的FFI(外部函数接口)规范。 通过FFI,Wave程序可以直接与其他语言编写的本机库集成。
概述
Wave的FFI基于声明运行。 外部函数不在Wave代码中实现,只需指明该函数遵循的ABI(应用程序二进制接口)。 实际实现是在链接阶段通过外部库解决的。
FFI在编译时只声明函数的存在,生成可执行文件时由链接器连接实际的符号。
extern声明
外部函数是使用extern关键字声明的。
현재 Wave에서는 ABI 지정이 반드시 필요하며, extern(c)만 지원합니다.
extern(c) fun 함수명(인자들...) -> 반환타입;
ABI指定
extern 선언에는 ABI를 명시해야 합니다.
현재 지원되는 ABI는 c 하나입니다.
extern(c) fun printf(fmt: ptr<u8>);
extern(rust) 같은 선언은 파싱될 수 있어도 의미 분석 단계에서 에러가 발생합니다.
函数级extern声明
声明单个外部函数时,可以按如下方式编写。
extern(c) fun InitWindow(width: i32, height: i32, title: ptr<u8>);
此声明意味着遵循C ABI的InitWindow符号存在于外部库中。
块级extern声明
若有多个使用相同ABI的外部函数,可以以块的形式组合声明。
extern(c) {
fun InitWindow(width: i32, height: i32, title: ptr<u8>);
fun CloseWindow();
fun BeginDrawing();
fun EndDrawing();
}
块级声明在语义上与函数级声明完全相同,只是为了可读性和结构化的语法。