今天晚上和师兄师弟们一起吃饭。去食堂的路上,一直到食堂为止都特别伤心。自己研究生生活都已经过了快两年,对自己的研究方向依然不能向别人解释清楚。特迷茫,特无助。下面是我的一些理解,不是很全面(不是我全部所想的,未必全部是对的)。

1.何谓建模?

建模就是对一个表示的抽象表示,使得抽象过的表示在一定假设下可以回答原始表示能够回答的问题。例如:

  • 把程序抽象成一个流程图,这个流程图可以回答给定输入产生什么输出的问题;
  • 把程序抽象成一个函数依赖图,可以回答关于函数之间调用关系的问题;
  • 把一个地表的自由落体抽象成成真空中的自由落体,(忽略掉空气阻力和允许一定误差情况下)回答自由落体从指定高度到达地面的时间问题 2.建模语言

语言是一种表现形式,就如眼神一样,直达人的灵魂深处。好吧,我文(che)艺(dan)了。写程序需要(编程)语言,刻画物理现象需要(数学)语言,把听到的曲调记录下来也需要(乐谱使用的)语言。建立这些事物的抽象表示(建模过程)也需要一种语言,称为建模语言,例如:UML、Petri Net、自动机(Automata)、正则表达式、上下文无关文法等。

3.建模语言分类

正如编程语言、数学语言有能力强弱、是否易用、山头派系之分,建模语言也是如此。这里主要针对程序建模语言进行说明。

图灵机是一种基础的建模语言,有许多建模语言都用图灵机作为基础来解释自身语义,或者来比较自己的能力。有一些语言表达能力等价于图灵机,有一些语言表达能力则非常有限。能力强弱并不对应语言的好坏。

其中一些语言的等价性可以用来出一些题目,例如把一个正则表达式转化为一个DFA(确定有限自动机)。

这些语言又可以按照是否有形式化的表示分为:形式化语言(Formal Languages)和非形式化语言(Informal Languages)。形式化语言的形式化表示一般使用数学中的集合和映射表示;非形式化语言一般都会有对应的非形式化的执行语义(即用自然语言说明语言中各种操作的含义,例如普通的C语言)。

按照使用范围会有针对嵌入式系统的建模语言(VHDL)、针对需求的建模语言(UML)、针对算法的建模语言(程序流程图)等等。

还有其他按照各种方法的各种分类,例如同步建模语言、异步建模语言、全局异步局部同步建模语言。我知道的并不全面,每次和大牛交流都感觉到自己的无知。

4.建模语言领域研究什么

如何在增加语言表达能力和易用性同时不影响语言其他方面的性质(语法的简洁性等)。例如图灵机中是没有整形变量的表示的,我们能看到的只有0/1的纸带。因此汇编、C等加入了各种数据结构,但是其需要解释的语义就更复杂了。相比之下Lisp的语法语义就比较简洁。

如何针对特定领域对语言进行封装优化。近些年比较火热的领域特定语言(DSL)目的就是如此。

如何能够支持模型的性质检测。可以参考模型检测领域(Model Checking)的相关知识。

如何能够用建模的模型生成一些代码,即用建模语言作为一种编程语言。这样要求建模语言要有和生成代码使用语言的比较优势(较少的代码量、简洁清晰的语义、更简单的并行并发描述等)。这种使用方式有一个相关概念:模型驱动的开发。

下面的 #5 内容会和 #4 没有那么正交,请海涵。

5.建模语言领域能够贡献的工作

写一种全新的建模语言。嗯,这个一般都是持续N(>10)年的工作。

在一种建模语言基础上添加/封装一些操作符,从而对一些被建模对象的行为提供直接支持(例如支持建模buffered signal transmission)。DSL。

把两种建模语言整合起来。比较难,需要用更低级的语言解释两者语义,以及其他一大堆问题需要处理。

对指定的建模语言生成另一种语言的代码。例如:C to Verilog,Esterel to C等。

给建模语言建立的模型写simulator,即解释建模语言的执行语义。

给建模语言写图形化的编辑器,例如Visual Studio中的GUI绘制工具。

等等一系列,一系列。

6.我在做啥

最近在做对增加了时间表示的BIP模型和增加了时间表示的Esterel模型二者混合模型的执行语义解释。现在正处于用Clojure写没有时间表示的BIP模型执行语义解释的地步。

最近在做把BIP模型生成的代码转化成C语言代码,然后在ARM板卡上执行的流程探索。这条路已经基本走通,我能说今天中午什么事都没有做,然后之前bug的程序就能够在ARM板卡上运行了么。这真是上天不负有(gou)心(shi)人(yun)啊。