2010-11-30 12 views
6

जब मैं "संकलन" के बारे में सोचता हूं तो मुझे लगता है कि सी ++ कोड को बाइनरी में बदलना है। या शायद सी # सीएलआर बाइट कोड में सी #। लेकिन "पार्सिंग" पाइथन, या एक वेब टेम्पलेट भाषा को पार्स करने जैसा कुछ हो सकता है, जहां इसे किसी भी बाइनरी का उत्पादन करने की आवश्यकता नहीं होती है, लेकिन या तो तुरंत कोड निष्पादित कर सकते हैं, कथन-द्वारा-कथन, या आउटपुट एचटीएमएल सीधे।"संकलन" का उप-समूह "पार्सिंग" है?

क्या आप मूल रूप से किसी भी मामले में एक ही कार्य कर रहे हैं? भाषा वाक्यविन्यास को अनदेखा करते हुए, सी ++ को संकलित करना उतना ही मुश्किल होगा जितना वेबसाइट टेम्पलेट फ़ाइल (Django, Smarty, जो कुछ भी), या पायथन?

क्या मैं आगे बढ़ने की कोशिश कर रहा हूं, है यदि मैं "संकलन" का अध्ययन करता हूं या "संकलन" पर एक पुस्तक पढ़ता हूं, तो क्या मैं अनिवार्य रूप से गैर संकलित भाषाओं को पार्स करने के लिए कौशल उठाऊंगा?

+0

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

+0

एएसपीनेट में पहेली में एक और टुकड़ा जोड़ना, हम [गतिशील संकलन!] (Http://msdn.microsoft.com/en-us/library/ms366723.aspx) के कारण सीधे संकलन के बिना स्रोत कोड फ़ाइलों को तैनात कर सकते हैं। –

उत्तर

24

लघु जवाब: पार्स नहीं संकलन का एक सबसेट है।

लांग जवाब:

  1. Lexing है, जो एक टोकन धारा के लिए इनपुट के कुछ फार्म धर्मान्तरित: आम तौर पर, वहाँ किसी अन्य स्वरूप में स्रोत परिवर्तित करने के लिए एक 3 कदम हैं।
  2. पार्सिंग, जो टोकन स्ट्रीम को एक सार वाक्यविन्यास पेड़ (एएसटी) में परिवर्तित करता है।
  3. संकलन, जो एएसटी को निष्पादन योग्य निर्देशों (मूल कोड, बाइट कोड, आदि) के एक सेट में परिवर्तित करता है।

(बहुत सरल भाषाओं के लिए, आपको एक पार्सर की भी आवश्यकता नहीं हो सकती है, तो आप सीधे टोकन स्ट्रीम को संकलित करने में सक्षम हो सकते हैं, या आपका पार्सर मूल कोड सीधे आउटपुट कर सकता है।

[LET; String("x"); EQ; Int(0); NEWLINE; WHILE; String("x"); 
LT; VAL(10); ... ] 

पार्सर में परिवर्तित कर देंगे:

let x = 0 
while x < 10 
    print x 
    x := x + 1 

एक lexer यह एक टोकन धारा में परिवर्तित करने के लिए, शायद कुछ इस तरह जा रहा है:)

तो इस तरह एक कच्चे स्ट्रिंग के साथ शुरू एक और सार्थक डेटा संरचना में स्ट्रीम करें, आपका सार वाक्यविन्यास पेड़:

// AST definition 
type expr = 
    | Block of expr list 
    | Assign of string * expr 
    | While of expr * expr 
    | Call of string * expr list 
    | Add of expr * expr 
    | Var of string 
    | Int of int 

// AST instance created from token stream 
Block 
    [ 
     Assign("x", Int(10)); 
     While 
     (
      LessThan(Var("x"), Int(10)), 
      Block 
       [ 
        Call("print", [Var("x")]); 
        Assign("x", Add(Var("x"), Int(1))); 
       ] 
     ); 
    ] 

एक बार आपके पास एएसटी है, आप जो कुछ भी चाहते हैं वह कर सकते हैं:

  • आप एएसटी को मूल कोड (संकलन) में परिवर्तित करते हैं।
  • या आप फ्लाई पर एएसटी की व्याख्या कर सकते हैं, जो आप गतिशील प्रोग्रामिंग भाषा या टेम्पलेटिंग इंजन के साथ कर सकते हैं।
  • या आप एएसटी को सिंटैक्स हाइलाइटर बनाने के लिए पुन: सक्रिय कर सकते हैं।
  • या आप एएसटी और आउटपुट समकक्ष कोड को दूसरी भाषा में चल सकते हैं।
  • या आप Var("x") के सभी उदाहरणों के लिए देखते हैं और उन्हें Var("y") एक कोड refactor उपकरण के लिए इसी तरह के साथ बदलें सकता है)।

इसलिए, जब आप आमतौर पर संकलन से पहले इनपुट पार्स करते हैं, तो यह कहने जैसा नहीं है कि पार्सिंग संकलन का सबसेट है।

+0

वाह। इस तरह के एक विस्तृत उत्तर की उम्मीद नहीं थी। धन्यवाद! यह नहीं पता था :) – mpen

5

नहीं, पार्सिंग और संकलन पूरी तरह से स्वतंत्र हो सकता है।

  • एक पार्सर किसी भी कोड को उत्सर्जित नहीं कर सकता है। यह कुछ डेटा ऑब्जेक्ट को पार्स कर सकता है (JSON, XML, जो कुछ भी)
  • एक कंपाइलर के साथ प्रारंभ करने के लिए स्रोत कोड नहीं हो सकता है - इसे एक अमूर्त सिंटैक्स पेड़ के साथ प्रस्तुत किया जा सकता है, पहले से ही पार्स किया गया है, और केवल प्रासंगिक कोड
  • को उत्सर्जित करना होगा

सबसे compilers एक पार्स कदम शामिल हैं, लेकिन मुझे नहीं लगता कि यह जरूरी एक संकलन की "सबसेट" है, और निश्चित रूप से पार्स संकलन के साथ कोई लेना देना नहीं है।

+1

यदि आप स्रोत कोड संकलित कर रहे हैं, तो मुझे विश्वास है कि पार्सिंग आवश्यक है। – jjnguy

+1

@jjnguy: मैं सहमत हूं। हालांकि, मैं तर्क दूंगा कि एक कंपाइलर में हमेशा इनपुट कोड के रूप में स्रोत कोड नहीं होता है। एक जेआईटी कंपाइलर एक उदाहरण है। –

1

संकलन वास्तव में पार्सिंग से अधिक कठिन है क्योंकि यह संकलन में प्रारंभिक चरणों में से एक है।

पार्सिंग के बाद, एक प्रतीक तालिका उत्पन्न होती है जिससे वास्तविक बाइनरी कोड उत्पन्न होता है।

जावास्क्रिप्ट जैसी भाषाओं की व्याख्या करने में, विवरणों को निष्पादित किया जा सकता है क्योंकि प्रत्येक कथन को पार्स किया जाता है।

http://en.wikipedia.org/wiki/Parsing

2

... "मैं गैर संकलित भाषाओं पार्स करने के लिए कौशल लेने जाएगा?" हाँ, आप करेंगे, लेकिन आप खुद से पार्सिंग का अध्ययन कर सकते हैं।

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

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