"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > कुछ बगों का समाधान

कुछ बगों का समाधान

2024-08-19 को प्रकाशित
ब्राउज़ करें:547

Resolução de alguns bugs

उन लोगों के लिए जो POJ का अनुसरण नहीं कर रहे हैं (JVM पर पास्कल) एक कंपाइलर है जो सबसेट को पास्कल से JASM में बदल देता है (जावा असेंबली) ताकि हम JVM को निष्पादन वातावरण के रूप में उपयोग कर सकें।

पिछली पोस्ट में हमने पास्कल के कार्यों के लिए समर्थन लागू किया था।

इस पोस्ट में, क्या हम अच्छी चीज़ों के बारे में बात करने जा रहे हैं? इतना भी नहीं हाहाहा. इस बार हम केवल बग्स के बारे में बात करने जा रहे हैं :-)

जैसा कि हम जेवीएम के लिए संकलन कर रहे हैं, इस अविश्वसनीय वर्चुअल मशीन के विभिन्न बिंदुओं की कार्यप्रणाली का विवरण देना आवश्यक है। इसलिए, विभिन्न समयों पर मैं जेवीएम की आंतरिक कार्यप्रणाली के साथ-साथ इसके कुछ निर्देशों (opcodes) का विवरण देता हूं।

कमांड लाइन के माध्यम से प्रोग्राम को दिए गए पैरामीटर के संबंध में बग

जब मैंने वेरिएबल घोषणा को लागू किया तो मैंने इस तथ्य पर ध्यान नहीं दिया कि, जेवीएम में, मुख्य फ़ंक्शन में पहला वेरिएबल आर्ग्स है, एक सरणी जिसमें प्रोग्राम को दिए गए तर्क शामिल हैं। इसलिए इस पीआर में मैं तर्कों के लिए परोक्ष रूप से पहला स्थान आरक्षित रखता हूं।

स्थानीय और वैश्विक चर से निपटते समय बग

चूंकि परीक्षण पास्कल कार्यक्रमों में केवल वैश्विक चर शामिल थे, मैंने जेएएसएम पीढ़ी में कोई गंभीर त्रुटि नहीं देखी थी। जिस क्षण मैंने ऐसे प्रोग्राम बनाए जिनमें वैश्विक और स्थानीय चर शामिल थे, मुझे एहसास हुआ कि कुछ सही नहीं था।

नीचे पास्कल कार्यक्रम से:

program global_var_declaration;
var
    globalvar : integer;
begin
    globalvar := 123;
    write (globalvar);
end.

POJ ने निम्नलिखित JASM उत्पन्न किया:

// Code generated by POJ 0.1
public class global_var_declaration {
    public static main([java/lang/String)V {
        ;; globalvar := 123;
        bipush 123
        istore 1

        ;; write (globalvar);
        getstatic java/lang/System.out java/io/PrintStream
        iload 1
        invokevirtual java/io/PrintStream.print(I)V

        return
    }
}

समस्या की पहचान करने के लिए, मैंने उपरोक्त पास्कल प्रोग्राम के समतुल्य एक जावा प्रोग्राम बनाया:

public class GlobalVarDeclaration {
    public static int globalVar;

    public static void main(String[] args) {
        globalVar = 123;
        System.out.println(globalVar);
    }
}

जब मैंने क्लास को अलग किया तो मुझे निम्नलिखित असेंबली मिली:

 1: public class GlobalVarDeclaration {
 2:     public static globalVar I
 3:
 4:     public static main([java/lang/String)V {
 5:         bipush 123
 6:         putstatic GlobalVarDeclaration.globalVar I
 7:
 8:         getstatic java/lang/System.out java/io/PrintStream
 9:         getstatic GlobalVarDeclaration.globalVar I
10:         invokevirtual java/io/PrintStream.println(I)V
11:
12:         return
13:     }
14: }

इस बिंदु पर मैंने घोषणा "public staticglobalVar I" (पंक्ति 2) और निर्देश putstatic (पंक्ति 6) और getstatic (पंक्ति) देखी 9) . अब तक POJ द्वारा उपयोग किए जाने वाले निर्देश astore और istore अपेक्षित थे। जेवीएम दस्तावेज को पढ़ने से मुझे एहसास हुआ कि पीओजे वैश्विक चर घोषित कर रहा था जैसे कि वे जेवीएम के लिए किसी फ़ंक्शन के स्थानीय चर थे :-D

वैसे भी, अब तक POJ (गलत तरीके से) opcodes aload/iload/astore/ Istore का उपयोग कर रहा था वैश्विक चर के लिए, लेकिन सही विकल्प चर को सार्वजनिक घोषित करना होगा (जैसा कि पंक्ति 2 में है) और getstatic/putstatic का उपयोग करें।

परिणामस्वरूप, कोड को यहां दोबारा तैयार किया गया ताकि प्रतीक तालिका स्थानीय और वैश्विक घोषणाओं को संभाल सके। और यहां कोड को दोबारा तैयार किया गया ताकि प्रतीक तालिका स्थानीय और वैश्विक चर के लिए सही निर्देश उत्पन्न कर सके।

नए प्रतीक तालिका को संभालने के साथ-साथ किसी फ़ंक्शन या प्रक्रिया समाप्त होने के बाद स्थानीय घोषणाओं को साफ करने के लिए यहां जेएएसएम कोड जनरेशन को बदल दिया गया है।

इसके साथ, नीचे दिए गए पास्कल कार्यक्रम से:

program GlobalVarDeclaration;
var
    globalvar : integer;
begin
    globalvar := 123;
    write (globalvar);
end.

POJ अब निम्नलिखित JASM को सही ढंग से उत्पन्न करता है:

// Code generated by POJ 0.1
public class global_var_declaration {
    public static globalvar I

    public static main([java/lang/String)V {
        ;; globalvar := 123;
        bipush 123
        putstatic global_var_declaration.globalvar I

        ;; write (globalvar);
        getstatic java/lang/System.out java/io/PrintStream
        getstatic global_var_declaration.globalvar I
        invokevirtual java/io/PrintStream.print(I)V

        return
    }
}

अगले कदम

अगली पोस्ट में हम संदर्भों और नेस्टेड वाक्यों के बारे में बात करेंगे।

पूरा प्रोजेक्ट कोड

परियोजना के संपूर्ण कोड और दस्तावेज़ीकरण के साथ भंडार यहां है।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/alexgarzao/resolucao-de-algons-bugs-3a1i?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3