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