
नमस्कार, हेब्र!
पिछले कुछ समय से मैं अपने खेल ढांचे को लिख रहा हूं - आत्मा के लिए ऐसा पालतू प्रोजेक्ट। और चूंकि आत्मा के लिए आपको कुछ ऐसा चुनना होगा जो आपको पसंद हो (और इस मामले में, आपको क्या लिखना पसंद है), मेरी पसंद नीम पर गिर गई। इस लेख में मैं विशेष रूप से नीम के बारे में बात करना चाहता हूं, इसकी विशेषताओं, पेशेवरों और विपक्षों के बारे में, और gamedev का विषय केवल मेरे अनुभव का संदर्भ निर्धारित करता है - मैंने कौन से कार्य हल किए, क्या कठिनाइयां पैदा हुईं।
एक बार, जब घास हरियाली और आकाश साफ था, मैं नीम से मिला। नहीं, ऐसा नहीं है। एक बार, मैं अपने सबसे अच्छे खेल को लिखने के लिए खेल विकसित करना चाहता था - मुझे लगता है कि कई इस के माध्यम से चले गए। उन दिनों, एकता और अवास्तविक इंजन सिर्फ सुनवाई पर दिखाई देने लगे थे और, जैसे, अभी तक मुक्त नहीं थे। मैंने उनका उपयोग नहीं किया, लालच के कारण नहीं, बल्कि खुद को सब कुछ लिखने की इच्छा के कारण, खरोंच से पूरी तरह से एक खेल की दुनिया बनाने के लिए पहला शून्य बाइट। हाँ, लंबे समय के लिए, हाँ, यह मुश्किल है, लेकिन इस प्रक्रिया से खुद को खुशी मिलती है - लेकिन खुशी के लिए और क्या चाहिए?
स्ट्रैसपुप और क्यूटी के साथ सशस्त्र, मैंने सबसे अच्छे के लिए गंदगी पी ली, क्योंकि, सबसे पहले, मैं दुनिया में 10 लोगों में से एक नहीं था जो सी ++ को अच्छी तरह से जानता था, और दूसरी बात, प्लसस ने सक्रिय रूप से मेरे पहियों में लाठी लगाई। मेरे पास पहले से ही उल्लेखनीय रूप से जो कुछ भी लिखा है, उसे दोहराने का कोई कारण नहीं है:
मुझे दुनिया में सबसे अच्छी प्रोग्रामिंग भाषा कैसे मिली। भाग 1
मुझे दुनिया में सबसे अच्छी प्रोग्रामिंग भाषा कैसे मिली। भाग २
मुझे दुनिया में सबसे अच्छी प्रोग्रामिंग भाषा कैसे मिली। यो भाग (२.o२)
जब आप प्रत्येक लॉन्च से पहले कोर डंप किए बिना इंतजार किए बिना, लगभग बिना सोचे-समझे, बिना कोड लिखे, जब हमारी आंखों के सामने सही तरीके से जुड़ जाते हैं, तो हम यह कर सकते हैं, और अब यह ऐसा है, कृपया मुझे बताएं, इससे मुझे क्या फर्क पड़ता है अगर मेरे पास कोई मिस नहीं है, तो मेरे पास टेम्प्लेट नहीं हैं उत्पादकता प्रोग्रामर का मुख्य लक्ष्य है जो चीजों को करता है, और उपकरण का एकमात्र कार्य जो वह उपयोग करता है।
सी ++ के साथ काम करते समय, मैं लगातार सोच रहा था कि मुझे क्या लिखना है, और न कि मुझे क्या लिखना है। इसलिए मैंने निम पर स्विच किया। कहानी खत्म हो गई है, मुझे कई वर्षों के बाद अपने अनुभव को मेरे साथ साझा करने दें।
जो जानकारी में नहीं हैं, उनके लिए सामान्य जानकारी
- ओपन सोर्स कंपाइलर (MIT), उत्साही लोगों द्वारा विकसित किया गया। भाषा का निर्माता एंड्रियास रम्पफ (अराक) है। दूसरा डेवलपर डोमिनिक पिच्टा (डोमे96) है, जिसने निम इन एक्शन किताब लिखी थी । इसके अलावा, कुछ समय पहले, स्टेटस ने भाषा के विकास को प्रायोजित करना शुरू किया, इसलिए निम को 2 और पूर्णकालिक डेवलपर्स मिले। उनके अलावा, निश्चित रूप से, अन्य लोग योगदान करेंगे।
- संस्करण 1.0 हाल ही में जारी किया गया है , जिसका अर्थ है कि भाषा स्थिर है और "ब्रेकिंग परिवर्तन" अब अपेक्षित नहीं हैं। यदि पहले आप अस्थिर संस्करण का उपयोग नहीं करना चाहते थे, क्योंकि अपडेट एप्लिकेशन को तोड़ सकते हैं, तो अब समय है कि आप अपनी परियोजनाओं में प्रयास करें।
- निम C, C ++ (जो आगे देशी कोड में संकलित हैं) या JS (कुछ सीमाओं के साथ) में संकलित (या स्थानांतरित) करता है। तदनुसार, एफएफआई की मदद से, सी और सी ++ के लिए सभी मौजूदा पुस्तकालय आपके लिए उपलब्ध हैं। यदि निम पर कोई आवश्यक पैकेज नहीं है - एस या प्लसस की तलाश करें।
- निकटतम भाषाएँ अजगर हैं (वाक्य रचना द्वारा, पहली नज़र में) और डी (कार्यक्षमता से) - IMHO
प्रलेखन
यह वास्तव में बुरा है। समस्याएं:
- प्रलेखन विभिन्न स्रोतों पर बिखरा हुआ है
- प्रलेखन
मल भाषा की सभी विशेषताओं का पूरी तरह से वर्णन नहीं करता है - प्रलेखन कभी-कभी बहुत संक्षिप्त होता है।
उदाहरण: यदि आप बहु-थ्रेडेड एप्लिकेशन लिखना चाहते हैं, तो बहुत सारे कोर हैं, लेकिन कहीं नहीं जाना है।
यहाँ धाराओं पर आधिकारिक प्रलेखन अनुभाग है । नहीं, आप देखते हैं, धागे भाषा का एक अलग प्रमुख हिस्सा हैं, इसकी विशेषता जिसे आपको संकलन करते समय ध्वज --threads:on
साथ शामिल करने की आवश्यकता होती है। कचरा संग्रहकर्ता के आधार पर, साझा या थ्रेड-लोकल हीप, सभी प्रकार की साझा मेमोरी और लॉक्स, थ्रेड सेफ्टी, स्पेशल शेयर्ड मॉड्यूल और नर्क को और क्या पता है। मुझे यह सब कैसे पता चला? यह सही है, पुस्तक नीम इन एक्शन से, फोरम, स्टैक ओवरफ्लो, टीवी और पड़ोसी से, सामान्य रूप से, कहीं से भी, लेकिन आधिकारिक दस्तावेज से नहीं।
या एक तथाकथित है। "नोटेशन" - टेम्पलेट आदि का उपयोग करते समय बहुत अच्छी तरह से काम करता है, आमतौर पर जहां भी आपको कॉलबैक या कोड के एक ब्लॉक को पास करने की आवश्यकता होती है। मैं इसके बारे में कहां पढ़ सकता हूं? हाँ, प्रायोगिक सुविधाओं के मैनुअल में ।
सहमत हैं, विभिन्न असंक्रामक स्रोतों पर जानकारी एकत्र करना अभी भी एक खुशी है। यदि आप nim में लिखते हैं, तो आपको यह करना होगा।
मंच पर और गितुब मुद्दों में, प्रलेखन में सुधार के लिए सुझाव दिए गए थे, लेकिन चीजें आगे नहीं बढ़ीं। ऐसा लगता है कि किसी तरह का कठोर हाथ गायब है, जो कहेगा "सब कुछ, समुदाय, फावड़े ले लो और इस गुच्छा को रेक करने के लिए ... पाठ के सरल बिखरे हुए टुकड़े।"
सौभाग्य से, मैंने अपना खुद का मारा, इसलिए मैं आपके लिए नीम चैंपियन की सूची प्रस्तुत करता हूं
प्रलेखन
- ट्यूटोरियल 1 , ट्यूटोरियल 2 - उनके साथ शुरू करें
- निम एक्शन एक व्याख्यात्मक पुस्तक है जो वास्तव में भाषा के कई पहलुओं को अच्छी तरह से समझाती है, कभी-कभी इससे बहुत बेहतर होती है। प्रलेखन
- निम मैनुअल - वास्तव में, एक मैनुअल - लगभग सब कुछ वर्णित है, लेकिन नहीं
- निम प्रयोगात्मक मैनुअल - वास्तव में एक अलग पृष्ठ पर प्रलेखन क्यों जारी नहीं है?
- सूचकांक - सब कुछ के लिए लिंक यहां एकत्र किए गए हैं, अर्थात सामान्य रूप से सब कुछ जो कि निम में पाया जा सकता है। यदि आपको ट्यूटोरियल और मैनुअल में वह नहीं मिल रहा है, जो आपको निश्चित रूप से इंडेक्स में मिलेगा।
पाठ और ट्यूटोरियल
मदद
- IRC मुख्य निवास स्थान है ... nimmers? का, जिसका प्रसारण Discord और Gitter पर किया जाता है । मैंने कभी भी आईआरसी का उपयोग नहीं किया है (और अभी भी इसका उपयोग नहीं करते हैं)। सामान्य तौर पर, यह एक बहुत ही अजीब विकल्प है। अभी भी उसके लिए कबूतर मेल है ... ठीक है, मजाक कर रहा है।
- निम मंच फोरम की विशेषताएं न्यूनतम हैं, लेकिन 1) यहां आप उत्तर 2 पा सकते हैं) यहां आप एक प्रश्न पूछ सकते हैं यदि आइटम 1 ने काम नहीं किया 3) उत्तर की संभावना 50% से अधिक 4 है) भाषा डेवलपर्स मंच पर बैठे हैं और सक्रिय रूप से जवाब दे रहे हैं। वैसे, फ़ोरम निम में लिखा गया है, और इसलिए कोई कार्यक्षमता नहीं है
- निम तार समूह - यह एक सवाल पूछने के लिए संभव है और [नहीं] एक जवाब मिलता है।
- एक रूसी टेलीग्राम समूह भी है, अगर आप नीम से थक चुके हैं और इसके बारे में कुछ भी सुनना नहीं चाहते हैं, तो आपको वहां जाना चाहिए :) (आंशिक रूप से एक मजाक)
खेल का मैदान
- निम खेल का मैदान - यहाँ आप सीधे ब्राउज़र में निम पर कार्यक्रम चला सकते हैं
- निम docker क्रॉस-संकलन - यहां आप पढ़ सकते हैं कि कैसे एक docker छवि लॉन्च करें और विभिन्न प्लेटफार्मों के लिए कार्यक्रम संकलित करें।
संकुल
अन्य भाषाओं से nim पर स्विच करें
आपको क्या पसंद है
भाषा की सभी विशेषताओं को सूचीबद्ध करने का कोई मतलब नहीं है, लेकिन यहां कुछ विशेषताएं हैं:
भग्न जटिलता
निम आपको "जटिलता का भग्न" प्रदान करता है। आप उच्च-स्तरीय कोड लिख सकते हैं। आप कच्चे पॉइंटर्स के साथ बट सकते हैं और attempt to read from nil
हर attempt to read from nil
आनंद ले सकते attempt to read from nil
। आप सी कोड एम्बेड कर सकते हैं। आप कोडांतरक में आवेषण लिख सकते हैं। आप प्रक्रियाएं (स्थैतिक प्रेषण) लिख सकते हैं। पर्याप्त नहीं - "विधियाँ" (गतिशील प्रेषण) हैं। अधिक? वहाँ जेनेरिक हैं, और जेनेरिक हैं जो कार्यों की नकल करते हैं। टेम्पलेट हैं - एक प्रतिस्थापन तंत्र, लेकिन सी ++ में उल्टी नहीं है (क्या यहां मैक्रोज़ हैं - क्या यह सिर्फ एक पाठ प्रतिस्थापन है, या क्या यह कुछ अधिक स्मार्ट है?)। मैक्रोज़ हैं, अंत में - यह IDDQD की तरह है, वे भगवान मोड को सक्षम करते हैं और आपको सीधे एएसटी के साथ काम करने की अनुमति देते हैं और शाब्दिक रूप से सिंटैक्स ट्री के टुकड़ों को प्रतिस्थापित करते हैं, या अपनी इच्छानुसार भाषा का विस्तार करते हैं।
यही है, एक "उच्च" स्तर पर, आप न जानने के लिए नरक और शोक लिख सकते हैं, लेकिन कोई भी आपको किसी भी जटिलता के धोखाधड़ी करने के लिए मना नहीं करता है।
विकास की गति
सीखने की अवस्था वक्र नहीं है। यह प्रत्यक्ष है। निम स्थापित करके, आप पहले मिनट में अपनी पहली हैलो दुनिया शुरू करेंगे, और पहले दिन आप एक सरल उपयोगिता लिखेंगे। लेकिन कुछ महीनों में आपको कुछ सीखने को मिलेगा। उदाहरण के लिए, मैंने प्रक्रियाओं के साथ शुरुआत की, फिर मुझे तरीकों की आवश्यकता हुई, थोड़ी देर के बाद जेनेरिक मेरे लिए बहुत उपयोगी थे, हाल ही में मैंने उनकी पूर्ण सुंदरता में टेम्पलेट्स की खोज की, और उसी समय मैंने मैक्रों को बिल्कुल भी स्पर्श नहीं किया। एक ही जंग या सी ++ की तुलना में, नीम के साथ विलय करना बहुत आसान है।
पैकेज प्रबंधन
एक पैकेज मैनेजर है जिसे फुर्तीला कहा जाता है, जो इंस्टाल कर सकता है, पैकेज बना सकता है और निर्भरता बढ़ा सकता है। जब आप अपना पैकेज (= प्रोजेक्ट) बनाते हैं, तो आप फुर्तीला (nimscript का उपयोग करके, जो VM पर निष्पादित nim का सबसेट है) में अलग-अलग कार्य लिख सकते हैं, उदाहरण के लिए, दस्तावेज़ बनाना, परीक्षण चलाना, संपत्ति की प्रतिलिपि बनाना, आदि। फुर्तीला न केवल आवश्यक निर्भरता डालता है, बल्कि आपको अपनी परियोजना के लिए काम के माहौल को कॉन्फ़िगर करने की भी अनुमति देता है। यही है, फुर्तीला है, मोटे तौर पर, सीएमके, जो कि कहावत नहीं, बल्कि सामान्य लोगों द्वारा लिखा गया था।
पठनीयता और अभिव्यक्ति
बाहरी रूप से, नीम प्रकार के एनोटेशन के साथ अजगर के समान है, हालांकि निम बिल्कुल भी अजगर नहीं है। पायथनवादियों को डायनेमिक टाइपिंग, इनहेरिटेंस, डेकोरेटर्स और अन्य खुशियों को भूलना होगा और आम तौर पर अपनी सोच को फिर से बनाना होगा। अपने अजगर के अनुभव को नीम पर स्थानांतरित करने की कोशिश न करें, क्योंकि अंतर बहुत बड़ा है। सबसे पहले, मैं वास्तव में सज्जाकारों के साथ विषम संग्रह और मिश्रण चाहता हूं। लेकिन फिर किसी तरह आप को कठिनाई में जीने की आदत हो जाती है :)
यहाँ एक उदाहरण निम कार्यक्रम है:
type NumberGenerator = object of Service # this service just generates some numbers NumberMessage = object of Message number: int proc run(self: NumberGenerator) = if not waitAvailable("calculator"): echo "Calculator is unavailable, shutting down" return for number in 0..<10: echo &"Sending number {number}" (ref NumberMessage)(number: number).send("calculator")
प्रतिरूपकता
सब कुछ मॉड्यूल में विभाजित किया गया है जिसे आप अपनी इच्छानुसार आयात कर सकते हैं - केवल कुछ वर्णों को आयात करने के लिए, या सभी पर कुछ निश्चित, या सभी, या कोई भी नहीं और उपयोगकर्ता को पूर्ण पथ a la module.function()
निर्दिष्ट करने के लिए बाध्य करें, और एक अलग नाम के तहत भी आयात करें। बेशक, यह सभी विविधता बहस में एक और तर्क के रूप में बहुत उपयोगी है "कौन सी प्रोग्रामिंग भाषा बेहतर है," ठीक है, और आपकी परियोजना में आप चुपचाप import mymodule
और अन्य विकल्पों का उल्लेख नहीं करेंगे।
विधि कॉल सिंटैक्स
एक फ़ंक्शन कॉल को विभिन्न तरीकों से रिकॉर्ड किया जा सकता है:
double(2) double 2 2.double() 2.double
एक तरफ, अब हर कोई ... जैसा वह पसंद करता है (और हर कोई इसे अलग-अलग तरीकों से पसंद करता है, निश्चित रूप से और एक परियोजना के ढांचे के भीतर भी अलग-अलग तरीकों से लिखता है)। लेकिन फिर सभी कार्यों को एक विधि कॉल के रूप में लिखा जा सकता है, जो पठनीयता में सुधार करता है। अजगर में, यह हो सकता है:
list(set(some_list))
निम में समान कोड को अधिक तार्किक रूप से फिर से लिखा जा सकता है:
some_list.set.list #
PLO
ओओपी, हालांकि यह मौजूद है, इससे प्लसस और अजगर में अलग है: ऑब्जेक्ट और विधियां अलग-अलग इकाइयां हैं, और अलग-अलग मॉड्यूल में अच्छी तरह से मौजूद हो सकती हैं। इसके अलावा, आप अपने तरीकों को लिख सकते हैं जैसे कि मूल प्रकार
proc double(number: int): int = number * 2 echo $2.double() # prints "4"
दूसरी ओर, निम में एनकैप्सुलेशन है (निम में मॉड्यूल का पहला नियम किसी को बिना तार के पहचानकर्ता के बारे में नहीं बताना है)। यहाँ एक मानक मॉड्यूल का एक उदाहरण दिया गया है:
# sharedtables.nim type SharedTable*[A, B] = object ## generic hash SharedTable data: KeyValuePairSeq[A, B] counter, dataLen: int lock: Lock
SharedTable*
प्रकार एक तारांकन चिह्न से चिह्नित है, जिसका अर्थ है कि यह अन्य मॉड्यूल में "दृश्यमान" है और इसे आयात किया जा सकता है। लेकिन यहां data
, counter
और lock
निजी सदस्य हैं, और sharedtables.nim
बाहर से पहुंच योग्य नहीं हैं। इससे मुझे बहुत खुशी हुई जब मैंने SharedTable
प्रकार के लिए कुछ अतिरिक्त कार्य लिखने का फैसला किया, जैसे len
या hasKey
, और पाया कि मेरे पास या तो counter
या data
तक कोई पहुंच नहीं थी, और SharedTable
को "विस्तार" करने का एकमात्र तरीका अपना खुद का लिखना था , ब्ल के साथ
सामान्य तौर पर, विरासत का उपयोग एक ही अजगर (व्यक्तिगत अनुभव से) की तुलना में बहुत कम किया जाता है, क्योंकि विधि कॉल सिंटैक्स (ऊपर देखें) और ऑब्जेक्ट वेरिएंट (नीचे देखें) हैं। निम पथ वंशानुक्रम के बजाय रचना है। बहुरूपता के साथ भी ऐसा ही है: निम में ऐसे तरीके हैं जो उत्तराधिकारी वर्गों में ओवरराइड किए जा सकते हैं, लेकिन यह अनिवार्य रूप से --multimethods:on
फ्लैग का उपयोग करके संकलन के दौरान निर्दिष्ट किया जाना चाहिए। यही है, डिफ़ॉल्ट रूप से, तरीके काम नहीं करते हैं, जो उनके बिना काम को थोड़ा प्रोत्साहित करते हैं।
संकलन-समय निष्पादन
कॉन्स्ट - संकलन चरण पर कुछ की गणना करने की क्षमता और परिणामी बाइनरी में इसे "सीवे" करें। यह शांत और आरामदायक है। सामान्य तौर पर, निम का "संकलन समय" से एक विशेष संबंध है, यहां तक कि एक कीवर्ड भी है - यह ऐसा है जैसे if
, लेकिन तुलना संकलन चरण पर है। आप कुछ ऐसा लिख सकते हैं
when defined(SDL_VIDEO_DRIVER_WINDOWS): import windows ## oldwinapi lib elif defined(SDL_VIDEO_DRIVER_X11): import x11/x, x11/xlib ## x11 lib
यह बहुत सुविधाजनक है, हालांकि संकलन चरण में आप क्या कर सकते हैं, इस पर प्रतिबंध हैं (उदाहरण के लिए, आप एफएफआई कॉल नहीं कर सकते हैं)।
संदर्भ प्रकार
रेफ टाइप - C ++ में साझा_प्ट्र का एक एनालॉग, जिसे कचरा कलेक्टर ध्यान रखेगा। लेकिन आप उन क्षणों में कचरा इकट्ठा करने वाले को स्वयं भी कॉल कर सकते हैं जब यह आपके लिए सुविधाजनक हो। या आप कचरा बीनने वालों के लिए विभिन्न विकल्पों की कोशिश कर सकते हैं। या आप कचरा कलेक्टर को पूरी तरह से अक्षम कर सकते हैं और नियमित पॉइंटर्स का उपयोग कर सकते हैं।
आदर्श रूप से, यदि आप कच्चे पॉइंटर्स और एफएफआई का उपयोग नहीं करते हैं, तो आपको विभाजन त्रुटियों की संभावना नहीं है। व्यवहार में, अब तक बिना एफएफआई के कहीं भी।
lambdas
अनाम प्रक्रियाएँ (अजगर में उर्फ लंबदा) हैं, लेकिन अनाम प्रक्रिया में अजगर के विपरीत, आप इन कथनों का उपयोग कर सकते हैं:
someProc(callback=proc(a: int) -> int = var b = 5*a; result = a)
अपवाद
अपवाद हैं, वे फेंकने के लिए बहुत असुविधाजनक हैं: अजगर raise ValueError('bad value')
raise newException(ValueError, "bad value")
। कुछ भी अधिक असामान्य नहीं है - कोशिश करो, सिवाय इसके, अंत में, सब कुछ हर किसी की तरह है। मैं, अपवादों के समर्थक के रूप में, त्रुटि कोड नहीं, आनन्दित। वैसे, आप उन कार्यों के लिए संकेत कर सकते हैं जो अपवाद वे फेंक सकते हैं, और संकलक यह जाँच करेगा:
proc p(what: bool) {.raises: [IOError, OSError].} = if what: raise newException(IOError, "IO") else: raise newException(OSError, "OS")
जेनेरिक्स
जेनरिक बहुत अभिव्यंजक हैं, उदाहरण के लिए, आप संभावित प्रकारों को सीमित कर सकते हैं
proc onlyIntOrString[T: int|string](x, y: T) = discard # int string
और आप एक पैरामीटर के रूप में सामान्य रूप से पास कर सकते हैं - यह एक सामान्य फ़ंक्शन की तरह दिखता है, लेकिन वास्तव में एक सामान्य:
proc p(a: typedesc; b: a) = discard # is roughly the same as: proc p[T](a: typedesc[T]; b: T) = discard # hence this is a valid call: p(int, 4) # as parameter 'a' requires a type, but 'b' requires a value.
टेम्पलेट्स
टेम्पलेट सी ++ में मैक्रोज़ की तरह कुछ हैं, बस सही ढंग से बनाया :) - आप कोड के पूरे ब्लॉक को टेम्पलेट्स में सुरक्षित रूप से स्थानांतरित कर सकते हैं, और यह नहीं सोचते कि प्रतिस्थापन बाहरी कोड में कुछ भी बर्बाद कर देगा (लेकिन आप कर सकते हैं, फिर से , इसे गड़बड़ करने के लिए, अगर आपको वास्तव में ज़रूरत है)।
यहां एक उदाहरण app
टेम्प्लेट है, जो चर के मूल्य के आधार पर, कोड के ब्लॉक में से एक को कॉल करता है:
template app*(serverCode: untyped, clientCode: untyped) = # ... case mode of client: clientCode of server: serverCode else: discard
उदाहरण के लिए do
मैं पूरे ब्लॉक को टेम्पलेट में पास कर सकता हूं:
app do: # serverCode echo "I'm server" serverProc() do: # clientCode echo "I'm client" clientProc()
परस्पर खोल
यदि आपको जल्दी से कुछ परीक्षण करने की आवश्यकता है, अर्थात, "दुभाषिया" या "निम शेल" को कॉल करने की क्षमता (जैसे कि आप मापदंडों के बिना python
चलाते हैं)। ऐसा करने के लिए, nim secret
कमांड का उपयोग करें या inim पैकेज डाउनलोड करें।
FFI
एफएफआई - सी / सी ++ में तीसरे पक्ष के पुस्तकालयों के साथ बातचीत करने की क्षमता। दुर्भाग्य से, एक बाहरी पुस्तकालय का उपयोग करने के लिए आपको एक आवरण लिखना होगा जिसमें बताया गया है कि कहां और क्या आयात करना है। उदाहरण के लिए:
{.link: "/usr/lib/libOgreMain.so".} type ManualObjectSection* {.importcpp: "Ogre::ManualObject::ManualObjectSection", bycopy.} = object
ऐसे उपकरण हैं जो इस प्रक्रिया को अर्ध-स्वचालित बनाते हैं:
क्या पसंद नहीं है?
जटिलता
बहुत सी बातें। भाषा की कल्पना न्यूनतम के रूप में की गई थी, लेकिन अब यह सच्चाई से बहुत दूर है। उदाहरण के लिए, हमें कोड रिडरिंग क्यों मिला!
फालतूपन
बहुत सारी गंदगी: system.addInt - "पूर्णांक को इसके स्ट्रिंग प्रतिनिधित्व में परिवर्तित करता है और परिणाम के लिए इसे जोड़ता है"। यह मुझे लगता है कि यह एक बहुत ही सुविधाजनक कार्य है, मैं इसे हर परियोजना में उपयोग करता हूं। यहाँ एक और दिलचस्प है: fileExists और मौजूद हैफाइल ( https://forum.nim-lang.org/t/3636 )
कोई एकीकरण नहीं
"स्मथ करने का केवल एक ही तरीका है" - कोई भी नहीं:
- विधि कॉल सिंटैक्स - जैसा आप चाहते हैं एक फ़ंक्शन कॉल लिखें
fmt
बनाम- कैमलकेस और अंडरस्कोर_नोटेशन
- यह और tHiS (बिगाड़ने वाला: यह एक ही बात है)
- फ़ंक्शन बनाम प्रक्रिया बनाम टेम्पलेट
बग्स (कोई बैग नहीं!)
कीड़े हैं, लगभग 1400 । या बस मंच पर जाएं - वे लगातार कुछ बग ढूंढते हैं।
स्थिरता
पिछले पैराग्राफ के अलावा, v1 का अर्थ है स्थिरता, है ना? और यहाँ अराक भाषा का निर्माता फ़ोरम में उड़ता है और कहता है: "दोस्तों, मुझे यहाँ एक और (छठा) कचरा संग्रहकर्ता मिला है, यह कूलर, तेज़, छोटा, आपको थ्रेड्स के लिए स्मृति साझा करता है (हा हा, और इससे पहले कि आप पीड़ित थे और उससे पहले इस्तेमाल किया बैसाखी), विकसित शाखा डाउनलोड करें और कोशिश करें। " और ऐसे सभी "वाह, कितना ठंडा है! और इसका मतलब केवल नश्वर के लिए क्या है? क्या अब हमें फिर से सभी कोड बदलने की आवश्यकता है?" ऐसा नहीं लगता है, इसलिए मैं nim को अपडेट करता हूं, एक नया कचरा संग्रहकर्ता --gc:arc
और मेरा प्रोग्राम c ++ कोड को संकलित करने के चरण में कहीं दुर्घटनाग्रस्त हो जाता है (यानी nim में नहीं, लेकिन gcc में):
/usr/lib/nim/system.nim:274:77: error: 'union pthread_cond_t' has no member named 'abi' 274 | result = x
वाह! अब, मुझे नया कोड लिखने के बजाय, पुराने को सुधारना होगा। क्या यह नहीं था कि जब मैं निम को चुनता था, तब से क्या चल रहा था?
यह जानकर अच्छा लगा कि मैं अकेला नहीं हूं
तरीके और बहुआयामी
डिफ़ॉल्ट रूप से, मल्टीमिथोड और थ्रेड्स झंडे बंद हैं - आप नहीं जा रहे हैं 2019 ओवरराइडिंग विधियों के साथ 2020 एक बहु-थ्रेडेड एप्लिकेशन लिखें?! और यह कितना अच्छा है यदि आपके पुस्तकालय को प्रवाह पर विचार किए बिना बनाया गया था, और फिर उपयोगकर्ता ने उन्हें चालू कर दिया ... ओह हां, अद्भुत प्रहसन हैं {.हेरिटेबल।} और {.base।} विरासत के लिए ताकि आपका कोड संक्षिप्त न हो।
वस्तु रूप
आप तथाकथित का उपयोग करके विरासत से बच सकते हैं ऑब्जेक्ट वेरिएंट:
type CoordinateSystem = enum csCar, # Cartesian csCyl, # Cylindrical Coordinates = object case cs: CoordinateSystem: # cs is the coordinate discriminator of csCar: x: float y: float z: float of csCyl: r: float phi: float k: float
cs
के मूल्य के आधार पर, x, y, z फ़ील्ड या r, phi और k दोनों आपके लिए उपलब्ध होंगे।
नुकसान क्या हैं?
सबसे पहले, मेमोरी "सबसे बड़े विकल्प" के लिए आरक्षित है - ताकि यह ऑब्जेक्ट के लिए आवंटित मेमोरी में फिट होने की गारंटी हो।
दूसरे, विरासत अभी भी अधिक लचीला है - आप हमेशा एक वंशज बना सकते हैं और अधिक फ़ील्ड जोड़ सकते हैं, और ऑब्जेक्ट संस्करण में सभी फ़ील्ड एक खंड में कठोरता से परिभाषित होते हैं।
तीसरा, जो सबसे अधिक प्रभावित करता है वह यह है कि आप विभिन्न प्रकारों में "पुन: उपयोग" फ़ील्ड नहीं कर सकते हैं :
type # The 3 notations refer to the same 3-D entity, and some coordinates are shared CoordinateSystem = enum csCar, # Cartesian (x,y,z) csCyl, # Cylindrical (r,φ,z) Coordinates = object case cs: CoordinateSystem: # cs is the coordinate discriminator of csCar: x: float y: float z: float # z already defined here of csCyl: r: float phi: float z: float # fails to compile due to redefinition of z
संकेतन
बस बोली :
- कोष्ठक के साथ एक गुमनाम खरीद है
- कोष्ठक के बिना कोड का एक ब्लॉक है
एक अभिव्यक्ति का अर्थ है अलग-अलग चीजें (_ (ツ) _ / ¯
कब उपयोग करना है
इसलिए, हमारे पास फ़ंक्शंस, प्रक्रियाएं, जेनरिक, मल्टीमिथोड, टेम्प्लेट और मैक्रोज़ हैं। टेम्प्लेट का उपयोग करना कब बेहतर है, और प्रक्रिया कब है? टेम्प्लेट या जेनेरिक? कार्य या प्रक्रिया? तो, मैक्रों के बारे में क्या? मुझे लगता है कि आपको बात मिल जाएगी।
प्रथा का प्रचलन
अजगर में सज्जाकार होते हैं जो कक्षाओं के लिए भी लागू किए जा सकते हैं, यहां तक कि कार्यों के लिए भी।
इसके लिए निम में प्रज्ञाएँ हैं। और यहाँ है:
चतुर
जो मर चुका है वह मर नहीं सकता। फुर्तीला में, परियोजनाओं का एक गुच्छा जो लंबे समय से अद्यतन नहीं किया गया है (और निम में यह मृत्यु के समान है) - और उन्हें हटाया नहीं जाता है। इसके पीछे कोई नहीं है। यह स्पष्ट है कि, बैकवर्ड कम्पेटिबिलिटी, "आप टर्निप से पैकेज को सिर्फ ले और निकाल नहीं सकते", लेकिन फिर भी ... ठीक है, धन्यवाद, कम से कम npm पसंद नहीं है।
लीक से हटकर
छिद्रपूर्ण अमूर्त का एक ऐसा नियम है - आप किसी प्रकार के अमूर्त का उपयोग करते हैं, लेकिन जल्दी या बाद में आपको इसमें "छेद" मिलेगा, जो आपको एक निम्न स्तर तक ले जाएगा। निम C और C ++ का एक अमूर्त हिस्सा है, और जितनी जल्दी या बाद में आप वहां विफल हो जाएंगे। शर्त लगा लो तुम वहाँ पसंद नहीं है?
Error: execution of an external compiler program 'g++ -c -w -w -fpermissive -pthread -I/usr/lib/nim -I/home/user/c4/systems/network -o /home/user/.cache/nim/enet_d/@m..@s..@s..@s..@s..@s..@s.nimble@spkgs@smsgpack4nim-0.3.0@smsgpack4nim.nim.cpp:6987:136: note: initializing argument 2 of 'void unpack_type__k2dhaoojunqoSwgmQ9bNNug(tyObject_MsgStreamcolonObjectType___kto5qgghQl207nm2KQZEDA*, NU&)' 6987 | N_LIB_PRIVATE N_NIMCALL(void, unpack_type__k2dhaoojunqoSwgmQ9bNNug)(tyObject_MsgStreamcolonObjectType___kto5qgghQl207nm2KQZEDA* s, NU& val) { nimfr_("unpack_type", "/home/user/.nimble/pkgs/msgpack4nim-0.3.0/msgpack4nim.nim"); |
tyObject_MsgStreamcolonObjectType ___ kto5qgghQl207nm2KQZEDA * रों, NU और वैल) {nimfr _ ( "unpack_type", "/home/user/.nimble/pkgs/msgpack4nim-0.3.0/msgpack4nim.nim"); Error: execution of an external compiler program 'g++ -c -w -w -fpermissive -pthread -I/usr/lib/nim -I/home/user/c4/systems/network -o /home/user/.cache/nim/enet_d/@m..@s..@s..@s..@s..@s..@s.nimble@spkgs@smsgpack4nim-0.3.0@smsgpack4nim.nim.cpp:6987:136: note: initializing argument 2 of 'void unpack_type__k2dhaoojunqoSwgmQ9bNNug(tyObject_MsgStreamcolonObjectType___kto5qgghQl207nm2KQZEDA*, NU&)' 6987 | N_LIB_PRIVATE N_NIMCALL(void, unpack_type__k2dhaoojunqoSwgmQ9bNNug)(tyObject_MsgStreamcolonObjectType___kto5qgghQl207nm2KQZEDA* s, NU& val) { nimfr_("unpack_type", "/home/user/.nimble/pkgs/msgpack4nim-0.3.0/msgpack4nim.nim"); |
/usr/bin/ld: /home/user/.cache/nim/enet_d/stdlib_dollars.nim.cpp.o: in function `dollar___uR9bMx2FZlD8AoPom9cVY9ctA(tyObject_ConnectMessage__e5GUVMJGtJeVjEZUTYbwnA*)': stdlib_dollars.nim.cpp:(.text+0x229): undefined reference to `resizeString(NimStringDesc*, long)' /usr/bin/ld: stdlib_dollars.nim.cpp:(.text+0x267): undefined reference to `resizeString(NimStringDesc*, long)' /usr/bin/ld: stdlib_dollars.nim.cpp:(.text+0x2a2): undefined reference to `resizeString(NimStringDesc*, long)'
इतना
मैं एक गूंगा प्रोग्रामर हूं। मैं यह नहीं जानना चाहता कि जीसी कैसे काम करता है, वहां क्या है और यह कैसे जुड़ा हुआ है, यह कहां कैश्ड है और कचरा कैसे हटाया जाता है। यह एक कार की तरह है - सिद्धांत रूप में, मुझे पता है कि यह कैसे काम करता है, पहिया संरेखण के बारे में थोड़ा, गियरबॉक्स के बारे में थोड़ा, मुझे तेल और सामान भरने की जरूरत है, लेकिन सामान्य तौर पर मैं बस बैठना और (और तेज) पार्टी में जाना चाहता हूं। एक मशीन एक लक्ष्य नहीं है, लेकिन एक अंत का साधन है। यदि यह टूट जाता है, तो मैं हुड में नहीं जाना चाहता, लेकिन बस इसे सेवा में ले जाएं (इस अर्थ में, मैं गितुब पर मुद्दा खोलूंगा), और यह बहुत अच्छा होगा यदि वे इसे जल्दी ठीक कर लेंगे।
निम को ऐसी मशीन बनना था। भाग में, वह बन गया, लेकिन एक ही समय में, जब मैं इस कार पर राजमार्ग के साथ भागता हूं, तो मेरा पहिया गिर जाता है, और पीछे का दर्पण आगे निकल जाता है। इंजीनियर मेरे पीछे दौड़ते हैं और मक्खी पर कुछ संलग्न करते हैं ("अब आपकी कार इस नए स्पॉइलर के साथ और भी तेज है"), लेकिन इससे ट्रंक गिर जाता है। और आपको पता है क्या? मैं अभी भी इस कार को पसंद करता हूं, क्योंकि यह उन सभी कारों में से सबसे अच्छी है जो मैंने देखीं।