جاوا
جاوا، امروزه یکی از متداول ترین زبان های برنامه نویسی جهان است. این زبان از لحاظ ظاهری شباهت های زیادی به ++C دارد ولی در اصل می توان تفاوت های بنیادین زیادی را برای آنها بر شمرد. بر خلاف بسیاری دیگر از زبان های کامپایلری که سورس کد آنها پس از کامپایل شدن به باینری یک ماشین حقیقی ترجمه می شود، برنامه های جاوا پس از کامپایل شدن به باینری ماشینی به نام ماشین مجازی جاوا یا JVM ترجمه می شود. این کد باینری را بایت کد می گویند. ماشین مجازی جاوا عمدتا بصورت نرم افزاری پیاده سازی می شود ولی پیاده سازی های سخت افزاری یا ترکیبی (بیشتر به صورت کمک پردازنده) از آن نیز وجود دارد. استفاده از ماشین مجازی یک روش مدرن در زبان های برنامه نویسی محسوب می شود و مزایای زیادی دارد. ماشین مجازی جاوا می تواند امنیت اجرای برنامه ها را تضمین کند و حق دسترسی های مختلفی برای برنامه ها در نظر بگیرد. همچنین ماشین مجازی جاوا سازگاری اجرای برنامه های جاوا را تحت سیستم عامل های مختلف حفظ می کند. یک باور غلط در بین بسیاری از مردم این است که برنامه های نوشته شده به زبان جاوا کندتر از برنامه های نوشته شده به زبان های کامپایلری اجرا می شود، در حالی که سرعت اجرای یک برنامه جاوا کاملا بستگی به نحوه پیاده سازی ماشین مجازی دارد. ماشین های مجازی جدید جاوا معمولا از تکنیکی به نام کامپایل در زمان لازم یا JIT استفاده می کنند. در این روش در هنگام اجرای برنامه بایت کد ابتدا به کد باینری ماشینی حقیقی که بر روی آن اجرا می شود ترجمه می شود و سپس باینری ترجمه شده بر روی ماشین اصلی اجرا می شود. در این فرآیند ماشین مجازی می تواند بهینه سازی های خاص ماشین حقیقی را بر روی کد انجام دهد که در برخی موارد باعث می شود برنامه های جاوا حتی سریع تر دیگر زبان های کامپایلری اجرا شود.
تاریخچه
جاوا در مقایسه با سایر زبانها همچون ++C یا Basic یا Fortran زبان نسبتاً جدیدی است. شرکت سان میکروسیستمز (یا به اختصار سان) در سال 1991 یک پروژه تحقیقاتی به نام Green را آغاز کرد. هدف این پروژه ایجاد یک زبان جدید شبیه به ++C بود که نویسنده اصلی آن، جیمز گاسلینگ، آن را بلوط Oak می نامید. اما بعدها به دلایل مشکلات حقوقی نام آن به جاوا تغییر کرد. پروژه گرین به دلیل مشکلات بازاریابی در شرف لغو شدن بود تا اینکه گسترش وب در سال 1993 باعث نمایش تواناییهای وافر جاوا در این عرصه گشت. و به اینگونه بود که سان در می 1995 جاوا را رسما افتتاح کرد.برنامههای نوشته شده به زبان جاوا را میتوان بر روی هر ماشینی (سختافزار + سیستم عامل) که ماشین مجازی جاوا را داشته باشد اجرا کرد. شعار اصلی زبان جاوا «یک بار بنویس، همه جا اجرا کن» (Write once, run anywhere) به این موضوع اشاره میکند که اصطلاحاً استقلال از بستر (Platform Independency) نامیده میشود.
برای اجرای برنامههای جاوا، شما نیاز به نصب ماشین مجازی جاوا (Java Virtual Machine) دارید. برنامههای جاوا در فایلهایی با پسوند java ذخیره شده و پس از کامپایل تبدیل به کد ماشین مجازی جاوا میشوند. این کد اصظلاحاً بایتکد نامیده میشود. سپس ماشین مجازی جاوا این بایتکدها را به زبان ماشینی که بر روی آن نصب شده است تیدیل کرده و آنها را اجرا میکند
انواع داده ها در زبان جاوا
در هر برنامهای ما با تعدادی مقادیر سر و کار داریم. ممکن است برنامه با اعداد کار کند، یا با نویسهها (کاراکترها). هدف هر برنامهی رایانهای، محاسبه دادهها است. برای این کار هر برنامهای باید بتواند دادهها را وارد کند، آنها را پردازش کند و نتیجه را به نحو مقتضی نمایش دهد. برای انجام محاسبات بر روی دادهها در برنامه باید بتوانیم دادهها را شناسایی کنیم. باید بدانیم آنها از چه نوعی هستند. همچنین باید بدانیم که در هر لحظه هر کدام از آنها چه مقداری دارند. برای هر متغیر سه ویژگی قائل میشویم: نوع، نام و مقدار.
الگوی کلی تعریف متغیرها (اعلان یا Declaration نیز گفته میشود) در زبان جاوا به صورت زیر است:
متغیری از نوع صحیح و با مقدار اولیه 5
int a = 5;
متغیری از نوع نویسه (کاراکتر) و با مقدار اولیه A
char someChar = 'A';
متغیری از نوع اعشاری و با مقدار اولیه 3.14
float PI = 3.14;
متغیری از نوع رشتهای (String) و با مقدار اولیه «Hello Java»
String hello = "Hello Java";
پس از آشنایی مقدماتی با متغیرها و نحوه تعریف و مقداردهی به آنها آشنا شدیم، میتوانیم فهرست کامل نوع دادههای اولیه (Primitive) را ببینیم:
(جداول و تصاویر در فایل اصلی موجود است)
مناسب برای متغیرهای منطقی که همواره یکی از دو مقدار درست یا غلط دارند
false و true
boolean
مناسب برای انواع متغیرهای حرفی. با توجه به این که متغیرهای حرفی در جاوا یونیکد 16 بیتی هستند، از آنها میتوان برای کلیه حروف کلیه زبانها (از جمله فارسی) استفاده کرد.
از صفر یونیکد تا 216-1 یونیکد
char
مناسب برای متغیرهای عددی صحیح که در محدود مقادیر مجاز صحیح قرار دارند.
از 128- تا 127
byte
مناسب برای متغیرهای عددی صحیح که در محدود مقادیر مجاز صحیح (حدود منفی سی و دو هزار تا مثبت سی و دو هزار) قرار دارند.
از 215- تا 215-1
short
مناسب برای متغیرهای عددی صحیح که در محدود مقادیر مجاز صحیح (حدود منفی دو میلیارد تا مثبت دو میلیارد) قرار دارند.
از 231- تا 231-1
int
مناسب برای متغیرهای عددی صحیح بسیار بسیار بزرگ!
از 263- تا 263-1
long
مناسب برای متغیرهای اعشاری با دقت خوب برای محاسبات معمولی
استاندارد IEEE754 (تقریباً از 3.4E38- تا 3.4E38 با 8 رقم دقت اعشاری)
float
مناسب برای متغیرهای اعشاری با دقت بسیار زیاد برای محاسبات با دقت مضاعف
استاندارد IEEE754 (تقریباً از 1.8E308- تا 1.8E308 با 16 رقم دقت اعشاری)
double
برای متغیرهایی که هیچ نوعی ندارند (بعداً درباره نوع void بیشتر خواهیم گفت)
---
void
- مقادیر لفظی یا لیترال (literal): در جاهایی از برنامههای جاوا ممکن است بخواهید مستقیماً از مقادیر استفاده کنید. عبارت زیر را در نظر بگیرید:
int a = 5;
در مثال فوق عدد 5 اصطلاحاً متغیر لفظی یا لیترال است. کامپایلر جاوا برای متغیرهای لفظی تعدادی پیشفرض دارد. برای مثال متغیرهای لفظی صحیح مانند مثال فوق را به صورت پیشفرض از نوع int میشناسد. حال اگر بخواهید عدد 5 را در یک دستور انتساب با استفاده از عملگر = به یک متغیر از نوع long نسبت دهید باید به صورت زیر عمل کنید:
long a = 5L;
حرف L که بلافاصله بعد از عدد 5 آمده است به کامپایلر جاوا میفهماند که متغیر لفظی 5 از نوع long است. همچنین پیشفرض متغیرهای لفظی اعشاری در جاوا از نوع double است. دستور زیر را در نظر بگیرید:
float a = 3.14;
آیا به نظر شما این دستور کامپایل خواهد شد؟ آن را در یکی از مثالهایی که تاکنون نوشتهاید امتحان کنید. همانطور که حدس زدید و احتمالاً حدس خود را آزمودید، کامپایلر جاوا در هنگام اجرای دستور فوق خطا میگیرد:
آیا متوجه علت خطا شدید؟ متغیر لفظی 3.14 را کامپایلر جاوا به صورت پیشفرض از نوع double فرض میکند. وقتی میخواهد مقدار آن را در یک متغیر اعشاری از نوع float قرار دهد، دقت عدد اعشاری از نوع double باید به float کاهش یابد و این از دید کامپایلر جاوا یک خطا است. برای رفع این مشکل باید به صراحت به کامپایلر جاوا بگویید که 3.14 یک متغیر لفظی اعشاری از نوع float است. برای این کار مشابه دستور زیر عمل میکنیم:
float a = 3.14F;
حرف F که بلافاصله بعد از 3.14 آمده است کامپایلر جاوا را مجبور میکند که متغیر لفظی 3.14 را از نوع اعشاری float در نظر بگیرد.
کلاسهای پوشاننده:
تمام انواع داده که تا به حال بررسی کردیم، انواع داده اولیه یا primitive هستند. همانطور که گفتیم در جاوا هر چیزی یک شیء است. انواع داده اولیه تنها چیزهایی در جاوا هستند که شیء نیستند. البته هر کدام از انواع داده اولیه یک کلاس پوشاننده (Wrapper) دارد که در جاهایی که باید حتماً از اشیا استفاده کنیم، میتوانیم به جای متغیرهای از نوع اولیه، از آنها استفاده کنیم. برای مثال برخی از ساختمان دادهها در جاوا مانند Vector به شما اجازه نمیدهد انواع داده اولیه را در آن بریزید. برای حل این مشکل میتوان از کلاسهای پوشاننده انواع داده اولیه استفاده کرد. در جدول زیر فهرست این کلاسها را میبینید: