زبان‌های برنامه‌نویسی از نگاه اجرا، سطح و پردازش

از جنبه اجرا

زبان‌های تفسیری (interpreted)

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

زبان‌هایی مثل پایتون، جاوا اسکریپت و روبی، تفسیری هستن.

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

زبان‌های کامپایلری (compiled)

در زبان‌های کامپایلری، سورس کد به زبان ماشین یا یک زبان میانی توسط کامپایلر قبل از اجرا ترجمه میشه. کامپایلر کل کد رو آنالیز می‌کنه و یک فایل قابل اجرا که می‌تونه مستقلا اجرا بشه از سورس کد اصلی تولید می‌کنه.

زبان‌هایی مثل C, C++, Go و جاوا از این دسته هستن.

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

زبان‌های کامپایلری اغلب برای هر پلتفرم متفاوت نیازه که دوباره کامپایل بشن تا عملکرد بهینه رو داشته باشن.

از جنبه سطح

این مبحث مرتبط با سطح abstraction از سخت‌افزار و میزان خوانایی برای انسان در زبان‌های برنامه‌نویسیه.

زبان سطح بالا (High-Level Programming Languages)

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

زبان سطح پایین (Low-Level Programming Languages)

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


از جنبه همزمانی

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

نوع Sequential Programming

در این مدل، تسک‌ها یکی پس از دیگری به روش خطی اجرا میشن. یک thread اجرا هر تسک رو به طور متوالی پردازش می‌کنه.

نوع Parallel Programming

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

نوع Concurrent Programming

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

نوع Coroutine-Based Concurrency

کوروتین‌ها واحدهای همزمانی سبک و مشارکتی هستن که به تسک‌ها اجازه توقف و از سرگیری رو میدن. بدون سربار thread ها، کانکارنسی رو در اختیارمون می‌ذارن.

نوع Thread-Based Concurrency

در این نوع، Threadها واحدهای اجرایی مستقل و سبک در یک پردازش هستن. در این روش، چندین thread به طور همزمان در یک پردازش اجرا میشن. thread ها با هم فضای memory رو به اشتراک می‌ذارن که می‌تونه چالش data synchronization ایجاد بکنه.

نوع Actor-Based Concurrency

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

نوع Event-Driven Concurrency

برنامه‌نویسی برمبنای رویداد مبتنی بر اجرای یک رویداد بر اساس trigger شدن اجرای یک تسکه. تسک‌ها معمولا به عنوان یک ایونت هندلر تعریف می‌شن که به یک رویداد خاص پاسخ بدن.


در اجراهای همزمان (concurrent) سوییچ کردن بین تسک‌ها در زمان‌های خاصی که به نام context switches اتفاق می‌افته. در این زمان‌ها سیستم‌عامل تصمیم می‌گیره که اجرا رو متوقف کنه و اجرای یک تسک دیگه رو شروع کنه یا ادامه بده. این که دقیقا چه زمانی اتفاق می‌افته مرتبط با مدل همزمانی و سیستم‌عامله. در ادامه یکسری سناریو متداولش رو میگم:

  • زمانی که یک تسک بلاک عملیاتی مثل I/O میشه (خوندن از فایل، صبر برای شبکه) یا به خواب میره.
  • در این مدل هر پردازش زمان مشخصی برای اجرا داره و وقتی که تموم بشه، سیستم‌عامل می‌تونه سوییچ کنه.
  • معماری‌های همزمانی و کتابخونه‌هاش می‌تونن این موضوع رو مدیریت کنن، مثلا در برنامه نویسی مبتنی بر رویداد، این تغییر کانتکست می‌تونه موقع هندل کردن یک رویداد اتفاق بیوفته.