ऑब्जेक्टिव-डी - ऑब्जेक्टिव-सी का एक विकल्प या जोड़

उद्देश्य-सी, मेरी राय में, कई समस्याओं के साथ एक बहुत सुविधाजनक भाषा नहीं है। लेकिन हम इस भाषा में iOS एप्लिकेशन लिखने के लिए मजबूर हैं। मैंने एक और भाषा विकसित की है जो ऑब्जेक्टिव-सी कोड उत्पन्न करती है। इसलिए, इस भाषा में आप आसानी से उद्देश्य-सी और सी फ़ंक्शन कक्षाओं का उपयोग कर सकते हैं। आप Objective-C कोड में आसानी से जेनरेट की गई कक्षाओं का भी उपयोग कर सकते हैं। इसलिए एक साथ दो भाषाओं में विकास करने का अवसर है। मैंने इस भाषा को ऑब्जेक्टिव-डी कहा है।

मुझे कहना होगा कि यह एक तैयार उत्पाद नहीं है। मैंने अपनी आवश्यकताओं को पूरा करने के लिए इस भाषा को विकसित किया है, इसलिए इसमें अभी भी बहुत सारे कीड़े और कमियाँ हैं। मैंने हास्केल में भाषा का विकास किया और यह इस भाषा के साथ मेरा पहला अनुभव था। इसलिए, स्रोत कोड बहुत अच्छा नहीं है और इसे फिर से काम करना चाहिए।

सुविधाओं

वाक्य-विन्यास
मैंने स्काला सिंटैक्स को आधार के रूप में लिया, क्योंकि स्कैला में बहुत कॉम्पैक्ट सिंटैक्स है और मुझे यह पसंद है। इस प्रकार, वर्ग घोषणा बहुत सरल हो गई:
class Foo(bar : int) { val baz = 1 //constant var qux = 0 //mutable variable def twiceBar = bar * 2 //function } 

कार्यों
मुझे ऑब्जेक्टिव-सी में नामित पैरामीटर पसंद हैं। इससे कोड पठनीयता में सुधार होता है।
 def foo(p1 : int, p2 : int) : int = p1 * p2 def bar = foo(p1 = 1, 2) 

हालांकि, कभी-कभी पैरामीटर नाम बहुत ही कम होते हैं, इसलिए आप उन्हें ऑब्जेक्टिव-डी में छोड़ सकते हैं।
 def foo(bar : int) = bar * 326 val bar = 1 foo(bar = bar) foo(bar) 

ठूंठ वर्ग
इन वर्गों की आवश्यकता है ताकि आप ऑब्जेक्टिव-सी कक्षाओं या सी संरचनाओं का उपयोग ऑब्जेक्टिव-डी में कर सकें। वे केवल कक्षाओं या संरचनाओं के तरीकों और क्षेत्रों का वर्णन करते हैं।
 stub class XMLElement { def name : string def text : string def parent : XMLElement? def children : [XMLElement] } 

सामान्य प्रोग्रामिंग
यह भयानक है कि ऑब्जेक्टिव-सी जेनरिक का समर्थन नहीं करता है और बतख टाइपिंग का उपयोग करता है। ऑब्जेक्टिव-डी में, मैंने जेनरिक को लागू किया है और स्थैतिक टाइपिंग का उपयोग किया है।
 class Foo { var array = MutableArray<Bar>() } 

प्रकार का अनुमान
आप फ़ंक्शन के चर या वापसी मान को छोड़ सकते हैं। इसकी गणना स्वतः की जा सकती है।
 var i = 0 var i : int = 0 //  

वालिस (लक्षण)
आप एक वर्ग से एक वर्ग और कई लक्षण प्राप्त कर सकते हैं, लेकिन विशेषता एक सरल इंटरफ़ेस नहीं है। इसमें फ़ील्ड और फ़ंक्शंस हो सकते हैं। एक विशेषता में केवल कंस्ट्रक्टर शामिल नहीं हो सकते हैं।
 trait Foo { def foo = 1 } trait Bar { var bar = 0 } class Baz extends Foo with Bar 

संरचना
आप एक संरचना के भीतर संरचनाओं और कार्यों को परिभाषित कर सकते हैं। संरचनाएं सी संरचनाओं में उत्पन्न होंगी, और सी फ़ंक्शन में कार्य करेंगे।
 struct Vec2(x : float, y : float) { def dot(vec2 : Vec2) : float = x*vec2.x + y*vec2.y } 

संचालक अधिभार
वर्तमान में, यह केवल विशेष फ़ंक्शन नामों (ऐड, सब, डिवा, मुल) के साथ काम करता है। लेकिन मेरी योजना निम्नलिखित को लागू करने की है:
 struct Vec2(x : float, y : float) { def +(vec2 : Vec2) : float = Vec2(x + vec2.x, y + vec2.y) } 

ब्लॉक
मैं उदाहरणों के साथ ब्लॉक का सिंटैक्स प्रदर्शित करूंगा:
 def filter(predicate : T -> bool) : [T] val array = [4, 3, 5, 1] array.filter{item : int -> item > 3} // [4, 5] array.filter{item -> item > 3 } // [4, 5] array.filter(_ > 3) // [4, 5] 

आइटम डेटा प्रकार को जेनेरिक का उपयोग करके गणना की जा सकती है ताकि इसे छोड़ा जा सके।

पंक्तियां
आप इनलाइन एक्सप्रेशन और लाइन ब्रेक का उपयोग कर सकते हैं। एक उदाहरण देखें:
 val a = 1 val b = 2 val s = "a = $a b = $b" 

tuples
एक वर्ग की घोषणा के बिना कुछ मूल्य को संयोजित करने के लिए ट्यूपल्स बहुत उपयोगी हो सकते हैं। कभी-कभी वे किसी फ़ंक्शन के रिटर्न मान के रूप में उपयोग करने के लिए बहुत सुविधाजनक होते हैं।
 val tuple = (1, "foo", "bar") tuple.a == 1 tuple.b == "foo" 

आलसी अर्थ
इन मूल्यों की गणना केवल पहली कॉल के समय की जाएगी।
 class Foo(bar : int) { lazy val barSquare = bar * bar } 

छवि मिलान
कार्यात्मक प्रोग्रामिंग में छवि मिलान एक बड़ा विषय है। यह आपको अधिक संक्षिप्त और स्वच्छ कोड बनाने की अनुमति देता है।
 def foo(bar : (int, int)) : int = case(bar) { (a, 1) -> a (0, _) -> 1 _ -> 0 } 

स्थानांतरण
मुझे जावा में लिस्टिंग पसंद है, इसलिए मैंने ऑब्जेक्टिव-डी के समान कुछ लागू किया।
 enum Foo(bar : int) { baz(1) qux(2) } 

संकुल
पैकेज सिस्टम की कमी ऑब्जेक्टिव-सी के साथ एक बड़ी समस्या है, और मुझे क्लास के उपसर्ग बिल्कुल पसंद नहीं हैं।
 package com.foo import com.baz.ParticularClass import com.bar._ 

लेकिन Objective-C में उपसर्गों की आवश्यकता होती है, इसलिए आप Objective-D में एक बैच ऑब्जेक्ट में पैकेज उपसर्ग को परिभाषित कर सकते हैं। यह उपसर्ग उत्पन्न वर्गों और फ़ाइलों में जोड़ा जाएगा। बैच ऑब्जेक्ट में, आप पैकेज के सभी वर्गों के लिए सामान्य आयात को भी परिभाषित कर सकते हैं।
 package com object foo { import com.bar._ val prefix = "FOO" } 

विकास का इतिहास


जब मैंने रेलडेल विकसित करना शुरू किया, तो मैंने कोकोस 2 डी और ऑब्जेक्टिव-सी का उपयोग किया। बाद में मैंने Cocos2D को छोड़ दिया और OpenGL पर स्विच कर दिया, क्योंकि मैंने विकास जारी रखने का फैसला किया। यदि मैं शुरू से ही OpenGL का उपयोग कर रहा था, तो मैं ऑब्जेक्टिव-सी के बजाय C ++ चुन सकता था।

विकास की शुरुआत के कुछ समय बाद, मैंने महसूस किया कि ऑब्जेक्टिव-सी ने मुझे परेशान करना शुरू कर दिया। पहली समस्या यह थी कि लिस्टिंग नहीं हैं। मेरा मतलब है कि जावा या इस तरह की जगह ले सकने वाली किसी चीज़ से संबंधित गुणों के साथ फिर से गणना। मैं इस समस्या को हल करने के लिए कई तरीकों के साथ आया था, लेकिन फिर भी इसने बहुत सारे कोड लिए। मैंने मैक्रोज़ का उपयोग करने की कोशिश की, लेकिन मुझे एक अच्छा समाधान नहीं मिला।

और मैंने गणना के लिए एक कोड जनरेटर विकसित करने का फैसला किया, जो भाषा-उन्मुख प्रोग्रामिंग में सामान्य अभ्यास है। यह उद्देश्य-डी का पहला भाग था:
 enum RailConnector(x : int, y : int, angle : int) { left(-1, 0, 0) bottom(0, -1, 90) top(0, 1, 270) right(1, 0, 180) } 

जनरेटर को विकसित करने के लिए एक मंच के रूप में, मैंने तीन संभावनाओं से चुना: जेटब्रेन एमपीएस , स्काला और हास्केल । मैंने हास्केल को चुना क्योंकि इसमें पार्सिंग ( पारसेक ) के लिए एक महान पुस्तकालय है, और मैंने पहले हास्केल की कोशिश नहीं की है। मेरा कहना है कि हास्केल एक अद्भुत भाषा है।

मैंने लिस्टिंग बहुत तेजी से विकसित की। और फिर मैंने सोचा कि सरल संक्षिप्त वाक्य रचना में अपरिवर्तनीय कक्षाएं लिखना बहुत अच्छा होगा, और इसे लागू करना आसान है। और मैंने इस मामले के लिए एक जनरेटर विकसित किया। फिर मैंने कक्षाओं में सरल कार्यों को लिखने की क्षमता जोड़ी और रेलडेल के विकास के दौरान सुविधाओं को जोड़ना जारी रखा। मैंने AppCode के लिए एक प्लगइन भी विकसित किया है जो सिंटैक्स को हाइलाइट करता है और आपको कुछ सरल रीफैक्टरिंग करने की अनुमति देता है। मैंने अब तक ऑब्जेक्टिव-डी को विकसित करते हुए 230 घंटे बिताए हैं।

ऑब्जेक्टिव-डी कैसे ट्राई करें


मुझे खुशी होगी अगर किसी ने ऑब्जेक्टिव-डी की कोशिश की, मैं आपकी समस्याओं को ठीक करने में मदद करूंगा। अगर कोई विकास में भाग लेना चाहता है, तो मुझे बहुत खुशी होगी।
  1. ऑब्जेक्टिव-डी और अनज़िप को डाउनलोड करें ;
  2. Xcode में एक प्रोजेक्ट बनाएं;
  3. अपने प्रोजेक्ट में ObjDLib फ़ोल्डर की प्रतिलिपि बनाएँ और अपने लक्ष्य में m-files जोड़ें;
  4. बिल्ड चरण को अपने लक्ष्य में जोड़ें (संपादक-> बिल्ड बनाएँ चरण-> रन स्क्रिप्ट स्क्रिप्ट बनाएँ चरण जोड़ें) और बिन फ़ोल्डर में ओबजीडी फ़ाइल को कॉल करें:
      $ OBJD_HOME $ / bin / ObjD 
  5. ओडी एक्सटेंशन के साथ फाइल बनाएं और वहां ऑब्जेक्टिव-डी कोड लिखें। उदाहरण के लिए:
     package test class Foo(bar : int) 

  6. प्रोजेक्ट बनाएं। एच-फाइल और एम-फाइल ओड-फाइल के समान फ़ोल्डर में उत्पन्न होगी। इन फ़ाइलों को अपने प्रोजेक्ट में जोड़ें।

आप AppCode के लिए प्लगइन भी डाउनलोड कर सकते हैं।

विकास योजना



संदर्भ




PS यह अंग्रेजी के मेरे लेख का अनुवाद है। डिज़ाइन किया गया, यह अनुवाद की तरह नहीं है, क्योंकि साइट के नियम कहते हैं कि मैं किसी लेख में अपनी साइट पर लिंक नहीं डाल सकता, जब तक कि यह "I PR" ब्लॉग पर न हो। मैंने साइट प्रशासन से इस स्थिति के बारे में पूछा, मुझे अनुरोध का जवाब नहीं मिला। इसलिए मैंने लिंक निर्दिष्ट नहीं करने का निर्णय लिया।

Source: https://habr.com/ru/post/In209464/


All Articles