我想知道部署特定于域的语言的好策略,这种语言必须至少运行2种语言(Java,C#)和更多(Python,可能还有Javascript).
一些背景.我们已经开发并部署了目前用C#编写的特定于域的语言.它通过一系列方法调用进行部署,这些方法调用的参数是公共语言基元(字符串,双精度等),集合(IEnumerable,HashSet,...)或特定于域的库(CMLMolecule,Point3,RealSquareMatrix)中的对象.该库经过了充分测试,并且对象必须符合稳定部署的XML模式,因此更改将是进化和管理的(至少这是希望).
我们希望这种语言能够被一个广泛的,部分计算机文化的社区所使用,用于在没有中央控制的情况下攻击他们自己的解决方案.理想情况下,DSL将创建一定程度的封装并产生他们所需的基本功能.这些库将管理详细的算法,这些算法有很多种,但却众所周知.在域特定语言和功能库中, DSL的要求有很多共同之处.
我很欣赏有关最佳架构的想法(显然,一旦它部署,我们就不能轻易回溯).选择至少包括:
表现并不重要.目的明确是.
编辑有关应用程序调用是否构成DSL的讨论.我发现了Martin Fowler对DSL的介绍(http://martinfowler.com/dslwip/Intro.html),他认为简单的方法调用(或链式调用)可以称为DSL.所以系列如:
point0 = line0.intersectWith(plane);
point1 = line1.intersectWith(plane);
midpoint = point0.midpoint(point1);
Run Code Online (Sandbox Code Playgroud)
可以被认为是DSL
语言和图书馆之间的问题似乎有些含糊不清."内部DSL"和"外部DSL"这两个术语很有用,我认为应归功于Martin Fowler.
"外部"DSL可能是一个独立的命令行工具.它传递了一串源代码,它以某种方式解析它,并用它做一些事情.语法和语义如何工作没有实际限制.它也可以作为一个主要由类似eval方法组成的库提供; 一个常见的例子是将SQL查询构建为字符串并调用executeRDBMS库中的方法; 不是一个非常愉快或方便的使用模式,如果在大规模的程序中传播可怕的话.
"内部"DSL是一种编写的库,其利用主机(通用)语言的怪癖来创建新语言可嵌入现有语言的印象.在语法丰富的语言(C++,C#)中,这意味着以严重拉伸(或忽略)运算符符号的通常含义的方式使用运算符重载.C++中有很多例子; 在C#中也有一些 - 反讽解析器工具包以相当克制的方式模拟BNF,效果很好.
最后,有一个普通的旧库:类,方法,属性,具有精心选择的名称.
外部DSL将允许您完全忽略跨语言集成问题,因为唯一类似库的部分将是一种eval方法.但发明自己的工具链并非易事.人们总是忘记调试,智能感知,语法高亮等重要性.
如果你想在C#和Java上做得好,内部DSL可能是毫无意义的努力.问题是,如果你利用一种主语言的怪癖,你不一定能够用另一种语言重复这个技巧.例如,Java没有运算符重载.
这留下了一个普通的旧图书馆.如果你想跨越C#和Java(至少),那么你就会选择一种实现语言.你真的想写两次图书馆吗?一种可能性是用Java编写库,然后使用IKVM将其交叉编译为.NET程序集.这可以保证在这两个平台上都有相同的界面.
在缺点方面,API将以最低公分母特征表示 - 也就是说,Java特性:).没有属性,只有getX/setX方法.避免使用泛型,因为这两个系统在这方面完全不同.此外,即使命名方法的标准方式两个之间(不同camelCase对PascalCase),所以一组用户会觉得事有蹊跷.
| 归档时间: |
|
| 查看次数: |
2793 次 |
| 最近记录: |