2009-02-25 14 views
18

अच्छी तरह से मुझे उम्मीद है कि मैं इस के साथ कुछ स्पैमिंग नियम तोड़ नहीं रहा हूं। मैं सिर्फ कैसे erlang संकलक पैटर्न मिलान लागू करता है के बारे में एक प्रश्न पूछा, और मैं कुछ महान प्रतिक्रियाएं, संकलित बाईटकोड (एक पैरामीटर सी() के निर्देश के लिए पारित के साथ प्राप्त) है, जिनमें से एक हो गया है:erlang BEAM बाइटकोड

{function, match, 1, 2}. 
    {label,1}. 
    {func_info,{atom,match},{atom,match},1}. 
    {label,2}. 
    {test,is_tuple,{f,3},[{x,0}]}. 
    {test,test_arity,{f,3},[{x,0},2]}. 
    {get_tuple_element,{x,0},0,{x,1}}. 
    {test,is_eq_exact,{f,3},[{x,1},{atom,a}]}. 
    return. 
    {label,3}. 
    {badmatch,{x,0}} 

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

उदाहरण के लिए {test,is_tuple,{f,3},[{x,0}]} कहें। मुझे लगता है कि यह एक निर्देश है, जिसे 'टेस्ट' कहा जाता है ... वैसे भी, तो यह आउटपुट अनिवार्य रूप से बाइटकोड स्तर की भाषा का एएसटी होगा, जिससे बाइनरी एन्कोडिंग सिर्फ 1-1 अनुवाद है? यह सब इतना रोमांचक है, मुझे नहीं पता था कि मैं आसानी से देख सकता हूं कि एरलांग कंपाइलर चीजों को तोड़ देता है।

बहुत बहुत धन्यवाद

+0

+1 क्योंकि मुझे भी रूचि है, और Google के माध्यम से आपके पिछले प्रश्न से पीछा किया गया है :) –

उत्तर

12

ठीक तो मैं जवाब खोजने के लिए संकलक स्रोत कोड में खोदा, और मेरे आश्चर्य एएसएम फ़ाइल संकलन करने के लिए 'एस' पैरामीटर के साथ उत्पादन करने के लिए: फ़ाइल() फ़ंक्शन वास्तव में विचार-विमर्श किया है जैसा है (फ़ाइल: परामर्श()) और फिर आगे की कार्रवाई के लिए टुपल्स एक-एक करके चेक किए जाते हैं (लाइन 661 - beam_consult_asm (सेंट) -> - compile.erl)। इसके बाद वहां एक जेनरेट मैपिंग टेबल है (एरलांग स्रोत का संकलन फ़ोल्डर) जो दिखाता है कि प्रत्येक बाइटकोड लेबल का सीरियल नंबर क्या है, और मुझे लगता है कि इसका उपयोग बाइटकोड के वास्तविक बाइनरी हस्ताक्षर उत्पन्न करने के लिए किया जाता है। महान सामान। लेकिन आपको परामर्श() फ़ंक्शन से प्यार करना होगा, आप लगभग एक यादृच्छिक भाषा के लिए एक लिस्पी प्रकार वाक्यविन्यास प्राप्त कर सकते हैं और एक पार्सर/लेक्सर की पूरी तरह से आवश्यकता से बच सकते हैं और बस कंपाइलर में स्रोत कोड से परामर्श लें और इसके साथ सामान करें ... कोड कोड डेटा के रूप में डेटा ...

+3

क्या आपने रॉबर्ट विर्डिंग के लिस्प-फ्लेवर एरलांग (http://forum.trapexit.org/viewtopic.php?p= पर देखा है) 40268) –

+0

हाँ मैंने इसे देखा है, अभी तक इसका इस्तेमाल किया है हालांकि यह छोटी अवधि में करने के लिए मेरी चीजों की सूची पर काफी अधिक है। धन्यवाद – deepblue

5

कंपाइलर को तथाकथित पैटर्न मिलान कंपाइलर है जो एक पैटर्न लेगा और इसे अनिवार्य रूप से शाखाओं, स्विच और इस तरह की श्रृंखला के लिए संकलित करेगा। Erlang के लिए कोड संकलक में v3_kernel.erl में है। यह साइमन Peyton जोन्स का उपयोग करता है,

http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/

पर "प्रोग्रामिंग भाषाएं कार्यात्मक के कार्यान्वयन", ऑनलाइन उपलब्ध एक और योग्य कागज पीटर सेस्टाफ्ट से एक है,

http://www.itu.dk/~sestoft/papers/match.ps.gz

जो एक निकला है एक सरल प्रणाली के आंशिक मूल्यांकन की जांच करके पैटर्न मैच कंपाइलर। यह एक आसान पढ़ा जा सकता है, खासकर यदि आप एमएल जानते हैं।

% 1 
f(a, b) -> 
% 2 
f(a, c) -> 
% 3 
f(b, b) -> 
% 4 
f(b, c) -> 

मान लीजिए अब हम एक फोन f(X, Y) है:

मूल विचार यह है कि अगर आपके पास, कहना है। X = a कहें। फिर केवल 1 और 2 लागू हैं। तो हम Y = b और फिर Y = c देखें। यदि दूसरी तरफ X /= a तो हम जानते हैं कि हम 1 और 2 छोड़ सकते हैं और 3 और 4 का परीक्षण शुरू कर सकते हैं। कुंजी यह है कि अगर मिलान नहीं करता है तो यह हमें कुछ बताता है कि मैच कहां जारी रख सकता है हम मैच करते हैं यह बाधाओं का एक सेट है जिसे हम परीक्षण करके हल कर सकते हैं।

पैटर्न मिलान कंपाइलर परीक्षणों की संख्या को अनुकूलित करने की कोशिश करते हैं ताकि हमारे निष्कर्ष निकालने से पहले जितना संभव हो सके। स्थिर भाषा कुछ लाभ यहां टाइप किया है, क्योंकि वे जानते हैं कि हो सकता है:

-type foo() :: a | b | c. 

और फिर अगर हम

-spec f(foo() -> any(). 
f(a) -> 
f(b) -> 
f(c) -> 

है और हम f(a), f(b) तो मेल नहीं खाती च (ग) चाहिए मैच। Erlang को जांचना है और फिर विफल रहता है अगर यह मेल नहीं खाता है।