زبان برنامهنویسی Java در ابتدا برای کار روی سیستمهای تعبیهشده، ستتاپباکسها و تلویزیونها توسعه داده شد. بنابراین، بر اساس نیازها، از ابتدا طوری طراحی شد که روی پلتفرمهای مختلف کار کند. در طی سالهای متمادی، Java تکامل یافت و به یکی از محبوبترین زبانهای برنامهنویسی برای توسعه برنامههای مبتنی بر اینترنت تبدیل شد.Java یک زبان غنی از ویژگیها است و با هر نسخه جدید، بهطور پیوسته در حال پیشرفت و بهبود میباشد. این زبان بهطور گستردهای در میلیاردها دستگاه استفاده میشود. در ادامه، ویژگیهای اصلی زبان Java آمده است:
- شیگرا (Object Oriented)
- مستقل از پلتفرم (Platform Independent)
- ساده (Simple)
- امن (Secure)
- دارای معماری بیطرف (Architecture-neutral)
- قابل حمل (Portable)
- مقاوم (Robust)
- چندریسمانی (Multithreaded)
- تفسیرشده (Interpreted)
- با عملکرد بالا (High Performance)
- توزیعشده (Distributed)
- پویا (Dynamic)
شیگرا (Object Oriented)
در Java، همه چیز یک شیء است. Java به راحتی قابل گسترش است چرا که مبتنی بر مدل شیگرایی میباشد. به عنوان یک زبان برنامهنویسی شیگرا، Java از مفاهیم پایهای شیگرایی پشتیبانی میکند که عبارتند از:
- چندریختی (Polymorphism)
- وراثت (Inheritance)
- کپسولهسازی (Encapsulation)
- انتزاع (Abstraction)
- کلاسها (Classes)
- اشیاء (Objects)
- نمونه (Instance)
- متد (Method)
- ارسال پیام (Message Passing)
مستقل از پلتفرم (Platform Independent)
بر خلاف بسیاری از زبانهای برنامهنویسی دیگر از جمله C و ++C، زمانی که Java کامپایل میشود، به کد ماشین مخصوص یک پلتفرم خاص تبدیل نمیشود، بلکه به بایتکدی مستقل از پلتفرم کامپایل میشود. این بایتکد از طریق اینترنت توزیع شده و توسط ماشین مجازی جاوا (JVM) روی هر پلتفرمی که اجرا شود تفسیر میشود.
Java بهگونهای طراحی شده که طبق اصل “یکبار بنویس، همهجا اجرا کن” (Write Once, Run Anywhere – WORA) عمل میکند. کدی که در Java نوشته میشود مستقیماً به نوع ماشین وابسته نیست. کد Java به بایتکد کامپایل میشود که مستقل از پلتفرم است. ماشین مجازی جاوا (JVM) توانایی درک این بایتکد را دارد. Java برای هر پلتفرم، JVM مخصوص همان پلتفرم را فراهم کرده است. مسئولیت تفسیر صحیح بایتکد بر عهده JVM مخصوص آن پلتفرم است، بنابراین توسعهدهندگان میتوانند بدون نگرانی از سیستمعاملهایی مانند ویندوز، لینوکس، یونیکس، مک و غیره، کدنویسی کنند. این ویژگی، Java را به زبانی پلتفرمخنثی تبدیل کرده است.
از آنجا که بایتکد میتواند از طریق وب توزیع شود و توسط JVM روی هر پلتفرمی که در حال اجراست تفسیر شود، کدهای Java بسیار قابل حمل هستند و برای برنامههایی که روی پلتفرمهای مختلف اجرا میشوند بسیار مفید میباشند.
ساده (Simple) 🧠
Java طوری طراحی شده است که یادگیری آن آسان باشد. اگر مفاهیم پایهای برنامهنویسی شیگرا (OOP) را درک کنید، یادگیری Java برای شما ساده خواهد بود.Java زبان بسیار آسانی برای یادگیری است. این زبان بسیاری از ویژگیهای خود را از زبانهای C و ++C به ارث برده و در عین حال، ویژگیهای پیچیدهای مانند اشارهگرها (pointers)، اضافهبارگذاری عملگرها (operator overloading)، وراثت چندگانه (multiple inheritance)، تخصیص صریح حافظه و … را حذف کرده است. Java جمعآوری خودکار زباله (Garbage Collection) را فراهم میکند. با مجموعهای غنی از کتابخانهها که هزاران تابع کاربردی را در اختیار برنامهنویسان قرار میدهد، Java زندگی توسعهدهندگان را بسیار راحتتر میسازد.
امن (Secure) 🔐
Java با داشتن ویژگیهای امنیتی، امکان توسعه سیستمهای بدون ویروس و بدون دستکاری را فراهم میکند. روشهای احراز هویت در آن بر پایه رمزنگاری کلید عمومی هستند.Java ذاتاً امنیت بالایی دارد، زیرا به توسعهدهندگان اجازه نمیدهد با حافظه سیستم یا سیستمعامل بهصورت مستقیم تعامل داشته باشند. بایتکد Java امن است و مشکلات امنیتیای مثل سرریز بافر (buffer overflow) و نشت حافظه (memory leak) بسیار نادر هستند. مکانیزم مدیریت استثناها در Java به برنامهنویسان اجازه میدهد تا تقریباً همه نوع خطا یا استثنای احتمالی را در هنگام اجرای برنامه کنترل کنند. جمعآوری خودکار زباله نیز به استفاده بهینه از حافظه کمک میکند.
بیطرف از نظر معماری (Architecture-neutral) 🏗️
کامپایلر Java یک فرمت فایل شیء بیطرف نسبت به معماری تولید میکند که این امکان را میدهد کد کامپایلشده روی پردازندههای مختلف اجرا شود، مشروط به اینکه محیط اجرای Java (JRE) در دسترس باشد.
Java کامپایلری دارد که خروجی آن بایتکدهایی با فرمت بیطرف نسبت به سختافزار است. این ویژگی باعث میشود که کدهای Java بتوانند روی انواع پردازندهها اجرا شوند. حتی با پیشرفتهای روزافزون در معماری پردازندهها، کد Java نیازی به تطبیق با الزامات خاص پردازندهها ندارد. از آنجا که Java یک استاندارد باز است، امکان ساخت JVM مخصوص برای هر معماری خاص نیز وجود دارد. امروزه تقریباً برای همه پلتفرمهای معروف، JVM وجود دارد، بنابراین کد Java کاملاً مستقل از سختافزار اجراکننده است. بهعنوان مثال، یک برنامه Java که در ویندوز نوشته شده میتواند بدون تغییر روی لینوکس اجرا شود.
قابل حمل (Portable) 🧳
ویژگی بیطرف بودن از نظر معماری و نبود وابستگی به پیادهسازی خاص، Java را به زبانی قابل حمل تبدیل کرده است. کامپایلر Java به زبان ANSI C نوشته شده و مرزهای قابل حمل بودن را بهخوبی رعایت میکند که شامل مجموعهای از استاندارد POSIX است.
همین قابلیت حمل بالا باعث شد Java از همان ابتدا مورد استقبال قرار بگیرد. این ویژگی مخصوصاً برای برنامههای مبتنی بر اینترنت که در محیطهایی با پلتفرمهای مختلف اجرا میشوند بسیار مفید بود. امکان استفاده از یک کد یکسان در چندین پلتفرم، همکاری بین توسعهدهندگان را در نقاط مختلف جهان آسانتر میکند.
مقاوم (Robust) 🛡️
Java تلاش میکند تا خطاهای رایج را با تأکید روی بررسی خطاها در زمان کامپایل و اجرا کاهش دهد. ویژگیهایی مانند جمعآوری خودکار زباله، مدیریت حافظه قوی، عدم استفاده از اشارهگرها، عدم دسترسی مستقیم به حافظه سیستم، مدیریت استثناها و کنترل خطا از مهمترین ویژگیهایی هستند که Java را به زبانی مقاوم و قابل اعتماد تبدیل میکنند.
چندریسمانی (Multithreaded) 🔄
Java با پشتیبانی از چندریسمانی، امکان نوشتن برنامههایی را فراهم میکند که میتوانند چند وظیفه را بهصورت همزمان انجام دهند. این ویژگی باعث میشود که برنامههای تعاملی روانتر اجرا شوند.
یک برنامه چندریسمانی از دو یا چند بخش تشکیل شده که میتوانند بهطور همزمان اجرا شوند و هر بخش وظیفهای مجزا را بر عهده دارد. این کار باعث میشود منابع سیستم بهینه استفاده شوند، مخصوصاً در سیستمهایی که چند CPU دارند.
بهطور کلی، چندوظیفگی به معنای اشتراک منابع پردازشی بین چندین فرایند است. چندریسمانی این مفهوم را به داخل یک برنامه گسترش میدهد، بهگونهای که عملیات خاصی را میتوان به ریسههای مجزا تقسیم کرد و هر ریسه میتواند بهطور همزمان اجرا شود. سیستمعامل زمان پردازش را نهتنها بین برنامههای مختلف بلکه بین هر ریسه در یک برنامه نیز تقسیم میکند.
چندریسمانی این امکان را فراهم میکند که فعالیتهای متعددی بهصورت همزمان در یک برنامه انجام شوند.
تفسیرشده (Interpreted) 📜
کد بایتکد Java بهصورت بلادرنگ به دستورالعملهای ماشین بومی ترجمه میشود و در هیچجا ذخیره نمیشود. فرآیند توسعه به همین دلیل سریعتر و تحلیلیتر است، چرا که لینکدهی در Java سبک و تدریجی است.
ماشین مجازی Java (JVM) بین کامپایلر Java و سختافزار قرار دارد. کامپایلر Java (مانند javac) کد Java را به بایتکد تبدیل میکند، که قابل درک برای JVM است. سپس JVM با استفاده از کامپایلر JIT (Just-in-Time)، این بایتکد را هنگام اجرا به کد باینری قابل فهم برای ماشین تبدیل میکند.
عملکرد بالا (High Performance) ⚡
Java با استفاده از کامپایلرهای JIT عملکرد بالایی ارائه میدهد. JVM از کامپایلر JIT برای بهینهسازی زمان اجرای برنامه استفاده میکند. برخی از بهینهسازیهای رایج انجامشده توسط JIT عبارتند از:
- درونخطسازی متدها (Method inlining)
- حذف کدهای بدون استفاده (Dead code elimination)
- بهینهسازی محل فراخوانی توابع
- تاخیر در محاسبه مقادیر ثابت (Constant folding)
توزیعشده (Distributed) 🌐
Java برای محیطهای توزیعشده اینترنت طراحی شده است. این زبان قابلیت توسعه برنامههایی را دارد که میتوانند بین چندین سیستم در بستر شبکه توزیع شوند و بهطور همزمان کار کنند.
پویا (Dynamic) 🔄
Java نسبت به زبانهایی مانند C یا ++C بسیار پویاتر است، زیرا برای سازگاری با محیطهای در حال تغییر طراحی شده است. برنامههای Java میتوانند اطلاعات زیادی را در زمان اجرا حمل کنند، که این اطلاعات برای بررسی و تشخیص نوع دسترسی به اشیاء در زمان اجرا مورد استفاده قرار میگیرند.