معنی استاتیک بودن زبان جاوا چیست؟

نویسنده : سید ایوب کوکبی ۱۱ فروردین ۱۳۹۸

معنی استاتیک بودن زبان جاوا چیست؟

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

بررسی نوع (Type Checking)

به وارسی انواع در هر زبان type checking یا بررسی نوع گفته می‌شود. این وارسی یا در زمان کامپایل (compile-time) اتفاق می‌افتد است که استاتیک خوانده می‌شود یا در زمان اجرا (run-time) است که وارسی داینامیک گفته می‌شود.

زبان‌هایی که اساساً در تبدیل ضمنی انواع، محتاطانه عمل می‌کنند و روی قوانین نوعشان سختگیر هستند، نوع قوی یا Strongly Typed محسوب می‌شوند. و از سوی دیگر زبان‌هایی که در این زمینه آزادی بیشتری به شما می‌دهند نوع ضعیف یا Weakly Typed خوانده می‌شوند.

Type Checking به منظور اطمینان از امنیت نوع یا type-safe بودن برنامه و به حداقل رساندن احتمال بروز خطا انجام می‌گیرد. برای مثال وقتی نوع متغیری integer باشد ولی داخلش یک رشته ذخیره یا مقداری اعشاری (float) ذخیره کنید با خطا مواجه می‌شوید. یا گاهی جمع دو نوع خاص مثلاً یک رشته و یک عدد منجر به بروز خطا می‌شود.

جاوا یک زبان استاتیک و نوع قوی است

حالا که تا حدودی با مفاهیم اولیه بررسی نوع و انواع مختلف type-checking آشنا شدید کمی بیشتر در مورد هر یک توضیح دهیم.

زبان‌های استاتیک (Static Typed)

یک زبان در صورتی استاتیک است که نوع متغیر قبل از اجرا مشخص باشد. به عنوان مثال زبان‌های جاوا، فرترن، پاسکال و اسکالا در این دسته قرار دارند. در زبان‌های استاتیک بعد از تعریف نوع متغیر دیگر نمی‌توان مقادیر یا متغیرهایی از سایر انواع را داخل آن ذخیره کرد چرا که باعث خطای زمان کامپایل خواهد شد. (در برخی از IDEها با رنگ قرمز چنین خطاهایی نشان داده می‌شود).

بخوانید  مهم‌ترین سوالات مصاحبه استخدامی از توسعه‌دهندگان اندروید

مثال جاوا

همانطور که گفته شد در زبان‌های استاتیک نوع متغیر را باید قبل از استفاده از آن مشخص کرد. مثلاً در جاوا چنین کدی منجر به خطا می‌شود:

int data;
data = 50;
data = “Hello World!”; // causes an compilation error

متغیر data از نوع integer تعریف شده با این حال در خط سوم مقداری رشته‌ای داخل این متغیر ذخیره شده است که باعث بروز خطای زمانی کامپایل می‌شود. اما در زبان‌های داینامیک این کار مجاز بوده و خطایی هم بروز نمی‌کند.

مزیت‌های زبان‌های استاتیک:

  • در همان مراحل اول توسعه از انواع مختلف خطاها جلوگیری می‌شود؛
  • سرعت کامپایل در زبان‌های استاتیک به خاطر مشخص بودن نوع متغیرها بیشتر است. همچنین در این زبان‌ها کامپایلر می‌تواند کدهای بهینه‌تری تولید کرده و در مصرف حافظه صرفه‌جویی نماید؛

لیست کامل زبان‌های استاتیک در ویکی‌پدیا آمده است.

زبان‌های داینامیک (Dynamic Typed)

یک زبان در صورتی داینامیک است که نوع متغیرها در زمان اجرا مشخص می‌شود. مثال رایجش زبان‌های جاوا اسکریپت، PHP، پایتون، روبی، لیسپ است. در این دسته از زبان‌ها، متغیرها در زمان اجرا به آبجکت‌هایی در حافظه مقید می‌شوند و در هنگام تخصیص مقادیر، نوع آن مشخص می‌شود. بنابراین در طول اجرای برنامه، یک متغیر می‌تواند چندین نوع مختلف داشته باشد.

زبان‌های داینامیک، کدهای غیربهینه‌تری از زبان‌های استاتیک تولید می‌کنند. همچنین در زمان اجرا، امکان بروز خطا دربارۀ انواع وجود دارد و با هر بار اجرای برنامه بررسی‌های گفته شده تکرار می‌شود.

مثال پایتون

در زبان‌های داینامیک نیازی به تعیین نوع متغیر قبل از استفاده از آن نیست:

data = 10;
data = “Hello World!”; // no error caused

در خط دوم یک مقدار رشته‌ای به متغیر data تخصیص داده شده در حالی که قبلاً نوع آن integer بوده است. این کد بدون هیچ خطایی اجرا می‌شود. در واقع ماهیت زبان‌های داینامیک این چنین است.

بخوانید  10 ترند برنامه‌نویسی اندروید در سال 2018

مزیت‌های زبان‌های داینامیک:

  • اشکال‌زدایی در این زبان‌ها آسان‌تر است چرا که کدها مرحلۀ جدایی برای کامپایل نیاز ندارند. این کار فرایند دیباگ و یافتن خطاها را لذت‌بخش‌تر از زبان‌های استاتیک می‌کند؛
  • انعطاف‌پذیری زبان‌های داینامیک بیشتر است؛
  • با استفاده از اطلاعات انواع در زمان اجرا (RTTI)، می‌توان برای پیاده‌سازی dynamic dispatch, بایندیگ دیرهنگام، کستینگ، رفلکشن و سایر فیچرها استفاده کرد.

لیست زبان‌های داینامیک در ویکی‌پدیا

زبان‌های نوع قوی (Strongly Typed)

به زبانی نوع قوی گفته می‌شود که در آن انواع متغیرها مشخص بوده و در صورت غیرمنتظره بودن خروجی یک عبارت (expression) خطا بروز می‌کند. این موضوع صرفنظر از زمانی است که type-checking صورت می‌گیرد.

پایتون و جاوا هر دو نوع قوی یا strongly-typed هستند.

مثال پایتون:

temp = “Hello World!”
temp = temp + 10; // program terminates with below stated error

متن خطا:

Traceback (most recent call last):
File “…\Test.py”, line 48, in NFG
 temp = temp + 10; 
TypeError: cannot concatenate ‘str’ and ‘int’ objects

در مثال بالا، متغیر temp با توجه به مقدار تخصیص داده شده از نوع str است. در خط دوم تلاش کرده‌ایم تا مقدار ۱۰ را که یک نوع int است با یک متغیر رشته‌ای جمع کنیم. این موضوع منجر به بروز خطا می‌شود و همانطور که در متن خطا می‌بینید بیان شده: انواع str و int را نمی‌تواند به یکدیگر متصل کند. این ماهیت زبان‌های نوع قوی است چرا که به هر متغیر، نوعی اختصاص می‌یابد.

زبان‌های نوع ضعیف (Weakly Typed)

از سوی دیگر به زبان‌هایی نوع ضعیف گفته می‌شود که گرچه آن‌ها هم دارای نوع هستند ولی اجباری در این کار نیست. محدودیت‌های نوع در این زبان‌ها نسبت به زبان‌های نوع ضعیف بسیار کمتر است.

بخوانید  آموزش زبان کاتلین – درس 21 (Visibility Modifiers)

PHP و C دو زبان نوع ضعیف یا Weakly Typed هستند.

مثال PHP

$temp = “Hello World!”;
$temp = $temp + 10; // no error caused
echo $temp;

در مثال بالا، متغیر temp در ابتدا نوعش string است. سپس در خط دوم این متغیر، رشته‌ای را با عدد ۱۰ که یک نوع integer است جمع می‌کنیم. هیچ خطای رخ نمی‌دهد. این خصوصیت زبان‌های نوع ضعیف یا weakly typed است.

با توجه به توضیحات داده شده، اکنون می‌دانید معنی Statically typed و Strongly Typed بود زبان جاوا چیست.

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *