پالت فرمان

دنبال فرمانی برای اجرا بگردید…

ZarynZaryn
مفاهیم اصلی·۲ دقیقه مطالعه

مقایسهٔ معنایی (AST)

`zev sdiff` برای فایل‌های منبع Zig یک مقایسهٔ ساختاری انجام می‌دهد: هر دو نسخه را با `std.zig.Ast` (تجزیه‌گر AST خود کامپایلر Zig) تجزیه می‌کند، به‌جای آنکه خط‌های متن را مقایسه کند. ## چه چیزهایی را تشخیص می‌دهد برای هر تابع سطح بالا یا متد ساختار، zev نام، امضای عادی‌سازی‌شده (انواع پارامترها و نوع بازگشتی که مستقیماً از منبع تجزیه‌شده خوانده می‌شوند) و هشی از متن بدنهٔ آن را استخراج می‌کند. مقایسهٔ نسخهٔ قدیم و تازهٔ یک فایل یکی از این نتیجه‌ها را می‌دهد: - **`added`**: تابعی که فقط در نسخهٔ تازه هست - **`removed`**: تابعی که فقط در نسخهٔ قدیم هست - **`signature_changed`**: همان نام تابع، با انواع پارامتر یا نوع بازگشتی متفاوت - **`body_changed`**: همان نام و امضا، با بدنهٔ متفاوت - **`likely_rename`**: تابعی که با یک نام ناپدید شده و با نامی دیگر و هش بدنهٔ یکسان دوباره آمده است یک نمونهٔ واقعی که با خود دستور `zev sdiff` اجرا شده است: ``` ≈ fn body_will_change body changed ≈ fn sig_will_change signature changed: (i32) i32 -> (i32, i32) i32 ↔ fn calc -> calculate_total identical body - fn will_be_removed removed + fn brand_new_function added ``` ## تشخیص تغییر نام چگونه کار می‌کند و محدودیت واقعی‌اش تغییر نام با جفت‌کردن تابعی ناپدیدشده با تابعی تازه که هش بدنهٔ یکسان دارد تشخیص داده می‌شود؛ وقتی تابعی بدون تغییر پیاده‌سازی‌اش تغییر نام دهد، این روش واقعاً قابل اعتماد است. اگر نام و بدنهٔ یک تابع در یک ویرایش با هم تغییر کنند، به‌صورت یک حذف و یک افزودن ساده گزارش می‌شود، نه تغییر نام، چون در این حالت نشانهٔ قابل اعتمادی دو نسخه را به هم وصل نمی‌کند. با نام‌های تکراری عمداً محتاطانه رفتار می‌شود: اگر نامی در هر کدام از دو نسخهٔ فایل بیش از یک بار بیاید (مثلاً دو ساختار متفاوت که هر کدام `init` خودشان را دارند)، آن نام کاملاً از جفت‌سازی مستقیم کنار گذاشته می‌شود و به تشخیص تغییر نام یا افزودن/حذف می‌رسد، به‌جای آنکه خطر جفت‌کردن دو تابع نادرست زیر یک نام مشترک پذیرفته شود. ## جایگاهش در سامانه مقایسهٔ معنایی به زیرساخت موجود `FileDiff`/`SemanticChange` در zev وصل است؛ همان ساختاری که مقایسهٔ ساده‌تر و مبتنی بر الگوی متنی برای زبان‌های دیگر به کار می‌برد. فایل‌های Zig به مقایسهٔ مبتنی بر AST فرستاده می‌شوند و همهٔ زبان‌های پشتیبانی‌شدهٔ دیگر همچنان از مسیر متنی موجود استفاده می‌کنند. اگر فایل Zig به‌درستی تجزیه نشود (مثلاً خطای نحوی وسط ویرایش)، مقایسهٔ AST خودکار به همان روش متنی برمی‌گردد، پس همچنان مقایسه‌ای تولید می‌شود.