الفرق

diffهو أمرٌ في سطر الأوامر يُقارن محتوى الملفات ويُبلغ عن الاختلافات. يُستخدم مصطلح diff أيضًا للإشارة إلى مُخرجات الأمر، ويُستخدم كفعلٍ لتنفيذه . لمقارنة الملفات، يُشغّل الأمر diff لإنشاء ملف diff. [ 1 ]

يُستخدم هذا الأمر عادةً لمقارنة الملفات النصية ، ولكنه يدعم أيضًا مقارنة الملفات الثنائية . إذا احتوى أحد الملفات المُدخلة على بيانات غير نصية، فسيعمل الأمر افتراضيًا في الوضع المختصر، مُقدمًا مُلخصًا فقط يُشير إلى ما إذا كانت الملفات مُختلفة. مع هذا --textالخيار، يُبلغ الأمر دائمًا عن الاختلافات على مستوى الأسطر؛ ومع ذلك، قد يصعب فهم الناتج، لأن البيانات الثنائية لا تُبنى عادةً على شكل أسطر مثل النصوص. [ 2 ]

على الرغم من أن الأمر يُستخدم في المقام الأول بشكل مؤقت لتحليل التغييرات بين ملفين، إلا أن له استخدامًا خاصًا يتمثل في إنشاء ملف تصحيح لاستخدامه مع patchالأمر - الذي صُمم خصيصًا لاستخدام تقرير مخرجات diff كملف تصحيح. وقد قامت POSIX بتوحيد أوامر diff diffو diff patch، بما في ذلك تنسيق الملف المشترك بينهما. [ 3 ]

تاريخ

طُوِّرت أداة diff الأصلية في أوائل سبعينيات القرن العشرين لنظام التشغيل يونكس، في مختبرات بيل في موراي هيل، نيو جيرسي. وكانت جزءًا من الإصدار الخامس من يونكس الذي صدر عام ١٩٧٤، [ ٤ ] وقد كتبها دوغلاس ماكلروي وجيمس هانت . نُشر هذا البحث في ورقة بحثية عام ١٩٧٦ شارك في كتابتها جيمس دبليو هانت، الذي طوّر نموذجًا أوليًا لأداة diff . [ ٥ ] أصبحت الخوارزمية التي وصفتها هذه الورقة تُعرف باسم خوارزمية هانت-شيمانسكي .

سبق عمل ماكلروي وتأثر به برنامج المقارنة الذي طوره ستيف جونسون على نظام GECOS وبرنامج البرهان الذي طوره مايك ليسك . نشأ برنامج البرهان أيضًا على نظام يونكس، ومثل برنامج diff ، كان يُجري تغييرات سطرًا بسطر، بل واستخدم الأقواس الزاوية (">" و" < ") للإشارة إلى عمليات إدراج وحذف الأسطر في مخرجات البرنامج. إلا أن الطرق الاستدلالية المستخدمة في هذه التطبيقات المبكرة اعتُبرت غير موثوقة. دفع ماكلروي، نظرًا للفائدة المحتملة لأداة diff، إلى البحث وتصميم أداة أكثر قوة لمجموعة متنوعة من المهام، قادرة على الأداء الجيد في ظل قيود المعالجة والحجم التي يفرضها جهاز PDP-11 . وقد نتجت طريقته في حل المشكلة عن تعاونه مع باحثين في مختبرات بيل، من بينهم ألفريد أهو ، وإليوت بينسون، وجيفري أولمان ، وهارولد س. ستون.

في سياق نظام يونكس، أتاح استخدام محرر الأسطر ed للأمر diff إمكانية إنشاء "نصوص تحرير" قابلة للاستخدام آليًا. عند حفظ هذه النصوص في ملف، يمكن للأمر ed ، إلى جانب الملف الأصلي، إعادة تكوين الملف المُعدَّل بالكامل. وقد قلّل هذا بشكل كبير من مساحة التخزين الثانوية اللازمة للاحتفاظ بنسخ متعددة من الملف. فكّر ماكلروي في كتابة معالج لاحق للأمر diff يسمح بتصميم وتنفيذ مجموعة متنوعة من تنسيقات الإخراج؛ إلا أنه وجد أنه من الأوفر والأسهل أن يتولى الأمر diff مسؤولية توليد الصيغة وترتيب الإدخال العكسي الذي يقبله الأمر ed .

في عام 1984، أنشأ لاري وول أداة التصحيح (التي أصدر شفرتها المصدرية على مجموعات الأخبار mod.sources و net.sources [ 6 ] [ 7 ] [ 8 ] ) لتصحيح ملفات النصوص، باستخدام مخرجات diff بالإضافة إلى ملف إدخال diff الذي يحتوي على المحتوى قبل التغييرات لإنشاء ملف يحتوي على المحتوى بعد التغييرات.

يتضمن دليل قابلية نقل X/Open، الإصدار الثاني لعام 1987، اختلافات. أُضيف وضع السياق في POSIX.1-2001 (الإصدار 6). أُضيف الوضع الموحد في POSIX.1-2008 (الإصدار 7). [ 9 ]

في السنوات الأولى لبرنامج diff ، شملت الاستخدامات الشائعة مقارنة التغييرات في شفرة المصدر البرمجية وعلامات الترميز للوثائق التقنية، والتحقق من مخرجات تصحيح أخطاء البرامج، ومقارنة قوائم نظام الملفات، وتحليل شفرة التجميع الحاسوبية. وكان الهدف من مخرجات برنامج ed هو توفير ضغط لسلسلة من التعديلات التي أُجريت على ملف. [ 10 ] ظهر نظام التحكم في شفرة المصدر (SCCS) وقدرته على أرشفة المراجعات في أواخر السبعينيات نتيجةً لتخزين نصوص التحرير من برنامج diff .

الخوارزمية

بخلاف مفاهيم مسافة التحرير المستخدمة لأغراض أخرى، diffفإنها موجهة نحو الأسطر بدلاً من الأحرف، ولكنها تشبه مسافة ليفنشتاين في أنها تحاول تحديد أصغر مجموعة من عمليات الحذف والإدراج لإنشاء ملف واحد من ملف آخر.

تعتمد عملية الفرق (diff) على حل مسألة أطول سلسلة فرعية مشتركة . [ 5 ] في هذه المسألة، يُعطى سلسلتان من العناصر:

أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي
أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك س ي

ونريد إيجاد أطول سلسلة من العناصر الموجودة في كلتا السلسلتين الأصليتين بنفس الترتيب. أي أننا نريد إيجاد سلسلة جديدة يمكن الحصول عليها من السلسلة الأصلية الأولى بحذف بعض العناصر، ومن السلسلة الأصلية الثانية بحذف عناصر أخرى. كما نريد أن تكون هذه السلسلة أطول ما يمكن. في هذه الحالة، هي

abcdfgjz

انطلاقًا من أطول تسلسل فرعي مشترك، لا يتطلب الأمر سوى خطوة بسيطة للحصول على مخرجات مشابهة لـ diff : إذا كان عنصر ما غائبًا في التسلسل الفرعي ولكنه موجود في التسلسل الأصلي الأول، فلا بد أنه قد حُذف (كما هو موضح بعلامات "-" أدناه). أما إذا كان غائبًا في التسلسل الفرعي ولكنه موجود في التسلسل الأصلي الثاني، فلا بد أنه قد أُضيف (كما هو موضح بعلامات "+").

ehiqkrxy + - + - + + + +

يستخدم

يقبل الأمر diffوسيطين، مثل: . عادةً، يُحدد كل وسيط ملفًا عاديًا؛ ولكن إذا حدد الوسيطان مجلدات، فإن الأمر يقارن الملفات المتطابقة في تلك المجلدات. مع الخيار ، ينزل الأمر بشكل متكرر عبر المجلدات الفرعية المتطابقة لمقارنة الملفات ذات المسارات النسبية المتطابقة.diff originalnew-r

تنسيق الإخراج الافتراضي

يُظهر المثال أدناه محتوى الملف الأصلي والجديد، بالإضافة إلى diffالناتج النهائي بالتنسيق الافتراضي. يُعرض الناتج مُلوّنًا لتحسين سهولة القراءة. يُمكن لبرنامج GNU diff تلوين الناتج عند --colorاستخدام الخيار المُحدد؛ وعند عدم --colorتحديد أي خيار، يكون تلوين الناتج مُعطّلًا افتراضيًا. [ 11 ]

في هذا التنسيق الافتراضي، aيشير الرمز إلى الإضافة، dوالرمز إلى الحذف، cوالرمز إلى التغيير. يظهر رقم سطر الملف الأصلي قبل الرمز المكون من حرف واحد، ويظهر رقم سطر الملف الجديد بعده. تشير علامتا أصغر من وأكبر من (في بداية الأسطر المضافة أو المحذوفة أو المتغيرة) إلى الملف الذي تظهر فيه هذه الأسطر. تُضاف الأسطر المضافة إلى الملف الأصلي وتظهر في الملف الجديد. تُحذف الأسطر المحذوفة من الملف الأصلي ولا تظهر في الملف الجديد.

افتراضيًا، لا تُعرض الأسطر المشتركة بين الملفين. أما الأسطر التي نُقلت فتُعرض كأنها أُضيفت في موقعها الجديد وحُذفت من موقعها القديم. [ 12 ] مع ذلك، تُبرز بعض أدوات المقارنة الأسطر المنقولة.

نص التحرير

يمكن إنشاء نص تحريري (ed) بواسطة الإصدارات الحديثة من برنامج diff باستخدام الخيار المناسب-e . فيما يلي نص التحرير الناتج لهذا المثال:

24 أتحتوي هذه الفقرة على إضافات جديدة وهامة لهذه الوثيقة. . ١٧ ج . راجع هذه الوثيقة. . 11,15 د 0 أ هذا إشعار هام! لذا يجب وضعه في بداية هذه الوثيقة! .

لتحويل محتوى الملف الأصلي إلى محتوى ملف جديد باستخدام الأمر ed ، يُضاف سطران إلى ملف المقارنة هذا، أحدهما يحتوي على أمر كتابة (write)، والآخر يحتوي على أمر إنهاء (quit) (مثلاً باستخدام الأمر ed ). هنا، نُسمّي ملف المقارنة mydiff ، وسيتم التحويل عند تشغيل الأمر ed .wqprintf"w\nq\n">>mydiffed-soriginal<mydiff

تنسيق السياق

حرصت توزيعة بيركلي لنظام يونكس على إضافة تنسيق السياق ( ) -cوالقدرة على التكرار على هياكل دليل نظام الملفات ( -r)، حيث أضافت هذه الميزات في الإصدار 2.8 من نظام بي إس دي، الذي صدر في يوليو 1981. وقد ساعد تنسيق السياق الخاص بـ diff الذي تم تقديمه في بيركلي في توزيع التصحيحات لشفرة المصدر التي ربما تم تغييرها بشكل طفيف.

في تنسيق السياق، تُعرض الأسطر المُعدّلة بجانب الأسطر غير المُعدّلة قبلها وبعدها. يُوفّر تضمين أي عدد من الأسطر غير المُعدّلة سياقًا للتصحيح. يتكوّن السياق من الأسطر التي لم تتغيّر بين الملفين، وهو بمثابة مرجع لتحديد موقع الأسطر في الملف المُعدّل، والعثور على الموقع المُراد تطبيق التغيير عليه، بغض النظر عمّا إذا كانت أرقام الأسطر لا تزال مُتطابقة أم لا. يُحسّن تنسيق السياق سهولة القراءة للمستخدمين، ويزيد من موثوقية تطبيق التصحيح، ويُوفّر مُخرجات مقبولة كمدخلات لبرنامج التصحيح . هذا السلوك الذكي غير مُمكن مع مُخرجات diff التقليدية.

يمكن للمستخدم تحديد عدد الأسطر غير المتغيرة المعروضة أعلى وأسفل جزء التغيير ، حتى لو كان العدد صفرًا، ولكن عادةً ما يكون ثلاثة أسطر هو العدد الافتراضي. إذا تداخل سياق الأسطر غير المتغيرة في جزء ما مع جزء مجاور، فسيتجنب الأمر diff تكرار الأسطر غير المتغيرة ويدمج الأجزاء في جزء واحد.

يمثل الرمز " !" تغييرًا بين سطرين متطابقين في الملفين، بينما +يمثل الرمز " " إضافة سطر، ويمثل الرمز " -" حذف سطر. تمثل المسافة الفارغة سطرًا لم يتغير. في بداية التصحيح، توجد معلومات الملف، بما في ذلك المسار الكامل والطابع الزمني مفصولًا بعلامة جدولة. في بداية كل جزء، توجد أرقام الأسطر التي تنطبق على التغيير المقابل في الملفات. ينطبق نطاق الأرقام الذي يظهر بين ثلاث علامات نجمية على الملف الأصلي؛ بينما تنطبق مجموعات الثلاث شرطات على الملف الجديد. تحدد نطاقات الأجزاء أرقام أسطر البداية والنهاية في الملف المعني.

ينتج الأمر diff -c original newالمخرجات التالية:

*** /path/to/original timestamp --- /path/to/new timestamp *************** *** 1,3 **** --- 1,9 ---- + هذا إشعار هام! + لذا يجب وضعه في + بداية هذا + المستند! + ظل هذا الجزء من المستند كما هو من الإصدار إلى *************** *** 8,20 **** ضغط حجم التغييرات . - تحتوي هذه الفقرة على نص قديم. - سيتم حذفها في المستقبل القريب.من المهم التدقيق الإملائي ! راجع هذه الوثيقة. من ناحية أخرى، لا يُعدّ الخطأ الإملائي في كلمة ما نهاية العالم. --- 14,21 ---- ضغط حجم التغييرات . من المهم التدقيق الإملائي ! راجع هذا المستند. مع ذلك، فإن وجود خطأ إملائي في كلمة ما ليس نهاية العالم. *************** *** 22,24 **** --- 23,29 ---- هذه الفقرة بحاجة إلى تغيير. يمكن إضافة أشياء بعدها. + + تحتوي هذه الفقرة على + إضافات جديدة مهمة + لهذه الوثيقة.

تنسيق موحد

يستفيد التنسيق الموحد (أو unidiff ) [ 13 ] [ 14 ] من التحسينات التقنية التي يوفرها تنسيق السياق، ولكنه يُنتج فرقًا أصغر حجمًا مع عرض النص القديم والجديد متجاورين مباشرةً. عادةً ما يتم استدعاء التنسيق الموحد باستخدام خيار سطر الأوامر-u " " . غالبًا ما تُستخدم هذه المخرجات كمدخلات لبرنامج التصحيح . تطلب العديد من المشاريع تحديدًا إرسال "الفرق" بالتنسيق الموحد، مما يجعل تنسيق الفرق الموحد التنسيق الأكثر شيوعًا للتبادل بين مطوري البرامج.

طُوِّرت مقارنات السياق الموحد في الأصل بواسطة واين دافيسون في أغسطس 1990 (في برنامج unidiff الذي نُشر في المجلد 14 من comp.sources.misc). أضاف ريتشارد ستالمان دعمًا لمقارنات السياق الموحد إلى برنامج diff التابع لمشروع جنو بعد شهر واحد. ظهرت هذه الميزة لأول مرة في برنامج GNU diff 1.15، الذي صدر في يناير 1991. ومنذ ذلك الحين، عمّم برنامج GNU diff تنسيق السياق للسماح بتنسيق موحد لمقارنات السياق.

يبدأ التنسيق بنفس رأس السطرين الموجود في تنسيق السياق، باستثناء أن الملف الأصلي مسبوق بـ "---ويسبق الملف الجديد "+++يلي ذلك جزء أو أكثر من أجزاء التغيير التي تحتوي على اختلافات الأسطر في الملف. تسبق مسافة الأسطر السياقية غير المتغيرة، وتسبق علامة الجمع أسطر الإضافة، وتسبق علامة الطرح أسطر الحذف.

تبدأ المجموعة بمعلومات النطاق ؛ وتسبق مباشرةً إضافة الأسطر وحذفها، وأي عدد من الأسطر السياقية. تُحاط معلومات النطاق بعلامتي @ مزدوجتين ، وتجمع في سطر واحد ما يظهر في سطرين في تنسيق السياق ( أعلاه ). يكون تنسيق سطر معلومات النطاق كما يلي:

@@ -l,s +l,s @@ عنوان قسم اختياري

تحتوي معلومات نطاق التعديل على نطاقين. يسبق نطاق التعديل في الملف الأصلي رمز ناقص، بينما يسبق نطاق التعديل في الملف الجديد رمز زائد. يكون كل نطاق تعديل بالصيغة l,s، حيث يمثل l رقم سطر البداية، و s عدد الأسطر التي ينطبق عليها التعديل في كل ملف. في العديد من إصدارات GNU diff، يمكن حذف الفاصلة والقيمة s من كل نطاق ، وفي هذه الحالة تكون القيمة الافتراضية لـ s هي 1. تجدر الإشارة إلى أن القيمة المهمة الوحيدة هي رقم السطر l في النطاق الأول؛ أما باقي القيم فيمكن حسابها من الفرق.

يجب أن يكون نطاق الجزء (hunk range) للملف الأصلي هو مجموع جميع أسطر الأجزاء السياقية وأجزاء الحذف (بما في ذلك الأجزاء المتغيرة). ويجب أن يكون نطاق الجزء (hunk range) للملف الجديد هو مجموع جميع أسطر الأجزاء السياقية وأجزاء الإضافة (بما في ذلك الأجزاء المتغيرة). إذا لم تتطابق معلومات حجم الجزء مع عدد الأسطر فيه، فقد يُعتبر الفرق غير صالح ويُرفض.

يمكن، اختيارياً، إضافة عنوان القسم أو الدالة التي ينتمي إليها نطاق الجزء. يُفيد هذا بشكل أساسي في تسهيل قراءة الفرق. عند إنشاء فرق باستخدام GNU diff، يتم تحديد العنوان عن طريق مطابقة التعبيرات النمطية . [ 15 ]

إذا تم تعديل سطر، يُمثَّل ذلك بحذف وإضافة. ولأن أجزاء الملف الأصلي والجديد تظهر في نفس الجزء، فإن هذه التغييرات ستظهر متجاورة. [ 16 ] مثال على ذلك في المثال أدناه:

- راجع هذه الوثيقة. +راجع هذا المستند. 

ينتج الأمر diff -u original newالمخرجات التالية:

--- /path/to/original timestamp +++ /path/to/new timestamp @@ -1,3 +1,9 @@ +هذه ملاحظة مهمة! +لذلك يجب وضعها في +بداية +هذه الوثيقة! + بقي هذا الجزء من الوثيقة كما هو من الإصدار إلى @@ -8,13 +14,8 @@ لضغط حجم التغييرات .- تحتوي هذه الفقرة على نص قديم. - سيتم حذفها في المستقبل القريب. - من المهم تدقيق إملائي لهذا المستند. - راجع هذا المستند. من ناحية أخرى، كلمة بها خطأ إملائي ليست نهاية العالم. @@ -22,3 +23,7 @@ هذه الفقرة تحتاج إلى تغيير. يمكن إضافة أشياء بعدها. + + تحتوي هذه الفقرة على إضافات جديدة مهمة لهذا المستند.

لفصل أسماء الملفات عن الطوابع الزمنية بنجاح، يُستخدم حرف الجدولة كفاصل. هذا الحرف غير مرئي على الشاشة وقد يضيع عند نسخ ولصق التغييرات من شاشات وحدة التحكم/الطرفية.

الإضافات

توجد بعض التعديلات والإضافات على تنسيقات diff التي تستخدمها وتفهمها برامج معينة وفي سياقات محددة. على سبيل المثال، تحدد بعض أنظمة التحكم في الإصدارات - مثل Subversion - رقم الإصدار، أو "نسخة العمل"، أو أي تعليق آخر بدلاً من الطابع الزمني أو بالإضافة إليه في قسم رأس diff.

تسمح بعض الأدوات بدمج اختلافات عدة ملفات مختلفة في ملف واحد، باستخدام رأس لكل ملف معدل قد يبدو كالتالي:

الفهرس: path/to/file.cpp

لا يتم التعامل مع الحالة الخاصة للملفات التي لا تنتهي بسطر جديد. لا يُعرّف معيار unidiffPOSIX ولا diffمعيار GNU طريقةً للتعامل مع هذا النوع من الملفات. (في الواقع، لا تُعتبر هذه الملفات ملفات نصية وفقًا لتعريفات POSIX الصارمة. [ 17 ] ) يُنتج كلٌ من GNU diff وgit رسالة "\ لا يوجد سطر جديد في نهاية الملف" (أو نسخة مترجمة منها) كتشخيص، ولكن هذا السلوك غير قابل للتطبيق على أنظمة أخرى. [ 18 ] لا يبدو أن GNU patch يتعامل مع هذه الحالة، بينما يتعامل معها git-apply. [ 19 ]

لا يتعرف برنامج التصحيح بالضرورة على مخرجات المقارنة الخاصة بالتنفيذ. ومع ذلك، يتعرف برنامج GNU patch على تصحيحات git وسيتصرف بشكل مختلف قليلاً. [ 20 ]

تشمل التغييرات التي طرأت منذ عام 1975 تحسينات على الخوارزمية الأساسية، وإضافة ميزات مفيدة إلى الأمر، وتصميم تنسيقات إخراج جديدة. وُصفت الخوارزمية الأساسية في ورقتي بحث " خوارزمية الفرق O(ND) وتنوعاتها" ليوجين دبليو مايرز [ 21 ] و "برنامج مقارنة الملفات" لويب ميلر ومايرز [ 22 ] . اكتُشفت الخوارزمية ووُصفت بشكل مستقل في "خوارزميات مطابقة السلاسل التقريبية" لإسكو أوكونن [ 23 ] . صُممت الإصدارات الأولى من برنامج diff لمقارنة أسطر الملفات النصية، مع افتراض أن حرف السطر الجديد يفصل بين الأسطر. وبحلول ثمانينيات القرن العشرين، أدى دعم الملفات الثنائية إلى تغيير تصميم التطبيق وتنفيذه.

تتضمن حزمة diffutils أدوات GNU diff و diff3 مع أدوات أخرى متعلقة بالمقارنة والتصحيح . [ 24 ]

أدوات التنسيق والواجهات الأمامية

يقوم برنامجا المعالجة اللاحقة sdiff و diffmk بعرض قوائم التغييرات جنبًا إلى جنب وتطبيق علامات التغيير على المستندات المطبوعة، على التوالي. وقد طُوّر كلاهما في مكان آخر في مختبرات بيل في عام 1981 أو قبله.

يقارن برنامج Diff3 ملفًا واحدًا بملفين آخرين عن طريق مطابقة فرقين بينهما. وقد ابتكره بول جنسن في الأصل لمطابقة التغييرات التي أجراها شخصان يقومان بتحرير مصدر مشترك. كما تستخدمه أنظمة التحكم في الإصدارات، مثل RCS ، لدمج الملفات . [ 25 ]

يحتوي Emacs على Ediff ، الذي يعرض التغييرات التي قد يوفرها التصحيح في واجهة مستخدم تجمع بين إمكانيات التحرير التفاعلي ودمج ملفات التصحيح.

يُوفر محرر النصوص Vim أداة vimdiff لمقارنة ما بين ملفين إلى ثمانية ملفات، مع تمييز الاختلافات بالألوان. [ 26 ] وبينما كان Vim يستدعي برنامج diff في السابق، فإنه يستخدم الآن نسخة معدلة من مكتبة xdiff (LibXDiff) التابعة لـ Git ، مما يُحسّن السرعة والوظائف. [ 27 ]

GNU Wdiff [ 28 ] هو واجهة أمامية لـ diff تُظهر الكلمات أو العبارات التي تغيرت في مستند نصي مكتوب حتى في وجود التفاف الكلمات أو اختلاف عرض الأعمدة.

colordiff هو غلاف برمجي بلغة بيرل للأمر 'diff'، يُنتج نفس المخرجات، ولكن مع تلوين الأجزاء المضافة والمحذوفة. [ 29 ] أما diff-so-fancy وdiff-highlight فهما نظيران أحدث. [ 30 ] و'delta' هو إعادة كتابة بلغة رست تُبرز التغييرات والشيفرة الأساسية في آنٍ واحد. [ 31 ]

تحتوي Patchutils على أدوات تقوم بدمج وإعادة ترتيب ومقارنة وإصلاح اختلافات السياق والاختلافات الموحدة. [ 32 ]

المشتقات الخوارزمية

تم تطوير معظم الأدوات المساعدة التي تقارن ملفات المصدر بناءً على بنيتها النحوية كأدوات بحثية لبعض لغات البرمجة؛ [ 33 ] [ 34 ] [ 35 ] وبعضها متوفر كأدوات تجارية. [ 36 ] [ 37 ] بالإضافة إلى ذلك، تتضمن الأدوات المجانية التي تُجري مقارنة بناء الجملة ما يلي:

  • C++: zograscope، قائم على AST. [ 38 ]
  • HTML: Daisydiff، [ 39 ] html-differ.
  • XML: xmldiffpatch من مايكروسوفت و xmldiffmerge من آي بي إم. [ 40 ] [ 41 ]
  • جافا سكريبت : astii (مبني على AST).
  • متعدد اللغات: Pretty Diff (تنسيق الكود ثم المقارنة) [ 42 ]

spiff هو برنامج بديل لـ diff يتجاهل الاختلافات في حسابات الفاصلة العائمة مع أخطاء التقريب والمسافات البيضاء ، وكلاهما غير ذي صلة عمومًا بمقارنة الشيفرة المصدرية. كتبت شركة Bellcore النسخة الأصلية. [ 43 ] [ 44 ] وتُعد نسخة HPUX أحدث إصدار متاح للجمهور. لا يدعم spiff الملفات الثنائية. يُخرج spiff البيانات إلى المخرج القياسي بتنسيق diff القياسي، ويقبل المدخلات بلغات البرمجة C و Bourne shell و Fortran و Modula-2 و Lisp . [ 45 ] [ 46 ] [ 43 ] [ 47 ] [ 44 ]

LibXDiff مكتبة مرخصة بموجب رخصة LGPL ، توفر واجهة للعديد من الخوارزميات منذ عام ١٩٩٨. تم في الأصل تطبيق خوارزمية مايرز المحسّنة مع بصمة رابين (حتى الإصدار النهائي لعام ٢٠٠٨)، [ ٤٨ ] ولكن منذ ذلك الحين، وسّع مستودع git ونسخة libgit2 المتفرعة منه العديد من الخوارزميات الخاصة به. تُعتبر خوارزمية "histogram" عمومًا أفضل من خوارزمية مايرز الأصلية، من حيث السرعة والجودة. [ ٤٩ ] [ ٥٠ ] هذه هي النسخة الحديثة من LibXDiff التي يستخدمها Vim. [ ٢٧ ]

انظر أيضاً

مراجع

  1. إريك س. ريموند (محرر)، "diff" مؤرشف في 31 يناير 2014 على موقع Wayback Machine ، ملف المصطلحات ، الإصدار 4.4.7
  2. ماكنزي وآخرون. "الملفات الثنائية وفرض مقارنة النصوص" في مقارنة ودمج الملفات باستخدام GNU Diff و Patch . تم التنزيل في 28 أبريل 2007.تمت أرشفة هذه الصفحة بتاريخ 19 ديسمبر 2017 على موقع Wayback Machine.
  3. جمعية مهندسي الكهرباء والإلكترونيات (IEEEمجموعة أوبن (26 سبتمبر 2008). معيار تكنولوجيا المعلومات - مواصفات واجهة نظام التشغيل المحمولة (POSIX) الأساسية، الإصدار 7. الصفحات 2599-2607 . يحدد معيار IEEE 1003.1-2001 تنسيقات الإخراج التقليدية، و"نص ed"، وتنسيقات الإخراج ذات الصلة بالسياق؛ وأضاف معيار IEEE 1003.1-2008 التنسيق الموحد (الذي أصبح أكثر شيوعًا آنذاك).
  4. "diff - مقارنة الملفات التفاضلية" . minnie.tuhs.org . تم الاطلاع عليه بتاريخ 25-03-2026 .
  5. 1 2 جيمس دبليو. هانت؛ إم. دوغلاس ماكلروي (يونيو 1976). "خوارزمية لمقارنة الملفات التفاضلية" ( ملف PDF) . تقرير فني في علوم الحاسوب، مختبرات بيل . 41. مؤرشف (ملف PDF) من الأصل بتاريخ 26-12-2014 . تم الاطلاع عليه بتاريخ 06-05-2015 .
  6. لاري وول (9 نوفمبر 1984). "أداة لتطبيق التصحيحات - أنت تريدها!!!" . مجموعة الأخبار : net.sources . يوزنت: 1457@sdcrdcf.UUCP . مؤرشف من الأصل في 19 فبراير 2022. تم الاطلاع عليه في 11 مايو 2015 .  
  7. لاري وول (29 نوفمبر 1984). "الإصدار التصحيحي 1.2 - أنت تريد هذا" . مجموعة الأخبار : net.sources . يوزنت: 1508@sdcrdcf.UUCP . مؤرشف من الأصل في 21 مارس 2020. تم الاسترجاع في 11 مايو 2015 .  
  8. لاري وول (8 مايو 1985). "إصدار التصحيح 1.3" . مجموعة الأخبار : net.sources . يوزنت: 813@genrad.UUCP . مؤرشف من الأصل في 19 فبراير 2022. تم الاطلاع عليه في 11 مايو 2015 .  
  9. مرجع الصدفة والأدوات المساعدة، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Groupdiff  
  10. ريتشي، دينيس م.؛ طومسون، كين (1974-07-01). "نظام يونكس لتقاسم الوقت" . مجلة الاتصالات ACM . 17 (7): 365-375 . doi : 10.1145/361011.361061 . ISSN 0001-0782 . 
  11. "خيارات diff" . دليل GNU Diffutils . مؤسسة البرمجيات الحرة . تم الاطلاع عليه بتاريخ 11 يونيو 2026 .
  12. ديفيد ماكنزي؛ بول إيغرت؛ ريتشارد ستالمان (1997). مقارنة ودمج الملفات باستخدام GNU Diff وPatch . بريستول: نظرية الشبكات. ISBN 978-0-9541617-5-0أُرشف من المصدر الأصلي بتاريخ 31 مارس 2015. تم الاطلاع عليه بتاريخ 17 مارس 2015 .
  13. "وصف تفصيلي للتنسيق الموحد" . GNU Diffutils (الإصدار 3.7، 7 يناير 2018) . مؤرشف من الأصل في 18 يناير 2020. تم الاطلاع عليه في 29 يناير 2020 .
  14. فان روسوم، غيدو. "تنسيق الفرق الموحد" . كل ما يتعلق بلغة بايثون . مؤرشف من الأصل بتاريخ 25 ديسمبر 2019. تم الاطلاع عليه بتاريخ 29 يناير 2020 .
  15. 2.2.3 توضيح الأقسام التي توجد بها الاختلافات ، دليل GNU diffutils
  16. تنسيق الفرق الموحد ، بقلم غيدو فان روسوم ، 14 يونيو 2006
  17. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403 مؤرشف بتاريخ 29 أبريل 2013 في أرشيف الإنترنت (Wayback Machine) القسم 3.206
  18. "الأسطر غير المكتملة (مقارنة الملفات ودمجها)" . www.gnu.org . مؤرشف من الأصل بتاريخ 8 مايو 2023. تم الاطلاع عليه بتاريخ 15 يونيو 2023 .
  19. "git: apply.c" . جيت. 8 مايو 2023. مؤرشف من الأصل في 13 مايو 2023. تم الاسترجاع في 15 يونيو 2023 .
  20. "patch.c\src - patch.git - GNU patch" . git.savannah.gnu.org . مؤرشف من الأصل بتاريخ 2023-05-08 . تم الاطلاع عليه بتاريخ 2023-06-15 . في مقارنة التغييرات على نمط Git، تشير حالة "قبل" لكل رقعة إلى الحالة الأولية قبل تعديل أي ملفات.
  21. إي. مايرز (1986). "خوارزمية فرق من رتبة O(ND) وتنوعاتها". Algorithmica . 1 (2): 251–266 . CiteSeerX 10.1.1.4.6927 . doi : 10.1007/BF01840446 . S2CID 6996809 .  
  22. ويب ميلر؛ يوجين دبليو مايرز (1985). "برنامج مقارنة الملفات". البرمجيات: الممارسة والخبرة . 15 (11): 1025-1040 . CiteSeerX 10.1.1.189.70 . doi : 10.1002/spe.4380151102 . S2CID 15489614 .  
  23. إيسكو أوكونين (1985). "خوارزميات لمطابقة السلاسل التقريبية" . المعلومات والتحكم . 64 ( 1-3 ): 100-118 . doi : 10.1016/S0019-9958(85)80046-2 .
  24. أدوات GNU Diff مؤرشفة بتاريخ 16 مارس 2015 على موقع Wayback Machine . مُتاحة من قِبل مؤسسة البرمجيات الحرة . وثائق مجانية. شفرة مصدرية مجانية.
  25. "دمج (GNU RCS 5.10.0)" . gnu.org . مؤرشف من الأصل في 18 سبتمبر 2019. تم الاطلاع عليه في 22 يناير 2021 .
  26. مولينار، برام . " توثيق Vim: diff" . vimdoc.sourceforge.net . مؤرشف من الأصل في 16 فبراير 2020. تم الاطلاع عليه في 1 مايو 2020. أسهل طريقة لبدء التحرير في وضع diff هي باستخدام الأمر "vimdiff". يبدأ هذا الأمر Vim كالمعتاد، كما يهيئ لعرض الاختلافات بين الوسائط. وهذا يعادل:vimdiff file1 file2 [file3] [file4] [...file8]vim -d file1 file2 [file3] [file4] [...file8]
  27. 1 2 براباندت، كريستيان (1 ديسمبر 2018). "قوة الاختلاف" . فيموايز . مؤرشف من الأصل في 2 ديسمبر 2018. تم الاسترجاع في 1 مايو 2020 .
  28. "gnu.org" . gnu.org . مؤرشف من الأصل بتاريخ 11 أغسطس 2020. تم الاطلاع عليه بتاريخ 12 سبتمبر 2020 .
  29. "colordiff" . www.colordiff.org . مؤرشف من الأصل بتاريخ 14-06-2018 . تم الاطلاع عليه بتاريخ 14-06-2018 .
  30. "diff-so-fancy" . So Fancy. 6 مايو 2023. مؤرشف من الأصل في 8 مايو 2023. تم الاسترجاع في 8 مايو 2023 .
  31. دافيسون، دان (8 مايو 2023). "dandavison/delta" . جيت هاب . مؤرشف من الأصل في 8 مايو 2023. تم الاسترجاع في 8 مايو 2023 .
  32. ووه، تيم (12 يونيو 2020). "twaugh/patchutils" . جيت هاب . مؤرشف من الأصل في 1 أكتوبر 2020. تم الاسترجاع في 28 يونيو 2020 .
  33. هورويتز، سوزان (يونيو 1990). "تحديد الاختلافات الدلالية والنصية بين نسختين من برنامج" . ACM SIGPLAN Notices . 25 (6): 234–245 . CiteSeerX 10.1.1.49.3377 . doi : 10.1145/93548.93574 . مؤرشف من الأصل بتاريخ 12 يونيو 2010. تم الاطلاع عليه بتاريخ 1 نوفمبر 2017 . 
  34. يانغ، وو (يوليو 1991). "تحديد الاختلافات النحوية بين برنامجين". البرمجيات: الممارسة والخبرة . 21 (7): 739-755 . CiteSeerX 10.1.1.13.9377 . doi : 10.1002/spe.4380210706 . S2CID 10853673 .  
  35. Grass. Cdiff: أداة مقارنة موجهة نحو بناء الجملة لبرامج C++. وقائع مؤتمر USENIX C++، الصفحات 181-193، 1992
  36. Compare++، http://www.coodesoft.com/ ، مؤرشف بتاريخ 29-11-2011 في أرشيف الإنترنت (Wayback Machine) .
  37. سمارت ديفرنسر، http://www.semanticdesigns.com/Products/SmartDifferencer ، مؤرشف بتاريخ 14 أكتوبر 2009 في أرشيف الإنترنت (Wayback Machine).
  38. "xaizek/zograscope" . GitHub . 26 مايو 2020. مؤرشف من الأصل في 21 ديسمبر 2020. تم الاطلاع عليه في 27 يونيو 2020 .
  39. DaisyDiff ، https://code.google.com/p/daisydiff/ ، مؤرشف بتاريخ 19 مارس 2015 في أرشيف الإنترنت (Wayback Machine).
  40. xmldiffpatch ، http://msdn.microsoft.com/en-us/library/aa302294.aspx ، مؤرشف بتاريخ 27-10-2009 في أرشيف الإنترنت (Wayback Machine).
  41. xmldiffmerge ، http://www.alphaworks.ibm.com/tech/xmldiffmerge ، مؤرشف بتاريخ 24-09-2009 في أرشيف الإنترنت (Wayback Machine).
  42. تشيني، أوستن. بريتي ديف - التوثيق . http://prettydiff.com/documentation.php مؤرشف بتاريخ 31 يوليو 2012 في أرشيف الإنترنت
  43. 1 2 dontcallmedotcom. "spiff" . GitHub . مؤرشف من الأصل بتاريخ 26-03-2015 . تم الاسترجاع بتاريخ 16-06-2013 .
  44. 1 2 ناخبار، دانيال و. (1999-12-01). "نقل وأرشفة نظام HP-UX" . المملكة المتحدة. مؤرشف من الأصل في 2012-09-05 . تم الاسترجاع في 2013-06-13 .
  45. "SPIFF 1" . 2 فبراير 1988. مؤرشف من الأصل في 2 أكتوبر 2016. تم الاطلاع عليه في 16 يونيو 2013 .
  46. ناخبار، دانيال و. (2 فبراير 1988). "صفحة الدليل" . المملكة المتحدة. مؤرشف من الأصل في 10 سبتمبر 2012. تم الاطلاع عليه في 16 يونيو 2013 .
  47. دافيد (28-09-2009). "ستاك أوفر فلو" . مؤرشف من الأصل بتاريخ 19-02-2022 . تم الاطلاع عليه بتاريخ 16-06-2013 .
  48. ليبينزي، دافيد. "LibXDiff" . سورس فورج فريش ميت . مؤرشف من الأصل بتاريخ 2020-07-01 . تم الاسترجاع بتاريخ 2020-06-28 .
  49. نوغروهو، يوسف سوليستيو؛ هاتا، هيدياكي؛ ماتسوموتو، كينيتشي (يناير 2020). "ما مدى اختلاف خوارزميات المقارنة المختلفة في Git؟: استخدام --histogram لتغييرات الكود" . هندسة البرمجيات التجريبية : 790-823 . arXiv : 1902.02467 . doi : 10.1007/s10664-019-09772-z . S2CID 59608676 . 
  50. "خوارزمية - ما الفرق بين 'git diff --patience' و 'git diff --histogram'؟" . Stack Overflow . مؤرشف من الأصل بتاريخ 19 فبراير 2022. تم الاطلاع عليه بتاريخ 28 يونيو 2020. يُظهر هذا بالفعل أن histogram diff يتفوق قليلاً على Myers، بينما يُعدّ patient أبطأ بكثير من غيره.

للمزيد من القراءة