Linus Torvalds : ऑपरेटींग सिस्टीम जगतामधील मवाळ क्रांतिकारक…!

Linus Torvalds

Linus Torvalds

लायनस टोर्व्हॅल्ड्स, असा जो याचा प्रचलीत उच्चार आहे तसा तो नाहीयं; तर लिनस तोरवाल्ड्स असा आहे.

कंप्युटर म्हणजे विंडोज. म्हणजे त्यावर तेच असते, दुसरे काही असूच शकत नाही हे सर्वसामान्य युझरचे ज्ञान. थोड्याफार शिकलेल्या विद्यार्थ्यासाठी मॅक ओ.एस.सुद्धा विंडोज सारखच काहीतर प्रकरण आहे, ते ठरावीक मशीनवर चालतं आणि अमेरीकेत वापरतात इतकचं तोडक ज्ञान. हे दोनही वगळून उरले ते नवशिके प्रोग्रॅमर आणि त्यांच्या आजूबाजूला अपवाद वगळता “आठशे खिडक्या नउशे दार” या गाण्याप्रमाणे विंडोजच पहायला मिळायची. त्यामुळे इंजीनीअरींग व डिप्लोमाच्या विद्यार्थ्यांना gcc हा कमांड फक्त imported पुस्तकाच्या झेरॉक्स कॉपी मध्ये दिसायचा व प्रोग्रॅमिंग टर्बो सी मध्येच चालायचे व अजुनही चालते आहे. युनिक्स आणी लिनक्स हे  डॆस्क्टॉप वर नसतात ही सुद्धा एक धारणा. त्यातुनही उरलेले ज्याना लिनक्स-युनिक्स माहीत आहे ते सर्व परदेशात. हि सर्व अवस्था फार पुर्वी नाही तर फक्त १०-१५ वर्षापुर्वीची.

विंडोज ची हि मक्तेदारी खऱ्या अर्थान मोडीत काढायला सुरवात केली ती लिनसनं. आपल्याकडे अल्पसंख्यांकांच राजकारण केलं जातं पण फिनलंड मधील अल्पसंख्यांक जमातीत १९६९ साली जन्माला आलेला हा अवलीया अमेरीकेमध्ये स्थलांतरीत होउन थेट बिल गेट्स व मायक्रोसॉफ्टच्या मक्तेदारी व डिजीटल भांडवलशाही साम्राज्याला भिडला. म्हणून मी क्रांतीकारक असा शब्द वापरला…!

आई व वडील दोघ सुद्धा पुरोगामी व उच्च-शिक्षीत. पण लिनस लहान असतांनाच आई-वडील वेगळे झाले व लिनस आईकडॆ वाढला. आजोबा प्रोफेसर असल्यामुळे पुढील शिक्षण सुरू झाले. सुखवस्तू असल्यामुळे ११ व्या वर्षीच घरी कंप्युटरचे आगमन झाले व बेसीक लॅंग्वेज शिकायला सुरवात केली. प्रोग्रॅमिंग व मॅथेमॅटीक्स चे जबरदस्त वेड. इतक की आजोबानी या तुन बाहेर पडावा म्हणून त्याला खेळाची सवय लावायचा प्रयत्न केला. तो प्रयोग फसला. सोशल होण्यासाठी प्रयत्न केले. ते सुद्धा फसले. शेवटचा उपाय म्हणून मैत्रीणीचा नाद लावायचा मार्ग सुद्धा अवलंबवला. पण या अवलियाने त्याला दाद दिली नाही. पैसे साठवून वयाच्या १७व्या वर्षी नवीन 128KB (MB अथवा GB नव्हे) RAM असलेले अद्यावत मशीन खरेदी केले…! १८ व्या वर्षी हेलसींकी विद्यापीठामध्ये प्रवेश घेउन लगेच C programming language च्या प्रेमात पडला व ३ वर्षाच्या कठोर परीश्रमानंतर ठरवले की ऑपरेटींग सिस्टीम लिहायची तर C language वापरायची.

१९९१ साली त्याने IBM मशीन विकत घेतले. ४ MB RAM. पण यावर असलेल्या MS-DOS ला तो वैतागला होता. म्हणून युनिक्स install करायची होती कारण त्याच्या कॉलेज मध्ये युनिक्स होती. पण युनिक्स प्रचंड महाग होती. त्या काळात जवळपास ५००० डॉलर…! म्हणून ती कल्पना त्याला सोडून द्यावी लागली. व त्याने त्याच्यासारखीच पण कमी क्षमतेची टॅननबॉन ने तयार केलेल्या मिनीक्स या ऑपरेटींग सिस्टीमचा विचार केला. युनिक्स शिकवण्यासाठी टॅननबॉन मिनीक्सचा वापर करायचा. पण त्यामध्ये खुप कमतरता होत्या. म्हणून लिनस ने तीचाही नाद सोडून दिला आणी युनिक्स व मिनीक्स प्रमाणेच स्वत:च ऑपरेटींग सिस्टीम लिहीण्याचा विचार त्याचा मनात सुरू झाला. पण त्या मधील अडचणी, धोके व कॉलेजची वाया जाणारी वर्षे याची त्याला पुर्णपणे जाणीव होती. फिनलंड मध्ये त्या काळी शिक्षण मोफत असायचे व डिग्री ४ वर्षातच पुर्ण केली पाहीजे असा नियम नव्हता. म्हणून त्याने सरळ ब्रेक घेतला. मंध्यंतरी आर्मी मध्ये एक वर्षे काम करून आला कारण तिकडॆ ती अनिवार्य प्रथा होती. १९९१ च्या आसपास मात्र त्याने ऑपरेटींग सिस्टीम वर काम करायला सुरवात केली.  त्यासाठी त्याने मिनीक्स वापरणाऱ्या युझर्स कडून नवीन  पण फुकट देण्याची वचन देणाऱ्या ऑपरेटींग सिस्टीम पासून कोणत्या प्रकारच्या अपेक्षा आहेत हे मागवून घेतले. हे काम जिकरीचे व धाडसाचे होते. म्हणून त्याने काही काळ स्वत:ला एकट्याला कोंडून घेतले व बेसीक व्हर्जन तयार केले. अर्थातच सर्व कोड स्क्रॅच पासून लिहीण्यासाठी त्याने C language चा वापर केला. त्याला त्याने bash shell असे नाव दिले. व बेधडक पणे सर्व सोर्स कोड पब्लीक युझ साठी ftp सर्व्हर वर टाकून दिला. व प्रतिक्रीया मागवल्या. नेटवर्क वर टाकण्यासाठी त्याच्याच एका मित्राने त्याला मोलाची मदत केली.

free-soft

लिनस ने या ऑपरेटींग सिस्टीम ला लिनक्स असे नाव देउन टाकायचा विचार केला. पण स्वत:च्या नावाचा आपण स्वत:च डांगोरा पिटत आहोत अशी भावना निर्माण झाल्याने त्याने नाव Freax असे ठेवले जे Free, freak आणी Minix पासून तयार केले होते. पण ज्या मित्राने ftp server वर लिनस चा सोर्स कोड टाकला होता त्या फोल्डर ला नाव लिनक्स ठेवले होते. शेवटी तेच राहीले…

Richard Stallman

Richard Stallman

नंतर रिचर्ड स्टॉलमन या पेशाने वकील असणाऱ्या व त्याच्या फ्री लायसेंन्स प्रमोट करणाऱ्या GPL under त्याने लिनक्स ऑपरेटींग सिस्टीम रिलीज केली. त्याने युझर्सना अभ्यास करायची, डाउनलोड करायची, मॉडीफाय करायची, एक्सटेंड करायची व प्रसार करण्याची सवलत देउन टाकली. असं फुकट काहीतरी मिळतय असे कळाल्यानंतर लोकांच्या त्यावर उड्या पडल्या तर नवल नव्हतच व लिनक्स चा प्रसार सुरू झाला.

linux-20-años

पाच वर्षात म्हणजे १९९७ पर्यंत ७० लाख installation झाली. अर्थातच प्रसिद्धीला शत्रू लगेच होतात तसे लिनस च्या बाबतीत सुद्धा झाले व टॅननबॉनच्या टिकेला सामोरे जावे लागले. कारण लिनक्स फ्री असल्या मुळे टॅननबॉन सैरभैर झाला.

linux-vs-vista_1024x768

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

Red Hat

Red Hat

१९९९ मध्ये मात्र त्याच्या १५ वर्षाच्या कष्टाला फळ मिळाले व रेड हॅट ने लिनक्स डिस्ट्रिब्युट करायला सुरवात केली व लिनक्स करोडपती झाला. त्या नंतर मात्र त्याने मागे वळून पाहीले नाही कारण नंतर Oracle, Intel, Corel या दिग्गज कंपन्यानी त्यांच्या हार्डवेअर वर लिनक्स पोर्ट करायला सुरवात केली. अर्थात इतके सर्व असूनही लोकांना ती फुकटच मिळत होती व अजूनही फुकट मिळते.

या सर्व घडामोडी होत असतांना, अब्जाधीश होण्याच्या अनेक संधी दारात असतांना सुद्धा लिनसने त्याच्या “आयुष्य हे आनंदाने जगण्यासाठी असते, अब्जाधीश होण्याकरीता नसते” या तत्वाला सोडले नाही. पण सध्या सुद्धा हा ४६ वर्षाचा उमदा तरूण Oregon मध्ये OSDL म्हणजेच Open Source Development Lab मध्ये काम करत असला तरी त्याला अनेक प्रतिष्ठेचे पुरस्कार मिळण्यापासून अलिप्त ठेउ शकला नाही. त्याची लिस्टची छोटी झलकच पहा  येथे

  • IEEE चा या वर्षीचा पायोनीयर पुरस्कार,
  • २०१२ साली इंटरनेट हॉल ऑफ फेम
  • २०१२ मध्ये नोबेलच्या दर्जाचा मेलिनीयम टेक्नॉलॉजी पुरस्कार
  • २००० साली टाइम मॅगेझीनचा “शतकातील १०० महत्वाच्या व्यक्तीं” च्या यादीत १७ वा क्रमांक
  • २००२ साली पुन्हा टाइमचा जगातील सर्वात प्रभावशाली व्यक्तींच्या यादीत नाव
  • २००६ साली गेल्या ६० वर्षातील क्रांतीकारीक हिरो…व असे अनेक पुरस्कार मिळाले.
  • १९९६ साली तर लघुग्रह शोधणाऱ्या शास्त्रज्ञाने त्या लगुग्रहाला लिनस असे नाव दिले कारण शास्त्रज्ञच लिनक्स ऑपरेटींग सिस्टीम ने प्रभावीत झाला होता.
  • लिनसच्या नावावर तर ३५ वेगवेगळी पेटंट्स उपलब्ध आहेत.

linus-torvalds-by-glenn1794-d4xkv55-644x320

क्रॅश होणाऱ्या ऑपरेटींग सिस्टीम तयार करून अब्जाधीश व्हायचे, साम्राज्य तयार करायचे, अनेक कंपन्या घशात घालायच्या व मक्तेदारी शाबूत ठेवायची या प्रचलीत व तथाकथित न्याय्य पद्धतीला आव्हान देउन ऑपरेटींग सिस्टीम तर चांगली तयार करायचीच  पण जगाच्या कल्याणाकरीता. विकायची नाही. श्रीमंत व्हायचे नाही. फुकट द्यायची. हे लिनसचे तत्व इतके प्रसिद्ध झाले की लिनस चा नियम (Linus’s Law) म्हणून मान्यता मिळाली. हा लॉ काय सांगतो की “Given enough eyeballs, all bugs are shallow”… ऑपरेटींग सिस्टीममध्ये खुप आत दडलेला बग एका प्रोग्रॅमरला सापडत नाही… पण बग सापडण्यासाठी सगळ्याना कामाला लावले तर बग शिल्लकच रहात नाही… म्हणुनच त्याने लिनक्स सर्वांसाठी फ्री उपलब्ध करून ठेवली…!

02.

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

इतिहास कायम प्रेरणा देणारा असतो म्हणून हि पोस्ट तुमच्या सारख्याच लढवय्यांसाठी…

Switch_To_linux-346x154

Kernel : ऑपरेटींग सिस्टीम ची रहस्यमय व अद्भुत दुनिया…

Operating system structure[8]“मी OS च्या कर्नल वर काम केले आहे” अथवा “मी लिनक्स वर काम करतो”… किंवा “माझी आता लिनक्स वर मास्टरी झाली आहे” असे विनम्रपणे न सांगता अशा काही बढाया जर कोण मारत असेल तर लिनक्स च्या कर्नल चा सोर्स कोड जवळ पास ६० लाख लाइन्स चा आहे असे त्याला सांगा.

 

1-012शे-पाचशे लाइन्स चा C/C++ चा अथवा जावा चा प्रोग्रॅम लिहीणाऱ्या नवशिक्या प्रोग्रॅमरला आपण ज्या OS वर काम करतो त्याचे महाभारता मधील कृष्णाप्रमाणे हे लिनक्स कर्नलचे महाविशाल व अवाढव्य पण अदृश्य रुप माहीत असणे जरूरी आहे. म्हणूनच हि पोस्ट च्या कर्नल ची थोडीफार  ओळख करून देण्यासाठी….! खास लिनक्स लव्हर्स साठी…!

युनिक्स व युनिक्स सारख्याच म्हणजे लिनक्स ऑपरेटींग सिस्टीम चा जणू काही आत्मा म्हणजेच Kernel. Kernel हा शब्द शक्यतो Unix/Linux सारख्या ऑपरेटींग सिस्टीम बाबत वापरला जातो असा गैरसमज आहे. प्रत्येक ऑपरेटींग सिस्टीम साठी वेगळा kernel असतो. म्हणजेच अर्थातच Microsoft Windows सारख्या ऑपरेटींग सिस्टीमला सुद्धा kernel असतोच. अर्थात लिनक्स/युनिक्स च्या kernel प्रमाणे Microsoft Windows च्या kernel ला सुविधा नसल्यामुळे तसा गैरसमज आहे. कारण गमतीचा भाग म्हणजे फक्त kernel update/modify करण्याची सुविधा युनिक्स/लिनक्स kernel च्या बाबतीत आहे. तशी Microsoft Windows च्या kernel ला नाही.

kernel-shell1खरं तर kernel म्हणजे ऑपरेटींग सिस्टीमचा गाभा  पण अनेकवेळा  कर्नल म्हणजेच ऑपरेटींग सिस्टीम असे सुद्धा म्हणायला हरकत नाही. त्याच मुळे kernel चा संबंध मेमरी, डिस्क ड्राइव्ह, प्रोसेसर व इतर हार्डवेअर डिव्हाइसेसशी येतो या उलट युझरशी kernel चा संबंध कधीच येणार नाही अशी काळजी घेतली जाते. हे काम शेल (shell) पार पाडतो. शेल हा ऑपरेटींग सिस्टीमचा outer part असतो व त्याच माध्यमातून युझर काम करू शकतो.
Booting च्या वेळी kernel प्रथम मेमरी मध्ये लोड होतो व कंप्युटर shut down करे पर्यंत तेथेच मुक्काम करतो. सर्वात महत्वाचा पार्ट असल्यामुळे त्याची रवानगी प्रोटेक्टेड मेमरी मध्ये केली जाते ज्याला kernel space असे म्हणतात. त्यामुळे Operating system च्या इतर सर्व भागांना बेसीक सेवा आणी सुविधा (basic services) देण्याचे काम kernel चोखपणे पार पाडतो. या मध्ये मेमरी मॅनेजमेंट, प्रोसेस मॅनेजमेंट, फाइल मॅनेजमेंट आणी input/output मॅनेजमेंट हि सर्व  अति-महत्वाची कामे येतात.

03-kernel.pio१.     Kernel चे महत्वाचे पार्ट म्हणजे

२.     Scheduler ज्या प्रोसेस रन करायच्या आहेत त्याचे शेड्युल करणे व क्रमवारी ठरवणे, क्रमवारी मध्ये बदल करणे इत्यादी

३.     Supervisor प्रोसेस शेड्युल प्रमाणे रन करण्यासाट्ठी CPU ला जातात की नाही हे मॉनीटर करणे

४.     Interrupt handler हार्ड-डिस्क किंवा माउस/किबोर्ड सारख्या हार्डवेअर components कडून आलेले व्यत्यय interrupts कडे लक्ष देणे व त्यांची योग्य ती दखल घेणे

५.     Memory Manager प्रोसेसेस साठी मेमरी उपलब्ध करून देण्याची व्यवस्था बघणे

common-kernel1

कर्नल चे चार प्रकारामध्ये वर्गीकरण करता येते म्हणजेच ४ प्रकारचे कर्नल उपलब्ध आहेत हे वाचून तुम्हाला आश्चर्य सुद्धा वाटेल. पण त्याचे monolithic kernel, micro kernel, hybrid kernel आणी exokernels असे चार प्रकार आहे.

Monolithic kernel म्हणजे परीपुर्ण असे कर्नल. ऑपरेटींग सिस्टीमची सर्व फंक्शन्स पार पाडणारे, व सर्व डिव्हाइस ड्रायव्हर्स असणारे कर्नल म्हणजे मोनोलिथीक कर्नल. त्यामुळे डिस्क ड्राइव्ह, प्रिंटर, व्हिडीओ कार्ड या सर्वांशी संधान बांधून काम करण्याची ऐपत मोनोलिथीक कर्नल मध्ये असते. लिनक्स याच प्रकारात येते.

Micro kernel : कमीत कमी फंक्शन्स असणारी व फक्त गरजेच्या सेवा सुविधा उपलब्ध करून देणारे कर्नल म्हणजे micro kernel. Mach, Mac OS X, MINIX या सर्व ऑपरेटींग सिस्टीमची कर्नल्स या प्रकाराची समजली जातात.

वरील दोन्ही कर्नल मधील कर्नल म्हणजे Hybrid Kernel. Karnel space जास्त प्रमाणात उपलब्ध असल्यामुळे microkernel पेक्षा जास्त सुविधा मिळतात. Windows NT, Windows 2000, Windows XP या सर्वांचे कर्नल हे या प्रकारात मोडतात.

Exokernel मात्र सध्या प्रायोगिक तत्वावर आहेत. कमीत कमी जागेमध्ये जास्तीत जास्त फंक्शनॅलिटीज देण्याच्या दृष्टीने प्रयत्न या मध्ये चालू आहेत. खरं तर हा प्रयत्न डेव्हलपर मंडळीच्या सोयीसाठी चालला आहे…!

printf function… C language ओळख…!

C language मध्ये printf म्हणजेच print function ची ओळख पहील्याच दिवशी होते. डेनीस रिची ला C language हि compact form मध्येच हवी होती. म्हणून जाणीवपुर्वक त्याने input/output ची सोय language च्या definition मध्ये केलेली नाही. अर्थात printf हे फंक्शन C language चा inherent part आहे अशी अनेक जणांची सुरवातीला समजूत होते हा भाग वेगळा. 

printf function हे formatted console I/O functions या category मध्ये येते. प्रथम मी या category चा अर्थ काय आहे ते सांगते. 

NAB-Ad-console

 

  1. Console : या शब्दाचे अनेक अर्थ आहेत. English मध्ये त्याचा अर्थ सांत्वंन करणे असा आहे. तर Computer मध्ये keyboard व monitor चे combination, display monitor, command line interface, computer terminal असे अनेक आहेत. C language च्या मर्यादीत अर्थ पहायचा असेल तर शक्यतो असे application ज्या वर फक्त text based output अशी स्क्रिन. यालाच console असे शक्यतो ओळखले जाते. व printf function कॉल करून प्रिंट केलेले output console ला म्हणजेच monitor ला पाठवले जाते
  2. Formatted: Console Screen वर output नेमक्या ठिकाणी हवे असेल, दोन शब्दांमध्ये अथवा दोन वाक्यांमध्ये ठरावीक अतंर ठेवायचे असेल, किंवा real number print करतांना decimal point नंतर ठरावीक digits हवे असतील अशा प्रकारचे किंवा तत्सम प्रकारचे formatted output हवे असेल तर ते printf function च्या सहाय्याने करता येते. 
  3. I/O : Input व Output या जोडगोळीचे ते संक्षीप्त स्वरूप आहे. 

हे फंक्शन Compiler च्या library मध्ये उपलब्ध असते व त्याचा प्रोटोटाइप stdio.h या header file मध्ये असतो. तो साधारणपणे

int     _Cdecl printf(const char *__format, …);

असा आहे. या prototype वरून कोणती माहीती मिळते…? तर

  • printf function चा return type integer आहे
  • _Cdecl ला printf function चे calling convention म्हणतात. 
  • printf function पहीले argument string घेते
  • printf function चे दुसऱ्या argument मध्ये तीन dots दाखवले आहेत ज्याला ellipsis असे म्हणतात ज्याचा अर्थ variable number of arguments असा आहे. म्हणजेच printf function एक पेक्षा जास्त कितीही arguments घेते.

हे फंक्शन

  • series of arguments घेते
  • जर पहील्या स्ट्रिंग मध्ये काही format specifiers असतील तर त्या प्रमाणे apply करते
  • आणी formatted data console वर print करते

printf function ची वैशिष्ठे

  • By default printf function print करतांना right hand side ला word wrap facility वापरते
  • \n हे special implementation control character आहे ज्या मध्ये control next line ला नेण्याचे काम करते
  • Screen scroll down करण्याची सुविधा सुद्धा printf function मध्ये built in आहे
  • character print केल्या नंतर cursor next position ला नेण्याचे काम सुद्धा automatically नेण्याची provision आहे
  • पहील्या format specifier ला format नंतरचे पहीले argument connect करण्याचे, दुसऱ्या format specifier ला format नंतरचे दुसरे argument connect करण्याचे व त्याच पद्धतीने पुढील format specifier apply करण्याची built in सुविधा printf function मध्ये आहे

format specifier चा typical form


% [flags] [width] [.prec] [{h|l}] type

असा आहे. 

या मध्ये अनेक प्रकारचे flags व type आहेत. पण महत्वाचे व नेहमी लागणारे मी येथे घेते. बाकीचे स्पेशल पुढील पोस्ट मध्ये. 

int x = 55;

printf(“x = %o”,x); 

असे असेल तर o हा एखादा integer number जर octal format मध्ये print करायचा असेल तर वापरतात. या ठिकाणी तुम्हाला output मात्र 

x = 67

असे येइल. पण तुम्हाला true octal representation हवे असेल तर मात्र printf function 

printf(“x = %#o”,x);

असे लिहावे लागेल, या ठिकाणी # हा flag आहे . 

समजा तुम्हाला x = 55 या स्टेटमेंट नंतर value print करतांना मात्र +55 अशी हवी असेल तर + flag वापरावा लागेल जसे की 

printf(“x = %+d”,x); 

समजा आपल्याला 55 च्या अलीकडे 4 zero हवे आहेत. तर 0 असा flag टाकावा लागेल. जसे की

printf(“x = %06d”,x); 

असे स्टेटमेंट लिहीले तर output 000055 असे मिळेल. 

print होतांना तुम्हाला width specify करायची असेल तर ती सुद्धा देउ शकता. जसे की 

printf(“x = %d”,x); असे लिहीले तर output 

x = 55 

असे मिळेल. पण समजा

printf(“x = 10d”,x);

असे लिहीले तर 10 columns जागा राखीव ठेवून मग त्या ठिकाणापासून डाव्या बाजूला printing होइल जसे कि

x =           55

असे होइल. 

समजा 

float y = 6.7;

असे स्टेटमेंट असेल तर 

printf(“y = %f”,y); 

हे स्टेट्मेंट printing करतांना 

y = 6.700000 

असे करेल. पण जर 

printf(“%0.2f”,y);

असे लिहीले तर मात्र output

y = 6.70 

असे मिळेल.   

C language मध्ये असलेल्या वेगवेगळ्या format specifiers ची माहीती मी या पुर्वीच Blog वर टाकली आहेत

 

 

 Precedence and Associativity of operators in C

C language मध्ये काही concepts असे आहेत कि ज्याचा स्वतंत्रपणे अभ्यास केला जात नाही. “प्रोग्रॅम सोडवतांना अडचण येइल त्यावेळी बघून घेउ काय करायचे ते” अशी सर्व साधारण मनोवृत्ती असते.
Operator associativity हा अशाच काही टॉपीक पैकी एक टॉपीक. आज मी या पोस्ट मध्ये Operator precedence and associativity या बद्दल सांगते.

C language is very rich in number of operators. आणी हे सर्व operators वेगवेगळ्या categories मध्ये विभागून ठेवले आहेत. म्हणजे त्याच्या broad categories

  1. Unary operators (Single operand)
  2. Binary operators (Two operands on both side of operator)
  3. Ternary operators (three operands)

अशा आहेत.

शिवाय हे सर्व

General operators
e.g. function operator ( ), Array expression [ ], Structure operator ->, Structure operator .
Unary operators
e.g. unary minus – , increment ++, decrement –, one’s complement ~, Negation !, Address of &, value at address *, type cast (type), size in bytes (sizeof)
Mathematical operators
e.g. Multiplication *, Division /, Modulus %, Addition +, Subtraction -,
Shift operators
e.g. Left shift <<, Right shift >>
Relational operators
e.g. Less than <, Less than or equal to <= , Greater than >, Greater than or equal to >=, equal to ==, Not equal to !=
Bitwise operators
e.g. BIT wise AND &, BIT wise exclusive OR ^, BIT wise inclusive OR |
Logical operators
e.g. Logical AND &&, Logical OR ||
Ternary operators
e.g. Conditional operator ? :
Assignment operators
e.g. =, *=, /=, %=, +=, -=, &=, ^=, |=, <<=, >>=
Comma operator
e.g. ,

अशा categories मध्ये विभागले गेले आहेत.

Operators in C
वरील सर्व operators हे Highest precedence पासून Lowest precedence पर्यंत लिहीले आहेत. म्हणजेच Function operator ला highest precedence आहे तर comma operator ला lowest precedence आहे.

आता precedence म्हणजे एखादे एक्सप्रेशन सोडवतांना कोणते operation प्रथम करायचे, त्या नंतर कोणते करायचे याचा जो sequence follow करायचा असतो तो… उदा.

x = 8 / 4 + 4 % 2

या expression मध्ये वरील चार्ट प्रमाणे / आणी % ला + operator पेक्षा higher precedence आहे तर = ला मात्र + पेक्षा सुद्धा कमी precedence आहे. म्हणजेच त्याच क्रमाने operations होतात. म्हणजेच
8/4 will be evaluated to 24%2 will be evaluated to 02 + 0 will be evaluated to 2 and will be assigned to x  आता समजा expression
x = 8 / 4 * 2   असे मात्र असेल तर अनेक वेळा 4 * 2 हे प्रथम सोडवून नंतर मग 8/8 हे ऑपरेशन विद्यार्थ्यांच्याकडून केले जाते. या ठिकाणी associativity consider केली जाते. म्हणजेच एकच precedence असलेले operators जर sequentially आले तर कोणत्या मार्गाने operations करायची त्याच्या संबधीत language चे rules म्हणजे associativity…!

Associativity of operators in C हि दोन प्रकारची असते
Left to Right (याला काहीवेळा Left associativity असे सुद्धा म्हणतात)Right to Left (याला काहीवेळा Right associativity असे सुद्धा म्हणतात) हि associativity operators च्या संबधीत असते. म्हणजे C च्या operator precedence table मध्ये Dennis Ritchie ने precedence बरोबर associativity सुद्धा दिली आहे. उदा. mathematical operators ला Left to Right associativity आहे तर assignment operators, unary operators आणी comma operators ला Right to Left associativity आहे.

म्हणजेच वरील expression आता associativity च्या नियमानुसार 8/4 हे प्रथम सोडवून मिळालेल्या result ला 2 ने multiply केले जाते व x मध्ये 4 store होतो.

हे सगळं वाचल की समजल असं वाटत पण ज्या वेळी precedence chart मधील अनेक operators मात्र एखाद्या expression मध्ये उलट-सुलट येतात त्यावेळी भंबेरी उडते. अनेक छोटे-छोटे प्रोग्रॅम्स डोळ्याखालून घालणे व त्याचे execution समजावून घेणे हाच एकमेव उपाय आहे. आमच्या टिम मधील काही engineers नी अशा प्रकारच्या अनेक प्रश्नांची व त्याच्या explanation ची व्यवस्था C Marathi framework मध्ये प्रत्येक चॅप्टरच्या खाली केली आहे.

For more information Register Here

Bitwise NOT – One’s Complement operator

मागील दोन पोस्ट मध्ये मी Bitwise AND आणी Bitwise OR operator बद्दल लिहीले होते. मी या पोस्टमध्ये Bitwise NOT operator बद्द्ल सांगते. या विषयी मी Negative Number Storing मध्ये लिहीले आहे पण त्यावेळी focus वेगळा होता. या ठिकाणी फक्त Bitwise NOT operator बद्द्ल मी लिहीत आहे.

Bitwise NOT (~) चा मात्र Negation किंवा Logical NOT (!) operator चा काही संबंध नाही. ते फक्त unary operators आहेत इतकेच. एखादा ऑपरांड असेल समजा उदा.  35 तर या नंबरचा bit wise one’s complement घ्यायचा असेल तर ~35 असे लिहावे लागेल. अर्थात हा bit wise operator असल्यामुळे तो 35 च्या प्रत्येक बीट वर काम करतो. म्हणजेच 35 चा 00100011 हा जो Binary pattern आहे त्याचे प्रत्येक bit flip करतो व resultant pattern 11011100 असा होतो. याची Decimal value  220 आहे.

परंतू तुम्ही program लिहून ~35 चे output पाहील तर मात्र ते 220 न येता -36 असे मिळेल…!

Source Code

Source Code

Output

Output

थोडक्यात म्हणजे कोणत्याही integer (n) चा complement -(n+1) असतो. अर्थात हे सर्व कळण्यासाठी तुम्ही मी या पुर्वी लिहीलेला One’s आणी Two’s complement वर लिहीलेला post refer करा. तरच तुम्हाला हा सर्व गोलमाल कळेल.

File encryption साठी याचा अनेक वेळा उपयोग केला जातो हे वरील output वरून तुम्हाला कळाले असेलच…!

File Handling – Read Mode (r)

C programming language मध्ये File access करायची असेल तर file open करायला लागते हे आपण पाहीलेच आहे. fopen हे फंक्शन कॉल करतांना या फंक्शन मध्ये दुसरे argument हे, कोणत्या मोड मध्ये file open करायची आहे हे सांगण्यासाठी असते.

Read Mode

Read Mode

File फक्त read mode मध्ये open करायची असल्यास तुम्हाला r हा option उपलब्ध करून देण्यात आला आहे. अर्थात हे single character असले तरी fopen चे दुसरे argument string असल्यामुळे तुम्हाला दुसरे argument “r” असेच लिहायला लागते. ASCII text file असेल तर “rt” असे लिहावे असे C language सांगते पण ASCII text file हा default parameter असल्यामुळे “rt” च्या ऐवजी “r” असे लिहीले तरी चालते. किंबहूना अशीच प्रथा पडली आहे. file वर कोणतीही operations करायची असल्यास fopen function कॉल करून त्या नंतरच आपल्याला read, write, modify, append इत्यादी operations करता येतात. त्या मुळे समजा आपल्याला C drive वरील myprog या sub directory मधील mydata या sub directory मधील biodata.txt हि file read करायची असेल तर…

fp = fopen(“C:\myprog\mydata\biodata.txt”, “r”);

असे statement लिहून function call करावे लागेल. n, b, a व तत्सम escape sequences मुळे operating system ला string interpret करतांना अडचण येउ नये म्हणून \ हा special escape sequence जाणीवपुर्वक वापरला आहे. दुसरा parameter हा read mode मध्ये file open करण्याची विनंती करत आहे, हि खरं तर compiler मार्फत operating system च्या API ला विनंती असते. Opening mode “r”  असतांना

  1. प्रथम file, fopen function च्या पहील्या parameter म्हणजेच address वर search करण्याचा प्रयत्न करते.
  2. जर file असेल तर ती memory वर load केली जाते.
  3. त्या नंतर file pointer लोड केलेल्या file मधील पहील्या character ला point करतो
  4. जर, file सापडली नाही अथवा read करण्यात अन्य काही अडचणी असल्या तर NULL return केला जातो.

Read mode “r” चा उपयोग file फक्त read करायची असेल तरच केला जातो. अनेक वेळा आपल्याला hard disk वर एखादी file exist आहे की नाही या साठी सुद्धा Read mode चा वापर केला जातो.

याच Read mode “r” च्या ऐवजी “r+” असा जर file opening mode दिला तर

  • File मधील Existing contents वाचता येतात
  • File मध्ये नवीन contents लिहीता येतात
  • व existing contents modify सुद्धा करता येतात

अनेक वेळा विद्यार्थी “r+” चा व “w” चा गोंधळ करून घेतात. पण “r+” ने existing contents read करता येतात व शिवाय modify सुद्धा करता येतात व या मोड मध्ये read आणी write दोनही operations existing contents वर करता येतात.

अर्थात text mode मधील file आपण open करत असल्यामुळे file accessing हे sequential असते हे लक्षात घेण्याची जरूरी आहे.

File pointer in C

C language मध्ये file handling करतांना file pointer declare करण्याची गरज असते असे मी मागील पोस्ट मध्ये सांगीतले होते. हा file pointer तयार करण्यासाठी C च्या library मध्ये FILE structure available आहे. त्याची general  definition सर्वसाधारणपणे अशी आहे.

typedef struct  {
        int             level;          /* fill/empty level of buffer */
        unsigned        flags;          /* File status flags          */
        char            fd;             /* File descriptor            */
        unsigned char   hold;           /* Ungetc char if no buffer   */
        int             bsize;          /* Buffer size                */
        unsigned char   *buffer;   /* Data transfer buffer       */
        unsigned char   *curp;     /* Current active pointer     */
        unsigned        istemp;         /* Temporary file indicator   */
        short           token;          /* Used for validity checking */
}       FILE;                           /* This is the FILE object    */

वरील Definition मध्ये फार काही समजावून घेण्याचा आटापिटा केला नाही तरी आपण जी file access करणार आहोत त्याची सर्व basic information स्टोअर करून ठेवण्याची व access करण्याची basic arrangement करून ठेवली आहे इतक तरी structure members कडे पाहील्या नंतर कळतं…! 

File pointer

File pointer

Heap वरील मेमरी ज्या प्रमाणे unnamed असते व ती मेमरी access करण्यासाठी pointer लागतो त्याच प्रमाणे हार्ड डिस्क वरील file access करण्यासाठी pointer लागतो व तो FILE structure चा करतात. हे स्ट्रक्चर typedef केले असल्यामुळे FILE असेच लिहावे लागते. file किंवा File असे लिहीले तर compile time errors मिळतील.

आता या structure चे members कसे काम करतात, file pointer आत काय काय करतो, fopen function काय काय उद्योग करते असे प्रश्न अनेक विद्यार्थी विचारतात. अशा प्रकारची curiosity चांगली असली तरी programming शिकायला सुरवात केल्या केल्या २-४ वर्षात सुद्धा या प्रश्नांची उकल होणार नाही कारण अशा प्रकारची फंक्शन्स आपण ज्यावेळी कॉल करतो त्यांना Computer Programming World मध्ये API म्हणजेच Application Programming Interface म्हणतात. Programmer चे काम इतकेच कि FILE चा pointer तयार करणे, fopen function call करणे व system कडुन आलेला pointer collect करणे. त्या पेक्षा आत जाण्याची सोय सुरक्षेच्या कारणास्तव करूनच ठेवलेली नाही….!

तर मग fopen या फंक्शनचा prototype काय आहे…?

FILE *_Cdecl fopen(const char *__path, const char *__mode);

या prototype मध्ये

  • fopen function FILE pointer return करते
  • _Cdecl हे फंक्शन calling convention आहे
  • पहीले argument string आहे जे file चा path असते
  • दुसरे argument हे file opening mode असते जे string format मध्ये द्यावे लागते.

r, w, a, r+, w+, a+, rb, wb, ab, rb+, wb+, ab+ असे अनेक file opening modes आहेत ज्याचा समाचार मी पुढील काही पोस्ट मध्ये घेते….!

तो पर्यंत…Happy Coding…!