Domain-SpecificLanguages(DSLs)是在特定领域的特定上下文中使用的语言。作为开发者,有必要了解什么是领域特定语言,为什么要使用领域特定语言。领域特定语言(DSL)是一种用于特定领域上下文的语言。这里的域指的是某种商业(如银行、保险等)上下文,也可以指某种应用(如Web应用、数据库等)上下文。与之相对的另一个概念是通用语言(GPL,LCTT译注:注意不要与GPL许可相混淆),通用语言可以广泛应用于各种业务或应用问题。DSL不是很通用,它只是为某个适用领域设计的,但也足以表达该领域的问题并构建相应的解决方案。HTML是一种典型的DSL。它是用于Web应用程序的语言。HTML虽然不能进行数字计算,但不影响它在这方面的广泛应用。GPL没有特定的目标区域。这种语言的设计者不可能知道这种语言会用在什么领域,更不可能知道用户打算解决什么问题。因此,GPL将被设计用来解决任何问题。多种问题,适合任何一种业务,满足任何一种需求。例如,Java属于GPL。它可以运行在PC或移动设备上,嵌入到银行、金融、保险、制造等各行各业的应用中。DSL的分类从使用方式来看,语言可以分为以下两类:DSL:以DSL形式编写或表达的语言宿主语言:用于执行或处理DSL的语言以不同的语言并由另一种宿主语言处理过的DSL被称为外部DSL。下面是一个SQL形式的DSL,可以用宿主语言处理:SELECTaccountFROMaccountsWHEREaccount='123'ANDbranch='abc'ANDamount>=1000因此,只要指定词汇和语法,DSL也可以直接用英文写,用解析器生成器如ANTLR处理另一种宿主语言的DSL:ifsmokesthenincreasepremiumby10%如果DSL和宿主语言是同一种语言,这个DSL叫做InternalDSL,其中DSL由具有相同语义的宿主语言编写和处理,因此也称为嵌入式DSL。这里有两个例子:Bash风格的DSL可以被Bash解释器执行:iftoday_is_christmas;然后apply_christmas_discount;fi这里还有一个语法上看起来像英语的Bash。用类Java语法编写的DSL:orderValue=orderValue.applyFestivalDiscount().applyCustomerLoyalityDiscount().applyCustomerAgeDiscount();这一段也很有可读性。事实上,DSL和GPL之间并没有非常明确的界限。DSL家族以下语言可以作为DSL:Web应用:HTMLShell:sh、Bash、CSH等,用于类Unix系统;Windows系统的MS-DOS、WindowsTerminal、PowerShell等标记语言:XML建模:UML数据处理:SQL及其变体业务规则管理:Drools硬件:Verilog、VHD构建工具:Maven、Gradle数值计算和仿真:MATLAB(商业)、GNUOctave、Scilab解析器和生成器:Lex、YACC、为什么GNUBison和ANTLR使用DSL?DSL的目的是记录某个领域的一些需求和行为。在某些方面(比如金融商品交易),DSL的适用场景可能会更窄。业务团队和技术团队可以通过DSL有效地协同工作,因此设计人员和开发人员除了业务用途外,还可以使用DSL来设计和开发应用程序。DSL也可以用来生成一些代码来解决特定的问题,但是DSL的重点不是生成代码,而是专业领域知识的结合。当然,代码生成在领域工程中是一个巨大的优势。DSL的优点和缺点DSL的优点是很好的捕捉了领域的特点,同时不像GPL那么全面,学习和使用都比较简单。因此,它提供了专业人士之间以及专业人士与开发人员之间的沟通桥梁。DSL最显着的缺点是它只能用于特定的领域和目标。虽然不是太难学,但是还是有学习成本的。如果使用DSL相关的工具,即使提高了工作效率,开发或配置这些工具也会在一定程度上增加工作量。此外,要设计一个DSL,设计者必须同时具备领域专业知识和语言开发知识,而两者兼具的人很少。DSL相关软件开源的DSL软件包括:Xtext:Xtext可以与Eclipse集成,支持DSL开发。它支持代码生成,因此一些开源和商业产品使用它来提供特定功能。MultipurposeAgriculturalDataSystem(MADS)是一个用于农业活动建模和分析的多用途农业数据系统(MADS),是一个基于Xtext的项目。不幸的是,这个项目不再活跃。JetBrainsMPS:JetBrainsMPS是开发DSLIntegratedDevelopmentEnvironment的集成开发环境,在最底层将文档存储为一个抽象的树结构(MicrosoftWord也使用这个概念),因此它也称自己为projectioneditor投影编辑器。JetBrainsMPS支持Java、C、JavaScript和XML的代码生成。DSL的良好实践如果您想使用DSL,请牢记以下几点:与GPL不同,DSL只能用于解决特定领域中有限范围的问题。您可以先尝试查找现有的DSL,而不是构建自己的DSL。例如,网站DSLFIN提供了许多金融DSL。如果实在找不到合适的DSL,你只需要创建自己的DSL。DSL最好像普通语言一样可读。虽然代码生成不是必需的,但它确实大大提高了生产率。DSL虽然被称为语言,但DSL并不需要像GPL那样具有可执行性,而可执行性也不是DSL所需要达到的。可以使用文本编辑器编写DSL,但使用专门的DSL编辑器可以更轻松地完成DSL的语法和语义检查。
