جاوا را بهتر بشناسیم
چرا جاوا زباني جالب است ؟


در يكي از مقالات در باره ي زبان شركتSun جاوا را با اين خصوصيات شرح مي دهد :
جاوايك زبان ساده ، شي گرا ،توزيع شده ، تفسير شده ، قدرتمند ، ايمن ، بامعماري خنثي ، قابل حمل ، با عملكرد سطح بالا چند نخ كشي شده و پويا است .
Sunتصديق ميكند كه به طور قطع اين كلمات رشته هايي از واژه هاي متداول درزبان برنامه نويسي هستند ، اما حقيقت اين است كه اين واژه ها به طورماهرانه اي خصوصيات اين زبان را شرح ميدهند .
حال به برخي از خصلت هاي جاوا در پشت اين واژه ها ميپردازيم .

شي گرا :Object Oriented

جاوايك زبان برنامه نويسي شي گرا است . براي يك برنامه نويس اين به اين معنااست كه به جاي فكر كردن به قسمت هاي رويه برنامه ، بايد به كاربرد داده هاو روش هايي كه روي آن داده ها عمل ميكنند ، توجه شود.
اگر شما بهبرنامه نويسي با اعلان رويه در C عادت كرده ايد ،ممكن است دريابيد كه بههنگام استفاده از جاوا مجبور به تغيير در روش و چگونگي برنامه تان هستيد .هنگامي كه فهميديد اين الگوي جديد چقدر قدرتمند است ، به سرعت با آنهماهنگ ميشويد .
در يك سيستم شي گرا ، يك كلاس مجموعه اي از داده ها وروش هايي است كه روي آن داده عمل ميكنند. همراه بودن داده ها و متد هارفتار و حالت يك شي را بيان مي دارد . كلاس ها به صورت سلسله مراتبي مرتبشده اند ، بنابر اين يك زير كلاس ميتواند رفتار هايي را از كلاس بالاتر بهارث ببرد . يك كلاس سلسله مراتبي هميشه يك كلاس ريشه دارد كه كلاسي است بارفتار هاي كاملا عمومي .
جاوا به همراه دسته ي گسترده اي از كلاس هايياست كه در بسته هايي مرتب شده اند و شما مي توانيد از آنها در برنامه يخود استفاده كنيد . براي مثال جاوا كلاس هايي را ايجاد ميكند كه :
بخشهاي رابط گرافيكي را ميسازند (the java.awt package) ،كلاس هايي كه عملياتورودي و خروجي را به عهده دارند(the java.io package) و كلاس هايي كه ازشبكه پشتيباني ميكنند (the java.net package ) .
يك شي كلاس(in the java.lang package) به عنوان ريشه كلاس سلسله مراتبي جاوا انجام وظيفه ميكند .
جاوابر خلاف C طوري طراحي شده است كه از همان ابتدا به صورت شي گرا باشد .اكثر چيز ها در جاوا اشيا هستند . ارقام ابتدايي ، كاراكترها و مدل هايمنطقي تنها استثناء ها هستند . حتي رشته ها هم در جاوا به وسيله اشيا حاضرميشوند ،همان طور كه ساختمان هاي مهم ديگر اين زبان ، مثل نخ ها احضارميشوند . يك كلاس يك واحد پايه براي كامپايل و اجرا شدن در جاوا است .تمام برنامه هاي جاوا متشكل از كلاس ها است .
درست است كه جاوا طوريطراحي شده است كه مثل C باشد و خاصيت هاي آن را داشته باشد ، اما هنگاميكه با آن كار كنيد خواهيد فهميد كه بسياري از پيچيده گي هاي آن زبان را ازبين برده است .
اگر شما يك برنامه نويس C هستيد حتما لازم است كهساختار هاي شي گرايي در جاوا را به دقت مطالعه كنيد . اگرچه تركيب و نحوهدستورات آن تقريبا شبيه C است ،اما رفتار هاي آن خيلي مشابه نيست .



تفسير شده :Interpreted

جاوايك زبان تفسير شده است . كامپايلر جاوا به جاي ايجاد كد محلي ماشين ، كدبايتي براي ماشين مجازي جاوا ايجاد ميكند . براي اجراي دقيق برنامه ، ازمفسر جاوا براي اجراي كد هاي بايتي كامپايل شده استفاده ميشود . به دليلاينكه كد هاي بايتي جاوا به نوع كامپيوتر بستگي ندارند ، برنامه هاي جاواميتوانند روي هر نوع كامپيوتري كه JVM(Java Virtual Machine) را دارند ،اجرا شوند .
در محيط تفسير شده ، مرحله لينك استاندارد توسعه برنامه ازديد كاربر پنهان است . اگر جاوا تنها يك مرحله لينك داشت ، فقط بارگذاريكلاس جديد به محيط پردازش ميشد كه يك پردازش نموي سبك وزن است كه در زماناجرا مشاهده ميشود . كه اين خصوصيت با چرخه كامپايل-لينك-اجرا ي آرام وطاقت فرساي زبان هايي مانند C يا C در تضاد است .



معماري خنثي و قابل حمل :Architecture Neutral and Portable

بهدليل اينكه برنامه هاي جاوا در فرمت كد بايتي با معماري خنثي كامپايل شدهاند ، برنامه كاربردي جاوا ميتواند در هر سيستمي اجرا شود.
البته بااين شرط كه آن سيستم توانايي پياده سازي ماشين مجازي جاوا را داشته باشد .اين مسئله تقريبا براي كاربرد هاي توزيع سده روي اينترنت و يا ديگر شبكههاي ناهمگن مهم است . اما روش معماري خنثي براي كاربرد هاي بر مبناي شبكهمفيد است .
به عنوان يك توسعه دهنده برنامه هاي كاربردي در بازار نرمافزاري امروز ممكن است بخواهيد مدل هاي كاربردي خود را توسعه دهيد ، بهطوري كه بتواند روي Pc ، مكينتاش و سيستم عامل Unix اجرا شود .با وجودگونه هاي مختلف Unix ، Windows روي Pc و مكينتاش قوي جديد ، رفته رفتهتوليد نرم افزار براي همه انواع اين كامپيوتر ها سخت مي شود . اگر شمابرنامه تان را در جاوا بنويسيد ميتواند روي همه ي اين كامپيوترها اجرا شود.
در حقيقت تفسير شده بودن جاوا وتعريف يك استاندارد ، معماري خنثيداشتن و فورمت كد بايتي آن از بزرگترين دلايل قابل حمل بودن آن به شمار ميآيند .
اما جاوا باز از اين هم بيشتر گام برميدارد ، با اطمينان حاصلكردن از اينكه هيچيك از جنبه هاي وابستگي اجرايي زبان را ندارد . برايمثال جاوا به طور صريح اندازه هريك از انواع داده را تعريف ميكند كه اينبا C تفاوت دارد ، براي مثال هريک از انواع صحيح مي تواند بسته به نوعکامپيوتر16-32 يا 64 بيت طول داشته باشد .
هنگامي که به صورت تکنيکيامکان نوشتن برنامه هاي غير قابل حمل در جاوا فراهم شد ، جلوگيري از چندخاصيت وابسته به نوع کامپيوتر که توسط جاوا API توليد شده و به طور قطعقابل حمل نوشته شده است ، آسان است .
يك برنامه جاوا به توليد كنندگاننرم افزار كمك ميكند تا از قابل حمل بودن كد هايشان اطمينان حاصل كنند .برنامه نويسان فقط براي پرهيز از دام غير قابل حمل بودن برنامه احتياج بهيك تلاش ساده دارند كه شعار تجارتي شركتSun را زنده نگهدارند و آن شعاراين است :
« يك بار بنويس ، همه جا اجرا كن » .



پويا و توزيع شده ynamic and Distributed

جاوايك زبان پويا است . هر كلاس جاوا ميتواند در هر زماني روي مفسر جاوابارگذاري شود . سپس اين كلاس هاي بارگذاري شده ي پويا ميتوانند به صورتپويا معرفي شوند . حتي كتابخانه كد هاي محلي ميتواند به طور پويا بارگذاريشود .كلاس ها در جاوا با كلاس Class فراخواني ميشوند ؛ شما ميتوانيد بهطور پويا در مورد يك كلاس در زمان اجرا اطلاعاتي بدست بياوريد . اينخصوصيت در جاوا 1-1 به طور درستي موجود است . با وجود بازتاب API اضافهشده (Application Program Interface ) كه به برنامه ساز امكان ميدهد كه بابرنامه از طريق يك برنامه كاربردي ديگر ارتباط برقرار كند .
جاوا حتيبا نام زبان توزيع شده نيز خوانده ميشود . به طور ساده اين به اين معنااست كه اين زبان پشتيباني سطح بالايي براي شبكه به وجود مي آورد . برايمثال كلاس URL و كلاس هاي مرتبط با آن در بسته ي Java.net ، خواندن فايلهاي دوردست را به همان سادگي خواندن فايل هاي محلي كرده است . به طورمشابه در جاوا 1-1 ، احضار روش كنترلي RMI
(Remote Method Invocation )، API به يك برنامه جاوا اجازه ميدهد كه روش هايي از اشياء دور دست جاوارا به همان صورتي كه اگر آن اشياء محلي بدند آنها را ميخواند ، بخواند .(جاوا حتي از سيستم شبكه اي سطح پايين كه شامل آدرس مقصد و مسير جرياني كهتوسط سوكت ها متصل شده است ، نيز پشتيباني ميكند .)
طبيعت توزيع شده يجاوا زمانيكه با امكانات پوياي بارگذاري كلاس همراه ميشود ، واقعا درخشندهاست . اين خصوصيات با هم اين امكان را براي مفسر جاوا به وجود مي آورند كهكد ها را از اينترنت بارگذاري و اجرا كند . ( همان طور كه بعدا خواهيم ديدجاوا باعث ميشود كه با وجود ابزار قدرتمند و ايمن اين كار به طور مطمئنانجام شود .) اين چيزي است كه در هنگام بارگذاري و اجراي يك برنامهكاربردي از اينترنت توسط مرورگر وب ، اتفاق مي افتد . اما داستان پيچيدهتر از اين هم ميتواند باشد . تصور كنيد يك پردازشگر كلمه چند رسانه اي درجاوا نوشته شده است . وقتي از اين برنامه پرسيده ميشود كه چند نوع از دادههايي را كه قبلا هرگز وارد نشده را نمايش دهد ، ممكن است به طور ديناميكييك كلاس را كه ميتواند داده را شناسايي كند ، از شبكه بارگذاري كند و بعدكلاس ديگري را كه بتواند داده را از درون يك پوشه تركيبي بخواند ، باز بهطور ديناميكي بارگذاري ميكند . برنامه اي مانند اين از منابع توزيع شده درشبكه براي رشد و سازگاري خودكار كاربران استفاده ميكند .




ساده :Simple



جاوايك زبان ساده است . طراحان جاوا سعي در اين داشتند تا زباني بوجود بياورندكه برنامه نويسان بتوانند به سرعت آن را ياد بگيرند . بنابراين تعدادساختار هاي اين زبان تقريبا كم است . هدف ديگر طراحي اين زبان اين بود كهبه منظور راحتي انتقال آن ، آن را طوري طراحي كنند كه براي عده ي زيادي ازبرنامه نويسان آشنا باشد . اگر شما يك برنامه نويس C يا C هستيد ، خواهيدفهميد كه جاوا از بسياري از ساختار هاي C و C استفاده ميكند .
براياينكه اين زبان را هم به طور ساده و هم آشنا و ملموس و هم كوچك نگه دارندبسياري از خصوصيات C و C را در آن حذف كردند . اينها خصوصياتي بودند كهباعث مي شدند برنامه نويسي ضعيفي صورت بگيرد يا آنهايي بودند كه به ندرتدر برنامه استفاده مي شدند . براي مثال جاوا از دستور goto استفاده نميكند ، در عوض از دستورهايbreak , continue در مواقع نياز استفاده مي كند .
جاوااز سر فايل ها(header files) استفاده نمي كند و پردازشگر C را هم حذف كردهاست . به اين دليل كه جاوا يك زبان شي گرا است ، ساختار هاي C مثل struct, union از آن برداشته شده است . جاوا حتي بارگذاري مجدد و خواص چندگانهارث بري از C را هم حذف كرده است . شايد مهمترين پارامتر ساده بودن جاواعدم استفاده اين زبان از اشاره گر ها باشد . اشاره گر ها يكي از بيشترينموجوديت هاي دردسرساز در C , C هستند . چون جاوا ساختمان ندارد و آرايه هاو رشته ها اشياء آن هستند ، بنابراين احتياجي به اشاره گر نيست .جاوا بهطور خودكار آدرس دهي و دستذسي به محتواي موجود در يك آدرس را براي شماانجام ميدهد .
جاوا حتي زباله هاي حافظه اي را هم به طور خودكار جمعآوري ميكند .(Garbage Collectin) (* جمع آوري آشغال فرايندي است برايترميم خودكار حافظه انباشته شده . بلوك هايي از حافظه كه زماني به فايل هااختصاص داشتند اما مدتي است كه از آنها استفاده نمي شود و بلوك هايي ازحافظه كه هنوز مورد استفاده قرار ميگيرند ممكن است حركت داده شوند تا ازبه هم پيوستن فضاهاي خالي حافظه بلوك هاي خالي بزرگتري بدست آيد .
[ ازكتاب : Microsoft computer dictionary] * ) بنابراين لازم نيست كه نسبت بهموضوع مديريت حافظه نگران باشيد ، همه اينها شما را از نگراني در مورداشاره گر هاي بي ارزش ، خطرناك و هرز هاي حافظه رها ميكنند . بنابر اينشما ميتوانيد وقت خود را صرف بهبود برنامه تان كنيد .



قدرتمند :Robust
جاوابراي نوشتن نرم افزارهاي قدرتمند و بسيار ايمن ساخته شده است . جاوا هنوزهم به طور قطع نرم افزار ها را تضمين نميكند . تقريبا هنوز هم امكان نوشتنبرنامه هاي مشكل ساز در جاوا وجود دارد ، هرچند كه جاوا برخي از انواعمشخص خطاهاي برنامه نويسي را حذف كرده كه به طرز چشمگيري نوشتن نرم افزارهاي ايمن را آسان تر كرده است .
جاوا يك زبان تايپ شده قدرتمند است ،كه اجازه چك شدن مشكلات و خطاهاي تايپي را در زمان كامپايل مي دهد . جاوابسيار قويتر از C تايپ شده است كه بسياري از خصوصيات انعطاف پذير در زمانكامپايل را از C به ارث برده است . مخصوصا هنگام اعلان توابع .جاوا به مدلاعلان صريح احتياج دارد ، زيرا كه از مدل اعلان صريح C پشتيباني نميكند .اين مسئله مارا از اينكه كامپايلر ميتواند خطاهاي زمان اعلان را بدست آورد، مطمئن ميكند . مسئله اي كه منجر به ايجاد برنامه هاي ايمن تري ميشود .
يكياز چيزهايي كه باعث شده كه جاوا ساده باشد عدم وجود اشاره گر ها ومحاسباتبر روي آنها است . اين ويژگي حتي قدرت جاوا را هم با از ميان بردن يك كلاسسراسري اشاره گر افزايش ميدهد .
به طور مشابه تمام دسترسي به آرايه هاو رشته ها در زمان اجرا چك مي شوند تا از قطعي بودن آنها اطمينان حاصل شود.با از بين بردن امكان دوباره نويسي حافظه و داده هاي هرزه ، تعويض نقشاشياء از نوعي به نوع ديگر هم در زمان اجرا كنترل ميشود تا از مجاز بودنآن اطمينان حاصل شود .
سرانجام زباله جمع كن خودكار جاوا بسياري ازعمليات پاكسازي مرتبط با معماري حافظه را راه اندازي ميكند . چيزي كه ازخطاهاي خطر ساز مرتبط با تخصيص و آزاد سازي حافظه جلوگيري ميكند .



ايمن : Secure

يكياز دلايل پرطرفدار بودن جاوا اين است كه يك زبان ايمن است . اين ويژگيمخصوصا به خاطر طبيعت توزيع شده ي آن بسيار مهم است .بدون وجود امنيت شماقطعا نميخواهيد كه يك كد را از يك سايت تصادفي اينترنت بارگذاري كنيد و بهآن اجازه اجرا شدن روي كامپيوتر خودتان را هم بدهيد . اين دقيقا همان چيزياست كه مردم هرروز با يك كد جاوا انجام ميدهند . جاوا به صورت ايمن طراحيشده و چندين لايه كنترل امنيت به وجود مي آورد كه شما را در برابر كد هايخطرساز محافظت مي كنند و به كاربر اجازه ميدهد كه برنامه هاي ناشناخته رابا خيال راحت اجرا كند .
همان طور كه ديديم ، برنامه جاوا نميتوانداشاره گر ها را به حافظه يا آرايه هاي سرريز يا حافظه خواندني خارج ازمحدوده يك آرايه يا رشته اشاره ، اشاره دهد. اين خصوصيت يكي از اصلي ترينوسايل دفاع جاوا در برابر كدهاي خطرساز است . دومين راه دفاع در برابر كدهاي خطرساز ، پردازش كدهاي بايتي به صورت قابل تصديق و تاييد است كه مفسرجاوا به روي هر كدي كه در حال بار گذاري باشد اعمال ميكند . اين مراحلتاييد از اينكه كد به صورت درستي ساخته شده اطمينان حاصل ميكنند ، كه برايمثال پشته سرريزي يا زيرريزي نداشته باشد ، يا شامل كد هاي بايتي غير مجازنباشد .
كدهاي بايتي خراب يا خطرساز ممكن است از ضعف هاي اجرايي درمفسر جاوا سوء استفاده كنند . لايه اي كه در اينجا ما را به طور ايمنمحافظت ميكند ، مدل جعبه شني (Sand box) است : كدهاي ناشناخته در يك جعبهشني قرار ميگيرند جايي كه ميتوانند به صورت ايمن اجرا شوند ، بدون اينكههيچ صدمه اي به بقيه اجزاء يا محيط جاوا بزنند .
وقتي يك برنامهكاربردي يا ديگر كدهاي ناشناخته در جعبه شني در حال اجرا است ، چندمحدوديت در مورد كاري كه ميتواند انجام دهد ، وجود دارد . واضح ترين اينمحدوديت ها اين است كه هيچ دسترسي به هيچ يك از فايل هاي محلي سيستم وجودندارد . در جعبه شني محدوديت ديگري هم وجود دارد كه به وسيله كلاس مديريتامنيت اعمال ميشود . اين مدل در ابتدا از اينكه سيستم هاي امنيتي را نصبكرده ايد يا نه ، مطمئن ميشود ، چرا كه همه كلاس هاي جاوا نياز به عملياتحساسي مانند دسترسي به سيستم فايل را دارند . اگر فراخواني به وسيله يك كدناشناخته به صورت مستقيم يا غير مستقيم انجام شد ، مدير امنيت مورداستثناء را مي فرستد و عمليات صورت نمي گيرد .
و سرانجام در جاوا 1-1يك راه حل ممكن ديگر براي مشكلات امنيتي وجود دارد ، به وسيله ضميمه كردنيك امضاء ديجيتالي به كد جاوا كه اصل آن كد ميتواند به صورت پنهاني ونهفته ساخته شود . اگر شما اعتماد خود را به يك شخص يا يك سازمان مشخصكرده باشيد ، كدي كه امضاء آن هويت مورد اعتماد روي آن قرار دارد ، ايمنو مطمئن است . حتي زمانيكه در حال بارگذاري شدن در شبكه است و ممكن استحتي بدون جلوگيري توسط جعبه شني اجرا شود .

عملكرد سطح بالا :High Performance
جاوايك زبان تفسير شده است ، بنابر اين هرگز به سرعت زبان كامپايل شده اي مثلC نخواهد بود . گفته ميشود كه جاوا 0-1 به اندازه 20 برابر از C كند تراست . جاوا 1-1 تقريبا سرعتي دو برابر جاوا 1-1 دارد . بنابراين ممكن استعاقلانه باشد اينكه بگوييم كد C كامپايل شده 10 برابر سريع تر از كد هايتفسير شده ي جاوا اجرا ميشود . اما قبل از اينكه به خاطر اين موضوع مايوسشويد ، آگاه باشيد كه اين سرعت بيشتر از آن چيزي است كه براي برنامه هايپرسرعت ، كاربردهاي GUI(Graphical User Interface ) ، برنامه هاي برمبنايشبكه ، جايي كه برنامه كاربردي معمولا آماده براي اجرا شدن است ، انتظاربراي كاربر كه يك دستوري اعمال كند و يا انتظار براي دريافت از شبكه ،لازم است .
به علاوه قسمت هايي كه به سرعت هاي بالا نياز دارند ، كهكارهايي از قبيل الحاق رشته ها و مقايسه را انجام ميدهند ، با كد محليجاوا اجرا ميشوند .
علاوه بر اين كارايي ، بسياري از مفسر هاي جاوااكنون شامل كامپايلر هاي فقط در زمان " just in time " نيز هستند كهميتواند كدهاي بايتي جاوا را براي هر نوعCPU در زمان اجرا به كد ماشينترجمه كند . فرمت كد بايتي جاوا با اين كامپايلر هاي در زمان در مركز كافيو مناسب است و انصافا كدهاي خوبي توليد ميكند . در حقيقت Sun ادعا ميكندكه كارايي كد هاي بايتي كه به كد ماشين تبديل شده اند ، تقريبا به خوبيكارآيي آن در C و C است .
اگر شما خواهان اين هستيد كه قابل حمل بودنكد ها را قرباني بهبود در سرعت آن كنيد ، ميتوانيد بخش قابل توجهي ازبرنامه خود را در C و C بنويسيد و از روش هاي مخصوص جاوا براي مشترك كردنبا اين كد محلي جاوا استفاده كنيد .


چند نخ كشي شده :Multitbreaded

دريك برنامه كاربردي بر مبناي GUI شبكه اي ، مثل مرورگر وب ، تصور اينكه چندچيز بتوانند به طور همزمان اجرا شوند ، آسان است . يك كاربر ميتواندهمزمان با اينكه دارد يك صفحه وب را ميخواند به يك كليپ صوتي گوش دهد وهمزمان در پس زمينه مرورگر يك عكس را بارگذاري كند .
جاوا يك زبانچندنخ كشي شده است ، كه از چندين رشته اجرايي (گاهي پردازش سبك وزن خواندهميشود) پشتيباني ميكند و ميتواند چندين كار را انجام دهد . يكي از مزيتهاي چندنخ كشي شده اين است كه عملكرد سطح بالايي براي كاربردهاي گرافيكيبراي كاربر فراهم ميكند .
اگر شما سعي كرده ايد كه با نخ ها در C و Cكار كنيد ، ميدانيد كه كمي مشكل است . جاوا برنامه نويسي با نخ ها رابسيار آسان تر كرده است ، با به وجود آوردن زبان درون ساخته شده اي كه ازنخ ها پشتيباني ميكند . بسته jana.lang يك كلاس بوجود آورده است كه از روشهايي براي شروع و پايان يك نخ ، و مرتب كردن ترتيب گره ها در ميان چيز هايديگر ، پشتيباني ميكند .
حتي دستورات زبان جاوا از نخ ها پشتيبانيميكنند ، كه با استفاده از كلمات كليدي مطابق شده . اين كلمات كليدي علامتگذاري بخش هاي كد يا تمامي روش هايي را كه بايد فقط با يك نخ در يك زماناجرا شوند را به شدت آسان كرده است .
به دليل اينكه جاوا استفاده از نخها را بسيار ساده ميكند ، كلاس جاوا در شماري از جاها از اين نخ هااستفاده ميكند . براي مثال هر برنامه كاربردي كه انيميشن اجرا ميكند ، ازنخ ها استفاده كرده است .
به طور مشابه جاوا از برنامه هاي نا همگام ،ورودي ها و خروجي هاي بلاك نشده با اخطاري به وسيله سيگنال ها يا وقفه هاپشتيباني نميكند ، در اين صورت شما بايد يك نخ بسازيد كه روي هر كانالورودي خروجي كه با آن كار ميكنيد بلاك شده باشد .