تازه ها
چرا جاوا زبانی جالب است ؟ در یکی از مقالات در باره ی زبان شرکتSun جاوا را با این خصوصیات شرح می دهد : جاوا یک زبان ساده ، شی گرا ،توزیع شده ، تفسیر شده ، قدرتمند ، ایمن ، با معماری خنثی ، قابل حمل ، با عملکرد سطح بالا چند نخ کشی شده و پویا است . Sun تصدیق میکند که به طور قطع این کلمات رشته هایی از واژه های متداول در زبان برنامه نویسی هستند ، اما حقیقت این است که این واژه ها به طور ماهرانه ای خصوصیات این زبان را شرح میدهند . حال به برخی از خصلت های جاوا در پشت این واژه ها میپردازیم . شی گرا : 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++ هستند . چون جاوا ساختمان ندارد و آرایه ها و رشته ها اشیاء آن هستند ، بنابراین احتیاجی به اشاره گر نیست .جاوا به طور خودکار آدرس دهی و دستذسی به محتوای موجود در یک آدرس را برای شما انجام میدهد . جاوا حتی زباله های حافظه ای را هم به طور خودکار جمع آوری میکند .(GarbageCollectin) (* جمع آوری آشغال فرایندی است برای ترمیم خودکار حافظه انباشته شده . بلوک هایی از حافظه که زمانی به فایل ها اختصاص داشتند اما مدتی است که از آنها استفاده نمی شود و بلوک هایی از حافظه که هنوز مورد استفاده قرار میگیرند ممکن است حرکت داده شوند تا از به هم پیوستن فضاهای خالی حافظه بلوک های خالی بزرگتری بدست آید . [ از کتاب : 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 یک کلاس بوجود آورده است که از روش هایی برای شروع و پایان یک نخ ، و مرتب کردن ترتیب گره ها در میان چیز های دیگر ، پشتیبانی میکند . حتی دستورات زبان جاوا از نخ ها پشتیبانی میکنند ، که با استفاده از کلمات کلیدی مطابق شده . این کلمات کلیدی علامت گذاری بخش های کد یا تمامی روش هایی را که باید فقط با یک نخ در یک زمان اجرا شوند را به شدت آسان کرده است . به دلیل اینکه جاوا استفاده از نخ ها را بسیار ساده میکند ، کلاس جاوا در شماری از جاها از این نخ ها استفاده میکند . برای مثال هر برنامه کاربردی که انیمیشن اجرا میکند ، از نخ ها استفاده کرده است . به طور مشابه جاوا از برنامه های نا همگام ، ورودی ها و خروجی های بلاک نشده با اخطاری به وسیله سیگنال ها یا وقفه ها پشتیبانی نمیکند ، در این صورت شما باید یک نخ بسازید که روی هر کانال ورودی خروجی که با آن کار میکنید بلاک شده باشد