领域专用语言(DSL)

深入理解与实践:打造高效沟通的领域专用语言 (DSL) 在软件开发与自动化时代,领域专用语言(DSL, Domain-Specific Language)因“贴近业务、简洁表达”而备受关注。本文将系统介绍什么是 DSL、常见 DSL 示例,以及如何设计一门高质量的 DSL。尤其在 AI 文本能力突飞猛进、但结构化执行能力尚待提升的当下,掌握 DSL 能让我们更精准、高效地与各类 AI 工具沟通,弥补其局限、释放协作潜力。 阅读详情

原文: DomainSpecificLanguage    设计        2004年2月13日            Bliki 索引

所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。几乎自计算机发明伊始,人们就开始谈论DSL使用DSL了。

Unix社群是一个频繁使用DSL的社群,他们通常称之为小语言或迷你语言。(关于这一传统,Eric Raymond的《 Unix编程艺术》有上佳 探讨。)要构建一种DSL,按最常见的Unix风格的做法,就是先定义它的语法,然后通过代码生成技术把DSL代码转成一种通用语言代码,或者写一个这种DSL的解释器。Unix有很多工具能让这件事做起来轻松些。我为这类DSL定了一个术语:“ 外部DSL”。XML配置文件是外部DSL的另一种常见形式。

DSL也是Lisp和Smalltalk社群的一项重要传统,但方式不同,他们不是动手新造一套语言,而是让Lisp或Smalltalk这种通用目的语言换个颜面变成DSL。(Paul Graham的文章《 自底向上编程》对此有精彩讲述。)利用编程语言自带的语法结构定义出来的DSL,我称之为“ 内部DSL”,也叫做“ 内嵌DSL”。这是种通用策略,不仅适用于Lisp和Smalltalk,用任何语言都可以这么做,我面对问题时总是考虑着用这种策略定义出具有DSL功能的东西来解决,不过Lisp和Smalltalk程序员走得要深远得多。

关于这两类DSL,在我最近的文章《 语言工作台(Language Workbench)》中有进一步的例子,我希望DSL能使用得更普遍,文中详细讨论了这两种风格各自的优缺点,还介绍了语言工作台工具的最新进展。

直到出现了一位人物,原本内外分流的DSL走向了一个有趣的汇合,他就是 PragDave。沿袭Unix的传统,用本主义程序员们(The pragmatic programmers)老早就是DSL粉丝了(《 用本主义程序员》 (中译本链接)第十二节对这个话题的讨论引人入胜——我干脆把它称作“用本要义12”好了)。Dave在一次富有见地的访谈里说到,尽管代码生成是他的惯用技术,但在用Ruby编程时很少用到。

我做设计时,经常借构建一套DSL的思路来类推——有意把class和方法设计成DSL的样子。不论用什么语言,我都尽量这么做,如果做不到,我就乐得转用代码生成技术了。在我们ThoughtWorks公司的较大型系统上,代码生成以及类似的技术使用得非常普遍。

什么时候需要把DSL和主语言划清界线,我认为这个问题的答案因主语言而异,用Smalltalk时我几乎从没感觉有必要分离出一种DSL来,而这种需求在用C++/Java/C#时则非常常见。

因此,我认为有的语言适合设计内部DSL,有的不适合。适合的是那种“一条道跑到黑”的风格简约的语言,它们在某一方面比其他传统语言走得更远更纯粹(例如Lisp的函数式风格,Smalltalk的“对象-消息”思想),这是我分析Lisp和Smalltalk得出的结论。再看Ruby,它比前两者更常规化一些,也比它们都庞大,但仍不失为一门用来构建内部DSL的好语言。

这么看来,语言设计者需要对语言的精练程度有一个良好的决策,既要保证常规性内容可以轻松地表达,又要为原本费神的复杂东西提供舒适的语法支持。总之,我认为这是非常重要的一点。我喜欢用Smalltalk和Ruby的程度比喜欢用Java或C#的程度高那么多,其原因我总是觉得难以言传,最常听到的解释是静态类型与动态类型的区别所致,但我总觉得这个说法并没有抓住要害,更接近两者区别本质的是它们对构建内部DSL友好程度的差异。


译注:Brian W. Kernighan与Rob Pike合著的《程序设计实践(The Practice of Programming)》第9章也是一份关于DSL的极好的参考资源。
2.ELK之Elasticsearch常用DSL语句(kibana语句) Filter DSL term 过滤 term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型): { “term”: { “age”: 26 }} { “term”: { “date”: “2014-09-01” }} { “term”: { “public”: true }} { “term”: { “tag”: “full_text” }} 完整的例子, hostname 字段完全匹配成 xxx 的数据: { "query" 阅读详情

相关推荐

ElasticSearch语法整理-DSL语言高级查询

Domain Specific Language 领域专用语言 DSL由叶子查询子句和复合查询子句两种子句组成。 无查询条件 无查询条件是查询所有,默认是查询所有的索引库的数据,或者使用match_all表示所有 GET /es_db/_doc/_search { "query":{ "match_all":{} } } 有查询条件 查询命令GET POST 都可以 1、叶子条件查询(单字段查询条件) 1.1 模糊匹配 match : 通过match关

m0_60162373的博客 5032

DSL 领域特定语言

一、DSL介绍 DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言。 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单。说到DSL,大家也会自然的想到通用语言(如Java、C等)。 为什么没有一种语言同时 兼具『简洁』和『业务表达』能力呢? 从信息论本质上来讨论这个问题,每个语言的程序都可以抽象为一个字符串,每个字符串由有限数量的合法字符组成,它在运行时会实现某个功能,因而可以看作是一种需求的信源编码。每

Sunny的专栏 3万+

开发中常见的领域专用语言 DSL(Domain Specified Language)一览

领域专用语言 SQL 结构化查询 结构化查询语言 Structured Query Language JSON 结构化数据格式 JS 对象简谱 JavaScript Object Notation XML 结构化数据格式 可扩展标记语言 eXtensible Markup Language YML 结构化配置格式 YAML Aint Markup Language RegExp 检索、替换文本表达式 正则表达式 regular expression cron 计划任务...

ni_hao_fan的博客 5064

什么是DSL?

优秀的程序员不仅关注代码的功能实现,还会关注代码的表达能力,他们善于将意图与实现分离,并保持两者的独立性。DSL 是一种强大的工具,它的设计理念不仅提升了特定领域的问题解决效率,也给了程序员更高效表达意图的方式。在日常开发中,学会用 DSL 的思维方式——即分离意图与实现,不仅有助于编写更好的代码,还能显著提升代码的可维护性和扩展性。不同于通用编程语言(如 Java、Python 等),DSL 更加简洁易懂,通常用来表达特定领域的意图和规则,使编写、阅读和维护代码的过程更加高效和直观。

pumpkin84514的博客 8761

Codesys电子凸轮从入门到应用:手把手教你用MC_CamIn/MC_CamOut实现主从轴同步

本文详细介绍了如何在Codesys平台上使用MC_CamIn和MC_CamOut功能块实现电子凸轮的主从轴同步控制。从环境配置、轴使能到凸轮表创建与动态切换,提供了完整的程序编写指南和调试技巧,帮助工程师快速掌握工业自动化中的高精度运动控制技术。

weixin_26878995的博客 277

【2022KaliLinux】openvas/gvm 没有scan configs 或者是 scan config error “XXXXXXXXXXX”

gvm/openvas的configuration的scan config为空

zbossz的学习小分队 3606

领域专用语言(DSL)迷思

引用自:http://blog.163.com/huangshengjie_2008/blog/static/20055200200851295242227/所谓领域专用语言(Domain Specific Language/DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。 DSL之于程序员正如伽南地之于以色列人

Reboot 1163

ubuntu20.4源码安装最新gcc(gcc V12.2)

Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。

q544344318的博客 1万+

领域专用语言(DSL)简介

原文地址:http://blog.youkuaiyun.com/u010278882/article/details/50554299 主要回答几下几个问题  1 什么是 DSL  2 为什么使用 DSL  3 何时使用 DSL 什么是 DSL DSL(Domain Specified Language)领域专用语言。  要理解什么是领域专用语言,需要先了解其创建背景。即

杨春建的博客 2万+

【ros2】从零认识URDF:机器人模型描述的“说明书”

visual>子节点只负责机器人在RViz2中的可视化效果,不参与任何物理计算,就像给零件“穿衣服”。<origin>:定义零件的局部坐标系相对于连杆原点的位姿,参数xyz表示平移(单位:米),rpy表示旋转(单位:弧度,绕x→y→z轴旋转);<geometry>:定义零件的几何形状,支持四种基础形状+外部3D模型;<material>:定义零件的颜色,需要提前定义材质。常见几何形状示例-- 连杆名称:base_link(底座),全局唯一 --> < visual > <!

EnHengNa的博客 1610

树莓派学习系列7——GPIO基础

前言 原来学单片机的时候,就是通过一系列的引脚来控制单片机。终于学到了通过引脚来控制树莓派了。话不多说咱们先来了解基础。

我在等那么一天的博客 1万+

python Lark教程 5)构建 DSL(领域专用语言)

DSL(领域专用语言)是专门为某一类问题领域而设计的语言。它不同于 Python、Java 这种通用编程语言(GPL, General Purpose Language),DSL 的目标是用简化的语法表达领域知识。内部 DSL:嵌入到现有语言中的 DSL。例如 SQLAlchemy 通过 Python 表达 SQL。外部 DSL:独立存在的语言,需要解析器。比如 SQL、正则表达式。我们来设计一个简单的 DSL,目标是实现一个配置语言,能用类似自然语言的方式表达变量、条件和操作。

qq_42540492的博客 783

【Linux】软件控制USB重新上电、加载:usbreset、hubpower、uhubctl

使用命令控制USB的供电、复位

郭老二 2186

文章:领域专用语言(DSL)迷思

DSL之于程序员正如伽南地之于以色列人,是最初也是最终的梦想。很多人都认为,DSL将会是软件业的“next big thing”。\u0026#xD;\n然而随着DSL的日益流行,围绕着DSL出现了很多质疑和误解,比如:\u0026#xD;\n DSL的目标受众是非程序员,业务员或者最终用户 \u0026#xD;\n DSL = 整洁的代码 \u0026#xD;\...

啊啊啊啊2 465

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 556

杰理AC696N使用ADC检测电位器调音量教程

本教程详细介绍了在杰理AC696N芯片上使用ADC功能检测电位器电压值的方法。主要内容包括:硬件连接方式(电位器VCC/OUT/GND分别接3.3V、PA3引脚和地线),10位ADC配置(0-1023对应0-3.3V),以及核心代码实现。关键步骤涉及ADC采样通道初始化、GPIO引脚配置(关闭数字输入和上下拉电阻),以及通过定时器实现50Hz采样频率。教程还详解了ADC值到系统音量的线性映射算法,并提供了完整的代码示例和调试方法,帮助开发者实现电位器实时控制音量的功能。

qq_42014563的博客 1245

【转】领域专用语言(DSL)

【转】领域专用语言(DSL)2009-01-09 15:17所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。几乎自计算机发明伊始,人们就开始谈论DSL使用DSL了。Unix社群是一个频繁使用DSL的社群,他们通常称之为小语言或迷你

544

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[转]领域专用语言(DSL)

转自:http://blog.youkuaiyun.com/mfowler/archive/2006/08/16/1069927.aspx 原文:DomainSpecificLanguage (http://www.martinfowler.com/bliki/DomainSpecificLanguage.html) 所谓领域专用语言(domain specific language / DSL)...

梁飞的博客 184

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Elixir元编程-第五章 创建一个HTML DSL(领域专用语言)

Elixir元编程-第五章 创建一个HTML DSL 要最大限度发挥宏的威力,莫过于构建一个 DSL了(领域专用语言)。他可以让你针对应用的专用领域,为语言增加一个定制层。这可以让你的代码更易编写,对问题的解决之道也展示的更为清晰。使用 DSL,你可以直接将商业需求进行代码化,可以在一个抽象的...

chengyou0542的博客 790

基于LLVM设计领域专用语言(DSL)的步骤——以激光微加工为例

激光微加工的工艺脚本语言实现

追赶时代的博客 1023

ElasticSearch DSL 领域专用语言

博文目录 文章目录ElasticSearch DSL(Domain Specific Language) 领域专用语言Query DSLFilter DSL区别查询无查询条件有查询条件叶子查询(单条件)模糊匹配matchmatch 的底层转换multi_matchmatch_phrasematch phrase 原理 - term positionmatch phrase搜索参数 - slopquery_string前缀搜索 prefix通配符搜索 wildcard正则搜索搜索推荐模糊搜索技术 fuzzy总

mrathena 487
上一篇: 企业级Rails
下一篇: 界定DSL
mfowler
博客等级 码龄20年 271粉丝 10原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值