我发现一个新的软件,用自然语言编程!非常酷!
周六晚上10點(diǎn)半, 張大胖興沖沖地在微信上找我:“欣哥,我發(fā)現(xiàn)一個(gè)編程軟件,非???#xff01;”
我:“別煩我!我忙著追劇呢?!?/p>
“真的非???#xff0c;這個(gè)軟件叫MetaCode ,可以用自然語(yǔ)言編程,你看看!”
自然語(yǔ)言編程? 難道我之前故事中杜撰的X語(yǔ)言,Z語(yǔ)言真的實(shí)現(xiàn)了??
X語(yǔ)言: 我在這兒-> 《當(dāng)世界上只剩下一個(gè)Java程序員》
Z語(yǔ)言: 我在這兒-> 《Z語(yǔ)言傳奇》
我放下了《破冰行動(dòng)》,打開(kāi)了張大胖發(fā)給我的連接:https://metacode.app/。
DSL
看了一分鐘,不僅啞然失笑:“大胖,這哪里是自然語(yǔ)言編程?分明是DSL編程!”
“啥是DSL?”
“就是領(lǐng)域特定語(yǔ)言(Domain Specific Language)“
“啥是領(lǐng)域?”
“領(lǐng)域...... 這個(gè)......”? 這家伙把我問(wèn)住了。?
“比如說(shuō),UI編程就是一個(gè)特定領(lǐng)域,Web自動(dòng)化測(cè)試也是個(gè)領(lǐng)域,還有些業(yè)務(wù)相關(guān)的,稅務(wù)邏輯處理,金融邏輯處理,都是特定的領(lǐng)域。” 我通過(guò)舉例做了一個(gè)解釋。
“那這個(gè)軟件就是針對(duì)UI編程領(lǐng)域的DSL嘍?”
“是的,你看這個(gè)軟件,當(dāng)你輸入 view controller #TestVC的時(shí)候,它就會(huì)生成一個(gè)名稱為T(mén)estVC的Controller類, 當(dāng)你輸入add stackview #stack constrained的時(shí)候,它就會(huì)自動(dòng)加上一個(gè)名稱為stack的View。 注意這里的關(guān)鍵字,?view, controller , add ,stackview,都是人家預(yù)先定義好的關(guān)鍵詞,還有那個(gè)#號(hào),你是不能亂來(lái)的?!?/p>
“有點(diǎn)明白了,也就是說(shuō),這個(gè)Metacode自定義了一個(gè)更加高層的語(yǔ)言,程序員可以用這個(gè)語(yǔ)言中的指令來(lái)寫(xiě)程序, 然后Metacode再把他們轉(zhuǎn)化成實(shí)際代碼?!?/p>
“對(duì)啊,就是這個(gè)意思,但是這個(gè)Metacode的DSL并不是一個(gè)通用的編程語(yǔ)言,你不能用它來(lái)做別的事情,你想想,你還用過(guò)哪些DSL?”
DSL案例
我看到張大胖的微信一直顯示“正在輸入”, 又撿起了破冰行動(dòng)。?
過(guò)了一會(huì)兒,張大胖的消息來(lái)了:“Ant算不算?”
“當(dāng)然算了,你看Ant中定義的任務(wù),專門(mén)是用來(lái)做Build的,你只要用XML描述一下Build的過(guò)程,根本不用寫(xiě)具體代碼, 所以它是Build領(lǐng)域的DSL?!?/p>
對(duì)類進(jìn)行打包
<jar destfile="${dist}/lib/app.jar" basedir="${build}/classes"/>
把文件從一個(gè)地方復(fù)制到另外一個(gè)地方
<copydir src="${src}/resources"? ? dest="${dist}"/>
運(yùn)行JUnit
<junit fork="yes">
? <jvmarg value="-Djava.compiler=NONE"/>
? ...
</junit>
“照欣哥這么說(shuō), Maven也算是DSL嘍?”
“對(duì)啊,Maven充分利用了約定終于配置的思路, 簡(jiǎn)化了Ant中很多不必要的Task,只要你把目錄結(jié)構(gòu)安排好,Maven就能運(yùn)行?!?/p>
“還有哪些知名的DSL?”? 張大胖繼續(xù)問(wèn)。
“Ruby on Rails(簡(jiǎn)稱)中的Active Record是DSL的一個(gè)典型?!?/p>
“又一個(gè)新詞!什么是Active Record? ”? 隔著屏幕,我都能感受到張大胖有點(diǎn)兒不滿。?
“Active Record是一種數(shù)據(jù)源架構(gòu)模式, 一個(gè)對(duì)象表示數(shù)據(jù)庫(kù)表的某一行數(shù)據(jù),這個(gè)對(duì)象不但有領(lǐng)域邏輯,還封裝了對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。想了解細(xì)節(jié)的話,可以看看Martin Fowler寫(xiě)的《企業(yè)應(yīng)用架構(gòu)模式》,這是一本很老,但是又很經(jīng)典的書(shū)了?!?/p>
“那RoR是怎么用DSL來(lái)實(shí)現(xiàn)Active Record的?”
“舉個(gè)例子,你有兩個(gè)業(yè)務(wù)相關(guān)的類,一個(gè)是Author, 另外一個(gè)是Book, 現(xiàn)在你想把他們之間建立關(guān)聯(lián), 也就是說(shuō)一個(gè)作者可以有多本書(shū),DSL可以這么寫(xiě):”
class?Author?<?ApplicationRecordhas_many?:books,?dependent:?:destroy end“當(dāng)你這么寫(xiě)了以后,神奇的事情發(fā)生了,按照約定,RoR會(huì)得知在數(shù)據(jù)庫(kù)表中下圖所示的關(guān)系,然后你的Author類突然擁有了很多有用的新方法。”
?
#創(chuàng)建一個(gè)Author對(duì)象 author?=?Author.new(name:?"Andy") #創(chuàng)建一個(gè)Book對(duì)象,這個(gè)對(duì)象和Author是關(guān)聯(lián)的 book?=?author.books.create(title:?"xxxx") #刪除這個(gè)Author,注意,所有相關(guān)的Book也會(huì)刪除 author.destroy張大胖說(shuō):“果然是厲害,就通過(guò)has_many這么簡(jiǎn)簡(jiǎn)單單的一句話,框架就可以獲取這么多信息,自動(dòng)生成這么多代碼。 RoR的ActiveRecord相當(dāng)于一個(gè)ORM領(lǐng)域的DSL,對(duì)吧?”
“可以這么說(shuō),你看,這DSL是不是很有用,可以讓我們拋棄細(xì)節(jié),在一個(gè)更高的層面的編程,能極大地提升編程的效率。RoR剛誕生的時(shí)候,號(hào)稱比Java編程快10倍呢!”
DSL的實(shí)現(xiàn)
“對(duì)了,你也可以發(fā)掘下你工作的領(lǐng)域,看看有沒(méi)有可能創(chuàng)建一個(gè)屬于自己的DSL。但是我必須得提醒你,不能為了DSL而DSL?!?/p>
“嗯,我下周上班了仔細(xì)考慮下, 可是如果想創(chuàng)建自己的DSL,該怎么辦啊?”
“因?yàn)镈SL本質(zhì)上是一個(gè)語(yǔ)言,所以你首先的定義自己的語(yǔ)法,然后再考慮怎么實(shí)現(xiàn)這個(gè)語(yǔ)法, 一種辦法是你用Lex,YACC,ANTLR等工具自己把這個(gè)語(yǔ)言給實(shí)現(xiàn)了,這叫外部DSL。?”
“自己實(shí)現(xiàn)語(yǔ)言?這太難了!”
“還有一種辦法就是‘寄生’在別的語(yǔ)言中,利用別的語(yǔ)言(Ruby ,Python)的動(dòng)態(tài)特性,構(gòu)建你自己的語(yǔ)法,像剛才的has_many就是這么做的,這種方式叫做內(nèi)部DSL?!?/p>
"好麻煩!" 張大胖已經(jīng)開(kāi)始打退堂鼓了。?
“這樣,你先看看一本書(shū)吧,也是Martin Fowler寫(xiě)的,名稱就叫做《領(lǐng)域特定語(yǔ)言》!”
總結(jié)
以上是生活随笔為你收集整理的我发现一个新的软件,用自然语言编程!非常酷!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL 到底是怎么解决幻读的?
- 下一篇: 《Spring设计思想》AOP设计思想与