मैं एक "लाइव कोडिंग फ्रेमवर्क" बनाना चाहता हूं।

मुझे समझाना चाहिए कि "लाइव कोडिंग फ्रेमवर्क" का क्या अर्थ है। मैं लाइव कोडिंग की पारंपरिक कोडिंग से तुलना करके ऐसा करूंगा।

आम तौर पर, पारंपरिक प्रोग्रामिंग में आप कोड लिखते हैं, कभी-कभी इसे संकलित करते हैं, फिर एक निष्पादन योग्य लॉन्च करते हैं या किसी प्रकार के दुभाषिया में एक स्क्रिप्ट खोलते हैं। यदि आप अपने आवेदन को संशोधित करना चाहते हैं तो आपको इस प्रक्रिया को दोहराना होगा। एक लाइव कोडिंग फ्रेमवर्क कोड को अद्यतन करने में सक्षम बनाता है जबकि एप्लिकेशन चल रहा है और मांग पर पुनः लोड किया गया है। शायद यह रीलोडिंग हर बार कोड वाली फ़ाइल को बदलने या किसी अन्य क्रिया द्वारा होती है। कोड में परिवर्तन तब एप्लिकेशन में दिखाई देता है क्योंकि यह चल रहा है। प्रोग्राम को बंद करने और इसे पुन: संकलित करने और पुन: लॉन्च करने की कोई आवश्यकता नहीं है।

इस मामले में, एप्लिकेशन एक विंडो वाला ऐप है जिसमें अपडेट/ड्रा लूप है, ग्राफिक्स के लिए ओपनजीएल, ध्वनि प्रसंस्करण के लिए एक ऑडियो लाइब्रेरी (सुपरकॉलिडर?)

बेशक मेरे पास पसंदीदा भाषाएं हैं, हालांकि मुझे यकीन नहीं है कि उनमें से कोई भी इस तरह की वास्तुकला के लिए उपयुक्त होगा। आदर्श रूप से मैं पायथन, लुआ, रूबी या किसी अन्य उच्च स्तरीय भाषा का उपयोग करूंगा। हालाँकि, एक मित्र ने हाल ही में क्लोजर को एक संभावना के रूप में सुझाया है, इसलिए मैं इस पर भी विचार कर रहा हूं।

मैं न केवल यह जानना चाहता हूं कि इस तरह के ढांचे के लिए कौन सी भाषाएं उपयुक्त होंगी, बल्कि आम तौर पर, कौन सी भाषा विशेषताएं इस तरह के ढांचे को संभव बनाती हैं

13
JeremyFromEarth 25 अक्टूबर 2011, 06:20

8 जवाब

सबसे बढ़िया उत्तर

क्लोजर में वह सब कुछ है जो आप एक लाइव कोडिंग भाषा के रूप में चाहते हैं। मुख्य आकर्षण:

  • इंटरैक्टिव आरईपीएल - ताकि आप अपने चल रहे प्रोग्राम के साथ सीधे इंटरैक्ट कर सकें। यहां तक ​​​​कि जब मैं "पारंपरिक प्रोग्रामिंग" कर रहा होता हूं, तब भी मैं अंतःक्रियात्मक रूप से कोड लिखता हूं और बाद में एक स्रोत फ़ाइल में अपनी पसंद के बिट्स की प्रतिलिपि बनाता हूं। क्लोजर को इस तरह से काम करने के लिए डिज़ाइन किया गया है - आपके प्रोग्राम में बहुत कुछ सब कुछ निरीक्षण योग्य, संशोधित और रनटाइम पर बदलने योग्य है।
  • महान समवर्ती समर्थन - आप (future (some-function)) जैसे कोड के साथ समवर्ती पृष्ठभूमि कार्यों को तुच्छ रूप से प्रारंभ कर सकते हैं। इससे भी महत्वपूर्ण बात यह है कि क्लोजर का एसटीएम और उच्च प्रदर्शन अपरिवर्तनीय डेटा संरचनाओं पर जोर अधिक सूक्ष्म समवर्ती पहलुओं का ख्याल रखेगा (उदाहरण के लिए क्या होता है यदि मैं लाइव डेटा संरचना को अद्यतन करता हूं, जबकि यह प्रस्तुत किए जाने के बीच में होता है ??)
  • लाइब्रेरी की उपलब्धता - यह एक JVM भाषा है जिससे आप Java पारिस्थितिकी तंत्र से आवश्यक सभी ऑडियो, विज़ुअल, IO या कम्प्यूटेशनल टूल प्राप्त कर सकते हैं। क्लोजर की एक या दो पंक्ति में इन्हें लपेटना आसान है ताकि आपको आवश्यक कार्यों के लिए एक संक्षिप्त इंटरफ़ेस मिल सके
  • मैक्रोज़ - चूंकि क्लोजर एक होमोइकोनिक भाषा है, आप इसका लाभ उठा सकते हैं भाषा का विस्तार करने वाले शक्तिशाली मैक्रोज़ लिखने की लिस्प क्षमता। आप प्रभावी रूप से सटीक सिंटैक्स का निर्माण कर सकते हैं जिसे आप लाइव वातावरण में उपयोग करना चाहते हैं, और संकलक को पर्दे के पीछे पूरा कोड बनाने की पूरी मेहनत करने दें।
  • डायनामिक टाइपिंग - इसके लाभों के बारे में दोनों तरह से तर्क दिया जा सकता है, लेकिन कोड को जल्दी और संक्षिप्त रूप से लिखने का प्रयास करते समय यह निश्चित रूप से एक बहुत बड़ा लाभ है।
  • बहुत अच्छे प्रोजेक्ट के साथ सक्रिय समुदाय - क्लोजर समुदाय में आपको समान लाइव कोडिंग तकनीकों में रुचि रखने वाले बहुत से लोग मिल सकते हैं।

कुछ लिंक आपको दिलचस्प लग सकते हैं:

4
mikera 1 नवम्बर 2011, 13:20

मैंने ZeroBrane Studio IDE के हिस्से के रूप में Lua में एक लाइव कोडिंग सुविधा लागू की है। यह ठीक वैसे ही काम करता है जैसा आपने कोड में बदलाव किए जाने पर एप्लिकेशन को फिर से लोड करके वर्णित किया है। मैं एप्लिकेशन के पूर्ण पुनः लोड से बचने के लिए रन-टाइम पर मूल्यों को संशोधित करने के लिए संभावित सुधारों पर काम कर रहा हूं। यह एक शुद्ध लुआ-आधारित समाधान है और वीएम में किसी भी संशोधन की आवश्यकता नहीं है।

आप लाइव कोडिंग का डेमो देख सकते हैं जैसा कि वर्तमान में यहां लागू किया गया है: http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style

प्रयुक्त/आवश्यक भाषा सुविधाओं के संदर्भ में, मैं इस पर निर्भर हूं:

  1. एक चल रहे एप्लिकेशन को बाधित/फिर से शुरू करने की क्षमता (यह डिबग.हुक और त्रुटि() कॉल पर आधारित है),
  2. दूरस्थ रूप से (अनमॉडिफाइड) एप्लिकेशन के साथ इंटरैक्ट करने की क्षमता (यह डिबग.हुक के आधार पर किया जाता है, यह पता लगाने के लिए कि होस्ट मशीन से एक नया अनुरोध भेजा जा रहा है या नहीं, साथ ही साथ कोरआउट पर स्विच करने के लिए चयन () समर्थन के साथ टीसीपी इंटरैक्शन। मुख्य एप्लिकेशन और लाइव कोडिंग मॉड्यूल), और
  3. एप्लिकेशन में नए कोड को इंजेक्ट करने की क्षमता (यह तंत्र सह-दिनचर्या का भी उपयोग कर रहा है, लेकिन मुझे यकीन है कि विकल्प हैं)। केवल एक संशोधित टुकड़े को इंजेक्ट करने की भी संभावना है, लेकिन इसे एक फ़ंक्शन के स्तर पर होना चाहिए, और यदि यह फ़ंक्शन किसी अन्य फ़ंक्शन के लिए स्थानीय है, तो आपको इसे भी शामिल करना होगा और इसी तरह।
5
Paul Kulchenko 21 सितंबर 2012, 01:59

केवल एक चीज जो इस काम को करने के लिए आवश्यक है वह है गतिशील बंधन का एक रूप, उदाहरण के लिए, एरलांग में संदेश पास करना या कई अन्य भाषाओं में eval

यदि आपके पास डायनेमिक बाइंडिंग है, तो आप संदेश को प्रभावित किए बिना संदेश का लक्ष्य बदल सकते हैं, या लक्ष्य को प्रभावित किए बिना संदेश बदल सकते हैं—बशर्ते कोई लक्ष्य परिभाषित किया गया हो जब आप उसे संदेश भेजने का प्रयास करते हैं , और उन लक्ष्यों के लिए एक संदेश परिभाषित किया जाता है, जिन पर आप इसे भेजते हैं, कब आप इसे भेजते हैं।

लक्ष्य बदलते समय, आपको बस इतना करना है कि नए संस्करण के आने तक पिछले संस्करण में संदेशों की सेवा करें, फिर नए संस्करण में संक्रमण के लिए एक छोटा लॉक अपडेट करें। इसी तरह, जब कोई संदेश बदलते हैं, तो आप पुराने संस्करण की सेवा तब तक करते हैं जब तक कि नया उपलब्ध न हो जाए।

आसानी से हॉट-स्वैप करने योग्य कोड को अभी भी इस तरह डिज़ाइन किया जाना चाहिए, हालांकि—एप्लिकेशन इतना मॉड्यूलर होना चाहिए कि किसी घटक के कार्यान्वयन को बदलने से कोई रुकावट न आए, और यह केवल सावधानीपूर्वक प्रोग्रामिंग से ही आ सकता है।

4
Jon Purdy 26 अक्टूबर 2011, 06:20

आपके देव बॉक्स पर 'लाइव कोडिंग' होना अच्छा और अच्छा है, लेकिन एक तैनात सर्वर से सीधे बातचीत करने का एक तरीका इसे 'वास्तविक' होने के बहुत करीब ले जाता है। इसके लिए आपको एक नेटवर्क जागरूक REPL चाहिए।

क्लोजर इसे एक सॉकेट रिप्लाई। यह आपको अपने परिनियोजित टॉमकैट सर्वर (उदाहरण के लिए) पर अपने कोड के चल रहे संस्करण से दूरस्थ रूप से संलग्न करने की अनुमति देता है। फिर आप अपने पसंदीदा स्वैंक-सक्षम विकास उपकरण को संलग्न कर सकते हैं और हैक कर सकते हैं।

2
Arthur Ulfeldt 26 अक्टूबर 2011, 14:02

स्मॉलटाक शायद इसके लिए सबसे अच्छा दांव है। दूसरों के विपरीत, इसमें लाइव कोडिंग के लिए एक संपूर्ण आईडीई है, न कि केवल एक REPL

2
Stephan Eggermont 17 अप्रैल 2016, 17:20

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

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

इसे इस तरह से देखें: यदि आपका टूलकिट आपको एक से अधिक विंडो खोलने देता है, तो इसका कोई कारण नहीं है कि उनमें से एक विंडो इंटरैक्टिव प्रॉम्प्ट नहीं हो सकती। आपको केवल एक विंडो खोलने की क्षमता की आवश्यकता है, और किसी प्रकार का "eval" कमांड जो इसे एक स्ट्रिंग के रूप में खिलाए गए कोड को चलाता है।

1
Bryan Oakley 1 नवम्बर 2011, 15:10

गूगल एपेंगिन पर अजगर में repote_api_shell.py है। यह एक पूर्ण लाइव-कोडिंग सूट नहीं है - emacs w/swank-clojure पर क्लोजर में 'लाइवकोडिंग' को रोजमर्रा के विकास लय में एकीकृत करने के लिए बहुत अधिक वास्तविक जीवन का उपयोग होता है - लेकिन बहुत से लोगों को यह एहसास नहीं होता है कि यह संभव है कुछ पायथन वातावरण में।

$ PYTHONPATH=. remote_api_shell.py -s dustin-getz.appspot.com
App Engine remote_api shell
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)]
The db, users, urlfetch, and memcache modules are imported.

dustin-getz> import models
dustin-getz> models.BlogPost(title='a modern take on automated testing', link='https://docs.google.com/document/pub?id=1DUxQogBg45rOTK4c5_SfEHiQcvL5c207Ivcy-gDNx2s', dont_publish_feed=False).put()

dustin-getz> items = models.BlogPost.all().filter('dont_publish_feed =', False).order('-published_date').fetch(100)

dustin-getz> len(items)
58

dustin-getz> for item in items[:5]: print item.title
a modern take on automated testing
Notes: Running a startup on haskell
the [un]necessity of superstar middle management in bigcos
"everything priced above its proper value"
stages of growth as a software engineer
1
Dustin Getz 6 फरवरी 2012, 20:45

मैं पाइडेव के पायथन संपादक के लिए एक लाइव कोडिंग सुविधा पर काम कर रहा हूं। यह ब्रेट विक्टर के प्रिंसिपल टॉक पर आविष्कार से प्रेरित था, और मैंने एक प्रोग्राम लागू किया है स्टेट डिस्प्ले और टर्टल ग्राफिक्स। जैसे ही आप ग्रहण में अपना पायथन कोड टाइप करते हैं, वे दोनों अपडेट हो जाते हैं।

प्रोजेक्ट को GitHub पर होस्ट किया गया है, और मैंने एक डेमो वीडियो, साथ ही एक ट्यूटोरियल

पायथन की मुख्य विशेषताएं जिनका मैंने उपयोग किया था, वे थे एब्सट्रैक्ट सिंटैक्स ट्री और डायनेमिक कोड एक्जीक्यूशन। मैं उपयोगकर्ता का कोड लेता हूं, इसे एक पेड़ में पार्स करता हूं, फिर किसी भी असाइनमेंट स्टेटमेंट, लूप पुनरावृत्तियों और फ़ंक्शन कॉल का साधन करता हूं। एक बार जब मैं पेड़ को यंत्रित कर लेता हूं, तो मैं इसे निष्पादित करता हूं और रिपोर्ट प्रदर्शित करता हूं या अनुरोधित कछुआ ग्राफिक्स खींचता हूं।

मैंने उस स्वैपिंग सुविधा को लागू नहीं किया है जिस पर अन्य उत्तर चर्चा करते हैं। इसके बजाए, मैं हमेशा कोड को पूरा करने या टाइम आउट करने के लिए चलाता हूं। मैं लाइव कोडिंग को परीक्षण-संचालित विकास में वृद्धि के रूप में देखता हूं, न कि लाइव एप्लिकेशन पर हैक करने के तरीके के रूप में। हालांकि, मैं इस बारे में और सोचूंगा कि लाइव एप्लिकेशन के टुकड़ों की अदला-बदली मुझे क्या करने देगी।

1
Don Kirkby 7 जिंदा 2017, 09:40