洛书编程语言的模块开发指南

洛书编程语言的模块开发指南

【免费下载链接】洛书编程语言 一门国产的超轻量、高性能、跨平台的嵌入式脚本语言,可以运行在Windows、Linux、MCU上。致力于打造一款开源、高效、强大的编程语言 【免费下载链接】洛书编程语言 项目地址: https://gitcode.com/cthree/losu-lang

本文详细介绍了洛书(Losu)编程语言的模块开发全流程,包括工程创建、配置文件编写、C/脚本混合开发、胶水接口设计以及模块构建与发布。内容涵盖从基础工程结构到高级功能实现的完整指南,帮助开发者掌握洛书模块化开发的各项技能。

如何创建一个洛书模块工程

洛书(Losu)是一种轻量级、跨平台的嵌入式脚本语言,支持模块化开发。本文将详细介绍如何创建一个洛书模块工程,包括工程结构、配置文件编写以及模块的编译与测试。

1. 工程结构

一个标准的洛书模块工程通常包含以下文件和目录:

模块名称/
├── src/                # 源代码目录
│   ├── 模块名.c        # 模块的C实现文件
│   ├── 模块名.h        # 模块的头文件
│   └── 模块名.els      # 模块的洛书脚本文件
├── test/               # 测试目录
│   ├── test_模块名.els # 测试脚本
│   └── test_模块名.c   # 测试的C代码
├── lpkg.conf           # 模块配置文件
└── readme.md           # 模块说明文档

2. 配置文件 lpkg.conf

lpkg.conf 是模块的核心配置文件,用于定义模块的元数据和依赖关系。以下是一个示例配置:

[package]
name = "example_module"  # 模块名称
version = "1.0.0"        # 模块版本
author = "Your Name"     # 作者
description = "An example module for Losu"  # 模块描述

[dependencies]
losu_core = ">=1.6.0"    # 依赖的洛书核心版本

3. 编写模块代码

3.1 C 实现文件

模块的C实现文件通常包含模块的核心功能。以下是一个简单的示例:

// src/example_module.c
#include "example_module.h"
#include "els.h"

// 定义一个简单的函数
static int example_add(els_VmObj *vm) {
    int a = els_VmObj_getInt(vm, 0);
    int b = els_VmObj_getInt(vm, 1);
    els_VmObj_pushInt(vm, a + b);
    return 1;
}

// 模块初始化函数
void example_module_init(els_VmObj *vm) {
    els_VmObj_pushCFunction(vm, example_add, "add");
}
3.2 头文件

头文件用于声明模块的接口:

// src/example_module.h
#ifndef EXAMPLE_MODULE_H
#define EXAMPLE_MODULE_H

#include "els.h"

void example_module_init(els_VmObj *vm);

#endif
3.3 洛书脚本文件

洛书脚本文件用于定义模块的高级功能或封装C函数:

-- src/example_module.els
module "example_module"

function greet(name)
    return "Hello, " .. name .. "!"
end

4. 编译模块

使用洛书的模块管理器 lpkg 编译模块:

lpkg build

编译完成后,模块会被打包为 .lpk 文件,可以直接在其他项目中引用。

5. 测试模块

test 目录下编写测试脚本和代码,确保模块功能正常:

-- test/test_example_module.els
require "example_module"

print(example_module.greet("Losu"))
print(example_module.add(2, 3))

运行测试:

losu test/test_example_module.els

6. 发布模块

完成开发和测试后,可以将模块发布到洛书的模块仓库:

lpkg publish

流程图

以下是一个模块开发流程的简单图示:

mermaid

通过以上步骤,您可以快速创建一个功能完整的洛书模块工程,并与其他开发者共享您的成果。

模块的脚本与C/C++实现

洛书编程语言通过模块化设计支持脚本与C/C++的混合开发,为开发者提供了灵活性和高性能的结合。本文将详细介绍如何通过脚本调用C/C++实现的模块功能,并展示其在实际开发中的应用。

1. 模块的脚本接口

洛书模块的脚本接口通过.els文件定义,提供了对C/C++功能的封装。以下是一个典型的脚本接口定义示例:

var bridge = {
    c: {
        int: bridge_c_cint32,
        int8: bridge_c_cint8,
        str: bridge_c_cstr,
        iif: bridge_c_iif,
    }
}
功能说明:
  • bridge_c_cint32:将洛书的整数类型转换为C的32位整数。
  • bridge_c_cstr:将洛书的字符串类型转换为C的字符串指针。
  • bridge_c_iif:调用C函数,支持多参数传递。

2. C/C++实现

C/C++部分通过动态链接库实现,提供了对脚本接口的支持。以下是核心功能的实现代码片段:

int ELSAPI_bridge_bridge_c_cint32(els_VmObj* vm) {
    LosuObj output;
    int type = arg_gettype(vm, unit_arg(1));
    if (type == ELS_API_TYPE_NUMBER) {
        int64_t n = (int32_t)arg_getnum(vm, unit_arg(1));
        output = obj_newbyte(vm, (char*)&n, 8);
    }
    arg_return(vm, output);
    return 1;
}
关键点:
  • 类型转换:将洛书的数值类型转换为C的对应类型。
  • 参数处理:通过arg_gettypearg_getnum获取脚本传递的参数。
  • 返回值:使用arg_return将结果返回给脚本。

3. 混合开发示例

以下是一个完整的示例,展示如何在脚本中调用C函数:

import "bridge"
import "sharedlib"

var lib = sharedlib.load("msvcrt.dll")
var printf = sharedlib.sys(lib, "printf")

var pattern = bridge.c.str("str:%s, number:%d\n")
var s = bridge.c.str("Hello losu!")
var n = bridge.c.int(1024)

bridge.c.iif(printf, pattern, s, n)
输出结果:
str:Hello losu!, number:1024

4. 流程图

以下是通过脚本调用C函数的流程:

mermaid

5. 数据类型对照表

下表列出了洛书与C/C++之间的数据类型转换关系:

洛书类型C/C++类型转换函数
intint32_tbridge_c_cint32
strchar*bridge_c_cstr
floatfloatbridge_c_cfloat32
ptrvoid*bridge_c_cptr

通过以上内容,开发者可以清晰地了解如何在洛书中实现脚本与C/C++的混合开发,充分利用两者的优势。

模块的胶水接口与头文件设计

在洛书编程语言中,模块的胶水接口(Glue Interface)和头文件设计是实现跨语言交互的核心部分。通过合理的接口设计和头文件组织,可以实现洛书与C语言的高效互操作。以下将详细介绍这一部分的设计思路和实现细节。

胶水接口的设计

胶水接口的主要作用是将洛书的数据类型与C语言的数据类型进行转换,并提供函数调用的桥梁。在bridge模块中,胶水接口通过一系列转换函数实现,例如:

mermaid

数据类型转换函数

以下是一些核心的数据类型转换函数及其作用:

洛书函数名C语言类型描述
bridge_c_cint8int8_t将洛书数值转换为8位整数
bridge_c_cint16int16_t将洛书数值转换为16位整数
bridge_c_cint32int32_t将洛书数值转换为32位整数
bridge_c_cfloat32float将洛书数值转换为32位浮点数
bridge_c_cstrchar*将洛书字符串转换为C字符串
函数调用接口

胶水接口还提供了函数调用功能,例如bridge_c_iif,用于调用C语言中返回int类型且参数为int类型的函数。其调用流程如下:

mermaid

头文件的设计

头文件(如bridge.h)定义了胶水接口的函数原型和必要的宏。以下是头文件的核心内容:

// bridge.h
#include "els.h"

// 数据类型转换函数
int ELSAPI_bridge_bridge_c_cint8(els_VmObj* vm);
int ELSAPI_bridge_bridge_c_cint16(els_VmObj* vm);
int ELSAPI_bridge_bridge_c_cint32(els_VmObj* vm);
int ELSAPI_bridge_bridge_c_cint64(els_VmObj* vm);
int ELSAPI_bridge_bridge_c_cfloat32(els_VmObj* vm);
int ELSAPI_bridge_bridge_c_cfloat64(els_VmObj* vm);
int ELSAPI_bridge_bridge_c_cstr(els_VmObj* vm);

// 函数调用接口
int ELSAPI_bridge_bridge_c_iif(els_VmObj* vm);

// 模块初始化函数
void ElsLib_bridge_libinit(els_VmObj *vm);

头文件的设计遵循以下原则:

  1. 清晰性:每个函数的用途和参数类型一目了然。
  2. 可扩展性:新增功能时只需添加新的函数原型。
  3. 兼容性:与洛书虚拟机的API无缝对接。

示例代码

以下是一个使用胶水接口的示例,展示了如何调用C语言的printf函数:

import "bridge"
import "sharedlib"

var lib = sharedlib.load("C:\\Windows\\System32\\msvcrt.dll") # 加载动态库
var function = sharedlib.sys(lib, "printf") # 获取printf函数

# 将洛书类型转换为C类型
var pattern = bridge.c.str("str:\%s, number:\%d\n")
var s = bridge.c.str("Hello losu!")
var n = bridge.c.int(1024)

# 函数调用
bridge.c.iif(function, pattern, s, n)

输出结果为:

str:Hello losu!, number:1024

通过以上设计,洛书模块的胶水接口和头文件能够高效地实现跨语言交互,为开发者提供了强大的扩展能力。

模块的构建与发布流程

洛书编程语言(Losu)的模块开发是一个高效且标准化的过程,涵盖了从构建到发布的完整生命周期。本节将详细介绍如何构建和发布一个洛书模块,确保开发者能够快速上手并遵循最佳实践。

模块构建流程

构建洛书模块的核心工具是 lpkglpt。以下是构建模块的详细步骤:

  1. 准备工作区
    使用 lpkg checkout 命令检出模块源代码到本地工作区:

    losu -r lpkg checkout [分支名]
    

    这将创建一个包含模块源代码的工作目录。

  2. 编辑与开发
    在工作区中编辑模块代码,确保模块功能符合预期。洛书模块通常包含以下文件:

    • .els 文件:模块的洛书源代码。
    • .c.h 文件:C 语言实现的底层功能。
    • readme.md:模块的说明文档。
  3. 构建模块
    使用 lpkg make 命令构建模块二进制文件:

    losu -r lpkg make
    

    构建完成后,会在工作区生成二进制文件(如 .so.dll)。

  4. 校验模块
    使用 lpkg md5sumlpkg md5check 命令确保文件完整性:

    losu -r lpkg md5sum    # 生成校验文件
    losu -r lpkg md5check  # 校验文件是否被修改
    

模块发布流程

发布模块的核心工具是 lpt,它提供了从本地到远程的全流程支持:

  1. 提交模块
    使用 lpkg commit 命令将工作区的代码提交到指定分支:

    losu -r lpkg commit [分支名]
    
  2. 注册模块
    在模块发布前,需要确保模块信息已注册到洛书模块仓库。使用 lpt confsrc 生成接口文件:

    losu -r lpt confsrc [模块名]
    
  3. 发布模块
    使用 lpt install 命令将模块发布到本地或远程仓库:

    losu -r lpt install [模块名]
    
  4. 验证发布
    使用 lpt listlpt show 命令验证模块是否成功发布:

    losu -r lpt list      # 列出已安装模块
    losu -r lpt show [模块名]  # 显示模块详细信息
    

流程图示例

以下是模块构建与发布的流程图:

mermaid

注意事项

  • 版本控制:确保模块的版本号遵循语义化版本规范(如 1.0.0)。
  • 文档:发布前完善 readme.md 文件,包括模块功能、使用方法和示例代码。
  • 测试:在发布前进行充分的单元测试和集成测试。

通过以上步骤,开发者可以高效地完成洛书模块的构建与发布,为社区贡献高质量的模块。

总结

本文系统性地讲解了洛书模块开发的完整生命周期,从工程创建到最终发布的全过程。重点包括:标准工程结构配置、lpkg.conf文件编写、C与脚本的混合开发实现、胶水接口设计原理以及模块构建发布流程。通过本指南,开发者可以快速掌握洛书模块开发的核心技术,创建高性能、可复用的功能模块,并成功发布到模块仓库中。

【免费下载链接】洛书编程语言 一门国产的超轻量、高性能、跨平台的嵌入式脚本语言,可以运行在Windows、Linux、MCU上。致力于打造一款开源、高效、强大的编程语言 【免费下载链接】洛书编程语言 项目地址: https://gitcode.com/cthree/losu-lang

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值