प्रोग्रामिंग की सात आदिरूप भाषाएँ (2022)
(madhadron.com)- अलग-अलग 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 का
loopsyntax भी भाषा की 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 की कठिनाइयाँ कम हुईं
- कोष्ठकों में घिरे prefix expressions और list representation का मिला-जुला syntax
-
ML
- functions first-class values हैं, और इसमें अलग-अलग functions तथा tagged unions को व्यक्त करने वाला Hindley-Milner family type system होता है
- हर iteration recursion के रूप में की जाती है
sum [] = 0sum (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 करने के बराबर हैdupstack के सबसे ऊपर के item की copy बनाता है,*ऊपर के दो items को गुणा करता है
- अधिकतर Forth variants में
- 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-आधारित था
- program facts के समूह से बना होता है
इसका उपयोग कैसे करें
- ज़्यादातर 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 का भी उल्लेख है
- SQL सीखने के बाद भी Prolog खुद सीखने की ज़रूरत बनी रहती है
5 टिप्पणियां
दिलचस्प है।
कॉलेज के समय मैंने ALGOL परिवार, Lisp और Prolog से अपने मेजर के विषय पढ़े थे और असाइनमेंट किए थे, तो यह यादें फिर से ताज़ा हो गईं।
उन भाषाओं ने आधुनिक मुख्यधारा की programming languages पर बहुत असर छोड़ा है,
लेकिन उनमें से सिर्फ Forth का प्रभाव अपेक्षाकृत कम दिखता है।
prefix notation तक तो फिर भी ठीक है, लेकिन postfix notation में coding करना सच में बहुत असुविधाजनक है।
Hacker News की राय
Tufts की PL क्लास में imperative, Lisp, ML, Smalltalk से पहले की 4 भाषा-परिवारों के mini versions खुद बनाकर देखे थे, और यह देखकर अच्छा लगा कि वह प्रक्रिया अब पाठ्यपुस्तक के रूप में भी उपलब्ध है। पहले इसमें Prolog वाला हिस्सा भी था, जो अब नहीं है, यह थोड़ा अफसोसजनक है
इस लेख की classification में अगर एक ही चीज़ बदलनी हो, तो Ruby को Algol परिवार से ज़्यादा साफ़ तौर पर object-oriented भाषा मानूंगा। उस पर Smalltalk का असर बड़ा है, और standard library में
mapकी जगहcollectजैसे नामों में भी उसका निशान बचा है। Ruby में शुरू से अंत तक सब कुछ object है, और method call को object को message भेजने की तरह समझना ज़्यादा स्वाभाविक लगता है। इसकी तुलना Python से अक्सर होती है, लेकिन इसका evolution path काफ़ी अलग रहा, और अब जाकर दोनों कुछ मिलते-जुलते ecosystem points पर converge हुए लगते हैं। मुझे Ruby, Python से ज़्यादा गरमाहट भरी alpaca जैसी लगती हैHello Worldस्तर पर यह कम दिखता है, लेकिन primitive types तक सब object बन चुके हैं। OOP से चिढ़ने वालों कोtype(42)औरdir(42)दिखाना इस बात पर ज़ोर देने का अच्छा तरीका है कि integer भी object हैमुझे लगता है कि language genealogy में proof expression languages नाम की एक और category जोड़नी चाहिए। यह Curry-Howard correspondence वाला परिवार है, जहाँ program ही proof होता है, और Lean इसका एक प्रतिनिधि उदाहरण है। इसे functional की subcategory माना जा सकता है, लेकिन इसका मुख्य उद्देश्य execution से ज़्यादा verification है, इसलिए इसे अलग axis पर देखना सही लगता है
हाल ही में मैंने language comparison project फिर से देखा; यह 10 अक्षरों के लिए 3,715,891,200 signed permutations का parallel cycle decomposition benchmark था। “prototypical languages” से ज़्यादा, मैं हर paradigm के आधुनिक implementations में से ऐसी भाषाएँ ढूँढना चाहता था जिन्हें research programming के लिए सच में चुना जा सके। सिर्फ़ performance नहीं, बल्कि AI की मदद लेना कितना आसान है और मेरे लिए code पढ़ना-समझना कितना सहज है, यह भी देखा। AI की वजह से हर भाषा को काफ़ी गहराई तक optimize करके देखने जैसा एक तरह का पर्यटन भी संभव हुआ। नतीजे यहाँ हैं, और खासकर F# का सबसे ऊपर आना काफ़ी चौंकाने वाला था
मैंने भी ऐसा ही एक लेख यहाँ लिखा था। Algol, Lisp, Forth, APL, Prolog से तो सहमत हूँ, लेकिन innovative functional language के रूप में ML से थोड़ा पहले की SASL को रखा था, और object-oriented प्रतिनिधि के रूप में Self की बजाय उससे पहले आई Smalltalk को चुना था। साथ ही Fortran, COBOL, SNOBOL, Prograph को भी शामिल किया, क्योंकि मुझे वे भी अपने-अपने ढंग से खेल बदल देने वाली भाषाएँ लगती हैं
मैं इस चर्चा में semantic families भी जोड़ना चाहूंगा। जैसे Verilog, Petri nets, Kahn process networks, dataflow machines, process calculi, reactive, term rewriting, constraint solver/theorem prover परिवार, probabilistic programming वगैरह। और कुछ भाषाएँ जो मौजूदा 7 categories में ठीक से फिट नहीं बैठतीं, लेकिन व्यवहार में production stage के क़रीब हैं, जैसे Unison, Darklang, temporal dataflow, DBSP। थोड़ा cheating जैसा लग सकता है, लेकिन ये ज़्यादातर von Neumann शैली के machine model के समांतर computation models हैं। मैं काफ़ी समय से “हम जिन सभी computing तरीकों को जानते हैं, von Neumann के परे” जैसी कोई चीज़ लिखना चाहता था
1+1कोADD(1,1)जैसे रूप में rewrite कर दूँ तो मैं उसे अपने परिचित तरीके से parse कर सकता हूँ। ऊपर से regex सीखने से बेवजह बचता रहा, तो code काफ़ी अजीब बन गया, और एक सहकर्मी की बात आज भी याद है: “Andy काम करवा रहा है, तो इसे मत छेड़ो।” दूसरी टीम के एक व्यक्ति ने regex से वही काम मेरे code से लगभग 20 गुना छोटे code में कर दियाTU Delft में लिया गया “Concepts of programming languages” मेरे पूरे CS पाठ्यक्रम का सबसे पसंदीदा course था। उसमें C, functional पक्ष के लिए Scala, और prototype concept के लिए JavaScript पढ़ी थी; उसी की वजह से कुछ साल बाद Elixir सीखना मेरे लिए कहीं आसान हो गया। Unreal Tournament agents को GOAL नाम की Prolog-आधारित भाषा में लिखने वाली class भी थी। लंबे समय तक मुझे समझ नहीं आया कि Prolog का उपयोग कहाँ करूँ, लेकिन अंत में मैंने इसका इस्तेमाल ऐसे spellcheck में किया जो LLM द्वारा बनाई गई खराब Papiamentu sentences को बार-बार सुधारने के लिए मजबूर करता था
मैं इस बात से सहमत हूँ कि “अलग-अलग तरह की भाषाएँ सीखनी चाहिए।” OCaml सीखने के बाद ही functions सच में गणितीय functions जैसे लगे, Mathematica ने expressions को अपने-आप में input की तरह देखना सिखाया, और PostScript की reverse Polish notation ने साधारण arithmetic से आगे बढ़कर सोचने का तरीका ही फिर से तारबद्ध कर दिया। लेकिन मैं इस बात से सहमत नहीं कि Java, C#, C++, Python, Ruby में से कोई भी चुन लो, कोई फर्क नहीं पड़ता। अगर लक्ष्य सिर्फ़ quicksort implement करना है, तो शायद वे काफ़ी समान लगें; लेकिन जो लोग सच में कुछ बनाना चाहते हैं, उनके लिए भाषा का चुनाव रात और दिन जितना बड़ा अंतर पैदा करता है। जो 3D game बनाना चाहता हो उसे Ruby, या exploratory data science और deep learning करना चाहने वाले को Java पहले पकड़ा देने से उसका उत्साह टूट सकता है
यह पढ़कर Bruce Tate की 7 languages in 7 weeks याद आ गई। उसी किताब से मैंने पहली बार Erlang देखा था। हालांकि ऐतिहासिक रूप से COBOL और Fortran को Algol परिवार में रखना थोड़ा ज़ोर-जबर्दस्ती जैसा लगता है, लेकिन इससे यह याद ज़रूर आता है कि इतिहास स्वभाव से कुछ हद तक reductionist summary होता ही है
इससे जुड़ी पुरानी HN चर्चा भी थी। पिछली चर्चा साथ में देखें तो संदर्भ समझने में मदद मिलती है