使用CNI组成宏编写CovScript扩展

概念介绍

CNI是什么?

CNI,全称为C++ Native Interface,是Covariant Script与C++之间进行交互的抽象接口,几乎支持所有能被调用的东西

CNI组成宏是什么?

CNI组成宏是CNI标准扩展的一部分,旨在用简单易用的宏定义代替繁杂的 CNI 声明

CNI标准扩展又是什么?

C/C++ Native Interface Standard Extension,即CNI标准扩展,是Covariant Script解释器扩展的一部分,旨在降低中低复杂度的Covariant Script语言扩展的编写难度

让我们开始吧

必需头文件

#include <covscript/dll.hpp>

Covariant Script扩展头文件

#include <covscript/cni.hpp>

CNI标准扩展头文件

CNI根名称空间(CNI Root Namespace)

在CNI标准扩展中,我们首先需要接触到的第一个概念就是CNI根名称空间

Covariant Script在引入扩展时,会将扩展中的内容映射为Covariant Script语言中的名称空间,因此CNI根名称空间就是这种映射在C++中的表现

事实上,由于需要建立C++与Covariant Script扩展系统之间的联系,CNI根名称空间会自动完成一些必需工作。因此,我们几乎所有的操作,都必须在CNI根名称空间中进行

声明CNI根名称空间

CNI_ROOT_NAMESPACE {
    // C++代码
}

类似于C++的名称空间声明,在关键的CNI_ROOT_NAMESPACE宏后只需紧跟花括号组成的语句块即可

CNI根名称空间对应着C++中的名称空间名cni_root_namespace

CNI函数(CNI Function)

CNI函数名字叫做函数,实际上是一种C++函数到Covariant Script函数的映射

CNI函数是CNI组成宏的一部分,可以说是整个CNI标准扩展中唯一一个真正和CNI产生联系的部分,其他部分只能说是在配合CNI的工作

CNI系统是Covariant Script扩展系统的多个子系统之一,其功能为构建CNI抽象层以完成Covariant Script函数到C++函数调用的转换工作,具体原理我们这里就不再深究

声明CNI函数

// 声明C++函数
CNI(函数名)

我们只需要先在当前名称空间(必须是CNI名称空间)中声明C++函数,然后再在其后追加一句CNI组成宏,即可完成CNI函数的声明

Hello,world!

到这里我们已经介绍了最基础的CNI组成宏用法,下面就是喜闻乐见的实践环节了

示例代码

// CovScript头文件
#include <covscript/dll.hpp>
#include <covscript/cni.hpp>
// STL输入输出库
#include <iostream>
// CNI根名称空间
CNI_ROOT_NAMESPACE {
    // C++函数声明
    void test() {
        std::cout << "Hello,world!" << std::endl;
    }
    // CNI函数声明
    CNI(test)
}

结合我们之前介绍的知识,能不能看懂这段代码呢?

编译为Covariant Script扩展

由于开发环境的多样,我们这里不再阐述Covariant Script SDK的安装方法

本教程基于基于Debian Linux的发行版,使用Windows的朋友推荐先使用Windows Subsystem Linux进行开发

首先是安装SDK,请在root环境中运行以下代码或使用sudo执行

# wget http://mirrors.covariant.cn/covscript/covscript-amd64.deb
# dpkg -i ./covscript-amd64.deb

然后,切换到工作目录,即你的代码所在目录,执行以下指令

# g++ -std=c++14 --shared -fPIC -O3 源代码.cpp -o 扩展名.cse -lcovscript

执行完毕后,会在当前目录生成一个文件名为”扩展名.cse”的Covariant Script扩展,接下来执行Covariant Script REPL验证

# cs_repl
Covariant Script Programming Language Interpreter REPL
Version: 3.2.0 Psephurus gladius(Stable) Build 8
Copyright (C) 2019 Michael Lee. All rights reserved.
Please visit http://covscript.org/ for more information.
> import test
> test.test()

程序应在终端输出“Hello,world!”,如下图

这便代表我们的扩展编写正确,Covariant Script调用了扩展中的C++函数

发表回复