2 पॉइंट द्वारा GN⁺ 2024-01-15 | 1 टिप्पणियां | WhatsApp पर शेयर करें

K भाषा में सोचना

  • K प्रोग्रामिंग ज़्यादातर REPL के ज़रिए की जाती है.
  • ngn/k का rlwrap arrow keys से history ब्राउज़ करने देता है, इसलिए यह बड़े प्रोग्राम डेवलपमेंट के लिए उपयोगी है.
  • फ़ंक्शनों को पहले REPL में टेस्ट किया जाता है, फिर उन्हें वास्तविक कोड में ले जाया जाता है.
  • ngn/k का pretty output हमेशा वैध K data लौटाता है और प्रोग्राम की speed बढ़ाने के लिए इसे पहले से compute किया जा सकता है.
  • K scripts वैसे ही चलती हैं जैसे REPL में input दिया गया हो, और हर लाइन का return value print होता है जब तक वह semicolon पर ख़त्म न हो.
  • Scripts multi-line definitions की अनुमति देती हैं, जिससे readability बेहतर होती है.
  • काम को script में सेव करके REPL में इस्तेमाल करने के लिए, \lfile.k का उपयोग करके फ़ाइल चलाई जा सकती है और data load किया जा सकता है.
  • REPL में किसी फ़ाइल को कई बार load करके पहले के data को overwrite किया जा सकता है.
  • \ से मिलने वाले REPL help में कई उपयोगी commands होते हैं.

ऐरे प्रोग्रामिंग का सरलीकरण

  • ऐरे प्रोग्रामिंग जटिल patterns को छोटे, declarative और पढ़ने में आसान patterns में सरल बनाने की एक लगातार चलने वाली प्रक्रिया है.
  • जटिल patterns को सरल बनाने के तरीक़ों पर "APL में patterns और anti-patterns: शुरुआती स्तर के ठहराव से बाहर निकलना - Aaron Hsu - Dyalog '17" में विस्तार से चर्चा की गई है.

मैट्रिक्स multiplication का K रूपांतरण

  • Wikipedia लेख से लिया गया मैट्रिक्स multiplication का iterative algorithm सीधे K में बदला जा सकता है.
  • K में बदले गए सबसे खराब code उदाहरण में बहुत सारे global variable assignments, nested loops और काफ़ी modifications की ज़रूरत होती है.
  • Code को सरल बनाकर इन समस्याओं को एक-एक करके हल किया जा सकता है.

inner loop का सरलीकरण

  • inner loop में sum को fold(/) का उपयोग करके सरल बनाया जा सकता है.
  • ' (each) एक array लौटाता है, इसलिए C global variable को हटाया जा सकता है.
  • i, j, k variables को हटाकर loop को सरल किया जा सकता है.

loops हटाना और global variables को न्यूनतम करना

  • k के बिना सीधे rows और columns को match करके बीच वाला loop हटाया जा सकता है.
  • j को हटाने के लिए B के हर column को A[i] के साथ pair किया जा सकता है.
  • i को हटाने के लिए eachleft का उपयोग करके A की हर row को B के हर column के साथ pair किया जा सकता है.
  • अब global variables की ज़रूरत नहीं रहती.

मैट्रिक्स multiplication फ़ंक्शन का अंतिम रूप

  • + (transpose) महँगा होता है, इसलिए इसे हटाया जा सकता है.
  • x की हर row को y के हर column से गुणा करने के बजाय, B की हर row को पूरे A के साथ मिलाकर वही काम implicit रूप से किया जा सकता है.
  • अंत में एक संक्षिप्त और स्पष्ट मैट्रिक्स multiplication फ़ंक्शन मिलता है.
  • Code को सरल बनाने की प्रक्रिया शुरुआत में कई चरणों से गुज़रती है, लेकिन K में दक्षता बढ़ने पर यह अधिक आसान और intuitive हो सकती है.
  • मैट्रिक्स multiplication एक सरल प्रक्रिया है जो K के array support के साथ अच्छी तरह मेल खाती है.
  • K के साथ कम मेल खाने वाले और भी algorithms तथा उनसे निपटने के तरीक़े भविष्य के अध्यायों में देखे जाएँगे.

GN⁺ की राय

  • यह लेख दिखाता है कि K भाषा का उपयोग करके मैट्रिक्स multiplication जैसे algorithms को कैसे सरल और optimize किया जा सकता है.
  • REPL के ज़रिए तुरंत मिलने वाला feedback और code का iterative improvement, K programming की मुख्य विशेषताएँ हैं, और यह junior software engineers के लिए भी उपयोगी सीखने का तरीका है.
  • Code simplification की प्रक्रिया programming क्षमता को बेहतर बनाने में महत्वपूर्ण है, और यह लेख उसे ठोस उदाहरणों के साथ आसानी से समझाता है.

1 टिप्पणियां

 
GN⁺ 2024-01-15
Hacker News राय
  • कई लोग array languages की उपयोगिता और उन्हें समझ पाने की क्षमता पर सवाल उठाते हैं.

    • array languages हर समस्या के लिए उपयुक्त नहीं हैं.
    • कई तरह की समस्याओं के लिए ये आश्चर्यजनक रूप से सक्षम हैं.
    • array languages के उपयोगकर्ता आम तौर पर बहुत बुद्धिमान होते हैं.
    • array languages कैसे काम करती हैं, यह सीखना एक बड़ी चुनौती है.
    • array languages में "procedural" code लिखना बहुत बुरी बात मानी जाती है.
    • tacit programming को समझना दिमाग़ का दायरा बढ़ाने वाला शानदार अनुभव है.
    • verb trains को आत्मसात करते समय होने वाला अनुभव.
    • array-based languages सभी dimensions के arrays को कैसे संभालती हैं, इसे समझना.
    • "under" कैसे काम करता है, यह समझना.
    • function exponents कैसे काम करते हैं, यह समझना.
  • array languages के कई चौंकाने वाले पहलू हैं, और ऊपर दी गई सूची उनमें से केवल कुछ ही हैं.

    • Aaron Hsu को parallel APL compiler विकसित करते देखते हुए array languages की वास्तविक क्षमता पर भरोसा हो गया.
    • APL code की "semantic density" पर चर्चा.
  • अगर आपने array programming के बारे में कभी नहीं सुना और एक परिचय चाहते हैं, तो "The Array Cast" की सिफारिश की जाती है.

  • 70 के दशक में APL/APL2 खोजा और उससे मोहित हो गया, लेकिन functions को compose करने की क्षमता और भी अधिक आकर्षक लगी.

    • Haskell शुद्ध और typed है, इसलिए APL की तुलना में अधिक मज़ेदार और शक्तिशाली है.
    • APL का "thought के tool के रूप में notation" अत्यधिक संक्षिप्तता को सही ठहराने वाला तर्क लगता है.
  • array languages का उपयोग करते समय सबसे महत्वपूर्ण समझ:

    • verbs ही algorithms हैं.
    • verbs (या adverbs) का क्रम मेरे द्वारा इस्तेमाल किया गया सबसे प्रत्यक्ष composition तरीका है.
    • program वाक्यों और expressions का समूह नहीं, बल्कि algorithms की composition है.
    • arrays, maps, और functions में domain और range को एकसमान ढंग से संभालने की अवधारणा.
    • code पढ़ते समय आँखों को "इधर-उधर कूदने" की ज़रूरत नहीं पड़ती; मूल्यांकन बाएँ से दाएँ होता है.
    • data तक code भेजना संभव है और इसे प्राथमिकता दी जाती है.
    • K language का अतिरिक्त लाभ: views (यानी dependencies) को सीधे implement किया जा सकता है, और interpreter के ज़रिए hot code loading संभव है.
  • array languages के बारे में एक सवाल: "N से छोटे उन सभी numbers को कैसे खोजा जाए जिनके लिए condition P true है" जैसे काम कैसे किए जाते हैं?

    • array languages में आम तौर पर 1 से N तक का array बनाया जाता है, array पर condition test की जाती है, और फिर केवल वे elements पाने के लिए mask लगाया जाता है जिन पर condition true हो.
    • अगर N बड़ा हो और condition अक्सर true न हो, तो बेवजह बहुत सारे temporary arrays बनाना memory और resources की बर्बादी लगता है.
    • array languages के implementations इस समस्या को optimize कर सकते हैं, या lazy evaluation जैसी तकनीकों का उपयोग करके इसे हल कर सकते हैं.
  • J language के बारे में अनुभव: array languages का paradigm पक्षपाती है, और हर समस्या को arrays के nesting के रूप में सोचना मददगार है या नहीं, इस पर भरोसा नहीं है.

    • ऐसे data structures को स्वतंत्र रूप से बनाना जो समस्या को सरल कर सकें, algorithm वाले हिस्से को काफ़ी हद तक सरल बना सकता है.
    • APL/J/K का उपयोग करने के लिए इस पक्षपात की वजह से और अधिक बुद्धिमान होना पड़ता है.
  • K language की problems हल करते समय मिला प्रभाव: K language जानबूझकर दुरूह है.

    • यह puzzles और चतुर solutions के लिए उपयुक्त भाषा है, लेकिन Python में numpy arrays के साथ काम करना array languages सीखने और arrays में सोचना सिखा देता है.
  • array language J का उदाहरण: dot =: +/ . * का उपयोग करके P और Q का dot product निकाला जाता है.

  • K language का syntax अधिक छोटा है, लेकिन K language कैसे काम करती है, इसके बारे में बहुत-सा अंतर्निहित संदर्भ दिमाग़ में बनाए रखना पड़ता है.