麻省理工學(xué)院:從編程語言中消除錯誤的更簡單方法
D2X 由麻省理工學(xué)院開發(fā),是一種新工具,可以輕松調(diào)試任何特定于領(lǐng)域的編程語言。
在2019年的某個時(shí)候,麻省理工學(xué)院的博士生Ajay Brahmakshatriya制定了一個簡單的目標(biāo),但仍然很有挑戰(zhàn)性。他希望那些在特定領(lǐng)域(如氣候建模、生物信息學(xué)或建筑學(xué))擁有專業(yè)知識的人能夠編寫自己的編程語言,即所謂的領(lǐng)域特定語言(DSL),即使他們在創(chuàng)建編程語言方面很少或根本沒有經(jīng)驗(yàn)。作為麻省理工學(xué)院計(jì)算機(jī)科學(xué)和人工智能實(shí)驗(yàn)室(CSAIL)教授Saman Amarasinghe領(lǐng)導(dǎo)的研究小組的成員,Brahmakshatriya希望這些語言具有人們舒適地使用它們所需的所有輔助功能,包括調(diào)試工具。他和Amarasinghe同意,這個消除軟件錯誤的過程是必不可少的,因?yàn)樗麄兎Q缺乏調(diào)試支持是“DSL的致命弱點(diǎn)”。
對他們倆來說,這是富有成效的幾年。2021 年,Brahmakshatriya 和 Amarasinghe 推出了 BuildIt,這是一個軟件包,極大地簡化了創(chuàng)建 DSL 的任務(wù)。上個月,在蒙特利爾由計(jì)算機(jī)協(xié)會共同贊助的一次國際會議上,兩人介紹了D2X,這是一種可以輕松地向任何DSL添加調(diào)試的工具,并且已被證明與BuildIt配合得特別好。他們關(guān)于這項(xiàng)工作的論文甚至獲得了會議上頒發(fā)的兩個杰出論文獎之一。
Brahmakshatriya解釋說,在專業(yè)領(lǐng)域產(chǎn)生語言的主要原因“是為了促進(jìn)易用性。例如,圖像處理DSL可以具有“模糊整個圖像”的功能。用通用語言發(fā)出相同的命令需要更多的代碼行,Brahmakshatriya指出?!斑@是使用DSL的部分原因。另一個是性能。由于操作特定于該域,因此可以更容易地對其進(jìn)行優(yōu)化 - 以適當(dāng)?shù)捻樞驁?zhí)行,從而更高效,更快速地完成。
Brahmakshatriya 將 BuildIt 描述為“用于創(chuàng)建 DSL 的 DSL”。它有助于采用現(xiàn)有的通用編程語言并將其縮減的多步驟過程,直到它以正確的方式變得專業(yè)化?!凹僭O(shè)你有一個問題,你想寫一個程序來解決它,”他說?!澳憧梢詫懸粋€程序來完整地解決它,或者你可以寫一個較小的程序來解決你感興趣的問題的子類。你使程序越專業(yè),它的運(yùn)行速度就越快。BuildIt旨在根據(jù)這些指導(dǎo)原則構(gòu)建DSL。
Halide——一種發(fā)明于2012年的圖像處理語言,比BuildIt早幾年——是Amarasinghe團(tuán)隊(duì)中早出現(xiàn)的DSL之一。它的發(fā)展由當(dāng)時(shí)的研究生Jonathan-Ragan Kelley和當(dāng)時(shí)的CSAIL博士后Andrew Adams領(lǐng)導(dǎo)?!癏alide現(xiàn)在非常流行,它被用于許多Adobe應(yīng)用程序,包括Photoshop,但它仍然沒有調(diào)試器,”Amarasinghe說。他補(bǔ)充說,原因是“調(diào)試器非常復(fù)雜。編寫它們非常困難,這就是為什么大多數(shù)小型DSL沒有調(diào)試支持的原因。
根據(jù)Brahmakshatriya的說法,這不是一個理想的狀態(tài),他堅(jiān)持認(rèn)為每個DSL都應(yīng)該有自己的調(diào)試器?!澳悴荒苤苯訉F(xiàn)有的調(diào)試器用于你的新語言,因?yàn)樗鼈儾焕斫庥?。此外,他說,次就寫出一個完全正確的程序是不可能的?!澳憧偸菑挠绣e誤的東西開始,盡管它們通常直到開發(fā)周期的后期才會出現(xiàn)。如果此時(shí)出現(xiàn)錯誤,當(dāng)你有 5,000 行代碼時(shí),可能很難找到它。因此,一旦一個程序“代碼完成”——被其開發(fā)人員認(rèn)為已經(jīng)準(zhǔn)備好進(jìn)行測試——軟件工程師可能不得不將一半以上的時(shí)間投入到繁重的調(diào)試工作中。
但是幫助正在以D2X的形式出現(xiàn)(發(fā)音為“”,因?yàn)樗c消除程序中的毒藥或缺陷的概念有關(guān))。D2X本身不是一個程序,而是被歸類為一個庫——一段可以被其他程序重用的計(jì)算機(jī)代碼。它旨在與現(xiàn)有調(diào)試器(如 GDB 或 LLDB)配合使用,充當(dāng)這些工具和給定 DSL 之間的橋梁。調(diào)試器需要有關(guān)要清理的程序或編程語言的信息。“每個調(diào)試器都需要以自己的特定格式提供信息,可以是400頁的文檔,”Amarasinghe說?!叭绻闶褂肈2X,你不必?fù)?dān)心。它為你照顧好了。
Brahmakshatriya 說,以 D2X 為接口,“你的程序可以使用流行的調(diào)試器進(jìn)行調(diào)試,而無需對調(diào)試器本身進(jìn)行任何修改。在他看來,這是將D2X與BuildIt相結(jié)合的主要優(yōu)勢:“如果你使用BuildIt編寫DSL,你不必做任何額外的工作。您可以免費(fèi)獲得調(diào)試器,而無需編寫任何額外的代碼。
“D2X正面解決了高性能軟件的固有矛盾,”康奈爾大學(xué)計(jì)算機(jī)科學(xué)副教授Adrian Sampson評論道?!耙环矫?,特定領(lǐng)域的語言是我們在現(xiàn)代大幅提高計(jì)算效率的希望。然而,從頭開始為新語言制作新的調(diào)試器是很困難的,沒有調(diào)試器是程序員可能拒絕“更好”語言而支持“更差”語言的合理原因。D2X的偉大之處在于,它降低了為DSL構(gòu)建有用的調(diào)試器的障礙。
但就婆羅門沙特利而言,這并不是故事的結(jié)局。除了調(diào)試之外,他想與 BuildIt 合并的另一個功能是編輯,這使得編寫程序變得更容易。例如,編輯者可以突出顯示文檔中的某些關(guān)鍵字,這可以提高其可讀性。它們可以執(zhí)行其他功能,例如自動完成功能,該功能會在輸入一小部分后自動填充文本。
Brahmakshatriya 希望將分析器以及調(diào)試器和編輯器作為 BuildIt 平臺的一部分?!疤讲槠骶拖裾{(diào)試器,但它們不是幫助你找到錯誤,而是讓你評估程序中的性能問題,”他說?!叭绻绦虻倪\(yùn)行速度比預(yù)期的慢,您可以使用探查器來了解程序的哪個部分使事情陷入困境。他說,將來可能會添加其他有用的功能。
Amarasinghe認(rèn)為,所有這些努力將使創(chuàng)建專業(yè)語言的前景更具吸引力?!霸谖铱磥?,有大量的人支持傳統(tǒng)語言——成千上萬的程序員為C、C++或Java構(gòu)建工具,”他說?!傲硪环矫?,如果我正在構(gòu)建一個簡單的DSL,我沒有成千上萬的程序員來提供所有這些支持。但是現(xiàn)在,有了BuildIt和D2X,他補(bǔ)充說,“小家伙可以得到其他人得到的所有東西,包括調(diào)試器,終是編輯器和分析器——與傳統(tǒng)語言的好處相同。而且,您無需讓工程師團(tuán)隊(duì)編寫各種復(fù)雜的代碼即可實(shí)現(xiàn)這一點(diǎn)。
這項(xiàng)工作得到了應(yīng)用驅(qū)動架構(gòu)研究中心、美國國防計(jì)劃局 (DARPA)、由半導(dǎo)體研究公司和 DARPA 共同贊助的聯(lián)合大學(xué)微電子項(xiàng)目中心的支持;美國科學(xué)基金會;以及英特爾/NSF 獎。