首页 / 行业
MetaCode ,可以用自然语言编程
2019-07-18 11:27:00
周六晚上10点半, 张大胖兴冲冲地在微信上找我:“欣哥,我发现一个编程软件,非常酷!”
我:“别烦我!我忙着追剧呢。”
“真的非常酷,这个软件叫MetaCode ,可以用自然语言编程,你看看!”
自然语言编程?难道我之前故事中杜撰的X语言,Z语言真的实现了?
X语言:我在这儿-> 《当世界上只剩下一个Java程序员》
Z语言:我在这儿-> 《Z语言传奇》
我放下了《破冰行动》,打开了张大胖发给我的连接:
https://metacode.app/。
DSL
看了一分钟,不仅哑然失笑:“大胖,这哪里是自然语言编程?分明是DSL编程!”
“啥是DSL?”
“就是领域特定语言(Domain Specific Language)“
“啥是领域?”
“领域...... 这个......” 这家伙把我问住了。
“比如说,UI编程就是一个特定领域,Web自动化测试也是个领域,还有些业务相关的,税务逻辑处理,金融逻辑处理,都是特定的领域。” 我通过举例做了一个解释。
“那这个软件就是针对UI编程领域的DSL喽?”
“是的,你看这个软件,当你输入 view controller #TestVC的时候,它就会生成一个名称为TestVC的Controller类, 当你输入add stackview #stack constrained的时候,它就会自动加上一个名称为stack的View。注意这里的关键字,view, controller , add ,stackview,都是人家预先定义好的关键词,还有那个#号,你是不能乱来的。”
“有点明白了,也就是说,这个Metacode自定义了一个更加高层的语言,程序员可以用这个语言中的指令来写程序, 然后Metacode再把他们转化成实际代码。”
“对啊,就是这个意思,但是这个Metacode的DSL并不是一个通用的编程语言,你不能用它来做别的事情,你想想,你还用过哪些DSL?”
DSL案例
我看到张大胖的微信一直显示“正在输入”, 又捡起了破冰行动。
过了一会儿,张大胖的消息来了:“Ant算不算?”
“当然算了,你看Ant中定义的任务,专门是用来做Build的,你只要用XML描述一下Build的过程,根本不用写具体代码, 所以它是Build领域的DSL。”
对类进行打包
把文件从一个地方复制到另外一个地方
运行JUnit
“照欣哥这么说, Maven也算是DSL喽?”
“对啊,Maven充分利用了约定终于配置的思路, 简化了Ant中很多不必要的Task,只要你把目录结构安排好,Maven就能运行。”
“还有哪些知名的DSL?” 张大胖继续问。
“Ruby on Rails(简称)中的Active Record是DSL的一个典型。”
“又一个新词!什么是Active Record? ” 隔着屏幕,我都能感受到张大胖有点儿不满。
“Active Record是一种数据源架构模式, 一个对象表示数据库表的某一行数据,这个对象不但有领域逻辑,还封装了对数据库的访问。想了解细节的话,可以看看Martin Fowler写的《企业应用架构模式》,这是一本很老,但是又很经典的书了。”
“那RoR是怎么用DSL来实现Active Record的?”
“举个例子,你有两个业务相关的类,一个是Author, 另外一个是Book, 现在你想把他们之间建立关联, 也就是说一个作者可以有多本书,DSL可以这么写:”
class Author < ApplicationRecord has_many :books, dependent: :destroyend
“当你这么写了以后,神奇的事情发生了,按照约定,RoR会得知在数据库表中下图所示的关系,然后你的Author类突然拥有了很多有用的新方法。”
#创建一个Author对象author = Author.new(name: "Andy")#创建一个Book对象,这个对象和Author是关联的book = author.books.create(title: "xxxx")#删除这个Author,注意,所有相关的Book也会删除author.destroy
张大胖说:“果然是厉害,就通过has_many这么简简单单的一句话,框架就可以获取这么多信息,自动生成这么多代码。RoR的ActiveRecord相当于一个ORM领域的DSL,对吧?”
“可以这么说,你看,这DSL是不是很有用,可以让我们抛弃细节,在一个更高的层面的编程,能极大地提升编程的效率。RoR刚诞生的时候,号称比Java编程快10倍呢!”
DSL的实现
“对了,你也可以发掘下你工作的领域,看看有没有可能创建一个属于自己的DSL。但是我必须得提醒你,不能为了DSL而DSL。”
“嗯,我下周上班了仔细考虑下, 可是如果想创建自己的DSL,该怎么办啊?”
“因为DSL本质上是一个语言,所以你首先的定义自己的语法,然后再考虑怎么实现这个语法, 一种办法是你用Lex,YACC,ANTLR等工具自己把这个语言给实现了,这叫外部DSL。”
“自己实现语言?这太难了!”
“还有一种办法就是‘寄生’在别的语言中,利用别的语言(Ruby ,Python)的动态特性,构建你自己的语法,像刚才的has_many就是这么做的,这种方式叫做内部DSL。”
"好麻烦!" 张大胖已经开始打退堂鼓了。
“这样,你先看看一本书吧,也是Martin Fowler写的,名称就叫做《领域特定语言》!”
最新内容
手机 |
相关内容
什么是可编程只读存储器,可编程只读
什么是可编程只读存储器,可编程只读存储器的基本结构、特点、工作原理、应用、发明过程、故障分析、日常保养及市场前景,可编程只读基于电力载波通信的远程开关设计可
基于电力载波通信的远程开关设计可使用线驱动器CN6212,驱动器,载波,调制解调器,连接,软件编程,芯片,基于电力载波通信的远程开关设从零基础开始,掌握低代码+ Al 的应
从零基础开始,掌握低代码+ Al 的应用技巧,零基础,方法,框架,工具,深度学习,学习,低代码(Low-Code)是一种通过可视化开发工具和少量手写IBM开发新芯片为AI提速:消除片外内
IBM开发新芯片为AI提速:消除片外内存,灵感来自大脑,内存,芯片,灵感,计算,性能,数据,IBM最近宣布他们正在开发一种新型FDC6330L芯片,旨存算一体芯片新突破!清华大学研制出
存算一体芯片新突破!清华大学研制出首颗存算一体芯片,芯片,需求,存储容量,功耗,存储器,计算,清华大学近日宣布研制成功了首颗存算一OTP语音芯片的采集原理
OTP语音芯片的采集原理,芯片,语音,解码,数字化,数据,信号,OTP(One Time Programmable)语音芯片是一种只能编程一次的ADUM1250ARZ语音plc最简单的电路原理图 介绍几种最
plc最简单的电路原理图 介绍几种最常用的控制电路(启动、保持和停止电路、互锁控制电路), plc,控制电路,编程语言,梯形图,PLC控制,目电动机控制电路图分享
电动机控制电路图分享,电路图,电动机控制电路图,电动机控制电路图分享 plc,编程,控制电路,电机,正反转电路,1、启动、保持和停止电