2013-01-09 55 views
5

क्या कोई निःशुल्क diff उपयोगिता है जो टेक्स्ट की बजाय अपने एएसटी का उपयोग करके दो सी ++ फ़ाइलों की तुलना कर सकती है?डिफ उपयोगिता जो सी ++ जागरूक है

क्या मैं के बारे में सोच रहा था की तरह कुछ है: - एएसटी करने के लिए दोनों फ़ाइलों को कनवर्ट - एएसटी वापस सी ++ कोड के रूप में प्रस्तुत (इस खरोज canonicalizes) - इन दो के बीच सामान्य अंतर क्या - सरल refactorings पता लगाने के लिए भी कोशिश है कि किए गए थे (उदाहरण के लिए सदस्य जोड़ें/डेल/नाम बदलें)

+5

यह धीमा होगा, और मैं कल्पना नहीं कर सकता कि कोई ऐसी चीज़ क्यों चाहेगा। –

+3

मुझे लगता है कि यह छात्रों के बीच धोखाधड़ी पकड़ना है। – chrisaycock

+1

यह मेरे कोडिंग कोड से नफरत करता है जो मेरे कोडिंग कोड से नफरत करता है जो मेरे कोडिंग कोड से नफरत करता है। चूंकि हमारे समूह के स्टाइल के लिए कोई आधिकारिक नियम नहीं है, इसलिए इस तरह का एक उपकरण बहुत उपयोगी होगा। – tohava

उत्तर

1

आप अंतर करने से पहले इंडेंटेशन/स्पेसिंग/स्वरूपण को सामान्य करने के लिए एएसटीएल के माध्यम से कोड पारित कर सकते हैं। यह refactorings के लिए कुछ भी नहीं करेगा, लेकिन ईमानदारी से आपको यह ठीक से AFAICS करने के लिए एक पूर्ण preprocess/संकलन पास की आवश्यकता होगी।

http://astyle.sourceforge.net/

+2

यह उपकरण एक वैनिनिकल फॉर्म को मजबूर नहीं करता है। उदाहरण के लिए "int main() \ n {\ n}" बनाम "int मुख्य \ n() \ n {\ n}" ले लो। वे एक ही आउटपुट नहीं देते हैं। एक उपकरण जो वास्तव में कोड को एएसटी में संकलित करता है, इस मामले में सहायक होगा। – tohava

+0

मुझे नहीं लगता कि आप समझते हैं कि आप क्या पूछ रहे हैं। एक पूर्ण एएसटी पास की आवश्यकता होगी (कम से कम!) एक पूर्ण प्रीप्रोसेसर पास, जिसका अर्थ है कि प्रत्येक # समावेशन का विस्तार किया जाएगा, प्रत्येक # डिफाईन का विस्तार किया जाएगा, आदि। कई मामलों में, आपका कोड आपके जैसा कुछ समानता देगा के साथ शुरू किया यह "रेफैक्टरिंग का पता लगाने" भाग को भी ध्यान में रखता नहीं है, जो कि एक पाइप सपने की तरह दिखता है। – StilesCrisis

+0

चलो डिटेक्ट रिफैक्टरिंग छोड़ दें। सुंदरता के दौरान # समावेशन आसानी से वापस घुमाया जा सकता है (हमारे पास #लाइन निर्देश या इसके लिए कुछ समान है)। मैक्रोज़ ट्रिकियर हैं, मुझे लगता है कि अगर प्रीप्रोसेसर जावास्क्रिप्ट लाइन मैप्स जैसे कुछ बनाने के लिए संशोधित किया गया है तो वे अभी भी संभाले जा सकते हैं कि सुंदर प्रिंटर मैक्रोज़ को वापस रोल करने के लिए उपयोग कर सकता है। क्या मुझसे कोई चूक हो रही है? – tohava

2

मैं आपकी समस्या का दो वैकल्पिक समाधान के बारे में सोच सकते हैं:

  1. एक कोडन शैली है कि एक समूह के रूप में इस्तेमाल किया जाएगा पर चर्चा करें और इसे करने के लिए चिपके रहते हैं। आपको टीम के सदस्यों की अलग-अलग व्यक्तिगत कोडिंग शैलियों के बीच समझौता करना पड़ सकता है।

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

3

[एक वाणिज्यिक उपकरण के नाम पर पोस्ट करने के लिए अन्य answerers में से एक ने पूछा।]

सिमेंटिक डिजाइन 'SmartDifferencer उपकरण C++ पार्स जाएगा, और ASTs के आधार पर एक अंतर का परिकलन; लेआउट स्वरूपण बस कोई फर्क नहीं पड़ता। पार्सर एक पूर्ण सी ++ 11 पार्सर है। जब तक वे "संरचित" होते हैं, तब तक अधिकांश प्रीप्रोसेसर निर्देशों का विस्तार किए बिना अधिकांश स्रोत फ़ाइलों को पार्स कर सकते हैं; सी ++ प्रीप्रोसेसर उपयोग आमतौर पर अपमानजनक नहीं है क्योंकि यह सी

अन्य भाषाओं के लिए स्मार्टडिफेंटरर के संस्करण हैं।

[प्रकटीकरण: मैं सिमेंटिक डिजाइन पर सीटीओ हूँ]