डायलन (प्रोग्रामिंग भाषा)

डायलन एक बहु-प्रतिमान योजना ([[प्रोग्रामिंग भाषा)]] जिसमें कार्यात्मक प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी) के लिए समर्थन शामिल है, और गतिशील प्रोग्रामिंग भाषा और प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) है, जबकि कुशल मशीन कोड उत्पन्न करने के लिए डिज़ाइन किया गया एक प्रोग्रामिंग मॉडल प्रदान करता है, जिसमें ठीक- गतिशील और स्थिर व्यवहारों पर सूक्ष्म नियंत्रण। इसे 1990 के दशक की शुरुआत में Apple Computer के नेतृत्व वाले एक समूह द्वारा बनाया गया था।

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

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

डायलन ने अपने शब्दार्थ को स्कीम और अन्य लिस्प्स से प्राप्त किया है; कुछ डायलन कार्यान्वयन शुरू में मौजूदा लिस्प सिस्टम के भीतर बनाए गए थे। हालाँकि, डायलन में लिस्प-जैसे उपसर्ग सिंटैक्स के बजाय ALGOL जैसा सिंटैक्स है।

इतिहास
Dylan को 1990 के दशक की शुरुआत में Apple Computer के नेतृत्व वाले एक समूह द्वारा बनाया गया था। इसके विकास के एक समय में, इसे Apple न्यूटन कंप्यूटर के साथ उपयोग करने का इरादा था, लेकिन डायलन कार्यान्वयन समय पर पर्याप्त परिपक्वता तक नहीं पहुंचा, और न्यूटन ने इसके बजाय वाल्टर स्मिथ द्वारा विकसित सी और न्यूटनस्क्रिप्ट के मिश्रण का उपयोग किया। Apple ने 1995 में अपने डायलन विकास प्रयास को समाप्त कर दिया, हालांकि उन्होंने एक प्रौद्योगिकी रिलीज़ संस्करण उपलब्ध कराया (Apple Dylan TR1) जिसमें एक उन्नत एकीकृत विकास वातावरण (IDE) शामिल था।

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

डायलन भाषा का कोड-नाम राल्फ था। जेम्स जोआक्विन ने डायनामिक लैंग्वेज के लिए डायलन नाम चुना।

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

शाब्दिक वाक्य रचना
डायलन मामले की संवेदनशीलता नहीं है। डायलन का शाब्दिक वाक्य-विन्यास एक नामकरण सम्मेलन के उपयोग की अनुमति देता है जहां हाइफन-ऋण | हाइफ़न (माइनस) संकेतों का उपयोग बहु-शब्द पहचानकर्ताओं (कभी-कभी तुतलाना मामला या कबाब का मामला कहा जाता है) के हिस्सों को जोड़ने के लिए किया जाता है। लिस्प भाषाओं में यह सम्मेलन आम है।

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

उदाहरण कोड
कई स्लॉट के साथ एक साधारण वर्ग:

<वाक्यविन्यास प्रकाश लैंग = डायलन> परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>) स्लॉट पॉइंट-एक्स :: <पूर्णांक>, आवश्यक-init-कीवर्ड: x:; स्लॉट पॉइंट-वाई :: <पूर्णांक>, आवश्यक-init-कीवर्ड: y:; अंत वर्ग <बिंदु>; 

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

में  दोनों   और   वैकल्पिक हैं। यह सभी के लिए सच है   खंड। उदाहरण के लिए, आप लिख सकते हैं   या केवल   एक समाप्त करने के लिए   कथन।

का उदहारण बनाना है :

<वाक्यविन्यास प्रकाश लैंग = डायलन> बनाओ (<बिंदु>, एक्स: 100, वाई: 200) 

एक ही वर्ग, सबसे कम संभव तरीके से फिर से लिखा गया:

<वाक्यविन्यास प्रकाश लैंग = डायलन> परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>) स्लॉट पॉइंट-एक्स; स्लॉट पॉइंट-वाई; अंत; 

स्लॉट अब दोनों टाइप किए गए हैं. स्लॉट को मैन्युअल रूप से प्रारंभ किया जाना चाहिए:

<वाक्यविन्यास प्रकाश लैंग = डायलन> चलो पी = बनाओ (<बिंदु>); बिंदु-एक्स(पी) := 100; // या p.point-x := 100; बिंदु-वाई (पी) := 200; // या p.point-y := 200; 

परंपरा के अनुसार, निरंतर नाम $ से शुरू होते हैं:

<वाक्यविन्यास प्रकाश लैंग = डायलन> निरंतर $ पीआई परिभाषित करें :: <डबल-फ्लोट> = 3.1415927d0; 

एक फैक्टोरियल फ़ंक्शन: <वाक्यविन्यास प्रकाश लैंग = डायलन> फ़ंक्शन फ़ैक्टोरियल परिभाषित करें (n :: <पूर्णांक>) => (n! :: <पूर्णांक>) मामला n त्रुटि (नकारात्मक पूर्णांक का भाज्य नहीं ले सकता: %d\n, n); एन = 0 => 1; अन्यथा => n * भाज्य (n - 1); अंत अंत; 

यहाँ,  और   सामान्य पहचानकर्ता हैं।

कोई स्पष्ट वापसी कथन नहीं है। एक विधि या कार्य का परिणाम अंतिम अभिव्यक्ति का मूल्यांकन है। वापसी की स्थिति में एक अभिव्यक्ति के बाद अर्धविराम को छोड़ना एक सामान्य शैली है।

मॉड्यूल बनाम नामस्थान
कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, क्लास इनकैप्सुलेशन और मॉड्युलैरिटी का मुख्य साधन हैं; प्रत्येक वर्ग एक नामस्थान को परिभाषित करता है और नियंत्रित करता है कि कौन सी परिभाषाएँ बाहरी रूप से दिखाई देती हैं। इसके अलावा, कई भाषाओं में कक्षाएं एक अविभाज्य इकाई को परिभाषित करती हैं जिसका उपयोग समग्र रूप से किया जाना चाहिए। उदाहरण के लिए, ए का उपयोग करना  संयोजन समारोह में सभी के विरुद्ध आयात और संकलन की आवश्यकता होती है.

डायलन समेत कुछ भाषाओं में एक अलग, स्पष्ट नामस्थान या मॉड्यूल सिस्टम भी शामिल है जो अधिक सामान्य तरीके से encapsulation करता है।

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

उदाहरण के लिए, regex समर्थन के लिए ऐड-ऑन लाइब्रेरी पर विचार करें. कुछ भाषाओं में, कार्यक्षमता को स्ट्रिंग्स में शामिल करने के लिए, कार्यक्षमता को इसमें जोड़ा जाना चाहिए  नाम स्थान। ऐसा होते ही, द   वर्ग बड़ा हो जाता है, और जिन कार्यों को रेगेक्स का उपयोग करने की आवश्यकता नहीं होती है, उन्हें अभी भी बढ़े हुए पुस्तकालय आकार में इसके लिए भुगतान करना होगा। इस कारण से, इस प्रकार के ऐड-ऑन आमतौर पर उनके अपने नामस्थान और ऑब्जेक्ट में रखे जाते हैं। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि नए कार्य अब इसका हिस्सा नहीं हैं  ; इसके बजाय, यह अपने स्वयं के कार्यों के सेट में अलग-थलग है जिसे अलग से बुलाया जाना चाहिए। के बजाय , जो OO के दृष्टिकोण से प्राकृतिक संगठन होगा, कुछ इस तरह   का उपयोग किया जाता है, जो ऑर्डरिंग को प्रभावी ढंग से उलट देता है।

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

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

कक्षाएं
डायलन में कक्षाएं वर्णन करती हैं  अधिकांश OO भाषाओं के समान एक फैशन में वस्तुओं के (डेटा सदस्य, फ़ील्ड, ivars, आदि)। स्मालटाक की तरह, स्लॉट तक सभी पहुंच विधियों के माध्यम से है। स्लॉट नामों के आधार पर डिफ़ॉल्ट गेट्टर और सेटर विधियाँ स्वचालित रूप से उत्पन्न होती हैं। अधिकांश अन्य ओओ भाषाओं के विपरीत, कक्षा के लिए लागू अन्य विधियों को अक्सर कक्षा के बाहर परिभाषित किया जाता है, और इस प्रकार डायलन में कक्षा परिभाषाओं में आमतौर पर केवल भंडारण की परिभाषा शामिल होती है। उदाहरण के लिए:

<वाक्यविन्यास लैंग = डायलन> वर्ग परिभाषित करें <खिड़की> (<दृश्य>) स्लॉट शीर्षक :: <स्ट्रिंग> = शीर्षक रहित, init-कीवर्ड: शीर्षक:; स्लॉट स्थिति :: <बिंदु>, आवश्यक-इनिट-कीवर्ड: स्थिति :; अंत वर्ग; 

इस उदाहरण में, वर्ग परिभाषित किया गया। <वर्ग का नाम> सिंटैक्स केवल सम्मेलन है, वर्ग के नाम को अलग करने के लिए - कोण कोष्ठक केवल वर्ग के नाम का हिस्सा हैं। इसके विपरीत, कुछ भाषाओं में परिपाटी वर्ग के नाम के पहले अक्षर को कैपिटलाइज़ करने या नाम के आगे C या T (उदाहरण के लिए) लगाने की है।  एक ही वर्ग से विरासत में मिला है, , और इसमें दो स्लॉट हैं,   विंडो शीर्षक के लिए एक स्ट्रिंग पकड़ना, और   खिड़की के एक कोने के लिए एक XY बिंदु धारण करना। इस उदाहरण में, शीर्षक को डिफ़ॉल्ट मान दिया गया है, जबकि स्थिति को नहीं दिया गया है। वैकल्पिक init-कीवर्ड सिंटैक्स प्रोग्रामर को क्लास के किसी ऑब्जेक्ट को इंस्टेंट करते समय स्लॉट के प्रारंभिक मान को निर्दिष्ट करने की अनुमति देता है।

C++ या Java जैसी भाषाओं में, वर्ग अपने इंटरफ़ेस को भी परिभाषित करेगा। इस मामले में उपरोक्त परिभाषा में कोई स्पष्ट निर्देश नहीं है, इसलिए दोनों भाषाओं में स्लॉट और विधियों तक पहुंच पर विचार किया जाता है, जिसका अर्थ है कि उनका उपयोग केवल उपवर्गों द्वारा किया जा सकता है। असंबंधित कोड को विंडो उदाहरणों का उपयोग करने की अनुमति देने के लिए, उन्हें घोषित किया जाना चाहिए.

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

हालाँकि यह उदाहरण इसका उपयोग नहीं करता है, लेकिन डायलन भी कई वंशानुक्रम का समर्थन करता है।

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

जावा के तहत एक विशिष्ट वर्ग में समान विधियों को अलग किया जाएगा। उस कार्यक्षमता का उपयोग करने के लिए प्रोग्रामर को उस वर्ग को आयात करने और विधि को कॉल करने के लिए स्पष्ट रूप से संदर्भित करने के लिए मजबूर किया जाता है। यदि वह वर्ग अनुपलब्ध है, या संकलन समय पर अज्ञात है, तो एप्लिकेशन केवल संकलन नहीं करेगा।

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

<वाक्यविन्यास लैंग = डायलन> परिभाषित विधि टर्न-ब्लू (डब्ल्यू :: <खिड़की>) रंग: = $नीला; अंत विधि; 

यह परिभाषा अन्य भाषाओं की परिभाषा के समान है, और संभवतः इसके भीतर समाहित हो जाएगी  कक्षा। ध्यान दें := सेटर कॉल, जो सिंटैक्टिक चीनी के लिए है.

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

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

यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके मौजूदा कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी बुनियादी कक्षाएं शायद ही कभी स्रोत के रूप में दी जाती हैं। डायलन (और अन्य एक्स्टेंसिबल भाषाओं) में वर्तनी जाँच विधि को इसमें जोड़ा जा सकता है   मॉड्यूल, उन सभी वर्गों को परिभाषित करता है जिन पर इसे लागू किया जा सकता है   निर्माण। इस मामले में वास्तविक कार्यक्षमता को एकल सामान्य फ़ंक्शन में परिभाषित किया जा सकता है, जो एक स्ट्रिंग लेता है और त्रुटियां लौटाता है। जब   मॉड्यूल आपके प्रोग्राम में संकलित है, सभी स्ट्रिंग्स (और अन्य ऑब्जेक्ट्स) को अतिरिक्त कार्यक्षमता मिलेगी।

एप्पल डायलन
Apple Dylan, Apple Computer द्वारा निर्मित Dylan का कार्यान्वयन है। यह मूल रूप से Apple Newton उत्पाद के लिए विकसित किया गया था।

बाहरी संबंध

 * , Open Dylan – hosts open source, optimizing Dylan compiler targeting Unix/Linux, macOS, Microsoft Windows
 * Overview of the language
 * An Introduction to Dylan
 * Apple Dylan TR1
 * The Marlais Dylan Interpreter – An implementation of a subset of Dylan, suitable for bootstrapping a compiler