treeedb يجعل من السهل البدء في كتابة تحليل البرنامج على مستوى المصدر في Soufflé Datalog. أولاً ، يولد treeedb أنواعًا وعلاقات Soufflé التي تمثل AST للبرنامج. بعد ذلك ، يقوم treeedb بتوزيع رمز المصدر وينبعث من الحقائق التي تملأ تلك العلاقات.
يدعم treeedb حاليًا تحليل هذه اللغات:
تعتمد محللات treeedb و ASTS على قواعد جليدية للأشجار ، ومن السهل جدًا إضافة دعم لأي لغة مع قواعد جليدية للأشجار.
اسم treeedb هو portmanteau من "Sitter Tree Sitter" مع "EDB" ، حيث يرمز EDB إلى "قاعدة بيانات التمديد" ويشير إلى مجموعة الحقائق في برنامج DataLog.
ستحتاج إلى اثنين من القطع الأثرية لكل لغة برمجة تريد تحليلها:
على سبيل المثال ، بالنسبة إلى Java ، تسمى treeedb-java.dl و treeedb-java ، على التوالي.
لتحليل بعض التعليمات البرمجية فعليًا ، ستحتاج أيضًا إلى تثبيت Soufflé.
انتقل إلى أحدث إصدار على صفحة الإصدارات وقم بتنزيل القطع الأثرية المتعلقة باللغة التي تريد تحليلها. ترتبط الموظفين التنفيذيون المُحسّنون مسبقًا بشكل ثابت ، ولكنها متاحة حاليًا فقط لـ Linux.
يمكنك إنشاء نسخة صدر من Cates.io. ستحتاج إلى برنامج التحويل البرمجي للصدأ وأداة بناء الشحن. Rustup يجعل من السهل للغاية الحصول على هذه. ثم ، لتثبيت أدوات اللغة <LANG> ، قم بتشغيل:
cargo install treeedb-<LANG> treeedbgen-souffle-<LANG>
سيؤدي ذلك إلى تثبيت الثنائيات على ~/.cargo/bin . لإنشاء ملف datalog ، قم بتشغيل treeedbgen-souffle-<LANG> ثنائي.
لسوء الحظ ، فإن الثنائيات ذات الصلة Java ليست متاحة بعد على Crates.io.
للبناء من المصدر ، ستحتاج إلى برنامج التحويل البرمجي للصدأ وأداة بناء الشحن. Rustup يجعل من السهل للغاية الحصول على هذه.
ثم ، احصل على المصدر:
git clone https://github.com/langston-barrett/treeedb
cd treeedbأخيرًا ، قم ببناء كل شيء:
cargo build --release يمكنك العثور على ثنائيات treeedb-<LANG> في target/release . لإنشاء ملف datalog ، قم بتشغيل treeedbgen-souffle-<LANG> ثنائي.
لمتابعة هذا المثال ، اتبع تعليمات التثبيت لـ Java. ثم ، قم بإنشاء ملف Java باسم Main.java :
class Main {
public static void main ( String [] args ) {
int x = 2 + 2 ;
}
} (الملفات الموضحة في هذا القسم متوفرة أيضًا في examples/java/ .)
قم بإنشاء ملف datalog المسماة const-binop.dl يتضمن treeedb-java.dl وله قاعدة للعثور على تعبيرات ثنائية ذات قيمة ثابتة:
#include "treeedb-java.dl"
.decl const_binop(expr: JavaBinaryExpression)
const_binop(expr) :-
java_binary_expression(expr),
java_binary_expression_left_f(expr, l),
java_binary_expression_right_f(expr, r),
java_decimal_integer_literal(l),
java_decimal_integer_literal(r).
.decl show_const_binop(text: JavaNodeText)
show_const_binop(text) :-
const_binop(expr),
java_node_text(expr, text).
.output const_binop(IO=stdout)
.output show_const_binop(IO=stdout)
إنشاء ملفات الإدخال ( node.csv و field.csv ):
treeedb-java Main.javaأخيرًا ، قم بإجراء التحليل باستخدام Soufflé:
souffle const-binop.dlسترى شيئًا كهذا:
---------------
const_binop
===============
94001952741472
===============
---------------
show_const_binop
===============
2 + 2
===============
لمعرفة ما هو نوع وأسماء العلاقات المتوفرة ، انظر إلى treeedb-<LANGUAGE>.dl . إذا لم يكن واضحًا أي جزء من اللغة أو علاقة معينة أو علاقة يتوافق معها ، فقم بإلقاء نظرة على القواعد النحوية لعلامة الأشجار (على سبيل المثال Grammar.js في ريبو جافا جافا من أجل Java).
قبل كتابة تحليل البرنامج في DataLog ، تحتاج إلى معرفة (1) كيفية تمثيل البرنامج كعلاقات ، و (2) كيفية استيعاب البرامج في هذا التمثيل. تقوم مشاريع DataLog الحديثة بأحدث هذا "باليد":
analysis-input.dl (1). كتابة هذه العروض وأدوات الابتلاع تستغرق وقتًا ثمينًا وتشتيت انتباههم عن عمل تحليلات الكتابة. يهدف treeedb إلى أتمتة ذلك ، وتركيبه في نفس مكان هذه الأدوات.
treeedb : قم بإنشاء حقائق DataLog من أشجار تحليل تجسس الأشجارtreeedb-c : إنشاء حقائق DataLog من رمز المصدر C.treeedb-csharp : إنشاء حقائق Datalog من رمز المصدر Ctreeedbgen : Types-types.json من قواعد النحويةtreeedbgen-souffle : قم بتوليد أنواع Soufflé وعلاقات من قواعد النحام الجليديةtreeedbgen-souffle-c : قم بإنشاء أنواع Soufflé وعلاقاتها من قواعد الشجرة C.treeedbgen-souffle-csharp : توليد أنواع وعلاقات Soufflé من قواعد النحو الجسدية C#treeedbgen-souffle-java : توليد أنواع وعلاقات Soufflé من قواعد جافا تريtreeedbgen-souffle-javascript : إنشاء أنواع وعلاقات Soufflé من قواعد جافا سكريبت جافش سكريبتtreeedbgen-souffle-rust : قم بإنشاء أنواع Soufflé وعلاقاتها من القواعد النحوية لعضلة شجرة الصدأtreeedbgen-souffle-souffle : قم بإنشاء أنواع وعلاقات Soufflé من قواعد Soufflé Tree Sittertreeedbgen-souffle-swift : توليد أنواع وعلاقات Soufflé من قواعد النحو السويفت لعضلة الأشجارtreeedb-java : قم بإنشاء حقائق Datalog من رمز المصدر Javatreeedb-javascript : إنشاء حقائق DataLog من رمز مصدر JavaScripttreeedb-rust : إنشاء حقائق datalog من رمز مصدر الصدأtreeedb-souffle : إنشاء حقائق DataLog من رمز المصدر Soufflétreeedb-swift : إنشاء حقائق DataLog من رمز المصدر السريع شكرا لك على اهتمامك بـ treeedb ! نرحب ونقدر جميع أنواع المساهمات. لا تتردد في تقديم طلب السحب وإصداره أو فتحه.
كما هو موضح في التثبيت ، هناك أداتان متورطتان في دعم تحليل كل لغة برمجة: واحدة لإنشاء أنواع وعلاقات Soufflé (على سبيل المثال ، treeedbgen-souffle-c ) ، والآخر لتحليل اللغة التي يتم تحليلها والحقائق (على سبيل المثال ، treeedb-c ).
لإضافة لغة جديدة:
treeedb-<LANG> و treeedbgen-souffle-<LANG> بنفس الهيكل مثل الهيكل الحالي (قد يكون من الأسهل نسخها القائمة بشكل متكرر).Cargo.toml من المستوى الأعلى..github/workflows/release.ymlانظر PR #9 للحصول على مثال كامل.
البرنامج النصي ./scripts/add-language.sh مثال الاستخدام:
bash scripts/add-language.sh python Python