OpenModelica 编译器完整编译流程

OpenModelica 编译器完整编译流程(从输入到可执行仿真程序)

根据你提供的官方文档,OpenModelica 编译器整体分为:前端 → 后端 → 代码生成 → 编译生成仿真可执行文件 ,同时原生支持 Modelica 代码MetaModelica 代码 / 脚本 (.mos) 编译,下面按严格流水线阶段拆解完整流程。

一、整体架构划分

编译器分为两大核心部分:

  1. 前端 Frontend:源码解析、语法树构建、AST→SCode 转换、模型扁平化实例化、类型检查、连接方程展开、继承 / 重定义 / 修饰处理
  2. 后端 Backend:方程分析排序、DAE 降阶与 BLT 分块下三角变换、方程优化
  3. 代码生成器:生成 C(默认)或其他目标语言代码
  4. 本地编译器:编译生成的 C 代码 → 仿真可执行程序

二、逐阶段完整编译流程(按执行顺序)

阶段 1:输入源码

输入文件:

  • Modelica:.mo 模型库 / 模型代码
  • MetaModelica:元编程代码、.mos 脚本文件

阶段 2:词法语法解析 & 生成抽象语法树 AST(Absyn)

  1. 编译器基于 ANTLR 3 文法 实现解析器,由 ANTLR 生成 C 解析代码;
  2. Parser 模块封装解析接口,支持从文件 / 内存读取源码;
  3. 解析源码生成 AST 抽象语法树 ,由 Absyn 模块定义所有数据结构:
    • 顶层:Program → 由多个 Class 组成
    • Class:包含类名、前缀(partial/final/encapsulated)、约束、类体、Info 位置信息(行号、文件名、只读标记等,用于报错定位)
    • 类体:ClassPart(public/protected/equation/algorithm 分段)
    • 元素:ElementSpec(类定义、组件变量声明等)
  4. 特点:AST 完全贴合源码结构,多变量合并声明、多段方程 / 算法分段原样保留。

阶段 3:AST 重写转换为中间表示 SCode

SCodeUtil.translateAbsyn2SCode 完成 Absyn → SCode 转换,做标准化规整:

  1. 变量拆分Real x,y[17]; 拆成独立两个组件,不再合并存储;
  2. 同类型区段合并:把分散多段 equation/algorithm/public/protected 分别合并成一个列表;
  3. 访问控制属性内化:public/protected 不再依赖所在区段,直接存到元素自身属性中;
  4. 简化后续语义分析、扁平化处理,复用 Absyn 部分基础类型(Exp、TypeSpec、Info 等)。

阶段 4:模型扁平化 & 符号实例化(Flattening/Elaboration)

编译器前端核心阶段,也是面向对象模型转纯方程模型的关键:

  1. 处理 类继承、extends、redeclare 重定义、modification 参数修饰
  2. 实例化所有子组件、展开层级结构,消除 Modelica 面向对象层级,仅保留名字的点号层级;
  3. 完成 类型检查、package 导入、connect 连接方程展开
  4. 维护环境作用域:记录当前类上下文、变量 / 类定义、父作用域、修饰参数集;
  5. 核心函数:
    • instClass:实例化类,新建作用域、递归处理子组件、收集连接集方程;
    • instElement:实例化类内元素(变量、类、extends 等),查找类定义、合并参数修饰、绑定变量默认方程;
  6. 输出结果:扁平化后的纯变量、方程、算法、函数集合,封装为 DAE 中间元素列表。

本阶段只做符号编译期实例化,不创建运行时数据对象。


阶段 5:后端 - 方程分析器 Equation Analyzer

  1. 接收前端输出的扁平化 DAE(微分代数方程组);
  2. DAE 方程组进行拓扑排序
  3. 索引降阶 ,转换为 BLT 分块下三角 DAE 形式,方便后续求解器计算。

阶段 6:后端 - 方程优化器 Equation Optimizer

对排序后的 BLT-DAE 做等价化简、常量折叠、冗余方程消除、表达式简化等优化,得到优化后的标准 DAE


阶段 7:代码生成器 Code Generator

  1. 输入:优化后的 DAE 方程组、函数、算法;
  2. 默认生成 C 语言代码
  3. 支持替换代码生成后端,可输出其他目标语言;
  4. 将所有方程、变量、求解逻辑翻译成结构化源码。

阶段 8:本地编译链接 → 仿真可执行文件

  1. 调用系统 C 编译器,编译生成的 C 代码;
  2. 链接 OpenModelica 运行时库、求解器库;
  3. 最终生成 可独立运行的仿真可执行程序,完成整个编译链路。

三、MetaModelica 专属编译流程(额外补充)

  1. MetaModelica 本身用来编写 OpenModelica 编译器自身
  2. 编译 MetaModelica 普通代码:流程和标准 Modelica 函数编译大体一致,增加元编程语法与数据类型支持;
  3. 编译 MetaModelica 脚本 .mos:由编译器 Interactive 模块专门处理,支持交互式脚本执行、元编程动态变换。

四、极简总流程图(文字版)

Modelica/.mo/ MetaModelica/.mos→ 词法语法解析 (ANTLR) → 生成 Absyn AST→ AST 规范化转换为 SCode→ 模型扁平化 + 符号实例化 + 类型检查 + 连接方程展开→ 前端输出扁平化 DAE→ 后端方程分析 + BLT 排序 + 索引降阶→ 方程优化→ 代码生成(默认 C)→ C 编译 + 链接→ 仿真可执行程序

相关推荐
CoderIsArt3 天前
OpenModelica 中文教程
modelica
Wumbuk2 年前
【OpenModelica】4命令行大全
开发语言·python·modelica