Awk में लागू किया गया Git, Aho
(github.com/djanderson)- Aho AWK में लागू किया गया Git है, जो Git की आंतरिक संरचना और GNU AWK की नई सुविधाओं को समझने के लिए बनाया गया एक toy project है
- इसका उद्देश्य वास्तविक उपयोग नहीं, बल्कि मनोरंजन और शिक्षा है, और यह Git का विकल्प बनने के लिए नहीं बनाया गया है
- इसे चलाने के लिए
gawk5.0 या उससे ऊपर चाहिए, zlib compression के लिए फिलहालpigzका उपयोग होता है, और बाकी के लिए GNU coreutils उपलब्ध होने वाला environment मान लिया गया है - यह अधिकांश Linux सिस्टम पर चल सकता है, लेकिन BSD/Mac environment के लिए उपयुक्त नहीं है
- लागू की गई सुविधाओं में
init,add/rm,status,commit, read-onlyconfig,cat-fileशामिल हैं, और network featurescloneवpushजोड़ने की कोई योजना नहीं है
Aho का उद्देश्य और दायरा
- Aho एक ऐसा project है जिसका लक्ष्य “AWK में लागू किया गया Git” बनाना है
- यह दिखाने के लिए एक toy project है कि modern AWK one-liner scripts से कहीं अधिक काम कर सकता है
- इसका फोकस Git की आंतरिक संरचना और GNU AWK की नई सुविधाओं को समझने पर है
- यह व्यावहारिक उपयोग की तुलना में मनोरंजन और शिक्षा के लिए अधिक बनाया गया project है
रनटाइम environment
- आवश्यक runtime environment इस प्रकार है
gawk5.0 या उससे ऊपर- zlib compression के लिए
pigz - GNU coreutils
- यह अधिकांश Linux पर चल सकता है, लेकिन BSD या Mac environment के लिए उपयुक्त नहीं है
बुनियादी उपयोग प्रवाह
source ./modpathसे environment तैयार करने के बादaho initचलाने पर.ahodirectory में एक खाली 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 बनती हैbranchesconfigdescriptionHEADindexobjectsrefs/headsrefs/tags
GIT_DIR=.aho git ls-files --stageके जरिए यह उदाहरण दिया गया है कि Git tool.ahorepository की index entries को पढ़ सकता है
लागू की गई सुविधाएँ और बाकी काम
- पूरी की गई सुविधाएँ
initadd/rmstatuscommit- read-only
config cat-file
- अभी अधूरी सुविधाएँ
resetbranchswitchls-files
network features बाहर रखी गई हैं
- network features जोड़ने की कोई योजना नहीं है
- GNU AWK से network features लागू किए जा सकते हैं, लेकिन Aho में
cloneयाpushजोड़ने का इरादा नहीं है - ऐसे योगदानों का स्वागत है जो AWK या Git के बारे में समझ को बेहतर बनाने में मदद करें
1 टिप्पणियां
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...
इसका मतलब यह नहीं कि किसी ने भी यह अच्छा नहीं किया, लेकिन पूरी industry में success rate कम था, इसलिए Perl की काफी खराब reputation बन गई
Awk का revival देखना चाहूँगा। Awk को बड़े स्तर तक expand करना कम आसान है, इसलिए छोटे Awk से शुरू हुआ project अगले व्यक्ति को हज़ारों lines वाले Awk codebase के रूप में सौंपे जाने का जोखिम कम होता है। इसके बजाय, अपेक्षाकृत जल्दी उसे किसी ज़्यादा scalable और maintainable language में फिर से लिख दिया जाता है
मज़ेदार था और मैं Perl फिर इस्तेमाल करूँगा। Awk भी इतना शानदार है, यह देख लिया है, तो शायद किसी दिन उसे भी इस्तेमाल करूँ
[1] https://github.com/csdvrx/hdisk/
कुछ 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 में
-uargument होता है। वह counts नहीं देता, और unique processing भी uniq implementation से काफी धीमी हैHN पसंद वाले लोगों ने Perl को “cool नहीं” माना, इसलिए Perl और Perl में लिखे सारे code पर अब मानो expiry date लग गई है। लेकिन Awk POSIX standard है, इसलिए वे लोग इसे खत्म नहीं कर सकते
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
इस तरह के 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 करने वाला
letstatement जोड़ने के लिए 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/
अगर पूछा जाए कि Linux command line को सबसे अच्छा development environment क्यों कहा जाता है, तो जिन tools की ओर अक्सर इशारा किया जाता है उनमें से एक Awk है। सिर्फ बुनियादी Awk जानकर भी कम चीज़ों से बहुत कुछ किया जा सकता है, और IDE उल्टा सुस्त लगने लगती है
अगर आप Awk सीखना चाहते हैं और lecture-style learning आपके लिए ठीक बैठती है, तो कुछ साल पहले Linux Fest Northwest के लिए बनाई गई मेरी presentation YouTube पर रिकॉर्ड है: https://youtu.be/E5aQxIdjT0M
CTRL+Dजैसी sequences input को काट सकती हैं, और ऐसे दर्जनों दूसरे edge cases भी होंगे जिन्हें मैं नहीं जानता, और वे सबसे खराब वक्त पर काट खाएंगेAwk एक प्रभावशाली tool है, लेकिन उसे pedestal पर रख देने से उसकी कमजोरियां छिप जाती हैं। गंभीर काम को उस काम के हिसाब से बने, ज्यादा specialized और modern tools पर ले जाना बेहतर हो सकता है
IDE जो करता है उसका ज्यादातर हिस्सा text editing नहीं, बल्कि code को समझने और बदलने में मदद करना है। मैं यह नहीं कह रहा कि आप गलत हैं, बस उस बात का perspective जानना चाहता हूं
पहले मुझे लगा कि यह नाम Japanese slang “बेवकूफ” के लिए इस्तेमाल होने वाले aho(アホ) से आया है, फिर याद आया कि Alfred Aho ही
awkकाaहैं। शायद दोनों ही हों?शानदार 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 भी किया जा सकता है
यह खयाल बार-बार रहता है कि क्या 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
https://github.com/soimort/translate-shell
अगर इसने cppawk इस्तेमाल किया होता, जो development के समय नहीं था, तो
#includeइस्तेमाल किया जा सकता था। यह file-based relative paths के साथ ठीक काम करता है औरAWKPATHकी जरूरत नहीं होतीpreprocessed program को single file के रूप में “build” भी किया जा सकता है, इसलिए उसके बाद cppawk की जरूरत नहीं रहती
https://www.kylheku.com/cgit/cppawk/about/