Pascal का उपयोग करने के कारण
(castle-engine.io)- Object Pascal का लक्ष्य पढ़ने में आसान आधुनिक object-oriented language और native performance को साथ लाना है, और यह कई platforms पर maintainable applications बनाने का एक विकल्प है
- strong typing, compile-time checks, और runtime checks की वजह से नाम की typo या type mismatch जैसी गलतियों को यूज़र तक पहुँचने से पहले पकड़ना आसान होता है
- ज़रूरत पड़ने पर pointers, OS·CPU-विशिष्ट code, और assembly तक इस्तेमाल किए जा सकते हैं, लेकिन Castle Game Engine assembly के बिना भी तेज़ code बनाए रखने का विकल्प चुनता है
- Windows, Linux, macOS, mobile, console, और web तक व्यापक targets को साधा जा सकता है, और Castle Game Engine में engine code और game code एक ही language में लिखे जाते हैं
- FPC, Lazarus, Delphi, VS Code integration, और कई libraries के साथ Pascal ecosystem के भीतर भी एक practical development workflow बनाया जा सकता है
पढ़ने में आसान और type-safe Object Pascal
- Object Pascal को आधुनिक, पढ़ने में आसान, और तेज़ type-safe cross-platform language माना जाता है
- अगर आप दूसरी object-oriented languages जानते हैं, तो इसे अपेक्षाकृत आसानी से सीखा जा सकता है, और learning material के रूप में Modern Object Pascal Introduction for Programmers का उपयोग किया जा सकता है
- इसमें वे सुविधाएँ हैं जिनकी आधुनिक object-oriented language से अपेक्षा की जाती है
- classes
- units
- properties
- generics
- interfaces
- reflection
- closures
- इसका syntax पढ़ने में आसान code पर केंद्रित है
- type safety के लिए यह boolean, string, char, set, enum, range जैसे अलग types प्रदान करता है
- सुरक्षित conversions, जैसे integer को float में assign करना, आसानी से संभाले जाते हैं
- बाकी conversions को explicitly करना पड़ता है
compile और runtime में errors पकड़ने का तरीका
- Object Pascal में compile-time checks पर ज़ोर दिया जाता है
- data structures को reorganize करने जैसे refactoring के दौरान compiler उन जगहों को सामने ला सकता है जहाँ बदलाव ज़रूरी हैं
- नाम की typo या type mismatch जैसी स्पष्ट गलतियाँ compile नहीं होतीं, इसलिए वे यूज़र तक नहीं पहुँचतीं
- यह अतिरिक्त runtime checks भी देता है
- array bounds checks
- integer overflow checks
- assertion
- memory leak checks
- runtime checks का उपयोग debug version में समस्याएँ पकड़ने के लिए किया जाता है, और performance-ज़रूरी release version में इन्हें बंद किया जा सकता है
- CGE editor से compile करते समय debug / release modes अपने-आप set होते हैं, और “Run” menu में mode बदला जा सकता है
- संबंधित दस्तावेज़ के लिए What are range and overflow checks (and errors) in Pascal और Detecting Memory Leaks देखे जा सकते हैं
native performance और ज़रूरत भर low-level control
- Object Pascal native code में compile होता है, इसलिए बुनियादी execution performance पाना आसान होता है
- सामान्य applications में low-level optimization तक नीचे जाने की ज़रूरत अक्सर नहीं पड़ती
- लेकिन ज़रूरत होने पर मनचाहे स्तर तक low-level features इस्तेमाल किए जा सकते हैं
- pointers का उपयोग
- pointer arithmetic
- OS·CPU-विशिष्ट code लिखना
- assembly code जोड़ना
- Castle Game Engine portability और code readability बढ़ाने के लिए बिल्कुल भी assembly code के बिना तेज़ execution का लक्ष्य रखता है
- compilation भी काफ़ी तेज़ है; एक उदाहरण में नया project पहली बार खोलने पर desktop build में 2.5 सेकंड और Android build में 10.1 सेकंड लगे
कई platforms और Castle Game Engine की development approach
- Object Pascal को कई तरह के platforms के लिए इस्तेमाल किया जा सकता है
- desktop: Windows, Linux, macOS, Raspberry Pi, FreeBSD, संभवतः सभी Unix
- mobile: Android, iOS
- consoles: Nintendo Switch
- web: WebAssembly, और pas2js का उपयोग कर JS
- Castle Game Engine के supported platforms को Castle Game Engine platforms supported पर देखा जा सकता है
- कुल उपलब्ध targets के लिए FPC target platforms और Delphi target platforms देखें
- Castle Game Engine में engine code और game code एक ही language में लिखे जाते हैं
- engine open source है, और ज़रूरत के मुताबिक CGE को fork करके बदला जा सकता है
libraries और development tools ecosystem
- Pascal में कई क्षेत्रों के existing libraries और units उपलब्ध हैं
- databases
- XML, JSON
- AI
- blockchain
- networking
- जिन existing libraries में C API है, उनके साथ integration या linking आसानी से की जा सकती है
- renderers
- sound libraries
- physics engines
- Python libraries in Pascal भी इस्तेमाल की जा सकती हैं
- मुख्य tools ecosystem इस प्रकार है
3 टिप्पणियां
Delphi.. पुरानी यादें ताज़ा हो गईं। Borland, Delmadang..
Windows डेवलपमेंट करने के दिनों में सच में लगता था कि Delphi के साथ Object Pascal सबसे बेहतरीन था।
Hacker News की राय
जिसने पहले Delphi इस्तेमाल किया हो, उसके लिए Lazarus पहले से जाना-पहचाना होने की संभावना काफी है। Lazarus लगभग एक open source reimplementation जैसा है, और Raspberry Pi जैसी ARM boards समेत लगभग हर जगह native रूप से चल और compile हो जाता है
लेकिन library install करना झंझटभरा हो सकता है, इसलिए IDE, modules, और कुछ काफ़ी दिलचस्प add-ons की installation को automate करने के लिए FpcUp, और बाद में FpcUpDeluxe बनाया गया
https://wiki.freepascal.org/fpcupdeluxe
FpcUpDeluxe में शामिल free widgets से जल्दी में बनाया गया एक dashboard widget demo भी है
https://ibb.co/9bchx7T
FpcUpDeluxe Alpine Linux पर भी चलता है, और उसके लिए release page से musl version लेना होता है। इससे बहुत छोटे systems में भी dashboard डालने की संभावना खुलती है। कई platforms पर code native रूप से compile होता है और तेज़ चलता है, और किसी interpreter या web browser की ज़रूरत नहीं पड़ती
जब मैंने आख़िरी बार Lazarus और Delphi इस्तेमाल किया था, तब Unicode मुश्किल था, और कुल मिलाकर ऐसा लगता था कि सब कुछ ASCII मानकर बनाया गया है
[0] https://github.com/markmal/freeship-plus-in-lazarus
[1] http://web.archive.org/web/20160128212152/http://hydronship.net/index.php?lang=en
[2] https://sourceforge.net/projects/freeship
एक समय Delphi/Pascal मेरी मुख्य भाषा थी, और पिछले 10–20 सालों में मैं अपने लिए सही भाषा खोजता रहा हूँ। मैंने Haxe भी काफ़ी समय तक इस्तेमाल की, लेकिन आख़िर में ऐसा लगा कि मैं “वो macro से कर लो” वाले जाल में फँस गया। Macros से कुछ भी किया जा सकता है, लेकिन जब वे बहुत ज़्यादा हो जाते हैं, तो हर कोई अपनी अलग macro extension language में programming करने लगता है
JavaScript में कुछ अच्छे सुधार आए हैं, और अभी भी और ज़रूरत है, लेकिन अब मैं उस तरफ़ का काम भी बहुत करता हूँ। कुछ साल पहले 8-bit AVR code लिखते समय मैंने फिर से FreePascal इस्तेमाल किया, और वह सच में बहुत मज़ेदार था। नए features आज़माने पर यह सचमुच एक modern language जैसा लगा, और छोटे target space के लिए code लिखते हुए standard library लगभग न इस्तेमाल करके ज़रूरी code खुद बनाना भी अच्छा लगा
इससे FreePascal की कई सालों में जमा हुई backward-compatible namespace noise से बचना आसान हुआ, जैसे TList, TFPList, TFPGList, TFPGObjectList जैसी परतें। सबसे बड़ी कमी यह लगी कि compiler ने उन targets पर constant floating-point expressions की अनुमति नहीं दी जहाँ FPU या emulation नहीं था। अगर compile time पर calculation हो सकती है, तो यह संभव होना अच्छा रहता
दूसरे environments इस्तेमाल करने के बाद अब function के बीच में variables define न कर पाना एक restriction जैसा लगता है, और subfunction-level scoping भी अच्छा होता। begin/end और
{}का फ़र्क मुझे ज़्यादा परेशान नहीं करता। अब मुझे case-sensitive languages ज़्यादा पसंद हैं, और types पर character prefixes न लगाना बेहतर लगता है। शायद इसकी सबसे बड़ी वजह editors का विकास है। Syntax highlighting और realtime linting जानकारी को अलग परत में ले जाते हैं और text noise कम करते हैंअगर FreePascal की successor language एक fresh start के रूप में आए, तो शायद मैं काफ़ी उत्साहित हो जाऊँ। अच्छा होगा अगर एक नई standard library हो जो modern features को first-class citizen की तरह इस्तेमाल करे; retirement के बाद शायद मैं खुद एक बार इसे बनाने की कोशिश करूँ
{}वास्तव में एक ही चीज़ नहीं हैं।{}local scope को define करता है, लेकिन begin/end ऐसा नहीं करता90s में मैंने कुछ साल तक काम के लिए Delphi इस्तेमाल किया था और मुझे वह पसंद भी था, लेकिन Borland और उसके बाद के owners जिस तरह product और language को बार-बार ग़लत दिशा में ले जाते रहे, उससे मैं थक गया। Anders Hejlsberg भी Borland छोड़कर Microsoft चले गए और उन्होंने C# बनाया, और मेरी नज़र में यह समय निवेश करने के लिए कहीं बेहतर language और architecture है
आजकल resource constraints की वजह से मज़े के लिए Pascal इस्तेमाल कर रहा हूँ। पुराना Borland Turbo Pascal 3.00A CP/M पर चलता है, और editor, compiler, और library सब कुछ 64KB के अंदर देता है
इंटरैक्टिव तरीके से इस्तेमाल करने के लिए यह काफ़ी तेज़ है, और low-level utilities, simple games, और तरह-तरह की hacking के लिए पर्याप्त code बना देता है। बड़े या आधुनिक environment में मैंने Pascal कभी इस्तेमाल नहीं किया, लेकिन हाल का अनुभव काफ़ी संतोषजनक रहा, इसलिए इसे ख़ारिज करने का इरादा नहीं है
मुझे अब तक पता ही नहीं था कि Pascal के modern implementations अभी भी मौजूद हैं, और शायद मुझे अपने पहले प्यार से फिर दोस्ती कर लेनी चाहिए
अगर CP/M चाहिए, तो site पर support status देख सकते हैं, और अगर support हो तो हैरानी नहीं होगी। इसका text UI IDE, Turbo Pascal से बहुत मिलता-जुलता है और बिजली की तरह तेज़ है। भाषा में Turbo Pascal की तुलना में कहीं ज़्यादा advanced features हैं, लेकिन अगर न चाहें तो उनका इस्तेमाल करना ज़रूरी नहीं
पहले Windows पर हल्का-सा test किया था, तब generated binary भी C की तरह बहुत छोटी थी, और simple hello world program 50~60KB से कम था
याद है कि यह M-III BASIC development environment की तुलना में बहुत बड़ा improvement था, और 48KB RAM के अंदर भी मेरे बनाए games और utilities काफ़ी अच्छे से चलते थे। Pascal-80 codebase का क्या हुआ, यह जानने की उत्सुकता है। retro hardware के लिए modern tools से बेहतर तो नहीं होगा, और शायद काफ़ी कमज़ोर ही होगा। “Oh Pascal!” वही किताब थी जिससे मैंने यह language सीखी थी, और Pascal के commercial इस्तेमाल से कुछ साल पहले शायद बहुत ज़्यादा विकल्प भी नहीं थे
कुछ कारणों से सहमत होना मुश्किल है। Object Pascal कोई modern language नहीं है। 1998 में शायद थी, लेकिन उसके बाद इसमें बहुत ज़्यादा विकास नहीं हुआ, और आख़िरी बड़ा बदलाव भी generics था, जो लगभग बाकी सभी भाषाओं की तुलना में काफ़ी देर से आया
FPC कोई ख़ास तेज़ code generate नहीं करता, और Object Pascal की object characteristics भी locality के लिए अनुकूल नहीं हैं। script languages से तेज़ है, लेकिन garbage collection वाली भाषाओं सहित आम तौर पर ज़्यादातर ahead-of-time compiled languages से धीमा रहता है
दूसरी तरफ ecosystem शानदार है। अच्छी libraries और tools बहुत हैं, और सबसे उल्लेखनीय चीज़ Delphi clone Lazarus है। FPC या Delphi इस्तेमाल करने वाले लोग आम तौर पर language modernization जैसी बातों की ज़्यादा परवाह नहीं करते, वे बस काम पूरा करने पर ध्यान देते हैं। लेकिन नए developers को यह कितना आकर्षित करेगा, यह कहना मुश्किल है, इसलिए भविष्य कैसा होगा पता नहीं
वास्तविक performance काफ़ी है, और bottleneck मिल जाए तो ज़रूरत के हिसाब से optimization भी किया जा सकता है। C++ की तुलना में “higher-level” classes इस्तेमाल करें तो थोड़ा ज़्यादा झंझट हो सकता है, लेकिन असंभव नहीं है
अगर कम से कम मेहनत में base performance चाहिए, तो नया LLVM backend भी है। हालाँकि runtime library और FCL आदि सबको LLVM backend से build करना पड़ता है, इसलिए compiler को source से build करना होगा, लेकिन इसमें बस कुछ मिनट लगते हैं। बदले में compiler काफ़ी धीमा हो जाता है, और व्यक्तिगत रूप से मुझे नहीं लगता कि performance का फ़र्क इतना क़ीमती है
इसलिए यह जानने की जिज्ञासा है कि कौन-सा benchmark था जिसने आपको लगा दिया कि यह असलियत से 50 गुना धीमा है
यहाँ competitive programming से मतलब है ऐसे छोटे CPU-केंद्रित single-threaded algorithmic computations जिनकी समय-सीमा प्रति execution 1~3 सेकंड तक होती है। यह JIT के लिए प्रतिकूल environment होता है, और इसमें default compiler/runtime settings, बिना external libraries या tuning के काम किया जाता है। उस समय आम समझ यह थी कि C++/Pascal इस्तेमाल करो, या Java में करो और अगर “time limit exceeded” आ जाए तो 200~300 lines का solution C++ में फिर से लिखकर पास करवाओ
Pascal single-pass LL(1) compiler इस्तेमाल करता है, इसलिए millisecond स्तर की compilation संभव होती है। इससे Edit→Compile→Run एक सेकंड के अंदर पूरा हो जाने वाला REPL-जैसा अनुभव मिलता है। macro और धीमी compilation time वाले C/C++ की developer experience इससे बदतर थी, और कम-से-कम यही वजह थी कि मैंने C की जगह Pascal और C++ की जगह Delphi सीखा
समझ नहीं आता कि ऐसा क्यों करना चाहिए। पुरानी भाषाएँ legacy support की वजह से बनी रहनी चाहिए, लेकिन ऐसी modern features को पुरानी भाषा में ज़बरदस्ती ठूँसने का मतलब मुझे खास नहीं दिखता
मैं Java बहुत इस्तेमाल करता हूँ, लेकिन सच कहूँ तो Java 8 के बाद की लगभग सभी features नहीं जोड़ी जानी चाहिए थीं। उदाहरण के लिए, Java में lambda काफ़ी हद तक एक patch जैसा लगता है
अगर modern features चाहिएँ तो modern language इस्तेमाल करें। अगर Java ecosystem में रहना है तो Kotlin इस्तेमाल करें। Pascal को मैंने सचमुच दशकों से नहीं देखा, और आख़िरी बार 1980 के दशक में प्रोग्राम किया था, इसलिए मैं सिर्फ़ Java की बात कर रहा हूँ, लेकिन Pascal में ऐसी feature list जोड़ना हास्यास्पद लगता है
फिर भी modern features जोड़ने की value है। आप नया project C++ में शुरू करने के बजाय Rust जैसी modern language चुन सकते हैं, लेकिन पहले से लिखी गई लाखों lines की C++ code को modern features से बेहतर बनाया जा सकता है। C++11 ने खेल ही बदल दिया था
Java language ने language features की बजाय libraries पर निर्भर रहने का जो फ़ैसला किया, उससे boilerplate code की बहुत बड़ी मात्रा पैदा हुई, और मुझे लगता है वह दिशा ग़लत थी। Python, Lisp, Haskell में जो किया जा सकता है, वह Java में भी किया जा सकता है, लेकिन परिभाषा के अनुसार brainf*ck में भी किया जा सकता है। असली Java solution की complexity अधिक feature-rich languages की तुलना में बढ़ जाती है, और अंत में या तो उन्हीं language features को थोड़े टूटे-फूटे ढंग से फिर से implement करना पड़ता है या उनकी जगह ढेर सारी dependencies खींचनी पड़ती हैं। दोनों ही मामलों में सीखने लायक API surface बस और बढ़ता है
Java में हुए सुधारों की वजह से JVM प्रासंगिक बना रहा और DotNet को रोके रखा, और Microsoft के इतिहास को देखते हुए यह अच्छी बात थी
इस पर अक्सर ध्यान नहीं जाता, लेकिन Ada embedded ecosystem में static analysis, debugging, और target support की maturity के मामले में फ़ायदे हैं
Ada का Pascal-जैसा syntax कुछ verbose लग सकता है, लेकिन पढ़ने में मुश्किल नहीं है। VHDL भी Ada syntax पर आधारित है, इसलिए जो लोग दोनों languages साथ इस्तेमाल करते हैं उनके लिए यह और आसान हो सकता है
Swift भी इनमें से कुछ चीज़ें पूरी करता है, और closure, automatic reference counting, type inference जैसी सुविधाजनक features भी जोड़ता है। measurement types के बारे में पक्का नहीं हूँ, लेकिन वह implement किया जा सकने योग्य लगता है। हालाँकि अभी तक Swift जैसी कोई HDL दिखती नहीं है
Pascal वास्तव में अच्छा है और performance भी ठीक-ठाक है। स्कूल में Basic के बाद मैंने दूसरी language यही सीखी थी
समझ नहीं आता कि industry को 1990 के दशक के आख़िर और 2000 के शुरुआती वर्षों में Python, Ruby, Java, JavaScript की तरफ़ पीछे क्यों जाना पड़ा
उसमें बताया गया कि Python, Ruby, JS जैसी dynamically typed languages 1990 के दशक में क्यों लोकप्रिय हुईं: वेबसाइट बनाते समय वे तेज़ feedback loop देती थीं और IDE या compiler की ज़रूरत नहीं होती थी। उस समय IDE और compiler धीमे थे और कई बार मुफ़्त भी नहीं होते थे
वैसे भी उस दौर में users 56k modem से कनेक्ट करते थे, इसलिए development time को performance gains के बदले देना बहुत फ़ायदेमंद सौदा नहीं था। उस talk में यह भी कई दिलचस्प बिंदु थे कि पिछले 10~20 वर्षों में development का तरीका कैसे बदला है, और रुझान फिर से static typing की ओर क्यों जा रहा है
साथ ही web browser एक लोकप्रिय programming platform बन गया और मुख्यतः JavaScript का इस्तेमाल हुआ। अब भी, browser वाले हिस्से के अलावा, web browser के अंदर एक पूरा operating system ठूँसने की कोशिश हो रही है, और Chrome काफ़ी करीब पहुँच चुका है
विश्वविद्यालय के पहले साल में मेरा पहला project Pascal में बना elevator simulator था, और उसमें text graphics का इस्तेमाल किया था। C-family languages की तुलना में Pascal में कुछ elegance थी, इसलिए उसे इस्तेमाल करना मज़ेदार था
इसी वजह से मैं आजकल Nim का मज़ा ले रहा हूँ; जहाँ तक मुझे पता है, Nim पर Ada और Python के अलावा Pascal, Modula-3, Oberon, Delphi जैसी Wirth परिवार की languages का भी प्रभाव है
Pascal इतना भी बुरा नहीं है, और वास्तव में कुछ modern programming languages की तुलना में इसके अपने फ़ायदे हैं। बेशक यह परफ़ेक्ट नहीं है और इसकी कमियाँ भी हैं
मैं कभी-कभी DOS programming के लिए Pascal और BASIC इस्तेमाल करता हूँ, और कम-से-कम उस काम के लिए Pascal ठीक लगता है। C भी DOS programming में इस्तेमाल होता है, लेकिन ख़ासकर real mode में वह इतना अच्छा नहीं लगता
Linux programming के लिए मैं ज़्यादातर C को पसंद करता हूँ, लेकिन PostScript भी इस्तेमाल करता हूँ। मुझे लगता है कि C और PostScript, दोनों के कुछ modern languages पर अपने फ़ायदे हैं। Pascal का इस्तेमाल दूसरे programs में भी हो सकता है, और यहाँ तक कि TeX भी Pascal में लिखा गया था