The compiler translates high-level code into machine language.

कम्पाइलर उच्च-स्तरीय कोड को मशीन भाषा में अनुवादित करता है।


Lexical analysis divides the program text into tokens.

लेक्सिकल विश्लेषण प्रोग्राम के पाठ को टोकन में विभाजित करता है।


Syntax analysis constructs a syntax tree from the tokens.

सिंटैक्स विश्लेषण टोकन से एक सिंटैक्स ट्री बनाता है।


Type checking ensures the program's consistency.

टाइप चेकिंग प्रोग्राम की स्थिरता सुनिश्चित करता है।


A compiler helps bridge the gap between high-level and low-level languages.

एक कंपाइलर उच्च-स्तरीय और निम्न-स्तरीय भाषाओं के बीच की खाई को पाटने में मदद करता है।


High-level languages are closer to how humans think.

उच्च-स्तरीय भाषाएँ मनुष्यों के सोचने के तरीके के करीब हैं।


Compilers can identify programming mistakes.

कम्पाइलर प्रोग्रामिंग गलतियों की पहचान कर सकते हैं।


Programs in high-level languages are often shorter.

उच्च-स्तरीय भाषाओं में लिखे गए प्रोग्राम अक्सर छोटे होते हैं।


The same program can run on different machines.

एक ही प्रोग्राम विभिन्न मशीनों पर चल सकता है।


Hand-coded machine language can be faster.

हाथ से लिखे गए मशीन कोड तेज़ हो सकते हैं।


A good compiler optimizes well-structured programs.

एक अच्छा कंपाइलर अच्छी तरह से संरचित प्रोग्रामों का अनुकूलन करता है।


Compilation is divided into several phases.

संकलन को कई चरणों में विभाजित किया गया है।


प्रत्येक चरण में अच्छी तरह से परिभाषित इंटरफेस होते हैं।


Lexical analysis is the initial part of program analysis.

लेक्सिकल विश्लेषण प्रोग्राम विश्लेषण का प्रारंभिक भाग है।


Syntax analysis arranges tokens into a tree structure.

सिंटैक्स विश्लेषण टोकन को एक ट्री संरचना में व्यवस्थित करता है।


Type checking identifies consistency violations.

टाइप चेकिंग स्थिरता के उल्लंघन की पहचान करता है।


The compiler attempts to spot programmer mistakes.

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


Memory management is a crucial aspect of programming.

मेमोरी प्रबंधन प्रोग्रामिंग का एक महत्वपूर्ण पहलू है।


Bootstrapping a compiler involves compiling compilers.

एक कंपाइलर को बूटस्ट्रैपिंग में कंपाइलर को संकलित करना शामिल है।


Data-flow analyses are used for optimization.

डेटा-फ्लो विश्लेषण का उपयोग अनुकूलन के लिए किया जाता है।


कार्यक्रम जल्द ही शुरू होगा।


कृपया अपना नाम और पता प्रदान करें।


आज मौसम बहुत सुहावना है।


I am going to the market to buy groceries.

मैं किराने का सामान खरीदने के लिए बाजार जा रहा हूँ।


क्या आप कृपया उसे दोहरा सकते हैं?


The company announced a new product launch.

कंपनी ने एक नए उत्पाद के लॉन्च की घोषणा की।


वह एक बहुत ही प्रतिभाशाली संगीतकार है।


The government is working on new policies.

सरकार नई नीतियों पर काम कर रही है।


The research team made a significant discovery.

अनुसंधान टीम ने एक महत्वपूर्ण खोज की।


The algorithm efficiently sorts the data.

एल्गोरिदम कुशलता से डेटा को सॉर्ट करता है।


The complexities of the legal system are often difficult to understand.

कानूनी प्रणाली की जटिलताओं को समझना अक्सर मुश्किल होता है।


The economic forecast predicts a period of growth.

आर्थिक पूर्वानुमान विकास की अवधि की भविष्यवाणी करता है।


The software requires frequent updates to maintain security.

सॉफ्टवेयर को सुरक्षा बनाए रखने के लिए बार-बार अपडेट की आवश्यकता होती है।


Despite the challenges, they persevered and succeeded.

चुनौतियों के बावजूद, उन्होंने हार नहीं मानी और सफलता प्राप्त की।


The implications of the new technology are far-reaching.

नई तकनीक के निहितार्थ दूरगामी हैं।


The meeting was adjourned due to lack of quorum.

कोरम के अभाव के कारण बैठक स्थगित कर दी गई।


The company's innovative approach revolutionized the industry.

कंपनी के नवीन दृष्टिकोण ने उद्योग में क्रांति ला दी।


The intricate details of the project were meticulously planned.

परियोजना के जटिल विवरणों की सावधानीपूर्वक योजना बनाई गई थी।


The philosophical debate explored the nature of consciousness.

दार्शनिक बहस ने चेतना की प्रकृति की खोज की।


The algorithm's efficiency is paramount for large datasets.

बड़े डेटासेट के लिए एल्गोरिदम की दक्षता सर्वोपरि है।


The book provides a comprehensive introduction to compiler design.

यह पुस्तक संकलक डिज़ाइन का एक व्यापक परिचय प्रदान करती है।


Chapter 2 discusses lexical analysis in detail.

अध्याय 2 में लेक्सिकल विश्लेषण पर विस्तार से चर्चा की गई है।


Regular expressions are fundamental to lexical analysis.

नियमित अभिव्यक्ति लेक्सिकल विश्लेषण के लिए मौलिक हैं।


The compiler translates source code into machine code.

संकलक स्रोत कोड को मशीन कोड में अनुवादित करता है।


Understanding compiler design helps in writing efficient code.

संकलक डिज़ाइन को समझने से कुशल कोड लिखने में मदद मिलती है।


यह पुस्तक lulu.com के माध्यम से प्रकाशित की गई है।


The author's email address is torbenm@diku.dk.

लेखक का ईमेल पता torbenm@diku.dk है।


The book's homepage can be found at http://www.diku.dk/~torbenm/Basics.

पुस्तक का मुखपृष्ठ http://www.diku.dk/~torbenm/Basics पर पाया जा सकता है।


This edition was published on August 20, 2010.

यह संस्करण 20 अगस्त, 2010 को प्रकाशित हुआ था।


The ISBN of the book is 978-87-993154-0-6.


The book covers various aspects of compiler design.

यह पुस्तक संकलक डिज़ाइन के विभिन्न पहलुओं को शामिल करती है।


The introduction explains what a compiler is.

परिचय में बताया गया है कि एक संकलक क्या है।


The phases of a compiler are discussed in the next section.

अगले खंड में एक संकलक के चरणों पर चर्चा की गई है।


Interpreters are also briefly explained.

दुभाषियों को भी संक्षेप में समझाया गया है।


किसी को संकलकों के बारे में क्यों सीखना चाहिए?


The structure of the book is outlined in section 1.5.

पुस्तक की संरचना खंड 1.5 में बताई गई है।


The author acknowledges the contributions of others.

लेखक दूसरों के योगदान को स्वीकार करता है।


Permission to use the content is granted.

सामग्री का उपयोग करने की अनुमति दी गई है।


Lexical analysis is the first phase of compilation.

लेक्सिकल विश्लेषण संकलन का पहला चरण है।


Regular expressions are used to define tokens.

टोकन को परिभाषित करने के लिए नियमित अभिव्यक्तियों का उपयोग किया जाता है।


This is now entered into the set S' of DFA states as unmarked.

इसे अब DFA राज्यों के सेट S' में बिना चिह्नित के रूप में दर्ज किया गया है।


We now pick an unmarked element from the uncompleted S'.

अब हम अधूरे S' से एक अचिह्नित तत्व चुनते हैं।


We now mark this and calculate the transitions for it.

अब हम इसे चिह्नित करते हैं और इसके लिए संक्रमण की गणना करते हैं।


Note that the empty set of NFA states is not an DFA state, so there will be no transition from s'0 on c.

ध्यान दें कि NFA राज्यों का खाली सेट एक DFA राज्य नहीं है, इसलिए s'0 से c पर कोई संक्रमण नहीं होगा।


We now adds'1 and s'2 to our incomplete S', which now is {√ s'0, s'1, s'2}.

अब हम अपने अधूरे S' में s'1 और s'2 जोड़ते हैं, जो अब {√ s'0, s'1, s'2} है।


We now picks'1, mark it and calculate its transitions.

अब हम s'1 चुनते हैं, इसे चिह्नित करते हैं और इसके संक्रमणों की गणना करते हैं।


We have seen s'1 and s'2 before, so only s'3 is added: {√ s'0, √ s'1, s'2, s'3}.

हमने पहले s'1 और s'2 देखा है, इसलिए केवल s'3 जोड़ा गया है: {√ s'0, √ s'1, s'2, s'3}।


No new elements are added, so we pick the remaining unmarked elements s'3.

कोई नया तत्व नहीं जोड़ा गया है, इसलिए हम शेष अचिह्नित तत्वों s'3 को चुनते हैं।


Which now completes the construction of S' = {s'0, s'1, s'2, s'3}.

जो अब S' = {s'0, s'1, s'2, s'3} का निर्माण पूरा करता है।


Only s'3 contains the accepting NFA state 4, so this is the only accepting state of our DFA.

केवल s'3 में स्वीकार करने वाला NFA राज्य 4 है, इसलिए यह हमारे DFA का एकमात्र स्वीकार करने वाला राज्य है।


चित्र 2.9 पूर्ण DFA दिखाता है।


सुझाए गए अभ्यास: 2.2(बी), 2.4।


In the above example, we get a DFA with 4 states from an NFA with 8 states.

उपरोक्त उदाहरण में, हमें 8 राज्यों वाले NFA से 4 राज्यों वाला DFA मिलता है।


However, as the states in the constructed DFA are (nonempty) sets of states from the NFA there may potentially be 2^n − 1 states in a DFA constructed from an n-state NFA.

हालांकि, जैसा कि निर्मित DFA में राज्य NFA के राज्यों के (गैर-खाली) सेट हैं, एक n-राज्य NFA से निर्मित DFA में संभावित रूप से 2^n − 1 राज्य हो सकते हैं।


It is not too difficult to construct classes of NFAs that expand exponentially in this way when converted to DFAs, as we shall see in section 2.10.1.

इस तरह से NFAs के वर्गों का निर्माण करना बहुत मुश्किल नहीं है जो DFAs में परिवर्तित होने पर घातीय रूप से विस्तारित होते हैं, जैसा कि हम धारा 2.10.1 में देखेंगे।


Since we are mainly interested in NFAs that are constructed from regular expressions as in section 2.4, we might ask ourselves if these might not be in a suitably simple class that do not risk exponential-sized DFAs.

चूंकि हम मुख्य रूप से उन NFAs में रुचि रखते हैं जो धारा 2.4 में नियमित अभिव्यक्तियों से निर्मित होते हैं, इसलिए हम खुद से पूछ सकते हैं कि क्या ये एक उपयुक्त सरल वर्ग में नहीं हो सकते हैं जो घातीय आकार के DFAs का जोखिम नहीं उठाते हैं।


अफ़सोस, ऐसा नहीं है।


Just as we can construct a class of NFAs that expand exponentially, we can construct a class of regular expressions where the smallest equivalent DFAs are exponentially larger.

जैसे ही हम NFAs का एक वर्ग बना सकते हैं जो घातीय रूप से विस्तारित होते हैं, हम नियमित अभिव्यक्तियों का एक वर्ग बना सकते हैं जहां सबसे छोटे समतुल्य DFAs घातीय रूप से बड़े होते हैं।


The program is translated to a simple machine- independent intermediate language.

कार्यक्रम को एक सरल मशीन-स्वतंत्र मध्यवर्ती भाषा में अनुवादित किया गया है।


Register allocationThe symbolic variable names used in the intermediate code are translated to numbers, each of which corresponds to a register in the target machine code.

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


The first three phases are collectively called the frontend of the compiler and the last three phases are collectively called the backend.

पहले तीन चरणों को सामूहिक रूप से संकलक का फ्रंटएंड कहा जाता है और अंतिम तीन चरणों को सामूहिक रूप से बैकएंड कहा जाता है।


The middle part of the compiler is in this context only the intermediate code generation, but this often includes various optimisations and transformations on the intermediate code.

संकलक का मध्य भाग इस संदर्भ में केवल मध्यवर्ती कोड पीढ़ी है, लेकिन इसमें अक्सर मध्यवर्ती कोड पर विभिन्न अनुकूलन और परिवर्तन शामिल होते हैं।


For example, the type checker can assume absence of syntax errors and the code generation can assume absence of type errors.

उदाहरण के लिए, टाइप चेकर वाक्यविन्यास त्रुटियों की अनुपस्थिति मान सकता है और कोड जनरेशन टाइप त्रुटियों की अनुपस्थिति मान सकता है।


Assembly and linking are typically done by programs supplied by the machine or operating system vendor, and are hence not part of the compiler itself, so we will not further discuss these phases in this book.

असेम्बली और लिंकिंग आमतौर पर मशीन या ऑपरेटिंग सिस्टम विक्रेता द्वारा आपूर्ति किए गए प्रोग्रामों द्वारा की जाती है, और इसलिए यह संकलक का हिस्सा नहीं है, इसलिए हम इस पुस्तक में इन चरणों पर आगे चर्चा नहीं करेंगे।


An interpreter is another way of implementing a programming language.

एक इंटरप्रेटर एक प्रोग्रामिंग भाषा को लागू करने का एक और तरीका है।


Interpretation shares many aspects with compiling.

अनुवाद संकलन के साथ कई पहलुओं को साझा करता है।


Lexing, parsing and type-checking are in an interpreter done just as in a compiler.

लेक्सिंग, पार्सिंग और टाइप-चेकिंग एक इंटरप्रेटर में ठीक उसी तरह किए जाते हैं जैसे एक संकलक में।


But instead of generating code from the syntax tree, the syntax tree is processed directly to evaluate expressions and execute statements, and so on.

लेकिन सिंटैक्स ट्री से कोड उत्पन्न करने के बजाय, सिंटैक्स ट्री को सीधे भावों का मूल्यांकन करने और कथनों को निष्पादित करने के लिए संसाधित किया जाता है, और इसी तरह।


An interpreter may need to process the same piece of the syntax tree (for example, the body of a loop) many times and, hence, interpretation is typically slower than executing a compiled program.

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


But writing an interpreter is often simpler than writing a compiler and the interpreter is easier to move to a different machine (see chapter 13), so for applications where speed is not of essence, interpreters are often used.

लेकिन एक इंटरप्रेटर लिखना अक्सर एक संकलक लिखने से सरल होता है और इंटरप्रेटर को एक अलग मशीन पर ले जाना आसान होता है (अध्याय 13 देखें), इसलिए उन अनुप्रयोगों के लिए जहां गति आवश्यक नहीं है, इंटरप्रेटरों का अक्सर उपयोग किया जाता है।


Compilation and interpretation may be combined to implement a programming language.

प्रोग्रामिंग भाषा को लागू करने के लिए संकलन और व्याख्या को जोड़ा जा सकता है।


The compiler may produce intermediate-level code which is then interpreted rather than compiled to machine code.

संकलक मध्यवर्ती-स्तर का कोड उत्पन्न कर सकता है जिसे मशीन कोड में संकलित करने के बजाय व्याख्या की जाती है।


In some systems, there may even be parts of a program that are compiled to machine code, some parts that are compiled to intermediate code, which is interpreted at runtime while other parts may be kept as a syntax tree and interpreted directly.

कुछ प्रणालियों में, प्रोग्राम के ऐसे हिस्से भी हो सकते हैं जिन्हें मशीन कोड में संकलित किया जाता है, कुछ हिस्से जिन्हें मध्यवर्ती कोड में संकलित किया जाता है, जिसकी रनटाइम पर व्याख्या की जाती है जबकि अन्य भागों को सिंटैक्स ट्री के रूप में रखा जा सकता है और सीधे व्याख्या की जा सकती है।


Each choice is a compromise between speed and space: Compiled code tends to be bigger than intermediate code, which tend to be bigger than syntax, but each step of translation improves running speed.

प्रत्येक विकल्प गति और स्थान के बीच एक समझौता है: संकलित कोड मध्यवर्ती कोड से बड़ा होता है, जो सिंटैक्स से बड़ा होता है, लेकिन अनुवाद का प्रत्येक चरण रनिंग स्पीड में सुधार करता है।


Using an interpreter is also useful during program development, where it is more important to be able to test a program modification quickly rather than run the program efficiently.

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


And since interpreters do less work on the program before execution starts, they are able to start running the program more quickly.

और चूंकि इंटरप्रेटर निष्पादन शुरू होने से पहले प्रोग्राम पर कम काम करते हैं, इसलिए वे प्रोग्राम को अधिक तेज़ी से चलाना शुरू करने में सक्षम होते हैं।


Furthermore, since an interpreter works on a representation that is closer to the source code than is compiled code, error messages can be more precise and informative.

इसके अतिरिक्त, चूंकि एक इंटरप्रेटर एक ऐसे प्रतिनिधित्व पर काम करता है जो संकलित कोड की तुलना में स्रोत कोड के करीब है, त्रुटि संदेश अधिक सटीक और जानकारीपूर्ण हो सकते हैं।


We will discuss interpreters briefly in chapters 5 and 13, but they are not the main focus of this book.

हम अध्याय 5 और 13 में संक्षेप में इंटरप्रेटरों पर चर्चा करेंगे, लेकिन वे इस पुस्तक का मुख्य फोकस नहीं हैं।


Where φ is the regular expression for the empty language.

जहाँ φ खाली भाषा के लिए नियमित अभिव्यक्ति है।


Complete the definition of non-empty by replacing the occurrences of “...” in the rules above.

ऊपर दिए गए नियमों में “...” के उदाहरणों को बदलकर गैर-खाली की परिभाषा पूरी करें।


Use this definition to find non-empty(a * b * ).

इस परिभाषा का उपयोग करके non-empty(a * b * ) ज्ञात करें।


If L is a regular language, so is the set of all prefixes of strings in L.

यदि L एक नियमित भाषा है, तो L में स्ट्रिंग्स के सभी उपसर्गों का सेट भी है।


We should be able to transform a regular expression for L into a regular expression for the set of all prefixes of strings in L.

हमें L के लिए एक नियमित अभिव्यक्ति को L में स्ट्रिंग्स के सभी उपसर्गों के सेट के लिए एक नियमित अभिव्यक्ति में बदलने में सक्षम होना चाहिए।


We want to do this with a function prefixes that is recursive over the structure of the regular expression for L.

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


Where lexical analysis splits the input into tokens, the purpose of syntax analysis is to recombine these tokens.

जहां शाब्दिक विश्लेषण इनपुट को टोकन में विभाजित करता है, वाक्य रचना विश्लेषण का उद्देश्य इन टोकन को फिर से जोड़ना है।


The leaves of this tree are the tokens found by the lexical analysis.

इस पेड़ की पत्तियाँ शाब्दिक विश्लेषण द्वारा पाए गए टोकन हैं।


The syntax analysis must also reject invalid texts by reporting syntax errors.

वाक्य रचना विश्लेषण को वाक्य रचना त्रुटियों की रिपोर्ट करके अमान्य पाठों को भी अस्वीकार करना होगा।


This process is called parser generation.

इस प्रक्रिया को पार्सर जनरेशन कहा जाता है।


The notation we use for human manipulation is context-free grammars.

मानव हेरफेर के लिए हम जिस संकेतन का उपयोग करते हैं वह संदर्भ-मुक्त व्याकरण है।


Context-free grammars describe sets of strings, i.e., languages.

संदर्भ-मुक्त व्याकरण स्ट्रिंग्स के सेट, यानी भाषाओं का वर्णन करते हैं।


Each set is denoted by a name, which is called a nonterminal.

प्रत्येक सेट को एक नाम से दर्शाया जाता है, जिसे गैर-टर्मिनल कहा जाता है।


A production has the form N→X 1 ... X n.

एक उत्पादन का रूप N→X 1 ... X n है।


A→a says that the set denoted by the nonterminal A contains the one-character string a.

A→a कहता है कि गैर-टर्मिनल A द्वारा दर्शाया गया सेट एक-वर्ण स्ट्रिंग a को शामिल करता है।


We can define a grammar equivalent to the regular expression a * by the two productions.

हम दो प्रोडक्शंस द्वारा नियमित अभिव्यक्ति a * के बराबर एक व्याकरण को परिभाषित कर सकते हैं।


Productions with empty right-hand sides are called empty productions.

खाली दाहिने हाथ की तरफ वाले प्रोडक्शंस को खाली प्रोडक्शंस कहा जाता है।


Context-free grammars are, however, capable of expressing much more complex languages.

हालांकि, संदर्भ-मुक्त व्याकरण बहुत अधिक जटिल भाषाओं को व्यक्त करने में सक्षम हैं।


When several nonterminals are used, we must make it clear which of these is the start symbol.

जब कई गैर-टर्मिनलों का उपयोग किया जाता है, तो हमें यह स्पष्ट करना होगा कि इनमें से कौन सा आरंभ प्रतीक है।


Each subexpression of the regular expression is numbered and subexpressions i is assigned a nonterminal Ni.

नियमित अभिव्यक्ति के प्रत्येक उप-अभिव्यक्ति को क्रमांकित किया गया है और उप-अभिव्यक्ति i को एक गैर-टर्मिनल Ni सौंपा गया है।


At this point, it may stop reading the input or it may attempt continued lexical analysis.

इस बिंदु पर, यह इनपुट पढ़ना बंद कर सकता है या यह निरंतर शाब्दिक विश्लेषण का प्रयास कर सकता है।


The purpose of the latter approach is to try finding further lexical errors in the same input.

बाद के दृष्टिकोण का उद्देश्य एक ही इनपुट में आगे की शाब्दिक त्रुटियों को खोजने का प्रयास करना है।


Some of these subsequent errors may, however, not be real errors but may be caused by the lexer not skipping enough characters.

हालांकि, इनमें से कुछ बाद की त्रुटियां वास्तविक त्रुटियां नहीं हो सकती हैं, लेकिन लेक्सर द्वारा पर्याप्त वर्णों को न छोड़ने के कारण हो सकती हैं।


If, for example, the start of a comment is ill-formed, the lexer may try to interpret the contents of the comment as individual tokens.

उदाहरण के लिए, यदि किसी टिप्पणी की शुरुआत गलत तरीके से बनी है, तो लेक्सर टिप्पणी की सामग्री को व्यक्तिगत टोकन के रूप में व्याख्या करने का प्रयास कर सकता है।


When the lexer finds an error, the consumer of the tokens that the lexer produces can not usually itself produce a valid result.

जब लेक्सर को कोई त्रुटि मिलती है, तो लेक्सर द्वारा उत्पादित टोकन का उपभोक्ता आमतौर पर स्वयं एक वैध परिणाम उत्पन्न नहीं कर सकता है।


However, the compiler may try to find other errors in the remaining input, again allowing the user to find several errors in one edit-compile cycle.

हालांकि, कंपाइलर शेष इनपुट में अन्य त्रुटियों को खोजने का प्रयास कर सकता है, जिससे उपयोगकर्ता को एक संपादन-संकलन चक्र में कई त्रुटियां खोजने की अनुमति मिलती है।


Again, some of the subsequent errors may really be spurious errors caused by lexical error(s), so the user will have to guess at the validity of every error message except the first.

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


Nevertheless, such error recovery has, when the input is so large that restarting the lexer from the start of input incurs a considerable time overhead, proven to be an aid in productivity.

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


Less commonly, the lexer may work interactively with a text editor and restart from the point at which an error was spotted after the user has tried to fix the error.

कम सामान्यतः, लेक्सर एक टेक्स्ट एडिटर के साथ इंटरैक्टिव रूप से काम कर सकता है और उस बिंदु से पुनरारंभ कर सकता है जिस पर उपयोगकर्ता द्वारा त्रुटि को ठीक करने का प्रयास करने के बाद एक त्रुटि देखी गई थी।


A lexer generator will typically use a notation for regular expressions similar to the one described in section 2.1.

एक लेक्सर जनरेटर आमतौर पर नियमित अभिव्यक्तियों के लिए अनुभाग 2.1 में वर्णित के समान एक संकेतन का उपयोग करेगा।


For example, an*intended to match a multiplication symbol in the input is distinguished from an*used to denote repetition by quoting the*symbol, e.g. as ‘*‘.

उदाहरण के लिए, इनपुट में गुणन प्रतीक से मेल खाने के लिए एक * को दोहराव को दर्शाने के लिए उपयोग किए जाने वाले * से अलग किया जाता है, उदाहरण के लिए ‘*‘ के रूप में।


Additionally, some lexer generators extend regular expressions in various ways, e.g., allowing a set of characters to be specified by listing the characters that are not in the set.

इसके अतिरिक्त, कुछ लेक्सर जनरेटर विभिन्न तरीकों से नियमित अभिव्यक्तियों का विस्तार करते हैं, उदाहरण के लिए, उन वर्णों को सूचीबद्ध करके वर्णों के एक सेट को निर्दिष्ट करने की अनुमति देना जो सेट में नहीं हैं।


The input to the lexer generator will normally contain a list of regular expressions that each denote a token.

लेक्सर जनरेटर का इनपुट सामान्यतः नियमित अभिव्यक्तियों की एक सूची में होगा जो प्रत्येक एक टोकन को दर्शाते हैं।


Each of these regular expressions has an associated action.

इनमें से प्रत्येक नियमित अभिव्यक्ति में एक संबद्ध क्रिया होती है।


The action describes what is passed on to the consumer (e.g., the parser), typically an element from a token data type, which describes the type of token (NUM, ID, etc.) and sometimes additional information such as the value of a number token.

क्रिया वर्णन करती है कि उपभोक्ता (उदाहरण के लिए, पार्सर) को क्या पारित किया जाता है, आमतौर पर एक टोकन डेटा प्रकार का एक तत्व, जो टोकन के प्रकार (NUM, ID, आदि) का वर्णन करता है और कभी-कभी अतिरिक्त जानकारी जैसे कि एक संख्या टोकन का मान।


Normally, the lexer generator requires white-space and comments to be defined by regular expressions.

आमतौर पर, लेक्सर जनरेटर को नियमित अभिव्यक्तियों द्वारा परिभाषित व्हाइट-स्पेस और टिप्पणियों की आवश्यकता होती है।


An action can be more than just returning a token.

एक क्रिया केवल एक टोकन लौटाने से अधिक हो सकती है।


If, for example, a language has a large number of keywords, then a DFA that recognises all of these individually can be fairly large.

उदाहरण के लिए, यदि किसी भाषा में बड़ी संख्या में कीवर्ड हैं, तो एक DFA जो इन सभी को व्यक्तिगत रूप से पहचानता है, काफी बड़ा हो सकता है।


In such cases, the keywords are not described as separate regular expressions in the lexer definition but instead treated as special cases of the identifier token.

ऐसे मामलों में, कीवर्ड को लेक्सर परिभाषा में अलग नियमित अभिव्यक्तियों के रूप में वर्णित नहीं किया जाता है, बल्कि पहचानकर्ता टोकन के विशेष मामलों के रूप में माना जाता है।


A similar strategy can be used if the language allows identifiers to shadow keywords.

यदि भाषा पहचानकर्ताओं को कीवर्ड को छाया देने की अनुमति देती है तो एक समान रणनीति का उपयोग किया जा सकता है।


The program uses functions to choose productions.

यह प्रोग्राम प्रोडक्शंस चुनने के लिए कार्यों का उपयोग करता है।


A terminal on the right-hand side is matched against the next input symbol.

दाहिनी ओर का एक टर्मिनल अगले इनपुट प्रतीक से मेल खाता है।


If they match, we move on to the following input symbol.

यदि वे मेल खाते हैं, तो हम अगले इनपुट प्रतीक पर आगे बढ़ते हैं।


A nonterminal on the right-hand side is handled by calling the corresponding function.

दाहिनी ओर के एक नॉनटर्मिनल को संबंधित फ़ंक्शन को कॉल करके संभाला जाता है।


When there are no more symbols on the right-hand side, the function returns.

जब दाहिनी ओर कोई और प्रतीक नहीं होते हैं, तो फ़ंक्शन वापस आ जाता है।


We have constructed this program by the following process.

हमने इस प्रोग्राम को निम्नलिखित प्रक्रिया द्वारा बनाया है।


We have first added a production T ′ → T $ and calculated FIRST and FOLLOW.

हमने पहले एक प्रोडक्शन T ′ → T $ जोड़ा है और FIRST और FOLLOW की गणना की है।


T ′ has only one production, so the choice is trivial.

T ′ में केवल एक प्रोडक्शन है, इसलिए चुनाव तुच्छ है।


We can report an error if it is not in FIRST(T ′ ).

यदि यह FIRST(T ′ ) में नहीं है तो हम एक त्रुटि की रिपोर्ट कर सकते हैं।


For the parseT function, we look at the productions for T.

parseT फ़ंक्शन के लिए, हम T के लिए प्रोडक्शंस को देखते हैं।


Since R is also Nullable, we must choose this production also on symbols in FOLLOW(T).

चूंकि R भी Nullable है, इसलिए हमें इस प्रोडक्शन को FOLLOW(T) में प्रतीकों पर भी चुनना होगा।


On all other symbols we report an error.

अन्य सभी प्रतीकों पर हम एक त्रुटि की रिपोर्ट करते हैं।


For parseR, we must choose the empty production on symbols in FOLLOW(R).

parseR के लिए, हमें FOLLOW(R) में प्रतीकों पर खाली प्रोडक्शन चुनना होगा।


The function match takes as argument a symbol.

फ़ंक्शन मैच एक प्रतीक को तर्क के रूप में लेता है।


If they are equal, the following symbol is read into the variable next.

यदि वे बराबर हैं, तो निम्नलिखित प्रतीक को चर next में पढ़ा जाता है।


The program in figure 3.16 only checks if the input is valid.

चित्र 3.16 में प्रोग्राम केवल यह जांचता है कि इनपुट मान्य है या नहीं।


It can easily be extended to construct a syntax tree.

इसे आसानी से एक सिंटैक्स ट्री बनाने के लिए बढ़ाया जा सकता है।


In table-driven LL(1) parsing, we encode the selection of productions into a table.

टेबल-ड्रिवन LL(1) पार्सिंग में, हम प्रोडक्शंस के चयन को एक टेबल में एन्कोड करते हैं।


A simple non-recursive program uses this table and a stack to perform the parsing.

एक सरल गैर-पुनरावर्ती प्रोग्राम पार्सिंग करने के लिए इस टेबल और एक स्टैक का उपयोग करता है।


The table is cross-indexed by nonterminal and terminal.

टेबल को नॉनटर्मिनल और टर्मिनल द्वारा क्रॉस-इंडेक्स किया गया है।


Hence, the productions for a nonterminal corresponding to a particular precedence level refers only to nonterminals that correspond to the same or higher precedence levels, un- less parentheses or similar bracketing constructs disambiguate the use of these.

इसलिए, एक विशेष प्राथमिकता स्तर से संबंधित एक गैर-टर्मिनल के लिए उत्पादन केवल उन गैर-टर्मिनलों को संदर्भित करता है जो समान या उच्च प्राथमिकता स्तर से मेल खाते हैं, जब तक कि कोष्ठक या इसी तरह के कोष्ठक निर्माण इनके उपयोग को स्पष्ट नहीं करते हैं।


Grammar 3.11 shows how these rules are used to make an unambiguous version of grammar 3.2.

व्याकरण 3.11 दिखाता है कि इन नियमों का उपयोग व्याकरण 3.2 का एक स्पष्ट संस्करण बनाने के लिए कैसे किया जाता है।


Figure 3.12 show the syntax tree for2+3*4using this grammar.

चित्र 3.12 इस व्याकरण का उपयोग करके 2+3*4 के लिए सिंटैक्स ट्री दिखाता है।


Most of the potential ambiguity in grammars for programming languages comes from expression syntax and can be handled by exploiting precedence rules as shown in section 3.4.

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


Another classical example of ambiguity is the “dangling-else” prob- lem.

अस्पष्टता का एक और शास्त्रीय उदाहरण “लटकता-अन्यथा” समस्या है।


Imperative languages like Pascal or C often let the else-part of a conditional be optional, like shown in grammar 3.3.

पास्कल या सी जैसी अनिवार्य भाषाएँ अक्सर एक सशर्त के अन्यथा-भाग को वैकल्पिक होने देती हैं, जैसा कि व्याकरण 3.3 में दिखाया गया है।


The problem is that it is not clear how to 3.5. OTHER SOURCES OF AMBIGUITY67 Ex p 0 0 @ @ Ex p + Ex p2 0 0 @ @ Ex p2Ex p2 * Ex p3 Ex p3Ex p3 4 2 3 Figure 3.12: Syntax tree for2+3*4using grammar 3.11 parse, for example, if p then if q then s1 else s2 According to the grammar, theelsecan equally well match eitherif.

समस्या यह है कि यह स्पष्ट नहीं है कि कैसे 3.5. अस्पष्टता के अन्य स्रोत67 पूर्व p 0 0 @ @ पूर्व p + पूर्व p2 0 0 @ @ पूर्व p2Ex p2 * पूर्व p3 पूर्व p3Ex p3 4 2 3 चित्र 3.12: व्याकरण 3.11 का उपयोग करके 2+3*4 के लिए सिंटैक्स ट्री, उदाहरण के लिए, यदि p तो यदि q तो s1 अन्यथा s2 व्याकरण के अनुसार, अन्यथा या तो if से अच्छी तरह मेल खा सकता है।


The usual convention is that anelsematches the closest not previously matchedif, which, in the example, will make theelsematch the secondif.

सामान्य परंपरा यह है कि एक अन्यथा सबसे निकटतम से मेल खाता है जो पहले से मेल नहीं खाता है, जो, उदाहरण में, अन्यथा को दूसरे if से मेल कराएगा।


How do we make this clear in the grammar?

हम व्याकरण में इसे कैसे स्पष्ट करें?


We can treatif,thenandelse as a kind of right-associative operators, as this would make them group to the right, making anif-thenmatch the closestelse.

हम if, then और else को एक प्रकार के दाएं-सहयोगी ऑपरेटर के रूप में मान सकते हैं, क्योंकि यह उन्हें दाईं ओर समूहित करेगा, जिससे एक if-then सबसे निकटतम else से मेल खाएगा।


However, the grammar transforma- tions shown in section 3.4 can not directly be applied to grammar 3.3, as the pro- ductions for conditionals do not have the right form.

हालांकि, अनुभाग 3.4 में दिखाए गए व्याकरण परिवर्तन को सीधे व्याकरण 3.3 पर लागू नहीं किया जा सकता है, क्योंकि सशर्तों के लिए उत्पादन सही रूप में नहीं हैं।


Instead we use the following observation: When anifand anelsematch, all ifs that occur between these must have matchingelses.

इसके बजाय हम निम्नलिखित अवलोकन का उपयोग करते हैं: जब एक if और एक else मेल खाते हैं, तो इन दोनों के बीच आने वाले सभी ifs में मिलान करने वाले else होने चाहिए।


This can easily be proven by assuming otherwise and concluding that this leads to a contradiction.

इसे आसानी से अन्यथा मानकर और यह निष्कर्ष निकालकर सिद्ध किया जा सकता है कि इससे विरोधाभास होता है।


Hence, we make two nonterminals: One for matched (i.e.withelse-part) conditionals and one for unmatched (i.e.withoutelse-part) conditionals.

इसलिए, हम दो गैर-टर्मिनल बनाते हैं: एक मिलान किए गए (अर्थात, अन्यथा-भाग के साथ) सशर्तों के लिए और एक बेमेल (अर्थात, बिना अन्यथा-भाग के) सशर्तों के लिए।


परिणाम व्याकरण 3.13 में दिखाया गया है।


This grammar also resolves the associativity of semicolon (right) and the precedence ofifover semicolon.

यह व्याकरण अर्धविराम (दाएं) की साहचर्यता और अर्धविराम पर if की प्राथमिकता को भी हल करता है।


An alternative to rewriting grammars to resolve ambiguity is to use an ambigu- ous grammar and resolve conflicts by using precedence rules during parsing.

अस्पष्टता को हल करने के लिए व्याकरण को फिर से लिखने का एक विकल्प एक अस्पष्ट व्याकरण का उपयोग करना और पार्सिंग के दौरान प्राथमिकता नियमों का उपयोग करके संघर्षों को हल करना है।


All cases of ambiguity must be treated carefully: It is not enough that we elim- inate ambiguity, we must do so in a way that results in the desired structure: The structure of arithmetic expressions is significant, and it makes a difference to which ifanelseis matched.

अस्पष्टता के सभी मामलों का सावधानीपूर्वक इलाज किया जाना चाहिए: यह पर्याप्त नहीं है कि हम अस्पष्टता को समाप्त कर दें, हमें ऐसा इस तरह से करना चाहिए जो वांछित संरचना में परिणत हो: अंकगणितीय अभिव्यक्तियों की संरचना महत्वपूर्ण है, और इससे फर्क पड़ता है कि कौन सा ifanelseis मेल खाता है।


The syntax analysis phase of a compiler will take a string of tokens produced by the lexer, and from this construct a syntax tree for the string by finding a derivation of the string from the start symbol of the grammar.

एक कंपाइलर का सिंटैक्स विश्लेषण चरण लेक्सर द्वारा निर्मित टोकन की एक स्ट्रिंग लेगा, और इससे व्याकरण के प्रारंभिक प्रतीक से स्ट्रिंग का व्युत्पन्न ढूंढकर स्ट्रिंग के लिए एक सिंटैक्स ट्री का निर्माण करेगा।


This can be done by guessing derivations until the right one is found, but ran- dom guessing is hardly an effective method.

यह व्युत्पन्न का अनुमान लगाकर किया जा सकता है जब तक कि सही एक न मिल जाए, लेकिन यादृच्छिक अनुमान मुश्किल से एक प्रभावी तरीका है।


Adding the epsilon transitions as arrows in figure 3.26 would produce a very cluttered picture.

चित्र 3.26 में एप्सिलॉन संक्रमणों को तीर के रूप में जोड़ने से एक बहुत ही अस्त-व्यस्त चित्र बनेगा।


But this is for presentation purposes only: The transitions have the same meaning regardless of whether they are shown in the picture of the DFA or in the table.

लेकिन यह केवल प्रस्तुति के उद्देश्यों के लिए है: संक्रमणों का वही अर्थ है चाहे वे DFA के चित्र में दिखाए गए हों या तालिका में।


Together with these epsilon-transitions, the NFAs in figure 3.26 form a single, combined NFA.

इन एप्सिलॉन-संक्रमणों के साथ, चित्र 3.26 में NFAs एक एकल, संयुक्त NFA बनाते हैं।


We must now convert this NFA into a DFA using the subset construction shown in section 2.5.

अब हमें इस NFA को खंड 2.5 में दिखाए गए सबसेट निर्माण का उपयोग करके DFA में बदलना होगा।


Instead of showing the resulting DFA graphically, we construct a table where transitions on terminals are shown as shift actions and transitions on nonterminals as go actions.

परिणामी DFA को ग्राफिक रूप से दिखाने के बजाय, हम एक तालिका बनाते हैं जहाँ टर्मिनलों पर संक्रमणों को शिफ्ट क्रियाओं के रूप में और गैर-टर्मिनलों पर संक्रमणों को गो क्रियाओं के रूप में दिखाया जाता है।


Figure 3.28 shows the DFA constructed from the NFA made by adding epsilon-transitions in 3.27 to figure 3.26.

चित्र 3.28 चित्र 3.26 में 3.27 में एप्सिलॉन-संक्रमणों को जोड़कर बनाए गए NFA से निर्मित DFA को दर्शाता है।


The sets of NFA states that form each DFA state is shown in the second column of the table in figure 3.28.

प्रत्येक DFA स्थिति बनाने वाले NFA राज्यों के सेट को चित्र 3.28 में तालिका के दूसरे कॉलम में दिखाया गया है।


We will need these below for adding reduce and accept actions, but once this is done, we will not need them anymore, so we can remove them from the final table.

हमें कम करने और स्वीकार करने की क्रियाओं को जोड़ने के लिए इनकी आवश्यकता होगी, लेकिन एक बार यह हो जाने के बाद, हमें इनकी अब और आवश्यकता नहीं होगी, इसलिए हम उन्हें अंतिम तालिका से हटा सकते हैं।


To add reduce and accept actions, we first need to compute the FOLLOW sets for each nonterminal, as described in section 3.10.

कम करने और स्वीकार करने की क्रियाओं को जोड़ने के लिए, हमें पहले प्रत्येक गैर-टर्मिनल के लिए FOLLOW सेट की गणना करने की आवश्यकता है, जैसा कि खंड 3.10 में वर्णित है।


For purpose of calculating FOLLOW, we add yet another extra start production: T ′′ → T ′ $ , to handle end-of-text conditions as described in section 3.10.

FOLLOW की गणना के उद्देश्य से, हम एक और अतिरिक्त प्रारंभ उत्पादन जोड़ते हैं: T ′′ → T ′ $ , खंड 3.10 में वर्णित पाठ-अंत स्थितियों को संभालने के लिए।


This gives us the following result: FOLLOW(T ′ ) ={$} FOLLOW(T) ={c,$} FOLLOW(R) ={c,$}

यह हमें निम्नलिखित परिणाम देता है: FOLLOW(T ′ ) ={$} FOLLOW(T) ={c,$} FOLLOW(R) ={c,$}


We then add reduce actions by the following rule: If a DFA states contains the accepting NFA state for a production p: N→α, we add reduce p as action to son 94CHAPTER 3.

फिर हम निम्नलिखित नियम द्वारा कम करने की क्रियाएँ जोड़ते हैं: यदि एक DFA स्थिति में एक उत्पादन p: N→α के लिए स्वीकार करने वाली NFA स्थिति है, तो हम क्रिया के रूप में कम p जोड़ते हैं।


Reduction on production 0 (the extra start production that was added before constructing the NFA) is written as accept.

उत्पादन 0 पर कमी (अतिरिक्त प्रारंभ उत्पादन जिसे NFA बनाने से पहले जोड़ा गया था) को स्वीकार के रूप में लिखा गया है।


In figure 3.28, state 0 contains NFA state I, which accepts production 3.

चित्र 3.28 में, स्थिति 0 में NFA स्थिति I है, जो उत्पादन 3 को स्वीकार करती है।


Hence, we add r3 as actions at the symbols c and $ (as these are in FOLLOW(R)).

इसलिए, हम प्रतीकों c और $ पर r3 को क्रियाओं के रूप में जोड़ते हैं (क्योंकि ये FOLLOW(R) में हैं)।


State 1 contains NFA state B, which accepts production 0.

स्थिति 1 में NFA स्थिति B है, जो उत्पादन 0 को स्वीकार करती है।


We add this at the symbol $ (FOLLOW(T ′ )).

हम इसे प्रतीक $ (FOLLOW(T ′ )) पर जोड़ते हैं।


As noted above, this is written as accept (abbreviated to “a”).

जैसा कि ऊपर उल्लेख किया गया है, इसे स्वीकार के रूप में लिखा गया है (संक्षेप में “a”)।


In the same way, we add reduce actions to state 3, 4, 6 and 7.

इसी तरह, हम स्थिति 3, 4, 6 और 7 में कम करने की क्रियाएँ जोड़ते हैं।


परिणाम चित्र 3.22 में दिखाया गया है।


Deterministic context-free languages can be recognized by LR parsers.

निश्चित संदर्भ-मुक्त भाषाओं को एलआर पार्सर द्वारा पहचाना जा सकता है।


Context-free languages are capable of such counting, essentially using the stack for this purpose.

संदर्भ-मुक्त भाषाएँ इस तरह की गिनती करने में सक्षम हैं, अनिवार्य रूप से इस उद्देश्य के लिए स्टैक का उपयोग करती हैं।


Even so, there are limitations: A context-free language can only keep count of one thing at a time.

फिर भी, सीमाएँ हैं: एक संदर्भ-मुक्त भाषा एक समय में केवल एक चीज की गिनती रख सकती है।


Context-free languages are, as regular languages, closed under union.

संदर्भ-मुक्त भाषाएँ, नियमित भाषाओं की तरह, संघ के अंतर्गत बंद हैं।


Context-free languages are also closed under prefix, suffix, subsequence and reversal.

संदर्भ-मुक्त भाषाएँ उपसर्ग, प्रत्यय, उप-अनुक्रम और उत्क्रमण के अंतर्गत भी बंद हैं।


However, context-free languages are not closed under intersection or complement.

हालांकि, संदर्भ-मुक्त भाषाएँ प्रतिच्छेदन या पूरक के अंतर्गत बंद नहीं हैं।


Context-free grammars were first proposed as a notation for describing natural languages.

संदर्भ-मुक्त व्याकरण को पहली बार प्राकृतिक भाषाओं का वर्णन करने के लिए एक संकेतन के रूप में प्रस्तावित किया गया था।


The qualifier “context-free” distinguishes this notation from the other two grammar notations.

क्वालीफायर “संदर्भ-मुक्त” इस संकेतन को अन्य दो व्याकरण नोटेशन से अलग करता है।


In context-free grammars, derivation of a nonterminal is independent of the context.

संदर्भ-मुक्त व्याकरण में, एक गैर-टर्मिनल का व्युत्पन्न संदर्भ से स्वतंत्र होता है।


Context-free grammars are actually too weak to describe natural languages.

संदर्भ-मुक्त व्याकरण वास्तव में प्राकृतिक भाषाओं का वर्णन करने के लिए बहुत कमजोर हैं।


Since then, variants of this notation has been used for defining or describing almost all programming languages.

तब से, इस संकेतन के वेरिएंट का उपयोग लगभग सभी प्रोग्रामिंग भाषाओं को परिभाषित या वर्णित करने के लिए किया गया है।


Most parser generators are based on LALR(1) parsing, but a few use LL(1) parsing.

अधिकांश पार्सर जनरेटर LALR(1) पार्सिंग पर आधारित हैं, लेकिन कुछ LL(1) पार्सिंग का उपयोग करते हैं।


“The Dragon Book” tells more about parsing methods than the present book.

“द ड्रैगन बुक” वर्तमान पुस्तक की तुलना में पार्सिंग विधियों के बारे में अधिक जानकारी देती है।


Several textbooks describe properties of context-free languages.

कई पाठ्यपुस्तकें संदर्भ-मुक्त भाषाओं के गुणों का वर्णन करती हैं।


The methods presented here for rewriting grammars based on operator precedence uses only infix operators.

ऑपरेटर प्राथमिकता के आधार पर व्याकरण को फिर से लिखने के लिए यहां प्रस्तुत विधियां केवल इनफिक्स ऑपरेटर का उपयोग करती हैं।


If prefix or postfix operators have higher precedence than all infix operators, the method presented here will work.

यदि उपसर्ग या पोस्टफिक्स ऑपरेटरों की प्राथमिकता सभी इनफिक्स ऑपरेटरों से अधिक है, तो यहां प्रस्तुत विधि काम करेगी।


A method for handling arbitrary precedences of infix, prefix and postfix operators is presented in [1].

[1] में इनफिक्स, प्रीफिक्स और पोस्टफिक्स ऑपरेटरों की मनमानी प्राथमिकता को संभालने की एक विधि प्रस्तुत की गई है।


Draw a third, different syntax tree for aabbbcc using the same grammar.

उसी व्याकरण का उपयोग करके aabbbcc के लिए एक तीसरा, अलग सिंटैक्स ट्री बनाएं।


Write an unambiguous grammar for the language of balanced parentheses.

संतुलित कोष्ठकों की भाषा के लिए एक अस्पष्ट व्याकरण लिखें।


After lexing and parsing, we have the abstract syntax tree of a program as a data structure in memory.

लेक्सिंग और पार्सिंग के बाद, हमारे पास मेमोरी में एक डेटा संरचना के रूप में एक प्रोग्राम का अमूर्त सिंटैक्स ट्री है।


The simplest way to execute a program is interpretation.

किसी प्रोग्राम को चलाने का सबसे सरल तरीका व्याख्या है।


Interpretation is done by a program called an interpreter.

व्याख्या एक प्रोग्राम द्वारा की जाती है जिसे व्याख्याकार कहा जाता है।


This is similar to how a human evaluates a mathematical expression.

यह उसी तरह है जैसे कोई इंसान गणितीय अभिव्यक्ति का मूल्यांकन करता है।


We insert the values of variables in the expression and evaluate it bit by bit.

हम अभिव्यक्ति में चरों के मान डालते हैं और इसे बिट बाय बिट मूल्यांकित करते हैं।


An interpreter will keep the formula unchanged and use a symbol table.

एक व्याख्याकार सूत्र को अपरिवर्तित रखेगा और एक प्रतीक तालिका का उपयोग करेगा।


The interpreter is a function that takes an abstract syntax tree and a symbol table.

व्याख्याकार एक ऐसा फ़ंक्शन है जो एक अमूर्त वाक्य रचना वृक्ष और एक प्रतीक तालिका लेता है।


The function can call itself recursively on parts of the abstract syntax tree.

फ़ंक्शन अमूर्त वाक्य रचना वृक्ष के भागों पर स्वयं को पुनरावर्ती रूप से कॉल कर सकता है।


This process can be extended to also handle statements and declarations.

इस प्रक्रिया को कथनों और घोषणाओं को संभालने के लिए भी बढ़ाया जा सकता है।


Some input and output may be done as side effects by the interpreter.

कुछ इनपुट और आउटपुट व्याख्याकार द्वारा साइड इफेक्ट के रूप में किए जा सकते हैं।


We will in this chapter assume that the symbol tables are persistent.

हम इस अध्याय में मान लेंगे कि प्रतीक तालिकाएँ स्थायी हैं।


An intepreter will typically consist of one function per syntactic category.

एक व्याख्याकार में आमतौर पर प्रत्येक वाक्य रचना श्रेणी के लिए एक फ़ंक्शन होगा।


Each function will take as arguments an abstract syntax tree.

प्रत्येक फ़ंक्शन तर्क के रूप में एक अमूर्त वाक्य रचना वृक्ष लेगा।


Each function will return one or more results.

प्रत्येक फ़ंक्शन एक या अधिक परिणाम लौटाएगा।


The functions can be implemented in any language.

फ़ंक्शन को किसी भी भाषा में लागू किया जा सकता है।


Eventually, we will need to either have an interpreter written in machine language.

अंततः, हमें या तो मशीन भाषा में लिखा गया एक व्याख्याकार चाहिए होगा।


We will use a small (somewhat contrived) language to show the principles of interpretation.

हम व्याख्या के सिद्धांतों को दिखाने के लिए एक छोटी (कुछ हद तक मनगढ़ंत) भाषा का उपयोग करेंगे।


The language is a first-order functional language with recursive definitions.

भाषा पुनरावर्ती परिभाषाओं के साथ एक प्रथम-क्रम कार्यात्मक भाषा है।


वाक्य रचना व्याकरण 5.1 में दी गई है।


In the example language, a program is a list of function declarations.

उदाहरण भाषा में, एक प्रोग्राम फ़ंक्शन घोषणाओं की एक सूची है।


Execution of the program is by calling this function with the input.

प्रोग्राम का निष्पादन इस फ़ंक्शन को इनपुट के साथ कॉल करके किया जाता है।


The compiler translates high-level code into machine code.

कम्पाइलर उच्च-स्तरीय कोड को मशीन कोड में अनुवादित करता है।


Type checking ensures that the program's data types are used correctly.

टाइप जाँच यह सुनिश्चित करती है कि प्रोग्राम के डेटा प्रकारों का सही ढंग से उपयोग किया जाता है।


Static typing involves checking types during compilation, before the program runs.

स्थैतिक टाइपिंग में संकलन के दौरान, प्रोग्राम चलने से पहले, प्रकारों की जाँच करना शामिल है।


Dynamic typing checks types during program execution.

डायनामिक टाइपिंग प्रोग्राम के निष्पादन के दौरान प्रकारों की जाँच करता है।


The symbol table stores information about variables and functions.

सिंबल टेबल चर और कार्यों के बारे में जानकारी संग्रहीत करता है।


Attributes of the syntax tree are used during the checking phase.

जाँच चरण के दौरान वाक्य रचना वृक्ष के गुणों का उपयोग किया जाता है।


Synthesized attributes are passed upwards in the syntax tree.

संश्लेषित गुण वाक्य रचना वृक्ष में ऊपर की ओर पारित किए जाते हैं।


Inherited attributes are passed downwards in the syntax tree.

विरासत में मिले गुण वाक्य रचना वृक्ष में नीचे की ओर पारित किए जाते हैं।


The compiler uses intermediate code as a stepping stone.

कम्पाइलर एक कदम के रूप में मध्यवर्ती कोड का उपयोग करता है।


Overloading allows the same name for different operations.

ओवरलोडिंग विभिन्न कार्यों के लिए एक ही नाम की अनुमति देता है।


Type conversion can be explicit or implicit.

टाइप रूपांतरण स्पष्ट या अंतर्निहित हो सकता है।


Polymorphism allows functions to work with multiple types.

बहुलकत्व कार्यों को कई प्रकारों के साथ काम करने की अनुमति देता है।


Type inference algorithms deduce variable types.

टाइप अनुमान एल्गोरिदम चर प्रकारों का अनुमान लगाते हैं।


प्रोग्राम की बिल्कुल भी जाँच नहीं की जाती है।


For example, C is a statically typed language.

उदाहरण के लिए, C एक स्थैतिक रूप से टाइप की गई भाषा है।


You can store an integer in a union-typed variable.

आप एक यूनियन-टाइप वाले चर में एक पूर्णांक संग्रहीत कर सकते हैं।


Javascript performs a dynamic check and conversion.

जावास्क्रिप्ट एक गतिशील जाँच और रूपांतरण करता है।


The language silently does something that probably makes no sense.

भाषा चुपचाप कुछ ऐसा करती है जिसका शायद कोई मतलब नहीं है।


The checking phase operates on the abstract syntax tree.

जाँच चरण अमूर्त वाक्य रचना वृक्ष पर संचालित होता है।


We will focus on type checking in this chapter.

हम इस अध्याय में टाइप जाँच पर ध्यान केंद्रित करेंगे।


If translation is done directly, the number of compilers is equal to the product of the number of languages and the number of machines.

यदि अनुवाद सीधे किया जाता है, तो संकलकों की संख्या भाषाओं की संख्या और मशीनों की संख्या के गुणनफल के बराबर होती है।


If a common intermediate language is used, one front-end is needed for every language and one back-end is needed for each machine.

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


This way, there is no need to write a separate back-end for each machine.

इस तरह, प्रत्येक मशीन के लिए एक अलग बैक-एंड लिखने की आवश्यकता नहीं है।


The advantages of this approach are: No actual back-end needs to be written for each new machine.

इस दृष्टिकोण के लाभ हैं: प्रत्येक नई मशीन के लिए कोई वास्तविक बैक-एंड लिखने की आवश्यकता नहीं है।


A compiled program can be distributed in a single intermediate form for all machines.

एक संकलित प्रोग्राम को सभी मशीनों के लिए एक ही मध्यवर्ती रूप में वितरित किया जा सकता है।


The intermediate form may be more compact than machine code.

मध्यवर्ती रूप मशीन कोड की तुलना में अधिक संक्षिप्त हो सकता है।


Interpreting the intermediate form will in most cases be a lot slower than executing translated code directly.

मध्यवर्ती रूप की व्याख्या अधिकांश मामलों में सीधे अनुवादित कोड को निष्पादित करने की तुलना में बहुत धीमी होगी।


Nevertheless, the approach has seen some success, e.g., with Java.

फिर भी, इस दृष्टिकोण को कुछ सफलता मिली है, उदाहरण के लिए, जावा के साथ।


Some of the speed penalty can be eliminated by translating the intermediate code to machine code immediately before or during execution of the program.

कुछ गति दंड को प्रोग्राम के निष्पादन से ठीक पहले या उसके दौरान मध्यवर्ती कोड को मशीन कोड में अनुवाद करके समाप्त किया जा सकता है।


This hybrid form is called just-in-time compilation and is often used for executing the intermediate code for Java.

इस संकर रूप को जस्ट-इन-टाइम संकलन कहा जाता है और इसका उपयोग अक्सर जावा के लिए मध्यवर्ती कोड को निष्पादित करने के लिए किया जाता है।


We will in this book, however, focus mainly on using the intermediate code for traditional compilation.

हालांकि, हम इस पुस्तक में मुख्य रूप से पारंपरिक संकलन के लिए मध्यवर्ती कोड का उपयोग करने पर ध्यान केंद्रित करेंगे।


An intermediate language should, ideally, have the following properties: It should be easy to translate from a high-level language to the intermediate language.

एक मध्यवर्ती भाषा में, आदर्श रूप से, निम्नलिखित गुण होने चाहिए: उच्च-स्तरीय भाषा से मध्यवर्ती भाषा में अनुवाद करना आसान होना चाहिए।


It should be easy to translate from the intermediate language to machine code.

मध्यवर्ती भाषा से मशीन कोड में अनुवाद करना आसान होना चाहिए।


The intermediate format should be suitable for optimisations.

मध्यवर्ती प्रारूप अनुकूलन के लिए उपयुक्त होना चाहिए।


A solution that may reduce the translation burden, though it does not address the other problems, is to have two intermediate levels.

एक समाधान जो अनुवाद के बोझ को कम कर सकता है, हालांकि यह अन्य समस्याओं का समाधान नहीं करता है, वह है दो मध्यवर्ती स्तर रखना।


When the intermediate format is shared between many compilers, it makes sense to do as many optimisations as possible on the intermediate format.

जब मध्यवर्ती प्रारूप कई संकलकों के बीच साझा किया जाता है, तो मध्यवर्ती प्रारूप पर यथासंभव अधिक से अधिक अनुकूलन करना समझ में आता है।


Another thing to consider when choosing an intermediate language is the “granularity”.

मध्यवर्ती भाषा चुनते समय विचार करने योग्य एक और बात है “बारीकी”।


Should an operation in the intermediate language correspond to a large amount of work or to a small amount of work?

क्या मध्यवर्ती भाषा में एक ऑपरेशन को बड़ी मात्रा में काम या थोड़ी मात्रा में काम के अनुरूप होना चाहिए?


The first of these approaches is often used when the intermediate language is interpreted.

इन दृष्टिकोणों में से पहला अक्सर तब उपयोग किया जाता है जब मध्यवर्ती भाषा की व्याख्या की जाती है।


हम अध्याय 8 में इस पर वापस आएंगे।


The compiler allocates memory for variables.

संकलक चर के लिए स्मृति आवंटित करता है।


Arrays can be allocated statically or dynamically.

एरे को स्थैतिक या गतिशील रूप से आवंटित किया जा सकता है।


The base address of the array is a compile-time constant.

एरे का आधार पता संकलन समय का स्थिरांक है।


Dynamic allocation can be done in several ways.

गतिशील आवंटन कई तरीकों से किया जा सकता है।


We will briefly discuss how such can be implemented.

हम संक्षेप में चर्चा करेंगे कि इसे कैसे लागू किया जा सकता है।


लेबल एक प्रतीक तालिका में संग्रहीत किए जाते हैं।


A jump to a label will generate a GOTO statement.

एक लेबल पर जंप एक GOTO स्टेटमेंट उत्पन्न करेगा।


The scope of labels can be controlled by the symbol table.

लेबल के दायरे को प्रतीक तालिका द्वारा नियंत्रित किया जा सकता है।


Some languages allow exiting loops from the middle.

कुछ भाषाएँ लूप से बीच से बाहर निकलने की अनुमति देती हैं।


C’s continue statement jumps to the start of the current loop.

सी का कंटिन्यू स्टेटमेंट वर्तमान लूप की शुरुआत में कूदता है।


A case-statement evaluates an expression.

एक केस-स्टेटमेंट एक अभिव्यक्ति का मूल्यांकन करता है।


We will now look at how these can be translated.

अब हम देखेंगे कि इनका अनुवाद कैसे किया जा सकता है।


Floating-point values are stored in a different set of registers.

फ्लोटिंग-पॉइंट मान रजिस्टरों के एक अलग सेट में संग्रहीत किए जाते हैं।


We extend our example language with one-dimensional arrays.

हम अपने उदाहरण भाषा को एक-आयामी एरे के साथ विस्तारित करते हैं।


Most modern computers are byte-addressed.

अधिकांश आधुनिक कंप्यूटर बाइट-एड्रेस्ड हैं।


The index used to access array elements must be multiplied.

एरे तत्वों तक पहुंचने के लिए उपयोग किए जाने वाले इंडेक्स को गुणा किया जाना चाहिए।


We use a translation function Trans Index for array elements.

हम एरे तत्वों के लिए एक अनुवाद फ़ंक्शन ट्रांस इंडेक्स का उपयोग करते हैं।


Dynamic allocation can also be done globally.

गतिशील आवंटन वैश्विक स्तर पर भी किया जा सकता है।


Multi-dimensional arrays can be laid out in memory in two ways.

बहु-आयामी एरे को दो तरीकों से मेमोरी में रखा जा सकता है।


We extend the grammar for array-elements to accommodate multi-dimensional arrays.

हम बहु-आयामी एरे को समायोजित करने के लिए एरे-तत्वों के लिए व्याकरण का विस्तार करते हैं।


आज धूप बहुत तेज चमक रही है।


क्या आप कृपया मुझे नमक दे सकते हैं?


I am going to the market to buy some vegetables.

मैं कुछ सब्जियां खरीदने के लिए बाजार जा रहा हूँ।


The company announced a new product launch.

कंपनी ने एक नए उत्पाद के लॉन्च की घोषणा की।


The research team is working on a new algorithm.

अनुसंधान टीम एक नए एल्गोरिदम पर काम कर रही है।


He is a very talented musician and composer.

वह एक बहुत ही प्रतिभाशाली संगीतकार और रचनाकार हैं।


The government implemented new economic policies.

सरकार ने नई आर्थिक नीतियां लागू कीं।


The data analysis revealed significant trends.

डेटा विश्लेषण ने महत्वपूर्ण रुझानों का खुलासा किया।


She is fluent in several foreign languages.

वह कई विदेशी भाषाओं में धाराप्रवाह है।


The complex equation required multiple iterations.

जटिल समीकरण के लिए कई पुनरावृत्तियों की आवश्यकता थी।


The philosophical debate explored existentialism.

दार्शनिक बहस ने अस्तित्ववाद का पता लगाया।


The intricate design of the building was impressive.

इमारत का जटिल डिज़ाइन प्रभावशाली था।


The implications of the treaty were far-reaching.

संधि के निहितार्थ दूरगामी थे।


The algorithm's efficiency was optimized through parallel processing.

समानांतर प्रसंस्करण के माध्यम से एल्गोरिदम की दक्षता को अनुकूलित किया गया था।


The nuances of the argument were difficult to grasp.

तर्क की बारीकियों को समझना मुश्किल था।


The economic downturn had a cascading effect on various sectors.

आर्थिक मंदी का विभिन्न क्षेत्रों पर व्यापक प्रभाव पड़ा।


The quantum physics experiment yielded unexpected results.

क्वांटम भौतिकी के प्रयोग से अप्रत्याशित परिणाम मिले।


The subtle interplay of light and shadow created a dramatic effect.

प्रकाश और छाया के सूक्ष्म अंतःक्रिया ने एक नाटकीय प्रभाव पैदा किया।


The intricate details of the historical event were meticulously documented.

ऐतिहासिक घटना के जटिल विवरणों को सावधानीपूर्वक प्रलेखित किया गया था।


The complex interplay of variables made the prediction challenging.

चरों की जटिल अंतःक्रिया ने भविष्यवाणी को चुनौतीपूर्ण बना दिया।


आज धूप बहुत तेज चमक रही है।


क्या आप कृपया मुझे नमक दे सकते हैं?


I am going to the market to buy some vegetables.


The company announced record profits this quarter.

कंपनी ने इस तिमाही में रिकॉर्ड मुनाफे की घोषणा की।


The government is implementing new policies to boost the economy.

सरकार अर्थव्यवस्था को बढ़ावा देने के लिए नई नीतियां लागू कर रही है।


The research team is working on a new drug for cancer treatment.

अनुसंधान टीम कैंसर के इलाज के लिए एक नई दवा पर काम कर रही है।


Despite the challenges, they persevered and achieved their goals.

चुनौतियों के बावजूद, उन्होंने हार नहीं मानी और अपने लक्ष्यों को प्राप्त किया।


The algorithm efficiently sorts the data.

एल्गोरिदम कुशलता से डेटा को सॉर्ट करता है।


The complexities of international trade agreements are often underestimated.

अंतर्राष्ट्रीय व्यापार समझौतों की जटिलताओं को अक्सर कम करके आंका जाता है।


The philosophical implications of artificial intelligence are vast and far-reaching.

कृत्रिम बुद्धिमत्ता के दार्शनिक निहितार्थ विशाल और दूरगामी हैं।


The intricate details of the quantum physics experiment were meticulously documented.

क्वांटम भौतिकी प्रयोग के जटिल विवरणों को सावधानीपूर्वक प्रलेखित किया गया था।


The economic downturn has significantly impacted the global markets.

आर्थिक मंदी ने वैश्विक बाजारों पर महत्वपूर्ण प्रभाव डाला है।


The artist's innovative techniques revolutionized the art world.

कलाकार की नवीन तकनीकों ने कला जगत में क्रांति ला दी।


The software update includes several bug fixes and performance enhancements.

सॉफ्टवेयर अपडेट में कई बग फिक्स और प्रदर्शन संवर्द्धन शामिल हैं।


The negotiations reached an impasse due to irreconcilable differences.

असमाधेय मतभेदों के कारण बातचीत गतिरोध पर पहुँच गई।


The implications of climate change are becoming increasingly evident.

जलवायु परिवर्तन के निहितार्थ तेजी से स्पष्ट होते जा रहे हैं।


The company is exploring new avenues for sustainable development.

कंपनी टिकाऊ विकास के लिए नए रास्ते तलाश रही है।


The complex interplay of factors contributed to the crisis.

कारकों की जटिल अंतःक्रिया ने संकट में योगदान दिया।


The scientific community is constantly seeking new discoveries.

वैज्ञानिक समुदाय लगातार नई खोजों की तलाश में है।


The project's success hinged on meticulous planning and execution.

परियोजना की सफलता सावधानीपूर्वक योजना और निष्पादन पर निर्भर थी।


The algorithm's efficiency depends on the number of nodes with fewer than N edges.

एल्गोरिदम की दक्षता उन नोड्स की संख्या पर निर्भर करती है जिनमें N से कम किनारे हैं।


If a node has fewer than N edges, it's placed on the stack.

यदि किसी नोड में N से कम किनारे हैं, तो उसे स्टैक पर रखा जाता है।


The graph can be colored with two colors even if all nodes have two neighbors.

ग्राफ को दो रंगों से रंगा जा सकता है, भले ही सभी नोड्स के दो पड़ोसी हों।


The algorithm uses an optimistic coloring heuristic.

एल्गोरिदम एक आशावादी रंग भरने वाले अनुमान का उपयोग करता है।


If no node has fewer than N edges, any node is picked.

यदि किसी भी नोड में N से कम किनारे नहीं हैं, तो किसी भी नोड को चुना जाता है।


The select phase assigns a color to the node.

चयन चरण नोड को एक रंग निर्दिष्ट करता है।


If coloring fails, the node is marked for spilling.

यदि रंग भरना विफल हो जाता है, तो नोड को स्पिलिंग के लिए चिह्नित किया जाता है।


The algorithm attempts to find a color different from the connected nodes.

एल्गोरिदम जुड़े हुए नोड्स से अलग रंग खोजने का प्रयास करता है।


Spilling is necessary if the select phase cannot find a color.

स्पिलिंग आवश्यक है यदि चयन चरण कोई रंग नहीं ढूंढ पाता है।


स्पिल्ड चर मेमोरी में रहते हैं।


The program is rewritten after variables are spilled.

चरों के स्पिल होने के बाद प्रोग्राम को फिर से लिखा जाता है।


Register allocation is redone after spilling.

स्पिलिंग के बाद रजिस्टर आवंटन को फिर से किया जाता है।


Additional spilled variables may be generated.

अतिरिक्त स्पिल्ड चर उत्पन्न हो सकते हैं।


The CALL instruction can use an unbounded number of variables.

कॉल निर्देश असीमित संख्या में चरों का उपयोग कर सकता है।


We will look at this issue in chapter 10.

हम इस मुद्दे पर अध्याय 10 में विचार करेंगे।


The stack is used for storing and loading variables.

स्टैक का उपयोग चरों को संग्रहीत और लोड करने के लिए किया जाता है।


Activation records are used for each function invocation.

प्रत्येक फ़ंक्शन आह्वान के लिए सक्रियण रिकॉर्ड का उपयोग किया जाता है।


The layout of activation records is standardized.

सक्रियण रिकॉर्ड का लेआउट मानकीकृत है।


The prologue reads parameters from the activation record.

प्रोलॉग सक्रियण रिकॉर्ड से पैरामीटर पढ़ता है।


एपिलॉग रिटर्न वैल्यू को संग्रहीत करता है।


The company announced a new product launch.

कंपनी ने एक नए उत्पाद के लॉन्च की घोषणा की।


क्या आप कृपया मुझे नमक दे सकते हैं?


आज मौसम बहुत सुहावना है।


He is studying computer science at the university.

वह विश्वविद्यालय में कंप्यूटर विज्ञान की पढ़ाई कर रहा है।


The government is implementing new policies to boost the economy.

सरकार अर्थव्यवस्था को बढ़ावा देने के लिए नई नीतियाँ लागू कर रही है।


The algorithm efficiently sorts the data.

एल्गोरिदम कुशलता से डेटा को सॉर्ट करता है।


Despite the challenges, they persevered and succeeded.

चुनौतियों के बावजूद, उन्होंने हार नहीं मानी और सफलता प्राप्त की।


The research paper explores the impact of climate change.

शोध पत्र जलवायु परिवर्तन के प्रभाव की पड़ताल करता है।


The software update includes several bug fixes and performance improvements.

सॉफ्टवेयर अपडेट में कई बग फिक्स और प्रदर्शन सुधार शामिल हैं।


The intricate design of the building is a marvel of modern architecture.

इमारत का जटिल डिज़ाइन आधुनिक वास्तुकला का एक अजूबा है।


The economic forecast predicts a period of sustained growth.

आर्थिक पूर्वानुमान सतत विकास की अवधि की भविष्यवाणी करता है।


The complex equation required advanced mathematical techniques to solve.

जटिल समीकरण को हल करने के लिए उन्नत गणितीय तकनीकों की आवश्यकता थी।


The philosophical debate centered on the nature of consciousness.

दार्शनिक बहस चेतना की प्रकृति पर केंद्रित थी।


The company's innovative approach disrupted the industry.

कंपनी के नवीन दृष्टिकोण ने उद्योग को बाधित कर दिया।


The implications of the new scientific discovery are far-reaching.

नई वैज्ञानिक खोज के निहितार्थ दूरगामी हैं।


The artist's evocative use of color created a powerful emotional response.

कलाकार के रंग के मार्मिक उपयोग ने एक शक्तिशाली भावनात्मक प्रतिक्रिया उत्पन्न की।


The political landscape is constantly shifting due to various factors.

विभिन्न कारकों के कारण राजनीतिक परिदृश्य लगातार बदल रहा है।


The intricate details of the ancient artifact revealed much about the civilization.

प्राचीन कलाकृति के जटिल विवरण ने सभ्यता के बारे में बहुत कुछ उजागर किया।


The team's collaborative efforts led to a breakthrough in the project.

टीम के सहयोगात्मक प्रयासों से परियोजना में एक सफलता मिली।


The complex interplay of economic forces shaped the global market.

आर्थिक शक्तियों की जटिल अंतःक्रिया ने वैश्विक बाजार को आकार दिया।


नमस्ते, आप कैसे हैं?


समाचार में एक बड़े भूकंप की खबर दी गई।


कृपया अपना नाम और पता प्रदान करें।


कंपनी नया सॉफ्टवेयर विकसित कर रही है।


I am going to the market to buy groceries.

मैं बाज़ार जा रहा हूँ किराने का सामान खरीदने के लिए।


शोध पत्र डेटा का विश्लेषण करता है।


क्या आप कृपया उसे दोहरा सकते हैं?


सरकार ने नई नीतियों की घोषणा की।


आज मौसम बहुत सुहावना है।


The algorithm efficiently sorts the elements.

एल्गोरिदम कुशलता से तत्वों को छाँटता है।


मुझे दिल्ली के लिए एक उड़ान बुक करनी है।


The economic situation is improving slowly.

आर्थिक स्थिति धीरे-धीरे सुधर रही है।


आपका पसंदीदा शौक क्या है?


The company's profits increased significantly.

कंपनी का मुनाफा काफी बढ़ गया।


बैठक दोपहर 2 बजे शुरू होगी।


The complex system requires careful design.

जटिल प्रणाली को सावधानीपूर्वक डिज़ाइन की आवश्यकता है।


क्या आप इस समस्या में मेरी मदद कर सकते हैं?


राजनीतिक बहस बहुत गरमागरम थी।


मुझे खाली समय में किताबें पढ़ना पसंद है।


The software update includes new features and bug fixes.

सॉफ्टवेयर अपडेट में नई सुविधाएँ और बग फिक्स शामिल हैं।


First, all registers that can be used to hold variables are stored in the frame.

सबसे पहले, सभी रजिस्टरों को जो चर को रखने के लिए इस्तेमाल किए जा सकते हैं, फ्रेम में संग्रहीत किया जाता है।


In figure 10.3, R0-Rk are assumed to hold variables.

चित्र 10.3 में, यह माना जाता है कि R0-Rk चर को रखते हैं।


These are stored in the activation record just above the calling function’s own incoming parameters.

इन्हें सक्रियण रिकॉर्ड में संग्रहीत किया जाता है, जो कॉलिंग फ़ंक्शन के स्वयं के आने वाले मापदंडों के ठीक ऊपर होता है।


Then, the frame-pointer is advanced to point to the new frame and the parameters and the return address are stored in the prescribed locations in the new frame.

फिर, फ्रेम-पॉइंटर को नए फ्रेम की ओर इशारा करने के लिए आगे बढ़ाया जाता है और मापदंडों और वापसी पते को नए फ्रेम में निर्धारित स्थानों पर संग्रहीत किया जाता है।


Finally, a jump to the function is made.

अंत में, फ़ंक्शन पर एक जंप बनाया जाता है।


When the function call returns, the result is read from the frame into the variable x.

जब फ़ंक्शन कॉल वापस आता है, तो परिणाम फ्रेम से चर x में पढ़ा जाता है।


FP is restored to its former value and the saved registers are read back from the old frame.

FP को उसके पूर्व मूल्य पर बहाल किया जाता है और सहेजे गए रजिस्टरों को पुराने फ्रेम से वापस पढ़ा जाता है।


Keeping all the parameters in register-allocated variables until just before the call, and only then storing them in the frame can require a lot of registers to hold the parameters.

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


An alternative is to store each parameter in the frame as soon as it is evaluated.

एक विकल्प यह है कि प्रत्येक पैरामीटर को फ्रेम में संग्रहीत किया जाए जैसे ही इसका मूल्यांकन किया जाता है।


This way, only one of the variables a1,...,an will be live at any one time.

इस तरह, किसी भी समय केवल एक चर a1,...,an जीवित रहेगा।


However, this can go wrong if a later parameter-expression contains a function call, as the parameters to this call will overwrite the parameters of the outer call.

हालांकि, यह गलत हो सकता है यदि बाद के पैरामीटर-अभिव्यक्ति में एक फ़ंक्शन कॉल शामिल है, क्योंकि इस कॉल के पैरामीटर बाहरी कॉल के मापदंडों को अधिलेखित कर देंगे।


Hence, this optimisation must only be used if no parameter-expressions contain function calls or if nested calls use stack-locations different from those used by the outer call.

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


In this simple call-sequence, we save on the stack all registers that can potentially hold variables, so these are preserved across the function call.

इस सरल कॉल-अनुक्रम में, हम स्टैक पर उन सभी रजिस्टरों को सहेजते हैं जो संभावित रूप से चर को रख सकते हैं, इसलिए ये फ़ंक्शन कॉल में संरक्षित हैं।


This may save more registers than needed, as not all registers will hold values that are required after the call.

यह आवश्यकता से अधिक रजिस्टर बचा सकता है, क्योंकि सभी रजिस्टर उन मानों को नहीं रखेंगे जो कॉल के बाद आवश्यक हैं।


We will return to this issue in section 10.6.

हम इस मुद्दे पर अनुभाग 10.6 में वापस आएंगे।


The convention used by the activation record layout in figure 10.1 is that, before a function is called, the caller saves all registers that must be preserved.

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


An alternative strategy is that the called function saves the contents of the registers that need to be preserved and restores these immediately before the function returns.

एक वैकल्पिक रणनीति यह है कि कॉल किया गया फ़ंक्शन उन रजिस्टरों की सामग्री को सहेजता है जिन्हें संरक्षित करने की आवश्यकता है और फ़ंक्शन वापस आने से ठीक पहले उन्हें पुनर्स्थापित करता है।


Stack-layout, prologue/epilogue and call sequence for the callee-saves strategy are shown in figures 10.4, 10.5 and 10.6.

कैल-सेव रणनीति के लिए स्टैक-लेआउट, प्रोलॉग/एपिलॉग और कॉल अनुक्रम चित्र 10.4, 10.5 और 10.6 में दिखाए गए हैं।


Note that it may not be necessary to store all registers that may potentially be used to hold variables, only those that the function actually uses to hold its local variables.

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


So far, the only difference between caller-saves and callee-saves is when registers are saved.

अब तक, कॉलर-सेव और कैली-सेव के बीच एकमात्र अंतर यह है कि रजिस्टर कब सहेजे जाते हैं।


When freeing a block, we subtract one from the size.

एक ब्लॉक को मुक्त करते समय, हम आकार में से एक घटाते हैं।


If the relevant free list is empty, we take the first block in the next free list.

यदि प्रासंगिक मुक्त सूची खाली है, तो हम अगली मुक्त सूची में पहला ब्लॉक लेते हैं।


To reduce fragmentation and allow fast joining of freed blocks, some memory managers restrict blocks to be aligned to block size.

विखंडन को कम करने और मुक्त ब्लॉकों के तेजी से जुड़ने की अनुमति देने के लिए, कुछ मेमोरी प्रबंधक ब्लॉकों को ब्लॉक आकार के साथ संरेखित करने तक सीमित करते हैं।


Two blocks that can be joined are called “buddies”.

दो ब्लॉक जिन्हें जोड़ा जा सकता है उन्हें “बडी” कहा जाता है।


With the buddy system, we get both malloc() and free() down to logarithmic time.

बडी सिस्टम के साथ, हमें malloc() और free() दोनों ही लॉगरिदमिक समय में मिलते हैं।


This waste is sometimes called internal fragmentation.

इस बर्बादी को कभी-कभी आंतरिक विखंडन कहा जाता है।


Manual memory management means that both allocation and deallocation of heap-allocated objects is explicit in the code.

मैनुअल मेमोरी प्रबंधन का मतलब है कि ढेर-आवंटित वस्तुओं का आवंटन और विखंडन दोनों ही कोड में स्पष्ट हैं।


Manually inserting calls to free() in the program is error-prone.

मैन्युअल रूप से प्रोग्राम में free() के कॉल डालना त्रुटि-प्रवण है।


The available memory can over time be split into a large number of small blocks.

उपलब्ध मेमोरी समय के साथ बड़ी संख्या में छोटे ब्लॉकों में विभाजित हो सकती है।


Many modern languages support automatic memory management, also called garbage collection.

कई आधुनिक भाषाएँ स्वचालित मेमोरी प्रबंधन का समर्थन करती हैं, जिसे कचरा संग्रह भी कहा जाता है।


The programmer does not need to call free() or object destructors.

प्रोग्रामर को free() या ऑब्जेक्ट डिस्ट्रक्टर को कॉल करने की आवश्यकता नहीं है।


If no pointer to a block exists, the program can no longer access the block.

यदि किसी ब्लॉक का कोई पॉइंटर मौजूद नहीं है, तो प्रोग्राम अब ब्लॉक तक नहीं पहुंच सकता है।


To reduce space leaks caused by keeping pointers to blocks that will never be accessed, it is often advised that programmers overwrite (with null) pointers.

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


Reference counting uses the property that if no pointer to a block of memory exists, then the block can not be accessed by the program.

संदर्भ गणना उस संपत्ति का उपयोग करती है कि यदि मेमोरी के किसी ब्लॉक का कोई पॉइंटर मौजूद नहीं है, तो प्रोग्राम उस ब्लॉक तक नहीं पहुंच सकता है।


The counter is an extra field in the block in addition to the size field.

काउंटर आकार क्षेत्र के अतिरिक्त ब्लॉक में एक अतिरिक्त क्षेत्र है।


If, after decrementing a counter, the counter becomes 0, the block is freed by calling free().

यदि, एक काउंटर को घटाने के बाद, काउंटर 0 हो जाता है, तो ब्लॉक को free() को कॉल करके मुक्त कर दिया जाता है।


A further complication happens if a block can contain pointers to other blocks.

एक और जटिलता तब होती है जब एक ब्लॉक में अन्य ब्लॉकों के पॉइंटर्स हो सकते हैं।


In a strongly typed language, the type will typically have information about which fields are pointers.

एक मजबूत टाइप की गई भाषा में, टाइप में आमतौर पर इस बारे में जानकारी होगी कि कौन से फ़ील्ड पॉइंटर्स हैं।


Tracing garbage collectors determine which blocks are reachable from variables in the program.

ट्रेसिंग कचरा संग्राहक यह निर्धारित करते हैं कि प्रोग्राम में चर से कौन से ब्लॉक पहुंच योग्य हैं।


The collection of all these variables is called the root set of the heap.

इन सभी चरों के संग्रह को ढेर का रूट सेट कहा जाता है।


The garbage collector frees up memory automatically.

कचरा संग्राहक स्वतः ही मेमोरी को खाली करता है।


Generational collectors are used to reduce the time spent on garbage collection.

पीढ़ीगत संग्राहकों का उपयोग कचरा संग्रह पर खर्च होने वाले समय को कम करने के लिए किया जाता है।


The program needs to be compiled before it can be executed.

कार्यक्रम को चलाने से पहले संकलित करने की आवश्यकता है।


Bootstrapping is a technique used to create a compiler.

बूटस्ट्रैपिंग एक ऐसी तकनीक है जिसका उपयोग एक संकलक बनाने के लिए किया जाता है।


The compiler translates code from one language to another.

संकलक एक भाषा से दूसरी भाषा में कोड का अनुवाद करता है।


Memory management is crucial for efficient program execution.

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


The system uses a two-space copying collector.

सिस्टम दो-स्थान कॉपी संग्राहक का उपयोग करता है।


The programmer can force a collection to happen.

प्रोग्रामर संग्रह को होने के लिए मजबूर कर सकता है।


Concurrent garbage collection reduces pauses.

समवर्ती कचरा संग्रह विरामों को कम करता है।


The compiler is written in a high-level language.

संकलक एक उच्च-स्तरीय भाषा में लिखा गया है।


The program's performance was significantly improved.

कार्यक्रम के प्रदर्शन में उल्लेखनीय सुधार हुआ।


The algorithm efficiently manages memory allocation.

एल्गोरिदम कुशलता से मेमोरी आवंटन का प्रबंधन करता है।


सिस्टम की वास्तुकला जटिल है।


The software requires a lot of resources.

सॉफ्टवेयर को बहुत सारे संसाधनों की आवश्यकता है।


The code was optimized for better performance.

बेहतर प्रदर्शन के लिए कोड को अनुकूलित किया गया था।


संकलक मशीन कोड उत्पन्न करता है।


The process of compilation can be time-consuming.

संकलन की प्रक्रिया समय लेने वाली हो सकती है।


The program's execution depends on the operating system.

कार्यक्रम का निष्पादन ऑपरेटिंग सिस्टम पर निर्भर करता है।


The system uses a free list to manage memory.

सिस्टम मेमोरी प्रबंधित करने के लिए एक मुक्त सूची का उपयोग करता है।


The compiler's design is based on the principles of bootstrapping.

संकलक का डिज़ाइन बूटस्ट्रैपिंग के सिद्धांतों पर आधारित है।


If we can eliminate all of the epilogue offexcept for the return-jump tof’s caller, we can instead makegreturn directly tof’s caller, hence skippingf’s epilogue entirely.

यदि हम f के एपिलॉग के सभी हिस्सों को, f के कॉलर पर वापसी-कूद को छोड़कर, हटा सकते हैं, तो हम इसके बजाय g को सीधे f के कॉलर पर वापस कर सकते हैं, जिससे f के एपिलॉग को पूरी तरह से छोड़ा जा सकता है।


Iff’s frame holds no useful information at the time we callg(or we can be sure thatgdoes not overwrite any useful information in the frame), we can reuse the frame forfas the frame forg.

यदि f का फ्रेम उस समय कोई उपयोगी जानकारी नहीं रखता है जब हम g को कॉल करते हैं (या हम सुनिश्चित हो सकते हैं कि g फ्रेम में किसी भी उपयोगी जानकारी को अधिलेखित नहीं करता है), तो हम f के फ्रेम के रूप में फ्रेम का पुन: उपयोग कर सकते हैं।


Since there are no live variables after the call tog, we can eliminate the saving and restoring ofR0,...,Rk, yielding the following simplified code:

चूंकि g को कॉल करने के बाद कोई जीवित चर नहीं हैं, इसलिए हम R0,...,Rk को सहेजने और पुनर्स्थापित करने को समाप्त कर सकते हैं, जिससे निम्नलिखित सरल कोड प्राप्त होता है:


We now see that all that happens after we return is an adjustment ofF P, a copy of the result fromg’s frame tof’s frame and a jump to the return address stored inf’s frame.

अब हम देखते हैं कि वापस आने के बाद जो कुछ भी होता है वह FP का समायोजन है, g के फ्रेम से f के फ्रेम में परिणाम की एक प्रति और f के फ्रेम में संग्रहीत वापसी पते पर एक जंप।


What we now want is to reusef’s frame forg’s frame.

अब हम जो चाहते हैं वह है f के फ्रेम को g के फ्रेम के लिए पुन: उपयोग करना।


We do this by not adding and subtractingf ramesizefromF P, so we get the following simplified code:

हम ऐसा FP से f ramesize को जोड़कर और घटाकर नहीं करते हैं, इसलिए हमें निम्नलिखित सरल कोड मिलता है:


It is immediately evident that the two instructions that copy the result from and to the frame cancel out, so we can simplify further to

यह तुरंत स्पष्ट है कि दो निर्देश जो परिणाम को फ्रेम से और फ्रेम में कॉपी करते हैं, रद्द हो जाते हैं, इसलिए हम आगे सरलीकृत कर सकते हैं


We also see an unfortunate problem: Just before the call tog, we overwritef’s return address inM[F P]byg’s return address, so we will not return correctly tof’s

हम एक दुर्भाग्यपूर्ण समस्या भी देखते हैं: g को कॉल करने से ठीक पहले, हम f के वापसी पते को M[F P] में g के वापसी पते से अधिलेखित करते हैं, इसलिए हम f के लिए सही ढंग से वापस नहीं आएंगे


However, since all that happens after we return fromgis a return fromf, we can makegreturn directly tof’s caller.

हालांकि, चूंकि g से वापस आने के बाद जो कुछ भी होता है वह f से वापसी है, हम g को सीधे f के कॉलर पर वापस कर सकते हैं।


We do this simply by not overwritingf’s return address.

हम ऐसा बस f के वापसी पते को अधिलेखित न करके करते हैं।


This makes the instructions after the jump togunreachable, so we can just delete them.

यह g पर जंप के बाद के निर्देशों को अप्राप्य बनाता है, इसलिए हम उन्हें बस हटा सकते हैं।


With this tail-call optimisation, we have eliminated the potential ill effects of reusing f’s frame forg.

इस टेल-कॉल अनुकूलन के साथ, हमने f के फ्रेम को g के लिए पुन: उपयोग करने के संभावित बुरे प्रभावों को समाप्त कर दिया है।


Functional program- ming languages rely on this space saving, as they often use recursive tail calls where imperative languages use loops.

कार्यात्मक प्रोग्रामिंग भाषाएँ इस स्थान की बचत पर निर्भर करती हैं, क्योंकि वे अक्सर पुनरावर्ती टेल कॉल का उपयोग करती हैं जहाँ अनिवार्य भाषाएँ लूप का उपयोग करती हैं।


By doing tail-call optimisation, an arbitrarily long sequence of recursive tail calls can share the same stack frame, so only a constant amount of stack space is used.

टेल-कॉल अनुकूलन करके, पुनरावर्ती टेल कॉल का एक मनमाना लंबा क्रम एक ही स्टैक फ्रेम साझा कर सकता है, इसलिए केवल एक स्थिर मात्रा में स्टैक स्थान का उपयोग किया जाता है।


In the above, we relied on a pure caller-saves strategy, since the absence of live variables after the call meant that there would be no saving and restoring of caller-saves registers around the call.

उपरोक्त में, हमने एक शुद्ध कॉलर-सेव रणनीति पर भरोसा किया, क्योंकि कॉल के बाद जीवित चरों की अनुपस्थिति का मतलब था कि कॉल के आसपास कॉलर-सेव रजिस्टरों को सहेजना और पुनर्स्थापित करना नहीं होगा।


If a callee-saves strategy or a mixed caller- saves/callee-saves strategy is used, there will still be no saving and restoring around the call, butf’s epilogue would restore the callee-saves registers thatfsaved in its own prologue.

यदि एक कॉली-सेव रणनीति या एक मिश्रित कॉलर-सेव/कॉली-सेव रणनीति का उपयोग किया जाता है, तो कॉल के आसपास अभी भी कोई बचत और पुनर्स्थापना नहीं होगी, लेकिन f का एपिलॉग कॉली-सेव रजिस्टरों को पुनर्स्थापित करेगा जिसे f ने अपने स्वयं के प्रस्तावना में सहेजा था।


This makes tail-call optimisation a bit more complicated, but it is normally possible (with a bit of care) to move the restoring of callee-saves registers tobeforethe call toginstead of waiting until aftergreturns.

यह टेल-कॉल अनुकूलन को थोड़ा और जटिल बनाता है, लेकिन आमतौर पर (थोड़ी सावधानी के साथ) कॉली-सेव रजिस्टरों की बहाली को g को कॉल करने से पहले ले जाना संभव है, g के वापस आने तक इंतजार करने के बजाय।


This allows gto overwritef’s frame, which no longer holds any useful information (except the return address, which we explicitly avoid overwriting).

यह g को f के फ्रेम को अधिलेखित करने की अनुमति देता है, जिसमें अब कोई उपयोगी जानकारी नहीं है (वापसी पते को छोड़कर, जिसे हम स्पष्ट रूप से अधिलेखित करने से बचते हैं)।


Exercise 11.4 asks you to do such tail-call optimisation for a mixed caller- saves/callee-saves strategy.

अभ्यास 11.4 आपको मिश्रित कॉलर-सेव/कॉली-सेव रणनीति के लिए इस तरह का टेल-कॉल अनुकूलन करने के लिए कहता है।


Modern programs consist mainly of calls to predefined library functions (or proce- dures or methods).

आधुनिक कार्यक्रम मुख्य रूप से पूर्वनिर्धारित लाइब्रेरी कार्यों (या प्रक्रियाओं या विधियों) के कॉल से बने होते हैं।


टिप्पणियाँ嵌套 हैं।


Common subexpression elimination is a key optimization technique.

सामान्य उप-अभिव्यक्ति उन्मूलन एक प्रमुख अनुकूलन तकनीक है।


संकलन में कई चरण शामिल होते हैं।


Compile-time operations are performed during the compilation process.

संकलन-समय के संचालन संकलन प्रक्रिया के दौरान किए जाते हैं।


संकलन करने वाले संकलक एक जटिल कार्य है।


A conflict arises when the grammar is ambiguous.

एक संघर्ष तब उत्पन्न होता है जब व्याकरण अस्पष्ट होता है।


Reduce-reduce conflicts can be challenging to resolve.

रिड्यूस-रिड्यूस संघर्षों को हल करना चुनौतीपूर्ण हो सकता है।


Shift-reduce conflicts also need careful attention.

शिफ्ट-रिड्यूस संघर्षों पर भी सावधानीपूर्वक ध्यान देने की आवश्यकता है।


Consistent behavior is crucial for a compiler.

एक संकलक के लिए सुसंगत व्यवहार महत्वपूर्ण है।


स्थिर प्रसार कोड को अनुकूलित करता है।


Context-free grammars are fundamental in compiler design.

संदर्भ-मुक्त व्याकरण संकलक डिजाइन में मौलिक हैं।


The dangling-else problem is a classic parsing issue.

लटकता-एल्स समस्या एक क्लासिक पार्सिंग मुद्दा है।


Data-flow analysis helps in code optimization.

डेटा-फ्लो विश्लेषण कोड अनुकूलन में मदद करता है।


Dead code elimination removes unnecessary code.

मृत कोड उन्मूलन अनावश्यक कोड को हटा देता है।


A dead variable is one whose value is never used.

एक मृत चर वह है जिसका मान कभी उपयोग नहीं किया जाता है।


Declarations define the meaning of identifiers.

घोषणाएँ पहचानकर्ताओं का अर्थ परिभाषित करती हैं।


Global declarations are accessible throughout the program.

वैश्विक घोषणाएँ पूरे कार्यक्रम में सुलभ हैं।


Local declarations are specific to a block of code.

स्थानीय घोषणाएँ कोड के एक ब्लॉक के लिए विशिष्ट हैं।


Derivation is the process of generating a string from a grammar.

व्युत्पत्ति व्याकरण से एक स्ट्रिंग उत्पन्न करने की प्रक्रिया है।


डीएफए का उपयोग शाब्दिक विश्लेषण में किया जाता है।


A common method is to write a QAD (“quick and dirty”) compiler using an existing language.

एक आम तरीका मौजूदा भाषा का उपयोग करके एक QAD (“त्वरित और गंदा”) संकलक लिखना है।


This compiler needs not generate code for the desired target machine.

इस संकलक को वांछित लक्ष्य मशीन के लिए कोड उत्पन्न करने की आवश्यकता नहीं है।


The important thing is that it allows programs in the new language to be executed.

महत्वपूर्ण बात यह है कि यह नई भाषा में कार्यक्रमों को निष्पादित करने की अनुमति देता है।


Additionally, the “real” compiler is written in the new language and will be bootstrapped using the QAD compiler.

इसके अतिरिक्त, “असली” संकलक नई भाषा में लिखा गया है और इसे QAD संकलक का उपयोग करके बूटस्ट्रैप किया जाएगा।


As an example, let us assume we design a new language “M+”.

उदाहरण के लिए, मान लीजिए कि हम एक नई भाषा “M+” डिज़ाइन करते हैं।


We, initially, write a compiler from M+ to ML in ML.

हम, शुरू में, ML में M+ से ML में एक संकलक लिखते हैं।


The first step is to compile this, so it can run on some machine.

पहला कदम इसे संकलित करना है, ताकि यह किसी मशीन पर चल सके।


The QAD compiler can now be used to compile the “real” compiler.

अब QAD संकलक का उपयोग “असली” संकलक को संकलित करने के लिए किया जा सकता है।


The result is an ML program, which we need to compile.

परिणाम एक ML प्रोग्राम है, जिसे हमें संकलित करने की आवश्यकता है।


The result of this is a compiler with the desired functionality, but it will probably run slowly.

इसका परिणाम वांछित कार्यक्षमता वाला एक संकलक है, लेकिन यह शायद धीरे-धीरे चलेगा।


A better result can be obtained by letting the generated compiler compile itself.

उत्पन्न संकलक को स्वयं को संकलित करने देकर बेहतर परिणाम प्राप्त किया जा सकता है।


This yields a compiler with the same functionality as the above, i.e., it will generate the same code, but, since the “real” compiler has been used to compile it, it will run faster.

यह उपरोक्त के समान कार्यक्षमता वाला एक संकलक उत्पन्न करता है, यानी, यह समान कोड उत्पन्न करेगा, लेकिन, चूंकि इसे संकलित करने के लिए “असली” संकलक का उपयोग किया गया है, इसलिए यह तेजी से चलेगा।


Bootstrapping might not be complete even if a compiler with the right functionality has been obtained.

बूटस्ट्रैपिंग तब भी पूरा नहीं हो सकता है जब सही कार्यक्षमता वाला एक संकलक प्राप्त कर लिया गया हो।


Using an interpreter Instead of writing a QAD compiler, we can write a QAD interpreter.

एक QAD संकलक लिखने के बजाय एक दुभाषिया का उपयोग करना, हम एक QAD दुभाषिया लिख सकते हैं।


In our example, we could write an M+ interpreter in ML.

हमारे उदाहरण में, हम ML में एक M+ दुभाषिया लिख सकते हैं।


हमें पहले इसे संकलित करने की आवश्यकता होगी।


We can then use this to run the M+ compiler directly.

फिर हम इसका उपयोग M+ संकलक को सीधे चलाने के लिए कर सकते हैं।


Since the “real” compiler has been used to do the compilation, nothing will be gained by using the generated compiler to compile itself, though this step can still be used as a test and for extensions.

चूंकि संकलन करने के लिए “असली” संकलक का उपयोग किया गया है, इसलिए उत्पन्न संकलक का उपयोग करके स्वयं को संकलित करने से कुछ भी हासिल नहीं होगा, हालांकि इस चरण का उपयोग अभी भी एक परीक्षण और विस्तार के लिए किया जा सकता है।


Though using an interpreter requires fewer steps, this should not really be a consideration, as the computer(s) will do all the work in these steps.

हालांकि एक दुभाषिया का उपयोग करने के लिए कम चरणों की आवश्यकता होती है, यह वास्तव में एक विचार नहीं होना चाहिए, क्योंकि कंप्यूटर इन चरणों में सभी काम करेंगे।


For some languages, a QAD compiler will be easier to write than an interpreter, and for other languages an interpreter is easier.

कुछ भाषाओं के लिए, एक QAD संकलक एक दुभाषिया की तुलना में लिखना आसान होगा, और अन्य भाषाओं के लिए एक दुभाषिया आसान है।