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