12

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

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

नमूना उपयोग मामले (अतिरिक्त - जिज्ञासु मन के लिए):

  1. गहरा नीडिंत struct और चर (सरणी) इन प्रकार के initializations, मान लीजिए द्वारा एक struct परिभाषा को बदलने की जरूरत है को देखते हुए मैन्युअल श्रम से उत्पन्न त्रुटियों को पेश किए बिना फ़ील्ड को जोड़ना या पुन: व्यवस्थित करना या परिवर्तनीय/सरणी परिभाषाओं को अधिक पठनीय प्रारूप में फिर से लिखना। यह पुरानी शुरुआतओं को निकालने के लिए नए प्रारंभिकताओं को लिखने के लिए पुरानी प्रारंभिकताओं को निकालने के बाद, एक स्क्रिप्ट/प्रोग्राम का उपयोग करके काम करेगा। एक परिभाषा निकालने -
  2. एक कोड ब्राउज़िंग उपकरण को लागू करने के लिए
  3. सजावटी कोड पीढ़ी (जैसे लॉगिंग समारोह प्रविष्टियों/रिटर्न)।
  4. पटकथा कोड संरचना (जैसे यह निकालने और उस चीज़ और बिना परिवर्तन अलग स्थान पर रखा - संस्करण नियंत्रण टिप्पणी प्रतिबद्ध आदेश दस्तावेज़ यह स्पष्ट और निरीक्षण कि कुछ भी नहीं बदला बनाने के लिए यह कार्रवाई करने के सकता है)।

वैकल्पिक समस्या: अगर परिभाषा के स्थान बताने के लिए एक उपकरण है (आरंभ और समाप्ति लाइन पर्याप्त होगा - हम भी मान सकता है सभी परिभाषाओं/घोषणाओं हम में रुचि रखते हैं अपने स्वयं के कतार में हैं) है, तो यह एक बस उंगली निपुणता का प्रयोग करते

  1. निकालने परिभाषाओं के लिए एक प्रोग्राम लिखने के लिए करने के लिए होता है,
  2. की जगह परिभाषाओं, या यहाँ तक
  3. एक परिभाषा निकालने, एक कार्यक्रम तकनीक और नवीनता चलाने

    • को कमांड लाइन विकल्प (या एक संपादक) द्वारा fied stdin से वांछित निकाले परिभाषाओं प्राप्त (या एक अस्थायी फ़ाइल से),
    • परिवर्तन (संपादन) करते हैं, और
    • उत्पादन नई परिभाषाएँ stdout (या उन्हें दिए गए अस्थायी फ़ाइल में सहेजें)

    निष्पादन कार्यक्रम द्वारा प्रतिस्थापित किया जाएगा।

तो प्रमुख, अधिक चुनौतीपूर्ण समस्या परिभाषा की शुरुआत और अंत रेखा को पाई जाएगी।

टैग के बारे में ध्यान दें:code-generation से अधिक सटीक टैग code-transformation होगा, लेकिन यह मौजूद नहीं है।

+0

आपको लगता है सी। सी/सी ++ नामक कोई भाषा नहीं है। – aschepler

+2

सी/सी ++ से मेरा मतलब सी या सी ++ है। मैं मुख्य रूप से सी में रूचि रखता हूं (मैं सक्रिय रूप से विरासत कोड का उपयोग कर रहा हूं और उससे निपट रहा हूं), लेकिन सी ++ भी ब्याज की है (यदि कोई विकल्प दिया गया है तो मैं स्वच्छ तालिका परियोजनाओं के लिए उपयोग करना पसंद करूंगा)। वर्णित कार्यों के लिए आपको भाषा वाक्यविन्यास की बहुत अच्छी समझ की आवश्यकता नहीं है, मुझे लगता है, इसलिए सी और सी ++ के बीच अंतर इतना महत्वपूर्ण नहीं लगता है। – FooF

+0

मैं टैग 'C++' का भी उपयोग करता हूं लेकिन टैग की अधिकतम संख्या 5 है। कोई टैग 'कोड-निष्कर्षण' या 'कोड-रूपांतरण' नहीं है ... और किसी भी तरह से टैग की अधिकतम संख्या पहले ही पहुंच चुकी है। :-) – FooF

उत्तर

4

हमारे DMS Software Reengineering Toolkit वह उपकरण बनने का प्रयास कर रहा है जिसे आप चाहते हैं। लेकिन यह कला की स्थिति को दबा रहा है और निर्वाण शैली उपकरण नहीं है। असली, दिलचस्प काम करने के लिए यह काफी अच्छा है।

डीएमएस स्रोत कोड को पार्सिंग, विश्लेषण और बदलने के लिए सामान्य सुविधाएं प्रदान करता है।

यह भाषाओं को परिभाषित करने के लिए स्पष्ट व्याकरण का उपयोग करता है (जैसे सी और सी ++); व्याकरण ड्राइव पार्सर्स जो अमूर्त वाक्यविन्यास पेड़ (एएसटी) का निर्माण करते हैं। विभिन्न प्रकार के विश्लेषण प्राइमेटिव्स ए) सुविधाएं प्रदान करते हैं ["विशेषता व्याकरण" एटीजी] पेड़ जैसी सूचना प्रवाह पथों के साथ जानकारी इकट्ठा करने के लिए जो अच्छी तरह से एएसटी के आकार से मेल खाते हैं, बी) प्रतीक परिभाषा मानचित्रों [प्रतीक प्रतीक "] के प्रतीक प्रतीक का निर्माण , सी) control and data flow analysis एटीजी द्वारा निकाले गए तथ्यों का उपयोग करके, डी) रेंज विश्लेषण, ई) स्थानीय और वैश्विक दोनों के विश्लेषण के लिए अंक। एएसटी द्वारा प्रतिनिधित्व किए गए कोड के बारे में निष्कर्ष निकालने के लिए इन आदिम विश्लेषकों का उपयोग एएसटी से तथ्यों को लिखने के लिए किया जा सकता है (उदाहरण के लिए, "यह कथन इन चर को संशोधित करता है")। एक langauge front end एक पुन: प्रयोज्य बंडल में व्याकरण और भाषा-विशिष्ट विश्लेषकों को एक साथ पैकेज करता है। विभिन्न प्रकार की भाषाओं के लिए डीएमएस में गहराई और परिपक्वता के विभिन्न स्तरों की ऐसी भाषा फ्रंट सिरों है।

[संपादित करें 6/27: सी और सी ++ फ्रंट सिरों में सी और सी ++ की विशिष्ट बोलियों के लिए समर्थन है: एएनएसआईसी, सी 99, जीसीसी 3/4 सी, एमएस विजुअल सी, एएनएसआई सी ++ 98, एएनएसआई सी ++ 11 , जीसीसी 3/4 सी ++, एमएस विजुअल सी ++ 2005/2008/2010। यदि आप कोड के सटीक विश्लेषण चाहते हैं, तो आपको अपने कोड को संसाधित करने के लिए "दाएं" बोली का उपयोग करना चाहिए।]

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

यह सब काफी डिग्री के लिए काम करता है, फिर भी कुछ भाषा जटिलताओं से कुछ हद तक परेशान है। सी और सी ++ के लिए, एक प्रसिद्ध जटिलता प्रीप्रोसेसर है; प्रोग्राम पाठ को मनमाने ढंग से संपादित करके, प्रीप्रोसेसर सशर्त मानक स्रोत पार्सिंग तकनीक जैसा कुछ भी स्रोत स्रोत को प्रस्तुत कर सकते हैं। डीएमएस के C और C++ सामने समाप्त होता है यह कुछ हद तक सुधार और कुछ अजीब मामलों कि ज्यादातर लोगों को संरचित नहीं कहेंगे लेकिन यह है कि आम तौर पर पाए जाते हैं सहित अच्छी तरह से संरचित पूर्वप्रक्रमक निर्देशों के साथ कोड पार्स कर सकते हैं:

#IF cond 
     if (abc) { 
    #ELSE 
     if (def) { 
    #ENDIF 

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

डीएमएस बड़ी सी ++ प्रोग्राम में प्रमुख वास्तु बदलाव बनाने के लिए, कोड की उथल की एक विशाल राशि के साथ CORBA शैली करने के लिए गैर CORBA शैली से परिवर्तित इस्तेमाल किया गया है, के लिए SOW शैली एपीआई उत्पन्न करने के लिए मनमाने ढंग से नियंत्रण प्रवाह पथ के साथ कोड को निकालने के लिए मौजूदा सी कोड, पॉइंटर त्रुटियों का पता लगाने के लिए बड़े सी प्रोग्रामों में वाद्ययंत्र डालने के लिए [यह उन अन्य भाषाओं में अन्य कार्यों पर लागू किया गया है]।

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

वास्तव में इसका उपयोग कार्यों को निकालने के लिए किया गया है (SOW-exercise उस से अधिक सामान्य है) और कार्यों को सम्मिलित करें (यह उपकरण का एक सामान्यीकृत मामला है)।

जीसीसी-एक्सएमएल जैसे उपकरण डीएमएस की क्षमताओं की छाया हैं। जीसीसी-एक्सएमएल पार्स, प्रतीक टेबल बनाता है, और डंप डेटा घोषणाएं (कोड नहीं), लेकिन यह कोई कोड परिवर्तन नहीं कर सकता है। क्लैंग बेहतर है; यह सी और सी ++ को एएसटी में पार्स करता है, एलएलवीएम इंटरमीडिएट प्रस्तुतीकरण पर विश्लेषण कर सकता है, और वांछित वृक्ष परिवर्तन से प्रेरित स्रोत पाठ के लिए बाद में पैच करने के लिए कुछ प्रकार की तंत्र है। मुझे नहीं पता कि क्लैंग भारी कोड ट्रांसफॉर्मेशन कर सकता है, खासकर वे जहां एक परिवर्तन का परिणाम फिर से बदल जाता है (आप देरी वाले पाठ पैच के लिए पेड़ को कैसे संशोधित करते हैं?)। डीएमएस पूरे दिन ऐसा कर सकता है, और सी और सी ++ के अलावा कई भाषाओं के लिए ऐसा कर सकता है, और यह लैंगुग के मनमाने ढंग से मिश्रण के लिए कर सकता है।

जब तक सशर्तों के साथ प्रीप्रोसेसर समस्या हल नहीं हो जाती है, तब तक सी और सी ++ कोड का विश्लेषण/परिवर्तन करना आसान नहीं होगा। हम इन कार्यों में इन इच्छाओं पर केवल सशक्त इच्छाशक्ति और हमारे द्वारा बनाए जा सकने वाले सबसे मजबूत टूल का उपयोग करके सफल होते हैं। (जावा में इन समस्याएं नहीं हैं, और डीएमएस इसका विश्लेषण/रूपांतरण करने में संगत रूप से बेहतर है)।

हुब्रिस के गंभीर जोखिम पर, मेरा मानना ​​है कि सामान्य उद्देश्य विश्लेषण और परिवर्तन के लिए डीएमएस सबसे अच्छा उपकरण है। अपने वास्तुकार के रूप में, मैं इसे इस कार्य के लिए हमेशा मजबूत बनाने के लिए अपनी दीर्घकालिक नौकरी के रूप में देखता हूं।

+0

बहुत महत्वाकांक्षी लगता है, शक्तिशाली, रोचक और उपयोगी। यहां तक ​​कि यदि मैं मुख्य रूप से ओपन सोर्स सॉल्यूशंस में दिलचस्पी लेता हूं, और इस समय खर्च करने के लिए पैसा नहीं है, तो भी मैं निश्चित रूप से अपने उत्पादों के बारे में अधिक जानना चाहता हूं (यदि अकादमिक जिज्ञासा के लिए कुछ और नहीं है)। commen कठिनाइयों के बारे में भी टिंग करें और सबकुछ बहुत गुलाबी नहीं बनाते। मैंने यह भी अनुभव किया है कि कैसे सी प्रीप्रोसेसर परत सी कोड पर काम करने वाले कुछ टूल्स खराब परिणाम उत्पन्न करती है ([जीएनयू इंडेंट] (http://www.gnu.org/software/indent/) मेरे दिमाग में जल्दी आती है)। – FooF

3

आप GCC-XML पर विचार कर रहे हैं जैसे कि आप किस बारे में बात कर रहे हैं। मैंने इसे pygccxml के साथ संयोजन में गहराई से घोंसला वाले संरचना सदस्यों के कुछ स्वचालित निष्कर्षण के लिए उपयोग किया है। यह आपकी नौकरी को स्नैप नहीं करेगा, लेकिन आप निश्चित रूप से बेहतर होंगे कि आप अन्यथा होंगे।

मैंने अन्य लोगों को ऐसे टूल लिखने के आधार के रूप में clang का भी उल्लेख किया है, लेकिन मुझे इसमें अधिक देखने का मौका नहीं मिला है।

+0

मैंने 'gccxml' का उपयोग एक स्पष्ट विकल्प के रूप में करने का भी प्रयास किया लेकिन मेरे परीक्षण में त्रुटियों के अलावा किसी भी परिणाम को जल्दी से विफल करने में विफल रहा। (मेरे पास मेरे हाथ में खराब विरासत कोड है, कोड वास्तव में विभिन्न आर्किटेक्चर (एआरएम और एमआईपीएस) के लिए लक्षित है, और अधिकांश 'gccxml' कोड को C++ (http://www.gccxml.org/HTML/) के रूप में संदर्भित करता है। FAQ.html प्रश्न 1) – FooF

+0

@FooF: "सी ++ के रूप में कोड का संबंध" के बारे में यह एक संकेत है कि आपको वास्तव में भाषा की सटीक पार्सिंग की आवश्यकता होती है, जो उस भाषा के विशिष्ट * बोली * के लिए आवश्यक है। छोटे मतभेद कुछ वाक्यविन्यास के अर्थ की व्याख्या में प्रक्रिया में बाद में निष्कर्षण/परिवर्तन में प्रमुख अंतर हो सकता है। (यह समस्या तब खराब हो जाती है जब एक प्रीप्रोसेसर सशर्तों का सामना करता है जिनकी बाहों में * अलग * कंपाइलर्स के लिए कोड होता है।) –

2

आप Clang देख सकते हैं। उनके पास गैर-तुच्छ स्रोत कोड प्रसंस्करण पुस्तकालय हैं।