2011-03-16 103 views
0

我需要創建類似OpenMP的(#pragma語句)C語言擴展,通過將具有編譯指示代碼的C轉換爲具有動態庫調用的C代碼。這不是簡單地擴展編譯指示,也需要做數組線性化,新變量聲明等。所以我正在尋找一個源代碼到源代碼的工具。類似OpenMP的語言編譯器

我發現了一些線索:TXL,JetBrains MPS,元環境,Stratego/XT,Rose,DMS。有誰能解釋一下它們之間的區別,它們的優點和缺點嗎?任何建議我都會很有幫助。

回答

2

我是背後的人DMS。你可能會發現我的回答有偏見。

所有這些工具共享源到源轉換的基礎知識。他們解析了一些源語言(可以通過各種形式的語法定義到工具),構建樹,允許您編寫代碼以導航/檢查/修改樹,然後將樹打印到文本字符串中打算成爲某種可編譯的代碼。

  • JetBrains MPS:我對此知之甚少。我認爲你必須編寫程序代碼爬過樹。這是處理樹木的經典編譯器技術。我不相信它可以解析開箱即用的C語言,更不用說OpenMP原語了,並且您會發現很多工作都是正確的。

  • MetaEnvironment:我對這個工具一無所知。高概率賭注:不解析C.

  • TXL:它具有模式匹配和代碼實例化語言,使用樹上的函數實現。這些函數可以模式匹配來拾取並遞歸到子樹中,並將樹結果從被調用的函數組裝到更大的樹中,最終生成最終的樹。這些模式使用源語法模式編寫,這使得它們相當容易編寫。 TXL無法以一種明顯的方式進行代碼分析,以供後面的代碼生成操作使用。有一種方法可以做到這一點:在一個功能通道中構建包含分析的輔助樹,並通過另一個功能性通過結果生成輔助樹;這顯然是一種常見的TXL技術。 TXL可能有一個可用的C語言分析器,但它可能只適用於預處理的C代碼;你可以彎曲這個來處理OpenMP語法,而不會遇到大量的麻煩。它不會有一個方便的符號表,使您能夠查找標識符的含義,如果您想以任何有趣的方式轉換C,您將需要這些標識符。 Stratego/XT:此工具通過將源代碼重寫爲源代碼,使用「策略」,即順序操作,允許工具在重寫成功應用或失敗時上下移動樹。這種策略方案允許在樹中的一個點收集的信息被傳送到遠處的其他點。和TXL一樣,我很肯定你可以找到一個預處理C代碼的解析器。和TXL一樣,我不認爲你會得到一個符號表或任何其他深層的代碼分析。 Rose:該工具使用EDG的前端來預處理/解析C和C++代碼並構建AST;我認爲EDG前端也會構建符號表。您似乎想要創建一個解析器的自定義版本來添加「類OpenMP」基元;我不認爲你可以用Rose做到這一點,因爲我不相信EDG前端可以以源代碼的形式提供給你破解。底盤是用C++編寫的;您可以編寫程序訪問者來爬過代碼並構建新的樹節點。它有一個神祕但可行的方案來處理源代碼模式:它將它們轉換成有效的,微小的「主」C++程序,將它們傳遞給C++分析器,並在剝離主程序外殼後返回生成的樹。LLNL使用Rose來研究科學規範,並可能接近你所需要的;如果它的解析器不處理OpenMP,我會感到驚訝,因爲這是該社區中的一項關鍵技術。羅斯還提供了一些控制和數據流分析,但我不知道他們有多複雜;它確實使玫瑰脫穎而出。

  • DMS:此工具旨在操縱任意編程語言。它提供解析,漂亮打印,符號表構造,控制流和數據流分析,以及本地和全球的點對點分析。 DMS有完整的C front endC++ front end完成預處理器,解析和符號表結構。 C前端完成了完整的流程分析(以上所有內容); C++前端還沒有進行流分析,但我們正在研究它。 所有DMS前端均以源代碼形式提供,以便可以對其進行自定義,例如添加自定義OpenMP擴展。 DMS已被用於C系統的全局分析,包含19,000個編譯單元,以及代碼生成和從大型系統中提取C API。它已被用於重新構建巨大的C++源代碼庫。這是一個工業強度的工具。在這一點上,Rose對C++轉換可能會更好一些;對於語言的廣度,支持分析和轉換的機制的範圍以及它所應用的各種任務,DMS遠遠好於玫瑰恕我直言。

您可以看到更多detailed comparison of a variety of parsing/transformation tools,包括上面的大部分內容。