OpenModelica 编译器完整编译流程(从输入到可执行仿真程序)
根据你提供的官方文档,OpenModelica 编译器整体分为:前端 → 后端 → 代码生成 → 编译生成仿真可执行文件 ,同时原生支持 Modelica 代码 和 MetaModelica 代码 / 脚本 (.mos) 编译,下面按严格流水线阶段拆解完整流程。
一、整体架构划分
编译器分为两大核心部分:
- 前端 Frontend:源码解析、语法树构建、AST→SCode 转换、模型扁平化实例化、类型检查、连接方程展开、继承 / 重定义 / 修饰处理
- 后端 Backend:方程分析排序、DAE 降阶与 BLT 分块下三角变换、方程优化
- 代码生成器:生成 C(默认)或其他目标语言代码
- 本地编译器:编译生成的 C 代码 → 仿真可执行程序
二、逐阶段完整编译流程(按执行顺序)
阶段 1:输入源码
输入文件:
- Modelica:
.mo模型库 / 模型代码 - MetaModelica:元编程代码、
.mos脚本文件
阶段 2:词法语法解析 & 生成抽象语法树 AST(Absyn)
- 编译器基于 ANTLR 3 文法 实现解析器,由 ANTLR 生成 C 解析代码;
- 由
Parser模块封装解析接口,支持从文件 / 内存读取源码; - 解析源码生成 AST 抽象语法树 ,由
Absyn模块定义所有数据结构:- 顶层:
Program→ 由多个Class组成 Class:包含类名、前缀(partial/final/encapsulated)、约束、类体、Info 位置信息(行号、文件名、只读标记等,用于报错定位)- 类体:
ClassPart(public/protected/equation/algorithm 分段) - 元素:
ElementSpec(类定义、组件变量声明等)
- 顶层:
- 特点:AST 完全贴合源码结构,多变量合并声明、多段方程 / 算法分段原样保留。
阶段 3:AST 重写转换为中间表示 SCode
由 SCodeUtil.translateAbsyn2SCode 完成 Absyn → SCode 转换,做标准化规整:
- 变量拆分 :
Real x,y[17];拆成独立两个组件,不再合并存储; - 同类型区段合并:把分散多段 equation/algorithm/public/protected 分别合并成一个列表;
- 访问控制属性内化:public/protected 不再依赖所在区段,直接存到元素自身属性中;
- 简化后续语义分析、扁平化处理,复用 Absyn 部分基础类型(Exp、TypeSpec、Info 等)。
阶段 4:模型扁平化 & 符号实例化(Flattening/Elaboration)
编译器前端核心阶段,也是面向对象模型转纯方程模型的关键:
- 处理 类继承、extends、redeclare 重定义、modification 参数修饰;
- 实例化所有子组件、展开层级结构,消除 Modelica 面向对象层级,仅保留名字的点号层级;
- 完成 类型检查、package 导入、connect 连接方程展开;
- 维护环境作用域:记录当前类上下文、变量 / 类定义、父作用域、修饰参数集;
- 核心函数:
instClass:实例化类,新建作用域、递归处理子组件、收集连接集方程;instElement:实例化类内元素(变量、类、extends 等),查找类定义、合并参数修饰、绑定变量默认方程;
- 输出结果:扁平化后的纯变量、方程、算法、函数集合,封装为 DAE 中间元素列表。
本阶段只做符号编译期实例化,不创建运行时数据对象。
阶段 5:后端 - 方程分析器 Equation Analyzer
- 接收前端输出的扁平化 DAE(微分代数方程组);
- 对 DAE 方程组进行拓扑排序;
- 做 索引降阶 ,转换为 BLT 分块下三角 DAE 形式,方便后续求解器计算。
阶段 6:后端 - 方程优化器 Equation Optimizer
对排序后的 BLT-DAE 做等价化简、常量折叠、冗余方程消除、表达式简化等优化,得到优化后的标准 DAE。
阶段 7:代码生成器 Code Generator
- 输入:优化后的 DAE 方程组、函数、算法;
- 默认生成 C 语言代码;
- 支持替换代码生成后端,可输出其他目标语言;
- 将所有方程、变量、求解逻辑翻译成结构化源码。
阶段 8:本地编译链接 → 仿真可执行文件
- 调用系统 C 编译器,编译生成的 C 代码;
- 链接 OpenModelica 运行时库、求解器库;
- 最终生成 可独立运行的仿真可执行程序,完成整个编译链路。
三、MetaModelica 专属编译流程(额外补充)
- MetaModelica 本身用来编写 OpenModelica 编译器自身;
- 编译 MetaModelica 普通代码:流程和标准 Modelica 函数编译大体一致,增加元编程语法与数据类型支持;
- 编译 MetaModelica 脚本
.mos:由编译器Interactive模块专门处理,支持交互式脚本执行、元编程动态变换。
四、极简总流程图(文字版)
Modelica/.mo/ MetaModelica/.mos→ 词法语法解析 (ANTLR) → 生成 Absyn AST→ AST 规范化转换为 SCode→ 模型扁平化 + 符号实例化 + 类型检查 + 连接方程展开→ 前端输出扁平化 DAE→ 后端方程分析 + BLT 排序 + 索引降阶→ 方程优化→ 代码生成(默认 C)→ C 编译 + 链接→ 仿真可执行程序