आप प्रोग्रामिंग भाषा कैसे डिजाइन करेंगे? [बन्द है]


41

यदि आप एक प्रोग्रामिंग भाषा डिजाइन करने के लिए थे, तो आप इसे कैसे करेंगे? आप किन विशेषताओं में डालेंगे? आप क्या छोड़ेंगे? सांख्यिकीय या गतिशील रूप से टाइप किया गया? मजबूत या कमजोर टाइप? संकलित या व्याख्या? अपने उत्तरों को सही ठहराएं।


12
यह प्रश्न बहुत अस्पष्ट है। जब तक भाषा का उद्देश्य निर्धारित नहीं किया जाता है तब तक भाषा सुविधाओं पर वास्तव में चर्चा नहीं की जा सकती है।
ब्लूकज

1
यदि आप वोट कर सकते हैं और सोच सकते हैं कि यह एक उपयोगी प्रश्न है या इसके नीचे उपयोगी उत्तर हैं, तो कृपया वोट करें। StackExchange साइटों को एक अच्छे समुदाय के निर्माण के लिए वोटों की आवश्यकता होती है। आप प्रति दिन 30 वोट दे सकते हैं, उन्हें बर्बाद मत करो। विशेष रूप से उच्च प्रतिष्ठा और कम मतों वाले उपयोगकर्ताओं को दिए गए कृपया इसे पढ़ें: meta.programmers.stackexchange.com/questions/393/…
Maniero

3
मैं एक विधि के साथ एक बहुत ही उच्च-स्तरीय भाषा बनाऊंगा: सार्वजनिक शून्य DoWhatIMeant ();
डेव

6
आदर्श प्रोग्रामिंग भाषा? ... मुझे अपना मन पढ़ने के लिए कंपाइलर मिलेगा और एक प्रोग्राम तैयार करना होगा कि मैं कैसे चाहता हूं .. :) इसमें कुछ समय लग सकता है लेकिन यह इसके लायक होगा।
वाल्टरजॉ।

2
संकलन और व्याख्या के लक्षण हैं ... ठीक है, संकलक या दुभाषिया (दोह), भाषा नहीं। सभी भाषाओं को एक कंपाइलर या एक दुभाषिया द्वारा कार्यान्वित किया जा सकता है। और वास्तव में, उनमें से बहुत सारे हैं। रूबी, पायथन, ECMAScript, PHP के लिए कंपाइलर हैं, C, C ++, Java, Haskell, ... के लिए दुभाषिए हैं ...
Jörg W Mittag

जवाबों:


55
  • मुझे निश्चित रूप से लगता है कि कार्यात्मक प्रोग्रामिंग भाषाओं पर पकड़ होगी, इसलिए मेरी भाषा कार्यात्मक होगी। कार्यात्मक प्रोग्रामिंग के साथ Taming प्रभाव देखें

  • मुझे लगता है कि सीपीयू में जल्द ही कोर के हुंड्रेड होंगे, और थ्रेड्स को प्रबंधित करने के लिए एक नरक होगा। तो अभिनेता मॉडल धागे के बजाय एक होना चाहिए। Erlang देखें - एक समवर्ती दुनिया के लिए सॉफ्टवेयर

  • मुझे यह भी लगता है कि OOP विफल हो गया है, वस्तुओं के बीच संचार को अतुल्यकालिक माना गया था । इसलिए मुझे लगता है कि हमें अपरिवर्तनीय संदेशों के साथ संदेश पारित करने की आवश्यकता है । भेजना और भूल जाना। जैसा कि एक्टर मॉडल में होता है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग देखें : गलत पथ?

  • मुझे लगता है कि स्थैतिक टाइपिंग करना अच्छा होगा , इसलिए विकास चक्र में त्रुटियों को पहले ही पकड़ लिया जाता है। लेकिन मैं Haskell की तरह टाइप इंट्रेंस का उपयोग करूंगा , ताकि डेवलपर को C, C # और Java जैसे कोड में हर जगह टाइप लिखने की जरूरत न पड़े। ग्रेट गुड के लिए लर्न यू ए हास्केल देखें

  • WPF और Android में, मैं घोषणात्मक लेआउट के साथ एक महान यूआई लाइब्रेरी भी डिज़ाइन करूंगा । लेकिन मैं इसे फंक्शनल रिएक्टिव प्रोग्रामिंग में करना चाहूंगा ।

तो मेरी भाषा Erlang में संक्षिप्त नाम की तरह होगी लेकिन Haskell में टाइपिंग के साथ और GUF फ्रेमवर्क में WPF.NET की तरह।


4
स्काला की तरह लगता है, वास्तव में, शायद महान यूआई पुस्तकालय को छोड़कर।
एपे-इनोगो

मुझे लगा कि स्कला में संदेश पासिंग और एक्टर्स हैं। मुझे लगता है कि मुझे नहीं लगता कि यह OOP से कैसे संबंधित है।
एपे-इनोगो

@ जोनास: बहुत अच्छा लग रहा है :) मुझे एक्टर मॉडल के बारे में ज्यादा जानकारी नहीं है, क्या यह वैसा ही है जैसा गो ने गोरोइन्ट्स के साथ किया था?
मैथ्यू एम।

1
केवल एक चीज जिस पर मुझे संदेह है, वह है स्टैटिक टाइपिंग। मैं कमजोर टाइपिंग के बजाय निश्चित रूप से मजबूत होना पसंद करता हूं, लेकिन कभी-कभी स्थिर टाइपिंग बहुत अधिक प्रतिबंधक होती है। लेकिन मैं हास्केल से परिचित नहीं हूं, और मैंने इसके टाइपिंग सिस्टम के बारे में केवल अच्छी बातें ही सुनी हैं :)
sakisk

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

22

नोट: मैंने इस पोस्ट में सुविधाओं का वर्णन करने के लिए सी-जैसे सिंटैक्स का उपयोग किया है, लेकिन मैं सिंटैक्स के बारे में तब तक खुद नहीं चुनूंगा, जब तक कि यह सभी कीवर्ड की तरह हास्यास्पद न हो।

1. टाइपिंग सिस्टम

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

//variable declarations
int anInt = 42 //anInt is now irrevocably an integer and assigning another type to it is an error
vartype aVariable = 42 //aVariable is currently an integer, but any type can be assigned to it in the future

//function definitions
int countElements(Collection c)
{
  return c.count();
} 

//c HAS to be a collection, since countElements doesn't make sense otherwise

void addToCollection(Collection& c, vartype v) 
{
  c.append(v)
}

//c is passed by reference here

2. संकलित बनाम व्याख्या की गई

मैं चाहता हूं कि भाषा या तो समय से पहले संकलित हो, या जेआईटी संकलित हो, लेकिन विशुद्ध रूप से व्याख्या नहीं की गई, गति इसका कारण है। यह बिंदु 1 से जुड़ा हुआ है, क्योंकि एक अनुकूलन कंपाइलर / घबराना के पास सांख्यिकीय रूप से टाइप किए गए कोड का अनुकूलन करने में बहुत आसान समय होगा , और गतिशील रूप से टाइप किए गए कोड को बस के रूप में छोड़ा जा सकता है।

3. क्लोजर

भाषा को कार्यात्मक प्रोग्रामिंग निर्माणों का समर्थन करना चाहिए, और फ़ंक्शंस प्रथम श्रेणी के ऑब्जेक्ट होने चाहिए।

4. वस्तु-उन्मुख

भाषा को आपको ऑब्जेक्ट-ओरिएंटेड कोड लिखने की अनुमति देनी चाहिए, लेकिन सरल अनिवार्य कोड को भी अनुमति दी जानी चाहिए। अर्थात, ऐसा हेलो वर्ल्ड प्रोग्राम लिखना संभव होना चाहिए:

int main(string<> args=null)
{
  printf("hello, world"); 
  return 0;
}

// this code also demonstrates two other features,
// default arguments for functions (not explained further)
// and immutable lists like string<> (see 6. Built-in datatypes)

5. नाम स्थान

नाम स्थान एक अच्छी बात है। बहुत कम सामान को वैश्विक नामस्थान में जाना चाहिए। लेकिन अगर आपको वैश्विक नामस्थान में सामान रखना चाहिए , तो आप (ala C ++) कर सकते हैं।

6. अंतर्निहित डेटाटिप्स

भाषा में बिल्ट-इन डेटाटिप्स के रूप में, निम्न निर्माण होना चाहिए:

  • एक intडेटा टाइप या प्रकार। यदि केवल एक intप्रकार है, तो इसमें असीमित रेंज होनी चाहिए। अधिक होने पर, गणना के परिणाम को धारण करने में सक्षम सबसे छोटे प्रकार में निहित होना चाहिए , असीमित रेंज प्रकार सबसे बड़ा होने के साथ।
  • एक एकल में निर्मित द्विआधारी floatप्रकार है, जो एक आईईईई 754 के बराबर हैdouble
  • एक उत्परिवर्तनीय listप्रकार जिसे या तो एक डबल लिंक की गई सूची के रूप में लागू किया जाता है या प्रत्येक तत्व को सन्निहित मेमोरी होल्ड पॉइंट्स के एक ब्लॉक के रूप में लागू किया जाता है
  • एक अपरिवर्तनीय listप्रकार है कि एक सरणी की तरह काम करता है, लेकिन जिसका आकार निर्माण के बाद बदला नहीं जा सकता
  • stringडिफ़ॉल्ट और अपरिवर्तनीय प्रकार, डिफ़ॉल्ट अपरिवर्तनीय होने के साथ।
  • एक mapया dictप्रकार जो उत्परिवर्तनीय है, और अपरिवर्तनीय कुंजियाँ और परस्पर और / या अपरिवर्तनीय मान रखता है।
  • अंतर्निहित संग्रह प्रकारों को डिफ़ॉल्ट रूप से सजातीय टाइप किया जाना चाहिए, लेकिन vartypeयदि आवश्यक हो तो d हो सकता है
  • एक booleanप्रकार का
  • एक प्रकार nullया noneप्रकार जो किसी भी प्रकार के एक चर को सौंपा जा सकता है।
  • परस्पर और अपरिवर्तनीय setप्रकार
  • एक decimalप्रकार जो दशमलव फ़्लोटिंग पॉइंट चर को लागू करता है
  • एक fixedप्रकार, वह निश्चित बिंदु संख्या लागू करता है

decimal, floatऔर fixedप्रकार साझा करना चाहिए सटीक एक ही सार्वजनिक इंटरफ़ेस (या तो विरासत या बतख टाइपिंग के माध्यम से) की अनुमति उन्हें पारदर्शी रूप से करने के लिए पारित कर दिया और कार्यों से लौटा दी है। मूल प्रकार कहा जा सकता है real

7. मूल्य और संदर्भ से कॉल करें

आपको मान और संदर्भ दोनों के द्वारा फ़ंक्शन को कॉल करने में सक्षम होना चाहिए, डिफ़ॉल्ट होने के साथ मूल्य (यानी, फ़ंक्शन में तर्क की एक प्रति बनाई और संचालित की जाती है)।

8. संकेत

भाषा में संकेत होने चाहिए और सूचक अंकगणित की अनुमति होनी चाहिए। पॉइंटर्स केवल सांख्यिकीय रूप से टाइप किए जा सकते हैं (दुःस्वप्न से बचने के लिए void*)। vartypeसंकेत स्पष्ट रूप से अस्वीकृत हैं। पॉइंटर्स और पॉइंटर अंकगणित होने से भाषा को सिस्टम प्रोग्रामिंग भाषा के रूप में गंभीरता से उपयोग करने की अनुमति मिलती है।

9. इनलाइन विधानसभा

8. के संबंध में , भाषा को उन स्थितियों के लिए असेंबली भाषा कोड को अनुमति देना चाहिए जहां यह आवश्यक है।

10. सुरक्षा

भाषा को अधिकतर उपयोग करने के लिए सुरक्षित होना चाहिए, अपवाद हैंडलिंग आदि का समर्थन करना। सूचक अंकगणित और इनलाइन असेंबली को स्पष्ट रूप से असुरक्षित के रूप में चिह्नित कोड के कुछ हिस्सों में पुनः आरोपित किया जा सकता है। असुरक्षित कोड की अनुमति है, लेकिन दृढ़ता से हतोत्साहित किया जाता है।

11. अपरिभाषित व्यवहार

भाषा मानक को निर्दिष्ट करना चाहिए कि कोड को स्पष्ट रूप से चिह्नित असुरक्षित को छोड़कर सभी परिस्थितियों में कैसे व्यवहार करना है , अर्थात, असुरक्षित ब्लॉकों के बाहर कोई अपरिभाषित व्यवहार नहीं होना चाहिए। यह भाषा को एक व्यवहार्य अनुप्रयोग विकास भाषा के रूप में उपयोग करने की अनुमति देता है, जबकि अभी भी आपको कहने की अनुमति देता है, इसमें एक ओएस लिखें।

यही सब मैं इस समय सोच सकता हूं, लेकिन मैं पोस्ट को संपादित / अपडेट करूंगा क्योंकि मैं अधिक चीजों के बारे में सोचता हूं।


5
: के 'डी प्रोग्रामिंग भाषा "एक नजर डालें digitalmars.com/d
Wizard79

जहां तक ​​मुझे याद है, D में वैकल्पिक डायनेमिक टाइपिंग या एक अंतर्निहित असीमित रेंज पूर्णांक प्रकार नहीं है। पूर्णांक प्रकार बहुत अधिक समस्या नहीं है, लेकिन वैकल्पिक गतिशील टाइपिंग की कमी इसे काफी बदसूरत बना देती है।
चिन्मय कांची

1
मैं वास्तव में decimalयहां एक प्रकार जोड़ूंगा।
विन्यासकर्ता

3
"एक अशक्त या कोई भी प्रकार जिसे किसी भी प्रकार के एक चर को सौंपा जा सकता है।" - बूलियन सहित? :
टिमवी

1
मैं मूल पोस्ट में "लचीला" नहीं देखता। इनलाइन असेंबलर एक प्रोग्रामिंग भाषा के लिए शीर्ष आवश्यकता के रूप में मेरे दिमाग में पॉप नहीं होगा। हो सकता है कि फेलिक्स वॉन लेटनर के अनुसार आजकल असेंबलर लिखना ज्यादातर आपको धीमा गलत परिणाम देता है।
लेनिप्रोग्राममर

7

यह मेरी ड्रीम प्रोग्रामिंग भाषा कैसी होगी:

  • आश्रित टाइपिंग के लिए कुछ समर्थन के साथ एक शक्तिशाली स्थिर प्रकार की प्रणाली।
  • वैकल्पिक गतिशील टाइपिंग।
  • न्यूमेरिक टॉवर एक ला लिस्प लेकिन सांख्यिकीय रूप से टाइप किया गया।
  • मैक्रोस ए ला लिस्प।
  • मुख्य रूप से एक कार्यात्मक प्रोग्रामिंग भाषा अनिवार्य प्रोग्रामिंग (जैसे एमएल परिवार) के लिए बुनियादी समर्थन के साथ।
  • कचरा इकठा करना।
  • प्रकार का अनुमान।
  • निरंतरता।
  • वैकल्पिक आलसी शब्दार्थ।
  • सभी नियंत्रण निर्माण पुस्तकालय कार्यों के रूप में प्रदान किए जाएंगे। (अंतिम दो विशेषताओं का उपयोग करके इसे संभव बनाया जा सकता है।)
  • न्यूनतम सिंटैक्स (लिस्प के रूप में कम नहीं, लेकिन Ioke / Seph की तरह का कुछ।)

बढ़िया है। मैं वास्तव में एक अच्छा तरीका नहीं देखा है सांख्यिकीय रूप से सुरक्षित मैक्रोज़, हालांकि।
जॉर्ग डब्ल्यू मित्तग

@ जोर्ग: नेमेर्ले?
लापता

स्मालटाक में सभी नियंत्रण संरचना वास्तव में विधियां हैं, और यह उनके कार्यान्वयन में निरंतरता का उपयोग नहीं करता है। एक को दूसरे की जरूरत नहीं है।
ओक

@ ओके, क्या आप yieldस्मॉलटाक में पायथन को लागू कर सकते हैं ? उपयोग करने के लिए स्वच्छ होना चाहिए।
लापताफैक्टर

एक उपज-जैसा तंत्र पहले से ही बिना किसी निरंतरता के, लाइब्रेरी विधि के रूप में स्मालटाक में लागू है।
ओक

6

मैंने इसे C # की तरह डिज़ाइन किया होगा, लेकिन Microsoft ने मुझे इसके लिए हराया। :)

(निश्चित रूप से सिवाय इसके कि मेरा कम और अच्छी तरह से अधिक शौकिया रूप से विचार किया गया होगा।)

मैं ज्यादा बुरा नहीं मानता कि यह संकलित है या व्याख्या की गई है, इसलिए मुझे उस बिट को सही ठहराने की जरूरत नहीं है।

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

हालाँकि, मैंने संभवतः C # के रूप में पुराने C सिंटैक्स के रूप में धार्मिक रूप से चिपकाने के बजाय एक नया सिंटैक्स बनाया होगा। स्विच स्टेटमेंट विशेष रूप से भयानक है, और मैं कास्ट सिंटैक्स को भी नापसंद करता हूं (यह गलत तरीका है)। मैं हालांकि सिंटैक्स के विवरण के बारे में एक बड़ा उपद्रव नहीं करता हूं, इसलिए मुझे इसे विस्तार से सही ठहराने की आवश्यकता नहीं है, सिवाय इसके कि मैं इसे विज़ुअल बेसिक के रूप में क्रिया के रूप में नहीं चाहूंगा।

आप मुझे और क्या औचित्य देना चाहेंगे?


+1 अच्छा जवाब! मैं बाद में अपना खुद का एक पोस्ट करूँगा।
चिन्मय कांची

4
सी # एक शक्तिशाली भाषा है, लेकिन वाक्यविन्यास अक्सर गड़बड़ है। मुझे लगता है कि यह इसलिए है क्योंकि इनमें से बहुत सारी सुविधाएँ मूल डिज़ाइन में नहीं थीं।
केसबश

इसलिए "4.0", मुझे लगता है।
मार्क सी

5

अच्छी तरह से यहाँ सुविधाओं की एक सूची है जो मैं इसमें डालूँगा:


सिंटेक्स की तरह लिस्प

लिस्प शैली

पेशेवरों :

  • आसानी से विस्तार योग्य सिंटैक्स। कभी सी में एक फॉरेक्स लूप को लागू करने की कोशिश की गई? यह बिल्कुल आसान नहीं है। (माइंड यू, मैंने किया है )।
  • Homoiconicity। आप बस कर सकते हैं(eval "your data files")

विपक्ष :

  • नेस्टेड पॉलिश नोटेशन को पढ़ना अक्सर मुश्किल होता है

कार्यात्मक प्रोग्रामिंग

हास्केल शैली

पेशेवरों :

  • आसान संगामिति, सभी कोड थ्रेड सुरक्षित है।

विपक्ष :

  • शुद्ध कार्यात्मक कोड में साइड इफेक्ट्स को लागू करना मुश्किल है, हालांकि भिक्षु एक अच्छा काम करते हैं।

मजबूत गतिशील टाइपिंग

अजगर की शैली

पेशेवरों :

  • डायनेमिक टाइपिंग पढ़ने योग्य कोड बनाती है, मजबूत टाइपिंग टाइप त्रुटियों को समाप्त कर सकती है

कार्यान्वयन :

CL के समान, प्रकारों के आधार पर फ़ंक्शन को ओवरलोडिंग की अनुमति दें defgeneric:

(define (+ (a <int>) (b <int>))
  (ints-add a b))

(define (+ (a <string>) (b <string>))
  (string-concat a b))

(define (+ a b)
  (add-generic a b))

संकलित और व्याख्या करने योग्य

पेशेवरों :

  • संकलित करने पर प्रदर्शन में वृद्धि (आमतौर पर सच है, हमेशा नहीं)

विपक्ष :

  • भाषा में सुविधाओं को सीमित कर सकते हैं, हालांकि llvm एक अच्छा बैकअप होगा।

सिस्टम प्रोग्रामिंग

सी शैली

पेशेवरों :

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

विपक्ष :

  • भाषा में अमूर्तता को सीमित करता है, गतिशील टाइपिंग अक्सर उपयुक्त नहीं होती है।

हाइजेनिक मैक्रोज़ (सीएल शैली और योजना शैली)

पेशेवरों :

  • भाषा का विस्तार करना आसान है, विशेष रूप से लिस्फी ™ सिंटैक्स के साथ
  • मैंने यह पहले कहा है, क्या मैंने नहीं किया है?

विपक्ष :

  • कई नहीं अगर लिस्फ़ी ™ सिंटेक्स के साथ किया जाए

यह सोचने के लिए आओ, यह कम या ज्यादा परिभाषित योजना, संकलन और सिस्टम प्रोग्रामिंग बिट को छोड़कर। सी। में उन बिट्स का उपयोग करके और उन बिट्स को लिखकर चारों ओर काम किया जा सकता है।


1
Ioke और Seph पर एक नज़र डालें। यह आश्चर्यजनक है कि S-Expressions की तुलना में सिंटैक्स की सिर्फ एक किशोर राशि जोड़कर एक भाषा कितनी आसानी से पठनीय हो सकती है और अभी भी पूर्ण मैक्रो क्षमताएं हैं। (मूल रूप से, "प्रत्येक फ़ंक्शन कॉल एक सूची है और सूचियाँ प्रथम श्रेणी हैं" के बजाय "यह सब कुछ एक संदेश भेजना है और संदेश श्रृंखलाएँ प्रथम श्रेणी हैं" एक सूची के बजाय जिसका carफ़ंक्शन है और cdrतर्क हैं, आपके पास एक है ऑब्जेक्ट जिसका nameफ़ील्ड विधि है और जिसका argumentsफ़ील्ड तर्क है। और नेस्टिंग के बजाय, आपके पास prevऔर nextपॉइंटर फ़ील्ड हैं।)
Jörg W Mittag

बहुत हद तक क्लोजर जैसा लगता है (यह मानकर कि आप सिस्टम प्रोग्रामिंग भाग - github.com/halgari/mjolnir के लिए LLVM पर देशी कोड सामान्यीकरण के लिए Mjolnir का उपयोग करते हैं )
mikera

3

वहाँ कई भाषाएँ हैं जिन्हें मैं बहुत अच्छा मानता हूँ (C # मेरे वर्तमान पसंदीदा होने के नाते)। चूंकि यह मेरी फंतासी भाषा है, यहाँ मैं जो चाहता हूं वह वास्तव में है:

  • किक-गधा आधिकारिक एपीआई प्रलेखन। Java API इस तरह अच्छा है, और C # /। NET बहुत अच्छा है। रूबी / रेल यहाँ बहुत भयानक है।
  • किक-गधा आधिकारिक सामान्य दस्तावेज (कैसे-कैसे, आम उपयोग, बहुत सारे उदाहरण कोड)। सी # / नेट इसके लिए अच्छा है।
  • ब्लॉग-आधारित डॉक्यूमेंटर्स और स्टैकऑवरफ्लो समस्या का एक विशाल समुदाय मुझे कठिन स्थानों से बाहर निकालने में मदद करता है
  • अच्छी तरह से समर्थित, अच्छी तरह से प्रलेखित और शक्तिशाली प्लगइन्स / लाइब्रेरी / एक्सटेंशन (रूबी / रेल्स की एक विस्तृत श्रृंखला है 'शक्तिशाली' है, लेकिन दोनों में से कोई भी नहीं)।
  • यथोचित रूप से स्थिर है - वार्षिक आधार पर सबसे मौजूदा कोड को तोड़ने के लिए सब कुछ नहीं बदल रहा है (आपको, रूबी / रेल को देखकर)।
  • बहुत स्थिर नहीं है- भाषा डिजाइन में उन्नति के लिए अनुकूल करने में सक्षम है (आप को देख कर, c ++)

2
"किक-गधा प्रलेखन" बिंदुओं में PHP: D
कोरी

3

संकलक संकेत

जब से मैं भाषा डिजाइन के बारे में इतना कुछ नहीं जानता, तो मैं मुझसे बात कर रहा हूं, लेकिन मुझे लगता है कि मैं जिस फीचर के बारे में बात कर रहा हूं उसे अन्य भाषाओं में संकेत कहा जाता हैसंकलक संकेत , शायद?

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

E: मैं उन टिप्पणियों की सराहना करना चाहूँगा जो यह बता रही हैं कि मैं पहले से मौजूद कहाँ हैं।


1
आप कॉमन लिस्प में इसमें से कुछ कर सकते हैं। उदाहरण के लिए, आप संकलक को बता सकते हैं कि मैं एक यथोचित आकार का पूर्णांक है। एक उपयोगी बात यह है कि, safetyऔर speedमूल्यों को अलग करके , आप अक्सर कंपाइलर की जांच कर सकते हैं और लागू कर सकते हैं (समस्याओं को खोजने के लिए) या मान लें कि आप जो कहते हैं वह सच है (और तेज कोड संकलित करें)।
डेविड थॉर्नले

2

नए विचारों को आजमाने के लिए:

मैं एक गतिशील-टाइप की कार्यात्मक प्रोग्रामिंग भाषा बनाऊंगा, यह आपको सभी स्टेटमेंट एक्सप्रेशन ट्रिक्स और सरलतम लैंबडा सिंटैक्स को पैटर्न मिलान के साथ करने की अनुमति देता है। ऑफ-साइड नियम सक्षम।

// a view pattern (or Active Pattern in F#)
default = \def val: !!val.Type val def

// usage of the pattern
greet = \name<(default "world") `and` hasType Str>:
  p "Hello, \{name}!"

(p "Enter your name", .input).greet // (, ) is a sequence expression, returning the last value

यहाँ एक स्पष्टीकरण है:

default =स्टोरेज सेट करता है, \def valदो तर्कों के साथ एक क्यूरेटेड फंक्शन शुरू val.Typeकरता है Type[val], जैसा है , !!बूलियन में कनवर्ट करता है, और बूलियन को लागू किया जा सकता है, इसलिए valऔरdef are after it.

f x= f[x]= x.f .f=f[]

और greet, इसका उपयोग किया name<(default "world")और hasType Str>, इसका मतलब है कि पैटर्न default "world"का उपयोग किया जाएगा और इसके लिए बाध्य होगा name। डिफ़ॉल्ट पैटर्न एक डिफ़ॉल्ट मान निर्दिष्ट करता है। andएक और पैटर्न है जो दो पैटर्न को एक साथ जोड़ता है। defaultजबकि पैटर्न असफल नहीं हो सकता hasTypeअसफल हो सकता है। उस मामले में, यह एक अपवाद फेंकता है।

चर वास्तव में स्टोरेज हैं, जिन्हें कार्यात्मक रूप से पारित किया जा सकता है, और स्टोरेज टेबल को संदर्भ, बनाया और नष्ट किया जा सकता है क्योंकि स्कोप्स बदल जाते हैं।

हश्र और लुआ और जावास्क्रिप्ट में ऐसा होगा।

अगर मैं एक संकलित भाषा बनाने जा रहा हूं, तो मैं Haskell जैसी विशेषताओं के साथ, जावा के लिए एक F # बनाने जा रहा हूं। यह एक शुद्ध कार्यात्मक भाषा है, सिवाय इसके कि इसमें एक विशेषता है जो छद्म कोड जैसे ब्लॉक लिखकर अनिवार्य प्रोग्रामिंग को प्राप्त करने के लिए कोटेशन और कॉम्प एक्सप्र्स को मिलाती है।


1
यह थोड़ा सा लगता है जैसे कि एरलंग, एक गतिशील टाइप की गई कार्यात्मक प्रोग्रामिंग भाषा है और इसमें एक बहुत ही अनोखा समवर्ती भाषा का निर्माण किया गया है।
जोनास

2

यह ध्यान में रखते हुए कि केवल वही भाषाएँ जो मैं जानता हूँ कि PHP और जावास्क्रिप्ट हैं, और यह कि मुझे वास्तव में एक भाषा डिज़ाइन करने से पहले कुछ और सीखना चाहिए:

सिंटेक्स: फ़ंक्शन नामों और तर्क क्रम के बारे में ध्यान से सोचें (यानी, PHP से कम गन्दा हो)।

विशेषताएं:string फ़ंक्शन का एक सेट है , जो बाइट्स की एक श्रृंखला के रूप में चर पर काम करते हैं, लेकिन पाठ को नहीं समझते हैं, और textफ़ंक्शन का एक सेट , जो बहुत सारे एनकोडिंग को समझते हैं और UTF-8 और अन्य मल्टीबाइट स्ट्रिंग्स पर काम कर सकते हैं। (और भाषा में निर्मित संन्यास की जाँच एन्कोडिंग है, एक फ़ंक्शन के साथ text.isValidEncoding(text, encoding)जो आपको बताएगा कि क्या एक बाइट अनुक्रम विकृत है और पाठ के रूप में इलाज करने के लिए असुरक्षित है।

मुझे लगता है कि मुझे मजबूत स्थैतिक टाइपिंग का विचार पसंद है, लेकिन मैंने कभी इसका उपयोग नहीं किया है, इसलिए मैं वास्तव में नहीं कह सकता।


2

प्रोग्रामिंग भाषा डिजाइन करने से पहले, मुझे इस सवाल का एक अच्छा जवाब मिलेगा: हमें अभी तक एक और प्रोग्रामिंग भाषा की आवश्यकता क्यों है? इस लेखन के समय रोसेटा कोड 344 भाषाओं को सूचीबद्ध करता है। यदि उनमें से कोई भी मेरी जरूरतों को पूरा नहीं करता है, तो वे क्यों नहीं की बारीकियों को प्रारंभिक बिंदु (ऐसी भाषाएँ जो सबसे नज़दीकी आती हैं) निर्धारित करेंगे और इसमें क्या जोड़ा जाएगा।

अगर मैंने लॉटरी जीती और किसी कारण से कुछ बेहतर नहीं हुआ, तो मैं लिस्केल के साथ शुरू करूंगा और इसे जीएचसी के सामने के अंत के रूप में एक पूर्ण भाषा बना दूंगा, फिर एफएफआई को आसान (और स्वचालित) बना दूंगा ताकि मैं किसी का उपयोग कर सकूं C / C ++ लाइब्रेरी।


2

एक अच्छी भाषा एक भाषा है जो है:

  • (कोई अस्पष्ट वाक्यविन्यास) के बारे में तर्क करने में आसान
  • आपको न्यूनतम विरूपण के साथ अपने विचारों को व्यक्त करने दें
  • आप से मजाकिया विवरण छिपाएँ (अनुकूलन / संसाधन प्रबंधन)
  • आसानी से समानांतर करने योग्य (कई कोर, वितरित कंप्यूटिंग)

इसे फीचर्स की सूची में बदलना बहुत कठिन है, लेकिन मुझे लगता है कि फंक्शनल प्रोग्रामिंग, प्राकृतिक महसूस नहीं होने के बावजूद , यह जरूरी है कि यह अनिवार्य प्रोग्रामिंग (विशेषकर नॉटी ग्रीटी डिटेल्स को छिपाने के लिए) से अधिक है

  • C-interfacing : C प्रोग्रामिंग लैंग्वेज का लिंगुआ फ्रैंका है और C में विकसित लाइब्रेरी की संख्या अद्भुत है। सी के लिए एक आसान इंटरफ़ेस (जैसे पायथन) होने से, भाषा स्वचालित रूप से उन सभी पुस्तकालयों से लाभान्वित होती है और यह भारी-भरकम कार्यों को भी भेजने की अनुमति देती है, जो धातु की भाषा के करीब पर्याप्त रूप से अनुकूलित नहीं किए जा सकते।
  • वितरित : मुझे हल्के-फुल्के रूटीन के साथ मल्टी-थ्रेडिंग में गो लेना पसंद है, जो रनटाइम थ्रेड्स को उनकी गतिविधि के आधार पर भेजता है। ऐसी भाषा प्रोग्रामर को कार्यों के बारे में तर्क करने और उन्हें एक दूसरे से अलग करने के लिए प्रोत्साहित करती है।
  • कचरा संग्रह : आजकल बिना कहे चला जाता है;)
  • अपरिवर्तनीय : किसी चीज़ के बारे में तर्क करना बहुत आसान है जो कभी भी म्यूट नहीं हो सकता है, मल्टीथ्रेडिंग / वितरित कंप्यूटिंग को लागू करने के लिए बहुत आसान है (आपको केवल जीवनकाल को संभालने के लिए सिंक्रनाइज़ेशन की आवश्यकता है, जो कि संकलक का काम है)
  • लैम्ब्डा : प्रथम श्रेणी के कार्यों के साथ मुझे लगता है
  • संदेश पासिंग : अपरिवर्तनशीलता का अर्थ है कोई म्यूटेक्स, इसलिए हम टोनी होरेस के सुझाव का पालन करते हैं
  • मॉड्यूल : नामस्थान के समान, लेकिन बेहतर एनकैप्सुलेशन के साथ
  • परावर्तन : वितरित संगणना को क्रमबद्धता की आवश्यकता होती है, जिसे संकलक के पास छोड़ दिया जाना चाहिए, और प्रतिक्षेपण के कुछ रूप के साथ deserialization अधिक आसानी से प्राप्त किया जाता है।
  • स्टेटिक स्ट्रॉन्ग टाइपिंग : पहले वाली त्रुटि का पता लगाया जाता है, कम से कम इसकी लागत होती है

फिलहाल, इस सूची के करीब की भाषा संभवतः हास्केल है, हालांकि:

  • इसमें रूटीन की कमी है: मैंने हास्केल में समानता व्यक्त करने का एक स्वाभाविक तरीका अभी तक नहीं देखा है (हालांकि यह मेरी अज्ञानता हो सकती है ...)
  • यह एक अस्पष्ट सिंटैक्स मिला है: किसी तरह यह हास्केल प्रोग्रामर को शब्दों के बजाय अजीब ऑपरेटरों का उपयोग करने पर जोर देता है। यह धीमा लग सकता है, लेकिन यह समझने में बहुत मदद नहीं करता है कि क्या चल रहा है।

2

आपके पहले प्रश्न के लिए, "आप इसे कैसे करेंगे" - संक्षिप्त उत्तर, मैं नहीं करूंगा। मेरे पास पर्याप्त पार्सर / संकलक सिद्धांत नहीं है जो इसे बंद कर सके। लेकिन मैं 25 वर्षों से प्रोग्रामिंग कर रहा हूं, इसलिए मेरे पास साझा करने के लिए कुछ विचार और राय हैं।

सबसे पहले, मैं एक OOP दृष्टिकोण के साथ आने की कोशिश करूँगा जो आपको वास्तव में कनेक्टेड मॉडल बनाने की अनुमति देता है। मेरा मतलब है कि मॉडल लगभग किसी भी तरह की प्रोग्रामिंग परियोजना में सबसे महत्वपूर्ण चीजों में से एक है - यह हमेशा बहुत सारे गलत काम हैं और इसे सही तरीके से प्राप्त करने के लिए निरंतर रिफैक्टिंग करते हैं, और मुझे लगता है कि वास्तविक कनेक्टिविटी की कमी पर OO भाषाएँ।

मुझे प्रदर्शित करने की अनुमति दें। मान लीजिए कि एक क्लास हाउस में एक डोर प्रॉपर्टी है।

var door = house.Door;

अब आपके पास द्वार आवृत्ति के संदर्भ में एक स्थानीय चर है।

लेकिन विचार करें कि अभी क्या हुआ है: आपने अभी-अभी डोर को सदन से बाहर कर दिया है, और अब आप डोर को चारों ओर से गुजरते हुए काफी खुश हैं, और आपके बाकी कोड इस तथ्य से अनभिज्ञ हैं कि यह डोर वास्तव में सदन से जुड़ा हुआ है।

मेरे लिए, यह मौलिक रूप से गलत है।

और हां, मुझे पता है, यह "आसानी से" केस-बाय-केस के आधार पर तय किया गया है - इस मामले में हर डोर से सदन में रिवर्स रेफरेंस बनाए रखने से जो वर्तमान में जुड़ा हुआ है। बेशक यह आपके मॉडल को त्रुटियों के लिए खोलता है, क्योंकि अब यह आपका कर्तव्य है कि आप दो उल्टे संदर्भों को सटीक रूप से बनाए रखें, इसलिए आप House.Doors और Door.House के गुणों को निजी बनाते हैं, और आप House.AddDoor (), House.RemoveDoor () जैसे तरीके जोड़ते हैं ), Door.SetHouse () आदि और इसे सभी तार, और इकाई परीक्षण यह सुनिश्चित करने के लिए कि यह वास्तव में काम करता है।

क्या इस तरह के सीधे-सीधे संबंधों को मॉडल करने के लिए यह बहुत काम की आवाज़ नहीं है? बहुत सारे कोड बनाए रखने के लिए? मॉडल विकसित होते ही रिफ्लेक्टर के लिए बहुत सारे कोड?

समस्या संकेत है। प्रत्येक OO भाषा मैंने देखी है, स्वाभाविक रूप से इस तथ्य से ग्रस्त है कि एक वस्तु-संदर्भ वास्तव में एक सूचक है, क्योंकि यही कंप्यूटर उपयोग करता है।

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

मैं एक ऐसी भाषा देखना चाहता हूं, जहां मूलभूत डेटा-मॉडल एक ग्राफ है - जहां सभी रिश्ते, डिफ़ॉल्ट रूप से, दो छोर हैं। यह निश्चित रूप से वास्तविक दुनिया में मॉडलिंग के लिए बहुत अधिक प्राकृतिक फिट प्रदान करेगा, जो वास्तव में एकमात्र ऐसी चीज है जिसकी हमें पहली जगह के लिए कंप्यूटर की आवश्यकता है। (वह और वीडियो गेम)

मुझे नहीं पता कि इस तरह की भाषा के लिए क्या वाक्यविन्यास दिखाई देगा, या क्या यह पाठ का उपयोग करके भी व्यक्त किया जा सकता है। (मुझे आश्चर्य हुआ कि क्या ऐसी भाषा को चित्रमय होना होगा, किसी तरह ...)

मैं आकस्मिक अवस्था को समाप्त करने के सभी रूपों को भी देखना चाहूंगा।

उदाहरण के लिए, वेब-विकास में, हम डेटाबेस से डेटा को आकार देने में बहुत समय बिताते हैं, प्रस्तुति के लिए दृश्य-मॉडल में ... तब डेटा में से कुछ रूपों पर प्रस्तुत किया जाता है, जो वास्तव में सिर्फ एक और परिवर्तन है। .. और स्थिति फॉर्म-पोस्ट से वापस आती है, और फिर हम उस डेटा को फिर से साझा करते हैं और इसे व्यू-मॉडल पर वापस प्रोजेक्ट करते हैं, जैसे व्यू-मॉडल बाइंडर और ऐसे ... हम फिर बिजनेस से व्यू-मॉडल से प्रोजेक्ट करते हैं- मॉडल ... हम तब डेटा को व्यू-मॉडल से बदलने और इसे रिलेशनल डेटाबेस पर प्रोजेक्ट करने के लिए ऑब्जेक्ट-रिलेशनल मैपर्स (या ग्रंट वर्क) का उपयोग करते हैं ...

क्या यह बेमानी लगने लगा है? इस पागलपन के दौरान किस बिंदु पर हम वास्तव में कुछ भी उपयोगी था? और उपयोगी से मेरा मतलब है, कुछ मूर्त - कुछ-जो अंत-उपयोगकर्ता समझ सकता है और परवाह करता है। दिन के अंत में, आपके द्वारा खर्च किए गए घंटे वास्तव में कुछ ऐसा बना सकते हैं जिसे उपयोगकर्ता समझ भी सकते हैं, वास्तव में केवल घंटे ही अच्छी तरह से खर्च किए जाते हैं। बाकी सब दुष्प्रभाव हैं।

मैं एक अत्यधिक गतिशील भाषा चाहता हूँ। लेखन / संकलन / रन-चक्र समय की थकाऊ बर्बादी है। आदर्श रूप से, भाषा को केवल वही पता लगाना चाहिए जो बदल गया है, और आवश्यकतानुसार पृष्ठभूमि में पारदर्शी रूप से / संकलन / लोड करें।

आदर्श रूप से, आपको "रन" को हिट करने की आवश्यकता नहीं होनी चाहिए - चीजें ऑन-स्क्रीन होनी चाहिए, जैसा कि आप परिवर्तन करते हैं, तुरंत आपके द्वारा किए गए परिवर्तनों को दर्शाते हैं। लिखने / संकलन / चलाने-चक्र के साथ समस्या, या यहाँ तक कि अधिक प्रत्यक्ष लिखने / चलाने-चक्र के लिए, यह है कि आप जो कर रहे हैं उससे बहुत अधिक डिस्कनेक्ट हो गए हैं - हमारे काम से जुड़े महसूस करने के लिए, हम तत्काल प्रतिक्रिया की जरूरत है, तत्काल परिणाम। कोई प्रतीक्षा बहुत लंबी है!

फिर, मुझे यह भी नहीं पता कि क्या यह एक पारंपरिक आईडीई के साथ पूरा किया जा सकता है, या यदि इसके लिए पूरी तरह से नए तरह के इंटरफ़ेस की आवश्यकता होती है।

आपको कमजोर और मजबूत टाइपिंग के मिश्रण का उपयोग करने में सक्षम होना चाहिए, जो भी समस्या उस पर काम करने के लिए सबसे उपयुक्त है।

राज्य सामान्य रूप से कुछ होना चाहिए जो भाषा आपके लिए पूरी तरह से प्रबंधित हो। आपको दृढ़ता के लिए डेटाबेस पर भरोसा करने की आवश्यकता क्यों है? आदर्श रूप में, मैं मॉडल में किसी भी चर के जीवन-काल को निर्दिष्ट करने में सक्षम होना चाहता हूं: एक वेब-अनुरोध, एक सत्र, 24 घंटे, स्थायी रूप से।

हमें अलग-अलग मीडिया और जीवन-शर्तों के लिए संपूर्ण समाधान के बीच चयन क्यों करना है? - प्रत्येक मीडिया को फिट करने के लिए डेटा को बदलने और आकार देने का उल्लेख नहीं करना; ब्राउज़र कैश, डेटाबेस, मेमोरी, डिस्क, कौन परवाह करता है! डेटा डेटा है। जहां आप अपने डेटा को स्टोर करते हैं (और कितने समय तक) एक साधारण विकल्प होना चाहिए, न कि देवताओं के खिलाफ लड़ाई!

बहरहाल, उस के साथ किस्मत अच्छी रहे।


1

यह शायद एक बहु प्रतिमान भाषा होगी, जो निम्नलिखित का समर्थन करेगी:

  • संरचित / प्रक्रियात्मक प्रोग्रामिंग
  • ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
  • कार्यात्मक प्रोग्रामिंग

ये क्यों? ऑब्जेक्ट ओरिएंटेड क्योंकि यह बड़े कार्यक्रमों को व्यवस्थित करने का एक शानदार तरीका है, खासकर डेटा को व्यवस्थित करने के लिए। संरचित क्योंकि आपको हमेशा (ओओपी) जरूरत नहीं है, लोगों की पसंद होनी चाहिए। कार्यात्मक क्योंकि यह प्रोग्रामर के लिए डिबग करना आसान बनाता है और यह प्रोग्राम को अधिक स्पष्ट बनाता है।

मैं कोड ब्लॉक को चिह्नित करने के लिए इंडेंट ब्लॉक वाले पायथन के मॉडल का उपयोग करूंगा। यह बहुत क्लिन है और पढ़ने में अच्छा है।

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

अब, मैं शायद पायथन से गतिशील अवधारणाओं को नहीं ले जाऊंगा: एक बात के लिए, यह संभवतः अन्वेषण और सांख्यिकीय रूप से टाइप किया जाएगा। मुझे लगता है कि इसके साथ कार्यक्रम अधिक स्पष्ट हो जाते हैं। चर शायद विधियों के साथ सभी ऑब्जेक्ट होंगे, फिर आप str.length()स्ट्रिंग की लंबाई प्राप्त करने के लिए कुछ कर सकते हैं । फ़ंक्शन परिभाषाओं में, आपको रिटर्न प्रकार और तर्कों के प्रकार (कुछ प्रकार के सामान्य प्रकारों का समर्थन करना) निर्दिष्ट करना होगा।

चलो पायथन से कॉपी करने के लिए वापस जाएँ ;-)। मुझे लगता है कि यह वैकल्पिक प्रक्रिया के तर्क देने का तरीका है, इसलिए मैं शायद यही करूँगा। अजगर हालांकि ओवरलोडिंग की प्रक्रिया का समर्थन नहीं करता है, मैं चाहता हूं कि।

चलो कक्षाओं को देखते हैं, मैं कई विरासत को खोदूंगा; दुरुपयोग करने के लिए आसान है। मैं निजी और समान स्कोपों ​​को लागू करूंगा और मैं शायद यह लागू करूंगा कि जिस तरह से यह C ++ में किया गया है। मेरे पास अमूर्त वर्ग और इंटरफेस भी होंगे; मुझे विश्वास नहीं होता कि पायथन के पास ऐसा है।

यह आंतरिक वर्गों का समर्थन करेगा, वास्तव में, मैं एक बहुत शक्तिशाली वस्तु उन्मुख भाषा चाहता हूं।

इसकी व्याख्या शायद की जाएगी। अच्छा जेआईटी संकलन का उपयोग करके इसे वास्तव में तेजी से प्राप्त करना संभव है (मैं एक तेज भाषा चाहता हूं, हालांकि प्रोग्रामर उत्पादकता पहले आएगी) और संकलन कई बार उत्पादकता के लिए खराब है। व्याख्या की गई भाषाएँ भी प्लेटफ़ॉर्म इंडिपेंडेंस को बढ़ावा देती हैं, कुछ ऐसा जो हर दिन के लिए ज्यादा मायने रखता है।

इसमें बिल्ड यूनिकोड समर्थन होगा; इन दिनों अंतर्राष्ट्रीयकरण बहुत मायने रखता है।

यह निश्चित रूप से कचरा एकत्र किया जाएगा। लानत है कि मैं खुद स्मृति प्रबंधन कर रहा हूँ; उत्पादकता के लिए भी अच्छा नहीं है।

अंत में, यह एक अच्छा मानक पुस्तकालय होगा।

वाह, बस एहसास हुआ कि मैं वास्तव में पायथन से कितना प्यार करता हूं।


क्यों Interpreted languages also promote platform independance? मुझे लगता है कि संकलक (प्रतिशत) के बजाय अधिक क्रॉस-प्लेटफॉर्म इंटरप्रिटर्स हैं, लेकिन यह पता नहीं लगा सका कि यह वाक्य क्यों सच होना चाहिए? मुझे लगता है कि क्रॉस-प्लेटफॉर्म क्षमताओं के बारे में उनके बीच कोई अंतर नहीं है।
महदी

1

सबसे पहले, मैं संकलक, कुछ मानकों पर कुछ किताबें खरीदूंगा, और भाषाओं और संकलक में एक या दो पाठ्यक्रम ले सकता हूं। मैं PEP को योगदान देता हूं और C ++ मानक समिति की बैठकों में जाता हूं । मैं संकलक के लिए पैच का उपयोग करता हूँ, मैं उम्मीद करता हूँ कि यह फीचर और बग दोनों के लिए है।

फिर मैं वापस जाऊंगा और इस सूची में हॉरर में देखूंगा कि मैं अब आया हूं, जो कि मैं एक भाषा के साथ क्या दिशाओं में जाऊंगा अगर मैंने अभी शुरुआत की है:

  • कार्यात्मक , क्योंकि मैं वर्तमान में किसी भी कार्यात्मक भाषाओं में अच्छी तरह से वाकिफ नहीं हूं और किसी को सीखना एक शानदार तरीका होगा। मामले में यह सीधे पालन नहीं करता है: सब कुछ स्थिर है
  • मैं इसे उतने ही प्रकार के आविष्कार के साथ भरूंगा जितना मैं इसमें फिट कर सकता हूं, लेकिन स्पष्ट रूप से इंटरफेस निर्दिष्ट करने के विकल्प के साथ। अन्य प्रकारों के बारे में निश्चित नहीं है। यह डिफ़ॉल्ट रूप से सभी कार्यों के सामान्य होने तक दोगुना हो जाता है ।
  • जैसा कि आप अनुमान लगा सकते हैं, इंटरफेसेस के साथ ; यह उस प्रकार के साथ है जो केवल उपलब्ध कार्यों पर वादे प्रदान करते हैं।
  • यह कहना कि क्या भाषा दृढ़ता से या कमजोर रूप से टाइप की गई है, इस मामले में बहुत सार्थक नहीं है, जहां तक ​​मैं बता सकता हूं। मैं इसे दृढ़ता से टाइप करूंगा, क्योंकि चीजें कभी नहीं बदलती हैं कि वे क्या इंटरफेस लागू करते हैं
  • कॉन्ट्रैक्ट सपोर्ट के द्वारा इसमें बहुत सारे Design होंगे । फिर से, जितना मैं फिट हो सकता हूं: पूर्व शर्त और पोस्टकंडिशन एक चाहिए; मुझे नहीं पता कि कार्यात्मक प्रोग्रामिंग के बारे में कितना अपरिवर्तनीय है।
  • जब मैं इस पर हूँ, मैं उन भाषाओं पर एक नज़र डालूँगा जहाँ आप औपचारिक रूप से शुद्धता साबित कर सकते हैं और देख सकते हैं कि मैं वहाँ से कुछ भी उठा सकता हूँ।
  • मैं बाहर जाऊंगा और एक भयानक परीक्षण पुस्तकालय लिखूंगा । यहां तक ​​कि अगर मैं इसे भयानक बनाने में विफल रहता हूं, तो मैं कम से कम इस पर काम करने में काफी समय खर्च करूंगा क्योंकि मुझे लगता है कि यह हर भाषा होनी चाहिए।
  • वाक्य रचना के लिए, भाषा में या तो महत्वपूर्ण व्हाट्सएप होगा और पायथन की तरह बहुत कुछ दिखेगा , या यह लोजबन पर आधारित होगा और बहुत सारे व्याकरण और शब्दावली साझा करेगा। पहले मामले में, मैं व्याकरण को यथासंभव एक सीएफजी के करीब बनाने के लिए अपनी पूरी कोशिश करूंगा।
  • मुझे परवाह नहीं होगी कि जिन लोगों ने भाषा को लागू किया है, वे इसे पहले से ही संकलित करेंगे, जेआईटी, इसकी व्याख्या करेंगे, कैंपफायर में इसका जप करेंगे , या कॉलेज के बच्चों को उनके लिए इसे निष्पादित करने के लिए भुगतान करेंगे। मेरा स्वयं का कार्यान्वयन संभवतः एक दुभाषिया या सी संकलक के रूप में शुरू होगा, और अंततः एक JITTER की ओर बढ़ेगा।

यह देखते हुए भी कि ये काफी व्यापक बिंदु हैं शायद मैं भाषा को लागू करना शुरू कर दूंगा, तो मुझे लगता है कि आगे विस्तार में जाना अनावश्यक है।


0

यदि मेरे पास समय होता, तो मैं एक स्थानीय प्रोग्रामिंग भाषा डिजाइन करता, जो कि स्काला पर आधारित होती, इसलिए इसकी अधिकांश विशेषताएं शायद सिवाय XML के होतीं। मेरा लक्ष्य एक ऐसी भाषा बनाना है जो लगभग स्वाभाविक रूप से अंग्रेजी की तुलना में एक अलग संरचना वाली भाषाओं में पढ़ती है, जैसे कि अरबी (मेरी मातृभाषा)। मैं निम्नलिखित विशेषताओं के बारे में सोच रहा हूं:

  • एक पूर्व-प्रोसेसर #langनिर्देश, जिसका उपयोग प्रोग्रामिंग के लिए उपयोग की जाने वाली मानव भाषा के पूर्व-प्रोसेसर को सूचित करने के लिए किया जाता है। उदाहरण के लिए: #lang arइस शब्द का प्रयोग की अनुमति होगी فئةके बजाय class, عرفके बजाय def, और इतने पर। मानव-भाषा-विशिष्ट कीवर्ड को मानक प्रीप्रोसेसर फ़ाइलों में परिभाषित किया जाएगा।
  • प्री-प्रोसेसर कुछ वैकल्पिक कीवर्ड को हटा देगा जिसका एकमात्र उद्देश्य कोड में स्पष्टता जोड़ना है। उदाहरण के लिए, इसे हटाने होगा में "से बना है" class MyClass is composed of {बनने के लिए class MyClass {में "के रूप में", और हटाने def MyMethod(x: Int) as {बनने के लिए def MyMethod(x: Int) {। कुछ (मानव) भाषाओं में, यह कोड को समझने में बहुत आसान बना देगा, खासकर छात्रों के लिए।
  • कंपाइलर संपत्ति के उपयोग के लिए उपसर्ग संकेतन के उपयोग की अनुमति देगा। यह अधिकांश लैटिन-आधारित भाषा बोलने वालों के लिए समझ में नहीं आता है, लेकिन कुछ अन्य भाषाओं के लिए यह बिल्कुल सही समझ में आता है। उदाहरण के लिए, अरबी में संपत्ति की पहुंच सामान्य रूप से उपसर्ग है, जैसा कि प्रोग्रामिंग-अंग्रेजी में اعرض طول اسم محمدसमान है print(length(name(Mohammad)))। (कोष्ठक स्पष्टता के लिए हैं।)

मेरा मानना ​​है कि प्री-प्रोसेसर और कंपाइलर में ये न्यूनतम बदलाव गैर-अंग्रेजी बोलने वालों के लिए प्रोग्रामिंग को बहुत सरल बना देगा।


5
Microsoft (और पहले कुछ अन्य) ने VBA के स्थानीयकृत संस्करण (ऑफिस एप्लिकेशन के लिए विजुअल बेसिक) बनाए। वहाँ गड़बड़ थी। हालांकि, यह नवजात शिशुओं, युवा लोगों और गैर-अंग्रेजी लोगों के लिए अपनी मातृभाषा में कोड पढ़ने के लिए अच्छा है, यह आपके देश के बाहर के लोगों के साथ कोड साझा करना बहुत कठिन बनाता है। हमारे इंटरनेट के दिनों में, अलगाव में काम करना बहुत उत्पादक नहीं है। अगर मुझे स्काला सीखने के लिए केवल फ्रांसीसी स्रोतों (ब्लॉग लेखों, पुस्तकों आदि) पर निर्भर रहना है (जैसा कि मैं वर्तमान में करता हूं), तो मुझे बहुत सारी उपयोगी जानकारी याद आती है। पुस्तकालयों को स्थानीयकृत करने के लिए कठिनाई / कार्य की मात्रा का उल्लेख नहीं ...
फील्हो

1
@PhiLho: आप निश्चित रूप से सही हैं। लेकिन ऐसी भाषा बनाने का मेरा मुख्य उद्देश्य बहुत व्यापक दर्शकों को प्रोग्रामिंग पेश करने में सक्षम होना है, जिसमें के -12 छात्र और बुजुर्ग लोग शामिल हैं जो अंग्रेजी में कुशल नहीं हो सकते हैं। परिचयात्मक स्तर पर, उन्हें शायद बाहरी पुस्तकालयों का उपयोग करने की आवश्यकता नहीं है, और कुछ छोटे लोगों (जैसे print) के लिए स्थानीयकृत रैपर बनाने से नुकसान नहीं होगा।
होसम ऐली

1
दूसरा बिंदु यह है कि बहुत से लोग पहले से ही अपनी मूल भाषाओं को वर्ग और विधि के नाम के लिए उपयोग करते हैं। इससे उन्हें मदद नहीं मिलती है कि कीवर्ड अंग्रेजी में हैं, न ही इससे अन्य लोगों को कोई फर्क पड़ता है, क्योंकि कीवर्ड गैर-अंग्रेजी कोड को समझने के लिए पर्याप्त नहीं हैं। फिर भी, प्री-प्रोसेसर हमेशा कीवर्ड्स को अंग्रेजी में बदल सकता है, और फिर यदि आवश्यक हो तो किसी अन्य भाषा में।
होसम ऐली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.