2 पॉइंट द्वारा GN⁺ 2024-02-12 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Aho AWK में लागू किया गया Git है, जो Git की आंतरिक संरचना और GNU AWK की नई सुविधाओं को समझने के लिए बनाया गया एक toy project है
  • इसका उद्देश्य वास्तविक उपयोग नहीं, बल्कि मनोरंजन और शिक्षा है, और यह Git का विकल्प बनने के लिए नहीं बनाया गया है
  • इसे चलाने के लिए gawk 5.0 या उससे ऊपर चाहिए, zlib compression के लिए फिलहाल pigz का उपयोग होता है, और बाकी के लिए GNU coreutils उपलब्ध होने वाला environment मान लिया गया है
  • यह अधिकांश Linux सिस्टम पर चल सकता है, लेकिन BSD/Mac environment के लिए उपयुक्त नहीं है
  • लागू की गई सुविधाओं में init, add/rm, status, commit, read-only config, cat-file शामिल हैं, और network features clonepush जोड़ने की कोई योजना नहीं है

Aho का उद्देश्य और दायरा

  • Aho एक ऐसा project है जिसका लक्ष्य “AWK में लागू किया गया Git” बनाना है
  • यह दिखाने के लिए एक toy project है कि modern AWK one-liner scripts से कहीं अधिक काम कर सकता है
  • इसका फोकस Git की आंतरिक संरचना और GNU AWK की नई सुविधाओं को समझने पर है
  • यह व्यावहारिक उपयोग की तुलना में मनोरंजन और शिक्षा के लिए अधिक बनाया गया project है

रनटाइम environment

  • आवश्यक runtime environment इस प्रकार है
    • gawk 5.0 या उससे ऊपर
    • zlib compression के लिए pigz
    • GNU coreutils
  • यह अधिकांश Linux पर चल सकता है, लेकिन BSD या Mac environment के लिए उपयुक्त नहीं है

बुनियादी उपयोग प्रवाह

  • source ./modpath से environment तैयार करने के बाद aho init चलाने पर .aho directory में एक खाली Git repository initialize होती है
  • aho add -v . चलाने पर files जोड़ते समय .gitignore, LICENSE, README.md, aho, aho.awk, include/*.awk जैसी entries output में दिखाई देती हैं
  • नई file बनाने के बाद aho add -v . फिर से चलाने पर वह file भी जुड़ जाती है
  • .aho/ के नीचे Git जैसी structure बनती है
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • GIT_DIR=.aho git ls-files --stage के जरिए यह उदाहरण दिया गया है कि Git tool .aho repository की index entries को पढ़ सकता है

लागू की गई सुविधाएँ और बाकी काम

  • पूरी की गई सुविधाएँ
    • init
    • add/rm
    • status
    • commit
    • read-only config
    • cat-file
  • अभी अधूरी सुविधाएँ
    • reset
    • branch
    • switch
    • ls-files

network features बाहर रखी गई हैं

  • network features जोड़ने की कोई योजना नहीं है
  • GNU AWK से network features लागू किए जा सकते हैं, लेकिन Aho में clone या push जोड़ने का इरादा नहीं है
  • ऐसे योगदानों का स्वागत है जो AWK या Git के बारे में समझ को बेहतर बनाने में मदद करें

1 टिप्पणियां

 
GN⁺ 2024-02-12
Hacker News की राय
  • Awk शानदार है। Unix जैसे सिस्टमों में लगभग हर जगह मौजूद एक पूर्ण programming language है, लेकिन व्यवहार में लगता है कि इसे ज़्यादातर piped standard output से text के टुकड़े निकालने वाली one-liner command के रूप में इस्तेमाल किया जाता है
    लेकिन Awk को general-purpose scripting language के रूप में भी इस्तेमाल किया जा सकता है, और इस काम में यह कई मायनों में Bash से बेहतर है। सोचता हूँ कि असल दुनिया में Awk scripts ज़्यादा बार क्यों नहीं दिखतीं। शायद इसकी वजह यह हो कि Perl ने shell, Awk और sed की खूबियों को एक ही language में मिलाने की कोशिश की थी, और बाद में लोगों ने Perl को खराब मानकर उससे दूरी बना ली
    [1] NetBSD source code से एक random excerpt: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...

    • सही बात है। Perl ने Awk की जगह ली, लेकिन कई मामलों में यह उल्टा असर साबित हुआ। क्योंकि Perl code को इस तरह सरल और व्यापक रूप से समझ में आने वाले ढंग से लिखने का तरीका नहीं था कि दूसरा programmer उसे आसानी से पढ़ सके और वह medium-to-large programs तक scale कर सके
      इसका मतलब यह नहीं कि किसी ने भी यह अच्छा नहीं किया, लेकिन पूरी industry में success rate कम था, इसलिए Perl की काफी खराब reputation बन गई
      Awk का revival देखना चाहूँगा। Awk को बड़े स्तर तक expand करना कम आसान है, इसलिए छोटे Awk से शुरू हुआ project अगले व्यक्ति को हज़ारों lines वाले Awk codebase के रूप में सौंपे जाने का जोखिम कम होता है। इसके बजाय, अपेक्षाकृत जल्दी उसे किसी ज़्यादा scalable और maintainable language में फिर से लिख दिया जाता है
    • लोग चाहे जो सोचें, मुझे पता चला कि मुझे Perl पसंद है। हाल में जो बनाया वह एक programmable partition editor है। यह sfdisk से partitions खाली करने जैसा है, लेकिन मैं simple delete से ज़्यादा करना चाहता था और MBR व GPT partition tables को जोड़कर hybrid बनाना चाहता था
      मज़ेदार था और मैं Perl फिर इस्तेमाल करूँगा। Awk भी इतना शानदार है, यह देख लिया है, तो शायद किसी दिन उसे भी इस्तेमाल करूँ
      [1] https://github.com/csdvrx/hdisk/
    • Awk बेहद उपयोगी है। इस हफ्ते मैंने कई GB के Postgres logs parse करके यह जवाब देने वाली script लिखी कि “हर घंटे के ठीक बाद के कुछ मिनटों में सबसे ज़्यादा queries किस user ने चलाईं?”
      कुछ functions, कुल मिलाकर 20 lines से थोड़ा ज़्यादा code, और sort व uniq के कुछ pipes काफी थे, और यह काफ़ी तेज़ था। खासकर आगे LC_ALL=C लगा दें तो और तेज़
      [0]: अगर आप पूछें कि observability इतनी ठीक क्यों नहीं थी कि ऐसे काम की जरूरत ही न पड़े, तो आप गलत नहीं होंगे, लेकिन कभी-कभी दिए गए reality में ही जीना पड़ता है
      [1]: मुझे पता है कि gawk list बनाते हुए unique sort कर सकता है। outage response के आखिरी चरण में थका हुआ था, और | sort | uniq -c | sort -rn याद रखना कहीं आसान था
      [1].a: मुझे यह भी पता है कि sort में -u argument होता है। वह counts नहीं देता, और unique processing भी uniq implementation से काफी धीमी है
    • Perl को खराब मानना Awk renaissance की एक बड़ी driving force है। जिन developers ने शुरू से Perl नहीं सीखा, वे shell और Python के बीच की खाली जगह भरने के लिए कुछ चाहते हैं, और मेरे जैसे developers भी हैं जिन्होंने अनिच्छा से Perl छोड़ दिया
      HN पसंद वाले लोगों ने Perl को “cool नहीं” माना, इसलिए Perl और Perl में लिखे सारे code पर अब मानो expiry date लग गई है। लेकिन Awk POSIX standard है, इसलिए वे लोग इसे खत्म नहीं कर सकते
    • AWK पसंद है। इसकी string-centric typing तो Javascript programmers को भी शर्मिंदा कर दे। 0, "", और सचमुच कुछ भी न होना—ये सभी समान false value हैं
      Numbers, Lua की तरह, number को represent करने वाली strings से अलग नहीं हैं। फिर भी अजीब तरह से इससे परेशानी नहीं होती। अगर numbers को numbers और strings को strings ही बनाए रखना जरूरी हो, तो value के आगे # या $ जैसा marker लगा दें और बाद में substr() से उसे हटा दें
  • The AWK Programming Language, Second Edition सितंबर 2023 में आई थी
    https://awk.dev
    पहला edition 1988 में प्रकाशित हुआ था और यहाँ देखा जा सकता है: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
    चर्चा: https://news.ycombinator.com/item?id=13451454

    • यह 35 साल का अंतर editor के “तो दूसरा edition कैसा चल रहा है?” पूछने पर सुनाने लायक अच्छी कहानी है
    • Brian Kernighan भी साथ हैं। K&R C के “K” और कई और Unix legends के नायक
  • इस तरह के code को देखें तो function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) में बड़े space के बाद वाले parameters local variables हैं। values pass की जा सकती हैं, लेकिन इन्हें उस तरह इस्तेमाल करने के लिए नहीं बनाया गया
    मैंने GNU Awk में सचमुच lexical variables bind करने वाला let statement जोड़ने के लिए patch लिखा, ताकि function read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } } जैसा बनाया जा सके
    दुर्भाग्य से project ने इसे reject कर दिया, और नाम बदलकर GNU Awk का fork बनाने की सलाह दी, तो मैंने वैसा ही किया
    https://www.kylheku.com/cgit/egawk/about/

    • मुझे लगता है कि उस फैसले में भी दम है। gawk पहले से ही awk से बहुत अलग है। अगर और अलग दिखने वाला syntax जोड़ना है, तो बस fork करके उसे अलग नाम देना बेहतर है
  • अगर पूछा जाए कि Linux command line को सबसे अच्छा development environment क्यों कहा जाता है, तो जिन tools की ओर अक्सर इशारा किया जाता है उनमें से एक Awk है। सिर्फ बुनियादी Awk जानकर भी कम चीज़ों से बहुत कुछ किया जा सकता है, और IDE उल्टा सुस्त लगने लगती है
    अगर आप Awk सीखना चाहते हैं और lecture-style learning आपके लिए ठीक बैठती है, तो कुछ साल पहले Linux Fest Northwest के लिए बनाई गई मेरी presentation YouTube पर रिकॉर्ड है: https://youtu.be/E5aQxIdjT0M

    • साथ ही Unicode support बहुत देर से, शायद करीब 2 साल पहले ही जोड़ा गया। दूसरे shell tools की तरह pipe से content Awk में भेजते समय भी edge cases हैं
      CTRL+D जैसी sequences input को काट सकती हैं, और ऐसे दर्जनों दूसरे edge cases भी होंगे जिन्हें मैं नहीं जानता, और वे सबसे खराब वक्त पर काट खाएंगे
      Awk एक प्रभावशाली tool है, लेकिन उसे pedestal पर रख देने से उसकी कमजोरियां छिप जाती हैं। गंभीर काम को उस काम के हिसाब से बने, ज्यादा specialized और modern tools पर ले जाना बेहतर हो सकता है
    • Awk IDE को कैसे replace करता है? मुझे Awk पसंद है, और यह भी जानता हूं कि समय देकर सीखने पर यह powerful है, लेकिन IDE न होता तो मेरी productivity काफी गिर जाती
      IDE जो करता है उसका ज्यादातर हिस्सा text editing नहीं, बल्कि code को समझने और बदलने में मदद करना है। मैं यह नहीं कह रहा कि आप गलत हैं, बस उस बात का perspective जानना चाहता हूं
  • पहले मुझे लगा कि यह नाम Japanese slang “बेवकूफ” के लिए इस्तेमाल होने वाले aho(アホ) से आया है, फिर याद आया कि Alfred Aho ही awk का a हैं। शायद दोनों ही हों?

    • लगता है दोनों ही होंगे। “Git” भी पहले से “मूर्ख व्यक्ति” के लिए slang था, इसलिए यह witty नाम है
    • हाल में मैंने इसे Reservation Dogs में सुना था: https://en.wiktionary.org/wiki/aho#Navajo
    • लगता है दोनों ही होंगे। सच में बहुत smart pun है
  • शानदार project और अच्छा idea है। बुनियाद को समझना दूसरे projects और समस्याओं को देखने का अलग नजरिया देता है
    पहले मैंने Awk में एक web-based wiki बनाई थी। वजह यह थी कि मैं बहुत कम memory वाला Linksys router इस्तेमाल कर रहा था
    यह सीखने के लिए अच्छा था कि wiki कैसे काम करती है और Awk से क्या किया जा सकता है। भरोसा करने के लिए libraries नहीं थीं, इसलिए basics खुद implement करने पड़े, और उसी से सही समझ बनी

  • इसमें कहा गया था, “network functionality जोड़ने की कोई योजना नहीं है। बेशक यह संभव है, लेकिन clone या push नहीं होंगे,” जबकि उसी computer की किसी दूसरी directory में मौजूद repository से भी git clone किया जा सकता है और push भी किया जा सकता है

    • सही। लेकिन branches होने पर local clone बनाने की जरूरत कुछ हद तक कम हो जाती है। असल में मैं local git repository copy करने के लिए rsync इस्तेमाल कर रहा हूं। सवाल यह है कि सबसे अच्छा क्या है
    • यह इतना obvious है, फिर भी git को 10 साल इस्तेमाल करने के बावजूद मैंने कभी इसे try करने के बारे में नहीं सोचा
  • यह खयाल बार-बार रहता है कि क्या GNU utilities और कुछ programs, और शायद उससे भी ज्यादा कुछ नहीं, से performance और functionality में specialized tools से आगे निकलने वाला सर्वशक्तिमान database और processing tool बनाया जा सकता है। क्या ऐसा सिर्फ मुझे लगता है?

  • संबंधित हो सकता है
    sed-chess: https://news.ycombinator.com/item?id=37896854
    awk-raycaster: https://github.com/TheMozg/awk-raycaster

  • अगर इसने cppawk इस्तेमाल किया होता, जो development के समय नहीं था, तो #include इस्तेमाल किया जा सकता था। यह file-based relative paths के साथ ठीक काम करता है और AWKPATH की जरूरत नहीं होती
    preprocessed program को single file के रूप में “build” भी किया जा सकता है, इसलिए उसके बाद cppawk की जरूरत नहीं रहती
    https://www.kylheku.com/cgit/cppawk/about/