در يكي از مقالات در باره ي زبان شركت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 را زنده نگهدارند و آن شعار اين است :
« يك بار بنويس ، همه جا اجرا كن » .
پويا و توزيع شده :Dynamic 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 يك كلاس بوجود آورده است كه از روش هايي براي شروع و پايان يك نخ ، و مرتب كردن ترتيب گره ها در ميان چيز هاي ديگر ، پشتيباني ميكند .
حتي دستورات زبان جاوا از نخ ها پشتيباني ميكنند ، كه با استفاده از كلمات كليدي مطابق شده . اين كلمات كليدي علامت گذاري بخش هاي كد يا تمامي روش هايي را كه بايد فقط با يك نخ در يك زمان اجرا شوند را به شدت آسان كرده است .
به دليل اينكه جاوا استفاده از نخ ها را بسيار ساده ميكند ، كلاس جاوا در شماري از جاها از اين نخ ها استفاده ميكند . براي مثال هر برنامه كاربردي كه انيميشن اجرا ميكند ، از نخ ها استفاده كرده است .
به طور مشابه جاوا از برنامه هاي نا همگام ، ورودي ها و خروجي هاي بلاك نشده با اخطاري به وسيله سيگنال ها يا وقفه ها پشتيباني نميكند ، در اين صورت شما بايد يك نخ بسازيد كه روي هر كانال ورودي خروجي كه با آن كار ميكنيد بلاك شده باشد .
گردآونده:طه-Borna66