对 DSL 的吐槽

我见过的大多数软件都用自己的 DSL 用来写配置文件:

  • tmux tmux 自己的 DSL
  • keynav keynav 自己的 DSL
  • cwm cwm 自己的 DSL
  • i3wm i3wm 自己的 DSL
  • conky conky自己的 DSL
  • iptable iptables 自己的 DSL
  • nftables nftables 借鉴 tcpdump 造的 DSL
  • tcpdump tcpdump自己的DSL

每学习一个软件就得学一种 DSL,真的难受。

特别对编辑器来说,如果要编辑器配合这种DSL的话,每一种DSL都得写一种 高亮,查错,补全。

就算软件不用DSL,软件还有很多使用 XML这种反人类的语言。

  • libvirt
  • fontconfig

用 json yaml scheme c Algol 风格的配置文件它不香吗?

配置文件真的需要自己造个轮子吗?

1赞

所以一般都会有个默认配置文件,照着写就行了。

开源软件应该当然可以选择自己用的配置文件格式吧,这完全看作者喜好。

赞同,期待能有人解决这些遗留问题,统一配置语法

我觉得dhall正在尝试修正这个问题。

https://dhall-lang.org/

1赞

JSON语法噪音也太多了,我还是更喜欢TOML/YAML

Fontconfig 有逻辑式编程的味道。

其实 xml json yaml 这几个语言的应用场景都不一样。

XML并不反人类。

恰恰相反,你需要的反而正是XML。

  1. XML有Schema。

    通过XML schema,你可以精确的获悉一个配置文件有哪些属性以及该属性的合法格式。如果你有一个好的XML编辑器,只要右键那个节点,然后Go to definition。

    通过XML schematron,你甚至可以对XML文档进行图灵完全级别的约束。如果你有一个好的XML编辑器,当数据填写错误时,会自动有红线标出。

    注意:这些工作不需要你专门写什么 高亮,查错,补全的插件。XML编辑器提供完全解决方案,你只需要提供正确的xsd/sch。

  2. XML更适合UI界面配置。

    每一个UI元素作为一个XML节点,这得益于XML的节点代表UI元素的类型。

  3. XML有名字空间

    一些复杂配置,往往需要复用配置文件。

    比如:用户可以通过插入xi:include把一个大的配置文件拆成几个子文档,这都得益于XML有名字空间。

所以,其实轮子早就有人造好了,就是XML。

4赞

XML 还能转成二进制格式节约空间

好吧,可能我是缺个XML的编辑器.

非常赞同~ XML的确很棒 可惜没有对应的编辑器的情况下 编写会比较麻烦 相对 直接的

port: 22

之类的而言会比较麻烦, 但是 XML的scheme是很棒的东西~ (笑 其实也就是lisp的变种 哈哈哈哈哈)

嘿嘿嘿, php天下第一(笑)
语言大战时间到, 有一些是有必要的, 有一些只是闲的蛋疼… awesomewm => lua 开心~

PS: awesomewm其实可以说是我们插入插件 而不是配置了

昨天读 Generic Programming Advanced Lectures,发现还真有这么一个XML压缩器:

http://www.cs.uu.nl/research/projects/generic-haskell/xmltools/XComprez/

XComprez is a compressor for XML documents. It assumes the input document is valid according to a given DTD. Since the DTD is known, it is possible to use knowledge about the DTD when compressing a document. Preliminary results show that XComprez compresses 25-50% better than XMill (see also gnosis), the most advanced publicly available XML compressor I know of.

1赞

XML不太适合做那种零碎的小配置,比如:配个 project 啥的。。

XML适合那种比较集中的大型配置,比如:游戏开发里的各种Unit,Weapon啥的。假如什么时候策划改了某个单位的schema,那么所有与该schema相关的实例都会报错(你甚至可以写一个XSLT去批量做修改)。

1赞

Emacs 自带功能(

说到这种DSL语法,如果不考虑打字输入的速度,偏向于可配置,可读的话,我不知道JSON行不行,另外我觉得把JSON语法弄到bash脚本语法里好像不错,比如

rm {'directory': './','target':'hello.c'}
nmap {'host':'localhost','port':'1234','ping?':false,'script':'script-name'}

当然了,没怎么写过配置语法,只是一个想法