`
lazing
  • 浏览: 23830 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DSL之一 简介

    博客分类:
  • MDA
阅读更多

 

打算从今天开始,系统的学习一下DSL相关技术。

这个系列的所有文档都来自于MF的BLIKI中的Domain Specific Languages,其余文字都是对其的理解和整理。

关于什么是DSL,之前的文章有提到过。

简单的说

DSL与通用语言相区别,是为特定目的而生的语言,它并不是什么新东西,历史几乎和计算机的历史一样长。

DSL的应用广泛而常见,比如CSS,比如Wiki。DSL通过分析特定问题域提炼动态模型,从而标准化问题处理流程。

恩,先从MM图看起:

image

重点概念

DSL的类型

DSL可以分为内部DSL(Internal DSLs)和外部DSL(Internal DSLs),主要区别在于其与实现语言的关系。

内部DSL的语法是其实现语言的子集,典型的如Ruby;外部DSL通常是定制的特殊语法,如HQL。

Language Workbenches 也是DSL实现的方式之一,特定的平台有其特殊性。

API风格的区别

传统意义的程序语言,在实现具体逻辑的时候,往往是一种命令查询风格API ;而DSL通常是口语化接口

程序比较,都用Java实现

命令查询风格

    Event doorClosed = new Event("doorClosed", "D1CL");
    Event drawOpened = new Event("drawOpened", "D2OP");
    Event lightOn = new Event("lightOn", "L1ON");
    Event doorOpened = new Event("doorOpened", "D1OP");
    Event panelClosed = new Event("panelClosed", "PNCL");

    Command unlockPanelCmd = new Command("unlockPanel", "PNUL");
    Command lockPanelCmd = new Command("lockPanel", "PNLK");
    Command lockDoorCmd = new Command("lockDoor", "D1LK");
    Command unlockDoorCmd = new Command("unlockDoor", "D1UL");

    State idle = new State("idle");
    State activeState = new State("active");
    State waitingForLightState = new State("waitingForLight");
    State waitingForDrawState = new State("waitingForDraw");
    State unlockedPanelState = new State("unlockedPanel");

    StateMachine machine = new StateMachine(idle);

    idle.addTransition(doorClosed, activeState);
    idle.addAction(unlockDoorCmd);
    idle.addAction(lockPanelCmd);

    activeState.addTransition(drawOpened, waitingForLightState);
    activeState.addTransition(lightOn, waitingForDrawState);

    waitingForLightState.addTransition(lightOn, unlockedPanelState);

    waitingForDrawState.addTransition(drawOpened, unlockedPanelState);

    unlockedPanelState.addAction(unlockPanelCmd);
    unlockedPanelState.addAction(lockDoorCmd);
    unlockedPanelState.addTransition(panelClosed, idle);

    machine.addResetEvents(doorOpened);

口语化风格

   doorClosed. code("D1CL");
    drawOpened. code("D2OP");
    lightOn.    code("L1ON");
    panelClosed.code("PNCL");

    doorOpened. code("D1OP");

    unlockPanel.code("PNUL");
    lockPanel.  code("PNLK");
    lockDoor.   code("D1LK");
    unlockDoor. code("D1UL");

    idle
        .actions(unlockDoor, lockPanel)
        .transition(doorClosed).to(active)
        ;

    active
        .transition(drawOpened).to(waitingForLight)
        .transition(lightOn).   to(waitingForDraw)
        ;

    waitingForLight
        .transition(lightOn).to(unlockedPanel)
        ;

    waitingForDraw
        .transition(drawOpened).to(unlockedPanel)
        ;

    unlockedPanel
        .actions(unlockPanel, lockDoor)
        .transition(panelClosed).to(idle)
        ;

DSLs实现模型

实现DSL,主要是针对特定问题域进行动态状态建模,模型可以是任意的:对象模型,结构化模型或者其他的任何实现模型;程序语言通常会很关注语法以及语义,DSLs中的建模主要就是为了建立问题域的描述语义。

DSLs实现方法

代码生成(Code-Generation)和解释运行(Interpretation)是DSL的两种实现方式,前者在编译时处理模型,后者在运行时应用模型。

从实现的角度来讲,前者更加快捷方便,而后者更加精致有效;短期看代码生成可以很快应用,长期看解释运行更能形成效益。

2字节(2byte.us)

 

 

分享到:
评论

相关推荐

    groovy 一个不错的文档 实现dsl

    Groovy因其灵活性和表达力而成为实现DSL的理想选择之一。 ##### 领域特定语言(DSL)定义 DSL是一种专注于解决特定问题领域的编程语言或可执行规范语言。与通用目的语言(General Purpose Language, GPL)相比,DSL通过...

    Groovy DSL

    Groovy的设计理念之一就是简化编程过程,通过减少代码量来提高生产力。据研究显示,在执行相同的任务时,使用Groovy编写的程序通常只需要Java所需代码量的1/3到1/10。 #### Groovy的特点 - **简洁性**:Groovy简化...

    840DSL调试

    西门子840D数控系统是西门子推出的高端数控系统之一,广泛应用于各种精密加工中心、车削中心等机床设备上。840D系列包括了840D和840DSL两个版本,其中840DSL是基于840D的基础上进行了优化和升级,更加适应现代制造业...

    电信行业中常用的DSL VDSL SHDSL技术

    在这一背景下,数字用户线路(Digital Subscriber Line,简称DSL)技术应运而生,成为解决最后一公里问题的关键技术之一。本文将详细介绍DSL技术中的几种常见类型:对称数字用户线(Symmetric Digital Subscriber ...

    Addison.Wesley.Domain.Specific.Development.with.Visual.Studio.DSL.Tools.May.2007.pdf

    《特定领域开发与 Visual Studio DSL 工具》是微软.NET开发系列书籍之一,主要介绍了如何利用 Visual Studio 的 Domain Specific Language (DSL) 工具进行高效、专业的软件开发。本书由 Steve Cook、Gareth Jones、...

    802D sl数控系统屏蔽光栅尺的具体步骤.docx

    在工业自动化领域,数控系统作为核心部件之一,广泛应用于各种加工设备中,以实现高精度的自动化控制。西门子802D sl数控系统作为一款高性能的控制系统,其在金属切削机床、塑料机械等领域的应用十分广泛。当光栅尺...

    802D诊断手册

    诊断手册是802Dsl系统的核心文档之一,为系统维护和故障排除提供了全面的指导。它包含了系统故障报警的概述、报警代码列表、报警时系统的反应以及一系列的附件,帮助技术人员快速定位和解决出现的问题。对于设计人员...

    编程语言实现模式 简介

    此外,使用模板生成领域特定语言(DSL)也是关键知识点之一,特别是StringTemplate的使用和特性,以及如何从简单的输入模型生成模板,实现在不同输入模型下的模板复用。 ### 综合运用 书中强调了模式的组合使用,...

    Dools6规则流浅析

    本文档主要介绍Drools6规则流的基础使用方法,特别是对比于Drools5版本的变化之处。规则流是一种控制规则执行顺序的重要机制,通过它我们可以定义规则之间的依赖关系以及执行路径,这对于复杂业务逻辑的应用非常有用...

    DISQL的简介(Introduction to DISQL)

    - **层次结构**:在Linux操作系统上运行,基于Hadoop等分布式计算框架,DISQL之上构建了DQuery和LSP,形成完整的数据分析与处理生态。 - **架构设计**:DISQL的架构包括Simple Mode、DQuery Mode、Complex Mode三种...

    5G移动通信系统简介

    其中,CDMA技术成为3G的核心技术之一。在中国,三大运营商分别获得了不同的3G牌照,包括中国移动的TD-SCDMA、中国联通的WCDMA以及中国电信的WCDMA2000。 ##### 第4代移动通信系统(4G) 4G技术是集成了3G与WLAN的...

    playframework部分介绍及部分功能简介,小实例一个

    1. **模块化结构:** Play Framework 的设计原则之一是模块化,这使得开发者可以轻松地添加或移除功能,根据项目需求定制框架。它包含了诸如模板引擎、JSON处理、数据库集成等模块。 2. **异步编程模型:** 与传统...

    griffon桌面开发之hello world

    一、Griffon框架简介 Griffon是一个开源项目,它将Groovy语言与JavaFX或Swing结合,为Java开发者提供了一种全新的桌面应用开发方式。Griffon的核心设计理念是MVC(Model-View-Controller)架构,这使得代码结构清晰...

    用Gradle构建和测试项目

    Java是Gradle主要支持的编程语言之一,Maven和Ant则是其在构建工具领域中的前辈。通过了解这些标签,我们可以知道本文将涉及到的Java项目构建、Maven与Gradle的对比以及Ant构建工具的相关知识。 在提供的部分内容中...

    gradle-6.7.1-all.zip

    5. Kotlin DSL改进:Gradle的Kotlin DSL是其强大特性之一,6.7.1版本对Kotlin DSL进行了进一步优化,提供了更好的类型安全性和更简洁的语法。 三、使用Gradle 6.7.1的益处 1. 提高开发效率:通过自动化构建流程,...

Global site tag (gtag.js) - Google Analytics