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