MW开发架构二次 2_第1页
MW开发架构二次 2_第2页
MW开发架构二次 2_第3页
MW开发架构二次 2_第4页
MW开发架构二次 2_第5页
已阅读5页,还剩94页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

BeihangUniversityMWORKS开发平台架构与二次开发张莉,张永飞,陈娟,刘芳3.1科学计算语言Julia简介3.1.1Julia语言简介3.1.2Julia语言的优势3.1.3安装与运行Julia2.1.4JuliaREPL的几种模式3.2内核级二次开发3.2.1内核级二次开发原理与步骤3.2.2内核级二次开发案例3.3应用层二次开发3.3.1应用层函数库开发流程3.3.2函数库开发规范3.3.3应用层函数库开发实例第3章面向科学计算的二次开发013.1科学计算语言Julia简介Julia语言概述Julia语言是面向科学计算的高性能动态高级程序设计语言,定位为通用编程语言和高性能计算语言。具有类似其他科学计算语言的语法,在大多数情况下具有与编译型语言相媲美的性能。主要应用领域包括数据科学、科学计算、并行计算、数据可视化、机器学习、UI、网站等。在精准医疗、增强现实、基因组学、风险管理等领域也有应用。Julia生态系统涵盖了无人驾驶汽车、机器人、3D打印等技术应用。3.1概述Julia语言简介Julia编程语言由JeffBezanson、StefanKarpinski、ViralShah和AlanEdelman等人于2009年开始研发,2012年发布第一版,旨在简单快速,结合C的性能和Python的可读性。设计初衷是为科学计算,处理大规模数据和计算,易于创建和操作原型代码。创始人希望Julia具有多种语言特性,如Lisp的宏、Matlab的数学运算符、Python的常规编程、R的统计领域应用等。Julia注重性能,动态类型推导使其计算性能超越其他动态语言,甚至与静态编译语言相媲美。Julia的发展目标是创造一门易用、强大、高效的语言,适用于处理大型数值问题。3.1.1Julia语言简介Julia语言的优势Julia语言设计先进:由动态语言专家设计,语法近似现有语言,结合优势如LISP的语法宏、多重分派等。Julia高性能且具表现力:能轻松优化代码性能,无需“两语言”工作流,兼具建模语言和高性能开发语言特性。Julia适合构建数字物理系统:与系统建模和数字孪生技术融合,提供高级抽象表示功能模型,比商业工具更开放灵活。3.1.2Julia语言的优势3.1.3安装并运行Julia直接安装并运行Julia安装Julia语言运行环境简单,可通过预编译的二进制程序或自定义源码编译方式。从官方中文网站(/downloads/)下载安装包后,按提示安装即可。启动Julia后,在REPL环境中即可与系统进行交互,确认安装成功并开始编写程序。Julia安装成功界面3.1.3安装并运行Julia在MWORKS.Syslab平台运行JuliaMWORKS.Syslab平台中同样提供了Julia语言环境,如下图所示在MWORKS.Syslab环境下运行Julia程序MWORKS.Syslab中下运行Julia程序JuliaJuliaREPL的几种模式Julia模式:在REPL环境中输入Julia表达式,以“julia>”开头,按Enter计算并显示结果,可使用特殊功能如结果绑定到变量、分号抑制结果显示。Package模式:用于管理程序包,通过在Julia模式下输入]进入,可安装、移除、更新程序包,通过Ctrl+C或backspace返回Julia模式。Help模式:输入?在Julia模式下转入,以“help?>”开头,可查询功能使用说明和帮助文本,自动返回Julia模式。Shell模式:输入英文分号(;)在Julia模式下进入,可执行系统命令,不适用于Windows用户执行windowsshell命令。3.1.4JuliaJuliaREPL的几种模式023.2内核级二次开发3.2.1内核级二次开发原理与步骤内核级二次开发原理MWORKS平台内置了多种学科计算算法包,涵盖线性代数、插值、微积分、傅里叶变换等领域。平台支持科学计算算法扩展,提供底层算法和上层应用的替换和扩充功能,通过上层应用调用底层算法实现科学计算功能。底层科学计算数学库架构内核级二次开发原理上层应用包含初等数学、线性代数、插值、微积分、傅里叶变换、稀疏矩阵等板块函数,供用户直接调用使用。底层算法包含BLAS/LAPACK等核心算法工具集,提供矢量、矩阵乘法、矩阵分解、线性方程组求解等基础数学功能。BLAS是基础线性代数程序集,规范发布基础线性代数操作的数值库,被广泛应用于高性能计算领域。目前已有多个BLAS库实现,包括NetlibBLAS、ACML、ATLAS、CUDASDK、GotoBLAS、OpenBLAS、ESSL、IntelMKL、GSL、RenderScriptIntrinsicBLAS等。3.2.1内核级二次开发原理与步骤内核级二次开发原理上层应用包含初等数学、线性代数、插值、微积分、傅里叶变换、稀疏矩阵等板块函数,供用户直接调用使用。底层算法包含BLAS/LAPACK等核心算法工具集,提供矢量、矩阵乘法、矩阵分解、线性方程组求解等基础数学功能。BLAS是基础线性代数程序集,规范发布基础线性代数操作的数值库,被广泛应用于高性能计算领域。目前已有多个BLAS库实现,包括NetlibBLAS、ACML、ATLAS、CUDASDK、GotoBLAS、OpenBLAS、ESSL、IntelMKL、GSL、RenderScriptIntrinsicBLAS等。3.2.1内核级二次开发原理与步骤内核级二次开发原理本部分使用平台提供的BinaryBuilder和libblastrampoline两个工具,以如何替换平台底层算法中BLAS算法库为例,介绍底层计算函数库中底层算法的替换原理和过程。BinaryBuilder是用于构建二进制包的工具库,将C库编译成动态链接库形式,并封装成_JLL文件,提供自适应操作系统的调用动态链接库接口。libblastrampoline是BLAS/LAPACK代理模块,使用PLTtrampolines提供BLAS/LAPACK解复用库,允许用户在运行时动态选择调用的后端BLAS/LAPACK库,通过检查LBT_DEFAULT_LIBS环境变量转发BLAS调用。3.2.1内核级二次开发原理与步骤内核级二次开发原理本部分使用平台提供的BinaryBuilder和libblastrampoline两个工具,以如何替换平台底层算法中BLAS算法库为例,介绍底层计算函数库中底层算法的替换原理和过程。BinaryBuilder是用于构建二进制包的工具库,将C库编译成动态链接库形式,并封装成_JLL文件,提供自适应操作系统的调用动态链接库接口。libblastrampoline是BLAS/LAPACK代理模块,使用PLTtrampolines提供BLAS/LAPACK解复用库,允许用户在运行时动态选择调用的后端BLAS/LAPACK库,通过检查LBT_DEFAULT_LIBS环境变量转发BLAS调用。3.2.1内核级二次开发原理与步骤首先利用BinaryBuilder将符合BLAS标准的BLASTest库编译成BLASTest_jll文件;撰写第三方库BLASTest.jl库并依赖BLASTest_jll库;方法核心:在BLASTest库__init__()函数中,利用BLAS.lbt_forward(libname,clear,verbose)函数,进行转发重定向到BLASTest,如果将clear设置为1,它将在设置新映射之前清除所有以前的映射,而如果将其设置为0,它将仅保留给定libname中不存在的符号;其余接口:lbt_get_config()、lbt_{set,get}_num_threads()用于设置、获取线程等内容;注意事项:所有lbt_*函数都应该被认为是线程不安全的。不要尝试同时在两个不同的线程上加载两个BLAS库。3.2.1内核级二次开发原理与步骤内核级二次开发步骤3.2.1内核级二次开发原理与步骤构建完成后,使用以下流程进行底层BLAS切换复制BLISBLAS.jl文件路径pkgdir;通过usingPkg;Pkg.dev(“pkgdir”)安装库;usingBLISBLAS后利用BLAS.get_config函数进行查看底层库依赖。查看依赖库3.2.1内核级二次开发原理与步骤算法注册/设置接口针对BLAS接口、LAPACK接口和FFTW接口,介绍算法注册/设置接口的流程BLAS接口首先,需要加载指定的BLAS算法库,相关代码如下所示上述代码的功能、参数和返回值说明如下LBT_DLLEXPORTint32_tlbt_forward(constchar*libname,int32_tclear,int32_tverbose,constchar*suffix_hint);

功能加载给定的libname,在导出列表中查找所有已注册的算法库参数[in]libnameBlAS/LAPACK库名[in]clear是否清除所有已有映射,非0为清除,0保留[in]verbose是否打印调试信息,非0打印[in]suffix_hint是否用于搜索第一个后缀库中的BLAS/LAPACK,非NULL返回算法库地址3.2.1内核级二次开发原理与步骤BLAS接口其次,需要设置底层BLAS库中的线程数,相关代码如下所示。上述代码的功能和参数说明如下可以通过如下代码获取底层BLAS库中的线程数上述代码的功能和返回值说明如下LBT_DLLEXPORTvoidlbt_set_num_threads(int32_tnum_threads);功能设置底层BLAS库中的线程数。如果出现多个库被加载,将它们全部设置为相同的值。参数[in]num_threads线程数LBT_DLLEXPORTint32_tlbt_get_num_threads();功能返回底层BLAS库配置的线程数。在这种情况下加载多个库,返回所有返回值的最大值。返回线程数3.2.1内核级二次开发原理与步骤LAPACK接口对于LAPACK接口,首先同样需要加载指定的LAPACK算法库,相关代码如下所示。上述代码的功能、参数和返回值说明如下LBT_DLLEXPORTint32_tlbt_forward(constchar*libname,int32_tclear,int32_tverbose,constchar*suffix_hint);功能加载给定的libname,在导出列表中查找所有已注册的算法库参数[in]libnameLAPACK库名[in]clear是否清除所有已有映射,非0为清除,0保留[in]verbose是否打印调试信息,非0打印[in]suffix_hint是否用于搜索第一个后缀库中的BLAS/LAPACK,非NULL是返回算法库地址3.2.1内核级二次开发原理与步骤FFT接口首先,需要设置FFT底层算法库来源。上述代码的功能和参数说明如下设置完成后可以调用get_provider进行算法库名称查看上述代码的功能和参数说明如下FFTW.set_provider!(provider;export_prefs::Bool=false)FFTW.get_provider()功能用于设置FFT底层算法库来源的外部函数接口。首选项从加载路径上的Project.toml和LocalPreferences.toml文件加载。参数[in]providerString算法库名称[in]export_prefsBoolexport_prefs选项决定是否设置的首选项应存储在LocalPreferences.toml或Project.toml功能获取LocalPreferences.toml或Project.toml中存储的算法库名称参数[out]providerString算法库名称MWORKS.Syslab科学计算平台默认线性代数库底层算法为OpenBLAS@0.3.21,需替换为0.3.13版本以解决矩阵求广义特征值时的符号差异问题。替换步骤包括编译OpenBLAS库和替换BLAS/LAPACK库两步骤,以兼容老版本工程代码。FFTW库替换可查看MWORKS帮助文档。3.2.2内核级二次开发案例内核级二次开发案例概述科学计算算法替换流程下载并安装MSYSMSYS是MinGW提供的一个小型GNU环境,在Windows下运行的Linuxbashshell环境,支持大部分Linux常用命令,类似于Cygwin。MSYS2是独立项目,重写了MSYS,安装简单,使用方便,提供pacman工具进行软件包的安装管理,类似于Ubuntu的apt-get和Centos的yum。下载地址:/distrib/。

3.2.2内核级二次开发案例编译OpenBLAS库下载MSYS运行MSYS2编译OpenBLAS库安装MinGWgcc编译器:64位系统:pacman-Smingw-w64-x86_64-gcc32位系统:pacman-Smingw-w64-i686-gcc安装Fortran编译器(用于编译LAPACK):pacman-Smingw-w64-x86_64-gcc-fortran安装Perl:pacman-S--noconfirmperl安装MSYS2的make:pacman-Smake3.2.2内核级二次开发案例下载OpenBLAS源码MWORKS.Syslab使用64位字长作为默认计算整数字长,要求编译BLAS库为64位字长(ILP64)。选择最新发布的OpenBLAS版本作为替换目标,版本为v0.3.13。详情请见:/xianyi/OpenBLAS/releases/tag/v0.3.13源码下载地址:/xianyi/OpenBLAS/releases/download/v0.3.13/OpenBLAS-0.3.13.zip 3.2.2内核级二次开发案例编译OpenBLAS库源码下载编译OpenBLAS解压下载的OpenBLAS源码,并使用cd命令切换至目标文件夹路径:cdpath_to_OpenBLAS利用以下命令编译OpenBLAS以获取ILP64的BLAS库:makeBINARY=64INTERFACE64=1编译完成后,在当前文件夹下可以找到libopenblas.dll文件。3.2.2内核级二次开发案例编译OpenBLAS库编译成功的dll库替换算法库在MWORKS.Syslab的REPL中使用BLAS.lbt_forward函数进行目标动态链接库替换。输入以下代码进行替换:BLAS.lbt_forward(verbose=true,clear=true)。参数verbose=true表示打印替换信息,clear=true表示清除其他BLAS/LAPACK库。3.2.2内核级二次开发案例替换BLAS/LAPACK库

newblaspath="path_to_newblasdll"BLAS.lbt_forward(newblaspath,clear=true,verbose=true)#=GeneratingforwardstoD:/KML/openblas321/OpenBLAS-0.3.21/libopenblas.dll->Autodetectedsymbolsuffix""->AutodetectedinterfaceILP64(64-bit)->AutodetectedgfortrancallingconventionProcessed4945symbols;forwarded4860symbolswith64-bitinterfaceandmanglingtoasuffixof""4860=#3.2.2内核级二次开发案例查看当前算法库打开MWORKS.Syslab后在REPL中输入如下代码查看当前作用的底层算法库

usingTyMathBLAS.get_config()#=julia>BLAS.get_config()LinearAlgebra.BLAS.LBTConfigLibraries:└[ILP64]libopenblas64_.dll=#3.2.2内核级二次开发案例对比结果下面以一个魔方矩阵特征值和特征向量的计算为例对别替换前后的对比OpenBLAS进行替换前后的结果,如下图所示。可以看出,广义特征向量第三和第四列存在正负性差异。OpenBLAS@0.3.13计算结果OpenBLAS@0.3.21计算结果033.3应用层二次开发3.3应用层二次开发应用层二次开发概述科学计算环境提供数学、图形、图像、符号数学、信号处理、控制系统等多维度内置函数库,允许用户开发新函数并集成到环境中扩展功能。Julia包(函数库)是提供可重用功能的项目,可通过importX或usingX来使用,具有UUID用于标识在依赖项目中。MWORKS平台二次开发基于函数库开发规范,提供资源管理接口支持函数库的开发、装载、驱动和卸载。函数库开发主要采用Julia语言,提供基础和专业函数库,同时支持集成C/C++、Python等外部语言,以及无缝调用Python的MWORKS.Syslab函数库。3.3应用层二次开发应用层二次开发基于Julia语言的函数库开发流程新建函数库组织库的目录结构定义库的外部接口设置库的依赖进行库的单元测试编写库的测例开发库的帮助文档基于Julia调用外部语言开发函数库Julia调用Python函数Julia调用C/C++其它注意事项基于Julia语言的函数库开发流程基于Julia语言的函数库开发流程主要包括新建函数库、定义库的外部接口、设置库的依赖、库的单元测试、编写库的测例、编写库的帮助文档等。新建函数库打开MWORKS.Syslab,将左侧面板切换到【包管理器】,点击开发库面板上的【新建包】按钮,打开新建包的配置界面

3.3.1应用函数库开发流程新建包的配置界面新建函数库新建包配置完成后,点击【确认】按钮,将自动生成并安装包,此时在左侧开发库面板中可以看到新建的“MyExample”包。选中此包并点击右键菜单【在新窗口中打开】,将打开此包的源码文件夹。

3.3.1应用函数库开发流程在新窗口中打开打开MyExample包的源码组织库的目录结构一个标准的包(如Revise),其目录结构如下所示docs:帮助文档文件夹examples:可选,测例文件夹images:可选,资源文件夹src:库源码文件夹test:单元测试文件夹Project.toml:项目文件LICENSE.md:许可证文件README.md:库说明文件…:用户还可以添加其它文件夹

3.3.1应用函数库开发流程(Revise)函数库的目录结构定义库的外部接口导出列表函数、类型、全局变量和常量等,可以通过export添加到模块的导出列表。通常,导出列表位于或靠近模块定义的顶部,以便读者可以轻松找到它们

3.3.1应用函数库开发流程Revise库的导出列表MyExample包的导出列表moduleMyExample

exportgreet

greet()=print("HelloWorld!")

…

end

#module定义库的外部接口函数定义Julia包中最常用的就是函数,函数定义由两部分组成:一是函数注释,包括函数原型和函数功能说明;二是函数的算法实现

3.3.1应用函数库开发流程Revise库的函数定义3.2.1应用函数库开发流程函数定义为MyExample包添加“domath”和“pythagoras”函数3.2.1应用函数库开发流程函数定义其中,MyExample/src/math.jl中的函数定义如下函数帮助函数帮助分为简要说明和详细手册两种形式。简要说明从函数定义中自动提取。完整帮助手册需要用户手工编写并集成到MWORKS.Syslab帮助手册。查看函数简要说明可通过开发库面板的右键菜单或在REPL中输入“?函数名”来查看。

3.3.1应用函数库开发流程查看函数简要说明设置库的依赖库的项目文件一个库往往需要依赖其它函数库,因此该库的项目文件Project.toml记录了其所有依赖信息

3.3.1应用函数库开发流程依赖库及其版本兼容要求3.3.1应用函数库开发流程project.toml,内容解释如下name:包的名称uuid:包的唯一标识authors:包的作者,格式为“[NAME<EMAIL>,NAME<EMAIL>]”version:包的版本,需符合SemVer语义化版本规则:主版本、新特性、bug修复[deps]:依赖的其他函数库,格式为“name=uuid”[compat]:对依赖库版本兼容要求,参考/v1/compatibility/[extras]:单元测试的依赖库,与[targets]一起使用[targets]:单元测试的依赖库,参考/v1/creating-packages/#Test-specific-dependencies-1设置库的依赖添加库的依赖手工修改项目文件project.tomlMWORKS.Syslab提供了“包管理器”,通过界面操作即可完成库的依赖设置。

3.3.1应用函数库开发流程设置库的依赖选择依赖的包设置库的依赖移除库的依赖手工修改项目文件project.tomlMWORKS.Syslab提供了“包管理器”,通过界面操作即可完成库的依赖设置。

3.3.1应用函数库开发流程查看库的依赖移除依赖3.3.1应用函数库开发流程进行库的单元测试单元测试对于绝大多数代码开发来说,测试是保障代码质量和可靠性的最有力的工具常用测试工具Test:为Julia标准库ReferenceTests:将结果与参考文件绑定做交叉对比测试,常用于图片的测试Suppressor:用于抑制或捕获stdout/stderr的输出结果,经常与Test联合使用Random.seed!:用于重置随机数种子,对于某些不定的情况会有用3.3.1应用函数库开发流程单元测试常用命令Julia的测试代码存放在“<包根目录>/test”文件夹内并通过“pkg>test”调用“test/runtests.jl”文件。该文件可以理解为Julia单元测试的main文件。@test:检查表达式的结果是否为true。如果为true则测试通过。@test的运行结果3.3.1应用函数库开发流程单元测试常用命令@testset:用于将各个测试组织在一起其中,不通过的测试会被标记为"Fail",此时要么是测试代码没写对,要么是对应的功能存在bug@testset的运行结果@testset"math"begin@test1+1==2@test1-1==0@test1/0==1end3.3.1应用函数库开发流程测试工具常用命令@test_throws:用于测试函数的报错行为。如希望测试一个函数按照预期的方式报错,则需要借助其进行,例如可以通过下列代码进行测试@test_throws测试结果3.3.1应用函数库开发流程测试工具常用命令@test_warn:测试warn日志信息。@test_warn可以理解为@test_logs针对warn的特殊版本3.3.1应用函数库开发流程测试工具常用命令@capture_out:用于捕获stdout输出。例如:下面的示例没办法直接用@test进行测试,因为print返回的是nothing此时,可以通过Suppressor来进行IO的捕捉从而达到测试的目的,示例代码如下3.3.1应用函数库开发流程测试工具常用命令@capture_err:用于捕获stderr输出。日志行为属于stderr输出,因此也可以通过Suppressor进行捕获@capture_err捕获stderr输出3.3.1应用函数库开发流程测试工具常用命令@test_broken:标记本应该通过的测试。在测试驱动的开发模式TDD(testdrivendevelopement)下,有一些功能暂时还没开发完成从而导致一些测试无法通过。这与@test最大的差别在于@test_broken不会影响单元测试的最终结果。@test_broken标记的测例在CI/CD中依然会显示为绿色(通过)而非红色(不通过)。类似的还有@test_skip,它会直接跳过执行,但留下一个broken记录。3.3.1应用函数库开发流程测试工具常用命令@inferred:测试类型不稳定。例如,下面这种类型不稳定的代码在Julia下会得到很糟糕的速度为此,我们可以使用@inferred来捕捉这种类型不稳定@inferred测试类型是否稳定3.3.1应用函数库开发流程测试工具常用命令在日常开发过程中,也可以通过@code_warntype来检查类型不稳定,例如下面这样检查类型是否稳定3.3.1应用函数库开发流程测试工具常用命令Random.seed!:固定随机数种子。如果一个函数内部有rand等随机行为,则每次的结果可能会不一样。这时可以选择两种方案测试基本属性(而非具体数值):例如尺寸、值域范围、数值分布等;使用随机数种子进行固定编写库的测例单元测试主要用于自动化回归测试,不适合用户学习、使用和演示。可在包根目录下新增一个examples文件夹,用于存放使用示例,提供可运行体验。例如,TiffImages库采用这种做法,examples文件夹中的示例可供体验。Julia函数库可以不带examples。

3.3.1应用函数库开发流程TiffImages库的示例集开发库的帮助文档Julia社区提供的Documenter.jl功能有限,无法满足工业软件使用需求。推荐使用同元提供的帮助文档开发工具来完成自定义函数库的帮助文档编写与发布。3.3.1应用函数库开发流程MWORKS.Syslab帮助文档效果3.3.1应用函数库开发流程新建帮助文档工程新建工程配置:点击Ribbon工具栏“新建帮助工程”图标,填写中文和英文名称。新建帮助工程3.3.1应用函数库开发流程新建帮助文档工程帮助文档项目点击“浏览”选择项目文件夹“SyslabHelpSourceCode”。选择帮助文档项目文件夹3.3.1应用函数库开发流程新建帮助文档工程文件夹选择完成后,选择“是”使用模板,点击“新建帮助工程”按钮,开始新建。新建完成后,右下角会“新建帮助文档工程成功,生成目录为…”,此时,左侧资源管理器中已经打开新建的工程文件夹新建帮助文档工程成功3.3.1应用函数库开发流程新建帮助文档工程工程目录结构:左侧资源管理器中的CUSTOMPLOT目录内是提供的模板内容。.public:帮助文档资源文件,是存放静态图片、pdf、MP4等等文件的地方。建议资源文件目录结构与md文件目录结构保持一致。帮助文档模板帮助文档资源文件3.3.1应用函数库开发流程新建帮助文档工程.vuepress\config:其中,config文件夹内容如下extensionConfig.js:外部扩展配置文件;keyword.js:搜索栏关键词集合,添加专有名词时,直接在数组中添加配置文件关键词集合3.3.1应用函数库开发流程新建帮助文档工程menuListData.js:菜单大纲配置,根据界面配置自动生成。publicConfig:公共配置,用户可以设置搜索忽略的文件夹和特殊符号的markdown文件的路径。Doc:文档内容,即放置文档md文件的地方。文件夹里的md文件目录层级与帮助文档目录层级对应文档内容对应帮助文档目录3.3.1应用函数库开发流程新建帮助文档工程Example:示例内容,即放置示例md文件的地方文件夹里的md文件目录层级与帮助文档目录层级对应示例内容帮助文档示例3.3.1应用函数库开发流程编辑帮助文档新建的帮助文档包含完整示例,用户可编辑、预览和生成文档。在当前资源管理器打开的文件夹中,选择一个md文件,右键菜单选择“Syslab:预览帮助文档”以打开编辑工具栏。打开已有帮助文档工程可通过MWORKS.Syslab左侧资源管理器打开工程文件夹。3.3.1应用函数库开发流程生成帮助文档MWORKS.Syslab左侧资源管理器打开工程文件夹CustomPlot,点击Ribbon工具栏“生成帮助文档”图标,生成配置页面生成帮助文档配置3.3.1应用函数库开发流程生成帮助文档用户可以对“扩展模块名称”进行修改,“扩展模块名称”与帮助文档左侧边栏中的模块对应。扩展模块名称3.3.1应用函数库开发流程生成帮助文档用户可以选择“文档”、“示例”、“函数”和“视频”中的任意模块进行打包。切换选项3.3.1应用函数库开发流程生成帮助文档“切换选项”与帮助文档的以下模块对应。“切换选项”文档对应3.3.1应用函数库开发流程生成帮助文档用户可以通过“大纲配置”来配置帮助文档的导航栏菜单。大纲配置的层级和链接即对应生成后的帮助文档左侧导航栏层级。大纲配置3.3.1应用函数库开发流程生成帮助文档用户在修改大纲配置时,可以选中某个节点(如“二维图和三维图”),点击右键菜单“编辑”,进入大纲节点编辑页面。通过右键菜单编辑大纲配置大纲节点的编辑界面3.3.1应用函数库开发流程生成帮助文档当用户完成上述配置后,可以设置帮助文档生成位置,默认路径为用户安装的Syslab软件的帮助文档路径。生成位置3.3.1应用函数库开发流程生成帮助文档上述配置完成后,点击“生成帮助文档”按钮,开始进行打包操作。打包过程3.3.1应用函数库开发流程生成帮助文档打包完成后,终端会出现以下画面,则证明帮助文档打包成功。打包成功显示3.3.1应用函数库开发流程生成帮助文档在MWORKS.Syslab安装路径下的帮助文档,可以直接通过MWORKS.Syslab软件中的“帮助”按钮打开并查看效果。MWORKS.Syslab帮助文档文档主页目录3.3.1应用函数库开发流程生成帮助文档打包生成的文件可以在“生成位置”路径下查看,文件夹为主页文件名称CustomPlot自定义图形工具箱主页扩展模式打包文件夹3.3.1应用函数库开发流程基于Julia调用外部语言开发函数库在MWORKS.Syslab平台中,可以基于Julia调用Python或C/C++等外部语言开发函数库PyCall是Julia调用Python函数的组件,提供直接调用Python函数和完全互操作的能力。可从Julia导入Python模块,调用Python函数(自动转换类型),定义Python类,并共享大型数据结构。详细信息请参考链接:/JuliaPy/PyCall.jl。3.3.1应用函数库开发流程基于Julia调用外部语言开发函数库在MWORKS.Syslab平台中,可以基于Julia调用Python或C/C++等外部语言开发函数库PyCall是Julia调用Python函数的组件,提供直接调用Python函数和完全互操作的能力。可从Julia导入Python模块,调用Python函数(自动转换类型),定义Python类,并共享大型数据结构。详细信息请参考链接:/JuliaPy/PyCall.jl。3.3.1应用函数库开发流程基于Julia调用外部语言开发函数库Julia调用C/C++代码主要利用ccall模块,函数定义如下:ccall((function_name,library),returntype,(argtype1,...),argvalue1,...)ccall(function_name,returntype,(argtype1,...),argvalue1,...)ccall(function_pointer,returntype,(argtype1,...),argvalue1,...)可使用更简洁清晰的方法@ccall来调用C/C++函数:@ccalllibrary.function_name(argvalue1::argtype1,...)::returntype@ccallfunction_name(argvalue1::argtype1,...)::returntype@ccall$function_pointer(argvalue1::argtype1,...)::returntype3.3.1应用函数库开发流程-C/C++转JuliaC类型标准Julia别名Julia基本类型unsignedcharCucharUInt8bool(_BoolinC99+)CucharUInt8shortCshortInt16unsignedshortCushortUInt16int,BOOL(C,typical)CintInt32unsignedintCuintUInt32longlongClonglongInt64unsignedlonglongCulonglongUInt64intmax_tCintmax_tInt64uintmax_tCuintmax_tUInt64floatCfloatFloat32doubleCdoubleFloat64complexfloatComplexF32Complex{Float32}complexdoubleComplexF64Complex{Float64}ptrdiff_tCptrdiff_tIntssize_tCssize_tIntsize_tCsize_tUIntvoid

Cvoidvoidand[[noreturn]]or_Noreturn

Union{}void*

Ptr{Cvoid}(或Ref{Cvoid})T*(whereTrepresentsanappropriatelydefinedtype)

Ref{T}(只有当T是isbits类型时,T才可以安全地转变)char*(orchar[],e.g.astring)

CstringifNUL-terminated,orPtr{UInt8}ifnotchar**(or*char[])

Ptr{Ptr{UInt8}}jl_value_t*(anyJuliaType)

Anyjl_value_t*const*(一个Julia值的引用)

Ref{Any}(常量,因为转变需要写屏障,不可能正确插入)va_arg

Notsupported...(variadicfunctionspecification)

T...(其中T是上述类型之一,当使用ccall函数时)...(variadicfunctionspecification)

;va_arg1::T、va_arg2::S等(仅支持@ccall宏)3.3.1应用函数库开发流程基于Julia调用外部语言开发函数库的其他注意事项不推荐在函数库中提交Manifest.toml文件,因为Project.toml中的完整compat字段可以锁定依赖版本。禁止使用不带限制的@reexport命令,应该使用限定符号的@reexportusingSomePkg:sym1。3.3.2函数库开发规范函数库开发规范目录结构规范:规范包含帮助文档、测例、资源、库源码等文件夹。函数定义规范:规范导出列表、函数定义,通过export添加到模块的导出列表。工程管理规范:每个函数库包含project.toml文件,用于工程管理和依赖信息。单元测试规范:规范单元测试编写和推荐测试工具的使用。3.3.3应用层函数库开发实例基于Julia语言开发函数库示例示例演示了基于Julia语言开发的简单函数库MyExample,包含3个函数:greet、domath、pythagoras。展示了不同方法开发函数库。演示了为函数添加帮助说明和编写函数的项目文件。详细代码请查看MyExample。MyExample函数库结构MyExample.jl-函数入口文件,该文件用于引入本库编写的所有函数math.jl-提供了一个勾股定理函数,并提供帮助注释runtest.jl-测试文件用于调用函数库中的函数Project.toml-库的项目文件,用于记录函数库相关信息

3.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论