12-01-2020، 07:31 PM
تا جایی که به جاوا مربوط میشود، همه چیز از اوایل دهه 1990 آغاز شد، یعنی زمانی که شرکت سان مایکروسیستمز (Sun Microsystems) شروع به توسعه نسخه بهتری از ++C کرد که بتواند به آسانی پرتابل شود، برای افراد مبتدی مطلوب باشد و به مدیریت خودکار حافظه بپردازد. تحقیقات این شرکت منجر به خلق یک زبان کاملاً جدید شد که نام آن از میان دهها نام پیشنهادی در اتاق جلسه معرفیش انتخاب شد. امروزه لوگوی جاوا به صورت فنجان قهوهای که از آن بخار میدمد، به نماد جهانی برنامهنویسی تبدیل شده است. در واقع دیگر کسی نمیداند که ارتباط برنامهنویسها با کافئین قدیمیتر است؛ یا ارتباطشان با جاوا که امروزه مترادف با قهوه است.
در این نوشته به بررسی کامل و جامع این زبان برنامهنویسی، ویژگیها، مزایا، معایب، بازار کار، کتابخانهها، کاربردها و هر آنچه که ممکن است در مورد جاوا بخواهید بدانید میپردازیم.
جاوا چیست؟
جاوا یک زبان برنامهنویسی چندمنظوره و شیگرا است که تا حدودی زیادی به C و ++C شباهت دارد؛ اما استفاده از آن آسانتر است و امکان ساخت برنامههایی قدرتمند با آن وجود دارد. البته تعریفی که شرکت سان مایکروسیستمز در سال 2000 ارائه کرده است، شاید از تعریف فوق گویاتر باشد:
جاوا زبان رایانهای ساده، شیگرا، مناسب شبکه، تفسیرشدنی، مستحکم، امن، فارغ از معماری، پرتابل، با عملکرد بالا، چندنخی و دینامیک است.
در ادامه هر یک از خصوصیات فوق را به طرز جداگانهای مورد بررسی قرار میدهیم:
جاوا یک زبان ساده است
جاوا در ابتدا بر اساس زبانهای C و ++C و با حذف برخی ویژگیهایی که قابلیت سردرگم کننده داشتند مدلسازی شد. از جمله این ویژگیها میتوان به اشارهگرها، پیادهسازی چندباره وراثت و بارگذاری بیش از حد عملگرها اشاره کرد که در جاوا حذف شدند. یکی از ویژگیهایی که در C++/C وجود نداشت؛ اما جزو ویژگیهای اساسی جاوا به شمار میآید، امکان بازیافت حافظه (garbage-collection) است که به طور خودکار اشیا و آرایههای بی استفاده را حذف میکند.
جاوا یک زبان شیگرا است
تمرکز شیگرایی جاوا موجب شده است که توسعهدهندگانی که از این زبان استفاده میکنند، از آن برای حل یک مسئله استفاده کنند و نه سروکله زدن با آن برای رفع محدودیتهای مسئله. این وضعیت موجب تمایز بین جاوا و C شده است. برای نمونه اگر میخواهید برنامهای برای یک حساب بانکی بنویسید، در جاوا تنها باید به ذخیرهسازی شی حساب بانکی بپردازید؛ اما در C باید وضعیت حساب (تراز حساب) و رفتارهایی مانند واریز یا برداشت را به طور مستقل برنامهنویسی کنید.
جاوا یک زبان مبتنی بر شبکه است
کتابخانه وسیع شبکه در جاوا باعث شده است که امکان کار با پروتکل کنترل انتقال/پروتکل اینترنت (TCP/IP) و پروتکلهای شبکه مانند HTTP (پروتکل انتقال ابرمتن) و FTP (پروتکل انتقال فایل) سادهتر شود و همچنین وظیفه ایجاد اتصالهای شبکه آسانتر گشته است. به علاوه برنامههای جاوا میتوانند از طریق شبکه TCP/IP، از طریق URLها، به اشیا دسترسی داشته باشند و این دسترسی به همان سادگی دسترسی روی سیستم فایل محلی است.
جاوا یک زبان تفسیر شده است
یک برنامه جاوا در زمان اجرا به طور غیر مستقیم از طریق یک ماشین مجازی (که بازنمایی نرمافزاری از یک پلتفرم فرضی است) و محیط زمان اجرای مرتبط با آن با واسطه روی یک پلتفرم زیرساخت (مانند ویندوز یا لینوکس) اجرا میشود. این ماشین مجازی بایتکدها (دستورالعملها و دادههای مرتبط) را از طریق تفسیر به دستورالعملهای خاص پلتفرم ترجمه میکند. منظور از تفسیر، عمل شناسایی معنی دستورالعملها و سپس انتخاب دستورالعملهای خاص پلتفرم برای اجرا است. در ادامه ماشین مجازی این دستورالعملهای خاص پلتفرم را اجرا میکند. این ویژگی تفسیری بودن جاوا باعث شده است که خطایابی برنامههای جاوا آسانتر شود، چون اغلب اطلاعات در زمان کامپایل در واقع در محیط اجرا وجود دارند. تفسیری بودن جاوا همچنین امکان به تأخیر انداختن پیوند بین قطعات مختلف برنامه جاوا تا زمان اجرا را فراهم ساخته است و این مسئله موجب افزایش سرعت توسعه برنامه میشود.
جاوا یک زبان مستحکم است
برنامههای جاوا باید قابل اعتماد باشند، زیرا هم در اپلیکیشنهای مصرفی و هم مأموریتهای حیاتی استفاده میشوند که از پخشکنندههای بلوری تا ناوبری خودرو یا سیستمهای کنترل هوایی را شامل میشود. ویژگیهای زبان جاوا که باعث استحکام آن میشوند، شامل اعلانها، بررسی دوباره نوع داده، یک بار در زمان کامپایل و بار دیگر در زمان اجرا (برای جلوگیری از عدم تطبیق نسخهها)، آرایههای واقعی با بررسی خودکار کرانها و کنار گذاشتن اشارهگرها است.
جاوا یک زبان امن است
برنامههای جاوا در محیطهای شبکهبندی شده/ توزیع یافته مورد استفاده قرار میگیرند. از آنجا که برنامههای جاوا میتوانند روی پلتفرمهای مختلف شبکه اجرا شوند، امن ساختن این پلتفرمها در برابر کدهای مخرب که موجب گسترش ویروسها، سرقت اطلاعات کارتهای بانکی یا اجرای اعمال خرابکارانه میشوند، امری حائز اهمیت است. ویژگیهایی که موجب استحکام زبان جاوا میشوند شامل کنار گذاشتن اشارهگرها هستند که به همراه ویژگیهای امنیتی مانند مدل امن sandbox جاوا و رمزنگاری کلید عمومی فعالیت میکنند. این دو نوع از ویژگیها در کنار هم از تأثیر ویروسها و دیگر کدهای خطرناک روی پلتفرمهای مشکوک جلوگیری میکنند. جاوا از لحاظ تئوریک امن است؛ اما در عمل آسیبپذیریهای امنیتی مختلفی شناسایی و مورد سوءاستفاده قرار گرفته است. در نتیجه در زمانهای قبل، شرکت سان مایکروسیستمز و اینک شرکت اوراکل همواره اقدام به انتشار بهروزرسانیهای امنیتی برای جاوا میکنند.
جاوا یک زبان فارغ از معماری است
شبکهها موجب اتصال پلتفرمهایی با معماری مختلف ریزپردازندهها و سیستمهای عامل میشوند. نمیتوان انتظار داشت که جاوا دستورالعملهای خاص پلتفرم را ایجاد کند و انتظار داشته باشد که این دستورالعملها از سوی همه انواع پلتفرمهایی که بخشی از شبکه هستند درک شود. در عوض جاوا دستورالعملهای بایتکد مستقل از پلتفرم ایجاد میکند که تفسیر آن برای هر پلتفرم (از طریق پیادهسازی JVM) آسان است.
جاوا یک زبان پرتابل است
عدم وابستگی به معماری موجب پرتابل شدن جاوا شده است. با این حال پرتابل بودن جاوا چیزی فراتر از مستقل بودن دستورالعملهای بایتکدها از پلتفرم است. برای مثال در نظر بگیرید که اندازه نوع عدد صحیح روی پلتفرمهای مختلف یکسان خواهد بود. برای نمونه یک نوع عدد صحیح 32 بیتی، صرفنظر از این که روی پلتفرمهای با رجیسترهای 16 بیتی، 32 بیتی یا 64 بیتی پردازش شود؛ در هر حال به صورت علامتدار بوده و 32 بیت از حافظه را اشغال میکند. کتابخانههای جاوا نیز به پرتابل بودن آن کمک میکنند. این کتابخانهها در موارد ضروری، انواع دادهای را ارائه میکنند که به روشی تا حد امکان پرتابل، کد جاوا را به قابلیتهای خاص پلتفرم متصل میسازد.
جاوا یک زبان با عملکرد بالا است
ویژگی تفسیری بودن جاوا موجب شده است عملکرد بالایی داشته باشد که در اکثر موارد بیش از حد کفایت است. جاوا در مورد اپلیکیشنهای با عملکرد بسیار بالا از کامپایل درجا (just-in-time) استفاده میکند یعنی دستورالعملهای بایتکد تفسیر شده را تحلیل میکند و دستورهای تفسیر شده با بسامد بالا را به دستورالعملهای خاص پلتفرم کامپایل میکند. تلاشهای بعدی برای تفسیر این دستورالعملهای بایتکد موجب اجرای همان دستورالعملهای خاص پلتفرم میشود و به این ترتیب عملکرد نرمافزار را ارتقا میبخشد.
جاوا یک زبان چند نخی (multithread) است
جاوا برای بهبود عملکرد برنامههایی که چندین وظیفه را به یک باره اجرا میکنند، از مفهوم اجرای چند نخی پشتیبانی میکند. برای نمونه برنامهای که رابط گرافیکی کاربر (GUI) را مدیریت میکند و در همین حال منتظر ورودی از یک اتصال شبکه است، از نخ (thread) دیگری به جای نخ GUI برای این انتظار استفاده میکند. بدین ترتیب رابط گرافیکی برنامه همچنان پاسخگو است. ابتکارهای همگامسازی جاوا به نخها اجازه میدهد که دادهها را بدون هیچ تأثیر مخربی بین خود مبادله کنند.
جاوا یک زبان پویا (دینامیک) است
به دلیل ارتباطهای متقابل بین کد برنامه و کتابخانهها که در زمان اجرا به صورت دینامیک صورت میپذیرند، نیازی به ایجاد لینک صریح بین آنها وجود ندارد. در نتیجه زمانی که یک برنامه یا یکی از کتابخانههای آن تکامل مییابد (برای مثال باگ اصلاح میشود یا عملکرد بهبود مییابد) توسعهدهنده تنها باید برنامه یا کتابخانه بهروزرسانی شده را منتشر سازد. با این که رفتار دینامیک جاوا موجب شده است به کد کمتری هنگام تغییر کد نیاز باشد؛ اما این روش انتشار میتواند موجب تداخلهایی نیز بشود. برای نمونه یک توسعهدهنده ممکن است یک نوع کلاس را از یک کتابخانه حذف کند یا نام آن را تغییر دهد. وقتی شرکتی کتابخانه به روز شده را منتشر میکند، برنامههای موجود که به آن نوع کلاس وابسته هستند از کار میافتند. برای حل این مشکل جاوا از نوع رابط (interface type) پشتیبانی میکند که مانند تعامل بین دو طرف است.
مروری بر پلتفرم جاوا
جاوا هم یک زبان برنامهنویسی و هم پلتفرمی برای اجرای کد جاوای کامپایل شده است. این پلتفرم به طور عمده شامل JVM است؛ اما محیط اجرایی را نیز شامل میشود که از اجرای JVM روی پلتفرمهای زیرساختی بومی پشتیبانی میکند. JVM خود شامل چند جزء برای بارگذاری، تأیید و اجرای کد جاوا است. در تصویر زیر شیوه اجرای یک کد جاوا روی این پلتفرم را مشاهده میکنید.
JVM شامل یک مولفه (کامپوننت) classloader، verifier بایتکد و یک مفسر و کامپایلر در جا برای بارگذاری، تأیید و اجرای یک فایل کلاس است.
در بخش فوقانی نمودار فوق یک سری از فایلهای کلاس برنامه را مشاهده میکنید که یکی از آنها به نام فایل کلاس اصلی نامیده شده است. برنامه جاوا دست کم باید یک فایل کلاس اصلی داشته باشد که نخستین کلاسی است که بارگذاری، تأیید و اجرا خواهد شد.
JVM بارگذاری کلاس را به مولفه classloader میسپارد. Classloader فایلهای کلاس را از منابع مختلف مانند سیستمهای فایل، شبکهها و فایلهای فشرده بارگذاری میکند. این مولفه، JVM را از مسائل و مشکلات مرتبط با بارگذاری کلاس بر حذر میدارد.
یک فایل کلاس بارگذاری شده در حافظه نگهداری میشود و به صورت یک شی ایجاد شده از کلاس Class نمایش مییابد. هنگام بارگذاری، bytecode verifier دستورالعملهای مختلف بایتکد را بررسی میکند تا مطمئن شود که معتبر هستند و امنیت را به مخاطره نمیاندازند.
اگر بایتکد فایل کلاس معتبر نباشد، JVM خاتمه مییابد. در غیر این صورت مولفه مفسر آن، بایتکد را یک به یک به دستورالعملها تفسیر میکند. در این فرایند تفسیر، دستورالعملهای بایتکد شناسایی شده و دستورالعملهای بومی معادل آنها اجرا میشوند.
برخی توالیهای دستورالعملهای بایتکد بیش از دیگر موارد تکرار میشوند. وقتی مفسر این موقعیت را تشخیص میدهد، کامپایلر درجای JVM به نام JIT این توالیهای بایتکد را به کد بومی کامپایل میکند تا سریعتر اجرا شوند.
در زمان اجرا، مفسر معمولاً با درخواستی برای اجرای بایتکد فایل کلاس دیگر مواجه میشود که به این برنامه یا یک کتابخانه تعلق دارد. در چنین مواردی classloader فایل کلاس را بارگذاری میکند و bytecode verifier بایتکد فایل کلاس بارگذاری شده را پیش از اجرا تأیید میکند. همچنین در زمان اجرا نیز دستورالعملهای بایتکد ممکن است از JVM بخواهند که یک فایل را باز کند، چیزی را روی صفحه نمایش دهد، صدایی ایجاد کند یا وظیفه دیگری انجام دهد که نیازمند همکاری با پلتفرم بومی است. در این موارد JVM با استفاده از رابط بومی جاوا (JNI) که یک پل فناوری برای تعامل با پلتفرم بومی برای اجرای وظایف است این کار را انجام میدهد.
نوع دینامیک یا نوع استاتیک
جاوا یک زبان برنامهنویسی با نوع استاتیک است در حالی که زبانهای برنامهنویسی دیگری مانند روبی (Ruby)، پایتون (Python)، و جاوا اسکریپت زبانهایی از نوع دینامیک محسوب میشوند. اکثر افراد به بحث تفاوت بین زبانهای با نوع استاتیک و دینامیک علاقهمند هستند.
نوع دینامیک
اگر تاکنون تجربه عملی برنامهنویسی داشته باشید، با مفهوم متغیر آشنا هستید. در زبانهای با نوع دینامیک مانند روبی یا جاوا اسکریپت میتوان متغیری را بدون این که نوع داده ذخیره شدهاش معین باشد، اعلان کرد. این متغیر از نوع دینامیک است و مقدار آن میتواند هر چیزی مانند یک عدد، جمله و یا غیره باشد.
نوع استاتیک
هنگامی که با دادهها در زبانهای از نوع استاتیک مانند جاوا سر و کار داریم، باید در زمان اعلان متغیر دقیقاً مشخص کنیم که متغیر چه نوع دادهای را نگهداری خواهد کرد. برای نمونه این متغیر حاوی عدد خواهد بود یا متغیر دیگر متن را ذخیره میکند و متغیر سوم حاوی تاریخ خواهد بود. این بدان معنی است که یک زبان از نوع استاتیک ساختار بیشتری را شامل میشود. برخی از انواع خطاهایی که برنامهنویسها مرتکب میشوند، توسط ابزارهایی که جاوا در اختیار ما قرار میدهد، حتی پیش از اجرای برنامه، قابل تشخیص هستند. با این حال در صورتی که در زبانهای از نوع دینامیکی مانند روبی یا پایتون برنامهنویسی کنید، چنین خطاهایی تا زمان اجرای برنامه و مواجهه با از کار افتادن برنامه قابل تشخیص نخواهند بود.
بدین ترتیب در زبانهای برنامهنویسی از نوع استاتیک یک لایه اضافی از کدنویسی وجود دارد که باید انواع همه متغیرها از قبل مورد تفکر قرار گرفته و مشخص شود. بنابراین یادگیری زبانهای از نوع دینامیک برای کسانی که اولین زبان برنامهنویسیشان از نوع استاتیک بوده است، بسیار آسانتر از مسیر معکوس آن خواهد بود.
چه زبانهایی از جاوا مشتق شدهاند؟
برخی زبانها مانند اسکالا (Scala) و گرووی (Groovy) وجود دارند که برای اجرا روی JVM طراحی شدهاند و یا زبانهایی هستند که برای اجرا روی محیط جاوا توسعه یافتهاند. همچنین ممکن است برخی افراد ادعا کنند که زبان C# تا حدود زیادی تحت تأثیر جاوا توسعه یافته است. زبان سی شارپ مایکروسافت پس از جاوا توسعه یافت و به طور خاص به مقدار زیادی از جاوا الهام گرفته است. سی شارپ موجب برخی بهبودها در جاوا نیز شده است و از این رو این دو زبان به طور متقابل بر هم تأثیرگذار بودهاند.
جاوا چه تفاوتی با جاوا اسکریپت دارد؟
هیچ رابطه فنی بین جاوا و جاوا اسکریپت وجود ندارد. جاوا اسکریپت از سوی نت اسکیپ (Netscape) در دهه 90 میلادی توسعه یافته است و در ابتدا LiveScript نامیده میشد. زمانی که نت اسکیپ دید هیچ کس از LiveScript استفاده نمیکند و جاوا محبوبیت روزافزونی دارد، نام آن را به جاوا اسکریپت تغییر داد تا بتوانند از این موج محبوبیت جاوا بهرهمند شوند. در واقع این ایده موفق بود و جاوا اسکریپت نیز محبوب شد؛ اما از منظر فنی هیچ رابطهای بین این دو وجود ندارد و صرفاً دارای تشابه اسمی هستند. شاید تنها مشابهت فنی بین جاوا و جاوا اسکریپت را در این بدانیم که هر دو آنها دستور زبانشان را از زبان برنامهنویسی C گرفتهاند. به همین دلیل اگر با جاوا آشنا باشید، در این صورت یادگیری جاوا اسکریپت آسان خواهد بود و برعکس.
طراحی اپلیکیشن | طراحی سایت دیجی کالا | طراحی سایت فروشگاهی
در این نوشته به بررسی کامل و جامع این زبان برنامهنویسی، ویژگیها، مزایا، معایب، بازار کار، کتابخانهها، کاربردها و هر آنچه که ممکن است در مورد جاوا بخواهید بدانید میپردازیم.
جاوا چیست؟
جاوا یک زبان برنامهنویسی چندمنظوره و شیگرا است که تا حدودی زیادی به C و ++C شباهت دارد؛ اما استفاده از آن آسانتر است و امکان ساخت برنامههایی قدرتمند با آن وجود دارد. البته تعریفی که شرکت سان مایکروسیستمز در سال 2000 ارائه کرده است، شاید از تعریف فوق گویاتر باشد:
جاوا زبان رایانهای ساده، شیگرا، مناسب شبکه، تفسیرشدنی، مستحکم، امن، فارغ از معماری، پرتابل، با عملکرد بالا، چندنخی و دینامیک است.
در ادامه هر یک از خصوصیات فوق را به طرز جداگانهای مورد بررسی قرار میدهیم:
جاوا یک زبان ساده است
جاوا در ابتدا بر اساس زبانهای C و ++C و با حذف برخی ویژگیهایی که قابلیت سردرگم کننده داشتند مدلسازی شد. از جمله این ویژگیها میتوان به اشارهگرها، پیادهسازی چندباره وراثت و بارگذاری بیش از حد عملگرها اشاره کرد که در جاوا حذف شدند. یکی از ویژگیهایی که در C++/C وجود نداشت؛ اما جزو ویژگیهای اساسی جاوا به شمار میآید، امکان بازیافت حافظه (garbage-collection) است که به طور خودکار اشیا و آرایههای بی استفاده را حذف میکند.
جاوا یک زبان شیگرا است
تمرکز شیگرایی جاوا موجب شده است که توسعهدهندگانی که از این زبان استفاده میکنند، از آن برای حل یک مسئله استفاده کنند و نه سروکله زدن با آن برای رفع محدودیتهای مسئله. این وضعیت موجب تمایز بین جاوا و C شده است. برای نمونه اگر میخواهید برنامهای برای یک حساب بانکی بنویسید، در جاوا تنها باید به ذخیرهسازی شی حساب بانکی بپردازید؛ اما در C باید وضعیت حساب (تراز حساب) و رفتارهایی مانند واریز یا برداشت را به طور مستقل برنامهنویسی کنید.
جاوا یک زبان مبتنی بر شبکه است
کتابخانه وسیع شبکه در جاوا باعث شده است که امکان کار با پروتکل کنترل انتقال/پروتکل اینترنت (TCP/IP) و پروتکلهای شبکه مانند HTTP (پروتکل انتقال ابرمتن) و FTP (پروتکل انتقال فایل) سادهتر شود و همچنین وظیفه ایجاد اتصالهای شبکه آسانتر گشته است. به علاوه برنامههای جاوا میتوانند از طریق شبکه TCP/IP، از طریق URLها، به اشیا دسترسی داشته باشند و این دسترسی به همان سادگی دسترسی روی سیستم فایل محلی است.
جاوا یک زبان تفسیر شده است
یک برنامه جاوا در زمان اجرا به طور غیر مستقیم از طریق یک ماشین مجازی (که بازنمایی نرمافزاری از یک پلتفرم فرضی است) و محیط زمان اجرای مرتبط با آن با واسطه روی یک پلتفرم زیرساخت (مانند ویندوز یا لینوکس) اجرا میشود. این ماشین مجازی بایتکدها (دستورالعملها و دادههای مرتبط) را از طریق تفسیر به دستورالعملهای خاص پلتفرم ترجمه میکند. منظور از تفسیر، عمل شناسایی معنی دستورالعملها و سپس انتخاب دستورالعملهای خاص پلتفرم برای اجرا است. در ادامه ماشین مجازی این دستورالعملهای خاص پلتفرم را اجرا میکند. این ویژگی تفسیری بودن جاوا باعث شده است که خطایابی برنامههای جاوا آسانتر شود، چون اغلب اطلاعات در زمان کامپایل در واقع در محیط اجرا وجود دارند. تفسیری بودن جاوا همچنین امکان به تأخیر انداختن پیوند بین قطعات مختلف برنامه جاوا تا زمان اجرا را فراهم ساخته است و این مسئله موجب افزایش سرعت توسعه برنامه میشود.
جاوا یک زبان مستحکم است
برنامههای جاوا باید قابل اعتماد باشند، زیرا هم در اپلیکیشنهای مصرفی و هم مأموریتهای حیاتی استفاده میشوند که از پخشکنندههای بلوری تا ناوبری خودرو یا سیستمهای کنترل هوایی را شامل میشود. ویژگیهای زبان جاوا که باعث استحکام آن میشوند، شامل اعلانها، بررسی دوباره نوع داده، یک بار در زمان کامپایل و بار دیگر در زمان اجرا (برای جلوگیری از عدم تطبیق نسخهها)، آرایههای واقعی با بررسی خودکار کرانها و کنار گذاشتن اشارهگرها است.
جاوا یک زبان امن است
برنامههای جاوا در محیطهای شبکهبندی شده/ توزیع یافته مورد استفاده قرار میگیرند. از آنجا که برنامههای جاوا میتوانند روی پلتفرمهای مختلف شبکه اجرا شوند، امن ساختن این پلتفرمها در برابر کدهای مخرب که موجب گسترش ویروسها، سرقت اطلاعات کارتهای بانکی یا اجرای اعمال خرابکارانه میشوند، امری حائز اهمیت است. ویژگیهایی که موجب استحکام زبان جاوا میشوند شامل کنار گذاشتن اشارهگرها هستند که به همراه ویژگیهای امنیتی مانند مدل امن sandbox جاوا و رمزنگاری کلید عمومی فعالیت میکنند. این دو نوع از ویژگیها در کنار هم از تأثیر ویروسها و دیگر کدهای خطرناک روی پلتفرمهای مشکوک جلوگیری میکنند. جاوا از لحاظ تئوریک امن است؛ اما در عمل آسیبپذیریهای امنیتی مختلفی شناسایی و مورد سوءاستفاده قرار گرفته است. در نتیجه در زمانهای قبل، شرکت سان مایکروسیستمز و اینک شرکت اوراکل همواره اقدام به انتشار بهروزرسانیهای امنیتی برای جاوا میکنند.
جاوا یک زبان فارغ از معماری است
شبکهها موجب اتصال پلتفرمهایی با معماری مختلف ریزپردازندهها و سیستمهای عامل میشوند. نمیتوان انتظار داشت که جاوا دستورالعملهای خاص پلتفرم را ایجاد کند و انتظار داشته باشد که این دستورالعملها از سوی همه انواع پلتفرمهایی که بخشی از شبکه هستند درک شود. در عوض جاوا دستورالعملهای بایتکد مستقل از پلتفرم ایجاد میکند که تفسیر آن برای هر پلتفرم (از طریق پیادهسازی JVM) آسان است.
جاوا یک زبان پرتابل است
عدم وابستگی به معماری موجب پرتابل شدن جاوا شده است. با این حال پرتابل بودن جاوا چیزی فراتر از مستقل بودن دستورالعملهای بایتکدها از پلتفرم است. برای مثال در نظر بگیرید که اندازه نوع عدد صحیح روی پلتفرمهای مختلف یکسان خواهد بود. برای نمونه یک نوع عدد صحیح 32 بیتی، صرفنظر از این که روی پلتفرمهای با رجیسترهای 16 بیتی، 32 بیتی یا 64 بیتی پردازش شود؛ در هر حال به صورت علامتدار بوده و 32 بیت از حافظه را اشغال میکند. کتابخانههای جاوا نیز به پرتابل بودن آن کمک میکنند. این کتابخانهها در موارد ضروری، انواع دادهای را ارائه میکنند که به روشی تا حد امکان پرتابل، کد جاوا را به قابلیتهای خاص پلتفرم متصل میسازد.
جاوا یک زبان با عملکرد بالا است
ویژگی تفسیری بودن جاوا موجب شده است عملکرد بالایی داشته باشد که در اکثر موارد بیش از حد کفایت است. جاوا در مورد اپلیکیشنهای با عملکرد بسیار بالا از کامپایل درجا (just-in-time) استفاده میکند یعنی دستورالعملهای بایتکد تفسیر شده را تحلیل میکند و دستورهای تفسیر شده با بسامد بالا را به دستورالعملهای خاص پلتفرم کامپایل میکند. تلاشهای بعدی برای تفسیر این دستورالعملهای بایتکد موجب اجرای همان دستورالعملهای خاص پلتفرم میشود و به این ترتیب عملکرد نرمافزار را ارتقا میبخشد.
جاوا یک زبان چند نخی (multithread) است
جاوا برای بهبود عملکرد برنامههایی که چندین وظیفه را به یک باره اجرا میکنند، از مفهوم اجرای چند نخی پشتیبانی میکند. برای نمونه برنامهای که رابط گرافیکی کاربر (GUI) را مدیریت میکند و در همین حال منتظر ورودی از یک اتصال شبکه است، از نخ (thread) دیگری به جای نخ GUI برای این انتظار استفاده میکند. بدین ترتیب رابط گرافیکی برنامه همچنان پاسخگو است. ابتکارهای همگامسازی جاوا به نخها اجازه میدهد که دادهها را بدون هیچ تأثیر مخربی بین خود مبادله کنند.
جاوا یک زبان پویا (دینامیک) است
به دلیل ارتباطهای متقابل بین کد برنامه و کتابخانهها که در زمان اجرا به صورت دینامیک صورت میپذیرند، نیازی به ایجاد لینک صریح بین آنها وجود ندارد. در نتیجه زمانی که یک برنامه یا یکی از کتابخانههای آن تکامل مییابد (برای مثال باگ اصلاح میشود یا عملکرد بهبود مییابد) توسعهدهنده تنها باید برنامه یا کتابخانه بهروزرسانی شده را منتشر سازد. با این که رفتار دینامیک جاوا موجب شده است به کد کمتری هنگام تغییر کد نیاز باشد؛ اما این روش انتشار میتواند موجب تداخلهایی نیز بشود. برای نمونه یک توسعهدهنده ممکن است یک نوع کلاس را از یک کتابخانه حذف کند یا نام آن را تغییر دهد. وقتی شرکتی کتابخانه به روز شده را منتشر میکند، برنامههای موجود که به آن نوع کلاس وابسته هستند از کار میافتند. برای حل این مشکل جاوا از نوع رابط (interface type) پشتیبانی میکند که مانند تعامل بین دو طرف است.
مروری بر پلتفرم جاوا
جاوا هم یک زبان برنامهنویسی و هم پلتفرمی برای اجرای کد جاوای کامپایل شده است. این پلتفرم به طور عمده شامل JVM است؛ اما محیط اجرایی را نیز شامل میشود که از اجرای JVM روی پلتفرمهای زیرساختی بومی پشتیبانی میکند. JVM خود شامل چند جزء برای بارگذاری، تأیید و اجرای کد جاوا است. در تصویر زیر شیوه اجرای یک کد جاوا روی این پلتفرم را مشاهده میکنید.
JVM شامل یک مولفه (کامپوننت) classloader، verifier بایتکد و یک مفسر و کامپایلر در جا برای بارگذاری، تأیید و اجرای یک فایل کلاس است.
در بخش فوقانی نمودار فوق یک سری از فایلهای کلاس برنامه را مشاهده میکنید که یکی از آنها به نام فایل کلاس اصلی نامیده شده است. برنامه جاوا دست کم باید یک فایل کلاس اصلی داشته باشد که نخستین کلاسی است که بارگذاری، تأیید و اجرا خواهد شد.
JVM بارگذاری کلاس را به مولفه classloader میسپارد. Classloader فایلهای کلاس را از منابع مختلف مانند سیستمهای فایل، شبکهها و فایلهای فشرده بارگذاری میکند. این مولفه، JVM را از مسائل و مشکلات مرتبط با بارگذاری کلاس بر حذر میدارد.
یک فایل کلاس بارگذاری شده در حافظه نگهداری میشود و به صورت یک شی ایجاد شده از کلاس Class نمایش مییابد. هنگام بارگذاری، bytecode verifier دستورالعملهای مختلف بایتکد را بررسی میکند تا مطمئن شود که معتبر هستند و امنیت را به مخاطره نمیاندازند.
اگر بایتکد فایل کلاس معتبر نباشد، JVM خاتمه مییابد. در غیر این صورت مولفه مفسر آن، بایتکد را یک به یک به دستورالعملها تفسیر میکند. در این فرایند تفسیر، دستورالعملهای بایتکد شناسایی شده و دستورالعملهای بومی معادل آنها اجرا میشوند.
برخی توالیهای دستورالعملهای بایتکد بیش از دیگر موارد تکرار میشوند. وقتی مفسر این موقعیت را تشخیص میدهد، کامپایلر درجای JVM به نام JIT این توالیهای بایتکد را به کد بومی کامپایل میکند تا سریعتر اجرا شوند.
در زمان اجرا، مفسر معمولاً با درخواستی برای اجرای بایتکد فایل کلاس دیگر مواجه میشود که به این برنامه یا یک کتابخانه تعلق دارد. در چنین مواردی classloader فایل کلاس را بارگذاری میکند و bytecode verifier بایتکد فایل کلاس بارگذاری شده را پیش از اجرا تأیید میکند. همچنین در زمان اجرا نیز دستورالعملهای بایتکد ممکن است از JVM بخواهند که یک فایل را باز کند، چیزی را روی صفحه نمایش دهد، صدایی ایجاد کند یا وظیفه دیگری انجام دهد که نیازمند همکاری با پلتفرم بومی است. در این موارد JVM با استفاده از رابط بومی جاوا (JNI) که یک پل فناوری برای تعامل با پلتفرم بومی برای اجرای وظایف است این کار را انجام میدهد.
نوع دینامیک یا نوع استاتیک
جاوا یک زبان برنامهنویسی با نوع استاتیک است در حالی که زبانهای برنامهنویسی دیگری مانند روبی (Ruby)، پایتون (Python)، و جاوا اسکریپت زبانهایی از نوع دینامیک محسوب میشوند. اکثر افراد به بحث تفاوت بین زبانهای با نوع استاتیک و دینامیک علاقهمند هستند.
نوع دینامیک
اگر تاکنون تجربه عملی برنامهنویسی داشته باشید، با مفهوم متغیر آشنا هستید. در زبانهای با نوع دینامیک مانند روبی یا جاوا اسکریپت میتوان متغیری را بدون این که نوع داده ذخیره شدهاش معین باشد، اعلان کرد. این متغیر از نوع دینامیک است و مقدار آن میتواند هر چیزی مانند یک عدد، جمله و یا غیره باشد.
نوع استاتیک
هنگامی که با دادهها در زبانهای از نوع استاتیک مانند جاوا سر و کار داریم، باید در زمان اعلان متغیر دقیقاً مشخص کنیم که متغیر چه نوع دادهای را نگهداری خواهد کرد. برای نمونه این متغیر حاوی عدد خواهد بود یا متغیر دیگر متن را ذخیره میکند و متغیر سوم حاوی تاریخ خواهد بود. این بدان معنی است که یک زبان از نوع استاتیک ساختار بیشتری را شامل میشود. برخی از انواع خطاهایی که برنامهنویسها مرتکب میشوند، توسط ابزارهایی که جاوا در اختیار ما قرار میدهد، حتی پیش از اجرای برنامه، قابل تشخیص هستند. با این حال در صورتی که در زبانهای از نوع دینامیکی مانند روبی یا پایتون برنامهنویسی کنید، چنین خطاهایی تا زمان اجرای برنامه و مواجهه با از کار افتادن برنامه قابل تشخیص نخواهند بود.
بدین ترتیب در زبانهای برنامهنویسی از نوع استاتیک یک لایه اضافی از کدنویسی وجود دارد که باید انواع همه متغیرها از قبل مورد تفکر قرار گرفته و مشخص شود. بنابراین یادگیری زبانهای از نوع دینامیک برای کسانی که اولین زبان برنامهنویسیشان از نوع استاتیک بوده است، بسیار آسانتر از مسیر معکوس آن خواهد بود.
چه زبانهایی از جاوا مشتق شدهاند؟
برخی زبانها مانند اسکالا (Scala) و گرووی (Groovy) وجود دارند که برای اجرا روی JVM طراحی شدهاند و یا زبانهایی هستند که برای اجرا روی محیط جاوا توسعه یافتهاند. همچنین ممکن است برخی افراد ادعا کنند که زبان C# تا حدود زیادی تحت تأثیر جاوا توسعه یافته است. زبان سی شارپ مایکروسافت پس از جاوا توسعه یافت و به طور خاص به مقدار زیادی از جاوا الهام گرفته است. سی شارپ موجب برخی بهبودها در جاوا نیز شده است و از این رو این دو زبان به طور متقابل بر هم تأثیرگذار بودهاند.
جاوا چه تفاوتی با جاوا اسکریپت دارد؟
هیچ رابطه فنی بین جاوا و جاوا اسکریپت وجود ندارد. جاوا اسکریپت از سوی نت اسکیپ (Netscape) در دهه 90 میلادی توسعه یافته است و در ابتدا LiveScript نامیده میشد. زمانی که نت اسکیپ دید هیچ کس از LiveScript استفاده نمیکند و جاوا محبوبیت روزافزونی دارد، نام آن را به جاوا اسکریپت تغییر داد تا بتوانند از این موج محبوبیت جاوا بهرهمند شوند. در واقع این ایده موفق بود و جاوا اسکریپت نیز محبوب شد؛ اما از منظر فنی هیچ رابطهای بین این دو وجود ندارد و صرفاً دارای تشابه اسمی هستند. شاید تنها مشابهت فنی بین جاوا و جاوا اسکریپت را در این بدانیم که هر دو آنها دستور زبانشان را از زبان برنامهنویسی C گرفتهاند. به همین دلیل اگر با جاوا آشنا باشید، در این صورت یادگیری جاوا اسکریپت آسان خواهد بود و برعکس.
طراحی اپلیکیشن | طراحی سایت دیجی کالا | طراحی سایت فروشگاهی