कम्प्युटर, कार्यक्रम
प्रसारक - ... छ compilers को प्रकार। रूपान्तरण र प्रसारण कार्यक्रम
कार्यक्रममा, साथै मान्छे एक दोभासे वा अनुवादक आवश्यक अनुवाद गर्न एक भाषा अर्को गर्न।
आधारभूत अवधारणाहरु
कार्यक्रम गणना को एक भाषाई प्रतिनिधित्व छ: म → पी → पी (म)। एक दोभासे इनपुट कार्यक्रम पी र केही इनपुट x आपूर्ति छ जो एक कार्यक्रम छ। यो पी एक्स मा कार्य: म (पी, एक्स) = पी (X)। त्यहाँ केवल एक अनुवादक सबै सम्भव कार्यक्रम (को औपचारिक प्रणालीमा प्रतिनिधित्व गर्न सकिन्छ जो) प्रदर्शन सक्षम छ भन्ने तथ्यलाई धेरै गहिरो र महत्वपूर्ण आविष्कार Turing छ।
प्रोसेसर मिसिन भाषामा कार्यक्रम को एक दोभासे छ। सामान्यतया धेरै तिनीहरूले व्याख्या गर्न सजिलो छ कि फारम अनुवाद त, उच्च स्तरको भाषाहरूको लागि व्याख्याकारों लेख्न महंगा।
अनुवादकहरू केही प्रकार धेरै अनौठो नाम छ:
- को कोडांतरक मिसिन भाषामा विधानसभा भाषा कार्यक्रम अनुवाद।
- को संकलक तल्लो भाषामा एक उच्च स्तरको भाषा अनुवाद।
पी → एक्स → Q. छ, ∀x: - प्रसारक तिनीहरू दुवै एउटै अर्थ विज्ञान छ कि यस्तो तरिका केही भाषा एस इनपुट डाटा रूपमा लिन्छ कार्यक्रम र उत्पादन टी कार्यक्रम एक कार्यक्रम छ। पी (X) = क्यू (X)।
interpretable कुरा मा सम्पूर्ण कार्यक्रम प्रसारण भने, यो कार्यान्वयन, वा AOT संकलनको अघि संकलनको भनिन्छ। AOT संकलक श्रृंखला मा प्रयोग गर्न सकिन्छ, जो को उत्तरार्द्ध अक्सर कोडांतरक उदाहरणका लागि, छ:
स्रोत कोड संकलक → (अनुवादक) → → विधानसभा कोड कोडांतरक (संकलक) → → सीपीयू मिसिन कोड (दोभासे)।
जब अन्य पहिले संकलित भाग कार्यान्वयन कार्यक्रम, प्रसारण गरिएको छ भने परिचालन वा गतिशील संकलनको हुन्छ। जित-compilers तिनीहरूले पहिले नै फेरि र फेरि स्रोत कोड बारम्बार छैन ताकि गरेका के सम्झना। तिनीहरूले पनि कार्यक्रम कार्यान्वयन वातावरण को व्यवहारमा आधारित अनुकूली संकलनको र recompilation उत्पादन गर्न सक्छन्।
धेरै भाषाहरू सङ्कलन समयमा कोड कार्यान्वयन र रनटाइम मा नयाँ कोड सङ्कलन गर्न अनुमति दिन्छ।
अनुवाद चरण
प्रसारण विश्लेषण र सिन्थेसाइजिङ को कदम comprises:
स्रोत कोड विश्लेषक → → → वैचारिक प्रतिनिधित्व बिजुली (सिन्थेसाइजर) लक्ष्य कोड →।
यो यी कारणहरू कारण छ:
- अन्य कुनै पनि विधि उपयुक्त छैन। शब्द अनुवाद बस काम गर्दैन।
- राम्रो ईन्जिनियरिङ् समाधान: तपाईं बरु एम × एन जटिल भन्दा एम र एन स्रोत भाषा लक्षित मात्र एम + N सरल कार्यक्रम (polukompilyatorov) लेख्न पर्दैन लागि अनुवादकहरू (अनुवादकहरू को कुल) लेख्न चाहनुहुन्छ भने।
तथापि, व्यवहार मा, हरेक कल्पना स्रोत र लक्षित भाषा ढाक्न धेरै विरलै पर्याप्त expressive र पर्याप्त शक्तिशाली एक वैचारिक दृश्य। जबकि केही सक्षम यो नजिक आउन थिए।
वास्तविक compilers धेरै चरणमा पास। तपाईंको आफ्नै संकलक सिर्जना गर्दा मानिसहरू प्रतिनिधित्व र जेनेरेटर सिर्जना गर्न गरेका सबै मेहनत बारम्बार आवश्यकता छैन। तपाईं JavaScript वा सी मा सिधै आफ्नो भाषा अनुवाद र विद्यमान जाभास्क्रिप्ट-इन्जिन र सी संकलक बाँकी गर्न फाइदा लिन सक्छ। तपाईं पनि विद्यमान मध्यवर्ती प्रतिनिधित्व र प्रयोग गर्न सक्नुहुन्छ भर्चुअल मिसिन।
रेकर्ड अनुवादक
स्रोत, गन्तव्य र आधार: - प्रसारक तीन भाषा संलग्न जो एक कार्यक्रम वा हार्डवेयर छ। तिनीहरूले तलको मूल बायाँ, दायाँ र लक्ष्य आधार राख्दै, एक टी-आकार लेखिएको गर्न सकिन्छ।
त्यहाँ compilers को तीन प्रकारका छन्:
- प्रसारक - यो आधारभूत स्रोत भाषामा पत्राचार यदि samokompilyator छ।
- संकलक भाषा लक्षित जो आधारलाइन, भनिन्छ samorezidentnym छ।
- उहाँले लक्षित यदि एक क्रस-संकलक र आधारभूत विभिन्न भाषाहरूमा - प्रसारक।
किन महत्त्वपूर्ण छ?
तपाईंलाई कहिल्यै यो उद्देश्य लागि प्रयोग अवधारणा उदाहरणका लागि, व्यापक प्रयोग गरिन्छ किनभने, एउटा वास्तविक संकलक, आफ्नो सृष्टिको प्रविधिको राम्रो ज्ञान बनाउन भने:
- ढाँचा पाठ;
- भाषा प्रश्नहरु डाटाबेसहरूमा;
- उन्नत कम्प्यूटर वास्तुकला;
- सामान्यिकृत अनुकूलन समस्या;
- GUI हरू;
- पटकथा भाषा;
- नियन्त्रक;
- भर्चुअल मिसिन;
- मिसिन अनुवाद।
साथै, तपाईंले preprocessors, linkers, लोडर, debuggers र profilers लेख्न चाहनुहुन्छ भने, तपाईंले एक संकलक लेख्दा जस्तै कदम मार्फत जानैपर्छ।
तपाईं पनि भाषा लागि अनुवादक सिर्जना यसको intricacies र ambiguities एक राम्रो समझ मतलब देखि कसरी राम्रो कार्यक्रम लेख्न सिक्न सक्छौं। प्रसारण को सामान्य सिद्धान्तहरू अध्ययन पनि राम्रो डिजाइनर भाषा बन्न अनुमति दिन्छ। त्यसैले यसलाई ठाडो कसरी यदि यो प्रभावकारी कार्यान्वयन गर्न सकिन्छ भाषा फरक गर्दैन?
व्यापक प्रविधि
संकलक प्रविधि कम्प्यूटर विज्ञान को विभिन्न क्षेत्रमा समेट्छ:
- भाषा को औपचारिक सिद्धान्त: व्याकरण, पार्सिङ, computability;
- कम्प्युटर आर्किटेक्चर:। निर्देशन सेट, RISC वा CISC, pipelined प्रक्रिया कोर घडी चक्र, आदि;
- कार्यक्रम भाषाहरूको अवधारणाहरु, उदाहरणका लागि, प्रदर्शन अनुक्रम नियन्त्रण, ससर्त कार्यान्वयन, पुनरावृत्ति, recursion, कार्यात्मक अपघटन, modularity, समिकरण, मेटा-कार्यक्रम, स्कोप, स्थिर उप-प्रकार, टेम्प्लेट, उत्पादन प्रकार, प्रोटोटाइप, एनोटेशन, प्रवाह, monads, मेलबक्स, जारी , वाइल्डकार्ड, नियमित अभिव्यक्ति, लेनदेन स्मृति उत्तराधिकार, polymorphism, मोड सेटिङहरू, र यति मा आदि।।
- अमूर्त भाषा तथा भर्चुअल मिसिन;
- एल्गोरिदम र डाटा संरचना: नियमित अभिव्यक्ति, पार्सिङ एल्गोरिदम, ग्राफिक्स एल्गोरिदम, गतिशील कार्यक्रम, प्रशिक्षण;
- कार्यक्रम भाषा: विन्यास, अर्थ विज्ञान (स्थिर र गतिशील), समर्थन प्रतिमान (संरचनात्मक, OOP, कार्यात्मक, तार्किक, थाक, Parallelism, मेटा-कार्यक्रम);
- सिर्जना सफ्टवेयर (compilers, सामान्यतया ठूलो र जटिल): स्थानीयकरण, क्यास, componentize, एपीआई-इन्टरफेस, पुन: प्रयोग, समिकरण।
संकलक डिजाइन
वास्तविक अनुवादक को विकास मा सामना केही समस्याहरू:
- स्रोत भाषा समस्या। यो सङ्कलन गर्न सजिलो छ? त्यहाँ एक preprocessor छ? प्रकार कस्तो छ? त्यहाँ एक पुस्तकालय हो?
- संकलक पासेसहरू समूह: एकल वा बहु-तरिका?
- अनुकूलन को डिग्री चाहनुहुन्थ्यो। सानो वा कुनै अनुकूलन छिटो र अशुद्ध प्रसारण कार्यक्रम सामान्य हुन सक्छ। माथि-अनुकूलन संकलक धीमा हुनेछ, तर देखने को समय राम्रो कोड यो मूल्य हुन सक्छ।
- त्रुटि पत्ता लगाउने को आवश्यक डिग्री। एक अनुवादक पहिलो त्रुटि मा रोक्न सक्नुहुन्छ? जब यसलाई बन्द गर्नुपर्छ? को संकलक त्रुटि सुधार विश्वास गर्ने कि नगर्ने?
- उपकरण को उपलब्धता। मूल भाषा धेरै सानो छैन भने, स्क्यानर र बिजुली विश्लेषककालागिक्लिकगर्नुहोस् आवश्यक छ। त्यहाँ जेनेरेटर, कोड जेनेरेटर पनि छन्, तर तिनीहरू यति साधारण छैनन्।
- लक्ष्य कोड को प्रकार उत्पन्न गर्न। शुद्ध पूरक वा अवास्तविक मेशिन कोड देखि चयन। वा प्रविष्टि भाग यस्तो LLVM, RTL, वा JVM रूपमा लोकप्रिय मध्यवर्ती प्रतिनिधित्व सिर्जना लेख्ने। वा C वा JavaScript मा स्रोत कोड मूल को अनुवाद बनाउन।
- लक्षित कोड को ढाँचा। तपाईं चयन गर्न सक्नुहुन्छ सम्मेलन भाषा, एक पोर्टेबल मिसिन कोड, मिसिन कोड स्मृति चित्र।
- Retargeting। जेनेरेटर सेट राम्रो छ जब एक साधारण उपखाडी भाग छ। यस कारण यो धेरै भागहरु को इनपुट लागि एक जनरेटर छ सबै भन्दा राम्रो छ।
संकलक वास्तुकला: घटक
यी मूल कोड उत्पन्न (उत्पादन कार्यक्रम सी वा अवास्तविक मेशिन मा एक कार्यक्रम छ भने, तपाईंले यति धेरै छैन चरणमा आवश्यक) एक संकलक को प्रमुख कार्यात्मक घटक हो:
- इनपुट कार्यक्रम (प्रवाह चिह्न) टोकन को धारा यसलाई धर्मान्तरित जो स्क्यानर (lexical विश्लेषक), मा खुवाइन्छ छ।
- पार्सर (पार्सर) एक अमूर्त विन्यास रूख निर्माण।
- जनक विश्लेषक को अर्थ जानकारी decomposes र त्रुटिहरू लागि रूख नोड्स गर्ला। थप गुण र स्थापित लिंक संग सार विन्यास रूख - फलस्वरूप, जनक ग्राफ बनाए।
- मध्यवर्ती सङ्केतसिर्जना एक प्रवाह ग्राफ बनाउछ (tuples मुख्य ब्लक समूहबद्ध छन्)।
- मिसिन-स्वतन्त्र कोड अनुकूलक दुवै स्थानीय (आधार एकाइ भित्र) र वैश्विक (सबै ब्लक गर्न) अनुकूलन दिनचर्या भित्र मूलतः बाँकी आयोजित। अनावश्यक कोड कम र गणना सरल। परिणाम एक परिमार्जन प्रवाह ग्राफ छ।
- बिजुली वस्तु फाइल कोडांतरक भर्चुअल रजस्टर सिर्जना (संभवतः अप्रभावी), एक सरलरेखीय प्रसारण नियन्त्रण कोड मा लक्ष्य कोड आधारभूत ब्लक बांध।
- मिसिन-निर्भर अनुकूलक, linker रजस्टर बीच स्मृति आवंटन र योजना टोली बनाउँछ। यो पाइपलाइनिङ एक सदुपयोग यो सम्मेलन मा विधानसभा भाषा मा रूपान्तरण कार्यक्रम कार्य गर्दछ।
साथै, त्रुटि पत्ता लगाउने सहायक प्रबन्धक र प्रतीक टेबल को प्रयोग।
Lexical विश्लेषण (स्क्यान)
यो स्क्यानर टोकन, हटाउँदै खाली स्थान, टिप्पणी र विस्तार बृहत को धारा मा स्ट्रिम स्रोत क्यारेक्टरहरू।
स्क्यानर अक्सर यस्तो खातामा मामला, मार्जिन, लाइन विश्रामहरू र सम्मिलित टिप्पणी लिन वा छैन रूपमा समस्या, मुठभेड।
स्क्यानिङ दौडान सक्छ त्रुटिहरू, lexical भनिन्छ र समावेश:
- वर्ण वर्णमाला नभएका;
- शब्द वा लाइन मा वर्ण को संख्या अधिक;
- एक बन्द साइन वा स्ट्रिङ शाब्दिक;
- टिप्पणी फाइल को अन्त्य।
पदवर्णनगर्दैछ (पार्सिङ)
को पार्सर एक अमूर्त विन्यास रूख मा टोकन को अनुक्रम धर्मान्तरित। रूख प्रत्येक नोड नाम आफूलाई रूख नोड्स धेरै जो क्षेत्रहरू, एउटा वस्तुको रूपमा भण्डारण गरिएको छ। यो चरण मा कुनै चक्र छन्। तपाईं सिर्जना गर्दा एक पार्सर व्याकरण (LL वा LR) को जटिलता को स्तर ध्यान र कि त्यहाँ कुनै पनि नियम डिस्एम्बिगुएसन छन् पत्ता आवश्यक छ। केही भाषा जनक विश्लेषण आवश्यक गर्छन्।
यो चरण मा फेला त्रुटिहरू विन्यास भनिन्छ। उदाहरणका लागि:
- K = 5 * (7 - वाई;
- जे = / 5;
- 56 = एक्स * 4।
जनक विश्लेषण
यस समयमा जनक विश्लेषण गर्ने ट्रीपदवर्णनगर्नुहोस् को नियम र एसोसिएट भागहरु को permissibility जाँच गर्न (सन्दर्भ नाम अनुमति निहित प्रकार रूपांतरण लागि सञ्चालन सम्मिलित, र यति मा। डी) को अर्थ ग्राफ गठन लागि।
स्पष्ट, विभिन्न भाषाहरू फरक मा नियमहरूको admissibility को सेट। तपाईं जावा-जस्तो भाषा सङ्कलन भने, compilers पाउन सक्छ:
- यसको स्कोप भित्र धेरै चर घोषणा;
- यसको घोषणा अघि चर एक सन्दर्भ;
- को पहिले देखि न जाया को नाम उल्लेख;
- प्याटेन्ट अधिकारको उल्लङ्घन;
- एक विधि कलमा तर्कको अत्यधिक वा अपर्याप्त नम्बर;
- प्रकार बेमेल।
पुस्ता
मध्यवर्ती कोड जेनेरेसन प्रवाह ग्राफ tuples बनेको, आधारभूत ब्लक समूहबद्ध उत्पादन गर्छ।
कोड जेनेरेसन एक वास्तविक मिसिन कोड उत्पादन गर्छ। पहिलो चरण मा RISC-मिसिन लागि परम्परागत compilers, तपाईंले भर्चुअल रजस्टर को असीमित नम्बर एक कोडांतरक सिर्जना गर्नुहोस्। CISC-मिसिन लागि शायद हुन छैन।
Similar articles
Trending Now