2009-11-05 6 views
5

मैं एक विश्वविद्यालय वर्ग के लिए एक स्थिर विश्लेषक लिखने के लिए देख रहा हूँ। टूल के लिए अधिक शक्ति प्रदान करने के लिए मैं कॉल पदानुक्रम को देखने में सक्षम होना चाहता हूं (जैसा कि Ctrl + Alt + H ग्रहण में करता है)। इसे एक तेज़ ऑपरेशन भी होना चाहिए, इसलिए लुकअप को शायद बाइटकोड स्कैनिंग के बजाय इंडेक्स के खिलाफ किया जाना होगा।क्या ग्रहण की कोड इंडेक्सिंग क्षमताओं को रद्द करना संभव है?

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

मैंने पढ़ा कि ग्रहण इंडेक्सिंग [1] करने के लिए ल्यूसीन का उपयोग करता है, हालांकि, क्षमता के लिए लुसीन के ऊपर एक महत्वपूर्ण मात्रा में काम होना चाहिए ग्रहण अनुमति देता है।

सवाल यह है कि, पुन: उपयोग के लिए ग्रहण की अनुक्रमण क्षमताओं को रद्द करना संभव है? यदि नहीं, तो क्या अन्य, आसानी से उपलब्ध पुस्तकालय उपलब्ध हैं जो कि मैंने किस प्रकार की प्रसंस्करण पर चर्चा की है?

[1] Lucene इन एक्शन (IIRC)


संपादित

मुझे लगता है कि कुछ गलतफहमी हुई है। मैं कक्षा पदानुक्रम का निरीक्षण नहीं कर रहा हूं, मैं कॉल पदानुक्रम का निरीक्षण करना चाहता हूं। यही कारण है कि खोज और अनुक्रमण (किसी तरह का, हालांकि शायद यह सही शब्द नहीं है) चर्चा में आता है। वर्ग पदानुक्रम का निरीक्षण करना संभवतः कॉल पदानुक्रम का निरीक्षण करने से बहुत कम महंगा है।

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

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

अभी तक आपके उत्तरों के लिए धन्यवाद!

+0

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

+0

एक प्रारंभिक अपफ्रंट स्कैन ठीक है। मैं जो अधिक चिंतित हूं, वह एक एपीआई ढूंढ रहा है जो सिर्फ यह करता है (क्योंकि यह मेरी कक्षा के दायरे से बाहर है)। यदि प्रारंभिक पूर्ण स्कैन एएसएम के साथ है, तो यह ठीक है, मैं बस उस बिट को लिखने से बचना चाहता हूं ;-) – Grundlefleck

उत्तर

0

क्या आपने ecj को देखा है? यह ग्रहण का संकलक भाग है, जो एक अलग परियोजना में फैला हुआ है। http://www.eclipse.org/jdt/core/index.php

1

आपरेशन आप देख रहे हैं वास्तव में अनुक्रमण नहीं है:

या आप ग्रहण का जेडीटी हिस्से का उपयोग कर सकते हैं। पूर्ण पाठ खोज प्रदान करने के लिए इंडेक्सिंग किया जाता है। किसी दिए गए वर्ग की सुपर-क्लास ढूंढना शायद ही टेक्स्ट खोज है।

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

my answer to this question देखें।

+0

कृपया मेरा संपादन देखें। मैं superclass को हल करने के लिए नहीं देख रहा हूँ, लेकिन एक विशेष विधि के लिए ग्राफ कहते हैं। चीयर्स। – Grundlefleck

+0

मान लीजिए कि अब आप विधि foo का निरीक्षण कर रहे हैं, क्या आप foo द्वारा आमंत्रित सभी विधियों की तलाश कर रहे हैं या foo का आविष्कार कर रहे हैं? एक बड़ा अंतर है। – zvikico

+0

foo आमंत्रित करना। विशेष रूप से एक कन्स्ट्रक्टर का आह्वान करना। – Grundlefleck

0

ग्रहण प्लगइन्स वास्तव में कठिन नहीं हैं; वे थोड़ा सा उपयोग करते हैं, लेकिन बहुत लंबा नहीं।

ग्रहण आईडीई के लिए जो भी कार्यक्षमता जोड़ना चाहते हैं, उसके बारे में सोचें। आप अन्य प्लगइन कार्यक्षमता का लाभ उठा सकते हैं (जैसे जेडीटी, जिसमें खोज कार्यक्षमता शामिल है जिसे आप ढूंढ रहे हैं)।

फिर आप एक अन्य स्टैंडअलोन टूल विकसित करने के बजाय सभी ग्रहण उपयोगकर्ताओं के उपयोग के लिए अपने प्लगइन प्रदान कर सकते हैं।

1

मैं ASM पर आधारित समाधान के लिए जाऊंगा, यह पदानुक्रम को हल करने, कड़ी मेहनत करेगा। यहाँ एक सरल विश्लेषक तो उस वर्ग के कॉल पदानुक्रम दिया println है:

public class Analyzer { 
    public static void main(String[] args) throws IOException { 
     ClassReader classReader; 
     ClassNode classNode; 
     String fullyQualifiedClassName = args[0]; 
     String callHierarchy = ""; 
     while (null != fullyQualifiedClassName) { 
      callHierarchy = " > " + fullyQualifiedClassName + callHierarchy; 
      classReader = new ClassReader(fullyQualifiedClassName); 
      classNode = new ClassNode(); 
      classReader.accept(classNode, 0); 
      if (null != classNode.superName) { 
       fullyQualifiedClassName = classNode.superName.replace('/', '.'); 
      } else { 
       fullyQualifiedClassName = null; 
      } 
     } 
     System.out.println(callHierarchy); 
    } 
} 

तर्क के रूप में देखते हुए java.util.TreeMap, यह प्रिंट

> java.lang.Object > java.util.AbstractMap > java.util.TreeMap 

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

आशा इस मदद :)

+0

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

4

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

[1] http://www.eclipseplugincentral.com/Web_Links-index-req-viewlink-cid-1326.html

+0

+1 लिंक अन्वेषण करने के लिए कुछ दिलचस्प प्रदान करता है। – Grundlefleck

+1

मुझे इस प्रस्ताव से प्यार है: "जितना संभव हो ग्रहण के अनियंत्रित एपीआई का उपयोग करें"। क्या आप गंभीर हैं? –

+0

मैंने यह किया। यह समय लेने वाला है लेकिन दृढ़ता से आप इसे कर सकते हैं। – mansu

1

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

1

मैं पूरी तरह ग्रहण को अनदेखा कर दूंगा: यह आपको विचलित करने जा रहा है।

यदि आप स्थिर विश्लेषण कर रहे हैं, तो आप लगभग निश्चित रूप से बाइटकोड का विश्लेषण करना चाहेंगे। कॉल पदानुक्रम ढूंढने के लिए, आप invokeinstance, invokestatic के लिए देखो, और invokespecial bytecodes (JVM spec देखें)। ये एक पूर्ण योग्य श्रेणी/विधि नाम का संदर्भ देते हैं, और आप Map<FuncRef,Set<FuncRef>> का उपयोग करके अपनी कॉल पदानुक्रम बना सकते हैं, जहां FuncRef वह कक्षा है जिसे आप विधि कॉल जानकारी रखने के लिए परिभाषित करते हैं।

BCEL बाइटकोड स्कैनिंग के साथ आपकी मदद कर सकता है।

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

1

यह ग्रहण के लिए एक जीयूआई प्लगइन है जो कॉल पदानुक्रम का दृश्य प्रस्तुतिकरण देता है। यह एक सूची नहीं है, लेकिन यह एक मदद है। जिसके लिए ग्रहण बनाया गया है और प्रलेखित है - - से बिट्स कि आंतरिक हो सकता है और उनमें से बाहर कुछ और निर्माण के लिए होती हैं निकालने के लिए

http://www.certiv.net/projects/callgraph.html

0

मैं आपको लगता है कि यह आसान है प्लगइन लिखने के लिए मिल जाएगा संदेह है।

संबंधित मुद्दे