برنامه نویسی -
24 شهریور 1401
زبان برنامه نویسی جاوا (JAVA) در 23 مه 1995 (برابر با 2 خرداد 1374) از سوی جیمز گاسلینگ (James Gosling) طراحی شده است. جاوا به گواهی سایت معتبر Tiobe از سال 2001 همواره به عنوان اولین یا دومین زبان برنامهنویسی دنیا مطرح بوده است. در تصویر زیر درصد رتبه کسب شده این زبان را بین همه زبانهای برنامهنویسی در طی 18 سال اخیر مشاهده میکنید. همچنین، زبان برنامه نویسی COBOL نیز یکی از زبانهای برتر در حوزه تجاری و Mainframe به حساب میآید.
تا جایی که به جاوا مربوط میشود، همه چیز از اوایل دهه 1990 آغاز شد، یعنی زمانی که شرکت سان مایکروسیستمز (Sun Microsystems) شروع به توسعه نسخه بهتری از ++C کرد که بتواند به آسانی پرتابل شود، برای افراد مبتدی مطلوب باشد و به مدیریت خودکار حافظه بپردازد. تحقیقات این شرکت منجر به خلق یک زبان کاملاً جدید شد که نام آن از میان دهها نام پیشنهادی در اتاق جلسه معرفیش انتخاب شد. امروزه لوگوی جاوا به صورت فنجان قهوهای که از آن بخار میدمد، به نماد جهانی برنامهنویسی تبدیل شده است. در واقع دیگر کسی نمیداند که ارتباط برنامهنویسها با کافئین قدیمیتر است؛ یا ارتباطشان با جاوا که امروزه مترادف با قهوه است.
اهداف اولیهی جاوا
همانطور که گفتیم جیمز گاسلینگ این زبان را با هدف جایگزینی برای ++C توسعه داد، از این رو اهداف خاصی نیز برای آن در نظر گرفته شد که عبارت بودند از:
ساده و مشهور بودن
قابلیت شئگرایی قدرتمند
کارایی و عملکرد بالا و بهینه
قابلیت انتقال و پرتابل بودن
ضریب اطمینان بالا و خطای کم
زبانی پویا با قابلیت نخکشی (Treading)
چه برنامههایی را میتوان با زبان جاوا نوشت؟
همانطور که گفتیم، جاوا یک زبان چندسکویی است، بنابراین شما میتوانید با استفاده از آن برای سیستمعاملهای مختلفی مانند ویندوز، لینوکس، اواسایکس، اندروید، وب و… برنامهنویسی کنید، در حقیقت یکبار برنامهی خود را بنویسید و همهجا آنرا استفاده کنید!
در ایران نیز برنامههای بسیار زیادی (به خصوص نرمافزارهای دولتی) با این زبان توسعه یافتهاند، بنابراین شما با یادگیری جاوا تقریبا میتوانید به بازار کار بسیار خوبی امیدوار باشید، در کشورهای توسعهیافتهای مانند استرالیا، کانادا، انگلستان و آمریکا شرایط از این نیز بهتر است و تقریبا سرمایهگذاریهای فراوانی روی آن میشود.
زبان جاوا پس از جاوا اسکریپت و SQL سومین زبان پر استفاده در دنیا محسوب میشود.
ورژن های زبان برنامه نویسی جاوا
از سال ۲۰۱۵، تنها جاوای ۸ (به صورت عمومی) پشتیبانی می شود. ورژن های عرضه شده اصلی زبان برنامه نویسی جاوا به همراه تاریخ عرضه شان در زیر آمده است:
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 مارس ۲۰۱۴)
پلتفرم جاوا
یکی از اهداف طراحی زبان برنامه نویسی جاوا، قابلیت حمل است، یعنی برنامه هایی که برای پلتفرم جاوا نوشته شده اند باید روی هر ترکیبی از سخت افزار و سیستم عامل با پشتیبانی کافی از Runtime، اجرا شود. برای این کار، به جای کامپایل کردن مستقیم به کد ماشینی ساختار محور، کد زبان برنامه نویسی جاوا در یک واسطه به نام Java Bytecode کامپایل شد. دستوالعمل های Java Bytecode مشابه با کد ماشینی هستند، اما آنها توسط یک ماشین مجازی (VM) اجرا می شوند که مخصوص سخت افزار میزبان نوشته شده است. کاربران نهایی معمولا از یک محیط Java Runtime (JRE) استفاده می کنند که برای برنامه های جاوای انفرادی یا مرورگرهای وب برای Applet های جاوا، روی دستگاه هایشان نصب شده است.
کتابخانه های استاندارد یک روش عمومی برای دسترسی به ویژگی های مخصوص میزبان مانند گرافیک، threading و شبکه فراهم می کنند.
استفاده از Bytecode همگانی، انتقال آن را آسان می کند. هرچند، تفسیر Bytecode به دستورالعمل های ماشین، باعث می شود تا برنامه های تفسیر شده همیشه آهسته تر از برنامه های اجرایی محلی باشند. البته کامپایلرهای به هنگام یا Just in Time (JIT) از مراحل اولیه معرفی شدند که در زمان اجرا، بایت کدها را به کد ماشینی کامپایل می کنند. خود جاوا مستقل از پلتفرم است و توسط یک ماشین مجازی جاوا (JVM) با پلتفرمی که باید روی آن اجرا شود، سازگار می شود که Java Bytecode را به زبان ماشینی پلتفرم تفسیر می کند.
پیاده سازی ها
شرکت Oracle پس از خرید شرکت Sun Microsystems در ۲۷ ژانویه سال ۲۰۰۷، صاحب کنونی پیاده سازی رسمی پلتفرم Java SE است. این پیاده سازی براساس پیاده سازی اصلی زبان برنامه نویسی جاوا توسط شرکت Sun است. پیاده سازی Oracle برای Microsoft Windows (هنوز برای XP کار می کند، البته تنها ورژن های بعدی به صورت عمومی پشتیبانی می شوند)، Mac OS X، Linux و Solaris موجود است. به دلیل اینکه زبان برنامه نویسی جاوا هیچ استاندارد رسمی ندارد که از طرف Ecma International، ISO/IEC، ANSI یا سازمان های استاندارد ثالث به رسمیت شناخته شود، پیده سازی Oracle یک استاندارد همگانی است.
پیاده سازی Oracle در دو نوع توزیع مختلف بسته بندی شده است: محیط Java Runtime (JRE) که حاوی قسمت هایی از پلتفرم Java SE است، برای اجرای برنامه های جاوا مورد نیاز است و برای کاربران نهایی طراحی شده است و بسته توسعه جاوا (JDK) که برای توسعه دهندگان نرم افزاری در نظر گرفته شده است، حاوی ابزارهای توسعه ای مانند Java Compiler، Javadoc، Jar و Debugger است.
OpenJDK هم یک پیاده سازی قابل توجه دیگری است که دارای لیسانس GNU GPL است. این پیاده سازی زمانی آغاز شد که شرکت SUN شروع به عرضه کد منبع جاوا تحت محجوز GPL کرد. از Java SE 7 به بعد، OpenJDK، پیاده سازی مرجعی رسمی جاوا است.
هدف زبان برنامه نویسی جاوا این است که تمام پیاده سازی های جاوا، سازگار باشند. در گذشته، مجوز علامت تجاری Sun برای استفاده از برند جاوا نشان می دهد که تمام پیاده سازی ها باید سازگار باشند. این امر منجر به یک دعوی حقوقی با شرکت مایکروسافت شد و شرکت Sun اظهار کرد که پیاده سازی مایکروسافت از RMI یا JNI پشتیبانی نمی کند و ویژگی های خاص پلتفرم خود را اضافه کرده اند. شرکت Sun در سال ۱۹۹۷ شکایت کرد و در سال ۲۰۰۱ مبلغ ۲۰ میلیون دلار غرامت گرفت و همچنین یک حکم دادگاهی شرایط مجوز را از طرف شرکت Sun اجرا کرد. در نتیجه مایکروسافت دیگر جاوا را به همراه ویندوز عرضه نمی کند.
جاوای مستقل از پلتفرم برای Java EE ضروری است و یک تایید اعتبار سخت تری برای تصدیق گواهی یک پیاده سازی مورد نیاز است. این محیط اجازه برنامه های سمت سرور قابل حمل را ممکن می سازد.
عملکرد
برنامه هایی که با زبان برنامه نویسی جاوا نوشته شده اند به این شهرت دارند که آهسته تر هستند و به حافظه بیشتری نسبت به برنامه های نوشته شده در زبان 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) جایگزین کند.
ایرادات مطرح شده
مصرف حافظه بالا و سختافزار در برنامههای نوشته شده و مدیریت غیر متوازن Thread Pool و عدم قابلیت توزیع پذیری.
حذف اشارهگرها در جاوا به دلیل مشکلاتی بوده که آنها در طول تاریخشان به وجود آوردهاند (البته در زمان گذشته که در برنامههایی مانند ++c برنامهنویس مستقیماً به مدیریت اشاره گر اقدام مینمود)، اگرچه این موارد در برنامههای سیستمی لازم بهنظر میرسد ولی در محیطهای تحتوب که بستر اصلی جاوا هستند میتوانند اثراتی به مراتب شدیدتر نسبت به آنچه در برنامههای سیستمی دارند داشته باشند و باعث میشود که توجه برنامهنویسان از مسائلی چون کارایی، قابلیت اطمینان و مقیاسپذیری برنامه به تنظیم اشارهگرها معطوف گردد.
از ابتدای به وجود آمدن جاوا، کتابخانه JNI - Java Native Interface در آن وجود داشته که قابلیت فراخوانی و دستکاری برنامههایی در ++C و… را میداده که از نمونههای آن میتوان به Jtwain که یک بستهایست که از کتابخانههای ویندوز برای اسکن عکس استفاده میکند، یا SWT که یک بسته نرمافزاریست که از کتابخانههای ویندوز و لینوکس (برحسب سیستمعامل) برای ساخت واسط کاربری (UI) استفاده میکند، نام برد.
شباهت اسمی جاوا و جاوااسکریپت
برخی مردم به علت شباهت اسمی، جاوا و جاوااسکریپت را با هم اشتباه میگیرند. در حالیکه این دو زبان گرچه در ظاهر و کلمات شباهت دارند ولی بهطور ساختاری با یکدیگر کاملاً متفاوت هستند. جاوااسکریپت محصول شرکت نت اسکیپ است. جاوا برای اجرا باید به زبان ماشین مجازی ترجمه شود اما جاوااسکریپت زبانی است که معمولاً در صفحات وب نوشته میشود و توسط مرورگر تفسیر میگردد. در جاوا متغیرها همگی بر اساس نوع آنها معرفی میشوند ولی در جاواسکریپت نوع متغیرها به صورت ضمنی مشخص میشود.
جاوا در سال ۲۰۲۰ در مقایسه با زبان های برنامه نویسی دیگر
جاوا یکی دیگر از گزینههای محبوب در سازمانهای بزرگ میباشد و دهها سال است که به همان شکل باقی مانده است. جاوا به طور گستردهای برای ساخت برنامههای تحت وب در مقیاس سازمانی استفاده میشود و مدتهاست که در لیست بهترین زبانهای برنامه نویسی دیده میشود. جاوا بسیار پایدار است و بنابراین، بسیاری از سازمانهای بزرگ آن را پذیرفتهاند. اگر به دنبال شغل مبتنی بر توسعه در یک سازمان بزرگ هستید، جاوا زبانی است که شما باید یاد بگیرید. جاوا همچنین در توسعه برنامه اندروید کاربرد گستردهای دارد. تقریباً هر شغلی امروز به یک برنامه اندروید نیاز دارد. با توجه به اینکه امروز میلیاردها کاربر اندروید وجود دارد و با توجه به این واقعیت که گوگل یک چارچوب عالی برای توسعه مبتنی بر جاوا (Android Studio) ایجاد کرده است.