यदि आप एक प्रोग्रामिंग भाषा डिजाइन करने के लिए थे, तो आप इसे कैसे करेंगे? आप किन विशेषताओं में डालेंगे? आप क्या छोड़ेंगे? सांख्यिकीय या गतिशील रूप से टाइप किया गया? मजबूत या कमजोर टाइप? संकलित या व्याख्या? अपने उत्तरों को सही ठहराएं।
यदि आप एक प्रोग्रामिंग भाषा डिजाइन करने के लिए थे, तो आप इसे कैसे करेंगे? आप किन विशेषताओं में डालेंगे? आप क्या छोड़ेंगे? सांख्यिकीय या गतिशील रूप से टाइप किया गया? मजबूत या कमजोर टाइप? संकलित या व्याख्या? अपने उत्तरों को सही ठहराएं।
जवाबों:
मुझे निश्चित रूप से लगता है कि कार्यात्मक प्रोग्रामिंग भाषाओं पर पकड़ होगी, इसलिए मेरी भाषा कार्यात्मक होगी। कार्यात्मक प्रोग्रामिंग के साथ Taming प्रभाव देखें
मुझे लगता है कि सीपीयू में जल्द ही कोर के हुंड्रेड होंगे, और थ्रेड्स को प्रबंधित करने के लिए एक नरक होगा। तो अभिनेता मॉडल धागे के बजाय एक होना चाहिए। Erlang देखें - एक समवर्ती दुनिया के लिए सॉफ्टवेयर
मुझे यह भी लगता है कि OOP विफल हो गया है, वस्तुओं के बीच संचार को अतुल्यकालिक माना गया था । इसलिए मुझे लगता है कि हमें अपरिवर्तनीय संदेशों के साथ संदेश पारित करने की आवश्यकता है । भेजना और भूल जाना। जैसा कि एक्टर मॉडल में होता है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग देखें : गलत पथ?
मुझे लगता है कि स्थैतिक टाइपिंग करना अच्छा होगा , इसलिए विकास चक्र में त्रुटियों को पहले ही पकड़ लिया जाता है। लेकिन मैं Haskell की तरह टाइप इंट्रेंस का उपयोग करूंगा , ताकि डेवलपर को C, C # और Java जैसे कोड में हर जगह टाइप लिखने की जरूरत न पड़े। ग्रेट गुड के लिए लर्न यू ए हास्केल देखें
WPF और Android में, मैं घोषणात्मक लेआउट के साथ एक महान यूआई लाइब्रेरी भी डिज़ाइन करूंगा । लेकिन मैं इसे फंक्शनल रिएक्टिव प्रोग्रामिंग में करना चाहूंगा ।
तो मेरी भाषा Erlang में संक्षिप्त नाम की तरह होगी लेकिन Haskell में टाइपिंग के साथ और GUF फ्रेमवर्क में WPF.NET की तरह।
नोट: मैंने इस पोस्ट में सुविधाओं का वर्णन करने के लिए सी-जैसे सिंटैक्स का उपयोग किया है, लेकिन मैं सिंटैक्स के बारे में तब तक खुद नहीं चुनूंगा, जब तक कि यह सभी कीवर्ड की तरह हास्यास्पद न हो।
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. अपरिभाषित व्यवहार
भाषा मानक को निर्दिष्ट करना चाहिए कि कोड को स्पष्ट रूप से चिह्नित असुरक्षित को छोड़कर सभी परिस्थितियों में कैसे व्यवहार करना है , अर्थात, असुरक्षित ब्लॉकों के बाहर कोई अपरिभाषित व्यवहार नहीं होना चाहिए। यह भाषा को एक व्यवहार्य अनुप्रयोग विकास भाषा के रूप में उपयोग करने की अनुमति देता है, जबकि अभी भी आपको कहने की अनुमति देता है, इसमें एक ओएस लिखें।
यही सब मैं इस समय सोच सकता हूं, लेकिन मैं पोस्ट को संपादित / अपडेट करूंगा क्योंकि मैं अधिक चीजों के बारे में सोचता हूं।
decimal
यहां एक प्रकार जोड़ूंगा।
यह मेरी ड्रीम प्रोग्रामिंग भाषा कैसी होगी:
yield
स्मॉलटाक में पायथन को लागू कर सकते हैं ? उपयोग करने के लिए स्वच्छ होना चाहिए।
मैंने इसे C # की तरह डिज़ाइन किया होगा, लेकिन Microsoft ने मुझे इसके लिए हराया। :)
(निश्चित रूप से सिवाय इसके कि मेरा कम और अच्छी तरह से अधिक शौकिया रूप से विचार किया गया होगा।)
मैं ज्यादा बुरा नहीं मानता कि यह संकलित है या व्याख्या की गई है, इसलिए मुझे उस बिट को सही ठहराने की जरूरत नहीं है।
जैसा कि मजबूत स्थैतिक टाइपिंग के संबंध में, मुझे यह सराहना करना कठिन लगता है कि इसके लिए औचित्य की आवश्यकता क्यों है। स्टेटिक टाइपिंग एक सुविधा है जो संकलन-समय के दौरान बग को पकड़ती है। डायनामिक टाइपिंग उस सुविधा का अभाव है और बगैर रनटाइम तक बग को ख़राब करता है। मेरे व्यक्तिगत अनुभव में मेरे पास कुछ उपयोग-मामले थे, जहां डायनेमिक प्रेषण ने समझदारी की और उपयोगी था, इसलिए मुझे आसानी से उचित ठहराए जाने के लिए 4.0 से पहले सी # से गुजरना पड़ा। C # 4.0 के साथ मुझे अब इसे सही ठहराने की भी आवश्यकता नहीं है क्योंकि हमारे पास अब गतिशील प्रेषण है।
हालाँकि, मैंने संभवतः C # के रूप में पुराने C सिंटैक्स के रूप में धार्मिक रूप से चिपकाने के बजाय एक नया सिंटैक्स बनाया होगा। स्विच स्टेटमेंट विशेष रूप से भयानक है, और मैं कास्ट सिंटैक्स को भी नापसंद करता हूं (यह गलत तरीका है)। मैं हालांकि सिंटैक्स के विवरण के बारे में एक बड़ा उपद्रव नहीं करता हूं, इसलिए मुझे इसे विस्तार से सही ठहराने की आवश्यकता नहीं है, सिवाय इसके कि मैं इसे विज़ुअल बेसिक के रूप में क्रिया के रूप में नहीं चाहूंगा।
आप मुझे और क्या औचित्य देना चाहेंगे?
अच्छी तरह से यहाँ सुविधाओं की एक सूची है जो मैं इसमें डालूँगा:
लिस्प शैली
पेशेवरों :
(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))
पेशेवरों :
विपक्ष :
सी शैली
पेशेवरों :
विपक्ष :
पेशेवरों :
विपक्ष :
यह सोचने के लिए आओ, यह कम या ज्यादा परिभाषित योजना, संकलन और सिस्टम प्रोग्रामिंग बिट को छोड़कर। सी। में उन बिट्स का उपयोग करके और उन बिट्स को लिखकर चारों ओर काम किया जा सकता है।
car
फ़ंक्शन है और cdr
तर्क हैं, आपके पास एक है ऑब्जेक्ट जिसका name
फ़ील्ड विधि है और जिसका arguments
फ़ील्ड तर्क है। और नेस्टिंग के बजाय, आपके पास prev
और next
पॉइंटर फ़ील्ड हैं।)
वहाँ कई भाषाएँ हैं जिन्हें मैं बहुत अच्छा मानता हूँ (C # मेरे वर्तमान पसंदीदा होने के नाते)। चूंकि यह मेरी फंतासी भाषा है, यहाँ मैं जो चाहता हूं वह वास्तव में है:
जब से मैं भाषा डिजाइन के बारे में इतना कुछ नहीं जानता, तो मैं मुझसे बात कर रहा हूं, लेकिन मुझे लगता है कि मैं जिस फीचर के बारे में बात कर रहा हूं उसे अन्य भाषाओं में संकेत कहा जाता है । संकलक संकेत , शायद?
मुझे नहीं पता कि मैं इसे एक पर्ल 6 ड्राफ्ट में पढ़ता हूं या उस समय सिर्फ उच्च था, लेकिन मैं एक ऐसी भाषा की कल्पना करता हूं जहां डिफ़ॉल्ट रूप से सब कुछ शिथिल नासमझ और स्वचालित है। लेकिन अगर आप वास्तव में प्रदर्शन को क्रैंक करना चाहते हैं और कहते हैं, हे, यह मान हमेशा एक पूर्णांक होता है या यह कभी भी अशक्त नहीं होता है, या यह समानांतर हो सकता है, या यह स्टेटलेस है, इस तरह की चीजें ... कि कंपाइलर स्वचालित रूप से शहर जा सकता है इन विशेष रूप से चिह्नित क्षेत्रों पर।
E: मैं उन टिप्पणियों की सराहना करना चाहूँगा जो यह बता रही हैं कि मैं पहले से मौजूद कहाँ हैं।
safety
और speed
मूल्यों को अलग करके , आप अक्सर कंपाइलर की जांच कर सकते हैं और लागू कर सकते हैं (समस्याओं को खोजने के लिए) या मान लें कि आप जो कहते हैं वह सच है (और तेज कोड संकलित करें)।
नए विचारों को आजमाने के लिए:
मैं एक गतिशील-टाइप की कार्यात्मक प्रोग्रामिंग भाषा बनाऊंगा, यह आपको सभी स्टेटमेंट एक्सप्रेशन ट्रिक्स और सरलतम लैंबडा सिंटैक्स को पैटर्न मिलान के साथ करने की अनुमति देता है। ऑफ-साइड नियम सक्षम।
// 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 # बनाने जा रहा हूं। यह एक शुद्ध कार्यात्मक भाषा है, सिवाय इसके कि इसमें एक विशेषता है जो छद्म कोड जैसे ब्लॉक लिखकर अनिवार्य प्रोग्रामिंग को प्राप्त करने के लिए कोटेशन और कॉम्प एक्सप्र्स को मिलाती है।
यह ध्यान में रखते हुए कि केवल वही भाषाएँ जो मैं जानता हूँ कि PHP और जावास्क्रिप्ट हैं, और यह कि मुझे वास्तव में एक भाषा डिज़ाइन करने से पहले कुछ और सीखना चाहिए:
सिंटेक्स: फ़ंक्शन नामों और तर्क क्रम के बारे में ध्यान से सोचें (यानी, PHP से कम गन्दा हो)।
विशेषताएं:string
फ़ंक्शन
का एक सेट है , जो बाइट्स की एक श्रृंखला के रूप में चर पर काम करते हैं, लेकिन पाठ को नहीं समझते हैं, और text
फ़ंक्शन का एक सेट , जो बहुत सारे एनकोडिंग को समझते हैं और UTF-8 और अन्य मल्टीबाइट स्ट्रिंग्स पर काम कर सकते हैं। (और भाषा में निर्मित संन्यास की जाँच एन्कोडिंग है, एक फ़ंक्शन के साथ text.isValidEncoding(text, encoding)
जो आपको बताएगा कि क्या एक बाइट अनुक्रम विकृत है और पाठ के रूप में इलाज करने के लिए असुरक्षित है।
मुझे लगता है कि मुझे मजबूत स्थैतिक टाइपिंग का विचार पसंद है, लेकिन मैंने कभी इसका उपयोग नहीं किया है, इसलिए मैं वास्तव में नहीं कह सकता।
प्रोग्रामिंग भाषा डिजाइन करने से पहले, मुझे इस सवाल का एक अच्छा जवाब मिलेगा: हमें अभी तक एक और प्रोग्रामिंग भाषा की आवश्यकता क्यों है? इस लेखन के समय रोसेटा कोड 344 भाषाओं को सूचीबद्ध करता है। यदि उनमें से कोई भी मेरी जरूरतों को पूरा नहीं करता है, तो वे क्यों नहीं की बारीकियों को प्रारंभिक बिंदु (ऐसी भाषाएँ जो सबसे नज़दीकी आती हैं) निर्धारित करेंगे और इसमें क्या जोड़ा जाएगा।
अगर मैंने लॉटरी जीती और किसी कारण से कुछ बेहतर नहीं हुआ, तो मैं लिस्केल के साथ शुरू करूंगा और इसे जीएचसी के सामने के अंत के रूप में एक पूर्ण भाषा बना दूंगा, फिर एफएफआई को आसान (और स्वचालित) बना दूंगा ताकि मैं किसी का उपयोग कर सकूं C / C ++ लाइब्रेरी।
एक अच्छी भाषा एक भाषा है जो है:
इसे फीचर्स की सूची में बदलना बहुत कठिन है, लेकिन मुझे लगता है कि फंक्शनल प्रोग्रामिंग, प्राकृतिक महसूस नहीं होने के बावजूद , यह जरूरी है कि यह अनिवार्य प्रोग्रामिंग (विशेषकर नॉटी ग्रीटी डिटेल्स को छिपाने के लिए) से अधिक है
फिलहाल, इस सूची के करीब की भाषा संभवतः हास्केल है, हालांकि:
आपके पहले प्रश्न के लिए, "आप इसे कैसे करेंगे" - संक्षिप्त उत्तर, मैं नहीं करूंगा। मेरे पास पर्याप्त पार्सर / संकलक सिद्धांत नहीं है जो इसे बंद कर सके। लेकिन मैं 25 वर्षों से प्रोग्रामिंग कर रहा हूं, इसलिए मेरे पास साझा करने के लिए कुछ विचार और राय हैं।
सबसे पहले, मैं एक OOP दृष्टिकोण के साथ आने की कोशिश करूँगा जो आपको वास्तव में कनेक्टेड मॉडल बनाने की अनुमति देता है। मेरा मतलब है कि मॉडल लगभग किसी भी तरह की प्रोग्रामिंग परियोजना में सबसे महत्वपूर्ण चीजों में से एक है - यह हमेशा बहुत सारे गलत काम हैं और इसे सही तरीके से प्राप्त करने के लिए निरंतर रिफैक्टिंग करते हैं, और मुझे लगता है कि वास्तविक कनेक्टिविटी की कमी पर OO भाषाएँ।
मुझे प्रदर्शित करने की अनुमति दें। मान लीजिए कि एक क्लास हाउस में एक डोर प्रॉपर्टी है।
var door = house.Door;
अब आपके पास द्वार आवृत्ति के संदर्भ में एक स्थानीय चर है।
लेकिन विचार करें कि अभी क्या हुआ है: आपने अभी-अभी डोर को सदन से बाहर कर दिया है, और अब आप डोर को चारों ओर से गुजरते हुए काफी खुश हैं, और आपके बाकी कोड इस तथ्य से अनभिज्ञ हैं कि यह डोर वास्तव में सदन से जुड़ा हुआ है।
मेरे लिए, यह मौलिक रूप से गलत है।
और हां, मुझे पता है, यह "आसानी से" केस-बाय-केस के आधार पर तय किया गया है - इस मामले में हर डोर से सदन में रिवर्स रेफरेंस बनाए रखने से जो वर्तमान में जुड़ा हुआ है। बेशक यह आपके मॉडल को त्रुटियों के लिए खोलता है, क्योंकि अब यह आपका कर्तव्य है कि आप दो उल्टे संदर्भों को सटीक रूप से बनाए रखें, इसलिए आप House.Doors और Door.House के गुणों को निजी बनाते हैं, और आप House.AddDoor (), House.RemoveDoor () जैसे तरीके जोड़ते हैं ), Door.SetHouse () आदि और इसे सभी तार, और इकाई परीक्षण यह सुनिश्चित करने के लिए कि यह वास्तव में काम करता है।
क्या इस तरह के सीधे-सीधे संबंधों को मॉडल करने के लिए यह बहुत काम की आवाज़ नहीं है? बहुत सारे कोड बनाए रखने के लिए? मॉडल विकसित होते ही रिफ्लेक्टर के लिए बहुत सारे कोड?
समस्या संकेत है। प्रत्येक OO भाषा मैंने देखी है, स्वाभाविक रूप से इस तथ्य से ग्रस्त है कि एक वस्तु-संदर्भ वास्तव में एक सूचक है, क्योंकि यही कंप्यूटर उपयोग करता है।
पॉइंटर्स वास्तविक दुनिया को मॉडल करने का एक अच्छा तरीका नहीं हैं। भले ही आप किस दुनिया में मॉडल बनाने की कोशिश कर रहे हों, यह लगभग इस बात की गारंटी है कि उस दुनिया में कोई भी रिश्ता दो-तरफ़ा रिश्ते वाला होगा। संकेत केवल एक दिशा में इंगित करते हैं।
मैं एक ऐसी भाषा देखना चाहता हूं, जहां मूलभूत डेटा-मॉडल एक ग्राफ है - जहां सभी रिश्ते, डिफ़ॉल्ट रूप से, दो छोर हैं। यह निश्चित रूप से वास्तविक दुनिया में मॉडलिंग के लिए बहुत अधिक प्राकृतिक फिट प्रदान करेगा, जो वास्तव में एकमात्र ऐसी चीज है जिसकी हमें पहली जगह के लिए कंप्यूटर की आवश्यकता है। (वह और वीडियो गेम)
मुझे नहीं पता कि इस तरह की भाषा के लिए क्या वाक्यविन्यास दिखाई देगा, या क्या यह पाठ का उपयोग करके भी व्यक्त किया जा सकता है। (मुझे आश्चर्य हुआ कि क्या ऐसी भाषा को चित्रमय होना होगा, किसी तरह ...)
मैं आकस्मिक अवस्था को समाप्त करने के सभी रूपों को भी देखना चाहूंगा।
उदाहरण के लिए, वेब-विकास में, हम डेटाबेस से डेटा को आकार देने में बहुत समय बिताते हैं, प्रस्तुति के लिए दृश्य-मॉडल में ... तब डेटा में से कुछ रूपों पर प्रस्तुत किया जाता है, जो वास्तव में सिर्फ एक और परिवर्तन है। .. और स्थिति फॉर्म-पोस्ट से वापस आती है, और फिर हम उस डेटा को फिर से साझा करते हैं और इसे व्यू-मॉडल पर वापस प्रोजेक्ट करते हैं, जैसे व्यू-मॉडल बाइंडर और ऐसे ... हम फिर बिजनेस से व्यू-मॉडल से प्रोजेक्ट करते हैं- मॉडल ... हम तब डेटा को व्यू-मॉडल से बदलने और इसे रिलेशनल डेटाबेस पर प्रोजेक्ट करने के लिए ऑब्जेक्ट-रिलेशनल मैपर्स (या ग्रंट वर्क) का उपयोग करते हैं ...
क्या यह बेमानी लगने लगा है? इस पागलपन के दौरान किस बिंदु पर हम वास्तव में कुछ भी उपयोगी था? और उपयोगी से मेरा मतलब है, कुछ मूर्त - कुछ-जो अंत-उपयोगकर्ता समझ सकता है और परवाह करता है। दिन के अंत में, आपके द्वारा खर्च किए गए घंटे वास्तव में कुछ ऐसा बना सकते हैं जिसे उपयोगकर्ता समझ भी सकते हैं, वास्तव में केवल घंटे ही अच्छी तरह से खर्च किए जाते हैं। बाकी सब दुष्प्रभाव हैं।
मैं एक अत्यधिक गतिशील भाषा चाहता हूँ। लेखन / संकलन / रन-चक्र समय की थकाऊ बर्बादी है। आदर्श रूप से, भाषा को केवल वही पता लगाना चाहिए जो बदल गया है, और आवश्यकतानुसार पृष्ठभूमि में पारदर्शी रूप से / संकलन / लोड करें।
आदर्श रूप से, आपको "रन" को हिट करने की आवश्यकता नहीं होनी चाहिए - चीजें ऑन-स्क्रीन होनी चाहिए, जैसा कि आप परिवर्तन करते हैं, तुरंत आपके द्वारा किए गए परिवर्तनों को दर्शाते हैं। लिखने / संकलन / चलाने-चक्र के साथ समस्या, या यहाँ तक कि अधिक प्रत्यक्ष लिखने / चलाने-चक्र के लिए, यह है कि आप जो कर रहे हैं उससे बहुत अधिक डिस्कनेक्ट हो गए हैं - हमारे काम से जुड़े महसूस करने के लिए, हम तत्काल प्रतिक्रिया की जरूरत है, तत्काल परिणाम। कोई प्रतीक्षा बहुत लंबी है!
फिर, मुझे यह भी नहीं पता कि क्या यह एक पारंपरिक आईडीई के साथ पूरा किया जा सकता है, या यदि इसके लिए पूरी तरह से नए तरह के इंटरफ़ेस की आवश्यकता होती है।
आपको कमजोर और मजबूत टाइपिंग के मिश्रण का उपयोग करने में सक्षम होना चाहिए, जो भी समस्या उस पर काम करने के लिए सबसे उपयुक्त है।
राज्य सामान्य रूप से कुछ होना चाहिए जो भाषा आपके लिए पूरी तरह से प्रबंधित हो। आपको दृढ़ता के लिए डेटाबेस पर भरोसा करने की आवश्यकता क्यों है? आदर्श रूप में, मैं मॉडल में किसी भी चर के जीवन-काल को निर्दिष्ट करने में सक्षम होना चाहता हूं: एक वेब-अनुरोध, एक सत्र, 24 घंटे, स्थायी रूप से।
हमें अलग-अलग मीडिया और जीवन-शर्तों के लिए संपूर्ण समाधान के बीच चयन क्यों करना है? - प्रत्येक मीडिया को फिट करने के लिए डेटा को बदलने और आकार देने का उल्लेख नहीं करना; ब्राउज़र कैश, डेटाबेस, मेमोरी, डिस्क, कौन परवाह करता है! डेटा डेटा है। जहां आप अपने डेटा को स्टोर करते हैं (और कितने समय तक) एक साधारण विकल्प होना चाहिए, न कि देवताओं के खिलाफ लड़ाई!
बहरहाल, उस के साथ किस्मत अच्छी रहे।
यह शायद एक बहु प्रतिमान भाषा होगी, जो निम्नलिखित का समर्थन करेगी:
ये क्यों? ऑब्जेक्ट ओरिएंटेड क्योंकि यह बड़े कार्यक्रमों को व्यवस्थित करने का एक शानदार तरीका है, खासकर डेटा को व्यवस्थित करने के लिए। संरचित क्योंकि आपको हमेशा (ओओपी) जरूरत नहीं है, लोगों की पसंद होनी चाहिए। कार्यात्मक क्योंकि यह प्रोग्रामर के लिए डिबग करना आसान बनाता है और यह प्रोग्राम को अधिक स्पष्ट बनाता है।
मैं कोड ब्लॉक को चिह्नित करने के लिए इंडेंट ब्लॉक वाले पायथन के मॉडल का उपयोग करूंगा। यह बहुत क्लिन है और पढ़ने में अच्छा है।
मैं वास्तव में पायथन से बहुत सारे विचार चुरा लूंगा क्योंकि पायथन एक बहुत अच्छी भाषा है। मैं इसे बयान के लिए ले जाऊंगा और मैं इसके नक्शे, सूची और टुपल्स की नकल करूंगा।
अब, मैं शायद पायथन से गतिशील अवधारणाओं को नहीं ले जाऊंगा: एक बात के लिए, यह संभवतः अन्वेषण और सांख्यिकीय रूप से टाइप किया जाएगा। मुझे लगता है कि इसके साथ कार्यक्रम अधिक स्पष्ट हो जाते हैं। चर शायद विधियों के साथ सभी ऑब्जेक्ट होंगे, फिर आप str.length()
स्ट्रिंग की लंबाई प्राप्त करने के लिए कुछ कर सकते हैं । फ़ंक्शन परिभाषाओं में, आपको रिटर्न प्रकार और तर्कों के प्रकार (कुछ प्रकार के सामान्य प्रकारों का समर्थन करना) निर्दिष्ट करना होगा।
चलो पायथन से कॉपी करने के लिए वापस जाएँ ;-)। मुझे लगता है कि यह वैकल्पिक प्रक्रिया के तर्क देने का तरीका है, इसलिए मैं शायद यही करूँगा। अजगर हालांकि ओवरलोडिंग की प्रक्रिया का समर्थन नहीं करता है, मैं चाहता हूं कि।
चलो कक्षाओं को देखते हैं, मैं कई विरासत को खोदूंगा; दुरुपयोग करने के लिए आसान है। मैं निजी और समान स्कोपों को लागू करूंगा और मैं शायद यह लागू करूंगा कि जिस तरह से यह C ++ में किया गया है। मेरे पास अमूर्त वर्ग और इंटरफेस भी होंगे; मुझे विश्वास नहीं होता कि पायथन के पास ऐसा है।
यह आंतरिक वर्गों का समर्थन करेगा, वास्तव में, मैं एक बहुत शक्तिशाली वस्तु उन्मुख भाषा चाहता हूं।
इसकी व्याख्या शायद की जाएगी। अच्छा जेआईटी संकलन का उपयोग करके इसे वास्तव में तेजी से प्राप्त करना संभव है (मैं एक तेज भाषा चाहता हूं, हालांकि प्रोग्रामर उत्पादकता पहले आएगी) और संकलन कई बार उत्पादकता के लिए खराब है। व्याख्या की गई भाषाएँ भी प्लेटफ़ॉर्म इंडिपेंडेंस को बढ़ावा देती हैं, कुछ ऐसा जो हर दिन के लिए ज्यादा मायने रखता है।
इसमें बिल्ड यूनिकोड समर्थन होगा; इन दिनों अंतर्राष्ट्रीयकरण बहुत मायने रखता है।
यह निश्चित रूप से कचरा एकत्र किया जाएगा। लानत है कि मैं खुद स्मृति प्रबंधन कर रहा हूँ; उत्पादकता के लिए भी अच्छा नहीं है।
अंत में, यह एक अच्छा मानक पुस्तकालय होगा।
वाह, बस एहसास हुआ कि मैं वास्तव में पायथन से कितना प्यार करता हूं।
Interpreted languages also promote platform independance
? मुझे लगता है कि संकलक (प्रतिशत) के बजाय अधिक क्रॉस-प्लेटफॉर्म इंटरप्रिटर्स हैं, लेकिन यह पता नहीं लगा सका कि यह वाक्य क्यों सच होना चाहिए? मुझे लगता है कि क्रॉस-प्लेटफॉर्म क्षमताओं के बारे में उनके बीच कोई अंतर नहीं है।
सबसे पहले, मैं संकलक, कुछ मानकों पर कुछ किताबें खरीदूंगा, और भाषाओं और संकलक में एक या दो पाठ्यक्रम ले सकता हूं। मैं PEP को योगदान देता हूं और C ++ मानक समिति की बैठकों में जाता हूं । मैं संकलक के लिए पैच का उपयोग करता हूँ, मैं उम्मीद करता हूँ कि यह फीचर और बग दोनों के लिए है।
फिर मैं वापस जाऊंगा और इस सूची में हॉरर में देखूंगा कि मैं अब आया हूं, जो कि मैं एक भाषा के साथ क्या दिशाओं में जाऊंगा अगर मैंने अभी शुरुआत की है:
यह देखते हुए भी कि ये काफी व्यापक बिंदु हैं शायद मैं भाषा को लागू करना शुरू कर दूंगा, तो मुझे लगता है कि आगे विस्तार में जाना अनावश्यक है।
यदि मेरे पास समय होता, तो मैं एक स्थानीय प्रोग्रामिंग भाषा डिजाइन करता, जो कि स्काला पर आधारित होती, इसलिए इसकी अधिकांश विशेषताएं शायद सिवाय 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)))
। (कोष्ठक स्पष्टता के लिए हैं।)मेरा मानना है कि प्री-प्रोसेसर और कंपाइलर में ये न्यूनतम बदलाव गैर-अंग्रेजी बोलने वालों के लिए प्रोग्रामिंग को बहुत सरल बना देगा।
print
) के लिए स्थानीयकृत रैपर बनाने से नुकसान नहीं होगा।