हॉलिवुडचे काही चित्रपट नुसते मनोरंजन किंवा कला ह्यापुरते मर्यादित नं रहाता त्या परिसीमा पार करुन विज्ञानाचा एक अभ्यासपट म्हणुन समोर येतात. तो चित्रपट पाहताना एखाद्याने त्याच्या/तिच्या PHD रिसर्चची थेसिस डिफेन्ड केल्याचा भास होतो. Inception त्यापैकीच एक.
ख्रिस्तोफर नोलान... काय म्हणावं मी. थोर आहेस तु (हे प्रेमाने केलेलं अरेतुरे आहे). मला सर्वात जास्त कौतुक एका गोष्टीचं वाटतं ती म्हणजे, हे लोक एखादी (काल्पनिक/अभुतपुर्व/जटिल) कल्पना करतात आणि ती लोकांसमोर "समजेल अशी मांडतात". अशी कल्पना "मांडणं" हे आणि फक्त हेच खरं कौशल्य आहे. तर ह्याची संकल्पना एकंदर अशी आहे की...
कोणाच्याही डोक्यातली गुपितं त्याला शारीरीक इजा नं पोहचवता त्याच्या स्वप्नांमधे जाऊन, ती त्याची स्वप्न नियंत्रित करुन काढुन घेणं. आणि एवढेच नव्हे तर त्याच्याच त्या नियंत्रित केलेल्या स्वप्नांमधे जाऊन, त्याच्या सुप्त मनामधे आपली कल्पना रुजवणे. बरं आणि हे करताना अश्या पद्धतिने करायचं की स्वप्न बघणाऱ्याला वाटावे स्वप्न आणि कल्पना दोन्ही त्याच्याच आहेत.
पण हे असं का करायच? म्हणजे असं स्वप्नात जाऊन असले उद्योग कशासाठी? कारण - वेळ. भौतिक जगात अनन्य महत्व असलेली - वेळ. ह्या वेळेला तुम्ही थांबवु शकत नाही, ना तिची गती कमीजास्त करता येते. त्यामुळे एखाद्या कामासाठी लागणारा कालावधी कमी असेल तर??? पण मग त्यात एखाद्याची स्वप्न कशी काय मदत करु शकतिल??? हांsss... तर हिच आहे ह्या सिनेमाची स्टोरी.
स्वप्नांमधे (म्हणजे स्वप्न बघताना) एखाद्याचा मेंदु प्रचंड गतीने कार्यरत असतो. त्यामुळे होतं काय की ह्यामुळे वेळ मंदावली जाते. भौतिक जगातील एक सेकंद हा स्वप्नांमधे काही तासांएवढा होतो. मग समजा जर मी स्वप्नात स्वप्न पाहिलं तर??? पहिल्या पातळीवर (पहिल्या स्वप्नात) एका सेकंदाचे काही तास, दुसऱ्या पातळीवर (पहिल्या स्वप्नातल्या स्वप्नात) त्या तास काही दिवस होतिल आणि पुढच्या पातळीवर त्या दिवसांच रुपांतर काही वर्षांमधे... म्हणजे मला एखादं काम काही सेकंदात करणं अशक्य असेल तर मी तिसऱ्या पातळीवरच्या स्वप्नांमधे जाऊन त्यासाठी काही वर्ष एवढा मोठ्ठा कालावधी मिळवु शकतो. शिवाय हि स्वप्न एखाद्याची विचारसरणी/वागणुक पुर्ण बदलु शकतात. त्यामुळे जर मी त्याचं स्वप्न त्याच्या नकळत नियंत्रित केलं (स्वप्नांना सुरुवात आणि अंत नसल्याने ती नियंत्रित करता येऊ शकतात) तर मी त्याला एक पुर्ण नवा माणुस बनवु शकतो. ब्रेनवॉशसारखं वेळखाऊ काम मी अतिशय कमी वेळात करु शकतो. भाsssरी.... बरं हि स्वप्न नियंत्रित करणं म्हणजे काय जॉयस्टिक हातात घेऊन व्हिडिओगेम खेळण्याइतकं सोपं नाही. चित्रपटातल्या कहाणीनुसार तिसऱ्या पातळीवरची स्वप्न (तिसरी पातळी म्हणजे maximum limit) खुप अनस्टेबल असल्याने नियंत्रित करणं खुप कठिण... जवळपास अशक्य. ताळमेळ चुकला तर व्यक्ती स्वप्नातुन बाहेर येईल पण प्रचंड मानसिक धक्का घेऊन किंवा त्याच स्वप्नांमधे कायमची अडकुन जाईल. पण चित्रपटातला हिरो ह्याच्या कैक कैक पार... पाचव्या पातळीवरच्या स्वप्नात जातो.
Inception चित्रपटाची बांधणी अप्रतिम आहे. Open end असलेला हा चित्रपट आहे. त्यामुळे मुव्ही पाहुन झाल्यावर तुम्ही चर्चाचर्वण करुन रवंथ करणार हे नक्की.
हम्म्म... पण मी हे सगळं लिहितोय का? पहिल्यांदाच एखाद्या चित्रपटाबद्दल, तेपण "Inception"बद्दल? कारण मला ह्या चित्रपटाचा कन्सेप्ट "C" Programming सारखा वाटला (to some extend - only time factor is missing). How? well, now to understand what I say, you should at least have basic knowledge of "C" Programming. "C" languageमधे एक "Pointer" म्हणुन कन्सेप्ट आहे. हा एक असा variable आहे जो "memory address" स्टोअर करतो.
उदा.:
int x = 10; //variable 'x' has value 10 stored in it
int *y;
y = &x; //now 'y' is a Pointer, pointing to memory address of 'x'
print x; // output: 10
print y; // output: 0012FEDC
print *y; //output: 10
// *y same as *(&x), also read as value at address of x, which is 10
पण तरी हा फंडा Inceptionशी रिलेटेड कसा?
कारण १:
Inception चित्रपटात दाखवल्याप्रमाणे एखाद्याच्या स्वप्नांद्वारे त्याचे सुप्त मन नियंत्रित करुन त्याची मुळ विचारसरणी किंवा व्यक्तिमत्वच बदलता येऊ शकतं आणि होणारा हा परिणाम कायमस्वरुपी असतो.
Pointerने सुद्धा एखाद्या variableची value कायमचीच बदलते. ह्याला scope resolution असंपण म्हणतात.
उदा.:
{ // first scope starts
int x = 10; // value of x in first scope
print x; // output: 10
{ // second scope starts
x = 5; // value of x in second scope
print x; // output: 5
} // second scope ends which discards everything within it
print x; // output: 10
} // first scope ends
वरच्या उदाहरणावरुन तुमच्या लक्षात येईल की दुसऱ्या scopeमधे मी 'x'ची value बदलली. पण तरी दुसऱ्या scopeमधुन बाहेर आल्यावर 'x'ची value पुन्हा 10च झाली.
हेच जर मी Pointerने केलं तर काय होईल बघा...
{ // first scope starts
int x = 10; // value of x in first scope
print x; // output: 10
int *y;
y = &x;
print *y; // output: 10
{ // second scope starts
*y = 5; // *(&x) read as value at address of x = 5
print x; // output: 5
} // second scope ends
print x; // output: 5
} // first scope ends
आता इकडे मी 'x'ची value बदलली नाही, तर जिकडे स्टोअर केलाय त्या ('x'च्या) memory addressवरची बदलली. त्यामुळे दुसऱ्या scopeमधुन बाहेर आल्यावर 'x'मधे त्या memory addressवरची नविन value असेल.
आता हे झालं बेसिक. Incetionमधे कसं स्वप्नात स्वप्न आणि त्याच्या आत पुन्हा स्वप्न दाखवलय तसंच इकडेपण pointerला pointer आणि त्या pointerचा pointerपण define करु शकता.
म्हणजे पहिल्या levelवरचा pointer एखाद्या variableचा memory address store करतो. (ह्याला हाताळतानाच तोंडाला फेस येतो.)
int x;
int *y;
y = &x;
दुसऱ्या levelवरचा पहिल्या levelच्या pointerचा memory address store करतो.
int x;
int *y;
y = &x;
int **z;
z = &y;
तिसऱ्या levelवरचा दुसऱ्या levelच्या pointerचा memory address store करतो.
int x;
int *y;
y = &x;
int **z;
z = &y;
int ***i;
i = &z;
पण अजुन मला नाही वाटत कोणी तिसऱ्या पातळीवरचा pointer वापरला असेल. कारण programmingमधे पहिल्या levelवरचा pointerच प्रोग्रॅमर्सची level लावायला पुरेसा आहे. दुसऱ्या levelला तर programmersची १००% फें फें उडालेली असते.
कारण २:
चित्रपटानुसार माणसाच्या ह्या स्वप्नसाखळीचे दुरगामी कायमस्वरुपी परिणाम त्याच्यावर होत असल्याने, समजा त्याच्या स्वप्नात काही अघटीत घडलं (समजा तो मधल्याच एखाद्या स्वप्नात मेला) तर पुढच्या आणि मागच्या स्वप्नांचा संपर्क तुटेल आणि तो स्वप्नातुन बाहेर आला नाही तर खऱ्याखुऱ्या जगात तो कोमामधे जाऊ शकतो. तसं झाल्यास बाहेर काढण्यासाठी त्या स्वप्नात किंवा त्याच्या पुढच्या पातळीवरच्या स्वप्नात जाऊन योग्य क्रमाने आणि पद्धतिने स्वप्न संपवणं गरजेचं आहे.
Pointers हाताळतानापण अशी काळजी घेणं गरजेचं असतं. नाहितर त्या pointerचा "Dangling Pointer" होतो. Dangling Pointer म्हणजे असा pointer जो चुकिच्या (वापरात नसलेल्या) memory addressला point करतो. अश्या pointerमुळे अकारण memory space खाल्ली जाते आणि प्रोग्रॅम क्रॅशदेखिल होऊ शकतो.
उदा.:
{ // first scope starts
int *x;
{ // second scope starts
int y;
x = &y;
} // second scope ends, y falls out of scope
// x is now a Dangling Pointer pointing to deallocated memory of y
}// first scope ends
हा तर पहिल्याच levelवरचा होता. अजुन complex pointerअसता आणि मधलाच कोणता pointer गंडला तर तुमचा प्रोग्रॅम बोंबल्लाच समजा. अश्या प्रॉब्लेमला टाळण्यासाठी ज्या scopeमधे pointer define केला त्या scopeमधुन बाहेर येण्यापुर्वी त्याला Nullify करावा.
उदा.:हुश्श्श्श... झेपलं का काही??? नसेल तरी हरकत नाही. मीच पुर्ण गोंधळलेलो लिहतालिहता... ख्रिस्तोफर नोलानने एवढा कठिण विषय इतक्या सहजपणे कसा काय चित्रित केला आश्चर्यच आहे. असो... पण Inception बघा नक्की.
{ // first scope starts
int *x = NULL;
{ // second scope starts
int y;
x = &y;
/* ... */
x = NULL;
} // second scope ends, y falls out of scope
// x is no more a Dangling Pointer
}// first scope ends
आपला,
(Dangling) सौरभ