संगणक कार्यक्रमण : (कॉम्प्युटर प्रोगामिंग). संगणकाचा वापर करून एखादे प्रमेय किंवा समस्या सोडविण्यासाठी, अथवा एखादे फलित साध्य करण्यासाठी, सुयोग्य रीती विकसित करून तिची संगणकावर कार्यान्वित करता येईल अशा क्रमबद्ध आदेशांच्या रूपात मांडणी करण्यापर्यंतच्या संपूर्ण प्रक्रियेला ‘ संगणक कार्यक्रमण ’ म्हणतात. प्रत्येक  अंकीय संगणकाला स्वत:ची अशी एक यंत्रभाषा असून त्या भाषेतील कार्यक्रमानुसार तो सांकेतिक स्वरूपातील माहितीवर संस्करण करतो. यंत्रभाषेतील आदेश हे द्विमान अंकांच्या स्वरूपात असल्याने त्यात थेट कार्यक्रमण करणे क्लिष्ट असते. यास्तव प्रत्येक संगणक स्वत:ची अशी एक ॲसेम्ब्ली भाषा (वर्णाक्षरी भाषा) उपलब्ध करून देतो. या भाषेतील आदेश अंकांऐवजी अक्षरे वापरतात व त्यामुळे ते लक्षात ठेवण्यास तुलनेने सोपे असतात. यामध्ये संगणकाच्या स्मृतीतील क्रमपत्त्यांनाही नावे देता येतात. ॲसेम्ब्ली भाषेतील प्रत्येक आदेशाचे यंत्रभाषेतील आदेशात एकास एक या प्रमाणात भाषांतर होते. मूळ कार्यक्रमाचे असे भाषांतर करणारे ॲसेम्ब्लर सॉफ्टवेअर सर्वांना उपयोगी पडतील अशी काही लायबरी रूटिनेही (सुटे भाग) उपलब्ध करून देते. ॲसेम्ब्ली भाषा तुलनेने कार्यक्रमणास सुकर असली तरी तिचे आदेश निम्नस्तरीय असल्याने कार्यक्रम विकसित करणाऱ्या व्यक्तीस सूक्ष्म स्वरूपातील रूपरेखा तयार करावी लागते. शिवाय ॲसेम्ब्ली भाषा संगणक सापेक्ष असल्याने संगणक बदलल्यास संपूर्ण कार्यक्रमाचे पुनर्लेखन करावे लागते. यास्तव उच्च्स्तरीय भाषांचा विकास करण्यात आला.

कार्यक्रमणाची सुरूवात समस्येसाठी रीती तयार करण्यापासून होते. रीतीमध्ये समस्या सोडविण्याची तार्किक पद्धत वर्णिलेली असते. क व ख या दोन एक-अंकी संख्यांच्या गुणाकाराचे उदाहरण घेऊन याचे स्पष्टीकरण करता येईल. अशा गुणाकाराची रीती पुढीलप्रमाणे सांगता येईल : (१) क ही संख्या स्वत:मध्ये ख वेळा मिळवून येणारे उत्तर ग समजा. (२) क आणि ख यांचे ऋण-धन चिन्ह समान असल्यास गचे चिन्ह धन व असमान असल्यास ते ऋण असे मांडा. (३) ग हे गुणाकाराचे उत्तर होय.

रीती ही कार्यक्रमणाचे संगणक निरपेक्ष व भाषा निरपेक्ष असे तार्किक स्वरूप आहे. एका कार्यक्रमात अनेक घटक रीतींचा समावेश होऊ शकतो. वर दिलेली गुणाकाराची रीती अनेक कार्यकमांची घटक असू शकते. या रीतीवरून क्रमरूपरेखा तयार करणे सोईस्कर ठरते. क्रमरूपरेखा देखील संगणक निरपेक्ष व भाषा निरपेक्ष असून तीमध्ये कार्यक्रमाचे प्रवाह व उपप्रवाह स्पष्ट होतात. क्रमरूपरेखेत निरनिराळ्या प्रकारच्या चौकटी वापरल्या जातात. आदान-प्रदान दर्शविणारी चौकट, कृती करणारी चौकट व निर्णयस्थानीची चौकट अशा चौकटी तीत दर्श-विलेल्या असतात. या क्रमरूपरेखेवरून क्रमवार आदेशांनी बनलेला कार्यक्रम तयार करता येतो. क्रमरूपरेखेचा एक नमुना आ. १ मध्ये दाखविला आहे. त्यात मुद्दल, व्याज दर आणि मुदत वर्षे या माहितीवरून व्याज काढण्यासाठी क्रमरूपरेखा दर्शविली आहे. या क्रमरूपरेखेचे रूपांतर कार्यक्रमात केल्यावर कार्यक्रमाचा ओघ कसा होईल त्याचा नमुना कोष्टकात दाखविला आहे. ही क्रमरूपरेखा व कार्यक्रम केवळ स्पष्टीकरणात्मक आहेत.

बहुतेक यंत्रभाषा चार प्रकारचे आदेश उपलब्ध करून देतात :

(१) मूल्यप्राप्तिकारक: यात एखादया प्रचलाचे मूल्य ठरविले जाते. हे मूल्य घोषित केलेले वा एखादया सूत्रान्वये संगणित केलेले असू शकते.

(२) सशर्त शाखाक्रमण: कार्यवाही दरम्यान एखादी शर्त पूर्ण होते किंवा नाही यावरून कार्यक्रमाचा ओघ बदलावयाचा किंवा नाही याचा निर्णय यात केला जातो. (३) बिनशर्त शाखाक्रमण: यात कार्यक्रमाचा ओघ बिनशर्त बदलला जातो. (४) पुनरावर्तन : यात कार्यक्रमाचा एखादा भाग ठराविक वेळा पुन:पुन्हा कार्यान्वित केला जातो.

वर दिलेल्या कार्यक्रमामध्ये प्रचलांची मूल्ये घोषित करणे, सूत्रावरून व्याज काढणे अशा क्रियांसाठी मूल्यप्राप्तिकारक आदेश वापरले आहेत. व्याज काढण्याच्या क्रियेचे तीन वेळा पुनरावर्तन केले आहे. त्यामध्ये बिनशर्त शाखाक्रमणाचा वापर केला आहे. तीन आवर्तने झाल्यावर सशर्त शाखाक्रमणाने कार्यक्रमाची समाप्ती केली आहे.

एखादया उपयोजनासाठी संगणक कार्यक्रमण करण्यासाठी सर्वसाधारणपणे पुढील टप्पे पार पाडले जातात : सर्वप्रथम सॉफ्टवेअर विकसित करणाऱ्याला संबंधित उपयोजनाचा अभ्यास करून त्यात पार पाडावयाची कार्ये, आदान-प्रदान करावी लागणारी माहिती, त्यातील सर्व शक्यता व साध्ये समजून घ्यावी लागतात. उपयोजनातील कार्यांशी सुसंगत अशी रीती बनविणे हा कार्यक्रमण प्रक्रियेचा पुढील टप्पा असतो. त्या रीतीवरून पुढे कार्यक्रमाचा संपूर्ण ओघ चित्रमय पद्धतीने दर्शविणारी क्रम-रूपरेखा बनविली जाते. तीमध्ये रीतीमधील प्रत्येक टप्पा, निर्णयस्थान, शाखा, आवर्तने इ. दर्शविलेली असतात. त्यानंतर प्रत्यक्ष कार्यक्रमाचे लेखन केले जाते.

उत्तम कार्यक्रमामध्ये पुढील गुणधर्म असणे इष्ट आहे : (१) सुरचित कार्यक्रमण : बिनशर्त शाखाक्रमणांचा पर्याय जवळजवळ पूर्णपणे टाळून  असे कार्यक्रमण केले जाते. त्यामुळे तो कार्यक्रम विशिष्ट कार्य करणाऱ्या छोट्या कक्षांमध्ये विभागता येऊन प्रत्येक कक्षाला एकच प्रवेशस्थान व एकच निकासस्थान ठेवता येते. प्रत्येक कार्यकक्ष एकच कार्य उत्तम रीतीने पार पाडेल अशा प्रकारे तयार केला जातो. (२) कार्यक्रमात विपुल प्रमाणात शेरे व टिपणे वापरल्याने कार्यक्रम वाचताना त्याचा प्रवाह, त्यातील युक्तिवाद, हेतू सहजगत्या समजतात. (३) कार्यक्रमाची  सर्व अंगे व तपशील गंथित करून ठेवल्याने आणि त्याचे दस्तऐवज  उचित मानकांच्या आधाराने तयार केल्याने कार्यक्रमाचा पुढील विकास, त्याची  देखभाल  इ. कामे  सुकर  व  व्यक्तिनिरपेक्ष  बनतात.

वरील गुणधर्म कार्यकमांत अंतर्भूत करण्यामध्ये संगणक कार्यक्रमांना अधिक वाचनीय बनविणे आणि ते कार्यक्रम देखभाल व सुधारणा करण्यास सुकर ठेवणे ही उद्दिष्टे आहेत.

उच्च्स्तरीय भाषा व कार्यक्रमण पद्धती : उच्च्स्तरीय भाषांचे इंगजी भाषेशी साधर्म्य असते व त्या अधिक सांकेतिक, अधिक अमूर्त व संगणक निरपेक्ष असतात. या भाषांत लिहिलेले कार्यक्रम संगणकीय तर्कसंगतीपेक्षा उपयोजन तर्कसंगतीस अधिक जवळचे असतात. असे कार्यक्रम विविध संगणकांवर चालवावयाचे असल्यास त्यामध्ये केवळ काही किरकोळ बदल, तेही जरूर असल्यास, करावे लागतात. किंबहुना, वहनीयता हा त्यांचा एक प्रमुख गुणधर्म असतो. उच्च्स्तरीय भाषेतील कार्यक्रम संगणकावर थेट कार्यवाहीयोग्य नसतात. उच्च्स्तरीय भाषेतील कार्यकमांचे रूपांतर यंत्रभाषेतील कार्यवाहीयोग्य कार्यकमांमध्ये करण्यासाठी पुढील टप्पे पार करावे लागतात : (१) संकलन : उच्च्स्तरीय भाषेतील मूळ कार्यकमांचे यंत्रभाषेत भाषांतर करण्यासाठी संकलक हे सॉफ्टवेअर वापरले जाते. हे सॉफ्टवेअर प्रत्यक्ष भाषांतराशिवाय वापरकर्त्याला भाषांतरासाठी आवश्यक त्या सर्व सुविधा देणारे पर्यावरण उपलब्ध करून देते.  कार्यक्रमाचे दोषनिरसन करण्यासही ते मदत करते. (२) निधान: यंत्रभाषेतील कार्यक्रम कार्यवाहीसाठी संगणकाच्या स्मृतीत भरण्यायोग्य  बनविण्याचे काम निधाता सॉफ्टवेअर करते. यंत्रभाषेतील कार्यक्रम कार्यान्वित होताना केंद्रीय प्रक्रियकाला (सेंट्रल प्रोसेसिंग युनिटला) त्या कार्यक्रमाशी संबंधित स्मृतीतील नेमके क्रमपत्ते निर्देशित व्हावे लागतात. त्यामुळे स्मृतीमधील कोणत्याही उपलब्ध जागी कार्यक्रम भरावयाचा असल्यास तो अशा रीतीने स्थानबदल करून त्याचे निधान केले जाते की, ज्यायोगे स्मृतीमधील त्याचे क्रमपत्ते अचूकपणे निर्देशित होतील.

काही उच्च्स्तरीय भाषांसाठी संकलकाऐवजी दुभाषा (इंटरप्रीटर) हे सॉफ्टवेअर वापरले जाते. यामध्ये कार्यक्रम कार्यान्वित होत असताना उच्च्स्तरीय भाषेतील आदेशांचे एका वेळी एक या पद्धतीने यंत्रभाषेत भाषांतर केले जाते. याउलट संकलक जे भाषांतर करतो ते कायमस्वरूपी असते व भाषांतर केलेला कार्यक्रम साठवून ठेवून पुढे कधीही कार्यान्वित करता येतो.

बहुतेक उच्च्स्तरीय भाषांमध्येदेखील यंत्रभाषेत असलेले चार प्रकारचे आदेश उपलब्ध असतात. मात्र उच्च्स्तरीय भाषांमध्ये असेही कित्येक आदेश असतात जे यंत्रभाषेतील आदेशांपेक्षा वरच्या स्तराच्या क्रिया पार पाडू शकतात. उदा., दोन संख्यांच्या गुणाकाराच्या वर दिलेल्या कार्यक्रमासाठी उच्च्स्तरीय भाषेत एकच आदेश लिहिता येतो. संकलक त्याचे भाषांतर यंत्रभाषेत करतो. यंत्रभाषा, तसेच बहुतेक सर्व उच्च्स्तरीय भाषा या आज्ञार्थी पद्धतीच्या असतात. या पद्धतीत पुढील दृष्टिकोन स्वीकारलेला असतो : संगणक कार्यक्रमाच्या अनेक स्थिती असून कार्यक्रमातील आदेश कार्यवाहीच्या वेळी त्याची स्थित्यंतरे घडवितात व अशा रीतीने निरनिराळ्या स्थितींमधून कार्यक्रम पुढे सरकतो. ‘प्रोलॉग’ सारख्या काही भाषा याला अपवाद आहेत, ज्या भाषा आज्ञार्थी पद्धत न वापरता तार्किक पद्धत वापरतात. कार्यक्रम म्हणजे उत्तर मिळविण्याच्या संभाव्य मार्गाचे तार्किक स्पष्टीकरण असा दृष्टिकोन या भाषेत घेतला जातो. गणित, तत्त्वज्ञान, ⇨ संश्लेषित बुद्धीमत्ता या क्षेत्रांतील सॉफ्टवेअर साठी प्रोलॉग ही भाषा उपयुक्त आहे.

‘फोर्ट्रान’ (FORmula TRANslation) ही सर्वात प्रथम, म्हणजे १९५४ साली, विकसित झालेली उच्च्स्तरीय भाषा आहे. विज्ञान, तंत्रज्ञान क्षेत्रातील समस्यांसाठी तिच्या सुधारित आवृत्त्या पन्नास वर्षानंतरही वापरल्या जातात. व्यापार व्यवसायातील समस्यांसाठी ‘कोबोल’ (COmmon Bussiness Oriented Language) ही भाषा विकसित केली गेली. तिच्यातील आदेशांचे व्याकरण-नियम इंग्लिश भाषेशी साधर्म्य साधतात व तिच्यातील कार्यक्रम निबंधस्वरूप असतात. ‘अल्गोल’ (ALGOrithmic Language) या भाषेसाठी प्रथमच औपचारिक व्याकरण तयार करण्यात आले. ही भाषा फारशी वापरात  आली नाही, तरी ती भाषा ‘सी’, ‘सी प्लसप्लस’, ‘जावा’ या पुढे लोकप्रिय ठरलेल्या भाषांच्या विकासाला कारणीभूत ठरली. फोर्ट्रान, कोबोल व अल्गोल यातील गुणधर्म एकत्रित करणारी ‘पास्कल’ (फ्रेंच गणिती ⇨ ब्लेझ पास्काल यांच्या नावावरून पडलेले नाव) ही भाषाही काही काळ वापरात होती. १९७२ मध्ये विकसित झालेली ‘सी’ ही भाषा आजतागायत प्रचलित आहे (२००६). संगणकांच्या अनेक परिचालन प्रणालींचा विकास या भाषेत झाल्याने तिच्या वापराला चालना मिळाली. उच्च्स्तरीय भाषेत परिचालन प्रणालीचे सॉफ्टवेअर बनविले गेल्याने एकच परिचालन प्रणाली निरनिराळ्या हार्डवेअर मंचांवर वापरणे शक्य झाले. संगणकांवर आलेखिकी इंटरफेस (आदान-प्रदान करण्याची सुविधा देणारी मध्यस्थ प्रणाली) उपलब्ध झाल्यानंतर दृश्य भाषांचा विकास झाला. या भाषा संगणकाशी दृश्य स्वरूपात संवाद साधण्यासाठी लागणारी सॉफ्टवेअरी साधने उपलब्ध करून देतात. या भाषांमधील कार्यकमांमध्ये अंतर्भूत करण्याचे आदेश चित्रस्वरूपात व्यक्त करण्याची सुविधा असते. याउलट परंपरागत भाषांमधील आदेश हे अक्षरभाषेत एकामागोमाग ओळींमध्ये लिहिलेले असतात. दृश्य भाषेत कार्यक्रमण करताना चिन्हे, प्रतिमा, भरावयाचे फॉर्म, आकृत्या यांचा थेट वापर करता येतो. या भाषांचे संकलक दृश्य आदेशांचे यंत्रभाषेत भाषांतर करतात. ‘व्हिज्युअल बेसिक’, ‘व्हिज्युअल सी प्लसप्लस’, ‘मायरो’, ‘जिल’ ही दृश्य संगणक भाषांची काही उदाहरणे आहेत. काही उच्च्स्तरीय भाषा व्यापार, तंत्रविदया, विज्ञान यांविषयीच्या कार्यक्रमणासाठी वापरता येऊ शकतात उदा., एपीएल (ए प्रोगॉमिंग लँग्वेज), लिस्प (लिस्ट प्रोसेसर).

बेसिक (बिगिनर्स ऑल-पर्पज सिंबॉलिक इन्स्ट्रक्शन कोड) ही भाषा कार्यक्रमणासाठी सामान्यपणे वापरतात. व्यक्तिगत संगणकासाठी सापेक्षत: साधे कार्यक्रम लिहिण्यासाठी ती वापरतात. ती शिकायला व वापरायला सोपी असल्याने अनेक प्राथमिक व माध्यमिक शाळांत तिचे अभ्यासक्रम शिकविले जातात.

इ. स. १९८० च्या दशकातवस्तु-अभिमुखीकार्यक्रमण (ऑब्जेक्ट ओरिएंटेड प्रोगामिंग) पद्धतीचा विकास झाला. या पद्धतीमध्ये कार्यक्रम  म्हणजे एकमेकांशी संवाद साधणाऱ्या, वास्तव जगाशी साधर्म्य असणाऱ्या सॉफ्टवेअरी  वस्तू  असा  दृष्टिकोन  स्वीकारलेला  असतो. या पद्धतीचे अधिक स्पष्टीकरण पुढे दिले आहे. सी प्लसप्लस, जावा ही वस्तु-अभिमुखी भाषांची उदाहरणे आहेत. यामधून पुढे सॉफ्टवेअर-घटक या संकल्पनेचा विकास करण्यात आला. यंत्रांचे हार्डवेअर किंवा इलेक्ट्रॉनिकी प्रणाली ज्याप्रमाणे अनेक स्वतंत्र घटक एकमेकांना योग्य रीत्या जोडून बनविलेली असतात त्याप्रमाणे अनेक सॉफ्टवेअरी घटकांची जोडणी करून संगणक कार्यक्रम तयार करण्याची कल्पना यात आहे. वस्तु-अभिमुखी कार्यक्रमाची तत्त्वे घटकही वापरत असले, तरी घटक हे अमूर्त असू शकतात. त्यांचे मानसिक चित्र वास्तव जगातील वस्तूंप्रमाणे सहज असणे अभिप्रेत नसते. हा दोहोंमधील प्रमुख फरक आहे.

वस्तु-अभिमुखी कार्यक्रमण करताना त्यामध्ये प्रत्यक्ष उपयोजन क्षेत्राशी संबंधित रीती व त्याला अनुषंगून असलेल्या इतर रीती अशी कार्यक्रमाची विविध अंगे असतात. उपयोजनातील अशी विविध अंगे वेगळी काढून त्यांचे छोटे छोटे कार्यक्रमकक्ष तयार करणे व नंतर ते कक्ष एकमेकात गुंफणे ही अंगाभिमुखी कार्यक्रमणाची पद्धती आहे.

स्क्रिप्टिंग भाषा हाही कार्यक्रमणासाठी वापरल्या जाणाऱ्या भाषांचा एक प्रकार आहे. दुसऱ्या सॉफ्टवेअरला आदेश देऊन विशिष्ट कार्याची अंमलबजावणी करणारे आदेश स्क्रिप्टिंग भाषांमध्ये वापरले जातात.  अशा आदेशांचे कार्यक्रमही तयार करतात. ‘पर्ल’ ही स्क्रिप्टिंग भाषा इंटरनेट-वरील वर्ल्ड वाइड वेब (www) यावर वापरली जाते. युनिक्ससारख्या परिचालन प्रणालीला आदेश देणाऱ्या अशा स्किप्ट तयार करता येतात, ज्या कार्यवाही दरम्यान प्रत्यक्षात ‘ सी ’ भाषेतील कार्यक्रम कार्यान्वित करतात.

संस्कृत भाषेचे संगणक भाषानुकूल गुणधर्म : इ. स. पू. ५०० च्या कालखंडात भारतामध्ये ⇨ पाणिनी नावाचे एक मोठे भाषापंडित होऊन गेले. दैनंदिन व्यवहाराची भाषा व गंथासाठी वापरावयाची भाषा यामध्ये फरक करून त्यांनी गंथांसाठी औपचारिक भाषेचे नियम बनविले. सुमारे चार हजार सूत्रांव्दारे हे नियम त्यांनी आपल्या अष्टाध्यायी या गंथात गंथित  केले. त्यामुळे भाषेत वापरावयाच्या चिन्हसूत्रांचे नि:संदिग्ध व व्यक्तिनिरपेक्ष नियम तयार होऊन व्याकरण व वाक्यरचना यांमध्ये सुसूत्रता  आली. संगणकांच्या उद्यानंतर, संगणक ज्यावर थेट प्रक्रिया करू शकतील अशा उच्च्स्तरीय संगणक भाषांची आवश्यकता निर्माण झाली. जॉन बॅकस (१९५८) आणि पीटर नौर (१९६३) यांनी त्यासाठी संगणक भाषांची औपचारिक रचना तयार केली. बॅकस-नौर फॉर्म (बीएनएफ) हा वाक्य-रचनाबंध संगणक भाषांमध्ये वापरला जातो. या फॉर्ममधील सूत्रे व पाणिनी यांची सूत्रे या स्वतंत्र रीत्या तयार झालेल्या दोन नियमावल्यांमध्ये बरेचसे साम्य आढळते. त्यामुळे संगणक भाषांसाठी विकसित झालेल्या औपचारिक भाषा व संदर्भमुक्त व्याकरण यांचे पाणिनी हे पूर्वसूरी व जनक समजता येतील. आजच्या वस्तु-अभिमुखी कार्यक्रमणामधील वर्ग-उपवर्गाची संकल्पनाही संस्कृतमध्ये आढळते. उदा., ‘ गम ’ या ‘ चलन-वलन ’ या अर्थीच्या धातूच्या वर्गावरून गति, गौ असे उपवर्ग बनतात. या संकल्पना व व्याकरणशास्त्र यांमुळे संस्कृतला संगणक भाषाशास्त्राच्या अभ्यासात महत्त्व प्राप्त झाले आहे. पाणिनी यांच्या पद्धतीचे नियम व मेटॅनियम (नियमांचे नियम) यांना नैसर्गिक भाषा संस्करण या आधुनिक संगणक विषयात महत्त्वाचे स्थान असल्याचे शास्त्रज्ञांचे मत आहे.

बहुसूत्री कार्यक्रमण व समांतर कार्यक्रमण : सर्वसाधारण संगणक-कार्यकमांमधील आदेशांची कार्यवाही एका कमाने होते. कार्यक्रमाच्या आरंभबिंदूपासून समापन बिंदूपर्यंत त्याच्या कार्यवाहीचा एक एकरेषीय ओघ असतो. संगणकांचा केंद्रीय प्रक्रियक गतिमान असतो तर आदान-प्रदान उपकरणांची गती तुलनेने संथ असते. त्यामुळे कार्यकमांना अनेकदा आदान-प्रदान उपकरणांसारख्या साधनसामगीचा वाटा मिळण्यासाठी खोळंबून राहावे लागते. संगणक एका वेळी एकच कार्यक्रम कार्यवाहीत आणू शकत असेल, तर संगणकाच्या केंद्रीय प्रक्रियकाला अशा वेळी खोळंबून रहावे लागते. त्यामुळे एकरेषीय कार्यक्रमाची समस्या सोडविण्याची क्षमता मर्यादित राहते. संगणकात जर बहुकार्यकारी परिचालन प्रणाली असेल तर संगणक एका वेळी अनेक कार्यकमांना कार्यवाहीत  आणू शकतो. एका कार्यक्रमाची प्रक्रिया जर खोळंबून राहिली तर संदर्भ-पालट करून दुसऱ्या कार्यक्रमाची प्रक्रिया तो पुढे सुरू करतो. अशा रीतीने छोट्या छोट्या टप्प्यात आलटून-पालटून अनेक कार्यक्रम कार्यान्वित  होतात.

त्यामुळे शीघगती केंद्रीय प्रक्रियक व कूर्मगती आदान-प्रदान उपकरणे यांच्या गतींचा मेळ साधून प्रक्रियक पूर्णवेळ उपयोगात आणता येतो. हेच तत्त्व पुढे वाढवून एकाच कार्यक्रमाला समांतरपणे कार्यान्वित करता येऊ शकणाऱ्या तुकड्यांमध्ये विभागता आले, तर एकाच कार्यक्रमाचे विविध विभाग आलटून-पालटून कार्यान्वित करणे शक्य होते. यासाठी कार्यक्रम विकसित करतानाच उपयोजनातील स्वतंत्र धागे जाणून घ्यावे लागतात. कोणत्या वेळी कोणते धागे समांतरपणे कार्यान्वित होऊ शकतात, त्यांचे परस्परावलंबित्व कसे आहे व त्यामुळे कोणत्या ठिकाणी समांतर कार्यवाही थांबवावी लागते या सर्वांचा अभ्यास करून त्याप्रमाणे बहुसूत्री कार्यक्रम विकसित करावा लागतो. कार्यक्रमाची सर्व सूत्रे एकाच कार्यक्रमाचा भाग असल्याने ती कार्यक्रमाला मिळालेल्या स्मृतीचा संयुक्तपणे वापर करतात.

विविध परिचालन प्रणाली बहुसूत्री कार्यक्रम कार्यवाहीत आणण्याची  सुविधा विविध प्रकारे उपलब्ध करून देतात. बहुसूत्री कार्यक्रमाचे उदाहरण म्हणून आपल्याला इंटरनेटवरील वर्ल्ड वाइड वेबच्या वापरासाठी बनविलेल्या बाउजर उपयोजनाकडे पाहाता येईल. पडद्यावर दाखविण्याची दृश्य माहिती व कळफलक यांच्या साहाय्याने वापरकर्त्याशी संवाद साधणे, मॉडेमसारख्या उपकरणावरून माहिती पाठविणे, आलेल्या माहितीचे ग्रहण करणे, वापरकर्त्याने सूचना दिल्यास माहिती चुंबकीय तबकडीवर संगहित करणे असे या उपयोजनाचे अनेक धागे असतात, जे परस्परावलंबी असतात तरीही समांतरपणे कार्य करू शकतात. बहुसूत्री कार्यक्रमाची निर्मिती काळजीपूर्वक करावी लागते, अन्यथा कार्यक्रम कोंडीत सापडण्याचा किंवा रेसिंग होण्याचा धोका संभवतो. एका बहुसूत्री कार्यक्रमाची निरनिराळी सूत्रे एकाच प्रक्रियकावरून आलटून-पालटून कार्यान्वित करता येतात किंवा बहुप्रक्रियक संगणकात एकाच वेळी निरनिराळ्या प्रक्रियकातही कार्यान्वित होऊ शकतात.

काही उपयोजनांमध्ये,  विशेषत:  शास्त्रीय  समस्या  सोडविणाऱ्या काही उपयोजनांमध्ये, मुळातच मोठया प्रमाणावर समांतरता असते.  उदा., अनेकदा एकच प्रक्रिया माहितीच्या कित्येक संचांवर करावयाची असते. त्यांचे कार्यक्रमण समांतर कार्यक्रमण पद्धतीने करता येते व वृंद संगणक (कॉम्प्युटर क्लस्टर) याचा वापर करून कार्यक्रमाचे समांतर विभाग वृंदातील निरनिराळ्या संगणकांवर कार्यान्वित करता येतात.

समांतर कार्यक्रमण व बहुसूत्री कार्यक्रमाचा वापर प्रामुख्याने कार्य-वाहीची गती वाढविण्यासाठी केला जातो. त्याचबरोबर कार्यक्रमाचे अभिकल्पन सुटसुटीत होणे, तो अधिक विश्वसनीय बनविणे, वापरकर्त्याला शीघगतीने प्रतिसाद देता येणे असे अनेक फायदे यातून मिळतात. मात्र सर्व उपयोजनांमध्ये अशी समांतरता असेलच असे नाही. त्यामुळे कार्यक्रम बहुसूत्री बनविण्यासाठी योजलेल्या उपायांमुळे कार्यक्रमातील प्रक्रिया कमी होण्याऐवजी वाढणार नाही याकडे लक्ष द्यावे लागते व मूळ उपयोजन समांतर कार्यवाहीला अनुकूल आहे हे तपासून घ्यावे लागते.

वस्तु-अभिमुखी कार्यक्रमण : परंपरागत कार्यक्रमणामध्ये सॉफ्टवेअरचे दोन भाग पाडले जातात. पहिला भाग कार्यक्रमाशी संबंधित  माहितीचा बनतो, तर दुसरा भाग त्या माहितीवर कृती करणाऱ्या आदेशांनी बनलेल्या कार्यक्रमाचा असतो. माहिती व कृती हे स्वतंत्र ठेवले जातात. कार्यक्रम एकापुढे एक येणाऱ्या अनेक उपकार्यकमांचा बनलेला असतो. विविध उपकार्यक्रम कोणत्याही माहितीवर कृती करू शकतात. त्यामुळे कार्यक्रमाच्या विविध भागांचे परस्परावलंबित्व अतिशय गुंतागुंतीचे होते  व कार्यक्रमात एके ठिकाणी काही बदल झाल्यास त्याचा परिणाम कित्येक ठिकाणी होऊ शकतो. अशा कार्यक्रमातील पुनरावर्तने व शाखाक्रमणे एकमेकांत गुंतत जातात. खूप मोठया आकारमानाचे सॉफ्टवेअर असेल  तर त्याचा विकास, दोषनिरसन, सुधारणा व देखभाल ही कामेही अतिशय कठीण होतात. या अडचणींतून मार्ग काढण्यासाठी वस्तु-अभिमुखी कार्यक्रमण पद्धतीचा विकास करण्यात आला. यात संस्करण करावयाच्या माहितीचा विशिष्ट भाग व त्यावर करण्याच्या संबंधित कृती अशा मिळून निरनिराळ्या सॉफ्टवेअरी वस्तू बनविल्या जातात. वास्तव जगातील वस्तूंशी या कल्पनेचे साधर्म्य असल्याने वास्तव वस्तूंच्या प्रतिकृती सॉफ्टवेअरच्या साहाय्याने बनविणे कठीण जात नाही. सॉफ्टवेअरी वस्तूंचे वर्णन   दोन गोष्टींनी करता येते : एक, त्या वस्तूची स्थिती दर्शविणारी माहिती  व दुसरी, त्या वस्तूची वर्तणूक दर्शविणाऱ्या कृती. मोटारगाडीचे उदाहरण घेतले तर तिचा वेग व दिशा, तसेच तिच्या दिशाबदल, वेगबदल, क्लच, वेगवर्धक व गतिरोधक या नियंत्रकांची स्थिती हे सर्व मिळून मोटारगाडीची स्थिती दर्शविता येते. वेग वाढविणे, गतिरोधन करणे, दिशा बदलणे अशा कृतींनी मोटारगाडीची वर्तणूक ठरते. सॉफ्टवेअरी वस्तू-देखील अशा स्थितिदर्शक माहिती व त्यावर करावयाच्या कृती यांनी  मिळून बनतात. अशा वस्तू म्हणजे एकेक स्वतंत्र घटक समजून तयार केलेल्या कार्यक्रमणाला वस्तु-अभिमुखी कार्यक्रमण म्हणतात. या लेखातील मोटारगाडीचे उदाहरण केवळ संकल्पना स्पष्ट करण्यासाठी घेतले आहे, कार्यक्रमणाचे उदाहरण म्हणून नाही.

परंपरागत कार्यक्रमण आज्ञार्थी स्वरूपाचे असून त्याचा प्रमुख दृष्टिकोन माहितीवर टप्प्याटप्प्यांनी केल्या जाणाऱ्या कृती असा असतो, तर वस्तु–अभिमुखी कार्यक्रमणात एकमेकींशी संवाद साधणाऱ्या, स्वतंत्र, पुनर्वापर करता येणाऱ्या वस्तू हा दृष्टिकोन प्रमुख असतो. वस्तु-अभिमुखी   कार्यक्रमणाचे पमुख गुणधर्म पुढीलप्रमाणे आहेत :

(१)  कोशीकरण : सॉफ्टवेअरी  वस्तूमध्ये  वस्तूच्या  माहितीला कृतींनी वेष्टित केले जाते. त्यामुळे माहितीतील तपशील बाह्य कार्यकमां-पासून अलग ठेवता येतात. बाह्य कार्यकमांना विशिष्ट वस्तू व तीवर करता येणाऱ्या कृती एवढीच माहिती घेऊन कार्य करता येते. त्यांना त्यांच्या तपशिलात जाण्याची गरज नसते. मोटारगाडी या वस्तूला बाह्य कार्यक्रम केवळ वेग वाढविणे, दिशा बदलणे असे आदेश देऊ शकतात. त्यांना तिच्या गतिरोधक, वेगवर्धक इत्यादींच्या स्थिती जाणण्याची गरज नसते.

वस्तूंचे असे कोशीकरण केल्यामुळे वस्तूत काही बदल झाले तरी उर्वरित कार्यक्रम बदलावा लागत नाही. उदा., साध्या वेगबदलाऐवजी   स्वयंचलित वेगबदल असणारी मोटारगाडी वापरली तर फक्त मोटारगाडी या वस्तूचा कार्यक्रम बदलावा लागतो. बाकीचे सर्व कार्यक्रम अबाधित राहतात. परंपरागत कार्यक्रमणात गतिरोधक, वेगवर्धक यांवर कृती करण्यासाठी दिलेले आदेश संपूर्ण कार्यक्रमभर विखुरले गेले असते व मोटारगाडी बदलल्यास संपूर्ण कार्यक्रमाचे नूतनीकरण करावे लागले असते.

सॉफ्टवेअरी वस्तू एकमेकींना संदेश पाठवून संवाद साधतात. संदेशां-मध्ये वस्तूचे नाव करण्याची कृती व आवश्यक संबंधित माहिती अंतर्भूत असतात. उदा., मोटारगाडी या वस्तूला ‘५० मी. अंतराच्या आत गाडी थांबवा’ असा  संदेश  पाठविता  येतो.

(२) आनुवंशिकता : सॉफ्टवेअरी वस्तूंचे वर्ग व उपवर्ग बनविता येतात. वर्गाचे गुणधर्म उपवर्गात आनुवंशिकतेच्या तत्त्वानुसार समाविष्ट करता येतात. उदा., वाहन या वर्गाचे चाके, गती, दिशानियंत्रक हे प्रचल एका उपवर्गात समाविष्ट होऊ शकतात. या वर्गाचा दुचाकी हा उपवर्ग तयार केला तर वरील गुणधर्म त्याला आपोआप प्राप्त होऊ शकतात. याशिवाय स्टॅन्ड हा जास्तीचा प्रचलही समाविष्ट करता येतो. वर्ग, उपवर्गांचे असे अनेक स्तर असू शकतात. विशिष्ट कंपनीची दुचाकी हा दुचाकी या उपवर्गाचा उपवर्ग असू शकतो. माहितीप्रमाणेच कृतींनाही आनुवंशिकतेचे तत्त्व लागू होते. यामुळे एखादया वर्गाच्या सॉफ्टवेअरवरून उपवर्गाचे सॉफ्टवेअर  बनविणे  सुकर  बनते.

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

(३) बहुरूपता : वस्तूंनी उपलब्ध करून दिलेल्या इंटरफेसद्वारा त्या वस्तूंवर कृती करता येतात. जोपर्यंत इंटरफेस अबाधित आहे तोपर्यंत त्या कृतीची प्रत्यक्ष कार्यवाही कशी केली जाते त्याच्या तपशिलात जाण्याची बाह्य कार्यकमांना गरज नसते. त्यामुळे एखादया वर्गाचा इंटरफेस उपवर्गाला वापरता येतो. त्याची प्रत्यक्ष कार्यवाही निराळी असू शकते. उदा., भूमितीय आकार या वर्गात मोडणाऱ्या वस्तूंसाठी तयार केलेली क्षेत्रफळ काढण्याची कृती त्याच्या वर्तुळ, चौरस या उपवर्गांनाही वापरता येते. प्रत्यक्षात क्षेत्रफळ  काढण्याचे  सूत्र  आकाराप्रमाणे  बदलते.

वस्तु-अभिमुखी कार्यक्रमाचे फायदे : वस्तूंचे स्वतंत्र कार्यक्रमण केल्याने गुंतागुंतीचे सॉफ्टवेअर बनविणे व त्याचे व्यवस्थापन करणे ही कार्ये सुकर झाली आहेत. अनेक सॉफ्टवेअरी वस्तूंचा विविध कार्यकमांमध्ये पुनर्वापर करता येतो.सॉफ्टवेअरी वस्तू बाजारातून खरेदी करून वापरता येतात. एखादया वस्तूमध्ये बदल झाल्यास संपूर्ण कार्यक्रम बदलावा लागत नाही. वास्तव जगातील वस्तूंची प्रतिकृती बनविण्यासाठी या पद्धतीचे कार्यक्रमण सोयीचे आहे. या कार्यक्रमाची वाचनीयता व आकलनीयता अत्यंत चांगली असते. हे कार्यक्रम कमी वेळात विकसित करता येतात. परंपरागत उच्च्स्तरीय भाषांमध्ये वस्तु-अभिमुखी कार्यक्रमण करणे तत्त्वत: शक्य असले तरी अत्यंत क्लिष्ट बनते. त्यामुळे ‘ सी प्लसप्लस ’, ‘ जावा ’ अशा भाषा खास वस्तु-अभिमुखी कार्यक्रमणासाठी तयार करण्यात आल्या आहेत.

वस्तु-आधारित कार्यक्रमण असा एक शब्दप्रयोगही प्रचलित आहे. त्याचे वस्तु-अभिमुखी कार्यक्रमणापासून वेगळेपण असे की त्यामध्ये आनुवंशिकतेच्या गुणधर्मांचा  अभाव  असतो.

सॉफ्टवेअर व सॉफ्टवेअर-अभियांत्रिकी : एक किंवा अधिक संगणक-कार्यक्रम व संबंधित माहिती या सर्वांच्या मिळून बनलेल्या, एखादया उपयोजनाशी संबंधित समुच्चयाला सॉफ्टवेअर असे म्हणतात. उदा., संगणक चालविण्याचे कार्य करून वापरकर्त्याला त्यासाठी विविध सुविधा पुरविणारे सॉफ्टवेअर ‘ संगणक-प्रणाली सॉफ्टवेअर ’ या गटात  मोडते. यात परिचालन प्रणाली, वापरकर्त्याशी संवाद साधणारा आलेखिकी इंटरफेस, आदान-प्रदान उपकरणांचे चालक कार्यक्रम इत्यादींचा समावेश होतो. यांखेरीज संगणकावर अनेक उपयोजन सॉफ्टवेअरे भरलेली  असतात. ती विशिष्ट विषयांशी संबंधित कार्ये करतात. शब्दप्रक्रियक, कोष्टकप्रक्रियक, डेटाबेस, वैज्ञानिकी, अभियांत्रिकी तसेच गणितविषयक कार्यक्रम अशी कित्येक उपयोजन सॉफ्टवेअरे वापरात आहेत. संगणक कार्यक्रमण हे सॉफ्टवेअर विकासाचे अत्यंत महत्त्वाचे अंग आहे. एखादी समस्या सोडविण्यातील कोणत्या भागासाठी सॉफ्टवेअर वापरणे फायदेशीर होईल ते ठरविणे, त्यासाठी योग्य अशा हार्डवेअर व सॉफ्टवेअर मंचाची निवड करणे, सॉफ्टवेअरविषयक आवश्यक ते सर्व दस्तऐवज बनविणे व सॉफ्टवेअरच्या चाचण्या घेऊन त्यातील दोषनिरसन करणे, अशी अनेक कार्ये सॉफ्टवेअर विकासांतर्गत येतात.

संगणक क्षेत्राचा जसजसा विकास होत गेला तसतसा सॉफ्टवेअरचा वापर कित्येक क्षेत्रांमध्ये होऊ लागला आणि अत्यंत गुंतागुंतीचे व मोठया आकारमानाचे सॉफ्टवेअर बनविले जाऊ लागले. त्यामुळे ते एकट्या-दुकट्या व्यक्तीचे कार्य न राहता सांघिक कार्य बनले. अनेक महत्त्वाच्या उपयोजनांमध्ये वापर केला गेल्याने सॉफ्टवेअरमधील दोषांमुळे जीवित वा वित्त हानी होऊ नये याची काळजी घेणे क्रमप्राप्त झाले. या सर्व परिस्थितीमुळे सॉफ्टवेअर-अभियांत्रिकी हे शास्त्र उदयास आले. सॉफ्टवेअर हे एक उत्पादन मानून त्याचे अपेक्षित कार्यमान, विश्वासार्हता, त्यासाठी येणारा खर्च व उपलब्ध निधी, विकासासाठी उपलब्ध असलेला निधी या सर्वांचा विचार करून किमान दर्जाची ग्वाही देणारे सॉफ्टवेअर तयार करणे हे सॉफ्टवेअर-अभियांत्रिकीचे उद्दिष्ट असते. इन्स्टिट्यूट ऑफ इलेक्टि्नकल अँड इलेक्ट्रॉनिक एंजिनियर्स या आंतरराष्ट्रीय संस्थेच्या व्याख्येप्रमाणे सॉफ्टवेअर-अभियांत्रिकी म्हणजे सॉफ्टवेअरचा विकास व देखभाल यांसाठी पद्घतशीर, शिस्तबद्घ आणि मापनीय, गणनीय मार्गाचा अवलंब करणे. आधुनिक दर्जेदार सॉफ्टवेअर उत्पादनांची निर्मिती व देखभाल यांसाठी संगणकविज्ञान, प्रकल्प व्यवस्थापन, उपयोजनांतील विशिष्ट विषयांचे ज्ञान आणि इतर तंत्र व कौशल्ये यांचा वापर केला जातो. यामध्ये समस्यांची नीट मांडणी, त्यावरील उत्तरांचा शोध, त्यातील निवडलेल्या उत्तरांची उत्कांती, शुद्घीकरण व सिद्घता या प्रक्रियांचा समावेश होतो.

सॉफ्टवेअर-अभियांत्रिकीनुसार सॉफ्टवेअरचा विकास व उत्पादन करण्यामध्ये पुढील टप्पे येतात : (१) उपयोजनाच्या गरजांचे पृथक्करण : सॉफ्टवेअरकडून असलेल्या वापरकर्त्यांच्या नेमक्या अपेक्षा व उप-योजनाच्या गरजा यांचा अभ्यास करून त्यांना अंतिम स्वरूप देणे. (२) कार्यप्रणालीचे वर्णन: पहिल्या टप्प्यातील गरजा पूर्ण करण्यासाठी सॉफ्टवेअरला कराव्या लागणाऱ्या सर्व कार्यांचे नेमके वर्णन करून त्यांचे कार्यमान, विश्वासार्हता व सुसंगतपणा यांची उद्दिष्टे ठरविणे. (३) अभिकल्पन: दुसऱ्या टप्प्यातील कार्ये पार पाडण्यासाठी त्यांची सुटसुटीत आकारमानाच्या कार्यकक्षांमध्ये विभागणी करून एकूण सॉफ्टवेअरच्या कार्याचे अभिकल्पन करणे. (४) अंमलबजावणी: तिसऱ्या टप्प्यात ठरविलेल्या कार्यकक्षांपमाणे कार्ये पार पाडणारे संगणक कार्यक्रम तयार करून नमुना माहितीवर त्याची चाचणी घेणे. (५) परीक्षण: सॉफ्ट-वेअरला प्रत्यक्ष कार्यवाहीच्या वेळी प्राप्त होऊ शकणाऱ्या आदानांच्या सर्व शक्यता ध्यानात घेऊन त्याप्रमाणे नियोजित परीक्षण पद्धतीनुसार सॉफ्ट-वेअरचे परीक्षण करणे. (६) देखभाल:सॉफ्टवेअरच्या प्रत्यक्ष वापरानंतर समजलेल्या दोषांचे निरसन करणे आणि परिस्थितीतील बदलानुसार आवश्यक ते बदल व सुधारणा करणे.

 

वरील प्रत्येक टप्प्यानंतर आवश्यकता असल्यास मागील टप्प्याला पुनर्भेट देऊन त्यात सुधारणा करण्याची पद्धती अंमलात आणता येते. टप्प्याटप्प्यांनी बनलेल्या सॉफ्टवेअर विकासाच्या या पद्धतीची प्रतिकृती आ. २ मध्ये दर्शविली आहे. तिच्या स्वरूपावरून तिला धबधबा प्रतिकृती असे म्हणतात. प्रकल्पाच्या सुरूवातीस वापरकर्त्याला त्याच्या गरजांचे नेमके ज्ञान असेल, तर ही प्रतिकृती सॉफ्टवेअर विकासास उपयुक्त ठरते. प्रत्यक्षात कित्येक वेळा सॉफ्टवेअरचा विकास होऊन त्याच्या प्रत्यक्ष वापरानंतर वापरकर्त्याला स्वत:च्या गरजांमध्ये सुधारणा करण्याची आवश्यकता भासते. त्यामुळे शेवटच्या टप्प्यावरून पुन्हा पहिल्या टप्प्याकडे जाऊन सर्व विकास प्रक्रिया पुन्हा पार करणे उचित ठरते. पुनरावर्तनांनी सॉफ्टवेअरच्या अधिकाधिक सुधारित आवृत्त्या बनविणाऱ्या या प्रतिकृतीस मळसूत्राकार प्रतिकृती म्हणतात. या प्रतिकृतीमध्ये पहिल्या आवर्तनामध्ये प्राधान्यकमात वरच्या स्थानी असलेल्या आवश्यक बाबींवर लक्ष केंद्रित केले जाते व नंतरच्या प्रत्येक आवर्तनामध्ये अधिकाधिक तपशील भरून नेमकेपणा आणला जातो.

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

पाहा : माहिती संस्करण; संगणक; संगणक आलेखिकी; सदृशीकरण.

संदर्भ : 1. Bhate, Saroja Kak, Subhash Panini’s Grammar andComputer Science, Pune, 1993.

2. Gamma, Erich Vlissides, John Johnson, Ralph Helm, Richard (Designed by GradyBooch) Design Patterns : Elements of Reusable Object-Oriented Software, 1998.

3. Knuth, Donald E. The Art ofComputer Programming Volumes 1-3, 1998.

4. Rao, T. R. N. Kak, Subhash Computing Science in Ancient India, Louisiana, 1998.

5. Roy, Peter Van Haridi, Seif Concepts, Techniques and Models of Computer Programming, 2004.

6. Sebesta Robert W. Concepts of Programming Languages, 2003.

7. Sommerville, Ian Software Engineering, 2008.

8. Vliet, Hans Van Software Engineering : Principles and Practice,2000.

आपटे, आल्हाद गो.