زبان برنامه نویسی جاوا – Java چیست

 

 

معرفی زبان برنامه نویسی جاوا – Java

زبان برنامه نویسی جاوا  یک زبان برنامه نویسی همه منظوره است که همزمان، مبتنی بر کلاس و شیء گرا است و طوری طراحی شده است تا کمترین وابستگی اجرایی ممکن را داشته باشد. شعار این زبان، “یک بار بنویس، همه جا اجرا کن” است، یعنی کد جاوای کامپایل شده می تواند روی تمام پلتفرم هایی که از جاوا پشتیبانی می کنند، اجرا شود و نیازی به کامپایل کردن مجدد نیست. برنامه های جاوا معمولا به صورت Bytecode کامپایل می شوند و صرف نظر از ساختار کامپیوتر، می توانند روی هرگونه دستگاه مجازی اجرا شوند. در سال ۲۰۱۶، جاوا یکی از محبوب ترین زبان های برنامه نویسی مورد استفاده، مخصوصا برای برنامه های وب سرور مشتری است و گزارش شده است که ۹ میلیون توسعه دهنده دارد. جاوا در ابتدا توسط جیمز گاسلینگ در شرکت Sun Microsystems توسعه یافت (که اکنون توسط شرکت Oracle خریداری شده است) و در سال ۱۹۹۵ به عنوان یک مولفه اصلی از پلتفرم جاوای شرکت Sun Microsystems عرضه شد. بیشتر قواعد این زبان از زبان های C و C++ گرفته شده است، اما امکانات سطح پایین کمتری نسبت به آنها دارد.

اصول اولیه زبان برنامه نویسیJava

پنج هدف اصلی در ساخت زبان برنامه نویسی Java وجود داشت:

۱. باید “ساده، شیء گرا و آشنا” باشد.
۲. باید “قدرتمند و ایمن” باشد.
۳. باید “از نظر ساختاری خنثی و قابل حمل” باشد.
۴. باید با “عملکرد بالایی” اجرا شود.
۵. باید “تفسیر شده، رشته ای و پویا” باشد.

ورژن های زبان برنامه نویسی جاوا

از سال ۲۰۱۵، تنها جاوای ۸ (به صورت عمومی) پشتیبانی می شود. ورژن های عرضه شده اصلی زبان برنامه نویسی جاوا به همراه تاریخ عرضه شان در زیر آمده است:

JDK 1.0 (21 ژانویه ۱۹۹۶)
JDK 1.1 (19 فوریه ۱۹۹۷)
J2SE 1.2 (8 دسامبر ۱۹۹۸)
J2SE 1.3 (8 می ۲۰۰۰)
J2SE 1.4 (6 فوریه ۲۰۰۲)
J2SE 5.0 (30 سپتامبر ۲۰۰۴)
Java SE 6 (11 دسامبر ۲۰۰۶)
Java SE 7 (38 جولای ۲۰۱۱)
Java SE 8 (18 مارس ۲۰۱۴)

نمودار شاخص محبوبیت زبان های برنامه نویسی TIOBE از سال 2002 تا 2015

کاربردهای زبان برنامه نویسی Java

پلتفرم جاوا

یکی از اهداف طراحی زبان برنامه نویسی جاوا، قابلیت حمل است، یعنی برنامه هایی که برای پلتفرم جاوا نوشته شده اند باید روی هر ترکیبی از سخت افزار و سیستم عامل با پشتیبانی کافی از Runtime، اجرا شود. برای این کار، به جای کامپایل کردن مستقیم به کد ماشینی ساختار محور، کد زبان برنامه نویسی جاوا در یک واسطه به نام Java Bytecode کامپایل شد. دستوالعمل های Java Bytecode مشابه با کد ماشینی هستند، اما آنها توسط یک ماشین مجازی (VM) اجرا می شوند که مخصوص سخت افزار میزبان نوشته شده است. کاربران نهایی معمولا از یک محیط Java Runtime (JRE) استفاده می کنند که برای برنامه های جاوای انفرادی یا مرورگرهای وب برای Applet های جاوا، روی دستگاه هایشان نصب شده است.

کتابخانه های استاندارد یک روش عمومی برای دسترسی به ویژگی های مخصوص میزبان مانند گرافیک، threading و شبکه فراهم می کنند.

استفاده از Bytecode همگانی، انتقال آن را آسان می کند. هرچند، تفسیر Bytecode به دستورالعمل های ماشین، باعث می شود تا برنامه های تفسیر شده همیشه آهسته تر از برنامه های اجرایی محلی باشند. البته کامپایلرهای به هنگام یا Just in Time  (JIT) از مراحل اولیه معرفی شدند که در زمان اجرا، بایت کدها را به کد ماشینی کامپایل می کنند. خود جاوا مستقل از پلتفرم است و توسط یک ماشین مجازی جاوا (JVM) با پلتفرمی که باید روی آن اجرا شود، سازگار می شود که Java Bytecode را به زبان ماشینی پلتفرم تفسیر می کند.

کنترل پنل جاوا، ورژن 7

 

عملکرد

برنامه هایی که با زبان برنامه نویسی جاوا نوشته شده اند به این شهرت دارند که آهسته تر هستند و به حافظه بیشتری نسبت به برنامه های نوشته شده در زبان C++ نیاز دارند. هرچند، با معرفی فرایند کامپایل سازی Just in Time در سال های ۱۹۹۷ و ۱۹۹۸ برای Java 1.1، اضافه شدن ویژگی های زبان با پشتیبانی بهتر از تحلیل کد (مانند کلاس های داخلی، کلاس StripBuilder، assertion های اختیاری و غیره) و بهینه سازی ماشین مجازی جاوا، مانند پیش فرض شدن HotSpot  در JVM در سال ۲۰۰۰، سرعت اجرای برنامه های جاوا بطور چشمگیری بهبود یافت. در Java 1.5 با اضافه شدن بسته java.util.concurrent که شامل پیاده سازی بدون قفل ConcurrentMaps و دیگر مجموعه های چند هسته ای، عملکرد آن بهبود پیدا کرد و در جاوای ۱.۶ بیشتر بهبود یافت.

برخی پلتفرم ها پشتیبانی سخت افزاری مستقیم برای جاوا ارائه می دهند. میکروکنترلرهایی وجود دارند که می توانند به جای نرم افزار، جاوا را در ماشین مجازی جاوای سخت افزاری اجرا کنند و پردازنده های مبتنی بر ARM می توانند پشتیبانی سخت افزاری برای اجرای Java Bytecode از طریق گزینه Jazelle داشته باشند (در نسخه های جدیدتر ARM، بیشتر این پشتیبانی متوقف شده است).

مدیریت حافظه خودکار

زبان برنامه نویسی جاوا از یک garbage collector خودکار استفاده می کند تا حافظه را در طول عمر شیء مدیریت کند. برنامه نویس تعیین می کند چه زمانی اشیا ساخته می شوند و زمانی که اشیا دیگر مورد استفاده قرار نگیرند، Java Runtime مسئولیت بازیابی حافظه را بر عهده دارد. زمانی که هیچ منبعی به شیء باقی نماند، حافظه غیر قابل دسترسی واجد شرایط آزاد شدن بطور خودکار توسط Garbage Collector می شود. البته اگر کد برنامه نویس به یک شیء رفرنس داشته باشد که دیگر مورد نیاز نیست، ممکن است چیزی شبیه نشت حافظه رخ دهد. این اتفاق معمولا زمانی می افتد که اشیایی که دیگر نیازی به آنها نیست در محفظه هایی ذخیره می شوند که هنوز در حال استفاده هستند. اگر متدهای یک شیء ناموجود فراخوانی شوند، خطای null pointer exception نمایش داده می شود.

یکی از ایده های پشت مدل مدیریت حافظه خودکار جاوا این است که نیازی نیست برنامه نویس ها مدیریت حافظه را به صورت دستی انجام دهند. در برخی زبان ها، حافظه برای ساخت اشیا بطور ضمنی روی Stack اختصاص داده می شود یا بوضوح از روی Heap اختصاص داده می شود و سپس گرفته می شود. در مورد دوم، مسئولیت مدیریت حافظه با برنامه نویس است. اگر برنامه یک شیء را deallocate نکند، نشت حافظه رخ می دهد. اگر برنامه سعی کند به یه حافظه ای که از قبل deallocate شده است دسترسی پیدا کند یا آن را deallocate کند، نتیجه نامشخص و پیش بینی آن است و برنامه احتمالا ناپایدار شده یا متوقف می شود. با استاده از Smart Pointer ها می توان این مشکل را تا حدی رفع کرد، اما اینها نیز فشار و پیچیدگی بیشتر ایجاد می کنند. توجه کنید که عمل Garbage Collection از نشت های حافظه ” منطقی” جلوگیری نمی کند، یعنی آنهایی که به حافظه هنوز رفرنس داده شده است، اما هرگز استفاده نمی شود.

Garbage Collection ممکن است در هر زمانی رخ دهد. بطور ایده آل باید زمانی اتفاق بیفتد که برنامه بیکار است. اگر حافظه آزاد کافی در Heap برای تخصیص دادن به یک شیء جدید وجود نداشته باشد، فعال شدن آن تضمین می شود. این کار می تواند باعث شود برنامه موقتا بی حرکت شود. مدیریت حافظه صریح در زبان برنامه نویسی جاوا امکان پذیر نیست.

زبان برنامه نویسی جاوا از pointer arithmetic سبک C و C++ که آدرس ها و اعداد صحیح تخصیص داده نشده (معمولا اعداد صحیح بلند) را می توان به جای هم استفاده کرد، پشتیبانی نمی کند. این امر به Garbage Collector اجازه می دهد تا اشیای ارجاع داده شده را از نو تخصیص دهند و از Type Safety و امنیت آن اطمینان حاصل کنند.

مانند C++  و دیگر زبان های شیء گرا، متغیرهای انواع داده های اولیه جاوا یا مستقیما در فیلدها (برای اشیا) ذخیره می شوند، یا روی Stack (برای متدها) به جای Heap، مانند انوع داده غیر اولیه. این یک تصمیم آگاهانه از طرف طراح زبان برنامه نویسی جاوا به خاطر مسائل عملکردی بود.

زبان برنامه نویسی جاوا حاوی چند نوع Garbage Collector است. بطور پیش فرض، HotSpot از parallel scavenge garbage collector استفاده می کند. البته چند Garbage Collector دیگر وجود دارد که برای مدیریت حافظه Heap  می توانند مورد استفاده قرار گیرند. برای ۹۰ درصد برنامه های جاوا، Concurrent Mark-Sweep (CMS) کفایت می کند. شرکت Oracle قصد دارد CMS  را با Garbage-First collector (G1) جایگزین کند.

قاعده نحوی

قاعده نحوی زبان برنامه نویسی جاوا تا حد زیادی تحت تاثیر C++ بوده است. برخلاف زبان C++ که قاعده برنامه نویسی ساختاری، عمومی و شیء گرا را ترکیب می کند، زبان برنامه نویسی جاوا منحصرا به عنوان یک زبان شیء گرا ساخته شده است. تمام کدها در داخل کلاس ها نوشته می شوند و هر آیتم داده ای، یک شیء است، البته به استثنای انواع داده اولیه مانند اعداد صحیح، اعداد با ممیز شناور، مقادیر بولی و حروف که به دلایل عملکردی، جزو اشیا نیستند. زبان برنامه نویسی جاوا از برخی جنبه های محبوب C++ مجددا استفاده کرده است (مانند متد Printf()).

زبان برنامه نویسی جاوا برخلاف C++ از سربارگزاری عملگرها یا وراثت چندگانه برای کلاس ها پشتیبانی نمی کند، اما وراثت چندگانه برای رابط های کاربری پشتیبانی می شود. این کار منجر به سادگی زبان می شود و در جلوگیری از خطاهای احتمالی و طراحی ضد الگو، کمک می کند.

برچسبها
مطالب مرتبط

دیدگاهی بنویسید.

بهتر است دیدگاه شما در ارتباط با همین مطلب باشد.

0