• अलग-अलग syntax से ज़्यादा बेसिक pattern के समूहों का अंतर महत्वपूर्ण है, और programming languages को iteration, recursion, और composition के तरीकों के आधार पर सात आदिरूप भाषाओं में बाँटा जा सकता है
  • ALGOL, Lisp, ML, Self, Forth, APL, Prolog मुख्य वर्ग हैं, और हर परिवार में एक प्रतिनिधि भाषा को मानक नमूने की तरह लेकर दूसरी भाषाओं की वंशरेखा समझी जाती है
  • किसी परिचित आदिरूप भाषा को साझा करने वाली नई भाषा सीखना आसान होता है, लेकिन किसी अपरिचित आदिरूप में जाने पर नई सोच की दिशा और काफ़ी सीखने का समय चाहिए
  • ALGOL में assignment, conditional, और loop-केंद्रित function organization है; Lisp में macro और list code; ML में first-class functions और recursion; Self में message-passing objects; Forth में stack-based syntax; APL में n-dimensional arrays; और Prolog में facts तथा search structure मुख्य विशेषताएँ हैं
  • हर programmer के लिए ALGOL परिवार की भाषा में दक्षता पहली प्राथमिकता है, उसके बाद SQL सीखना, और फिर आगे चलकर अपरिचित आदिरूप भाषाओं को लगातार सीखते रहना दीर्घकाल में फ़ायदेमंद है

प्रोग्रामिंग की सात आदिरूप भाषाएँ

  • programming language चुनते समय अलग-अलग syntax के अंतर से ज़्यादा बुनियादी pattern सीखना महत्वपूर्ण है, और एक जैसे परिवारों की भाषाओं में array traversal या combination traversal जैसी मूल संरचनाएँ लगभग एक जैसी होती हैं
  • अलग-अलग language groups में iteration, recursion, और program composition के तरीके काफ़ी अलग होते हैं, और ऐसे बुनियादी pattern के समूह मिलकर अलग आदिरूप भाषाएँ बनाते हैं
  • किसी परिचित आदिरूप भाषा को साझा करने वाली नई भाषा सीखना अपेक्षाकृत आसान बदलाव है, लेकिन अपरिचित आदिरूप भाषा की ओर जाने पर काफ़ी समय और नई सोच की दिशा चाहिए
  • software क्षेत्र में पहचानी जाने वाली आदिरूप भाषाएँ सात हैं: ALGOL, Lisp, ML, Self, Forth, APL, Prolog
  • हर आदिरूप भाषा को एक खास प्रतिनिधि भाषा के मानक नमूने की तरह लेकर वर्गीकृत किया जाता है, और दूसरी भाषाओं की वंशरेखा उस नमूने से तुलना करके समझी जाती है
  • ALGOL

    • program assignment, conditional, और loop की क्रमिक शृंखला से बनता है, और functions के आधार पर संगठित होता है
    • कई भाषाएँ इसमें module system, नए data type को define करने के तरीके, polymorphism, और exception या coroutine जैसे वैकल्पिक control flow structures जोड़ती हैं
    • आज व्यापक रूप से इस्तेमाल होने वाली अधिकांश programming languages इसी आदिरूप भाषा परिवार में आती हैं
    • खुद ALGOL में ALGOL 58, ALGOL 60, ALGOL W, ALGOL 68 शामिल हैं
    • Assembly language, Fortran, C, C++, Python, Java, C#, Ruby, Pascal, JavaScript, Ada इसी वंश से जुड़े हैं
    • यह सबसे पुरानी आदिरूप भाषा है, जिसकी परंपरा Ada Lovelace द्वारा Babbage की analytical engine के लिए program formalization तक जाती है
    • EDVAC और शुरुआती Univac तक जाने वाले Eckert-Mauchly architecture कंप्यूटरों की machine language और assembly language, और Grace Hopper की A-0 से Fortran और COBOL तक की शुरुआती high-level language कोशिशें सब इसी रूप में थीं
    • 1960 के दशक में अकादमिक जगत में structured programming विकसित हुई, जिससे ऐसी भाषाएँ अधिक manageable बनीं, और उसका परिणाम ALGOL 60 था; बाद में इस परिवार के अधिकतर सदस्य यहीं से निकले
    • समय के साथ इसमें दूसरी आदिरूप भाषाओं की सुविधाएँ समाहित करने की प्रवृत्ति रही
      • 1980 के दशक में Self परिवार की अवधारणाएँ classes के रूप में जोड़ी गईं और data type definition तथा polymorphism लागू करने के साधन के रूप में इस्तेमाल हुईं
      • 2010 के बाद ML परिवार की अवधारणाएँ भी सामने आईं
  • Lisp

    • कोष्ठकों में घिरे prefix expressions और list representation का मिला-जुला syntax
      • (+ 2 3)
      • (defun square (x) (* x x))
      • (* (square 3) 3)
    • space से अलग किए गए items को parentheses में घेरने वाली list representation भाषा में built-in होती है, इसलिए code खुद list के रूप में होता है
    • macro list को लेकर उसे बदल सकते हैं और बदला हुआ code compiler को दे सकते हैं, इसलिए programmer भाषा के अर्थ को फिर से परिभाषित कर सकता है
    • ज़्यादातर code लिखने में यह दूसरी आदिरूप भाषाओं, आम तौर पर ALGOL या ML, जैसा व्यवहार करती है, लेकिन macro system इसकी अलग पहचान है
    • Common Lisp का loop syntax भी भाषा की built-in सुविधा नहीं बल्कि macro के रूप में परिभाषित है
    • शुरुआती दौर में Lisp के कई variants थे, लेकिन community ने Common Lisp पर सहमति बनाई
    • Sussman और Steele ने यह खोजते हुए कि functions से कितना कुछ किया जा सकता है, Scheme बनाया
    • numerical computation के लिए Lush, AutoCAD scripting language AutoLISP, और Emacs editor behavior लागू करने वाली Emacs Lisp जैसी special-purpose Lisp भी इस्तेमाल हुई
    • हाल के वर्षों में Clojure Lisp परिवार की तीसरी बड़ी शाखा के रूप में उभरी है
    • Fortran के लगभग एक साल बाद आई यह आज भी उपयोग में रहने वाली दूसरी सबसे पुरानी language family है
    • इसकी शुरुआत इस गणितीय प्रश्न से हुई कि ऐसी mathematical structure को कैसे लिखा जाए जो अपने ही expressions का मूल्यांकन कर सके
    • John McCarthy ने 1958 में इसका उत्तर दिया, और बाद में इसे कंप्यूटर पर लागू किया गया
    • शुरुआती Lisp अपने mathematical background के कारण उस समय की मशीनों के साथ ठीक से नहीं बैठती थी; memory और CPU cycle की समस्या गणित में नहीं थी, इसलिए garbage collection जैसी तकनीकों की ज़रूरत पड़ी
    • 1970 के दशक के उत्तरार्ध और 1980 के शुरुआती वर्षों में ऐसी मशीनें भी थीं जो सिर्फ Lisp चलाने के लिए नीचे से ऊपर तक डिज़ाइन की गई थीं
    • आज के integrated development environment के कई तत्व उन्हीं मशीनों पर आविष्कृत हुए
    • उसी समय AI research का मुख्य साधन Lisp था, और 1980 के दशक की AI hype जब नतीजे नहीं दे सकी, तो क्षेत्र के साथ Lisp भी AI Winter में गिरा
    • इसके बाद भी यह बची रही, और कंप्यूटर प्रदर्शन में सुधार तथा दूसरी भाषाओं द्वारा इसकी सुविधाएँ अपनाने से implementation की कठिनाइयाँ कम हुईं
  • ML

    • functions first-class values हैं, और इसमें अलग-अलग functions तथा tagged unions को व्यक्त करने वाला Hindley-Milner family type system होता है
    • हर iteration recursion के रूप में की जाती है
      • sum [] = 0
      • sum (x:xs) = x + sum xs
    • iteration patterns को encapsulate करने वाले functions define करके, और दूसरे functions को लेकर behavior लागू करने का तरीका भी इस्तेमाल होता है
      • map _ [] = []
      • map f (x:xs) = (f x) : (map f xs)
    • कुछ भाषाएँ, जैसे Miranda और Haskell, मूल रूप से lazy evaluation का उपयोग करती हैं
    • दूसरी भाषाएँ type system को कई दिशाओं में बढ़ाती हैं
      • OCaml ने Self आदिरूप भाषा की अवधारणाओं के साथ संयोजन की कोशिश की
      • Agda और Idris ने dependent type systems अपनाए जो values और types को मिलाते हैं
      • 1ML modules और types को जोड़ता है
    • ML से CaML, Standard ML, OCaml निकले
    • Miranda, Haskell, Agda, Idris जैसे संबंधित परिवार भी आगे बढ़े
    • ML, Cambridge, England में विकसित theorem-proving program की meta-language थी, और इसका नाम भी वहीं से आया
    • बाद में यह उस संदर्भ से बाहर निकलकर स्वतंत्र भाषा के रूप में फैली, और खासकर Britain तथा France को केंद्र बनाकर यूरोप में लोकप्रिय हुई
  • Self

    • program एक-दूसरे को message भेजने वाले objects के समूह से बना होता है, और हर behavior इसी तरीके से लागू होता है
    • नए objects, मौजूदा objects को message भेजकर बनाए जाते हैं
    • conditional भी true object और false object में से किसी एक को संदर्भित करने वाले variable के माध्यम से चलाया जाता है
      • दोनों objects ऐसे message लेते हैं जिनमें true होने पर चलने वाला function और false होने पर चलने वाला function parameter के रूप में दिया जाता है
      • true object पहला function चलाता है, false object दूसरा
      • calling code को यह नहीं पता होता कि object कौन-सा है; वह बस message भेजता है
    • loop भी इसी तरह काम करते हैं, और उपयुक्त object बनाकर सही जगह रख दिया जाए तो भाषा के पूरे अर्थ को फिर से परिभाषित किया जा सकता है
    • ऐसी भाषाओं में source आम तौर पर text file में नहीं बल्कि live environment में रखा जाता है
    • programmer live system को बदलता है, और files compile करके system बनाने के बजाय उसकी state save करता है
    • महत्वपूर्ण उदाहरण Smalltalk और Self हैं
    • कई भाषाएँ इस language group की message-passing शैली को आंशिक रूप से अपनाती हैं; ऐसे आंशिक अपनाने को आम तौर पर object-oriented programming कहा जाता है
    • इनमें से अधिकतर Smalltalk पर आधारित हैं, और JavaScript अपवाद है क्योंकि वह Self के classless object system से निकला है
    • Common Lisp का object system इसे इस तरह generalize करता है कि runtime सिर्फ एक message-receiving object नहीं, बल्कि सभी parameters के आधार पर चलने वाला code चुनता है
    • Erlang में execution flow objects के बीच घूमने के बजाय, parallel execution threads स्पष्ट रूप से messages सुनते और भेजते हैं
    • मूल भाषा Smalltalk थी, जिसे 1970 के दशक के उत्तरार्ध और 1980 के दशक में Xerox Parc में विकसित किया गया
    • 1980 के दशक में कई commercial Smalltalk systems थे, और IBM ने दूसरी भाषाओं के programming tools, यानी VisualAge collection, के विकास में Smalltalk का उपयोग किया
    • आज Smalltalk मुख्य रूप से open source Pharo Smalltalk के रूप में जीवित है
    • Smalltalk को तेज़ और कुशलता से चलाने पर बहुत शोध हुआ, और उसका शिखर Strongtalk project था
    • Strongtalk की खोजों का ऐतिहासिक महत्व यह है कि वे Java के HotSpot JIT compiler की नींव बनीं
    • Smalltalk ने पहले की भाषाओं के value और type concepts को आगे बढ़ाकर classes लागू कीं; हर object की एक class होती थी जो उसे type देती थी, और class वही type object बनाती थी
    • Self ने class की अवधारणा हटाकर सिर्फ objects को रखा
    • अधिक शुद्ध रूप होने के कारण इस आदिरूप भाषा का नमूना Self को चुना गया
  • Forth

    • stack languages को Lisp का उल्टा प्रतिबिंब कहा जा सकता है, और वे Hewlett Packard के reverse Polish notation calculators के syntax से मेल खाते हैं
    • इनमें data stack होता है; 42 जैसे literal लिखने पर वह stack पर push होता है, और function names बिना explicit parameters के stack पर काम करते हैं
    • साधारण arithmetic भी 2 3 + 5 * जैसे उल्टे रूप में लिखी जाती है
    • function definition भी बहुत संक्षिप्त होती है
      • अधिकतर Forth variants में : नया word define करता है
      • square, dup और * को call करने के बराबर है
      • dup stack के सबसे ऊपर के item की copy बनाता है, * ऊपर के दो items को गुणा करता है
    • parser को intercept करके अपने code से बदला जा सकता है, इसलिए पूरा syntax बदला जा सकता है
    • Forth programs में Fortran subset, packet layout, या state machine transitions दिखाने वाले ASCII diagrams को सीधे parse करने वाले छोटे-छोटे languages define करना आम बात है
    • Forth के कई variants, PostScript, Factor, Joy इसमें शामिल हैं
    • Joy, stack के बजाय composition की mathematical formalism इस्तेमाल करने वाली pure functional language है
    • Forth पहली बार 1970 में radio telescope control के लिए लिखा गया था
    • बाद में यह embedded systems में व्यापक रूप से फैल गया
    • Forth systems को bootstrap करना इतना आसान है कि कई programmers ने अपने-अपने उद्देश्यों के लिए इसके दर्जनों variants बना लिए
    • PostScript 1980 के दशक में printers पर documents को describe करने के लचीले साधन के रूप में आया
    • PostScript कई मायनों में Forth से अधिक सीमित है, लेकिन graphics layout से जुड़े बुनियादी operations भाषा में परिभाषित करता है
  • APL

    • भाषा की हर चीज़ n-dimensional array है
    • operators एक या दो symbols से बनते हैं, और पूरे arrays पर high-level operations करते हैं
    • इसकी अभिव्यक्ति बहुत compressed होती है, इसलिए symbol sequence खुद ही बिना अलग नाम दिए operation की पहचान बन जाती है
    • उदाहरण के तौर पर variable x का average निकालना (+⌿÷≢) x के रूप में लिखा जाता है
    • APL, J, K इसके प्रमुख उदाहरण हैं
    • arrays पर higher-order operations को MATLAB, NumPy, R जैसे कई environments में आंशिक रूप से अपनाया गया है
    • APL की शुरुआत 1960 के दशक में Kenneth Iverson द्वारा बनाई गई mathematical notation से हुई, जिसे बाद में कंप्यूटर पर लागू किया गया
    • भारी computation करने वालों के बीच इसके बाद भी इसका niche support बना रहा
    • इसकी descendant language K वित्तीय वातावरण में बहुत लोकप्रिय रही
  • Prolog

    • program facts के समूह से बना होता है
      • father(bob, ed).
      • father(bob, jane).
    • variables के सहारे दूसरे facts से facts निकालने वाले ungrounded facts भी उपयोग किए जाते हैं
      • grandfather(X, Y) :- father(X, Z), father(Z, Y).
    • Prolog runtime इन facts और queries को लेकर परिणाम ढूँढने के लिए search करता है
    • facts की definition structure सही चुन ली जाए तो Turing completeness हासिल होती है
    • Prolog में facts बनाने वाले terms अपने आप में एक विशिष्ट data type होते हैं, जिन्हें बनाकर runtime को दिया जा सकता है
    • यह Lisp के macros और Forth के parser replacement के समान स्थिति रखता है
    • Prolog programs मूल रूप से search हैं, इसलिए database query की तरह इन्हें search order के समायोजन और बेनतीजा रास्तों को जल्दी रोकने पर केंद्रित करके tune किया जाता है
    • Prolog, Mercury, Kanren इसमें शामिल हैं
    • इस आदिरूप भाषा परिवार में वास्तविक programming का अधिकांश काम खुद Prolog में ही होता है, और community में काफ़ी मज़बूत एकरूपता है
    • 1970 के दशक में France के logicians ने यह समझा कि programs को first-order logic के रूप में व्यक्त किया जा सकता है, और वहीं से implementation की कोशिशें शुरू हुईं
    • 1980 के दशक में Japan के fifth-generation computer project ने Prolog पर बड़ा दाँव लगाया, लेकिन project के विफल होने के साथ Prolog की प्रतिष्ठा भी गिरी
    • इसके बावजूद दशकों तक Prolog runtime को ज़्यादातर मामलों में कुशल बनाने और नई सुविधाएँ जोड़ने पर शोध जारी रहा
    • numerical constraints जैसी सुविधाएँ जुड़ने से constraint logic programming की दिशा बनी
    • Prolog niche क्षेत्रों में लगातार दिखाई देता रहा है
      • कई वर्षों तक Java की type checking Prolog में लागू की गई थी
      • Facebook का शुरुआती source code search tool भी Prolog-आधारित था

इसका उपयोग कैसे करें

  • ज़्यादातर programmers को इस language family का कुछ हिस्सा या पूरा ढाँचा बहुत अपरिचित लग सकता है, लेकिन हर परिवार जो सोच की दिशा और नई संभावनाएँ देता है, उसके लिए कुछ समय लगाना सार्थक है
  • ALGOL के नज़रिए से दो चीज़ें पूरी तरह अलग लग सकती हैं, जबकि किसी दूसरे नज़रिए से उनका अंतर मामूली हो सकता है; ऐसा बहुत बार होता है
  • प्राथमिकता

    • हर programmer को ALGOL परिवार की एक भाषा अच्छी तरह जाननी चाहिए
    • उसके बाद Prolog परिवार की भाषा SQL सीखने की सलाह दी गई है
      • करियर में ALGOL के बाद यह सबसे ज़्यादा उपयोगी साबित होती है
  • आगे का विस्तार

    • ऊपर की इन दो families को सीख लेने के बाद, हर साल किसी अपरिचित आदिरूप भाषा परिवार की एक नई भाषा सीखना लंबे समय में लाभदायक है
    • हर family के लिए सुझाई गई भाषाएँ और क्रम इस प्रकार हैं
      • Lisp: PLT Racket
      • ML: Haskell
      • Self: Self
      • Prolog: Prolog
      • Forth: gForth
      • APL: K, ok के माध्यम से उपयोग
  • क्रम में बदलाव

    • यदि आप बहुत numerical computation करते हैं, तो K को पहले सीखना अधिक उपयुक्त है
    • यदि आप embedded programming ज़्यादा करते हैं, तो gForth को पहले सीखना अधिक उपयुक्त है
    • लेकिन क्रम स्वयं या बिल्कुल कौन-सी भाषा चुनी जाए, यह बहुत महत्वपूर्ण नहीं है
    • Haskell की जगह Standard ML या OCaml, PLT Racket की जगह Common Lisp, और gForth की जगह Factor सीखना भी ठीक है
  • फ़ुटनोट में शामिल पूरक बातें

    • SQL सीखने के बाद भी Prolog खुद सीखने की ज़रूरत बनी रहती है
      • क्योंकि इसका वास्तविक उपयोग SQL से काफ़ी अलग है
    • Forth को गहराई से समझने के लिए Forth implementation खुद बनाना एक आम तरीका माना जाता है, ऐसा एक पाठक की राय में कहा गया
      • Forth इतना छोटा है कि एक व्यक्ति इसे अपेक्षाकृत कम समय में नीचे से ऊपर तक लागू कर सकता है
      • gForth ANS Forth सीखने के लिए अच्छा implementation है
      • अध्ययन सामग्री के रूप में McCabe की FORTH Fundamentals, Volume 1 का उल्लेख है
      • साथ में देखने योग्य Forth के रूप में PygmyForth, eForth, colorForth का भी उल्लेख है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.