جاوا ( Java ) یک زبان برنامهنویسیِ شئگرا است که برای نخستین بار توسط جیمز گاسلینگ در شرکت سان مایکروسیستمز ایجاد گردید و در سال ۱۹۹۵ به عنوان بخشی از سکوی جاوا منتشر شد. زبان جاوا شبیه به ++C است اما مدل شیءگرایی آسانتری دارد و از قابلیتهای سطح پایین کمتری پشتیبانی میکند. یکی از قابلیتهای بنیادین جاوا این است که مدیریت حافظه را بطور خودکار انجام میدهد. ضریب اطمینان عملکرد برنامههای نوشتهشده به این زبان بالا است و وابسته به سیستمعامل خاصی نیست، به عبارت دیگر میتوان آن را روی هر رایانه با هر نوع سیستمعاملی اجرا کرد. برنامههای جاوا به صورت کدهای بیتی همگردانی (کامپایل) میشوند؛ که مانند کد ماشین هستند و به ویژه وابسته به سیستمعامل خاصی نیستند.
جاوا چگونه کار می کند؟
شیوة کارکرد جاوا بسیار جالب است. در این زبان وقتی شما برنامه ای می نویسید و آنرا کامپایل می کنید، برنامة کامپایل شده مستقیما قابل اجرا نیست، نتیجة اجرای برنامه کدهای میانی است که به آنها «بایت کد» گفته می شود. بایت کدها توسط برنامة واسطه ای که به آن «ماشین مجازی جاوا» یا JVM گفته می شود روی سیستم عامل مورد نظر تطبیق داده شده و اجرا می شوند. این مطلب در شکل زیر نشان داده شده است:

کار JVM تطبیق برنامة شما با محلی است که برنامه قرار است روی آن اجرا شود، بنابراین لازم نیست به اینکه برنامه تان قرار است کجا اجرا شود فکر کنید. این موضوع مسئولیت JVM است که قبلا آنرا روی سیستم خود نصب کرده اید. شکل زیر جزئیات بیشتری از عملکرد ماشین مجازی جاوا را نشان می دهد.

با جاوا چه نوع برنامه هایی می توان نوشت؟
زبان جاوا یک زبان همه منظوره است یعنی با استفاده از آن می توانید انواع بسیار مختلف و متنوعی از برنامه ها را بنویسید از برنامه های رومیزی که فقط روی یک کامپیوتر اجرا می شوند تا برنامه های وب و برنامه های توزیع شده، و حتی بازیهای کامپیوتری. از جاوا برای ارتباط با سخت افزار استفاده نمی شود، مثلا از جاوا برای ارتباط با پرینتز و اسکنر استفاده نمی شود زیرا وقتی صحبت سخت افزار به میان می آید نیازمند زبانی هستیم که بی واسطه بتواند با سیستم عامل یا حتی سخت افزار ارتباط برقرار کند. چون جاوا توسط JVM اجرا می شود و JVM نیز خود توسط سیستم عامل اجرا می شود، ارتباط با سخت افزار از طریق جاوا خیلی منطقی نیست هرچند غیرممکن نیز نیست.
در بازار کار بیشتر چه برنامه هایی تولید می شوند؟
در بازار کار از زبان جاوا بیشتر برای تولید برنامه های تحت وب و برنامه های توزیع شده استفاده می شود. برنامه های رومیزی سهم بسیار کمی از بازار جاوا را در اختیار دارند.
نسخه های مختلف جاوا چیستند؟
جاوا در سه نسخة رسمی ارایه می شود معنی و کاربرد هر نسخه در جدول زیر نشان داده شده است.
نسخة جاوا | مخفف | کاربرد |
Java Sandard Edition | Java SE | نسخة پایة جاواست. برای نوشتن هر برنامة جاوا به این نسخه نیاز دارید. در این نسخه کتابخانه های اصلی جاوا قرار دارند. برای تولید برنامه های رومیزی از این نسخه استفاده می شود. |
Java Micro Edition | Java ME | از این نسخه برای نوشتن برنامه ها روی سخت افزارهای خاص مثل موبایل، لوازم خانگی، …استفاده می شود. |
Java Enterprise Edition | Java EE | این نسخة مدرن و سازمانی جاواست نسخه ای که برای تولید برنامه های وب، برنامه های توزیع شده، … استفاده می شود. برنامه هایی که با استفاده از این نسخه تولید می شوند روی سرور اجرا می شوند. |
طبیعی است که برای یادگیری جاوا باید از Java SE شروع کنید. Java ME به نسبت ساده است و پیچیدگی زیادی ندارد. Java EE بسیار وسیع، گسترده و تا حدودی پیچیده است. یادگیری Java EE نیاز به زمانی طولانی دارد. اگر می خواهید به عنوان برنامه نویس جاوا مشغول به کار شوید باید هرچه زودتر خود را به سطح Java EE برسانید تقریبا تمام پروژه های جاوایی که در ایران انجام می شوند با استفاده از Java EE پیاده سازی می شوند. متخصصان این حوزه نیز بسیار کم است. در خارج از ایران نیز تقریبا وضع به همین شکل است.
چگونه باید برنامه ریزی برای یادگیری جاوا را شروع کنم؟
یادگیری زبان جاوا نیاز به علاقه، پشتکار، و برنامه ریزی دقیق است. وقتی از علاقه و پشتکار خود مطمئن شدید، بدانید که کار سختی در پیش رو ندارید فقط لازم است برنامه ریزی داشته باشید و فرد با تجربه ای در کنار شما باشد تا شما را راهنمایی کند. خیلی خوب است اگر بتوانید در یک دروة آموزشی شرکت کنید ولی باید بدانید که صرف شرکت در یک دورة آموزشی شما را برنامه نویس نخواهد کرد. در کنار دورة آموزشی باید مرتب تمرین کنید. مطمئنا در انجام تمرینات سوالات بسیاری برای شما پیش خواهد آمد، مشکلات زیادی را تجربه خواهید کرد، و بسیاری از جنبه های زبان جاوا برای شما روشن خواهد شد. بنابراین در یک جملة ساده، شما باید علاقه و پشتکار داشته باشید و ضمن شرکت در یک دورة آموزشی، به صورت مدوام و مستمر تمرین کنید. مطمئن باشید برنامه نویسی قدرتمندی خواهید شد.
بازار کار جاوا در ایران و خارج از ایران چگونه است؟
بازار کار جاوا در ایران بسیار خوب است. در ایران حجم بسیار بالای از پروژه های دولتی با جاوا پیاده سازی می شوند از آنجائیکه پروژه های بزرگ همگی دولتی هستند برنامه نویس جاوا بسیار بیش از گذشته مورد نیاز است. نوعا حقوق برنامه نویسان جاوا تا چندین برابر زبانهای برنامه نویسی دیگر است. وضعیت جاوا در خارج ایران از داخل هم بهتر است کشورهای استرالیا، انگلستان، و کانادا از عمده سرمایه گذاران در زمینة جاوا هستند در این کشورها پروژه ها به صورت پیش فرض با جاوا تولید می شوند. در کشورهای دیگر صاحب فناوری مثل آمریکا نیز وضع تقریبا به همین منوال است. گذشته از این، دانشگاهها و مراکز آکادمیک از گذشته تا کنون جاوا را به عنوان زبان مرجع برای کامپیوتر می شناسند.
اندروید چیست؟
اندروید یکی از چند سیستم عامل محبوب گوشیهای هوشمند است که توسط گوگل طراحی شده است. بسیاری از شرکتهای سازندة گوشیهای هوشمند از اندروید به عنوان سیستم عامل گوشیهای خود استفاده می کنند سامسونگ، HTC، و Sony از جمله این شرکتها هستند. اگر می خواهید برنامه ای برای این گوشیها که اندروید سیستم عامل آنهاست بنویسید می توانید از «بستة توسعة اندروید» استفاده کنید این بسته که به زبان جاواست توسط گوگل به صورت رایگان و منبع-باز تهیه شده است. برنامه نویسی اندروید مبتنی بر جاوای استاندارد است، ولی مفاهیم، جزئیات و تکنیکهای برنامه نویسی خاص خود را دارد.
برای یادگیری جاوا باید لینوکس بلد باشم؟
برای یادگیری جاوا هیچ پیش نیازی وجود ندارد. البته اگر با یک زبان برنامه نویسی آشنا باشید یا مفاهیم شی گرایی را بدانید مطمئنا خیلی سریع تر جاوا را یاد خواهید گرفت. ولی همانطور که گفته شد جاوا مستقل از سخت افزار و سیستم عامل است، بنابراین می توانید روی لینوکس، ویندوز، یا مک برنامه نویسی جاوا کنید.
برای شروع برنامه نویسی جاوا به چه چیزهایی نیاز دارم؟
اولین چیزی که به آن احتیاج دارید JDK است. JDK مخفف عبارت Java Development Kit است و در فارسی به آن «بستة توسعة جاوا» گفته می شود. این بسته شامل مجموعه ای از ابزارها شامل کامپایلر، دیباگر، اجراکنندة جاوا، کتابخانه های جاوا، چندین برنامة نمونه و هر آنچیزی است که برای برنامه نویسی به زبان جاوا به آن نیاز دارید. بنابراین قبل از شروع برنامه نویسی جاوا باید JDK را نصب کنید. بعد از اینکه JDK را روی سیستم خود نصب کردید باید یک ویرایشگر جاوایی داشته باشید تا بتوانید کدهای جاوا را در آن تایپ کنید و در کامپایل و اجرای برنامه به شما کمک کند. اگرچه شما می توانید بدون ویرایشگر، یک برنامة جاوا را بنویسید اما داشتن یک ویرایشگر کمک شایانی در برنامه نویسی سریع و بی عیب و نقص شما را خواهد داشت. ویرایشگرهای معروف جاوایی عبارتند از eclipse، Intellij Idea، و NetBeans.
تاریخچه
در مقایسه با زبانهای دیگر، همچون ++C یا بیسیک یا فورترن، جاوا زبان نسبتاً جدیدتری است. شرکت سان مایکروسیستمز (به انگلیسی: Sun Microsystems) در سال ۱۹۹۱ یک پروژه تحقیقاتی به نام گرین (Green) را آغاز کرد. هدف این پروژه ایجاد زبانی جدید شبیه به ++C بود که نویسنده اصلی آن، جیمز گاسلینگ، آن را بلوط (Oak) نامید. اما بعدها به دلیل برخی مشکلات حقوقی[نیازمند منبع] از میان لیستی از کلمات تصادفی نام آن به جاوا تغییر کرد.
پروژه گرین به دلیل مشکلات بازاریابی در شرف لغو شدن بود تا اینکه گسترش وب در سال ۱۹۹۳ باعث نمایش تواناییهای وافر جاوا در این عرصه گشت. اینگونه بود که شرکت سان مایکروسیستمز در مه ۱۹۹۵ جاوا را رسماً به بازار عرضه کرد.
جاوا یک زبان برنامهنویسی است که در آغاز توسط شرکت سان مایکروسیستمز ایجاد شدهاست و در سال ۱۹۹۵ به عنوان بخش اصلی سکوی جاوا منتشر شد. این زبان قسمتهای بسیاری از گرامر خود را از C و ++C گرفته اما دارای مدل شیگرایی سادهای است و امکانات سطح پایین کمی دارد. کاربرد جاوا در کامپایل به صورت بایت کد است که صرف نظر از معماری و خصوصیات آن کامپیوتر، قابلیت اجرا روی تمامی ماشینهای شبیهسازی جاوا را داشته باشد. اجزای اصلی کامپایلرهای جاوا، ماشینهای پیادهسازی و کتابخانههای آن توسط این شرکت از سال ۱۹۹۵ منتشر شد. در مه ۱۹۹۷ این شرکت، نرمافزار رایگان این زبان را فراهم کرد. دیگران هم کاربردهای دیگری از این زبان را منتشر کردند مثل کامپایلر GNU برای جاوا.
مرورگرهای اصلی وب، به هم پیوستند تا به طور مطمئن جاوا اپلت را بدون صفحات وب اجرا کنند و به این صورت جاوا خیلی زود معروف و محبوب شد. با پیدایش java2، نسخهٔ جدید توانست ترکیبهای جدیدی را برای نوعهای مختلف پلت فرمها ایجاد کند. به عنوان مثال J2EE، باهدف کاربرد برای تشکیلات اقتصادی، و نسخهٔ سکوی جاوا، نسخه میکرو برای تلفن همراه منتشر شد. در سال ۱۹۹۶ با هدف بازاریابی، این شرکت نسخهٔ جدید J2 را با نامهای سکوی جاوا، نسخه سازمانی، سکوی جاوا، نسخه میکرو و سکوی جاوا، نسخه استاندارد منتشر کرد. در سال ۱۹۹۷ شرکت سان میکروسیستمز، ISO/IEC JTC1 standards body و Ecma International را به فرمول جاوا تغییر داد. شرکت Sun بسیاری از کاربردهای جاوایش را بدون هیچ هزینهای فراهم آورد. شرکت Sun با فروش مجوز برای بعضی از کاربردهای خاصش مثل Java Enterprise System درآمدی را بدست آورد. در ۱۳ نوامبر ۱۹۹۶ شرکت Sun نرمافزار جاوا را به صورت رایگان و با مجوز عمومی برای همه منتشر کرد.
اهداف اولیه
- این زبان باید ساده، شیگرا و مشهور باشد.
- مطمئن و بدون خطا باشد.
- وابسته به معماری کامپیوتر نبوده و قابل انتقال باشد.
- باید با کارایی بالا اجرا شود.
- باید به صورت پویا و نخکشیشده باشد.
نسخهها
نسخههای جاوا به همراه تاریخ انتشار آنها:
- JDK 1.0، انتشار در ۲۱ ژانویهٔ ۱۹۹۶
- JDK 1.1، انتشار در ۱۹ فوریهٔ ۱۹۹۷
- J2SE 1.2، انتشار در ۸ دسامبر ۱۹۹۸
- J2SE 1.3، انتشار در ۸ می ۲۰۰۰
- J2SE 1.4، انتشار در ۶ فوریهٔ ۲۰۰۲
- J2SE 5.0، انتشار در ۳۰ سپتامبر ۲۰۰۴
- Java SE 6، انتشار در ۱۱ دسامبر ۲۰۰۶
- Java SE 7، انتشار در ۲۱۲۸ ژوئیه ۲۰۱۱
- Java SE 8، انتشار در ۱۸ مارچ ۲۰۱۴
برنامههای جاوا و اپلتها
جاوا برای نوشتن انواع برنامههای کاربردی مناسب است. با جاوا میتوان انواع برنامههای زیر را نوشت:
- برنامههای تحت وب
- برنامهنویسی سیستمهای کوچک مانند تلفن همراه، رایانه جیبی و …
- برنامههای کاربردی بزرگ (Enterprise)
- برنامههای رومیزی (Desktop)
- و غیره.
قابلیت خاصی در جاوا وجود دارد بنام اپلت. اپلتها امکانات فراوانی برای نوشتن برنامههای تحت وب در اختیار برنامهنویسان قرار میدهند که دیگر زبانهای برنامهنویسی فاقد آن هستند. البته وجود ماشین مجازی جاوا برای اجرای اپلت لازم است. اپلتها نظیر فناوری اکتیوایکس شرکت مایکروسافت هستند که برنامهنویسان را قادر میسازد تا امکاناتی را به مرورگر کاربر بیفزایند. البته تفاوت این دو در امنیت میباشد به گونهای که اپلتها بدلیل اینکه در محیطی به نام جعبه شنی (sandbox) اجرا میشوند امن هستند ولی اکتیوایکسها فاقد چنین امنیتی هستند.
- سیستمعامل: هر چقدر زبانهای net. قوی باشند تنها بر روی پلت فرم ویندوز اجرا میشوند و برخی ویندوز را سیستمعامل غیرقابل اعتمادی در برنامه نویسی Enterprise میدانند. ولی جاوا از این نظر انتخاب خوبی است.
- قابلیت حمل: جاوا بر روی سکوهای رایانش گوناگونی قابل اجرا است، از ATM و ماشین رختشویی گرفته تا سرورهای سولاریس با قابلیت پشتیبانی از 1024 cpu برای پردازش.
- جاوا بیشتر از یک زبان است: جاوا فقط یک زبان نیست و انجمنهایی متشکل از بزرگان صنایع و برنامهنویسان زیادی مشغول به توسعه و ایجاد استانداردهای جدید و به روز هستند.
خط مشی جاوا
یکی از ویژگیهای جاوا قابل حمل بودن آن است. یعنی برنامهٔ نوشته شده به زبان جاوا باید به طور مشابهی در کامپیوترهای مختلف با سختافزارهای متفاوت اجرا شود؛ و باید این توانایی را داشته باشد که برنامه یک بار نوشته شود، یک بار کامپایل شود و در همه کامپیوترها اجرا گردد. به این صورت که کد کامپایل شدهٔ جاوا را ذخیره میکند، اما نه بهصورت کد ماشین بلکه بهصورت بایتکد جاوا. دستورالعملها شبیه کد ماشین هستند، اما با ماشینهای مجازی که به طور خاص برای سختافزارهای مختلف نوشته شدهاند، اجرا میشوند. در نهایت کاربر از سکوی جاوا نصب شده روی ماشین خود یا مرورگر وب استفاده میکند. کتابخانههای استاندارد یک راه عمومی برای دسترسی به ویژگیهای خاص فراهم میکنند. مانند گرافیک، نخکشی و شبکه. در بعضی از نسخههای ماشین مجازی جاوا، بایتکدها میتوانند قبل و در زمان اجرای برنامه به کدهای محلی کامپایل شوند. فایدهٔ اصلی استفاده از بایتکد، قسمت کردن است. اما ترجمهٔ کلی یعنی برنامههای ترجمه شده تقریباً همیشه کندتر از برنامههای کامپایل شدهٔ محلی اجرا میشوند. این شکاف میتواند با چند تکنیک خوشبینانه که در کاربردهای JVM قبلی معرفی شد، کم شود. یکی از این تکنیکها JIT است که بایتکد جاوا را به کد محلی ترجمه کرده و سپس آن را پنهان میکند. در نتیجه برنامه خیلی سریعتر نسبت به کدهای ترجمه شدهٔ خالص شروع و اجرا میشود. بیشتر VMهای پیشرفته، بهصورت کامپایل مجدد پویا، در آنالیز VM، رفتار برنامهٔ اجرا شده و کامپایل مجدد انتخاب شده و بهینهسازی قسمتهای برنامه، استفاده میشوند. کامپایل مجدد پویا میتواند کامپایل ایستا را بهینهسازی کند. زیرا میتواند قسمت hot spot برنامه و گاهی حلقههای داخلی که ممکن است زمان اجرای برنامه را افزایش دهند را تشخیص دهد. کامپایل JIT و کامپایل مجدد پویا به برنامههای جاوا اجازه میدهد که سرعت اجرای کدهای محلی بدون از دست دادن قابلیت انتقال افزایش پیدا کند.
تکنیک بعدی به عنوان کامپایل ایستا شناخته شدهاست؛ که کامپایل مستقیم به کدهای محلی است مانند بسیاری از کامپایلرهای قدیمی. کامپایلر ایستای جاوا، بایتکدها را به کدهای شی محلی ترجمه میکند.
کارایی جاوا نسبت به نسخههای اولیه بیشتر شد. در تعدادی از تستها نشان داده شد که کارایی کامپایلرJIT کاملاً مشابه کامپایلر محلی شد. عملکرد کامپایلرها لزوماً کارایی کدهای کامپایل شده را نشان نمیدهند. یکی از پیشرفتهای بی نظیر در در زمان اجرای ماشین این بود که خطاها ماشین را دچار اشکال نمیکردند. علاوه بر این در زمان اجرای ماشینی مانند جاوا وسایلی وجود دارد که به زمان اجرای ماشین متصل شده و هر زمانی که یک استثنا رخ میدهد، اطلاعات اشکال زدایی که در حافظه وجود دارد، ثبت میکنند.
پیادهسازی
شرکت سان میکروسیستم مجوز رسمی برای پلت فرم استاندارد جاوا را به مایکروسافت ویندوز, لینوکس، و سولاریس (سیستمعامل). دادهاست. همچنین محیطهای دیگری برای دیگر پلت فرمها فراهم آوردهاست. علامت تجاری مجوز شرکت سان میکروسیستم طوری بود که با همهٔ پیادهسازیها سازگار باشد. به علت اختلاف قانونی که با ماکروسافت پیدا کرد، زمانی که شرکت سان ادعا کرد که پیادهسازی ماکروسافت از RMI یا JNI پشتیبانی نکرده و ویژگیهای خاصی را برای خودش اضافه کردهاست. شرکت سان در سال ۱۹۹۷ پیگیری قانونی کرد و در سال ۲۰۰۱ در توافقی ۲۰ میلیون دلاری برنده شد. در نتیجه کمی بعدماکروسافت جاوا را به ویندوز فرستاد. در نسخهٔ اخیر ویندوز، مرورگر اینترنت نمیتواند از جاوا پلت فرم پشتیبانی کند. شرکت سان و دیگران یک سیستم اجرای جاوای رایگان برای آنها و نسخههای دیگر ویندوز فراهم آوردند.
اداره خودکار حافظه
جاوا از حافظهٔ بازیافتی خودکار برای ادارهٔ حافظه در چرخهٔ زندگی یک شی استفاده میکند. برنامهنویس زمانی که اشیا به وجود میآیند، این حافظه را تعیین میکند؛ و در زمان اجرا نیز، زمانی که این اشیا در استفادهٔ زیاد طولانی نباشند، برنامه نویس مسئول بازگرداندن این حافظهاست. زمانی که مرجعی برای شیهای باقیمانده نیست، شیهای غیرقابل دسترس برای آزاد شدن به صورت خودکار توسط بازیافت حافظه، انتخاب میشوند. اگر برنامهنویس مقداری از حافظه را برای شیهایی که زیاد طولانی نیستند، نگه دارد، چیزهایی شبیه سوراخ حافظه اتفاق میافتند.
یکی از عقایدی که پشت سر مدل ادارهٔ حافظهٔ خودکار جاوا وجود دارد، این است که برنامهنویس هزینهٔ اجرای ادارهٔ دستی حافظه را نادیده میگیرد. در بعضی از زبانها حافظه لازم برای ایجاد یک شی، به صورت ضمنی و بدون شرط، به پشته تخصیص داده میشود؛ و یا بهطور صریح اختصاص داده شده و از heap بازگردانده میشود. در هر کدام از این راهها، مسئولیت ادارهٔ اقامت حافظه با برنامهنویس است. اگر برنامه شی را برنگرداند، سوراخ حافظه اتفاق میافتد. اگر برنامه تلاش کند به حافظهای را که هماکنون بازگردانده شده، دستیابی پیدا کند یا برگرداند، نتیجه تعریف شده نیست و ممکن است برنامه بیثبات شده و یا تخریب شود. این ممکن است با استفاده از اشارهگر مدتی باقی بماند، اما سرباری و پیچیدگی برنامه زیاد میشود. بازیافت حافظه اجازه دارد در هر زمانی اتفاق بیفتد. بهطوری که این زمانی اتفاق میافتد که برنامه بیکار باشد. اگر حافظهٔ خالی کافی برای تخصیص شی جدید در هیپ وجود نداشته باشد، ممکن است برنامه برای چند دقیقه متوقف شود. در جایی که زمان پاسخ یا اجرا مهم باشد، ادارهٔ حافظه و منابع اشیا استفاده میشوند.
جاوا از نوع اشارهگر ریاضی C و ++C پشتیبانی نمیکند. در جایی که آدرس اشیا و اعداد صحیح میتوانند به جای هم استفاده شوند. همانند ++C و بعضی زبانهای شیگرای دیگر، متغیرهای نوعهای اولیهٔ جاوا شیگرا نبودند. مقدار نوعهای اولیه، مستقیماً در فیلدها ذخیره میشوند. در فیلدها (برای اشیا) و در پشته (برای توابع)، بیشتر از هیپ استفاده میشود. این یک تصمیم هوشیارانه توسط طراح جاوا برای اجرا است. به همین دلیل جاوا یک زبان شیگرای خالص به حساب نمیآید.
گرامر
گرامر جاوا وسیعتر از ++C است و برخلاف ++C که ترکیبی است از ساختارها و شیگرایی، زبان جاوا یک زبان شیگرای خالص میباشد. فقط نوع دادهٔ اصلی از این قاعده مستثنی است. جاوا بسیاری از ویژگیها را پشتیبانی میکند و از کلاسها برای سادهتر کردن برنامهنویسی و کاهش خطا استفاده میکند.
نمونههایی از برنامههای جاوا
در زیر نمونهای از برنامهای که در جاوا نوشته شدهاست آورده شدهاست. البته برای کامپایل کردن این برنامه بایستی کیت توسعه جاوا بر روی سیستم مورد نظر نصب شده باشد.
public class Test{ public static void main(String[] args) { System.out.println("HelloWorld!"); } }
برای اجرای برنامه بالا، ابتدا باید یک فایل به نام Test.java ساخته شود و سپس کامپایل شود:
$ javac Test.java
سپس یک فایل خروجی به نام Test.class دریافت میشود. بعد با استفاده از دستور زیر برنامه قابل اجرا است:
$ java Test
مثالها
برنامه Hello world به این صورت در زبان جاوا میتواند نوشته شود:
// HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
بر طبق قرارداد فایل هل بعد از کلاسهای عمومی نام گذاری میشوند. سپس باید پسوند java را به این صورت اضافه کرد: Hello world.java. این فایل اول باید با استفاده از کامپایلر جاوا به بایت کد کامپایل شود. در نتیجه فایل Hello world.class ایجاد میشود. این فایل قابل اجرا است. فایل جاوا ممکن است فقط یک کلاس عمومی داشته باشد. اما میتواند شامل چندین کلاس با دستیابی عمومی کمتر باشد.
کلاسی که به صورت خصوصی تعریف میشود ممکن است در فایل.java ذخیره شود. کامپایلر برای هر کلاسی که در فایل اصلی تعریف میشود یک کلاس فایل تولید میکند؛ که نام این کلاس فایل همنام کلاس است با پسوند.class
کلمه کلیدی public (عمومی) برای قسمتهایی که میتوانند از کدهای کلاسهای دیگر صدا زده بشوند، به کار برده میشود. کلمهٔ کلیدی static (ایستا) در جلوی یک تابع، یک تابع ایستا را که فقط وابسته به کلاس است و نه قابل استفاده برای نمونههایی از کلاس، نشان میدهد. فقط تابعهای ایستا میتوانند توسط اشیا بدون مرجع صدا زده شوند. دادههای ایستا به متغیرهایی که ایستا نیستند، نمیتوانند دسترسی داشته باشند.
کلمهٔ کلیدی void (تهی) نشان میدهد که تابع main هیچ مقداری را بر نمیگرداند. اگر برنامهٔ جاوا بخواهد با خطا از برنامه خارج شود، باید system.exit() صدا زده شود. کلمهٔ main یک کلمهٔ کلیدی در زبان جاوا نیست. این نام واقعی تابعی است که جاوا برای فرستادن کنترل به برنامه، صدا میزند. برنامه جاوا ممکن است شامل چندین کلاس باشد که هر کدام دارای تابع main هستند.
تابع main باید آرایهای از اشیا رشتهای را بپذیرد. تابع main میتواند از آرگومانهای متغیر به شکل public static void main(string…args) استفاده کند که به تابع main اجازه میدهد اعدادی دلخواه از اشیا رشتهای را فراخوانی کند. پارامترstring[]args آرایهای از اشیا رشته ایست که شامل تمام آرگومانهایی که به کلاس فرستاده میشود، است.
چاپ کردن، قسمتی از کتابخانهٔ استاندارد جاوا است. کلاس سیستم یک فیلد استاتیک عمومی به نام out تعریف کردهاست. شی out یک نمونه از کلاس printstream است و شامل تعداد زیادی تابع برای چاپ کردن اطلاعات در خروجی استاندارد است. همچنین شامل println(string) برای اضافه کردن یک خط جدید برای رشتهٔ فرستاده شده اضافه میکند.
توزیعهای جاوا
منظور از توزیع جاوا پیادهسازیهای مختلفی است که برای کامپایلر جاوا و همچنین مجموعه کتابخانههای استاندارد زبان جاوا (JDK) وجود دارد. در حال حاضر چهار توزیعکنندهٔ عمده جاوا وجود دارند:
- سان میکروسیستمز: توزیع کننده اصلی جاوا و مبدع آن میباشد. در اکثر موارد هنگامی که گفته میشود جاوا منظور توزیع سان میباشد.
- GNU Classpath: این توزیع از سوی موسسه نرمافزارهای آزاد منتشر شده و تقریباً تمامی کتابخانه استاندارد زبان جاوا در آن بدون بهرهگیری از توزیع شرکت سان از اول پیادهسازی شدهاست. یک کامپایلر به نام GNU Compiler for Java نیز برای کامپایل کردن کدهای جاوا توسط این موسسه ایجاد شدهاست. فلسفه انتخاب نام Classpath برای این پروژه رها کردن تکنولوژی جاوا از وابستگی به علامت تجاری جاوا است بطوریکه هیچ وابستگی یا محدودیتی برای استفاده آن از لحاظ قوانین حقوقی ایجاد نشود و از طرفی به خاطر وجود متغیر محیطی classpath در تمامی محیطهای احرایی برنامههای جاوا، این نام به نوعی تکنولوژی جاوا را برای خواننده القا میکند. کامپایلر GNU توانایی ایجاد کد اجرایی (در مقابل بایت کد توزیع سان) را داراست. لازم است ذکر شود که در حال حاضر شرکت سان تقریباً تمامی کدهای JDK را تحت مجوز نرمافزارهای آزاد به صورت متن باز منتشر کردهاست و قول انتشار قسمت بسیار کوچکی از این مجموعه را که بهدلیل استفاده از کدهای شرکتهای ثانویه نتوانسته به صورت متن باز منتشر نماید در آینده نزدیک با بازنویسی این کدها دادهاست.
- مایکروسافت #J: این در حقیقت یک توزیع جاوا نیست. بلکه زبانی مشابه میباشد که توسط مایکروسافت و در چارچوب.net ارائه شدهاست. انتظار اینکه در سیستمعاملی غیر از ویندوز هم اجرا شود را نداشته باشید.
- AspectJ: این نیز یک زبان مجزا نیست. بلکه یک برنامه الحاقی میباشد که امکان برنامه نویسی Aspect Oriented را به جاوا میافزاید. این برنامه توسط بنیاد برنامهنویسی جلوهگرا و به صورت کدباز ارائه شدهاست.
کلاسهای خاص
برنامک (برنامههای کاربردی کوچک)
اپلت جاواها برنامههایی هستند که برای کاربردهایی نظیر نمایش در صفحات وب، ایجاد شدهاند. واژهٔ import باعث میشود کامپایلر جاوا کلاسهای javaapplet.Applet وjava.awt.Graphics را به کامپایل برنامه اضافه کند. کلاس Hello کلاس Applet را توسعه میدهد. کلاس اپلت چارچوبی برای کاربردهای گروهی برای نمایش و کنترل چرخهٔ زندگی اپلت، درست میکند. کلاس اپلت یک تابع پنجرهای مجرد است که برنامههای کوچکی با قابلیت نشان دادن واسط گرافیکی برای کاربر را فراهم میکند. کلاس Hello تابع موروثی print(Graphics) را از سوپر کلاس container باطل میکند، برای اینکه کدی که اپلت را نمایش میدهد، فراهم کند. تابع paint شیهای گرافیکی را که شامل زمینههای گرافیکی هستند را میفرستد تا برای نمایش اپلتها استفاده شوند. تابع paint برای نمایش “Hello world!” تابع drawstring(string,int,int) را صدا میزند.
جاوا سرولت
تکنولوژی servlet جاوا گسترس وب را به آسانی فراهم میکند؛ و شامل مکانیزمهایی برای توسعهٔ تابعی سرور وب و برای دسترسی به سیستمهای تجاری موجود است.servlet قسمتی از javaEE است که به درخواستهای مشتری پاسخ میدهد.
// Hello.java import java.io. *; import javax.servlet. *; public class Hello extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); final PrintWriter pw = response.getWriter(); pw.println("Hello, world!"); pw.close(); } }
واژهٔ import کامپایلر جاوا را هدایت میکند که تمام کلاسهای عمومی و واسطها را از بستههای java.io وjava.servlet را در کامپایل وارد کند.
کلاس Hello کلاس Genericservlet را توسعه میدهد. کلاس Genericservlet واسطی برای سرور فراهم میکند تا درخواست را به servlet بفرستد و چرخهٔ زندگی servlet را کنترل کند.
JSP
صفحهٔ سرور جاوا قسمتی از سرور javaEE است که پاسخ تولید میکند. نوعاً صفحات HTML به درخواستهای HTTP از مشتری.JSPها کد جاوا در صفحهٔ HTML را با استفاده از حائل <%and%> اضافه میکنند.JSP به javaservlet کامپایل میشود.
سوینگ
Swing کتابخانهٔ واسط گرافیکی کاربر است برای پلت فرم javaSE. ابزاری مشابه پنجره، GTK و motif توسط شرکت sun فراهم شدهاند. این مثال کاربرد swing یک پنجرهٔ واحد همراه با Hello world را ایجاد میکند.
// Hello.java (Java SE 5) import java.awt.BorderLayout; import javax.swing. *; public class Hello extends JFrame { public Hello() { super("hello"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setLayout(new BorderLayout()); add(new JLabel("Hello, world!")); pack(); } public static void main(String[] args) { new Hello().setVisible(true); } }
اولین جملهٔ import کامپایلر جاوا را هدایت میکندتا کلاس Borderlayout را از بستهٔ java.awt در جاوا به کامپایل اضافه کند؛ و import دوم همهٔ کلاسهای عمومی و واسط آنها را از بستهٔ javax.swing اضافه میکند. کلاس Hello کلاس Jframe را توسعه میدهد. کلاس Jframe یک پنجره با میلهٔ عنوان و کنترل بستن است.
زمانی که برنامه آغاز میشود، تابع main با JVM صدا زده میشود. این یک نمونهٔ جدید از کلاس Hello را ایجاد کرده و با صدا زدن تابع setvisible(boolean) با مقدار true نمایش داده میشود.
Generics
قبل از کلاسهای عمومی برای هر متغیر باید یک نوع خاص تعریف میکردیم. به عنوان مثال برای کلاسهای ظرف این امر مشکل بود زیرا را آسانی برای ایجاد یک container وجود نداشت که نوعهای خاصی از اشیا را بپذیرد. کلاسهای عمومی اجازه میدهند نوع زمان کامپایل، بدون نیاز به ایجاد تعداد زیادی از container، چک شود. همه آنها کدهای مشابهی دارند.
کتابخانههای کلاس
کتابخانههای جاوا که به صورت بایت کد از کد اصلی کامپایل شدهاند، برای پشتیبانی از بعضی از کاربردهای جاوا، توسطJRE منتشر شدهاست. مثالهایی از این کتابخانهها عبارتند از:
- کتابخانههای مرکزی که شامل:
- کتابخانههایی که برای ساختار داده کاربرد دارند. مثل لیستها، درختها، مجموعهها، مترجمها.
- کتابخانهٔ پرداز XML (تجزیه، تغییر شکل، اعتبار)
- کتابخانههای موضعی و بینالمللی
- کتابخانههای انتگرال گیری که امکان تایپ کردن توسط سیستمهای بیرونی را میدهند.
- JDBC برای دستیابی به دادهها
- JNDI برای مراجعه و کشف کردن
- CORBA & RMI برای توسعهٔ کاربرد توزیع کردن
- کتابخانههای واسط کاربر
- AWT (توابع پنجرهای مجرد) که قسمتهایی از GUI را فراهم میکنند.
- کتابخانههای swing که در AWT ساخته شدهاند اما کاربردهایی از AWT widgetry را فراهم میکنند.
- APLها برای ضبط صدا، پردازش و بازنواختی
- کاربردهای وابستهٔ پلت فرم ماشینهای مجازی جاوا
- Plugins که توانایی اجرا شدن در مرورگرهای وب را به اپلت میدهد.
- java web start
- دادن مجوز و مستندسازی
ویرایش
شرکت سان میکروسیستم، ۴ نوع ویرایش از کاربردهای مختلف جاوا را ارائه دادهاست:
- Java card for smartcard
- JavaME
- JavaSE
- JavaEE
ایرادات مطرح شده
مهمترین ایرادی که برنامه نویسان سایر زبانها به زبان جاوا میگیرند سرعت اجرایی پایین جاوا در مقایسه با زبانها سطح پایینتر مانند ++C و اسمبلی است. یک برنامه جاوا به صورت بایت کد میباشد و باید در ماشین مجازی جاوا اجرا گردد. به همین دلیل سرعت اجرای پایینی را در مقابل زبانهایی همچون ++C دارد. به صورت دیگر یک برنامه C به طور متوسط تا ۱۰ برابر سریعتر از برنامه مشابه جاوا اجرا میگردد .
جاوا علیرغم شیءگرا بودن در بخشی از قسمتها برخی از اصول شیگرایی را نادیده گرفتهاست. از جمله این قسمتها قابلیت بازتابش Reflection میباشد. هدف اصلی بازتابش بررسی (مشاهده) و ایجاد تغییر در برنامه در حال اجرا است ولی این مهم با زیر پا گذاشتن بعضی اصول ممکن شدهاست. برای نمونه با استفاده از بازتابش (و در صورت داشتن مجوز لازم ضمن اجرای برنامه) میتوان به متدهای خصوصی دیگر کلاسها دسترسی داشت.
زبان جاوا در مقابل زبانی مثل ++C سادهتر و یادگیری آن آسانتر است. این آسانتر بودن با حذف بسیاری از موارد که باعث قدرتمندتر بودن[نیازمند منبع] زبان ++C بودهاند ایجاد شدهاست. مهمترین این موارد اشاره گرها و وراثت چندگانه بودهاند که در زبان جاوا یافت نمیشوند.
از آنجایی که جاوا زبانی با عدم وابستگی به بستر میباشد پس استفاده از توابع سیستمعامل در برنامه را به طور مستقیم نمیپذیرد. به همین صورت نمیتوان به طور مستقیم از واسطهای برنامه نویسی غیر از جاوا در آن استفاده نمود.
پاسخ به ایرادات
سرعت پایین برنامههای جاوا در محیطی که اجرا میشوند ملاک کارایی نبوده زیرا در محیط وب مسئلهای که سرعت را کند میسازد، شبکه بوده و ابتدا باید سربار شبکه را از روی برنامهها برداشت. از طرف دیگر در برنامههای رومیزی هم در JDK 5.0 و ۶٫۰، بهینهسازی بسیاری بوجود آمده که این مسئله باعث شده که در آخرین تست کارایی که انجام شده یک برنامه جاوا در محدودهٔ ۰٫۸ تا ۱٫۳ همان برنامه در ++C کارایی داشته باشد که ۱٫۳ آن مربوط به بخش واسط کاربری و سرعت ۰٫۸ آن مربوط به بسته تخلیه حافظه میشده که هیج الگوریتمی نتوانست از الگوریتم Garbage Collector جاوا پیشی بگیرد. همچنین سال ۱۹۹۹ در مقالهای آقای Lutz Prechelt به این مسئله را ثابت کردند که تجربه برنامهنویسی که برنامهای را مینویسد از انتخاب زبانی که برنامه برروی آن نوشته میشود در کارایی تأثیر بیشتری دارد و این بدان معناست که کارایی یک برنامه را برنامهنویس مشخص میکند و نه زبان برنامهنویسی (ایشان در همان مقاله از زبان جاوا استفاده نمودند تا ذهنیت بد را از بین ببرند)
همچنین در صنعت نرمافزار هزینه اصلی مربوط به ساخت نرمافزار است و نه تهیه سختافزار برای دستیابی به سرعت بیشتر.
حذف اشارهگرها در جاوا به دلیل مشکلاتی بوده که آنها در طول تاریخشان بوجود آوردهاند، اگرچه این موارد در برنامههای سیستمی لازم بهنظر میرسد ولی در محیطهای تحتوب که بستر اصلی جاوا هستند میتوانند اثراتی به مراتب شدیدتر نسبت به آنچه در برنامههای سیستمی دارند داشته باشند و باعث میشود که توجه برنامهنویسان از مسائلی چون کارایی، قابلیت اطمینان و مقیاسپذیری برنامه به تنظیم اشارهگرها معطوف گردد.
وجود وراثت چندگانه در زبانی مانند ++C، باعث ایجاد مشکلات اساسیای میگردید که اکثر برنامهنویسان ++C از آن دوری میکرده و هنوز هم میکنند؛ ولی قابلیت چندریخته شدن یک کلاس از لحاظ شی گرایی بسیار مهم بوده و بنابراین توجیهی برای وجود وراثت چندگانه را فراهم مینمود. در جاوا با وارد شدن مفهومی به نام واسط برنامهسازی (Interface)، دیگر نیازی به وجود وراثت چندگانه احساس نشد و بنابراین از زبان جاوا حذف گردید. در حال حاضر اکثر طراحان برنامهها حتی به این نتیجه رسیدهاند که وراثت تکی هم باعث ایجاد مشکل بوده و تا آنجایی که میشود باید از Composition استفاده نمود و در تمامی کتابهای طراحی که از سال ۲۰۰۰ به این طرف چاپ شده به آن اشاره نمودهاند.
از ابتدای بوجود آمدن جاوا، کتابخانه JNI – Java Native Interface در آن وجود داشته که قابلیت فراخوانی و دستکاری برنامههایی در ++C و… را میداده که از نمونههای آن میتوان به Jtwain که یک بستهایست که از کتابخانههای ویندوز برای اسکن عکس استفاده میکند، یا SWT که یک بسته نرمافزاریست که از کتابخانههای ویندوز و لینوکس (برحسب سیستمعامل) برای ساخت واسط کاربری (UI) استفاده میکند، نام برد.
بسیاری از موارد یاد شده به عنوان ایرادات به جاوا به عنوان ایرادات به طراحی زبانهای سطح بالا هستند و نه جاوا.
یک اشتباه متداول
برخی مردم به علت شباهت اسمی، جاوا و جاوا اسکریپت را با هم اشتباه میگیرند. در حالیکه این دو زبان گرچه در ظاهر و کلمات شبیه اند ولی بطور ساختاری با یکدیگر متفاوتند. جاوا اسکریپت محصول شرکت نت اسکیپ است. جاوا برای اجرا باید به زبان ماشین مجازی ترجمه شود اما جاوااسکریپت زبانی است که معمولاً در صفحات وب نوشته میشود و توسط مرورگر تفسیر میگردد. در جاوا متغیرها همگی بر اساس نوعشان معرفی میشوند اما در جاوا اسکریپت نوع متغیرها به صورت ضمنی مشخص میشود.