Julia编译流程与常用第三方库

Julia编译流程与常用第三方库

文章目录

  • Julia编译流程与常用第三方库
    • 抽象语法树ASTS
    • 执行过程
      • Parser
      • 扩展宏
      • 类型推断
      • JIT代码生成
      • 系统映像
    • 常用第三方库
      • 文档与注释
      • 科学计算与数据处理
      • 图形可视化
      • 数据库操作
      • 机器学习与深度学习

抽象语法树ASTS

Julia的代码表示分为两种,第一种是Surface Syntax AST,是代码的结构化表示;第二种是IR(中间表示),用于类型推断和代码生成

  • IR特征:节点类型少,扩展了宏,控制流转化为显示分支和语句序列
  • Surface Syntax AST:由Exprs和原子组成(例如符号,数字)

执行过程

  • 用户启动Julia
  • 调用ui/repl.c中的main()函数,处理命令行参数,初始化Julia,将控制权转移给Base._start()
  • _start如果提供文件名,则执行文件,否则启动交互式REPL
  • 如果要运行的代码块在文件中,则调用jl_load(char *filename)加载文件并解析它。然后传递每个代码片段给eval执行
  • 代码(或AST)的每个片段都被移交给eval()执行并得到结果
  • jl_toplevel_eval_flex()决定代码是否是“顶级”动作(例如usingmodule),这在动作中是无效的。如果是这样,它会将代码传递给顶层解释器
  • jl_toplevel_eval_flex()然后扩展代码消除宏并“降低”AST以使其更容易执行
  • jl_toplevel_eval_flex()使用一些简单的启发式方法来决定是对JIT编译AST还是直接解释它
  • 解释代码的大部分工作由evalininterpreter.c处理
  • 编译代码的工作由codegen.cpp处理,第一次调用Julia函数时,对其进行类型推断生成更快的代码
  • 退出REPL或者执行到程序末尾,_start()返回
  • 退出前会对清理所有的libuv handler

##编译过程
Parser——>扩展宏——>类型推断——>JIT代码生成

Parser

julia-parser.scm处理Julia代码标记并转换成AST,并使用julia-syntax.scm处理将复杂AST表示转换为更简单,“降低”的AST表示,更适合于分析和执行。

扩展宏

eval()处理到宏的时候,会尝试扩展对应的AST节点

类型推断

conpiler/typeinfer.jl中实现类型推断,检查Julia函数并确定其每个变量类型的边界的过程,以及函数返回值类型的界限,可用于进一步优化函数

JIT代码生成

Codegen将Julia AST转化为本机机器代码

使用jl_init_codegen in codegen.cpp初始化JIT环境
通过函数emit_function(jl_method_instance_t*)将Julia方法转化为一个函数

其余的帮助文件:

  • debuginfo.cpp
    处理JIT函数的回溯
  • ccall.cpp
    处理ccallllvmcall FFI以及各种abi_*.cpp文件
  • intrinsics.cpp
    处理各种低级函数

系统映像

系统映像是一组Julia文件的预编译存档,通过执行sys.jl生成sysimg.jl,并将生成的环境(包括类型,函数,模块和所有其他定义的值)序列化到文件中,作为未来Julia运行的起始

常用第三方库

文档与注释

  • Documenter.jl
    用于将Julia代码中的注释系统及其中的Markdown文件生成完整的说明文档

科学计算与数据处理

  • Distributions.jl:为概率分布计算提供支持,还支持多元统计分布、混合模型、假设检验及分布拟合等计算

  • Distances.jl:提供了各种相似性度量函数的支持

  • DataFrames.jl:一个专门用于处理行列式或表格式(tabular)的库

  • CSV.jl:专为CSV文件的读写提供支持的库

  • JSON.jl:提供对JSON格式数据的处理

  • Taro.jl:用于从WordExcelPDF文件中提取内容的库

图形可视化

  • Gadfly.jl:绘图与可视化库,图形渲染质量高,直管一致的接口设计,支持大量绘图类型
  • ECharts.jl:基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表
  • VegaLite.jl:一种高级可视化语法。它支持简洁的 JSON 语法,用于支持快速生成可视化以支持分析。Vega-Lite 支持交互式多视图图形,可以编译成 Vega
  • QML.jl:用于GUI编程,通过CxxWrap.jl包提供了Qt5 QML的编程支持

数据库操作

  • JDBC.jl:基于JavaCall.jl包的功能,通过Java的接口访问JDBC驱动。提供的API包括两种核心组件,一种是访问JDBC的直接接口,另一种是支持DataStreams.jlJulia接口

机器学习与深度学习

  • TensorFlow.jl:是对TensorFlow库的封装
  • Mocha.jl:一个高效的深度学习框架,包含了通用的随机梯度求解器,可以它构建层训练深、浅(卷积)网络。
  • Flux.jl:一个机器学习工具包,可以实现各种基本模型(如线性回归)到复杂模型(如神经网络)的搭建、优化和使用。
  • MXNet.jl:提供MXNet相关支持
  • ScikitLearn.jlScikitLearnJulia封装
  • SVM.jl:支持向量机库
  • KNN.jl:对机器学习中的KNN算法提供支持

其余的还有MachineLearning.jlDecisionTree.jlBoltzmann.jlBayesNets.jl

你可能感兴趣的:(Julia)