लघु जवाब: पार्स नहीं संकलन का एक सबसेट है।
लांग जवाब:
- Lexing है, जो एक टोकन धारा के लिए इनपुट के कुछ फार्म धर्मान्तरित: आम तौर पर, वहाँ किसी अन्य स्वरूप में स्रोत परिवर्तित करने के लिए एक 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 उपकरण के लिए इसी तरह के साथ बदलें सकता है)।
इसलिए, जब आप आमतौर पर संकलन से पहले इनपुट पार्स करते हैं, तो यह कहने जैसा नहीं है कि पार्सिंग संकलन का सबसेट है।
संकलन के लिए पार्सिंग की आवश्यकता है, लेकिन पार्सिंग को संकलन की आवश्यकता नहीं है। एक रिश्ता है, लेकिन एक रिश्ता नहीं है। – DwB
एएसपीनेट में पहेली में एक और टुकड़ा जोड़ना, हम [गतिशील संकलन!] (Http://msdn.microsoft.com/en-us/library/ms366723.aspx) के कारण सीधे संकलन के बिना स्रोत कोड फ़ाइलों को तैनात कर सकते हैं। –