2 पॉइंट द्वारा GN⁺ 2024-11-29 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Janet for Mortals Janet प्रोग्रामिंग भाषा पर एक मुफ्त ऑनलाइन किताब है, लेकिन इस retrospective का फोकस किताब से ज्यादा web REPL और example projects समेत तकनीकी किताब बनाने की प्रक्रिया पर है
  • पूरा काम 20 हफ्ते चला, और केवल लेखन के लिए अनुमानित 12 हफ्तों से आगे बढ़कर website, C++ bindings, browser demo, CLI parser, testing tool जैसे अतिरिक्त काम जुड़ गए
  • किताब की website CodeMirror और Lezer grammar का उपयोग करके built-in REPL देती है; autocomplete WebAssembly के जरिए Janet environment को query करता है और (report) feedback को SQLite में सेव करता है
  • cmd, judge, to do, Toodle.Studio को ऐसे आधारभूत examples के रूप में इस्तेमाल किया गया है जो दिखाते हैं कि Janet scripting, CLI tools, testing, browser execution और JavaScript interop में इस्तेमाल हो सकती है
  • launch के तुरंत बाद, सिर्फ Hacker News और Lobsters submissions से शुक्रवार को 30,025, शनिवार को 9,568, रविवार को 3,777 unique visitors आए, लेकिन 5 से ज्यादा chapters पढ़ने वाले unique IPs 387 होने का अनुमान है

किताब का scope और वास्तविक workload

  • Janet for Mortals Janet प्रोग्रामिंग भाषा पर एक मुफ्त ऑनलाइन किताब है
  • कुल निर्माण अवधि खाली समय के आधार पर 20 हफ्ते रही
    • शुरुआती अनुमान 12 हफ्तों का था, और अगर केवल English prose लिखने का समय देखा जाए तो यह बहुत गलत नहीं था
    • वास्तविक schedule में किताब के आसपास के coding projects का बड़ा हिस्सा शामिल था
  • अंतिम आकार code snippets को छोड़कर 44,000 English prose words है
    • तुलना के लिए The Great Gatsby 47,000 words की है
    • यह पिछले Nix संबंधित लेखों की series की आधी लंबाई से भी कम है
  • 5 महीनों के दौरान किताब के साथ-साथ ये काम भी किए गए

Website और built-in REPL

  • Janet for Mortals website का मुख्य उपकरण built-in REPL है
    • user कभी भी Escape key से REPL खोल सकता है
    • REPL page के नीचे fixed रहता है, इसलिए main text को ज्यादा नहीं ढकता
  • editor CodeMirror का उपयोग करता है
    • CodeMirror default रूप से Janet को support नहीं करता
    • पहले Bauble पर काम करते समय बनाए गए Janet language support को आधार बनाया गया
    • Bauble DSL में महत्वपूर्ण न रहे multi`backtick`quoted strings जैसे Janet syntax भी किताब में जरूरी थे
  • CodeMirror द्वारा इस्तेमाल की जाने वाली Lezer grammar को बेहतर करते हुए, उसी grammar को किताब के code snippets की syntax highlighting में भी reuse किया गया
    • ज्ञात static site generators में Janet code highlighting support करने वाला कोई नहीं मिला
    • शुरुआत में किताब black-and-white थी, लेकिन अपरिचित Janet syntax को ज्यादा friendly दिखाने के लिए रंग जोड़े गए
  • static site generator redo का उपयोग करके खुद लिखा गया
    • generator का core JavaScript में लिखा गया था, इसलिए Lezer grammar लगाई जा सकी
    • पूरी structure shell से जोड़ी गई एक fragile संरचना थी
  • Remark किताब के source text parsing और client REPL दोनों में इस्तेमाल हुआ
    • code blocks को labels देने वाला एक simple extension जोड़ा गया
    • Janet standard library docstrings Markdown में लिखे गए हैं, इसलिए REPL autocomplete में उन्हें तुरंत HTML में render किया जाता है

Autocomplete और one-way feedback

  • REPL autocomplete को Janet से पहली बार परिचित हो रहे readers के लिए महत्वपूर्ण माना गया
    • REPL शुरू होते समय WebAssembly के जरिए Janet environment को dynamically query किया जाता है
    • user docstring वाले नए symbols define करे तो भी वे autocomplete results में नहीं दिखते
    • हर command execution के बाद autocomplete को फिर से generate किया जा सकता था, लेकिन इसे उतना valuable नहीं माना गया
  • (report) function string लेकर उसे एक simple web server पर POST करता है, और server उसे SQLite database में store करता है
    • यह comment box जैसा है, लेकिन खास बात यह है कि इसे सीधे REPL से भेजा जाता है
    • इस feature से feedback पढ़कर कई errors ठीक किए गए
    • reply करने का कोई तरीका implement नहीं किया गया
  • report backend Janet नहीं, बल्कि एक छोटा Haskell application है
    • इसका काम सिर्फ POST request लेना और उसे SQLite database में डालना है
  • web server Janet में नहीं बनाया गया
    • web server में security को सबसे अहम factor माना गया
    • Janet और Janet HTTP libraries को सीधे internet से connect करने लायक पर्याप्त रूप से vetted नहीं माना गया

jimmy: C++ interop experiment

  • jimmy immer के लिए Janet binding है
    • immer एक persistent data structure library है
  • binding complete नहीं हुई, और जब तक इस्तेमाल की जरूरत न पड़े, इसे complete न करने की संभावना अधिक है
  • फिर भी Janet में C++ code के साथ interop करने का तरीका दिखाने वाले example के रूप में इसे सफल माना गया

Toodle.Studio और browser के अंदर Janet

  • Bauble पहले बनाया गया एक छोटा art playground था, और browser में Janet embed करने का पहला अनुभव था
    • उस समय Janet embedding पर ज्यादा material नहीं था
    • browser में WebAssembly, Emscripten और TypeScript को साथ इस्तेमाल करना पड़ता था, इसलिए difficulty ज्यादा थी
  • Bauble का अंतिम result ऐसा website था जिसकी application logic Janet में लिखी गई थी
    • UI में JavaScript काफी इस्तेमाल हुआ, लेकिन core logic Janet संभालती थी
  • browser में Janet इस्तेमाल करने की technique को अधिक accessible बनाना किताब लिखने की महत्वपूर्ण motivations में से एक था
  • किताब में Bauble के बजाय Toodle.Studio को example के रूप में बनाया गया
    • Bauble stateless था और string को string में बदलने वाली pure function के करीब था, इसलिए interop के दृष्टिकोण से simple था
    • Toodle.Studio Bauble का स्पष्ट fork है, लेकिन JavaScript और Janet के बीच interop ज्यादा complex है
  • Toodle.Studio में किताब के example के लिए अधिक उपयुक्त technical elements थे
    • लंबे समय तक चलने वाले Janet programs को समय के साथ asynchronously चलाना पड़ता है
    • JavaScript code एक ही Janet value को कई references के रूप में hold करता है, इसलिए memory management पर विचार करना पड़ता है
    • complex nested data structures को C++ के जरिए Janet के साथ exchange करना पड़ता है
  • Toodle.Studio logo Bauble से बनाई गई animated turtle है
    • turtle graphics demo होते हुए भी turtle न होने का feedback मिला, इसलिए इसे जोड़ा गया
    • आंखों को mouse follow करने लायक बनाया गया

cmd: Janet के लिए CLI argument parser

  • cmd command-line argument parsing library है
    • किताब में यह केवल करीब तीन paragraphs में आता है, लेकिन Janet को एक अच्छी scripting language के रूप में साफ दिखाने के लिए जरूरी था
  • cmd OCaml के Core.Command से बहुत प्रभावित है
    • Core.Command को author ने इस्तेमाल की हुई command-line argument parsing libraries में सबसे अच्छा माना
    • Janet में उसी experience को reproduce करने की कोशिश की गई
  • cmd Core.Command जितना अच्छा नहीं है
    • माना गया कि types होने पर सब कुछ बहुत आसान हो जाता है
    • फिर भी इसमें महत्वपूर्ण माने गए features के 95% हैं, और concise notation के कारण ad-hoc scripts में इस्तेमाल करना ज्यादा सुविधाजनक माना गया
  • अभी Bash autocomplete function generation feature missing है
    • Core.Command इसे automatically generate करता है
    • cmd API को बाद में यह feature जोड़ने लायक design किया गया है

judge: inline snapshot testing framework

  • judge 2021 में Janet से पहली बार बनाई गई चीजों में से एक है
  • Janet को बेहतर समझने के बाद इसे शुरू से फिर लिखा गया
    • API इस्तेमाल में बेहतर हो गई
    • implementation भी काफी simple और बदलने में आसान हो गई
  • Judge v1 और v2 के मुख्य अंतर test location और helpers हैं
    • tests केवल test/ directory में ही नहीं, normal source files के अंदर भी रह सकते हैं
    • test-macro और test-stdout helpers जोड़े गए
  • test-stdout का OCaml counterpart professional तौर पर tests लिखते समय लगभग अकेला इस्तेमाल किया जाने वाला तरीका बताया गया
    • OCaml में arbitrary data को source code में embed करने का अच्छा तरीका नहीं है, इसलिए सब कुछ strings में बदलने वाले approach से काम होता है
  • किताब release होने के बाद Judge में --interactive mode जोड़ा गया

to do: Bash के बजाय Janet से बनाया गया to-do tool

  • to do को scripting chapter के example के रूप में चुना गया
    • यह पहले Bash में बनाया गया non-trivial tool था, और Bash implementation painful था
  • Bash में खास तौर पर कठिन हिस्से text parsing और date handling थे
    • Sed से multi-line text parse करना enjoyable नहीं था
    • macOS और Linux पर समान तरीके से चलने वाला date manipulation practically impossible माना गया
  • Janet में PEG, sh, cmd का उपयोग करके original Bash to-do list से ज्यादा features तेजी से बनाए जा सके
    • उदाहरण के लिए fzf multi-select feature जोड़ा गया
    • Bash में null-terminated strings बनाना मुश्किल माना गया
  • किताब में केवल simplified version cover किया गया है
    • future tasks scheduling नहीं
    • task को “skip” करने की concept नहीं
    • core features list में items जोड़ना और complete करना हैं
  • zsh-autoquoter के साथ इस्तेमाल करने पर इसे unexpectedly useful app माना गया

लेखन के दौरान code work और maintenance

  • किताब पर 20 हफ्तों के काम में code writing लगभग आधा था
    • 8 हफ्ते code work थे, और कुछ अवधि में writing और coding साथ-साथ चले
  • शुरुआत में केवल Judge improvements और argument parser लिखने की उम्मीद थी
    • argument parser implementation उम्मीद से कहीं ज्यादा कठिन था
    • Bauble इतना simple था कि एक और नया art playground बनाना पड़ेगा, यह अनुमान नहीं था
  • वास्तविक लेखन Markdown को Sublime Text में लिखकर किया गया
    • Sublime Text लंबे prose लिखने के लिए पसंदीदा editor है
  • लेखन के दौरान Janet के 2 नए versions आए
    • debugging और native module chapters को language changes के अनुरूप update करना पड़ा
    • किताब को latest Janet release के अनुरूप maintain करने की योजना है

Launch response और पढ़े जाने की extent

  • किताब का promotion Hacker News submission, Lobsters submission और tweets तक था
    • Hacker News पर यह पूरे दिन front page पर रही और कुछ समय के लिए number 1 रही
  • Nginx access logs के आधार पर unique visitors इस प्रकार थे
    • शुक्रवार: 30,025 लोग
    • शनिवार: 9,568 लोग
    • रविवार: 3,777 लोग
  • ये numbers link click करने वालों की संख्या के करीब हैं, और वास्तव में किताब पढ़ने वालों की संख्या इससे बहुत कम मानी गई
  • site पर client-side behavior tracking analytics नहीं है
    • केवल access logs से rough estimate लगाया गया
  • chapter visit flow में retention अच्छा नहीं दिखा
    • chapter 1 home page visitors का 22%
    • chapter 2 chapter 1 visitors का 20%
    • chapter 3 chapter 2 visitors का 69%
    • chapter 4 “Pegular Expressions” और chapter 9 “Xenofunctions” में chapter 3 से ज्यादा visitors थे
  • launch weekend खत्म होने तक, actual readers की best estimate 387 लोग थी
    • इसे 5 या अधिक अलग chapters load करने वाले unique IPs के आधार पर निकाला गया

नाम की उत्पत्ति और feedback से दिखीं सीमाएं

  • Janet language का नाम The Good Place की अमर entity Janet से आया है
    • यह entity afterlife में जाने वाले mortals की मदद करती है, इसलिए किताब के title से भी जुड़ती है
  • सबसे कम visits वाला chapter “Testing and Debugging” था
    • यह किताब के अंत से तीसरा chapter है
    • अंतिम तीन chapters को किताब का सबसे interesting हिस्सा माना गया
    • उस chapter की testing approach को personal engineering career में productivity में सबसे बड़े improvements में से एक माना गया
  • built-in REPL के report feature से 494 feedback मिले
    • कई “अच्छी किताब” या test messages थे
    • दर्जनों typos reports, explanation requests और useful comments थे
  • कुछ users ने contact details के बिना questions भेजे, और reply feature न होने के कारण जवाब नहीं दिया जा सका
    • report feature को बहुत primitive one-way feedback feature के रूप में implement किया गया

1 टिप्पणियां

 
GN⁺ 2024-11-29
Hacker News की टिप्पणियां
  • उसी लेखक का https://bauble.studio/ भी छोड़ना नहीं चाहिए
    मेरे पुराने कंप्यूटर के ब्राउज़र में यह नहीं चलता, लेकिन लाइब्रेरी में पढ़ते-पढ़ते जब ब्रेक लेना होता है, तो लाइब्रेरी के कंप्यूटर पर करीब 30 मिनट bauble से खेलता रहता हूं
    सिर्फ संख्याएं इधर-उधर बदलकर जो ग्राफिक्स बनाए जा सकते हैं वे कमाल के हैं, और उम्मीद है Janet लंबे समय तक बना रहे

    • 2021 मॉडल MacBook Pro M1 Max, MacOs 15.1.1 पर यह Chrome में चलता है, लेकिन Firefox में unknown symbol twist compile error आता है
      error: script:16:1: compile error: unknown symbol twist
      in evaluate [lib/evaluator.janet] on line 81, column 7
      in bauble-evaluator/evaluate [lib/init.janet] on line 8, column 12
  • Janet की GNU Guile से तुलना करना दिलचस्प है
    Guile की मूल खूबी यह थी कि यह C के साथ-साथ आसानी से इस्तेमाल करने के लिए बनाई गई भाषा है, लेकिन पुरानी भाषा होने के कारण लगता है कि language toolchain में package manager को default तौर पर शामिल करने जैसी आधुनिक सोच अभी तक उसने नहीं अपनाई है
    Guile में मुझे यह बात पसंद है कि उसने RNRS standards के साथ compatibility समझाने में काफी मेहनत की है
    Janet असल में कितना Scheme जैसा है, यह नहीं जानता, लेकिन जानने की उत्सुकता है

    • Janet बिल्कुल Scheme जैसा नहीं है
      यह ज्यादा ऐसा है जैसे किसी ने Lua के ऊपर Clojure बना दिया हो
  • किताब https://janet.guide/ है, और भाषा https://janet-lang.org/ है

  • मुझे इस किताब का practical approach पसंद आया, और यही एक बड़ा कारण है कि मैं अभी Everybody Codes को Janet में हल करते हुए सीख रहा हूं
    https://everybody.codes

  • “कछुआ एक रूपक है” वाली अभिव्यक्ति थोड़ी खटकती है
    कछुआ रूपक नहीं, असल चीज था: http://classicacorn.computinghistory.org.uk/8bit_focus/logo/...
    बेशक “किसी दूसरी चीज का प्रतिनिधित्व करने वाली चीज, प्रतीक” वाली रूपक की परिभाषा में यह फिट बैठता है, लेकिन यह ऐसा मजाक लगता है जैसे किसी ने floppy disk वाले save icon को fridge समझ लिया हो
    लगता है कि यह संदर्भ छूट गया कि पुराने समय में सचमुच मजेदार और प्यारे hardware turtle होते थे

    • उस पेज पर जो दिख रहा है, उसे “असली” कछुआ कहना मुश्किल लगता है
  • शीर्षक देखकर मुझे लगा कि यह The Good Place की Janet से प्रेरित कोई और AI assistant होगा, लेकिन असल में यह programming language निकली, तो सुखद आश्चर्य हुआ
    Janet भाषा का नाम The Good Place की अमर सत्ता Janet से लिया गया है, जो इंसानों को afterlife में रास्ता खोजने में मदद करती है, इसलिए शीर्षक भी उसी के हिसाब से चतुर मजाक है
    default regex engine के बजाय PEG (Parsing Expression Grammar) साथ में देना भी अप्रत्याशित था
    मैं हमेशा चाहता था कि जो भाषा default regex library देती है, वह एक ढंग का PEG भी साथ दे

    • GNU Guile की standard library में भी PEG library है
      <https://www.gnu.org/software/guile/manual/html_node/PEG-Pars...> देखें
    • Janet का spork module एक तरह से libc जैसी जगह रखता है, और इसमें regex submodule भी है, इसलिए उसके installed होने की संभावना ज्यादा है
      PEG से मेरा पहला परिचय Janet के जरिए हुआ, लेकिन मुझे यह शक्तिशाली और इस्तेमाल में आसान लगा
      regex को 20 साल से ज्यादा समय तक थोड़ा-थोड़ा इस्तेमाल करने के बावजूद, PEG को मैं कुछ महीनों में ज्यादा अच्छी तरह समझने लगा
      Janet community में The Good Place से जुड़े callback भी बहुत हैं, और कई third-party modules के नाम characters पर रखे गए हैं
    • Elm भी मिलता-जुलता approach अपनाता है
      elm/regex और elm/parser built-in नहीं हैं, लेकिन elm/regex इसके बजाय elm/parser इस्तेमाल करने की सलाह देता है
      नाम की उत्पत्ति मुझे पसंद है, लेकिन Janet नाम की भाषा हो तो लगता है कि उसे control को प्राथमिकता देने की जिम्मेदारी भी निभानी चाहिए
  • किताब पढ़ी है और वह काफी दिलचस्प व playful लगी, जिससे Janet सीखना कहीं ज्यादा मजेदार हो गया
    हालांकि भाषा के docs कई मायनों में कमजोर थे
    functions या commands बस सूचीबद्ध थे, लेकिन अक्सर examples या explanation नहीं थे, या यह भी नहीं बताया गया था कि वे करते क्या हैं
    किताब में देखे गए features को docs में न खोज पाने के मामले भी बहुत थे, और Janet पसंद होने के बावजूद इसे सीखना रोक देने की एक वजह यही बनी
    यह अच्छा है कि इसमें कई sensible defaults हैं और यह पुराने Lisp conventions पर अड़े रहने के बजाय mainstream languages से कुछ समानता रखती है
    आखिरकार यह cons list नहीं है, इसलिए वास्तव में Lisp नहीं है, लेकिन वह ठीक है
    समस्या यह है कि भाषा पर्याप्त रूप से documented नहीं है

    • जानना चाहूंगा कि क्या आपको वे functions या commands याद हैं जो documented नहीं थे
      मैं Janet community में कुछ हद तक active हूं, इसलिए अगर कमी वाली जगहें पता चलें तो documentation सुधार में योगदान दे सकता हूं
    • किताब नहीं पढ़ी, इस बात को छोड़ दें तो मेरा अनुभव भी बिल्कुल ऐसा ही था
      कई बार सिर्फ function signature होता था और कोई अतिरिक्त explanation बिल्कुल नहीं होती थी
      मुझे पता है कि व्यापक docs बनाने में समय और मेहनत लगती है, लेकिन ऐसा इतनी बार हुआ कि मैंने इसे छोड़ दिया और binary में compile होने वाला दूसरा Lisp ढूंढना शुरू कर दिया
  • मैं Janet के साथ ठीक से सहज नहीं हो पाया, पता नहीं समस्या मेरी थी या नहीं
    लंबे समय तक इस्तेमाल किया हुआ मेरा इकलौता दूसरा Lisp Emacs Lisp है, और Janet इतना मिलता-जुलता भी है और सूक्ष्म रूप से अलग भी कि मैं लगातार छोटी-छोटी गलतियां करता रहा
    PEG feature docs में आकर्षक लगा, लेकिन syntax संभालने में असुविधाजनक और भ्रमित करने वाला था
    docs इस अर्थ में पूरे थे कि सभी functions का description था, लेकिन examples या उपयोगी usage information की कमी के कारण वे बहुत संक्षिप्त थे
    JSON parsing जैसी basic functionality भी शामिल नहीं लगती थी
    अगर तेज script लिखने के लिए बनी भाषा में पहले JSON या XML parser लिखना पड़े, तो वह काम पहले ही fail हो चुका है
    यह करीब 4 साल पहले की बात है, इसलिए ecosystem बेहतर हो चुका हो सकता है, और script use के लिए Janet को आंकने का मेरा मापदंड ही गलत रहा हो सकता है
    फिर भी इस लेख को देखकर दोबारा install करके देखने का मन हो रहा है

    • JSON और regex जैसी चीजें spork module में रखी गई हैं, जो एक तरह से libc जैसी जगह रखता है
      core को हल्का रखने की मजबूत internal preference है
      कई projects spork पर depend करते हैं, इसलिए शुरुआती दौर में ही उसके installed होने की संभावना ज्यादा है
      docs ठीक-ठाक हैं, लेकिन practical examples में अभी भी gaps हैं, इससे सहमत हूं
      इस हिस्से को https://janetdocs.com पूरा कर रहा है, और हर function के लिए “community examples” से link करता है
  • विषय से थोड़ा हटकर, मूल लेखक के दूसरे blog posts की वजह से मैंने split mechanical keyboard इस्तेमाल करना शुरू किया
    कई सालों से कंधे और कलाई में दर्द था, इसमें मदद मिली, और Ian के दूसरे लेख भी देखने की जोरदार सलाह देता हूं

  • कभी भी Esc दबाकर नीचे चिपकने वाला built-in REPL खोलने का तरीका शायद अच्छा फैसला नहीं है
    browser में Esc का default shortcut पहले से होता है, और Firefox में Esc दबाने पर fullscreen से बाहर आ जाता है