मान लीजिए कि X इनपुट भाषा है, Z आउटपुट भाषा है, तो f कंपाइलर है, जिसे भाषा Y में लिखा जाता है।
f = X -> Z
च चूंकि केवल एक कार्यक्रम है, मुझे लगता है कि वाई कोई भी भाषा हो सकती है, है ना? इसलिए हमारे पास F1, f2, प्रत्येक Y1, Y2 में लिखा हुआ है।
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
उदाहरण के लिए cpython संकलक लें, X Python है, Z Python VM कोड है, Y C है।
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
पायथन स्रोतों को पायथन वीएम कोड, .pyc फ़ाइलों के साथ संकलित किया जाता है, फिर दुभाषिया द्वारा व्याख्या की जाती है। ऐसा लगता है कि वहाँ एक संकलक मौजूद है जो सीधे पायथन कर सकता है -> मशीनकोड, हालांकि लागू करने के लिए बहुत कठिन है:
hardpython = interpreter2 . cpython
हम एक और संकलक भी कर सकते हैं काम करते हैं पायथन -> पायथन वीएमसीकोड, एक अन्य भाषा में, पायथन ही कहते हैं।
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
अब, यहाँ जटिल उदाहरण PyPy है। मैं PyPy का नौसिखिया हूं, अगर मैं गलत हूं तो मुझे सुधारो:
PyPy doc http://doc.pypy.org/en/latest/altecture.html#pypy-the-translation-framework
हमारा लक्ष्य भाषा कार्यान्वयनकर्ताओं की समस्या का एक संभावित समाधान प्रदान करना है: एल डायनामिक भाषाओं के लिए एल * ओ * पी दुभाषियों को लिखना और ओ महत्वपूर्ण डिजाइन निर्णयों के साथ पी प्लेटफार्मों।
हम सोच सकते हैं कि L X है, p है। Y है। एक प्रोग्राम मौजूद है जो सभी RPython प्रोग्राम को C में बदल देता है:
rpython_compiler = RPython -> C Python
pypy = Python -> Nothing RPython
translate = compile the program pypy written in RPython using rpython_compiler
py2rpy = Python -> RPython Python
py2c = Python -> C Python
py2c = rpython_compiler . py2rpy
RPython प्रोग्राम VM निर्देशों की तरह हैं, rpython_compiler VM है।
Q1। pypy दुभाषिया है, एक RPython प्रोग्राम है जो Python कोड की व्याख्या कर सकता है, कोई आउटपुट भाषा नहीं है, इसलिए हम इसे संकलक के रूप में नहीं मान सकते, है ना?
जोड़ा गया:
- मैंने अभी-अभी पाया कि अनुवाद करने के बाद भी, pypy अभी भी दुभाषिया है, केवल इस बार C में लिखा गया है।
- यदि हम दुभाषिया पेपी में गहराई से देखते हैं, मेरा मानना है कि किसी प्रकार के संकलक का अस्तित्व होना चाहिए, जो पायथन स्रोतों को कुछ एएसटी के लिए संकलित करता है, तो निष्पादित करें
इस तरह:
compiler_inside_pypy = Python -> AST_or_so
Q2। कंपाइलर py2rpy मौजूद हो सकता है, सभी पायथन प्रोग्राम को RPython में बदल सकता है? यह किस भाषा में लिखी गई है, यह अप्रासंगिक है। यदि हाँ, तो हमें एक और कंपाइलर py2c मिलता है। प्रकृति में pypy और py2rpy के बीच क्या अंतर है? क्या py2rpy को pypy की तुलना में लिखना बहुत कठिन है?
Q3। क्या इस बारे में कुछ सामान्य नियम या सिद्धांत उपलब्ध हैं?
अधिक संकलक:
gcc_c = C -> asm? C # not sure, gimple or rtl?
g++ = C++ -> asm? C
clang = C -> LLVM_IR C++
jython = Python -> JVMCode java
ironpython = Python -> CLI C#
Q4। दिया गया f = X -> Z, एक प्रोग्राम P जो X में लिखा गया है। जब हम P को गति देना चाहते हैं, तो हम क्या कर सकते हैं? जीवाश्म तरीके:
अधिक कुशल एल्गोरिथ्म में पी फिर से लिखना
बेहतर Z उत्पन्न करने के लिए f को फिर से लिखना
यदि Z की व्याख्या की जाती है, तो एक बेहतर Z दुभाषिया लिखें (PyPy यहाँ पर है?)
Z में लिखे कार्यक्रमों को तेजी से पुन: लिखें
एक बेहतर मशीन प्राप्त करें
ps। यह प्रश्न एक संकलक लिखने के तकनीकी सामान के बारे में नहीं है, लेकिन एक निश्चित प्रकार के संकलक को लिखने की व्यवहार्यता और जटिलता है।