چرا جاوا زباني جالب است؟

قسمت اول

در يكي از مقالات شركتSun، زبان جاوا را با اين خصوصيات شرح مي‌دهد:

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

Sun تصديق مي‌کند كه به طور قطع اين كلمات رشته‌هايي از واژه‌هاي متداول در زبان برنامه نويسي هستند، اما حقيقت اين است كه اين واژه‌ها به طور ماهرانه‌اي خصوصيات اين زبان را شرح مي‌دهند.

حال به برخي از خصلت‌هاي جاوا در پشت اين واژه‌ها مي‌پردازيم.


شي گرا: Object Oriented


جاوا يك زبان برنامه نويسي شي‌گرا است. براي يك برنامه نويس اين به اين معنا است كه به جاي فكر كردن به قسمت‌هاي رويه برنامه، بايد به كاربرد داده ها و روش‌هايي كه روي آن داده ها عمل مي‌كنند، توجه شود.

اگر شما به برنامه نويسي با اعلان رويه در C عادت كرده ايد، ممكن است دريابيد كه به هنگام استفاده از جاوا مجبور به تغيير در روش و چگونگي برنامه‌تان هستيد. هنگامي كه فهميديد اين الگوي جديد چقدر قدرتمند است، به سرعت با آن هماهنگ مي‌شويد .

در يك سيستم شي گرا، يك كلاس مجموعه‌اي از داده‌ها و روش‌هايي است كه روي آن داده عمل مي‌كنند. همراه بودن داده‌ها و متد‌ها رفتار و حالت يك شي را بيان مي دارد. كلاس‌ها به صورت سلسله مراتبي مرتب شده اند، بنابر اين يك زير كلاس مي‌تواند رفتار هايي را از كلاس بالاتر به ارث ببرد. يك كلاس سلسله مراتبي هميشه يك كلاس ريشه دارد كه كلاسي است با رفتار هاي كاملا عمومي .

جاوا به همراه دسته ي گسترده اي از كلاس هايي است كه در بسته هايي مرتب شده اند و شما مي‌توانيد از آنها در برنامه‌ي خود استفاده كنيد.

يك شي كلاس(in the java.lang package) به عنوان ريشه كلاس سلسله مراتبي جاوا انجام وظيفه مي‌كند .

درست است كه جاوا طوري طراحي شده است كه مثل 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 فراخواني مي‌شوند؛ شما مي‌توانيد به طور پويا در مورد يك كلاس در زمان اجرا اطلاعاتي بدست بياوريد. اين خصوصيت در جاوا به طور درستي موجود است . با وجود بازتاب API اضافه شده (Application Program Interface ) كه به برنامه ساز امكان مي‌دهد كه با برنامه از طريق يك برنامه كاربردي ديگر ارتباط برقرار كند .

جاوا حتي با نام زبان توزيع شده نيز خوانده مي‌شود. به طور ساده اين به اين معنا است كه اين زبان پشتيباني سطح بالايي براي شبكه به وجود مي آورد. براي مثال كلاس URL و كلاس هاي مرتبط با آن در بسته‌ي ava.net ، خواندن فايل‌هاي دوردست را به همان سادگي خواندن فايل‌هاي محلي كرده است. به طور مشابه در جاوا 1-1، احضار روش كنترلي RMI (Remote Method Invocation ) ، API به يك برنامه جاوا اجازه مي‌دهد كه روش‌هايي از اشياء دور دست جاوا را به همان صورتي كه اگر آن اشياء محلي بودند آنها را مي‌خواند، بخواند .( جاوا حتي از سيستم شبكه‌اي سطح پايين كه شامل آدرس مقصد و مسير جرياني كه توسط سوكت‌ها متصل شده است ، نيز پشتيباني مي‌كند).

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