1 पॉइंट द्वारा GN⁺ 2024-11-10 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • λ-2D एक language experiment है जिसमें चित्र स्वयं code बन जाता है; इसका लक्ष्य text languages से कठिन visual expression और program की aesthetic form—दोनों को साथ लाना है
  • भाषा का ढांचा lambda calculus पर आधारित है, और इसकी शुरुआत इस विचार से होती है कि तय execution order से अधिक evaluation-केंद्रित संरचना चित्र को देखने के तरीके से मिलती-जुलती है
  • हाथ से आसानी से बनाया जा सके और मशीन भी उसे समझ सके, इसके लिए grid-based symbols और wires का उपयोग कर data flow दिखाया जाता है
  • केवल pure lambda calculus से usability कम होने के कारण संख्या, mathematical operators, frames, sliders जैसे syntactic sugar और interaction elements जोड़े गए हैं
  • मौजूदा implementation λ-2D programs को JavaScript के single expression में बदलकर चलाती है, लेकिन अभी भी इसके circuit diagram जैसे दिखने, learning, और scanning से जुड़ी चुनौतियाँ बाकी हैं

चित्र बनाकर कोडिंग करने की भाषा पर एक प्रयोग

  • λ-2D की शुरुआत इस सवाल से हुई: “क्या चित्रों के माध्यम से कोडिंग की जा सकती है?”; यह एक non-linguistic programming language प्रयोग है
  • text के अलावा भी भाषाओं के कई रूप पहले से मौजूद हैं
  • इसके design goals को तीन बिंदुओं में समेटा जा सकता है
    • इस तथ्य का उपयोग करना कि program को draw किया जाता है, ताकि text-based languages में कठिन features जोड़े जा सकें
    • ऐसी स्थिति से बचना जिसमें instructions इतने कम हों कि simple programs भी कठिन हो जाएँ, या इतने अधिक हों कि language minimal न रहे और computer vision processing भी कठिन हो जाए
    • program स्वयं इतना visually appealing हो कि वह फ्रेम में सजाकर टाँगने लायक एक drawing बन सके

lambda calculus और grid-based representation

  • λ-2D imperative या low-level approach की बजाय lambda calculus को भाषा की नींव बनाता है
  • lambda calculus “execution” से अधिक “evaluation” के करीब है, और यह उस तरीके से जुड़ता है जिसमें हम किसी चित्र को देखते समय बिना किसी तय क्रम के बिंदुओं, रेखाओं, आकारों और composition का अनुसरण करते हैं
  • इसका शुरुआती ढांचा एक grid-based system है
    • उपयोगकर्ता कई grids को पार करती हुई continuous line खींच सकता है
    • हर grid को अंततः सीमित symbol set में से किसी एक के रूप में interpret किया जाता है
    • यह इंसानों के लिए drawing को आसान और computers के लिए parsing को सरल बनाने वाला एक संतुलित तरीका है

function symbols और wires में data flow

  • lambda calculus के बुनियादी instructions सिर्फ दो हैं
    • function application
    • function definition
  • λ-2D में function application को cup-shaped symbol से और function definition को Greek letter λ से दिखाया जाता है
  • basic lambda calculus की तरह, function हमेशा एक argument लेता है और एक output देता है
  • कई arguments संभालने के लिए कई functions को जोड़ने वाली currying पद्धति का उपयोग किया जाता है
  • symbols के बीच की wires data flow के रास्ते का काम करती हैं
  • इस चरण की भाषा तकनीकी रूप से Turing-complete है, लेकिन वास्तविक उपयोग बहुत असुविधाजनक होने के कारण numbers और mathematical operators जैसे अतिरिक्त symbols जोड़े गए
    • ये अतिरिक्त symbols syntactic sugar हैं
    • चाहें तो Church numeral जैसी pure lambda calculus संरचनाओं का ही उपयोग किया जा सकता है

frames, drawing data, और sliders

  • λ-2D, Scratch में sprites को उसी editor में draw करके तुरंत इस्तेमाल करने वाले अनुभव को अधिक स्वाभाविक रूप से आगे बढ़ाना चाहता है
  • frame canvas के किसी विशेष क्षेत्र को wire से घेरकर और ऊपर बाएँ कोने में display symbol रखकर बनाया जाता है
    • उस क्षेत्र के भीतर की scribbles को data के रूप में इस्तेमाल किया जा सकता है
    • mathematical functions के shapes को सीधे sketch करके animation आदि में उपयोग किया जा सकता है
    • किसी equation को अलग से खोजने के चरण के बिना shape को data की तरह लिया जाता है
  • runtime पर drag किए जा सकने वाले sliders भी जोड़े गए हैं
    • इनका उपयोग program को parameter के रूप में control करने के लिए होता है
    • भविष्य में अन्य GUI elements पर भी विचार किया जा रहा है

editor और 5×5 symbols

  • शुरुआती idea dotted notebook पर हाथ से बनाए गए sample programs से शुरू हुआ था
  • कागज पर बने programs को scan करने वाला computer vision हिस्सा अभी तैयार नहीं था, इसलिए पहले एक simple editor बनाया गया जिसमें programs को digital रूप में draw किया जा सके
  • हर symbol को 5×5 pixels में बनाया गया है ताकि उसे grid canvas पर आसानी से रखा जा सके
  • उपयोगकर्ता pencil tool की तरह freehand drawing भी कर सकता है
  • अस्थायी उपाय के रूप में शुरू हुआ यह editor धीरे-धीरे कई features वाले editor के करीब पहुँच गया

pure functional language में output की समस्या

  • λ-2D pure functional है और इसमें state नहीं है, इसलिए सामान्य print statement को implement करना कठिन है
  • output state change है, और यदि output किसी खास क्रम में आए यह अपेक्षा करनी हो, तो expression evaluation order भी मानना पड़ेगा
  • इसका समाधान “output” को functional तरीके से फिर से परिभाषित करना है
    • function को एक खाली canvas दिया जाता है
    • बदले में ऐसा नया canvas मिलता है जिसके pixels बदलकर text या इच्छित scribble जैसा रूप ले चुके होते हैं
  • भाषा को strings और characters की बजाय canvas और pixels के इर्द-गिर्द डिजाइन किया गया है

JavaScript conversion और execution visualization

  • basic parser पूरे λ-2D program को उसके समकक्ष JavaScript expression में बदल देता है
  • परिणामी JavaScript बहुत सारे parentheses वाला एक विशाल single expression होता है; यह inefficient है, लेकिन काम करता है
  • अभी parser JavaScript output करता है और execution browser के JavaScript engine पर छोड़ देता है, इसलिए वास्तविक execution process को visualize करना कठिन है
  • इसके बजाय parsing process को आसानी से visualize किया जा सकता है, और यह कुछ-कुछ उस path जैसा दिख सकता है जिससे tree-walk interpreter program चलाते समय गुजरता है
  • अगर parsing animation में हर symbol के लिए sound जोड़ दी जाए, तो program execution को एक गीत की तरह “सुना” जा सकता है
    • नतीजा 8-bit युग के किसी अजीब computer game जैसी ध्वनि के अधिक करीब है
    • इसे online demo के Menu > Program > Animated Run में देखा जा सकता है

बाकी सीमाएँ और अगले कदम

  • λ-2D की शुरुआत मूल रूप से उस बड़े शोध के हिस्से के रूप में हुई थी जिसमें pen और paper से programs बनाकर augmented reality के जरिए interactive feedback देने की कल्पना थी
  • project जैसे-जैसे अधिक रोचक होता गया, यह एक स्वतंत्र project बन गया
  • यह अपने शुरुआती goals को पूरी तरह हासिल नहीं कर पाया है
    • programs में drawing से अधिक circuit diagram जैसा दिखने की प्रवृत्ति है
    • यह कहना कठिन है कि आम लोगों के लिए इसे सीखना कितना आसान होगा
    • computer vision system के लिए इसे बिना त्रुटि scan करना भी आसान न हो
  • λ-2D को और निखारने के बाद, drawing को computation की तरह संभालने वाले systems में जोड़ी जा सकने वाली अन्य programming languages भी design करने की योजना है
  • λ-2D beta version को online आज़माया जा सकता है, और parser व editor का source code जल्द GitHub पर सार्वजनिक किया जाएगा

1 टिप्पणियां

 
GN⁺ 2024-11-10
Hacker News की राय
  • अगर आपको ऐसी चीज़ें पसंद हैं, तो automation project engineer का काम भी मज़ेदार या कम-से-कम परिचित लग सकता है
    Function Block Diagram (FBD) काफ़ी मिलता-जुलता है: function blocks लाइनों से जुड़े होते हैं और execution order block order से तय होता है। block खुद engine के built-in function जैसा हो सकता है, या composite block भी हो सकता है। diagram हर control cycle में एक बार चलता है, और आम तौर पर jump block न हो तो input बदला हो या नहीं, हर block प्रत्येक control cycle में ठीक एक बार execute होता है
    brewery से लेकर petrochemical plant तक की control logic इसी तरह implement की जाती है। मैं FBD-based control systems के UI side पर काम करता हूँ, इसलिए ये चीज़ें रोज़ देखता हूँ

    • क्या आप PLC जैसी चीज़, या कुछ वैसा ही, कह रहे हैं?
  • BitGrid[1] जैसा है, लेकिन बिल्कुल वही नहीं। इसे FPGA के बेहद सरल रूप के तौर पर सोचिए, जहाँ bits grid पर parallel में march कर रहे हैं
    यह idea बहुत बड़ी practical उपयोगिता—यानी आम लोगों के लिए petaflops—बन सकता है या नहीं भी; आखिरकार यह इस पर निर्भर करता है कि ASIC में एक DFF कितनी energy खाता है। मैं लंबे समय से जिस number की तलाश कर रहा हूँ, वह static power और एक bit load करने की energy है
    programming model भी समस्या है। कोई भी grid पर logic को हाथ से place नहीं करना चाहता, सब जितनी जल्दी हो सके abstraction चाहते हैं। मेरे पास उस हिस्से को पूरा करने जितना focus नहीं है
    इसे explore करते हुए मुझे Von Neumann cellular automaton[2] और Nobili cellular automata[3] मिले, जबकि दशकों से ऐसे ideas में रुचि होने के बावजूद मैंने इन्हें पहली बार देखा। computer science का यह क्षेत्र इतना कम discoverable है कि झुंझलाहट होती है
    दोनों की वही बेतुकी बुनियाद है। FSA का एक set अनंत आकार की cell space define करता है, और सभी FSA की state transition function या rule set समान होती है। बस उसी एक “simplification” की वजह से यह code golf के इलाके में धकेला हुआ लगता है
    [1] https://github.com/mikewarot/Bitgrid
    [2] https://en.wikipedia.org/wiki/Von_Neumann_cellular_automaton
    [3] https://en.wikipedia.org/wiki/Nobili_cellular_automata
    अगर कोई BitGrid idea को आगे बढ़ाकर आज़माना चाहे, तो आभारी रहूँगा

  • “तकनीकी रूप से इस point पर language Turing complete है, लेकिन use करना बेहद दर्दनाक है, इसलिए यह मेरे design rule #2 का उल्लंघन करती है” वाले हिस्से पर, मेरे Lambda Diagrams[1] stage 1 पर ही रुक गए थे
    उस page के नीचे मेरी जानकारी में मौजूद बाकी सभी graphical lambda calculus notations के links हैं, और अभी इसे भी जोड़ दिया है
    [1] https://tromp.github.io/cl/diagrams.html

    • इस site पर दिलचस्प हो सकने वाली चीज़: Y combinator को Lambda Diagram के रूप में बनाया गया है: https://tromp.github.io/img/cl/Y.logo.gif
    • वैसे Firefox की built-in translation feature उस page को Greek से translate करने के लिए पूछती है
      अब आप दावा कर सकते हैं कि आपने ऐसी language बनाई है जिससे browser कहता है “मेरे लिए तो सब Greek है!”, इसलिए इसे काफ़ी शानदार उपलब्धि मानता हूँ
    • पढ़ना भी बेहद मुश्किल है। pixel font और line art पुराने ज़माने वाले लगते हैं, लेकिन अगर अक्षर पढ़ने या line shapes में फर्क करने के लिए आँखें मिचमिचानी पड़ें, तो यह ergonomic नहीं है
      high-resolution displays आने वाले 90s में हम ऐसी चीज़ें पीछे छोड़ चुके थे
    • मेरी नज़र में यह Sumerian cuneiform जैसा दिखता है, इसलिए cool है
    • लगता है Alligator Eggs छूट गया है
      https://worrydream.com/AlligatorEggs/
  • ऐसी चीज़ें LabVIEW में भी की जा चुकी हैं, और दिखता है कि आगे बढ़ना कहाँ मुश्किल हो जाता है। sound/music generation programs में भी यह हुआ है, और Max [max] उसका एक तरह का originator है
    आप कुछ बना तो सकते हैं, लेकिन यह जल्दी ही messy हो जाता है। क्या यह अच्छा दिखता है? मेरे हिसाब से नहीं
    [max] https://en.wikipedia.org/wiki/Max_(software)

    • Max/MSP और Pure Data का visual line/node paradigm मुझे काफ़ी valid लगता है। क्योंकि यह electronic music hardware के “एक box को दूसरे box में plug करना” interface पर बना है, और electronic circuit layout को भी reflect कर सकता है
      complex signal flow को static text block की तुलना में visual layout में follow करना कहीं आसान है, खासकर ऐसे diagram में जहाँ real-time numbers animation के रूप में दिखते हों
      हाल के Max/MSP में mc भी है, जो कई identical signals के लिए अलग-अलग line/node बनाने की ज़रूरत के बिना multi-channel connections देता है, और ~gen व JavaScript से text-based programming nodes भी संभव हैं
    • क्या इस list में Simulink भी नहीं होना चाहिए?
      ऐसे “block programming language” blackboxing के जरिए abstraction करते हैं और boxes के अंदर boxes बनाने के तरीके से promising लगते हैं। सोचता हूँ कि implementation खराब है, use करने वाले सही से use नहीं करते, या paradigm ही काम नहीं करता
      ध्यान देने वाली बात यह है कि इन्हें आम तौर पर वे लोग इस्तेमाल करते हैं जो programming और abstraction नहीं जानते। अगर कोई programming में अच्छा है तो शायद इसे messy न बनाए, लेकिन फिर वह सीधे code ही लिख सकता है, इसलिए बात ambiguous हो जाती है
      LabVIEW के भयानक होने पर सहमत हूँ। सिर्फ इस problem की वजह से नहीं, updates सब तोड़ देते हैं, licensing भी है, और कुल मिलाकर headache है
    • यह बस सोचने का अलग तरीका है; साफ़ और readable LabVIEW code भी लिखा जा सकता है
      professional LabVIEW developers की एक छोटी community थी, और वे आम तौर पर बहुत readable और अच्छा code लिखते थे। यह ज़्यादातर लोगों के परिचित तरीके से अलग था, लेकिन अच्छा था
      हालांकि कुछ साल पहले मैंने वह दुनिया छोड़ दी। क्योंकि साफ़ संकेत थे कि LabVIEW अंततः मरने वाला है, चाहे उससे कुछ भी किया जा सके
  • करीब 10 साल पहले Petri net के बारे में पहली बार सुनने के बाद से graphical formal specifications में रुचि रही है
    मुझे हमेशा लगा कि डरावने गणितीय notation और language के बजाय अगर graphical representation हो, तो engineers formal methods का बेहतर इस्तेमाल कर पाएंगे। अफसोस, जब भी मैंने दूसरे engineers को Petri net दिखाए, वे लगभग तुरंत ही रुचि खो बैठे
    University of York में PhD छोड़ने से पहले मैंने RoboChart और RoboSim[1] जैसी चीज़ों पर काम किया था, और मुझे लगता है कि वे असल में अधिक सुलभ हो सकते हैं। हालांकि वे robotics semantics से काफी बंधे हुए हैं। एक personal project के तौर पर मैं RoboSim को networks और servers की दुनिया के लिए ज्यादा उपयोगी बनाने और expand करने की कोशिश करता रहा हूं
    [1] https://robostar.cs.york.ac.uk/robotool/

  • यह मुझे वाकई पसंद आया। खासकर यह कि इसे JavaScript में implement किया गया है
    purists शायद अपनी खाट या कब्र में करवटें बदलेंगे, लेकिन कम से कम visualization और audio वाले अगले steps तो निश्चित रूप से आसान हो गए होंगे। Visuals शानदार हैं, और अगला कदम मौजूदा programs की high-level structure को किसी तरह इस format में translate करना लगता है। मुझे लगता है Dijkstra algorithm या artificial neural network backpropagation algorithm को दीवार पर टांगने के लिए पैसे देने वाले geeks काफी होंगे
    मजेदार हिस्सा यह था कि language इतनी pure functional और पूरी तरह stateless है कि print statement implement नहीं किया जा सकता। क्योंकि output state बदलना है, और किसी खास क्रम में output की उम्मीद करना यह मान लेना है कि expressions किसी क्रम में evaluate होंगे
    क्या यह बस “imperative नहीं है” कहने जैसा नहीं है? फिर भी, state को कैसे encode किया जाएगा, यह जानने की उत्सुकता है। शायद variables, जैसे icon+color, introduce किए जा सकते हैं और individual statements को किसी एक axis या दोनों axes के हिसाब से align किया जा सकता है

  • non-verbal programming languages का क्षेत्र अनछुआ नहीं है”
    दूसरे ही वाक्य से aggressive triple negative शुरू हो जाता है

    • और Scratch भी तो है, है न?
  • 1987 का Wireworld याद आता है। जाहिर है, उसका Wikipedia article भी है [1]
    मैंने Wireworld में implement किया गया 8-bit counter देखा था, और वह काफी जबरदस्त था। हालांकि यह थोड़ा ज्यादा concise लगता है
    [1]: https://en.wikipedia.org/wiki/Wireworld

    • Zachtronics ने KOHCTPYKTOP में जिस तरह इसे संभाला, वह मुझे किसी तरह काफी ज्यादा पसंद है
      हालांकि अभी इसे खेलना मुश्किल है। क्योंकि webpage[1] और Steam version Flash पर निर्भर थे, और third-party Flash reimplementation से छेड़छाड़ करनी पड़ती है
      फिर भी, semiconductor behavior का implementation मुझे Wireworld से काफी बेहतर लगता है
      [1] https://www.zachtronics.com/kohctpyktop-engineer-of-the-peop...
  • online demo का direct link: https://l-2d.glitch.me/

    • असली चीज़ को बहुत गहरे दबा दिया है
  • ये कुछ और बेहद visual programming environments/languages हैं जो मुझे मिले। ये nodes को lines से जोड़ने वाली दूसरी visual programming से अलग हैं
    इन्हें अलग तरह से classify किया जा सकता है, लेकिन क्या कहें, पता नहीं
    Piet https://www.dangermouse.net/esoteric/piet.html
    Turnstyle https://jaspervdj.be/turnstyle/ https://github.com/jaspervdj/turnstyle
    Markovjunior https://github.com/mxgmn/MarkovJunior
    Cellpond https://cellpond.cool/ https://github.com/TodePond/CellPond https://www.youtube.com/watch?v=xvlsJ3FqNYU
    Imagegram https://zaratustra.itch.io/imagegram
    Color Code http://colorcode.bananabanana.me/ https://www.youtube.com/watch?v=5M5hy9xsqKc Color Code 2 http://colorcode2.bananabanana.me/ https://www.youtube.com/watch?v=tTvvX4sjZWw Splaty Code http://splatycode.bananabanana.me/ https://www.youtube.com/watch?v=gd_e85lAKOs (Muril Polese द्वारा बनाया गया https://github.com/murilopolese/ http://gallery.bananabanana.me/)
    Alchemy Online https://maxbittker.github.io/alchemy-online/ https://github.com/MaxBittker/alchemy-online