XHarbour
एक्सहार्बर एक मुफ्त बहु-मंच विस्तारित क्लिपर संकलक है, जो कई ग्राफिक टर्मिनलों (जीटी) की पेशकश करता है, जिसमें कंसोल ड्राइवर, जीयूआई और हाइब्रिड कंसोल/जीयूआई शामिल हैं। एक्सहार्बर क्लिपर के साथ पिछड़े-संगत है और कई भाषा वाक्यविन्यास एक्सटेंशन, बहुत विस्तारित रन-टाइम पुस्तकालयों और व्यापक तीसरे पक्ष के समर्थन का समर्थन करता है। अधिकांश गतिशील भाषाओं की तरह, एक्स हार्बर भी एक स्क्रिप्टिंग भाषा (स्टैंडअलोन एप्लिकेशन, लिंक करने योग्य लाइब्रेरी, एमएस एक्टिवस्क्रिप्ट इंजन [विंडोज स्क्रिप्ट होस्ट, एचटीएमएल, एएसपी]) के रूप में उपलब्ध है, जिसमें एक्स हार्बर भाषा में लिखे गए दुभाषिया का उपयोग किया जाता है। एक्स-हार्बर यूज़नेट समाचार समूह एक्स-हार्बर से संबंधित प्रश्नों पर चर्चा करने के लिए एक सक्रिय समुदाय है। बिल्ट-इन डेटा प्रकार xHarbor में 6 स्केलर प्रकार हैंः नील, स्ट्रिंग, डेट, लॉजिकल, नंबर, पॉइंटर और 4 जटिल प्रकारः ऐरे, ऑब्जेक्ट, कोडब्लॉक और हैश। एक स्केलर में एक ही मान होता है, जैसे कि एक स्ट्रिंग, संख्या या किसी अन्य प्रकार का संदर्भ। सरणी स्केलर या जटिल प्रकारों की क्रमबद्ध सूचियाँ हैं, जो संख्या द्वारा अनुक्रमित होती हैं, जो 1 से शुरू होती हैं। हैश, या सहयोगी सरणी, किसी भी प्रकार के मानों के क्रमहीन संग्रह हैं जो उनकी संबद्ध कुंजी द्वारा अनुक्रमित होते हैं, जो किसी भी स्केलर या जटिल प्रकार के हो सकते हैं। स्केलर प्रकारों का शाब्दिक (स्थिर) प्रतिनिधित्वः निलः नील स्ट्रिंगः "हैलो", "हैलो", [हैलो], या ई "हैलो" दिनांकः ctod ("2005-03-17") तार्किकः. T.,. F. संख्याः 1,1,-1,0xFF जटिल प्रकारों को शाब्दिक मूल्यों के रूप में भी दर्शाया जा सकता हैः सरणीः {"स्ट्रिंग", 1, {"नेस्टेड ऐरे"},. T., फंक्शनकॉल (), @FunctionPointer ()} कोडब्लॉकः {|Arg1, ArgN। Arg1: = ArgN + आउटरवार + फंक्शनकॉल ()} हैशः {"नाम" => "जॉन", 1 => "संख्यात्मक कुंजी", "नाम 2" => {"नेस्टेड" => "हैश"] हैश किसी भी तत्व के लिए कुंजी के रूप में अन्य हैश सहित किसी भी प्रकार का उपयोग कर सकते हैं। हैश और सरणी में किसी भी सदस्य के मूल्य के रूप में कोई भी प्रकार हो सकता है, जिसमें नेस्टिंग सरणी और हैश शामिल हैं। कोडब्लॉक में प्रक्रिया/कार्य> विधि के चर के संदर्भ हो सकते हैं जिसमें इसे परिभाषित किया गया था। इस तरह के कोडब्लॉक को एक मूल्य के रूप में वापस किया जा सकता है, या रेफरेन्स द्वारा पारित एक तर्क के माध्यम से, ऐसे मामले में कोडब्लॉक उस दिनचर्या को "जीवित" कर देगा जिसमें इसे परिभाषित किया गया था, और कोई भी चर जिसे यह संदर्भित करता है, एक अलग चर होगा। अलग किए गए चर अपने मूल्य को तब तक बनाए रखेंगे जब तक कि उन्हें संदर्भित करने वाला कोडब्लॉक अभी भी मौजूद है। इस तरह के मूल्यों को किसी भी अन्य कोडब्लॉक के साथ साझा किया जाएगा, जिसकी उन समान चरों तक पहुंच हो सकती है। यदि कोडब्लॉक ने अपनी निहित दिनचर्या को पूरा नहीं किया, और जिस दिनचर्या में इसे परिभाषित किया गया है, उसके जीवनकाल के भीतर इसका मूल्यांकन किया जाएगा, तो इसके मूल्यांकन के माध्यम से इसके अलग किए गए चर (ओं) में परिवर्तन, इसकी मूल दिनचर्या में वापस दिखाई देंगे। कोडब्लॉक का मूल्यांकन ईवल (ब्लॉकएक्सपी) फंक्शन के माध्यम से कितनी भी बार किया जा सकता है। चर सभी प्रकारों को नामित चरों को सौंपा जा सकता है। नामित चर पहचानकर्ता 1 से 63 वर्ण लंबे होते हैं, जो [ए-Z|_] से शुरू होते हैं और इसमें अधिकतम 63 वर्णों तक के वर्ण [ए-Z|0-9|_] होते हैं। नामित चर मामले के प्रति संवेदनशील नहीं होते हैं। चर में निम्नलिखित दायरे में से एक हैः स्थानीयः केवल उस दिनचर्या के भीतर दिखाई देता है जिसने इसे घोषित किया था। दिनचर्या से बाहर निकलने पर मूल्य खो जाता है। स्थिरः केवल उस दिनचर्या के भीतर दिखाई देता है जिसने इसे घोषित किया था। दिनचर्या के बाद के आह्वान के लिए मूल्य संरक्षित किया जाता है। यदि किसी भी प्रक्रिया/कार्य/विधि को परिभाषित करने से पहले एक STATIC चर घोषित किया जाता है, तो इसका एक मॉड्यूल दायरा होता है, और उसी स्रोत फ़ाइल के भीतर परिभाषित किसी भी दिनचर्या के भीतर दिखाई देता है, यह आवेदन जीवनकाल की अवधि के लिए अपना जीवन बनाए रखेगा। उसी स्रोत मॉड्यूल में परिभाषित किसी भी दिनचर्या के भीतर वैश्विक दृश्य जहां वैश्विक चर घोषित किया गया है, साथ ही किसी भी अन्य स्रोत मॉड्यूल की कोई भी दिनचर्या, जो स्पष्ट रूप से इसे वैश्विक बाहरी घोषणा के माध्यम से घोषित करती है। किसी भी प्रक्रिया/कार्य/विधि को परिभाषित करने से पहले वैश्विक और वैश्विक दोनों बाहरी घोषणाओं को घोषित किया जाना चाहिए। निजीः दिनचर्या के भीतर दिखाई देता है जो इसे घोषित करता है, और उस दिनचर्या द्वारा बुलाए गए सभी दिनचर्या। सार्वजनिकः एक ही अनुप्रयोग में सभी दिनचर्या द्वारा दृश्यमान। स्थानीय, स्थिर और वैश्विक को संकलन समय पर हल किया जाता है, और इस प्रकार निजी और सार्वजनिक चर की तुलना में बहुत तेज होते हैं जो एक रनटाइम प्रतीक तालिका के माध्यम से एक्सेस की जाने वाली गतिशील इकाइयाँ हैं। इसी कारण से, स्थानीय, स्थिर और वैश्विक चर मैक्रो संकलक के संपर्क में नहीं आते हैं, और कोई भी मैक्रो कोड जो उन्हें संदर्भित करने का प्रयास करता है, एक रनटाइम त्रुटि उत्पन्न करेगा। निजी और सार्वजनिक चर की गतिशील प्रकृति के कारण, उन्हें रनटाइम पर बनाया और नष्ट किया जा सकता है, रनटाइम मैक्रोज़ के माध्यम से पहुँचा और संशोधित किया जा सकता है, और फ्लाई पर बनाए गए कोडब्लॉक द्वारा पहुँचा और संशोधित किया जा सकता है। नियंत्रण संरचनाओं में सभी मानक डीबेस और क्लिपर नियंत्रण संरचनाओं के साथ-साथ सी या जावा प्रोग्रामिंग भाषाओं से प्रेरित अतिरिक्त संरचनाएं शामिल हैंः लूप्स [डीओ] वाइल कंडीशनएक्सप. [लूप] [एक्जिट] एंड [डीओ] फॉर वारः = इनिस्टएक्सप टू एंडएक्सप [स्टेपएक्सप]. [लूप] [एक्जिट] नेक्स्ट फॉर ईएच वर इन कलेक्शनएक्सप. [एचबी _ एनमइंडेक्स ()] [लूप] [एक्जिट] नेक्स्ट. अधिक एक्सहार्बर कथनों में से एक का अनुक्रम है, और स्क्वायर ब्रैकेट वैकल्पिक वाक्यविन्यास को दर्शाते हैं। एच. बी. एनमइंडेक्स () का उपयोग वैकल्पिक रूप से वर्तमान पुनरावृत्ति सूचकांक (1 आधारित) को पुनः प्राप्त करने के लिए किया जा सकता है। लूप कथन संलग्न लूप संरचना के वर्तमान पुनरावृत्ति को फिर से शुरू करता है, और यदि संलग्न लूप एक FOR या प्रत्येक लूप के लिए है, तो यह लूप के अगले पुनरावृत्ति की ओर बढ़ते हुए पुनरावृत्ति को बढ़ाता है। EXIT कथन संलग्न लूप संरचना के निष्पादन को तुरंत समाप्त कर देता है। अगला कथन नियंत्रण संरचना को बंद कर देता है और लूप संरचना के अगले पुनरावृत्ति की ओर बढ़ता है। एफओआर कथन में, असाइनमेंट अभिव्यक्ति का मूल्यांकन पहले लूप पुनरावृत्ति से पहले किया जाता है। टीओ अभिव्यक्ति का मूल्यांकन किया जाता है और प्रत्येक पुनरावृत्ति से पहले नियंत्रण चर के मूल्य के खिलाफ तुलना की जाती है, और लूप को समाप्त कर दिया जाता है यदि यह नियंत्रण चर के संख्यात्मक मूल्य से अधिक संख्यात्मक मूल्य का मूल्यांकन करता है। वैकल्पिक एस. टी. ई. पी. अभिव्यक्ति का मूल्यांकन प्रत्येक पुनरावृत्ति के बाद किया जाता है, यह तय करने से पहले कि अगली पुनरावृत्ति करनी है या नहीं। प्रत्येक चर के लिए, वार में संग्रह मूल्य में संबंधित तत्व का मूल्य (स्केलर, या कॉम्प्लेक्स) होगा। संग्रह अभिव्यक्ति, एक सरणी (किसी भी प्रकार या प्रकार के संयोजन), एक हैश टेबल, या एक ऑब्जेक्ट प्रकार हो सकती है। IF कथन IF CondExp. [ELSEIF] CondExp. [ELSE]. END [IF]. 0 या अधिक कथन (ओं) का प्रतिनिधित्व करता है। शर्त अभिव्यक्ति (ओं) को एक स्थानीय मान का मूल्यांकन करना होता है। डू केस स्टेटमेंट्स डू केस केस CondExp. [CASE CondExp]. [OTHERWISE]. END [CASE] उपरोक्त निर्माण तार्किक रूप से इसके बराबर हैः IF CondExp. ELSEIF CondExp. [ELSEIF CondExp]. [ELSE]. END [IF] स्विच स्टेटमेंट्स xHarbar स्विच () के C कार्यान्वयन से प्रेरित एक स्विच निर्माण का समर्थन करता है। स्विच स्विचएक्सप केस लिटरलएक्सप. [एक्जिट] [केस लिटरलएक्सप]. [एक्जिट] [डेफाल्ट]. एंड द लिटरलएक्सप एक संकलित समय हल करने योग्य संख्यात्मक अभिव्यक्ति होनी चाहिए, और इसमें ऑपरेटर शामिल हो सकते हैं, जब तक कि ऐसे ऑपरेटरों में संकलन समय स्थिर मूल्य शामिल हो। एक्जिट वैकल्पिक स्टेटमेंट सी स्टेटमेंट ब्रेक के बराबर है, और यदि मौजूद है, तो एक्जिट स्टेटमेंट तक पहुंचने पर स्विच संरचना का निष्पादन समाप्त हो जाएगा, अन्यथा यह अगले केस स्टेटमेंट (फॉल थ्रू) के नीचे पहले स्टेटमेंट के साथ जारी रहेगा। प्रारंभ समतुल्य कथन प्रारंभ समतुल्य. [ब्रेक] [ब्रेक ([एक्सप])] रिकवरी [वर्शन का उपयोग करना]. अंत [सेक्वेन्स] याः प्रारंभ समतुल्य. [ब्रेक] [ब्रेक ()] अंत [सेक्वेन्स] प्रारंभिक समतुल्य संरचना किसी भी अनुक्रम के अच्छी तरह से व्यवहार किए गए गर्भपात की अनुमति देती है, भले ही नेस्टेड प्रक्रियाओं/कार्यों को पार करते समय भी। इसका मतलब है कि एक तथाकथित प्रक्रिया/कार्य, किसी भी नेस्टेड प्रक्रिया/कार्यों को प्रकट करने के लिए मजबूर करने के लिए एक ब्रेक स्टेटमेंट, या एक ब्रेक () अभिव्यक्ति जारी कर सकता है, या तो अपने संबंधित एंड स्टेटमेंट के बाद, या एक रिकवरी क्लॉज, यदि मौजूद हो, तो पहले बाहरी बी. ई. जी. आई. एन. सीक्वेन्स संरचना तक वापस जा सकता है। ब्रेक स्टेटमेंट वैकल्पिक रूप से किसी भी प्रकार की अभिव्यक्ति को पारित कर सकता है, जिसे आगे रिकवरी हैंडिंग की अनुमति देने के लिए रिकवरी स्टेटमेंट द्वारा स्वीकार किया जा सकता है। इसके अतिरिक्त एक्स-हार्बर एरर ऑब्जेक्ट कैन-डिफॉल्ट, कैन-रेटरी और कैन-सबस्टीट्यूट गुणों का समर्थन करता है, जो त्रुटि संचालकों को कुछ तैयारी करने की अनुमति देता है, और फिर एक पुनः प्रयास संचालन, एक फिर से शुरू करने का अनुरोध करता है, या त्रुटि स्थिति को ट्रिगर करने वाले अभिव्यक्ति को बदलने के लिए एक मूल्य वापस करता है। कोशिश करें [कैच] [अंत में] कथन कोशिश करें. [ब्रेक] [ब्रेक ([एक्सप])] [थ्रो ([एक्सप])] कैच [वार]. अंत में कोशिश करें. [ब्रेक] [ब्रेक ([एक्सप])] [थ्रो ([एक्सप])] कैच [वार]। अंत में. अंत याः प्रयास करें. [ब्रेक] [ब्रेक ([एक्सप])] [थ्रो ([एक्सप])] अंत में. प्रयास का निर्माण बहुत हद तक प्रारंभिक समतुल्य निर्माण के समान है, सिवाय इसके कि यह स्वचालित रूप से त्रुटि प्रबंधन को एकीकृत करता है, ताकि किसी भी त्रुटि को रोका जा सके, और कैच कथन के माध्यम से पुनर्प्राप्त किया जा सके या अन्यथा बाहरी कैच हैंडलर को अग्रेषित किया जा सके। अंतिम खंड को वापसी, ब्रेक या थ्रो के माध्यम से ट्राई या कैच अनुभागों के आगे के प्रवाह नियंत्रण से पहले निष्पादित करने की गारंटी है। प्रक्रियाएँ/कार्य [स्थिर] प्रक्रियाएँ कुछ प्रक्रियाएँ नाम [स्थिर] प्रक्रियाएँ कुछ प्रक्रियाएँ नाम () [स्थिर] प्रक्रियाएँ कुछ प्रक्रियाएँ नाम (परम 1 '[, परम एन]) प्रारंभ प्रक्रियाएँ कुछ प्रक्रियाएँ नाम [स्थिर] कार्य कुछ प्रक्रियाएँ नाम [स्थिर] कार्य कुछ प्रक्रियाएँ नाम [स्थिर] कार्य कुछ प्रक्रियाएँ नाम () [स्थिर] कार्य कुछ प्रक्रियाएँ नाम (परम 1' [, परम एन] नामकरण के नियम वैरिएबल्स के समान हैं (63 वर्णों तक गैर-केस संवेदनशील)। जहां परिभाषित किया गया है, मॉड्यूल के दायरे तक उनके उपयोग को सीमित करने के लिए प्रक्रियाएं और कार्य दोनों ही स्कोप क्वालिफायर एसटीएटीआईसी द्वारा योग्य हो सकते हैं। आई. एन. आई. टी. या ई. एक्स. आई. टी. वैकल्पिक योग्यता प्राप्तकर्ता, आवेदन शुरू करने की प्रक्रिया को कॉल करने से ठीक पहले या आवेदन छोड़ने के ठीक बाद स्वचालित रूप से लागू होने वाली प्रक्रिया को चिह्नित करेंगे। एक प्रक्रिया/कार्य को पारित किए गए पैरामीटर सबरूटीन में स्थानीय चर के रूप में दिखाई देते हैं, और संदर्भों सहित किसी भी प्रकार को स्वीकार कर सकते हैं। तर्क चर में परिवर्तन कॉलिंग प्रक्रिया/कार्य/विधि द्वारा पारित संबंधित चर में प्रतिबिंबित नहीं होते हैं जब तक कि @उपसर्ग का उपयोग करके स्पष्ट रूप से REFERENCE द्वारा पारित नहीं किया जाता है। प्रक्रिया का कोई वापसी मूल्य नहीं होता है, और यदि अभिव्यक्ति के संदर्भ में उपयोग किया जाता है तो शून्य मूल्य उत्पन्न होगा। कार्य वापसी कथन के माध्यम से किसी भी प्रकार की वापसी कर सकता है, इसकी परिभाषा के मुख्य भाग में कहीं भी। एक उदाहरण प्रक्रिया परिभाषा और एक फंक्शन कॉल इस प्रकार हैः x: = क्यूब (2) फंक्शन क्यूब (n) रिटर्न एन * * 3 डेटाबेस समर्थन x हार्बर क्लिपर रिप्लेसेबल डेटाबेस ड्राइवर्स (आर. डी. डी.) दृष्टिकोण का विस्तार करता है। यह डी. बी. एफ., डी. बी. एफ. एन. टी. एक्स., डी. बी. एफ. सी. डी. एक्स., डी. बी. एफ. डी. बी. टी. और डी. बी. एफ. एफ. पी. टी. जैसे कई आर. डी. डी. प्रदान करता है। एक्स हार्बर में कई आर. डी. डी. का उपयोग एक ही अनुप्रयोग में किया जा सकता है, और नए तार्किक आर. डी. डी. को अन्य आर. डी. डी. के संयोजन से परिभाषित किया जा सकता है। आर. डी. डी. वास्तुकला विरासत के लिए अनुमति देती है, ताकि एक दिया गया आर. डी. डी. अन्य मौजूदा आर. डी. डी. (ओं) की कार्यक्षमता का विस्तार कर सके। तृतीय पक्ष आर. डी. डी., जैसे आर. डी. डी. एस. क्यू. एल., आर. डी. डी. एस. आई. एक्स., आर. एम. डी. बी. एफ. सी. डी. एक्स., एडवांटेज डेटाबेस सर्वर और मध्यस्थ आर. डी. डी. वास्तुकला सुविधाओं में से कुछ का उदाहरण देते हैं। एक्सहार्बर ओ. ओ. पी. वाक्यविन्यास के माध्यम से ओ. डी. बी. सी. समर्थन और ओ. एल. ई. के माध्यम से ए. डी. ओ. समर्थन भी प्रदान करता है। मैक्रो प्रचालक (रनटाइम संकलक) xBase भाषाओं की सबसे शक्तिशाली विशेषताओं में से एक MACRO प्रचालक '&' है। x-हार्बर का मैक्रो ऑपरेटर का कार्यान्वयन किसी भी वैध x-हार्बर अभिव्यक्ति के रनटाइम संकलन की अनुमति देता है। इस तरह की संकलित अभिव्यक्ति का उपयोग मूल्य के रूप में किया जा सकता है, अर्थात। एक असाइनमेंट का दाहिना पक्ष, लेकिन इस तरह की संकलित अभिव्यक्ति का उपयोग एक असाइनमेंट के बाएं पक्ष को हल करने के लिए किया जा सकता है, अर्थात। निजी, या सार्वजनिक चर, या डेटाबेस फील्ड। इसके अतिरिक्त मैक्रो ऑपरेटर फ़ंक्शन कॉल, पूर्ण असाइनमेंट, या यहां तक कि तर्कों की सूची को संकलित और निष्पादित कर सकता है, और मैक्रो के परिणाम का उपयोग संकलित अनुप्रयोग में उपरोक्त संदर्भों में से किसी को हल करने के लिए किया जा सकता है। आई. ओ. डब्ल्यू., किसी भी एक्स-हार्बर अनुप्रयोग को विस्तारित किया जा सकता है, और/या मांग पर अतिरिक्त कोड को संकलित करने और निष्पादित करने के लिए रनटाइम में संशोधित किया जा सकता है। इस सुविधा का एक्स-हार्बर कार्यान्वयन इतना पूर्ण है कि एक्स-हार्बर दुभाषिया, एक्सबीस्क्रिप्ट, एक्स-हार्बर लिपियों को संकलित करने के लिए इसका भारी उपयोग करता है। वाक्यविन्यासः & (.) अभिव्यक्ति '.' का पाठ मूल्य संकलित किया जाएगा, और संकलित कोड के निष्पादन से उत्पन्न मूल्य परिणाम है। एंड समआईडी एंड (समआईडी) का संक्षिप्त रूप है। & SomeId.postfix & (समआईडी + "पोस्टफिक्स") का संक्षिप्त रूप है। उदाहरण कोड हैलो, दुनिया! विशिष्ट "हैलो वर्ल्ड" कार्यक्रम होगाः? "हैलो, दुनिया!" याः QOut ("हैलो, दुनिया!" ) याः अलर्ट ("हैलो, दुनिया!" ) या, एक स्पष्ट प्रक्रिया में संलग्नः प्रक्रिया मुख्य ()? "हैलो, दुनिया!" वापसी ओ. ओ. पी. #include "hbclass.ch" प्रक्रिया मुख्य () स्थानीय ऑपरसनः = व्यक्ति ("डेव") ऑपरसनः आंखेंः = "अमान्य" ऑपरसनः आंखेंः = "ब्लू" अलर्ट (ऑपरसनः डिस्क्राइब ()) रिटर्न क्लास व्यक्ति डेटा नाम आई. एन. आई. टी. "" नई विधि () कन्स्ट्रक्टर एक्सेस आईज़ इनलाइनःः pvteyes ASSIGN Eyes (x) इनलाइन आई. आई. एफ. (वाल्टाइप (x) = = "सी". और। x में "नीला, भूरा, हरा":: pvtEyes: = x, चेतावनी ("अमान्य मूल्य"))// इन-लाइन विधि परिभाषा का नमूना INLINE विधि का वर्णन करें () स्थानीय सी-विवरण यदि खाली है (:: नाम) सी-विवरणः = "मेरे पास अभी तक कोई नाम नहीं है।" ई. एल. एस. ई. सी. विवरणः = "मेरा नाम हैः" +:: नाम + ";" ई. एन. डी. आई. एफ. आई. एफ! खाली (:: आंखें) सी-डिस्क्रिप्शन + = "मेरी आंखों" का रंग हैः "+:: आंखें अंत विधि निजीः डेटा निजी आंखें अंत// सामान्य विधि परिभाषा का नमूना। विधि नया (सी. एन. एम.) वर्ग व्यक्तिःः नाम = सी. एन. एम. रीटर्न सेल्फ स्क्रिप्टिंग xहार्बर स्क्रिप्टिंग इंजनों के कुछ स्वादों में एक व्याख्या की गई भाषा के रूप में भी उपलब्ध है। स्टैंड अलोन इंटरप्रेटरः पोर्टेबल, सेल्फ-कंटेनमेंट, इंटरप्रेटर xBaseSct। एक्टिवस्क्रिप्टः माइक्रोसॉफ्ट एक्टिवस्क्रिप्ट के अनुरूप ओ. एल. ई. डी. एल. एल., जो विंडोज स्क्रिप्ट होस्ट (डब्ल्यू. एस. एच.) में स्क्रिप्टिंग का समर्थन करता है। इंटरनेट एक्सप्लोरर, एच. टी. एम. एल. क्लाइंट साइड स्क्रिप्टिंग। आई. आई. एस., और कोई अन्य ए. एस. पी. अनुरूप सर्वर। बाहरी लिंक आधिकारिक साइट ऑब्जेक्ट ओरिएंटेड हार्बर जीयूआई (ओओएचजी) फाइवविन ज़ेलर xHarbour.com प्रक्रियात्मक प्रोग्रामिंग भाषाएँ एक्सबेस प्रोग्रामिंग भाषा परिवार चौथी पीढ़ी की प्रोग्रामिंग भाषाएँ 2001 में बनाई गई प्रोग्रामिंग भाषाएँ