2009-09-26 13 views
10

मैं पाइथन दुभाषिया के साथ चारों ओर हैक करना चाहता हूं और एक छोटा डीएसएल बनाने का प्रयास करना चाहता हूं। क्या कोई मॉड्यूल है जहां मैं इस सैद्धांतिक कोड (LINQ अभिव्यक्ति पेड़ के समान) की तरह कुछ कर सकता हूं?प्रोग्रामिंग के लिए पाइथन बाइटकोड उत्पन्न करने का कोई तरीका है?

expression_tree = Function(
    Print(
     String('Hello world!') 
    ) 
) 
compile_to_bytecode(expression_tree) 

या क्या यह केवल पायथन स्रोत कोड उत्पन्न करना आसान होगा? क्या इसे सी या एसडब्ल्यूआईजी या साइथन का उपयोग करके आसान बनाया जा सकता है? बाहर disassembler मॉड्यूल

+0

OO भाषाओं के जबरदस्त सूचक क्षमता को देखते हुए (विशेष रूप से अजगर) एक डीएसएल काफी मूर्खतापूर्ण है: यह बहुत अच्छा है & साफ एपीआई है। बस पाइथन लिखें। यदि आप स्वयं को अच्छी कक्षा परिभाषाएं प्रदान करते हैं, तो आपके पास "डीएसएल जैसी" पायथन है और इसकी आवश्यकता नहीं है। –

उत्तर

10

ast के माध्यम से कार्य करना और पेड़ को बाइटकोड में संकलित करना, जैसा कि एक और उत्तर बताता है, शायद सबसे सरल है; स्रोत उत्पन्न करना और उनको संकलित करना, लगभग उतना ही अच्छा।

हालांकि, निम्न स्तर के दृष्टिकोणों का पता लगाने के लिए, this page से लिंक देखें; मुझे byteplay विशेष रूप से उपयोगी पाया गया है (वर्तमान में 2.6 और न ही 3. *, केवल 2.4 या 2.5 पर काम नहीं करता है, लेकिन मुझे लगता है कि 2.6 के लिए इसे ठीक करना आसान होना चाहिए, जैसा कि वर्तमान में अपने ट्रैकर में चर्चा की गई है)। मैंने फिल एबी के समान रूप से विशेष रुप से प्रदर्शित BytecodeAssembler का उपयोग नहीं किया है, लेकिन लेखक की प्रतिष्ठा को देखते हुए मुझे यकीन है कि यह जांचने लायक है!

+0

+1 अच्छा लिंक :) –

+0

हमेशा के रूप में महान जवाब। :-) –

0

चेक मिली:

http://docs.python.org/library/dis.html

+0

एकमात्र चीज यह है कि मैं बाइटकोड इकट्ठा करना चाहता था, नहीं * डी * इसे इकट्ठा करें। :-) –

+0

आह अच्छा बिंदु, माफ करना मुकाबला;) हालांकि डिस्सेबलर मॉड्यूल के बारे में अच्छी बात यह है कि यह आपको बाइटकोड निर्देशों को देखने के साथ-साथ बाइटकोड निर्देशों को निर्दिष्ट करने देता है। – Nope

5

पायथन 2.x में, आप आमतौर पर compiler module और उसके ast उप मॉड्यूल के साथ इस दृष्टिकोण (पर इस मॉड्यूल ध्यान दें संस्करण के बाद से हटा दिया गया है 2.6)। पायथन 3.X में, आप केवल ast का उपयोग करेंगे।

दोनों एक compile() समारोह है कि स्रोत/AST से जाना होगा की पेशकश करने के लिए "एक कोड उद्देश्य यह है कि exec बयान या eval() द्वारा निष्पादित किया जा सकता है।"

1

Fernando Meyer recently wrote a blog post पाइथन पर अपने स्वयं के एक्सटेंशन निर्दिष्ट करने के लिए # coding निर्देश का उपयोग करने का तरीका बताते हुए। उदाहरण (वास्तविक प्रारूप परिभाषा pyspec.py और tokenizer.py में है):

# coding: pyspec 

class Bow: 
    def shot(self): 
     print "got shot" 

    def score(self): 
     return 5 

describe Bowling: 
    it "should score 0 for gutter game": 
     bowling = Bow() 
     bowling.shot() 
     assert that bowling.score.should_be(5) 
2

यह अजगर कोड पैदा करते हैं और इसे चलाने के लिए आसान है। यदि आप ऐसा करते हैं तो आप डिबगर को प्रदर्शित करने के लिए वास्तविक स्रोत होने के कारण इसे अधिक आसानी से डीबग कर सकते हैं। पाइथन पत्रिका के जुलाई अंक में मालटे बोरच लेख भी देखें, जहां वह अन्य चीजों के साथ इस बारे में बात करता है।

1

पायथन 3 के लिए अद्यतन - बहुत रोचक असेंबलर zachariahreed/byteasm भी है।

वास्तव में केवल एक ही पी 3 में मेरे लिए काम कर रहा है।

>>> import byteasm, dis 
>>> b = byteasm.FunctionBuilder() 
>>> b.add_positional_arg('x') 
>>> b.emit_load_const('Hello!') 
>>> b.emit_load_fast('x') 
>>> b.emit_build_tuple(2) 
>>> b.emit_return_value() 
>>> f = b.make('f') 
>>> f 
<function f at 0xb7012a4c> 
>>> dis.dis(f) 
    1   0 LOAD_CONST    0 ('Hello!') 
       3 LOAD_FAST    0 (x) 
       6 BUILD_TUPLE    2 
       9 RETURN_VALUE 
>>> f(108) 
('Hello!', 108) 
संबंधित मुद्दे

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