# Syslab 代码生成
Syslab 代码生成工具(SyslabCC)支持从 Julia 代码生成可执行文件、动态库和 C++ 源码项目。
# 概述
Julia 是一门高性能科学计算语言,其性能上限比肩 C/C++。但是,原生 Julia 在部分工业场景下存在如下缺点:
- 首次运行问题:在原生 Julia 中,部分代码存在明显的编译延迟,影响用户体验;
- 安装部署问题:原生 Julia 要求用户安装 Julia 运行环境,不利于产品部署集成,且受限于桌面平台。
为解决以上问题,同元开发了 Syslab 代码生成工具(SyslabCC),该工具提供以下功能:
- 从 Julia 代码生成可执行文件、动态链接库、C++源码项目;
- 代码生成所得程序,启动快、体积小;
- 代码生成所得程序,方便用户在 C/C++、Python 等不同环境中调用,且无需安装 Syslab/Julia 依赖。
# 适用场景
- 独立应用部署
- 优化 Julia 代码的启动与执行性能
- 与其他语言进行集成,实现联合编译
- 在 ARM 架构的嵌入式设备上运行 Julia 代码
# 使用简介
Syslab 代码生成将 Julia 程序转换为可自行配置的 C++ 源码项目。
# 代码生成环境
使用代码生成时,按照需求不同,可能关注到如下的多个环境:
- Julia 开发环境:Julia 编程、运行和调试的环境。
- 代码生成环境:在此环境中,Syslab 代码生成将 Julia 转换为 C++ 源码项目。
- C++ 编译环境:在此环境中,编译 Syslab 代码生成输出的 C++ 代码,并链接到相应的系统依赖。
- 用户执行环境:在此环境中,产品完成部署,并通过调用可执行文件或动态库的方式向用户提供功能。
在 Syslab 中,点击【视图>窗口>新建终端】工具栏菜单,即可新建一个终端,作为 SyslabCC 代码生成环境。
例如,在终端中输入scc --help即可查看 SyslabCC 代码生成工具的编译选项说明。
# 代码生成命令
SyslabCC 采用命令行模式,提供scc命令行工具,其调用结构为:
scc <输入文件> [-o {输出文件路径}] [编译选项]...
目前,SyslabCC 代码生成支持三种模式,调用结构分别为:
生成可执行文件:Julia 文件需要包含
main()函数作为入口。scc build.jl -o main.exe --bundle # 推荐 --bundle 选项 # Linux 命令: # scc build.jl -o main --bundle生成动态库:进行动态库生成的 Julia 文件,需使用
SyslabCC.static_compile导出 C 函数符号:scc build.jl -o shared.dll --bundle # 推荐 --bundle 选项 # Linux 命令: # scc build.jl -o shared.so --bundle生成 C++ 源码项目:在生成可执行文件或动态库的命令中,指定
-c、-d <目标文件夹>与--mode app/--mode shared选项,即可生成 C++ 项目。# 生成构建可执行文件的 C++ 项目 (Windows/Linux通用) scc build.jl --mode app -d cppProject --bundle # 推荐 --bundle 选项 cd cppProject julia make.jl all # 构建 C++ 项目 # 生成构建动态链接库的 C++ 项目 (Windows/Linux通用) scc build.jl --mode shared -d cppProject --bundle # 推荐 --bundle 选项 cd cppProject julia make.jl all # 构建 C++ 项目 # 在 Linux 或 MinGW 环境下,可以使用 Makefile 进行更快速的构建: # make all -j 8
其中,在需要动态库生成的 Julia 文件中,可以使用SyslabCC.static_compile导出 C 函数符号:
# 将 Julia 函数导出为 C 函数符号
SyslabCC.static_compile("C函数名", Julia函数, (参数1类型, 参数2类型, ...))
推荐用户通过阅读快速入门等文档进一步了解代码生成工具的功能及使用。
# 快速入门
推荐优先阅读快速入门部分,快速入手 SyslabCC 命令行工具 —— scc 编译器:
| 项 | 说明 |
|---|---|
| 环境验证 | Windows 和 Linux 下配置 scc 编译器 |
| 可执行文件生成 | Julia 项目生成小体量的可执行文件 |
| 动态库生成 | Julia 项目生成动态库以 C++ 调用 |
| C++ 项目生成 | Julia 项目生成 C++ 可执行文件/动态库项目 |
# 代码生成的 Julia 编程要求
对需要代码生成的 Julia 代码来说,最核心的要求是类型稳定。
由于此概念让来自其他编程语言的用户感到陌生,此处对类型稳定进行详细介绍:代码生成的 Julia 编程要求。
简单来说,可以对类型稳定作如下概括:
提示
Julia 代码的类型稳定意味着:代码执行路径上的每一处函数调用,参数类型均可被 Julia 编译器推断为 Julia 具体类型。
# 工作流
介绍代码生成使用的工作流,请参见代码生成工作流。
可以总结为如下流程:
# 场景案例
介绍 SyslabCC 场景案例,根据不同的使用场景分类,便于用户参考和了解:
| 项 | 说明 |
|---|---|
| 多维数组 FFT 计算 | 多维数组 FFT 计算生成可执行文件及生成动态库 C++ 调用 |
| 二维热传导方程计算 | 二维热传导方程计算生成动态库 Python 调用并绘图 |
| N 体(N-Body)问题的模拟计算 | N 体(N-Body)问题的模拟计算,并生成 C++ 编译项目 |
# 编译配置和高级功能
介绍关于 scc 的编译配置和高级功能:
| 项 | 说明 |
|---|---|
| 值类型对应表 | Julia 和 C/C++ 值类型的对应表 |
| 编译选项详解 | scc 编译器选项说明解释 |
| 代码生成产物部署 | 说明代码生成产物的部署方式 |
| 跨平台交叉编译(实验性) | 如何进行跨平台交叉编译和对应示例 |
| CMake 项目生成 | 如何生成 CMake 项目和对应示例 |
| Visual Studio 项目生成 | 如何生成 Visual Studio 项目和对应示例 |
| 用例驱动代码生成:支持类型不稳定的 Julia 代码 | 如何通过用例驱动来编译类型不稳定的代码 |
| scc 编译器环境修复 | 介绍如何修复 scc 编译器运行环境 |
| 多线程代码生成 | 如何通过 @threads 宏生成多线程代码 |
# 功能支持范围
关于 Syslab 代码生成工具的功能支持范围,请参见功能支持范围,包括 SyslabCC 支持的硬件架构与操作系统与支持的 Julia 代码范围。对于部分 Julia 的使用场景,代码生成工具目前尚未支持,请查看代码生成的局限性章节了解详情及相应的适配方案。
# 错误处理指南
介绍关于代码生成工具使用相关的进一步解释与处理:
| 项 | 说明 |
|---|---|
| 错误诊断 | 介绍使用 Syslab 代码生成时的错误诊断实践 |
| 代码生成对 Julia 全局变量的支持 | 介绍代码生成对全局变量的支持情况及定义可变的 const 变量的推荐实践 |
| 常见问题解答(FAQ) | 常见问题解答(FAQ) |