सिमेंटिक डिफ यूटिलिटीज [बंद]


105

मैं शब्दार्थ भेद / मर्ज उपयोगिताओं के कुछ अच्छे उदाहरण खोजने की कोशिश कर रहा हूं। स्रोत कोड फ़ाइलों की तुलना करने का पारंपरिक प्रतिमान लाइनों और वर्णों की तुलना करके काम करता है .. लेकिन क्या वहाँ कोई उपयोगिताओं (किसी भी भाषा के लिए) हैं जो वास्तव में फ़ाइलों की तुलना करते समय कोड की संरचना पर विचार करते हैं ?

उदाहरण के लिए, मौजूदा अलग-अलग प्रोग्राम रिपोर्ट करेंगे "लाइन 125 के चरित्र 2 में पाया गया अंतर। फ़ाइल x में शून्य है, जहां फ़ाइल y में बूल है"। एक विशेष टूल को "रिटर्न प्रकार की विधि doSomething () को शून्य से बूल में बदल दिया" रिपोर्ट करने में सक्षम होना चाहिए।

मैं तर्क दूंगा कि इस प्रकार की शब्दार्थ सूचना वास्तव में वह है जो उपयोगकर्ता को कोड की तुलना करते समय दिख रही है, और अगली पीढ़ी के प्रोगामिंग टूल्स का लक्ष्य होना चाहिए। क्या उपलब्ध साधनों में इसके कोई उदाहरण हैं?


3
ऐसा लगता है कि पेड़ की एडिट दूरी पर कुछ शोध किए गए हैं। एएसटी को ऐसा लगता है कि यह कोशिश करने वाली पहली चीज होगी। (यदि कोई इस तरह की बात लिखने की कोशिश करना चाहता है।)
जे कोमिनेक

2
मुझे यकीन नहीं है कि यह वास्तव में उपयोगी होगा। एक अंतर जैसा कि आपने उल्लेख किया है, पढ़ने की तुलना में अधिक आसानी से देखा जाता है, खासकर यदि आपके पास एक लाइन के भीतर मतभेदों को उजागर करने वाला उपकरण है । पहचानने की क्षमता अगर कुछ कोड को अपरिवर्तित चारों ओर ले जाया गया है, तो यह आसान और अधिक उपयोगी होगा, इम्हो!
अंकलजीव

2
@UncleZeiv मुझे उम्मीद है कि यह सुविधा स्वाभाविक रूप से उपकरण की प्रकृति का अनुसरण करेगी। इसके अलावा, यह पता लगाने में सक्षम होगा कि कोई परिवर्तन नहीं है अगर किसी ने
गुजरा

8
मुझे अब विजुअल स्टूडियो में इसकी आवश्यकता है। एक टीम के भीतर डेवलपर्स को मजबूर करने के लिए एक ही स्वरूपण संरचना का उपयोग करने की सुविधा के लिए अलग सोच है। चेक-इन पर कोड को कुछ मानक के लिए स्वरूपित किया जाना चाहिए, और किसी भी समय एक डेवलपर एक फ़ाइल खोलता है, इसे उनकी पसंद के अनुसार स्वरूपित किया जाना चाहिए। मैं हैरान हूँ कि इस प्रकार की सोच इस बिंदु पर अधिक विस्तृत नहीं है।
लैंगडन

3
IMHO यह SO के लिए एक अच्छा विषय है। आप इस बात से सहमत हैं, तो वोट "को फिर से खोलने के लिए"
ईरा बैक्सटर

जवाबों:


37

हमने एक उपकरण विकसित किया है जो इस परिदृश्य से ठीक से निपटने में सक्षम है। Http://www.semanticmerge.com चेक करें

यह कोड संरचना के आधार पर विलय (और भिन्न होता है) और पाठ-आधारित एल्गोरिदम का उपयोग नहीं करता है, जो मूल रूप से आपको निम्नलिखित जैसे मामलों से निपटने की अनुमति देता है, जिसमें मजबूत रिफ्लेक्टर शामिल है। यह अंतर और मर्ज टकराव दोनों को प्रस्तुत करने में सक्षम है जैसा कि आप नीचे देख सकते हैं:

यहां छवि विवरण दर्ज करें

और इसके बजाय पाठ ब्लॉकों को ले जाने में भ्रमित होने के बजाय, चूंकि यह पहले पार्स करता है, यह संघर्षों को प्रति विधि आधार (प्रति तत्व वास्तव में) पर प्रदर्शित करने में सक्षम है। पिछले की तरह एक मामले में भी हल करने के लिए मैनुअल संघर्ष नहीं होगा।

यहां छवि विवरण दर्ज करें

यह एक भाषा-जागरूक मर्ज टूल है और इस SO प्रश्न का उत्तर देने में आखिरकार सक्षम होना बहुत अच्छा है :-)


क्या इसे एसवीएन के साथ एकीकृत करना संभव है?
स्पष्ट

1
हालांकि, लिनक्स और मैक संस्करण प्राचीन हैं।
माइकल पीफेल 17

29

ग्रहण में यह सुविधा लंबे समय से है। इसे "संरचना तुलना" कहा जाता है, और यह बहुत अच्छा है। यहाँ जावा के लिए एक नमूना स्क्रीनशॉट है, एक XML फ़ाइल के लिए दूसरे के बाद:

(ऊपरी फलक पर विधियों पर माइनस और प्लस आइकन पर ध्यान दें।)

ग्रहण की जावा संरचना तुलना एक्लिप्स की एक्सएमएल संरचना तुलना


3
क्या संरचना तुलना आपको अन्य स्रोत नियंत्रण मर्ज संपादकों की तरह परिवर्तनों को मर्ज करने की अनुमति देती है? यानी इस विधि को इस संस्करण से दूसरे संस्करण में कॉपी करें।
जोनाथन पार्कर

1
हां, जब आप किसी बदलाव या अंतर (या तो ऊपरी या निचले पैन में) का चयन करते हैं, तो टूलबार बटन (स्क्रीनशॉट में दिखाया गया है) आपको बाएं से दाएं या इसके विपरीत बदलाव को कॉपी करने का विकल्प देता है।
होसम ऐली

1
दुर्भाग्य से, स्क्रीनशॉट अब आपके (उच्चतम-उत्क्रमित और स्वीकृत!) उत्तर में दिखाई नहीं देते हैं। क्या आप उन्हें फिर से जमा कर सकते हैं?
ब्लूब

@blubb मुझे सूचित करने के लिए धन्यवाद। मैंने Java तुलनित्र छवि के साथ त्रुटि को ठीक किया है। मैं जल्द ही XML संरचना तुलना के लिए एक स्क्रीनशॉट जोड़ने की कोशिश करूँगा।
होसम ऐली

1
और क्या यह जावा के अलावा अन्य भाषाओं के लिए काम करता है?
ईनपोकलम

14

"शब्दार्थ तुलना" अच्छी तरह से करने के लिए, आपको भाषाओं के वाक्यविन्यास पेड़ों की तुलना करने की आवश्यकता है, और प्रतीकों का अर्थ ध्यान में रखना चाहिए। वास्तव में अच्छा शब्दार्थ भेद भाषा के शब्दार्थ को समझता है, और यह महसूस करता है कि कोड का एक ब्लॉक दूसरे के लिए फ़ंक्शन के बराबर था। इस तक जाने के लिए एक प्रमेय कहावत की आवश्यकता होती है, और जब तक यह बहुत प्यारा होगा, वर्तमान में एक वास्तविक उपकरण के लिए व्यावहारिक नहीं है।

इसका एक व्यावहारिक अनुमान सिंटैक्स पेड़ों की तुलना करना है, और सम्मिलित किए गए, हटाए गए, स्थानांतरित किए गए या परिवर्तित किए गए संरचनाओं के संदर्भ में परिवर्तनों की रिपोर्टिंग करना है। "सिमेंटिक तुलना" के कुछ हद तक करीब होने पर, कोई तब पहचान कर सकता है जब एक पहचानकर्ता को कोड के ब्लॉक में लगातार बदला जाए।

सिंटैक्स ट्री-आधारित तुलना इंजन के लिए हमारे http://www.semanticdesigns.com/Products/SmartDifferencer/index.html देखें जो कई भाषाओं के साथ काम करता है, जो उपरोक्त सन्निकटन करता है।

EDIT जनवरी 2010: C ++, C #, Java, PHP और COBOL के लिए उपलब्ध संस्करण। वेबसाइट इनमें से अधिकांश के लिए विशिष्ट उदाहरण दिखाती है।

EDIT मई 2010: पायथन और जावास्क्रिप्ट को जोड़ा गया।

EDIT अक्टूबर 2010: ईजीएल जोड़ा गया।

EDIT Nov 2010: VB6, VBScript, VB.net को जोड़ा गया


2
हाय इरा, क्या आपने अपने अलग एल्गोरिथ्म पर एक पेपर प्रकाशित किया है? मुझे ट्री-एडिट डिस्टेंस लिटरेचर ढूंढने में दिक्कत हो रही है। धन्यवाद, टेरेंस।
टेरेंस Parr

अधिक विशिष्ट होने के लिए, diff3 नहीं सादे diff2 की तलाश में
Terence Parr

2
@ चेतावनी: हमारे अलग एल्गोरिथ्म का कोई प्रकाशन मौजूद नहीं है। यह एक लेवेनस्टीन मिनट की दूरी की गणना है, जो प्रत्यय के पेड़ों की मदद से नामकरण को संभालने के लिए कुछ हाइरस्टिक्स के साथ समान उप-वृक्षों की पहचान करता है। IIRC, यांग का सॉफ्टवेयर प्रैक्टिस और एक्सपीरियंस में इस पर एक पेपर था। हमारा और यांग का diff2 है, diff3 नहीं है।
इरा बैक्सटर

@IraBaxter लिंक वर्तमान में टूटा हुआ है और Google लिंक से खुलने पर साइट डाउन होने लगती है।
रेज़वान फ्लवियस पांडा

साइट का बैकअप है, लिंक ठीक होना चाहिए।
इरा बैक्सटर

12

क्या आप के लिए टटोल रहे हैं एक "पेड़ अलग है"। यह पता चला है कि यह सरल लाइन-ओरिएंटेड टेक्स्टुअल डिफरेंस की तुलना में बहुत अच्छा है, जो वास्तव में सिर्फ दो फ्लैट दृश्यों की तुलना है।

" ए-फाइन-ग्रेनड एक्सएमएल स्ट्रक्चरल कम्पेरिजन अप्रोच " निष्कर्ष निकाला गया है:

हमारे सैद्धांतिक अध्ययन के साथ-साथ हमारे प्रायोगिक मूल्यांकन से पता चला है कि प्रस्तावित पद्धति पैदावार में मौजूदा विकल्पों के संबंध में संरचनात्मक समानता परिणामों में सुधार करती है, जबकि एक ही समय जटिलता (ओ (एन ^ 2))

(जोर मेरा)

वास्तव में, यदि आप पेड़ के विभिन्न उदाहरणों की तलाश कर रहे हैं, तो मैं सुझाव देता हूं कि मैं XML पर ध्यान केंद्रित करूं क्योंकि यह उस क्षेत्र में व्यावहारिक विकास को चला रहा है।


लिंक के लिए धन्यवाद। मैं सेमैटिक डिफर टूल्स को लागू करने के लिए कुछ अलग तरीकों के बारे में सोच सकता हूं, और आप सही हैं - ज्यादातर को "ट्री डिफरेंस" में अमूर्त किया जा सकता है। अधिक जटिल स्थितियों को "ग्राफ डिफरेंशियल" में सार करने की आवश्यकता हो सकती है।
जसोन्म्रे

हाँ। आईबीएम के तर्कसंगत मॉडलर (ग्रहण पर निर्मित) यूएमएल मॉडल (दो मॉडलों के बीच अंतर को रेखांकन दिखाते हुए) के साथ ऐसा करने की कोशिश करता है। मैं परिणामों की उपयोगिता पर टिप्पणी नहीं कर सकता क्योंकि मैं इसका उपयोग नहीं करता हूं।
बेंडिन

मैं मानता हूं कि XML शुरू करने के लिए एक अच्छी जगह है, क्योंकि आप अन्य संरचनाओं (जैसे जावा कोड, उदाहरण के लिए) का प्रतिनिधित्व करने के लिए बस स्कीमा के साथ आ सकते हैं, और एक कोड भिन्नता को लागू करने के लिए XML आधारित ट्री-डिफरेंस का उपयोग कर सकते हैं।
20

"यह करें" => कुछ "ग्राफ डिफरेंट" के समान करें।
बेंडिन

1
सिंटैक्स ट्री-आधारित तुलना इंजन के लिए semdesigns.com/Products/SmartDifferencer/index.html देखें जो कई भाषाओं के साथ काम करता है।
इरा बाक्सटर


2

इसका समाधान प्रति भाषा के आधार पर होगा। Ie जब तक कि यह एक प्लगइन आर्किटेक्चर के साथ डिज़ाइन नहीं किया गया है जो एक पेड़ में कोड के बहुत सारे पार्सिंग और भाषा विशिष्ट प्लगइन की तुलनात्मक शब्दार्थ को परिभाषित करता है तो कई भाषाओं का समर्थन करना बहुत मुश्किल होगा। आप किस भाषा (भाषाओं) में इस तरह के उपकरण के लिए रुचि रखते हैं। व्यक्तिगत रूप से मैं सी # के लिए एक प्यार करता हूँ।

C # के लिए रिफ्लेक्टर में एक असेम्बली डिफरेंशियल ऐड है, लेकिन यह केवल IL पर नहीं C # पर एक डिफरेंस करता है।

आप यहां ऐड-इन [zip] के अंतर को डाउनलोड कर सकते हैं या यहां कोडप्लेक्स साइट पर प्रोजेक्ट पर जा सकते हैं


1
सिंटैक्स ट्री-आधारित तुलना इंजन के लिए semdesigns.com/Products/SmartDifferencer/index.html देखें जो बिल्कुल भाषा प्लगइन शैली का उपयोग करके कई भाषाओं के साथ काम करता है। अभी तक जारी नहीं किया गया है, लेकिन एक सी # संस्करण बहुत करीब है।
इरा बाक्सटर

जनवरी 2010: सी # स्मार्ट डिफरेंसर जारी किया गया।
इरा बैक्सटर

2

ज़ेनेमिक्स नामक कंपनी एक बाइनरी-लेवल सिमेंटिक डिफरेंशियल टूल देती है। यह एक मेटा-असेंबली भाषा का उपयोग करता है जिसे आरईआईएल कहा जाता है, जो द्विआधारी के 2 संस्करणों के ग्राफ-थ्योरिटिक विश्लेषण करने के लिए है, और उन दोनों के बीच अंतर को चित्रित करने के लिए एक रंग-कोडित ग्राफ़ का उत्पादन करता है। मैं कीमत के बारे में निश्चित नहीं हूं, लेकिन मुझे संदेह है कि यह मुफ़्त है।


बाइनरी-स्तर सिमेंटिक अंतर से लिंक करें: zynamics.com/bindiff.html
emallove

2

http://prettydiff.com/

प्रिटी डिफ कमेंट्स और अनावश्यक व्हाइट स्पेस को हटाने के लिए प्रत्येक इनपुट को मिनिमाइज करता है और फिर अलग एल्गोरिथम से पहले कोड को सुशोभित करता है। मैं वैसे भी इस से अधिक कोड अर्थ बनने के लिए नहीं सोच सकता। और, इसका लिखित जावास्क्रिप्ट तो यह सीधे ब्राउज़र में चलता है।


5
तब आपके पास एक सीमित कल्पना है! उन्हें अपरिवर्तित छोड़ते समय किसी फ़ाइल में दो विधियों की स्थिति बदलने के बारे में क्या? Refactorings के बारे में क्या?
राबिन ग्रीन

(आप जावा में डेटा घोषणाओं के आस-पास स्वैप नहीं कर सकते हैं, और अभी भी समतुल्यता है, आरंभीकरण के कारण; मुझे लगता है कि C # को अधिक परेशानी है)। यदि आप शुद्ध शब्दार्थ भेद के लिए जाते हैं, तो आप ट्यूरिंग मशीन तुल्यता को हल करने की कोशिश कर रहे हैं। वहाँ बेहतर तो शुद्ध पाठ मिलान, और असंभव ट्यूरिंग से भी बदतर के लिए सीमा होती है।
इरा बैक्सटर

@IraBaxter उपकरण वैचारिक रूप से केवल समान चीजों के रूप में दिखाई देगा, जो वास्तव में समान हैं। यदि ठीक से कोडित किया गया है तो यह समस्या का प्रकार नहीं होगा जिसका आप उल्लेख कर रहे हैं।
रेज़वान फ्लवियस पांडा

यदि आप अंतिम टूल चाहते हैं तो "उचित रूप से कोडित" का अर्थ एल्गोरिथ्म तुल्यता साबित करना है। एल्गोरिथ्म तुल्यता प्रमाण सामान्य रूप से ट्यूरिंग-हार्ड हैं, इसलिए आप इस तरह के उपकरण को अभ्यास में नहीं ला सकते हैं। आपको जो प्राप्त हो सकता है वह एक उपकरण है जो सिंटैक्स परिवर्तनों के अलावा कुछ समकक्षों को संभालता है । आज तक, मैंने इस तरह के टूल को बनाने का कोई प्रयास नहीं देखा है।
इरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.