9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

DSL:单一语言开发的终结者?

  • 2007-08-08
  • 本文字数:1347 字

    阅读完需:约 4 分钟

许多年以来,对于软件项目,企业软件开发的主流实践一直都倾向于在单一的通用编程语言上进行标准化,从而使得 Java 和 C#成为今天编程语言的主流选择。随着越来越多的目光开始投向 DSL,也许我们的前脚已经踏在了一道新的门槛之上,向前望去,我们会发现在软件项目中采用多种语言已经成为一个标准,但 80 年代和 90 年代初出现的问题不会重现。

Martin Fowler提出,也许我们正在迈进这样的一个新时期

[……] 在这个时期内,我们将见证多种语言在同一个项目上的应用,人们就像现在选择框架一样,根据功能来选择相应的语言。

Fowler 称:“像 Hibernate、Struts 和 ADO 这样的大型框架,给人们在学习上带来的挑战,绝不亚于学习一门语言,即便你在单一一门宿主语言上使用这些框架编程也是如此。”此外,在它们的宿主语言中表述需求的难度可能会相当大,并可能引出笨拙难用的配置文件,“这些配置文件实际上就是使用 XML 写的外部领域特定语言”。

在语言中嵌入 DSL,而不是使用类库,可能会是一个更为合适的解决方案。Martin 给出了这样的一个分析结论:“API 就好比是在声明一个词汇表,而 DSL 则为其增加了相应的语法,使得人们能够写出条理清晰的句子。”因此,使用 DSL 而不是框架会使代码丰富表现力,为人们带来“更良好的抽象处理方式”,并使“阅读我们写出的代码及对我们意图的展示变得更加容易”。

Piers Cawley 称,DSL 的主要特性并非其可读性,而是“它们对去相应领域的高度专注”使得它们能够更加明确地表义。Cawley 为了阐述他的观点举了一个例子,说明 DSL 不仅仅能让我们“写出读起来像领域专家说出来的话一样的程序”,也可以很技术化,用来代表一个使用它们的语法进行操控的框架。

Neal Ford 也相信,被他称为多语言编程(Polyglot Programming)的势头正在兴起。在软件开发的这个新纪元中,日益明显的主要特征就是嵌入更多的语言,使人们能够“为所做的菜选择一把恰到好处的刀,并且恰如其分地使用它”。他举了一个例子,展示在 Java 编程语言中并行类库的使用难度,并将其与 Haskell 作比。Haskell 是一门函数式语言,“消除了变量所带来的副作用”,并使“编写线程安全的代码”变得更容易。Ford 强调说,Java 和.NET 平台都存在 Haskell 语言的实现(Jaskell 和 Haskell.net)。

不再使用单一语言进行开发所带来的风险之一可能让 80 年代末 90 年代初所出现的问题又再次重现,当时语言就是完全独立的平台,既不能互操作也不能放在一起良好地使用。Martin Fowler 指出,现在的情况有这样的一个重要区别:

在 80 年代末期,人们很难让各个语言之间紧密地互操作。这些年来,人们花了很大精力创建出可以让不同语言紧密共存的环境。脚本语言在传统上与 C 语言有着很密切的关系。在 JVM 和 CLR 平台上也有人为互操作花费了大量精力。另外人们也在类库上投入了很多人力物力,为的是让语言忽视类库的存在。

最终,要学习并使用多种语言,对于业界乃至开发人员都可能会变成一项重要资产。《Pragmatic Programmers》这本书里面就说到,由于这样做会对人们对编程的思考方式产生影响,因此这样能帮助人们发现解决问题的新途径。

您是怎样认为的呢?在下去的五年中,我们会开始混合使用语言,并像用类库一样频繁地使用 DSL 吗?

查看英文原文: DSLs bringing the end of single language development?

2007-08-08 04:003527
用户头像

发布了 117 篇内容, 共 19.7 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

2023年:我成了半个外包

Java 架构

python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(优化版)

Python 单元测试 自动化测试 unittest 测试框架

Jmeter安装配置详细教程

Jmeter 性能测试 接口测试

Continuous profiling 拯救了 Victoria Metrics

golang 性能优化 可观测性 Prometheus 性能分析

fastposter v2.12.0 ChatGPT都推荐的海报生成器

物有本末

fastposter 海报生成器 海报生成

字节前端二面高频vue面试题整理

yyds2026

Vue 前端

那些高级前端是如何回答面试题的

Geek_02d948

JavaScript 前端

前端一面必会面试题(边面边更)

coder2028

JavaScript 前端

2023-02-23:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420P格式文件。

福大大架构师每日一题

golang ffmpeg 福大大

Window 的 PHP XAMPP 安装 mongodb 的扩展

HoneyMoose

用es6的class类单例模式封装canvas环形进度条

咖啡教室

火山引擎推出一站式小程序监控方案

字节跳动终端技术

一文读透react精髓

xiaofeng

前端 React

Vue模板是怎样编译的

yyds2026

Vue 前端

前端二面高频react面试题集锦

夏天的味道123

前端 React

Corel VideoStudio会声会影2023中文语言版本

茶色酒

会声会影2023

Selenium启动IE11常见问题解决方法

自动化测试 selenium IE

开发一款wordpress插件并发布到官方插件库完全指南,小白也可以

咖啡教室

Node.js实现大文件断点续传

coder2028

JavaScript 前端

使用一个文件集中管理你的 Nuget 依赖版本号

newbe36524

C# Docker Kubernetes

秒懂算法 | 基于朴素贝叶斯算法的垃圾信息的识别

TiAmo

机器学习 算法 过滤算法

设计模式第八讲:观察者模式和中介者模式详解

C++后台开发

数据结构 设计模式 后端开发 Linux服务器开发 C++开发

LeetCode题解:633. 平方数之和,双指针,JavaScript,详细注释

Lee Chen

JavaScript 算法 LeetCode

产品经理,项目经理,FTO

laofo

DevOps cicd 敏捷开发 研发效能 持续交付

CDR2023新功能抢先看

茶色酒

cdr2023

基于selenium的UI自动化实践

Python 自动化测试 selenium

大模型时代的异构计算平台

Baidu AICLOUD

大模型训练 异构计算

会声会影2023简体中文试用版下载

茶色酒

会声会影2023

走进RocketMQ(一)整体架构与设计

白裤

Java RocketMQ RocketMQ整体架构 RocketMQ设计

会声会影2023官方试用版更新下载功能详细介绍

茶色酒

会声会影2023

JS词法环境和执行上下文

hellocoder2029

JavaScript 前端

DSL:单一语言开发的终结者?_架构_Sadek Drobi_InfoQ精选文章