using namespace std;

प्रथमच C++ शिकणाऱ्या जवळपास प्रत्येक विद्यार्थ्याला छळणारे असे हे स्टेटमेंट…! विशेष करून चौकस बुद्धी असणाऱ्या सर्व विद्यार्थांचा हा छ्ळ C++ चा अभ्यासक्रम पुर्ण झाल्यानंतर सुद्धा सुरू असतो. हा सर्व मनस्ताप होतो ते पडणाऱ्या अनेक प्रश्नांच्या मुळे… जसे की

  • namespace म्हणजे नेमका काय प्रकार आहे…?
  • Using namespace std असे का लिहायचे…?
  • Std अशा नावाचे नेमस्पेस कुठे आहे, कोणी तयार केले वगैरे वगैरे….
  • दरवेळी std हेच नेमस्पेस वापरले व दुसरे वापरलेच नाही तर हे कशाला वापरायचे…?
  • Std हे एकच नेमस्पेस आहे की अजूनही काही नेमस्पेस आहेत…?
  • आपल्याला स्वत:ला असे उद्योग करता येतात काय?
  • आपण फाइल include करतोच तर मग नेमस्पेस चा उल्लेख का करावा लागतो वगैरे वगैरे…

शिवाय viva ला अथवा interview ला यावर प्रश्न विचारतील ही मनात भिती असतेच. त्यामुळे पाठ करून उत्तर देउन वेळ मारून दिली म्हणजे काम भागते असाच प्रकार होतो. हे सर्व नको म्हणून हि पोस्ट…

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

एखादा प्रोग्रॅम जसा जसा कॉंम्प्लेक्स होत जातो त्यावेळी व्हेअरेबल्सची संख्या वाढत जाते. एखाद्या कपाटा मध्ये किंवा ऑफीस टेबल मध्ये आपण जसे वेगवेगळे कप्पे केले की वस्तू ठेवता येतात तसेच कप्पे C++ मध्ये करण्याची सोय स्ट्राउस्ट्रुप ने करून ठेवली व त्यालाच नेमस्पेस म्हणतात. व्हेअरेबल्स व फंक्शन्सची नेम्स conflict होउ नयेत हा उद्देश त्या मागे आहे.

या ठिकाणी usingnamespace हे दोनही C++ मधील keywords आहेत हे लक्षात घ्या.

समजा एकदम बेसीक प्रोग्रॅम तुम्ही लिहीला… Hello World चा…. तर तो साधारण पणे असा असतो…

01

आता या प्रोग्रॅम मध्ये cout प्रिंटींग करण्यासाठी वापरला आहे व endl हा नेक्स्ट लाइन ला कर्सर नेण्यासाठी वापरला आहे. हे सर्व शक्य झाले आहे ते std या नावाच्या नेमस्पेस मुळे…. ते कसं काय झालं…?

तर हेडर फाइल हा कंसेप्ट सुरवातीच्या C++ मधून काढून टाकला व C++ मधील जवळपास सर्व फीचर्स C++ च्या standard library मधील एका ठरावीक भागामध्ये टाकली व त्या स्पेस ला std असे नेम दिले… म्हणून std हे C++ चे predefined namespace आहे ज्या मध्ये cout, cin, string, vector, map इत्यादी. सर्व ठेवले आहे. अर्थातच cout, cin या सारख्याचा वापर करतांना ते कोठून घ्यायचे असे कंपायलरला सांगण्यासाठी आपल्याकडे दोन मार्ग आहेत.

एक म्हणजे वरील प्रोग्रॅम मध्ये वापर केल्याप्रमाणे सुरवातीलाच using namespace std असे स्टेटमेंट लिहून कंपायलरची भुक भागवायची…. त्यामुळे त्या नंतर तुम्ही std मध्ये उपलब्ध असलेल्या objects, variables, function या कशाचाही उल्लेख करतांना कंपायलरला संभ्रम पडणार नाही.

दुसरा मार्ग म्हणजे using namespace std असे स्टेटमेंट न लिहीता… कोणतीही व्हेअरेबल्स, ऑब्जेक्ट्स, फंक्शंन्स वापरतांना ती कोणत्या namespace मधील आहेत याचा प्रत्येक वेळी उल्लेख करायचा. जसे की या खालील प्रोग्रॅम मध्ये केला आहे

02

कंपायलरला नेम conflict मुळे संभ्रम न करण्याच्या नादात आता या दोनही मधील कोणता मार्ग वापरावा या बद्दल मात्र नक्की संभ्रम झाला असेल. त्यापैकी पहीली पद्धत जवळपास सर्व ठिकाणी शिकवली जाते व ती सुटसुटीत आहे. पण दुसरी पद्धत वापरणेच चांगले असे तज्ञ प्रोग्रॅमर लोकांचे म्हणणे आहे. याचे कारण म्हणजे दुसऱ्या पद्धती मध्ये स्पेसीफीकली कंपायलरला तुम्ही डायरेक्ट करत आहात. ज्यावेळी दोन कींवा जास्त नेमस्पेस प्रोग्रॅम मध्ये वापरले जातात त्या वेळी हीच दुसरी पद्धत वापरली जाते.

उदा: std या नेमस्पेस मध्ये count नावाचा identifier आहे. Count हे नाव इतके कॉमन आहे की तुम्ही डिक्लेअर केलेले count व std या namespace मध्ये असलेले count या मध्ये कंपायलरची सहजासहजी गफलत होउ शकते. त्यामुळे दुसरी पद्धत good programming practice समजली जाते…..!

03

आता प्रश्न असा उरतो की std शिवाय काही namespace आहेत की नाही… तर तुम्हाला कायम लागणारी सर्व फंक्शनॅलीटी std या नेमस्पेस मध्ये टाकली आहे. या व्यतीरीक्त अजून दोन नेमस्पेस प्रामुख्याने C++ च्या लायब्ररी मध्ये आहेत. ती म्हणजे abi आणी __gnu__.

तुम्ही स्वत: चे नेमस्पेस सुद्धा

namespace  <name space name>
{

identifier list

}

स्वत:ची नेमस्पेस तयार करून व्हेअरेबल्सची होणारी नेम conflicts तुम्ही टाळू शकता. शेवटी आपल्या आयुश्यात गोंधळ न होण्यासाठी आपण काही उपाय योजना करतो त्याच प्रमाणे असा सावळा गोंधळ प्रोग्रॅम लिहीतांना होउ नये म्हणून स्ट्राउस्ट्रुपने ही व्यवस्था केली असावी…!

 

Types of Pointers in C as it is…!

पोस्ट ला नाव असं का दिल असेल?

आपण लहानपणा पासून बघत आहोत, ऐकत आहोत “भगद्वतगीता – जशी आहे तशी”… ना आपण ती वाचतो, समजा अगदीच ती वाचली तर ना आपणाला ती समजते, आणी समजा ती समजली तर आपल्याला समजण्याची पद्धत हि दुसऱ्यापेक्षा वेगळी असू शकते कारण श्रीकृष्णाचे रुपं च तसं होत अर्जुना ला दिसलेलं…! असो…

मी या पोस्ट मध्ये Types of pointers in C वर लिहायचं ठरवलयं…

ज्या व्हेअरेबल मध्ये दुसऱ्या व्हेअरेबल चा address ठेवता येतो अशा प्रकारच्या व्हेअरेबल ला पॉइंटर व्हेअरेबल म्हणतात इतकी सोपी व सरळ व्याख्या असुन सुद्धा पॉइंटर वापरतांना झालेला गोंधळ हा प्रोग्रॅमरच्या पाचवीला पुजलेला असतो.

Bhagavad-Gita

शिवाय भगवद्गगीते मध्ये जशी कृष्णाची अनंत रुपे अर्जुनासमोर उभी रहातात त्याच प्रमाणे पॉइंटरची वेगवेगळी रुपं सुद्धा C प्रोग्रॅमरला दिसत जातात.

मनात आलं म्हणून हि पोस्ट लिहीते आहे… हि सगळी रुपं मला ज्या प्रमाणे दिसली तशी…!

आकर्षक images टाकून TV किंवा Newspaper प्रमाणे TRP वाढवण्याचा माझा मुळीच उद्देश नाही पण मी ज्यावेळी पॉइंटर ला बघते त्यावेळी मला तो श्रीकृष्णासारखाच दिसतो म्हणून हि image टाकली…! 🙂

Integer/float/character pointer

C language मधील बेसीक डेटा-टाइप असला व त्याच्या व्हेअरेबल्सचा address ठेवायचा असला तर तुम्हाला corresponding प्रकारचा पॉइंटर म्हणजेच पॉइंटर व्हेअरेबल लागते. जसे की या तीन व्हेअरेबल्स चे पॉइंटर्स कसे आहेत पहा या प्रोग्रॅम मध्ये दिसेल…

खरं तर पॉइंटर हा derived data type. म्हणजेच basic data type  पासून तयार झालेला किंवा केलेला म्हणा हवं तर. म्हणून की काय डेनीस ने star (*) operator हा पॉइंटर डिक्लेअर करण्यासाठी सुचवला. डिक्लेअर करण्यासाठी तोच व पॉइंटर ज्या ठिकाणी पॉइंट करतो त्या ठिकाणची व्हॅल्यु मिळवण्यासाठी सुद्धा तोच. म्हणजे star operator याच ठिकाणी double role करतोय. शिवाय binary operator या रुपात काम करतांना तो multiplication operator म्हणून सुद्धा काम करतो…

आता integer pointer, character pointer, float pointer हि पॉइंटर्सची साधी-भोळी रुपं… पण हि खरं तर वादळापुर्वीची शांतता असते कारण खरे रंग तो नंतर दाखवायला सुरवात करतो ज्यावेळी तुम्ही प्रथम array शिकतांना भेटता त्यावेळी.

Array च्या पहील्या element च्या address ला base address म्हणतात व तो array च्या नावामध्ये स्टोअर केला जातो किंवा असतो असे काहीतरी तुमच्या कानावर पडते. तुमच्या पॉइंटर विषयीच्या ज्ञानाला पहीला सुरुंग बसतो तो या ठिकाणी… तो धक्का सुद्धा तुम्ही कष्टाने पचवता. पण तेवढ्यात पॉंइटर arithmetic हा प्रकार तुमच्या नजरेला येतो. त्या ठिकाणी अनेक विद्यार्थ्यांची जी घसरण सुरू होते ती शेवटपणे थांबत नाही कारण त्या नंतर तुमच्या कानावर double dimensional array, string manipulation, structure pointer येउन पडतात व तुम्ही अर्धमेले व्हायला सुरवात होते. शेवटी file pointer हा जो काही येतो तो तुम्हाला पुर्ण नेस्तानाबूत करूनच शांत होतो. 🙁

त्या नंतर मग तुम्ही जे काही शिकता म्हणजे उदा. Dynamic memory allocation मध्ये भेटणार void pointer, data structure मध्ये लागणारे next, previous, first नावाचे pointer, dangling pointer हे जणू तुम्ही तटस्थ वृत्तीने ऐकायला (शिकायला अथवा समजायला नव्हे) सुरवात करता. अर्थात तुमच्या कडे दुसरा मार्गही नसतो हे लक्षात घ्या…! या व्यतिरीक्त function pointer, far pointer, huge pointer, near pointer, wild pointer अशा प्रकारचे जे काही आहेत ते आपण नंतर कधीतरी शिकुया व आत्ता Java सारखी pointer-free language शिकुन मोकळे होउया असा विचार करता…! असो मी या सर्व पॉइंटरची ओळख तुम्हाला करून देणार आहे. ओळख करून घ्यायची कि नाही हे तुम्ही ठरवा… मी तुम्हाला भेटीला घेउन येते ठरावीक अंतराने…

तर मग कशी आहेत रुपं आहेत या सर्व पॉइंटरची…?

आपण सुरवात constant pointer पासून करू…

Constant pointer

विद्यार्थी array शिकतात, स्ट्रिंग टॉपीक शिकतात. प्रोग्रॅम्स सुद्धा लिहीतात. व स्ट्रक्चर, फाईल हॅंडलींग शिकुन मोकळे होतात. पण

#include<stdio.h>
int main()
{

int num[ 5 ] = { 3, 4, 5, 6, 7 };
int i;

for(i=1;i<=5;i++)
{

printf(“%d…”,*num);
num++;

            }

return 0;

}

आणी

#include<stdio.h>
int main()
{

char name[50];
name = “C Programming”;

puts(name);

return 0;

}

या दोनही प्रोग्रॅमचे आउटपुट विचारले की सांगायला मात्र चुकतात. हे दोनही प्रोग्रॅम कंपाइल टाइम एरर देतात त्याचे कारण म्हणजे कॉंन्स्टंट पॉइंटर असते. तुम्ही ज्यावेळी array व स्ट्रिंग डिक्लेअर करता त्यावेळी पहील्या प्रोग्रॅम मध्ये num या array च्या नावामध्येच व स्ट्रिंग च्या name मध्ये array चा base address ठेवण्याचे काम automatically केले जाते. हा पॉंईटर internally तयार करण्याचा उद्योग कंपायलर करत असतो. व हा कॉंन्स्टंट पॉइंटर कॅटेगरीत मोडतो. त्या कारणामुळेच तुम्ही स्ट्रिंग initialize करू शकता, स्कॅन करू शकता पण assignment करू शकत नाही. कारण हा पॉइंटर साधा पॉइंटर नसतो तर कॉंन्स्टंट पॉइंटर असतो. त्यामुळे तो दुसरीकडे पॉइंट करू शकत नाही… हा खाली दिलेला प्रोग्रॅम काळजीपुर्वक पहा. तसेच num++ करू शकत नाही कारण num हा सुद्धा constant pointer या category मध्ये येतो.

अशा प्रकारचा pointer तुम्ही सुद्धा डिक्लेअर करू शकता. जसे की…

int x = 5;
int y = 10
const int *ptr = &x;

*ptr = 20;                                 // invalid
printf(“%d”,x);

मात्र या ठिकाणी const ची position मात्र महत्वाची आहे. कारण जर तुम्ही हाच प्रोग्रॅम

int x = 5;
int y = 10;
int *const ptr = &x;

*ptr = 20;                                 // valid

ptr = &y;                                  // invalid
printf(“%d”,x);

असा लिहीला तर त्याचा अर्थ बदलतो. वर दिलेली दोन examples मध्ये array च्या नावामध्ये base address स्टोअर करतांना जो पॉइंटर internally तयार केला जातो त्याची जातकुळ या पॉइंटर सारखी असते

हे सर्व चांगल्या पद्धतीने समजण्यासाठी मी लिहीलेला Interpreting complex C declarations हि पोस्ट तुम्ही वाचली तर मी काय म्हणते आहे ते तुम्हाला कळेल.

या पोस्टमध्ये मी इतकेच लिहीते. पुढील पोस्ट मध्ये Null Pointer वर सविस्तर चर्चा करते.

Interpreting complex declarations in C

 

march

Left… Right… Left… Right… Left…. Left…. Left… Right… Left

लहानपणी NCC ला कवायत करत असतांना हे कानावर पडायचे… तुम्ही केली असेल तर तुम्हाला सुद्धा आठवत असेल कदाचित… हाच नियम जर तुम्ही थोडासा बदल करून पाळला तर C programming languages मधील complex declarations तुम्हाला वाचायला अडचण येणार नाही… कसे तेच मी सांगणार आहे या पोस्ट मध्ये…

मी १९९८ साली C language शिकल्यानंतर जॉब शोधत होते. त्यावेळचा एक प्रसंग आठवतो. त्यावेळी माझी एक मैत्रीण सॉफ्टवेअर कंपनीमध्ये काम करत होती. एकदा ती म्हणाली schaum series च्या पुस्तकातील C type declaration फक्त वाचायला आली ना तुला तर जॉब मिळुन जाइल. असे अनेक सल्ले मिळायचे तसाच तो सुद्धा होता. पण सल्ला देणारी व्यक्ती ते कसे करायचे हे कधीच सांगत नाही… तुमचा हाच अनुभव असेल ना…?

असो… तर समजा interview ला तुम्हाला

float * (* (*ptr)(int))(double **,char c);

हे डिक्लेरेशन जर वाचायला सांगीतले आणी जर तुम्ही C language शिकतांना जरी अनेक प्रोग्रॅम्स लिहीले असतील व प्रोजेक्ट सुद्धा केला असेल तरी या ठिकाणी तुमची दांडी उडणार हे नक्की. हा काय वेडपटपणा आहे असे तुम्ही interview घेणाऱ्याबद्द्ल चरफडतपणे मनात म्हणाल. हे सर्व काही होउ नये असे वाटत असेल तर पहा तुम्हाला हि पोस्ट मदतीला येते का ते…

अशा प्रकारची डिक्लेरेशन्स अथवा फंक्शन प्रोटोटाइप जरी प्रोग्रॅम मध्ये क्वचितच वापरली जात असली तरी तुमचे C चे ज्ञान दोन-चार प्रश्नात चेक करण्यासाठी हे प्रश्न विचारले जातात. कारण तुम्हाला असा प्रश्न सोडवायला C मधील Data Types, function, array, pointers, string इत्यादीचे सर्व ज्ञान असण्याची जरूरी असते. मग हे सर्व असल्यानंतर कसे सोडवायचे हे…? मात्र हे लक्षात ठेवा की अशा प्रकारची डिक्लेरेशन्स तुम्ही प्रोग्रॅम लिहीतांना लिहू नका…!

spiral rule

तर यासाठी खाली दिलेली पद्धत वापरायची… या पद्धतीला स्पायरल अथवा क्लॉकवाइज रुल असेसुद्धा म्हणतात

  1. प्रथम सगळ्यात आत असलेले व्हेअरेबलचे नाव येइल
  2. शेवटी डिक्लेरेशनच्या सुरवातीला असलेला शब्द येइल
  3. वाचताना शक्य तितके उजवीकडे (Right) जायचे. थांबण्याची जरूरी वाटली कि थांबायचे मग शक्य तितके डावीकडे (left) जायचे. नंतर पुन्हा उजवीकडे जायचे… हे करत असतांना तुम्हाला जे काही मिळेल ते पहील्या व शेवटच्या शब्दामध्ये भरत जायचे…

नाही कळाले ना…? सांगते मी तुम्हाला

आपण काही साधी उदाहरणे घेउ.

04

int x; हे आपण कसे वाचतो तर x (या नंतर उजव्या बाजूला जायचे पण तिकडे काहीच नाही आहे…! म्हणून डाव्या बाजूला जायचे) is a variable whose data type is int

int *ptr; हे कसे वाचतो तर ptr (या नंतर उजव्या बाजूला जायचे पण तिकडे काहीच नाही आहे…! म्हणून डाव्या बाजूला जायचे) is a pointer variable (या ठिकाणी पुन्हा उजव्या बाजूला पहायचे) which can contain an address of integer

समजा आपण

05

अजून एक महत्वाचा कंसेप्ट म्हणजे अनेक वेळा विद्यार्थ्यांचा int *ptr; आणी int* ptr; या दोन स्टेटमेंट पैकी सर्वात योग्य कोणते कारण दोनही पद्धती प्रोग्रॅम मध्ये चालतात. तरी सुद्धा K&R style प्रमाणे पहीली पद्धत जास्त योग्य. कारण त्यामुळे स्टेटमेंट योग्य पद्धतीने वाचता येतेच शिवाय गोंधळ सुद्धा होत नाही जसे की समजा

int* x, y;

या मध्ये x and y दोन्ही pointer variables आहेत की फक्त x हे pointer variable आहे…? गोंधळात पडला असाल कदाचीत…! असो तुम्हीच चेक करा… मला पुन्हा विषयाकडे वळायला परवानगी द्या… तर समजा

double area(int,int); असे डिक्लेरेशन घेतले तर…. area (या नंतर उजव्या बाजूला जायचे व या ठिकाणी फंक्शन चा opening ब्रॅकेट आहे) is a function which takes 2 arguments viz. integer and integer (या ठिकाणी closing bracket मुळे थांबायला हवे व डाव्या बाजूला जायला हवे) and returns double

अजून एक  example पाहू…. थोडे अजून अवघड…

char *name[10];

हे कसे वाचायचे…? तर name is an array of 10 pointers having type char

आता अजून थोडे अवघड व क्लिष्टीक example पाहू जसे की

06

char *(*fp) (int,float*);

मग हे कसे वाचायचे तर… fp is a (या ठिकाणी उजव्या बाजूला गेल्या नंतर ब्रॅकेट येतो म्हणून थांबायचे व डाव्या बाजूला जायचे) pointer (या ठिकाणी पुन्हा ब्रॅकेट आल्यामुळे थांबून उजव्या बाजूला जायचे) to function taking (or passing) two arguments viz. integer and float pointer (या ठिकाणी फंक्शन्चा क्लोजींग ब्रॅकेट आला आहे म्हणून थांबायचे व पुन्हा डाव्या बाजूला जायचे) and returning pointer (पुन्हा उजव्या बाजूला जायचे परंतू येथे सेमी कोलन आहे म्हणून डाव्या बाजूला जायचे) to character

येथे अशीच काही examples मी येथे देत आहे. प्रत्येक डिक्लेरेशन समजावून घ्या…

int (*p) [5];

p is pointer to an array having size 5 of integers

char *x[ 3 ] [ 4 ];

या ठिकाणी वर पाहील्याप्रमाणे final expression x……………………..char अशा प्रकारचे असेल ज्या मध्ये आपल्याला बाकी सर्व details भरायला लागतील… जसे की

  1. x       :  then Turn right
  2. is an array of 3 : then turn right as array notation[ ] has got precedence over pointer *
  3. Arrays of 4 : then take left
  4. pointers       : then take right and you will reach semi colon
  5. to char

x is an array of 3 arrays of 4 character pointers

int *(*a [ 10 ] ) ( );

  1. a is :     then take right
  2. an array of size 10: then take left
  3. pointers :     then take right
  4. to function :           then take left
  5. and returning pointer :           take right
  6. to integer :     take left

मग या पोस्टच्या सुरवातीला जे डिक्लेरेशन दिले आहे ते कसे वाचता येइल…?

float * (* (*ptr)(int))(double **,char c)

  1. ptr is a pointer
  2. to a function that takes as parameter an int,
  3. and returns a pointer
  4. to a function that takes as parameters a pointer to pointer to double and a char,
  5. and returns a pointer to float.

इथे अजुन एक complex declaration कसे वाचता येइल पाहू. हे मी स्टॅक-ओव्हरफ्लो वरून घेतले आहे. रुल्स कसे पाळले आहेत ते फक्त पहा…

int * (* (*fp1) (int) ) [10];

  1. व्हेअरेबल नेम पासून सुरवात करा ————————– fp1
  2. उजव्या बाजूला जा परंतू फक्त ब्रॅकेट ) आहे म्हणून डावीकडे जा जिथे * आहे ————– is a pointer
  3. ब्रॅकेट्स च्या जोडी बाहेर आला की (int) भेटेल ——— to a function that takes an int as argument
  4. पुन्हा डावीकडे जा, ज्या ठिकाणी * भेटत्प —————————————- and returns a pointer
  5. पुन्हा ब्रॅकेट्स च्या बाहेर जा व उजवीकडे तुम्हाला [10] भेटेल ——– to an array of 10
  6. पुन्हा डावीकडे जा तुम्हाला * भेटतो —————————————– pointers to
  7. उजवीकडे गेला तर ; भेटतो म्हणुन पुन्हा डावीकडॆ जा, तुम्हाला int भेटेल ——————————– int.

 

कधी कधी C language मधील const हा modifier सुद्धा डिक्लेरेशन स्टेटमेंट मध्ये तुम्हाला दिसेल व अजून गोंधळ वाढवेल. जसे की

const char **ptr;

हे वाचायचे असेल तर ते ptr is a pointer to pointer to const char असे लिहीता येइल.

या ठिकाणी const या शब्दाची position सुद्धा महत्वाची असते जसे की

char ** const ptr; असे असले तर मात्र ते ptr is a constant pointer to pointer to char असे वाचावे लागेल.

अशीच काही डिक्लेरेशन्स मी खाली अभ्यासा साठी देत आहे. नाही कळाले तर मला कळवा. मी सविस्तर पद्धतीने तुम्हाला सांगेन समजावून.

  1. int i;                                               i is an int
  2. int *p;                                            p is an int pointer (p is pointer to an int)
  3. int a[ ];                                          a is an array of int
  4. int f( );                                           f is a function returning an int
  5. int **pp;                                       pp is a pointer to an int pointer (pp is pointer to a pointer to an int)
  6. int (*pa)[ ];                                  pa is a pointer to an array of int
  7. int (*pf)( );                                   pf is a pointer to a function returning an int
  8. int *ap[ ];                                     an array of integer pointers (ap is an array of pointers to int)
  9. int aa[ ][ ];                                   aa is an array of arrays of int
  10. int *fp( );                                      fp a function returning a pointer of type int
  11. int ***ppp;                                  ppp is a pointer to a pointer to a pointer of type int
  12. int (**ppa)[ ];                             ppa is a pointer to a pointer to an array of int
  13. int (**ppf)( );                              ppf is a pointer to a pointer to a function returning an int
  14. int *(*pap)[ ];                             pap is a pointer to an array of pointers having type int
  15. int (*paa)[ ][ ];                           ppa is a pointer to an array of arrays of int
  16. int *(*pfp)( );                              pfp is a pointer to a function returning a pointer of type int
  17. int **app[ ];                                app is an array of pointers to pointers of type int
  18. int (*apa[ ])[ ];                           apa is an array of pointers to arrays of int
  19. int (*apf[ ])( );                            apf is an array of pointers to functions returning an int
  20. int *aap[ ][ ];                              aap is an array of arrays of pointers having type as int
  21. int aaa[ ][ ][ ];                            aaa is an array of arrays of arrays of int
  22. int **fpp( );                                 fpp is a function returning a pointer to a pointer of type int
  23. int (*fpa( ))[ ];                            fpa is a function returning a pointer to an array of int
  24. int (*fpf( ))( );                             fpf  is a function returning a pointer to a function returning an int

गंम्मत म्हणजे कोणा एका अवलियाने एक ऑनलाइन aaplication ठेवले आहे. http://cdecl.org या वेबसाइटवर तुम्हाला हे मिळेल. त्यामुळे वर दिलेली डिक्लेरेशन्स तुम्हाला पडताळून पहायची असतील तर हे tool वापरायला हरकत नाही.

Boilerplate Code

 

3-idiots-20h

हे पोस्टर मी का टाकले आहे सुरवातीला, ते पोस्ट वाचून झाल्या नंतर कळेल…

भारतीय लेखकांनी programming वर लिहीलेल्या पुस्तकामध्ये हा शब्द फार क्वचित सापडतो पण अनेक फॉरेन ऑथर्सच्या पुस्तका मध्ये किंवा संशोधनपर लेखामध्ये तुम्हाला हा शब्द आढळेल.

dont_repeat_yourself

  1. तुम्ही कॉलेज मध्ये असतांना C under Windows म्हणजेच Win32 programming शिकला असाल तर WinMain मध्ये एक ठराविक कोड तुम्ही सर्व प्रोग्रॅम्स मध्ये copy-paste केला असल्याच आठवत असेल.
  2. C++ कॉलेजमध्ये शिकतांना व नक्की काय करायचे आहे ते न समजता सुद्धा class definition लिहून getdata() आणी putdata() सारखी member functions लिहीली असतील. हि सुद्धा अनेक प्रोग्रॅम मध्ये तुम्ही ठरावीक पद्धतीने थोडेफार बदल करून लिहीला असल्याचे आठवत असेल कदाचित.
  3. HTML वापरून जर तुम्ही कधी वेबसाइट तयार केली असेल तर त्यातील बराचसा code हा एक सारखाच पाहील्यासारखे वाटले असेल.
  4. सध्या तुम्ही जावा/सी/सी++ चे IDE वापरत असाल तर class/file inclusion इत्यादी कोड तुम्हाला तयार करून मिळतो.

boilerplate1

वर दिलेले सर्व प्रकार हे थोड्याफार प्रमाणात Boiler Plate code मध्ये मोडतात…!

प्रोग्रॅमरना कोड लिहीतांना काही ठरावीक कोड पुन्हा पुन्हा लिहीवा लागतो. कॉपी-पेस्ट करून अथवा काहीवेळा थोडाफार बदल करून हाच कोड लिहीण्याच्या प्रकाराला म्हणजेच त्या कोडला Boiler Plate code असे म्हणतात. इंग्रजी ही जगातील सर्वात जास्त प्रवाही व म्हणूनच समृद्ध भाषा आहे हे अनेक शब्द पाहीले की पटते. Boiler Plate Code हा सुद्धा इंग्रजी भाषेचे सौंदर्य अशाच प्रकारे दाखवणारा…

 

 

rails_code

variables declaration, data validation साठी लागणारा टिपीकल कोड, heap वरून मेमरी मिळाली की नाही हे चेक करण्यासाठी डॆटा-स्ट्रक्चर मधील प्रोग्रॅम मध्ये अनेक फंक्शन्स मध्ये लिहावा लागणारा कोड हे सर्व याच Boiler Plate Code मध्ये तुम्ही समजू शकता…!

boilerplate

हा शब्द मात्र प्रिंटींग इंडस्ट्रीमधून import केला यात मात्र थोडेफार मतभेद आहेत. बॉइलर तयार करण्यासाठी स्टीलची प्लेट वापरली जाते. पण अशाच प्रकारची प्लेट न्युजपेपर इंडस्ट्री मध्ये १८ व्या शतकाच्या शेवटी व १९ व्या शतकाच्या सुरवातीला printing करण्यासाठीई वापरली जायची. एकाच प्रकारच्या जाहीराती अथवा टेक्स्ट मॅटर अखंड देशातील सर्व newspaper मध्ये छापायच्या असतील तर बॉइलीग lead हे प्लेटवर ओतुन साचे करण्यात येत असतं व या प्लेट सर्व ठिकाणी प्रिंटींग करण्यासाठी न्युजपेपर कंपनीला पाठवत असतं.

असाच काही तरी repetition of code चा प्रकार प्रोग्रॅमिंग मध्ये आढळल्यानंतर boiler plate code हि संज्ञा रुढ झाली.

मात्र एक महत्वाचे लक्षात ठेवा. Boiler Plate code हि Good Programming Practice समजली जात नाही….!

इंजीनीअरींग आणी डिप्लोमाचे काही विद्यार्थी (यातील अनेक Three Idiots मधील अमीर खान असतात…!) 40 मार्क मिळून पेपर सोडवण्यासाठी मोठ्या उत्तरामध्ये काही भाग पुन्हा-पुन्हा लिहून उत्तर मोठे करून लिहीतात. प्रसंगी पुरवण्या (Suppliment) जोडतात पण पेपर भरतात. जेणेकरून ४० मार्क तरी पडावेत म्हणून…!

हा प्रकार तर real life  मधील बॉइलर प्लेट कोड नसेल ना…?

 

श्रद्धांजली DMR ला…!

Bye-Bye-Orkut-infographic

गेल्याच काही दिवसापुर्वी फेसबुक आणी व्हॉट्स-अप च्या वादळासमोर ऑकृट बंद पडली. काही महीन्यापुर्वी सॅमसंग आणी ऍपल समोरच्या वादळात ब्लॅकबेरी डळमळली. नोकीया सारखी जगप्रसिद्ध कंपनीवर तर सर्व मोबाइल कंपन्यांच्या ऍंण्ड्रॉइड ऑपरेटींग सिस्टीम समोर वाताहत होण्याची वेळ आली. या कंपन्यानी आस्तित्वासाठी काही कमी उपद्व्याप केले नव्हते. पण त्या नजरेआड गेल्याच.

2-23-11-Blog-Promotion-Checklist-Diagram-Image

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

Dennis_Ritchie_John_McCarthy_Steve_Jobs

२०११ चा आक्टोबर महीना तसा वादळी ठरला. ५ आक्टोबर ला स्टिव्ह जॉब्सचा मृत्यु… १० ते १२ आक्टोबरच्या आसपास डेनीस रिचीचा मृत्यु आणी २४ आक्टोबर ला जॉन मकॅर्थी चा मृत्यु…! मी जॉब्स बद्द्ल फार लिहिणार नाही पण इतर दोघांपैकी डेनीस बद्द्ल लिहायचे मनात आले. म्हणून हा लेख. आवडला तर शेअर जरूर करा. सोबत आम्ही वाहिलेली श्रद्धांजली आहेच व्हिडीओ च्या स्वरुपात तो सुद्धा पहा तुम्हाला वेळ असेल तर. शेवटी एक मिनिट शांत उभे राहूनच श्रद्धांजली वहायला हवी असा काही दंडक घालून दिलेला नाहियं…

तर… १२ आक्टोबर हि डेनीस रिची या संगणक शास्त्रज्ञाची पुण्यतिथी.

डेनिस चा जन्म न्युयॉर्कमध्ये ९ सप्टेबर १९४१ चा. त्याला तीन भावंड, दोन भाऊ आणी एक बहीण. डेनीस फिजीक्स व मॅथेमॅटीक्स मध्ये द्विपदविधर झाला ते सुद्धा हार्डवर्ड विद्यापीठातुन. पण दोन्ही विषया मध्ये फारशी गती नव्हती हे तो स्वत:च प्रांजळपणे कबूल करायचा.

शेवटी डेनीस १९६७ साली बेल लॅब्स मध्ये रुजू झाला त्यावेळी त्याच्या बरोबर केन सुद्धा होता. त्यापुर्वी डेनीसचे वडील बेल लॅब्स मध्येच काम करत होते. पण डेनीस वशिल्यावर वगैरे लागला नव्हता…!  पहील्याच वर्षी काम करत असतांना डॉक्टरेट मिळवण्याचा सुद्धा त्याने प्रयत्न केला. सध्या भारता मध्ये PHD मिळवणे खुप सोपे काम असले तरी Program Structure and Computational Complexity या विषयावर संशोधनात्मक प्रबंध सादर करून सुद्धा त्याला डॉक्टरेट मात्र मिळाली नाही.

त्या नंतर मात्र त्याने सहकाऱ्यांच्या बरोबर मुख्यत्वेकरून केन थॉंम्पंसनबरोबर काम करायला सुरवात केली. बेल लॅब्स मुख्यत्वे रिसर्च प्रोजेक्ट्स हातात घ्यायची व डेनीस व केन आला त्यावेळी MIT च्या सहकाऱ्यांच्या बरोबर Multics प्रोजेक्ट त्यानी घेतला होता. पण काही कारणास्तव बेल लॅब्स या संशोधनातुन बाहेर पडली व दुसरा प्रोजेक्ट ची शोधमोहीम सुरू केली. त्यावेळी त्यांना Digital Equipment Corporation साठी ऑपरेटींग सिस्टीम लिहीण्याचा प्रोजेक्ट मिळाला. त्यावेळी त्यांना लॅंग्वेजची जरूरी भासु लागली. मगं केन ने BCPL वर आधारीत B language लिहीली. डेनीस बाजूला असायचाच. B तयार झाली पण त्यामध्ये डेटा-टाइप, स्ट्रक्चर इत्यादी चा अभाव होता. डेनीस ने पुन्हा B वर काम करायला सुरवात केली आणी नवीन लॅंग्वेज लिहीली. ४ वर्षाच्या अथक परीश्रमानंतर C language ला जन्माला घातलं. (History of C)

111014015647-dennis-ritchie-ken-thompson-bell-labs-story-top

याच C चा वापर करून दोघा महाशयांनी मग १९७३ मध्ये UNIX operating system लिहीली व या ऑपरेटींग सिस्टीम ने आजतागायत स्वत:चे स्थान अढळ राखले आहे. मगं गुगल असो वा Apple असो या सर्वाना सर्व काही उद्योग करण्यासाठी UNIX वर अवलंबुन रहावे लागते.

कंप्युटर प्रोग्रॅमिंग शिकणाऱ्या, शिकलेल्या, अथवा सॉफ्टवेअर मध्ये काम करणाऱ्या जगामधील कोणत्याही व्यक्तीला डेनीस हे नाव माहीत असतेच. ते माहीत नसलेच तरी C नावाची programming language तो किंवा ती एकतर शिकलेली असते किंवा आहे हे माहीत असते. याच programming language चा तो जनक अशी त्यांची ओळख. जगभर तंत्रज्ञाना मध्ये इतकी उलथा-पालथ गेल्या २० वर्षापासून होत असतांना सुद्धा व अनेक कंप्युटर प्रोग्रॅमिंग लॅंग्वेजीस येउन गेल्या असतांना सुद्धा C language मात्र १९७१ पासून अनभिषक्त सम्राज्ञी प्रमाणे राहीली.

नोकीयाची सिंबीयन ऑपरेटींग सिस्टीम असो वा ऍंन्ड्रॉइड ऑपरेटींग सिस्टीम असो त्यांना C language ची मदत घ्यावीच लागते हेच तीच्या सौंदर्याचे व ताकदीचे खरे रहस्य. अर्थात तीच्या वर टिका करणाऱ्यांची संख्या कमी नाही. पण टिका करतांना सुद्धा या सर्व टिकाकारांच्या आत C language बद्दल एक आसक्ती असतेच व हे सुद्धा ते मान्य करतात.

एन्ट्री लेव्हल प्रोग्रॅमर…ज्युनिअर डेव्हलपर…सिनीअर डेव्हलपर…टिम लिडर…त्या नंतर प्रोजेक्ट लिडर… मग मॅनेजर… त्या नंतर प्रोजेक्ट मॅनेजर… मग सिस्टीम ऍनेलिस्ट… मग अनेक काही तत्सम पोस्ट… व या एकाच कंपनीत मिळाल्या आहेत अशा किती व्यक्ती तुमच्या आजूबाजूला आहेत ते सांगाल…? बरं काही जणांची नावे सांगाल सुद्धा पण असेल, तर ती व्यक्ती तुम्हाला एखाद्या मोठया कंपनीची मालक वगैरे नक्कीच झालेली आढळेल. राजकारण असो वा व्यवसाय, करीअर  साठी कित्येक जण आज या कंपनीत तर उद्या दुसऱ्या कंपनीत पॅकेज साठी उड्या मारतांना आपण पहातो. व त्याचे ते समर्थन सुद्धा करतात. बरं हे पॅकेजची व्हॅल्यु कधी न संपणारी. त्यामुळे घालमेल, स्पर्धा, वेग, कुरघोडी या सर्व बाबी हि या प्रगतीची दुसरी बाजू. आजुबाजूला पसलेल्या या महाकाय विश्वामध्ये आपण प्रगती, यश याच मोजपट्टीने मोजतो. मग या पुढे आपल्या समोर नावे येतात ती इन्फोसीस, विप्रो… त्याहीपुढे जाउन मग स्टिव्ह जॉब्स, शेवटी बिल गेट्स… आपली बुद्धी तेथे संपते…

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

 

20111105_OBP001

आत्ता तुम्ही अनेक गॅजेट्स वापरत असाल. त्या मध्ये टॅब असेल, स्मार्ट-फोन असेल किंवा ATM असेल. शेवटी सगळ्यांना ऑपरेटींग सिस्टीम वरच काम करायला लागत. आणी हि ऑपरेटींग सिस्टीम कशी काम करेल हे ठरवण्याच काम २ महाभागांनी मागील शतकात करून ठेवलय. त्यापैकी एक म्हणजे डेनीस व दुसरा जॉन मकॅर्थी. गंम्मत म्हणजे हे दोघही मॅथेमॅटीक्स पदवीधर होते. दोघसुद्धा कंप्युटर क्षेत्रामध्ये आले त्यावेळी दोघांच एकच वेड होत ते म्हणजे त्यांना संगणकाशी बोलायची इच्छा होती. १९५८ साली जॉन ने LiSP ला जन्माला घातलं आणी पुढ्च्या दशकात डेनीसन C ला. Lisp हि लॅंग्वेंज सुद्धा एकमेव high level language आहे जी अजुन सुद्धा वापरली जाते. विषेश म्हणजे हे दोघ महाभाग एकाच वर्षी एकाच महीन्यात काळाच्या पडद्याआड गेले. एक सत्तरराव्यावर्षी व दुसरा ८३ व्या वर्षी हा दैवदुर्विलास.

कोट्यावधी डॉलर्सची उलाढाल त्याच्या आजुबाजूला दररोज होत असतांना डेनीस मात्र प्रत्येक दिवशी मुंबईचा चाकरमानी जसा असतो त्याप्रमाणे न्युजर्सीच्या मरे हिल्स मधील AT&T Bell मध्ये काम करण्यासाठी ऑफीस मध्ये जाउन बसायचा. व तेथुनच निवृत्त झाला. आयुष्यभर C language च्या संदर्भात काम करीत राहीला. म्हणूनच कि काय त्याला सॉफ्टवेअर इंजीनीअर असे न ओळखता कंप्युटर सायंटीस्ट असे ओळखले जाते.

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

Left to right Kenneth L. Thompson, Dennis M. Ritchie

हल्ली सॉफ्टवेअर कंपनीमध्ये काम करणारे व श्रेय घेणारे वेगवेगळे असतात हि ओरड कायम मी माझ्या विद्यार्थ्यांकडून ऐकते. हा अवलिया इतका नम्र होता की C language चे श्रेय त्याच्या सहकऱ्यांनी व जगाने त्याला देउन सुद्धा त्याच्या brief bio-data मध्ये मात्र C language चा खरा मानकरी B language डॆव्हलप करणाऱ्या  केन थॉंम्पसन ला दिले आहे. इतकेच नाही तर यांची दोस्ती इतकी घट्ट होती कि त्यांना दिली गेलेली सर्व Awards सुद्धा विभागुन देण्याशिवाय पर्याय उपलब्ध नव्हता. फक्त नजरच टाकांना त्याना मिळालेल्या Awards वर

  • ACM Programming Systems and Language Papers Award (1975)
  • ACM A.M. Turing Award (1983)
  • ACM Software System Award (1983)
  • IEEE Emmanuel R. Piore Award (1983)
  • Ritchie was elected to the National Academy of Engineering (1988)
  • IEEE Richard W. Hamming Medal (1990)
  • IEEE Computer Pioneer Award (1994)
  • Computer History Museum Fellow Award (1997)
  • National Medal of Technology from President Bill Clinton (1998)
  • ACM SIGOPS Hall of Fame Award (2005)
  • Japan Prize for Information and Communications (2011)

C च वैशिष्ठे अनेक सांगता येतील पण सर्वात महत्वाच म्हणजे C च्या पुर्वी व नंतर आलेल्या लॅंग्वेज मध्ये लिहीलेला कोड हा मशीन डिपेंडंट असायचा. हि मक्तेदारी डेनीसने मोडीत काढली. व हेच या लॅंग्वेजचे यश झाले.

नंतर C++ आली. बियान स्ट्राउस्ट्रुपवर C language चा प्रभाव होताच. शिवाय ती सुद्धा AT&T Bell च्या प्रयोगशाळेत मध्येच तयार झालेली. नंतर Microsoft ने आस्तितवात रहाण्यासाठी C# काढली, Apple ने Objective C काढली तर सन मायक्रोसिस्टीम ने Java काढली पण या सगळ्या लॅंग्वेजची पाळेमुळे C लॅंग्वेजमध्येच होती व आहेत.

cool-innovator-marketer-difference1

Apple चा संस्थापक ५ आक्टोबर २०११ साली गेला. जगभर त्याची चर्चा झाली. C चा इन्व्हेंटर १२ आक्टोबर २०११ साली गेला. ते जगाला नाही पण त्यांच्या परीवाराला सुद्धा कळाल नाही. जॉब्सच्या Apple ची ऑपरेटींग सिस्टीम Unix based आहे व ती C मध्येच लिहीलेली…. हेच सुद्धा डेनीसच अजुन एक यश

डेनीस चे इतर उद्योग…!

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

आहेच ती तशी लॅंग्वेज व ती डेव्हलप करणारा अवलिया…

Dennis MacAlistair Ritchie हे त्याचे पुर्ण नाव. म्हणुन त्याचे सहकारी त्याला  DMR अशी हाक मारत असतं. म्हणूनच या पोस्टचे नाव DMR ठेवले.

OLYMPUS DIGITAL CAMERA

 

 

 

 

 

 

 

 

Rest in Peace, Dennis

 

public static void main – God Method

keep-calm-and-chant-public-static-void-main

जावा लॅंग्वेजच्या literature मध्ये एके ठिकाणी public static void main स्टेटमेंट ला God Method असे म्हणले गेले आहे… महाकाय अशा या विश्वाचा सर्व कारभार परमेश्वर एकहाती ज्या पद्धतीने सांभाळत असतो त्याच प्रमाणे हि method जावाच्या application मध्ये सर्व काही करत असते अशा अर्थाने तर लेखकाला असे म्हणायचे असेल कि काय अशी शंका येते…!

कदाचीत म्हणूनच public static void main हे स्टेटमेंट म्हणजे Java language ची ओळख होउन बसली आहे. मग C/C++ language शिकुन आला असेल अथवा नसेल, अनेक विद्यार्थ्यांना या पुर्ण स्टेटमेंटचे कुतूहल पहील्या दिवशी जे तयार होते ते अभ्यासक्रमाच्या शेवटच्या दिवशी पर्यंत तसेच रहाते. म्हणून हि पोस्ट खास या स्टेटमेंट साठी व चौकस बुद्धीच्या विद्यार्थ्यांसाठी…!

खरं तर यातील जवळपास सर्व शब्दांचा संबंध व एकंदरीत संपुर्ण स्टेटमेंटचा संबंध C, C++, Procedure Oriented Programming, आणी Object Oriented Programming या चांडाळ चौकडीशी आहे…! त्यामुळे या चौघांची चांगली ओळख नसेल तर “public static void main म्हणजे काय..?” याचा अर्थ  सांगायचा असेल तर विद्यार्थ्याला पाठ करून उत्तर देणे हाच एकमेव मार्ग शिल्लक रहातो… हे टाळायचं असेल तर ही पोस्ट तुम्हाला कामाला येते का पहा…

जावा (Core Java असे मी म्हणते आहे… Servlet, MIDlet अशा प्रकारच्या जावा बद्दल नाही) च्या प्रत्येक प्रोग्रॅम मध्ये लिहायला लागणारे संपुर्ण स्टेटमेंट public static void main(String[ ] args) असे आहे. या मध्ये public आणी static यांना modifier म्हणतात तर void ला रिटर्न टाइप म्हणतात. गंम्मत म्हणजे main ला C आणी C++ मध्ये फंक्शन म्हणत असले तरी जावा मध्ये मात्र मेथड म्हणतात…!

public static void main च्या नंतर pair of opening व closing brackets आहेत व त्यामुळे ते फंक्शन आहे.

public_static_void_main

Single Entry Point अशी ओळख झालेल्या या main function ला खरं तर प्रसिद्धी दिली ती C किंवा C++ या जोडगोळीने. म्हणुनच कदाचीत त्यांनी जावा लॅंग्वेज मध्ये सुद्धा  starting point of program execution मेन ला करून टाकले.

अर्थात C आणी C++ व्यतीरीक्त Microsoft च्या C#, Visual Basic तसेच Google च्या Go, Python या तुम्हाला माहीत असलेल्या programming language तसेच D, Pike, Haskell, Lisp या तुम्ही न ऐकलेल्या लॅंग्वेजमध्ये सुद्धा main function चा उल्लेख सापडतो.

C आणी C++ मध्ये आपण मेन फंक्शन स्वतंत्रपणे लिहीतो व त्याच्या आत व इतर फंक्शनच्या आत तयार असलेल्या अथवा तयार केलेल्या क्लास चे ऑब्जेक्ट्स तयार करतो. या उलट जावा मध्ये आपण जो काही कोड लिहीतो तो क्लास च्या आत लिहीतो. त्यामुळेच C++ पेक्षा सुद्धा जावा ला परीपुर्ण ऑब्जेक्ट ओरियेंटेड प्रोग्रॅमिंग (Fully Object Oriented Programming) मेथॉडॉलॉजी म्हणतात.

C++ मध्ये आपल्याला क्लास चा प्रायव्हेट/प्रोटेक्टेड डेटा access करण्यासाठी त्याच क्लासमधील मेंबर फंक्शन्स ची मदत घ्यायला लागते व  हे मेंबर फंक्शन कॉल करायचे असल्यास त्या क्लास चा ऑब्जेक्ट तयार करावा लागतो. व त्या नंतर ऑब्जेक्ट डॉट फंक्शन नेम वापरून आपण फंक्शन कॉल करतो. पण काही वेळा ऑब्जेक्ट तयार करण्यापुर्वी अथवा ऑब्जेक्टच्या मदतीशिवाय क्लास मधील फंक्शन कॉल करता यावे म्हणून object oriented programming methodology मध्ये static data व static member फंक्शनची सुविधा सुचवली गेली होती.

नेमकी हिच सुविधा जावा वाल्यांनी चाणाक्षपणे हेरून या ठिकाणी वापरली आहे. त्यामुळेच प्रोग्रॅम execute केल्या नंतर क्लास मध्ये असलेले मेन फंक्शन ऑब्जेक्ट तयार नसतांना सुद्धा कॉल होते… व ते करण्याचे काम जावा चा interpreter करतो… या ठिकाणी कमांड लाइन ला कमांड दिल्या नंतर Java Virtual Machine हे जणुकाही सर्च वॉरंट हातात पडल्या प्रमाणे public static void main ला शोधायला बाहेर पडते…!

आता main method नाही केली स्टॅटीक तर काय अडचण येत असावी…? समजा नाही केली स्टॅटीक तर JVM ला ज्या क्लास मध्ये मेन फंक्शन लिहीले आहे त्याचा इंस्टंन्स (object) तयार करावा लागेल. ती सुविधा JVM मध्ये नाही. शिवाय तशी सुविधा दिली असतीच तर पुन्हा दुसरी अडचण उभी रहाते ती म्हणजे कंन्स्ट्रक्टर over load होत असल्यामुळे JVM पुन्हा अडचणीत सापडू शकते… भरीस भर म्हणून कि काय JVM ला हे सुद्धा माहीत नसते की प्रोग्रॅमर ऑब्जेक्ट तयार करणार आहे की नाही…!

शिवाय जावा मधील क्लास मध्ये तुम्ही जे काही डिक्लेअर करता ते reference च्या स्वरूपात असते व ऑब्जेक्ट तयार करायलाच लागतो. पण स्टॅटीक डेटा व मेथड्स या JVM च्या घर-जावई असल्या प्रमाणे JVM च्या मेमरी मध्ये जातात. अर्थातच मेन फंक्शन स्टॅटीक केल्यामुळे ते सुद्धा JVM च्या अखत्यारीत येते व execute होते…

_house_plans_30x40_site_east_facing

आपल्या घरात प्रत्येक खोलीची प्रायव्हसी वेगवेगळी असते. बेडरूम प्रायव्हेट असते… तर किचन/हॉल बऱ्यापैकी प्रोटेक्टेड कॅटेगरी मध्ये असतो. व्हरांडा वगैरे बंगल्या मध्ये असेल तर त्याला आपण पब्लीक सारखी कॅटेगरी म्हणू शकतो. त्याच प्रमाणे क्लास मेंबर्स हे प्रायव्हेट, पब्लीक अथवा प्रोटेक्टेड असतात. मेन फंक्शन हे बाहेरून कॉल झाल्या शिवाय प्रोग्रॅम execution सुरू होउ शकत नाही म्हणून या मेन फंक्शनचा access specifier पब्लीक ठेवला आहे.

C व C++ प्रमाणेच void हा मेन फंक्शनचा return type आहे.जावा मध्ये मेन फंक्शन काही रिटर्न करत नाही म्हणून सरळ-सरळ व्हॉइड रिटर्न टाइप वापरावा असा दंडक (rule) syntax च्या माध्यमातून घालून दिल्यामुळे C आणी C++ प्रमाणे मेन फंक्शनचा रिटर्न टाइप int लिहू कि void लिहू असा संभ्रम कायमचा निकालात काढून टाकला आहे. आता मेन फंक्शन पुर्वी व्हॉइडच का लिहायचे असा प्रश्न खुप जणांना सतावत असतो. याची अनेक प्रकारे कारणे देता येतील.

१.     जावा डिझायनरनी तसा सिंटॅक्स दिला आहे व व तसे convention आहे

२.     त्यांना म्हणजे जावा लॅंग्वेज डिझायनर्स प्रोग्रॅम execute झाला आहे हे ऑपरेटींग सिस्टीमला सांगण्याची गरज आहे असे मानत नाहीत. ऑपरेटींग सिस्टीमला नंतर करावी लागणारी कामे जावाची मेमरी मॅनेजमेंट चा विभाग विनासायास पार पाडतो.

३.     C, C++ या लॅंग्वेजमधील प्रोग्रॅम शक्यतो single threading प्रोग्रॅम असतात. मेन हाच program entry व exit point असतो. पण Java चे प्रोग्रॅम multi thread असू शकतात. शिवाय जरी प्रोग्रॅमरने single thread प्रोग्रॅम लिहीला तरी JVM (Java Virtual Machine) आपल्या सोयीसाठी त्याचे threads करते व स्वत: त्यामध्ये exit code असतो. म्हणून स्वतंत्र पणे मेन रिटर्न करण्याचे बंधन ना प्रोग्रॅमरला घातले आहे ना स्वत:ला घालुन ठेवले आहे कारण मेन फंक्शन व्यतीरीक्त इतर कोणताहि थ्रेड शेवटी संपू शकतो….!

हे फंक्शन array of strings असे argument घेते व Java मध्ये String (string नाही) असा प्रि-डिफाइंड क्लास आहे. कमांड लाइन वरून प्रोग्रॅम रन करतांना जावा interpreter ला आपण जे arguments पाठवतो त्या सर्व स्ट्रिंगचे pointers मेन फंक्शन ला array च्या स्वरूपात पाठवले जातात. म्हणुनच public static void main(String[ ] args) अशी फंक्शन signature आहे.

मेन फंक्शन कोणते argument घेते असे विचारल्यास अनेक विद्यार्थी args घेते असे ठोकुन देतात. खरं तर args हे फक्त फॉर्मल व्हेअरेबल्स चे नाव आहे. त्याचे नाव कोणतेही ठेवले तरी चालते. उत्तर देतांना array of pointers to string असे द्यायला हवे.

या स्टेटमेंट (खरं तर हि फंक्शन डेफीनीशन म्हणायला हवी) मध्ये ठिकाणी पब्लीक व स्टॅटीक च्या जागांची अदलाबदल केली तरी चालते पण void हा मात्र मेन फंक्शन पुर्वीच आला पाहीजे कारण तोच तर कंपायलरला रिटर्न टाइप सांगण्याचे काम करतो.

tee-shirt

आत्ताच मी जावा मधील मेन फंक्शन च्या signature बद्दल बोलले. प्रत्येकाची signature म्हणजे त्याची एक प्रकारची ओळख असते पण गंम्मत म्हणजे जावा मधील मेन फंक्शनची signature अनेक प्रकारे लिहीता येइल… जसे की

  1. public static void main(String[ ] argument)
  2. public static void main(String argument[ ])
  3. public static void main(String… args)
  4. public static synchronized void main(String… args)
  5. public static strictfp void main(String… args)
  6. public static final void main(String… args)

Note:

Best piece of advice I got when learning to program, and which I pass along to you, is don’t worry about the little details you don’t understand right away. Get a broad overview of the fundamentals, then go back and worry about the details. The reason is that you have to use some things (like public static void) in your first programs which can’t really be explained well without teaching you about a bunch of other stuff first. So, for the moment, just accept that that’s the way it’s done, and move on. You will understand them shortly…. Quote by wellknown programmer