فصل اول: مبانی برنامه نویسی

Programming Language TypesCompiledSource → Compiler→ Machine CodeC, C++, Rust, GoInterpretedSource → Interpreter→ ExecutionPython, JS, RubyMarkupTags → Browser→ DisplayHTML, XML, MD

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

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

به یاد داشته باشید، هر برنامه‌نویس ماهری روزی یک مبتدی بوده است. سفر شما از هم اکنون آغاز می‌شود و من اینجا هستم تا در هر مرحله شما را راهنمایی کنم.

مقدمه‌ای بر زبان‌های برنامه‌نویسی (Programming Languages)

زبان‌های برنامه‌نویسی ابزاری هستند که به ما امکان می‌دهند ایده‌های خود را به مجموعه‌ای از دستورالعمل‌ها (Instructions) تبدیل کنیم، به طوری که یک کامپیوتر بتواند آنها را اجرا کند. هر زبان دارای دستور زبان (Syntax) و ساختار (Structure) ویژهٔ خود است. هدف همهٔ آنها، هر چند به شکل‌های متفاوت، این است که اطلاعات ما را برای ماشین قابل فهم کنند.

در دنیای برنامه‌نویسی، زبان‌های گوناگونی وجود دارند که هرکدام ساختار، هدف و نحوهٔ اجرای خاص خود را دارند. برای یک برنامه‌نویس تازه‌کار، درک این تفاوت‌ها می‌تواند به انتخاب زبان مناسب برای یک پروژه و همچنین درک بهتر فرایند اجرای کد کمک زیادی کند. در این فصل، ما به دسته‌بندی‌های رایج زبان‌های برنامه‌نویسی می‌پردازیم و اصطلاحات فنی را به انگلیسی (English) بیان می‌کنیم تا درک شما از مفاهیم عمیق‌تر شود. این دسته‌بندی‌ها شامل «Compiled Languages»، «Interpreted Languages» و «Markup Languages» هستند.

Compiled vs Interpreted Languages

زبان‌های کامپایل‌شونده (Compiled Languages)

Compiled Languages زبان‌هایی هستند که ابتدا کد منبع (Source Code) آنها توسط یک برنامهٔ ویژه به نام «Compiler» به زبان ماشین (Machine Code) تبدیل می‌شود. زبان ماشین مستقیماً توسط واحد پردازنده مرکزی (CPU) قابل درک و اجرا است. فرآیند تبدیل از یک زبان سطح بالا (High-Level Language) به زبان ماشین، «Compilation» نام دارد.

نحوهٔ اجرا:

  1. نوشتن کد منبع (Source Code): شما کدتان را با دستور زبان یک زبان سطح بالا نظیر C یا C++ می‌نویسید.
  2. کامپایل کردن (Compilation): Compiler کد شما را بررسی کرده، خطاهای نحوی (Syntax Errors) را گزارش و در نهایت فایل اجرایی (Executable) یا کد ماشین تولید می‌کند.
  3. اجرا (Execution): فایل اجرایی تولید شده مستقیماً توسط سیستم عامل و CPU اجرا می‌شود.

مزایا:

  • سرعت بالا: به دلیل تبدیل شدن کامل به کد ماشین، اجرای برنامه بسیار سریع است.
  • بهینه‌سازی (Optimization): Compiler می‌تواند کد را برای عملکرد بهتر، بهینه کند.

معایب:

  • فرآیند طولانی‌تر توسعه: هر بار که کد را تغییر دهید، باید دوباره آن را کامپایل کنید.
  • وابستگی به پلتفرم (Platform Dependency): کدی که برای یک سیستم عامل کامپایل شده است، معمولاً روی سیستم عامل دیگر اجرا نمی‌شود مگر این که دوباره کامپایل گردد.

مثال‌ها:

  • C
  • C++
  • Rust
  • Go

کامپایل کردن یعنی چی؟

Source Codehello.cCompilergccMachine Codehello (binary)

کامپایل یک فرآیند اساسی در توسعه نرم افزار است که کد نوشته شده در یک زبان برنامه نویسی سطح بالا (کد منبع) را به کد ماشین (کد باینری) تبدیل می کند که پردازنده کامپیوتر می تواند مستقیماً آن را اجرا کند. ابزار مسئول این تبدیل کامپایلر نامیده می شود.

در اینجا خلاصه ای از آنچه کامپایل شامل می شود آورده شده است:

  • تجزیه و تحلیل واژگانی – Lexical Analysis: کامپایلر کد منبع را می خواند و آن را به عناصر معنی دار به نام نشانه ها تقسیم می کند. این نشانه ها می توانند کلمات کلیدی، نمادها، عملگرها، شناسه ها و غیره باشند.
  • تجزیه و تحلیل نحو (تجزیه) – Syntax Analysis (Parsing): در این مرحله، کامپایلر نشانه ها را در برابر قوانین نحوی زبان برنامه نویسی بررسی می کند تا یک نمایش درخت مانند از ساختار کد منبع ایجاد کند. این درخت به درخت نحو انتزاعی (AST) معروف است.
  • تجزیه و تحلیل معنایی – Semantic Analysis: کامپایلر AST را برای سازگاری معنایی تأیید می کند، و اطمینان حاصل می کند که کد منبع به قوانین معنایی زبان پایبند است. این شامل بررسی نوع، وضوح محدوده، و شناسایی استفاده از متغیرهای اعلام نشده است.
  • بهینه سازی – Optimization: کامپایلر ممکن است بهینه سازی های مختلفی را برای افزایش کارایی کد ماشین حاصل انجام دهد. این می تواند شامل حذف کد اضافی، به حداقل رساندن استفاده از حافظه و بهینه سازی مسیرهای اجرا باشد.
  • تولید کد – Code Generation: کامپایلر AST بهینه شده را به کد ماشین مخصوص معماری پردازنده هدف تبدیل می کند. این کد ماشین همان چیزی است که کامپیوتر می تواند اجرا کند.
  • پیوند – Linking: در بسیاری از موارد، به ویژه برای برنامه های پیچیده، کامپایلر نیاز دارد تا کدهای ماشین را از فایل های منبع و کتابخانه های مختلف به یکدیگر پیوند دهد. این مرحله مراجع خارجی را حل می کند و یک فایل اجرایی یا باینری نهایی تولید می کند.

نمونه ای از کامپایل

یک برنامه ساده را در نظر بگیرید که به زبان C نوشته شده است:

#include <stdio.h>
int main() {
   printf("Hello, world!\n");
   return 0;
}

وقتی این برنامه را با استفاده از یک کامپایلر C کامپایل می‌کنید (مانند gcc برای مجموعه کامپایلر گنو)، کامپایلر مراحل ذکر شده در بالا را طی می‌کند تا این کد C سطح بالا را به کد ماشینی تبدیل کند که رایانه می‌تواند اجرا کند. دستور کامپایل این برنامه ممکن است به صورت زیر باشد:

gcc hello.c -o hello

این به gcc می گوید که فایل منبع hello.c را بگیرد، آن را کامپایل کند و یک فایل اجرایی به نام hello را خروجی دهد. اجرای ./hello در ترمینال، کد دستگاه را اجرا می کند و "Hello, world!" به کنسول

کامپایل بسیار مهم است زیرا:

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

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

زبان‌های مفسری (Interpreted Languages)

Source Codescript.pyInterpreterLine by lineExecutionImmediate

Interpreted Languages زبان‌هایی هستند که کد منبع آنها مستقیماً توسط یک برنامه به نام «Interpreter» اجرا می‌شود. در این زبان‌ها، برخلاف زبان‌های کامپایل‌شونده، کل کد ابتدا به صورت کامل به زبان ماشین تبدیل نمی‌شود. بلکه Interpreter خط به خط یا دستور به دستور کد شما را می‌خواند، تحلیل می‌کند و بلافاصله اجرا می‌نماید.

نحوهٔ اجرا:

  1. نوشتن کد منبع: شما کدی را در زبانی مانند Python یا JavaScript می‌نویسید.
  2. تفسیر (Interpretation): Interpreter کد را خط به خط می‌خواند و همان لحظه اجرا می‌کند.
  3. اجرا: نتیجه بلافاصله نمایش داده می‌شود و نیازی به مرحلهٔ جداگانهٔ Compilation نیست.

مزایا:

  • توسعهٔ سریع (Rapid Development): تغییرات کوچک در کد را می‌توانید فوراً آزمایش کنید.
  • مستقل از پلتفرم (Platform Independence): تا زمانی که Interpreter برای یک پلتفرم وجود داشته باشد، کد شما روی آن اجرا خواهد شد.

معایب:

  • سرعت پایین‌تر: به دلیل نبود مرحلهٔ کامپایل و تحلیل هم‌زمان، اجرای برنامه‌ها کندتر از زبان‌های کامپایل‌شونده است.
  • مصرف منابع بیشتر: پردازش خط به خط معمولاً به منابع بیشتری نیاز دارد.

مثال‌ها:

  • Python
  • JavaScript
  • Ruby
  • PHP

فرآیند اجرای کد در زبان‌های مفسری و نقش Interpreter

در زبان‌های مفسری (Interpreted Languages)، برخلاف زبان‌های کامپایل‌شونده (Compiled Languages)، کد منبع (Source Code) nicht توسط سیستم‌عامل selbst in Maschinencode übersetzt wird. در عوض، یک برنامهٔ واسط به نام Interpreter مسئولیت خواندن، درک و اجرای مستقیم کد را بر عهده دارد. این رویکرد باعث می‌شود که چرخهٔ تغییر و آزمایش کد بسیار ساده‌تر و سریع‌تر شود، اما از طرفی اجرای نهایی نسبت به زبان‌های کامپایل‌شونده کندتر است.

اجرای کد در زبان‌های مفسری

  1. وجود Interpreter:
    برای اجرای یک اسکریپت در یک زبان مفسری، ابتدا باید Interpreter مخصوص آن زبان روی سیستم‌عامل نصب باشد. این Interpreter پیش‌تر با استفاده از یک زبان کامپایل‌شونده (مانند C یا C++) به صورت یک برنامهٔ باینری (Binary) قابل اجرا کامپایل شده است. زمانی که شما اسکریپت خود را اجرا می‌کنید، در واقع Interpreter را فراخوانی می‌کنید که خود یک فایل اجرایی مستقل است.
  2. ترجمه در لحظه (On-the-Fly Interpretation):
    در این حالت، Interpreter کد شما را به صورت خط به خط یا بلوک به بلوک می‌خواند. برخلاف کامپایلرها که ابتدا کل کد را به یک فایل اجرایی تبدیل می‌کنند، Interpreter دستورات را گرفته، آنها را تفسیر و بلافاصله اجرا می‌کند. این بدان معنی است که نیازی به یک مرحلهٔ جداگانهٔ کامپایل قبل از اجرا ندارید.
  3. نحوهٔ ارتباط با Maschinencode:
    CPU تنها Maschinencode را می‌فهمد. Interpreter که خود یک باینری کامپایل‌شده است، شامل توابع و روتین‌هایی است که هر دستور زبان مفسری را به عملیات‌های داخلی قابل فهم برای CPU تبدیل می‌کنند. به عبارت دیگر، Interpreter همانند یک لایهٔ میانی عمل می‌کند:
    • کد منبع شما (مثلاً در Python یا JavaScript) مستقیماً به Maschinencode تبدیل نمی‌شود.
    • در عوض، Interpreter وظایف نوشته‌شده در کد را با توابع داخلی خود (که از قبل در Maschinencode کامپایل شده‌اند) تطبیق می‌دهد و آن‌ها را اجرا می‌کند.
  4. Bytecode و Virtual Machine (VM):
    بسیاری از زبان‌های مفسری ابتدا کد شما را به یک قالب میانی به نام Bytecode تبدیل می‌کنند. Bytecode برخلاف Maschinencode، به پلتفرم خاصی وابسته نیست. سپس یک Virtual Machine (VM) - که خود در Maschinencode کامپایل شده است - این Bytecode را تفسیر یا اجرا می‌کند. این VM شبیه یک مینی-پردازندهٔ نرم‌افزاری عمل می‌کند که دستورالعمل‌های Bytecode را قدم به قدم می‌خواند و با کمک توابع داخلی خود، آنها را روی سخت‌افزار واقعی اجرا می‌کند.

زبان‌های نشانه‌گذاری (Markup Languages)

Markup Languages مانند HTML یا XML در اصل زبان‌های برنامه‌نویسی به معنای سنتی نیستند، زیرا قرار نیست دستورات محاسباتی را اجرا کنند. آنها بیشتر برای ساختاردهی (Structuring) و نمایش محتوا (Content) به کار می‌روند. در این زبان‌ها، تگ‌ها (Tags) و اِلِمان‌ها (Elements) برای مشخص کردن چیدمان متن، تصاویر و سایر عناصر استفاده می‌شوند.

نحوهٔ استفاده:

  1. نوشتن مستندات (Documents): شما یک فایل HTML می‌نویسید که شامل تگ‌هایی مانند <html>، <head>، <body> و ... است.
  2. تفسیر توسط مرورگر (Browser Interpretation): مرورگر وب (Web Browser) به عنوان یک Interpreter ساده عمل می‌کند و تگ‌ها را خوانده و بر اساس آنها محتوای بصری را نمایش می‌دهد.
  3. بدون محاسبات پیچیده: HTML کدی را اجرا نمی‌کند، بلکه ساختار و طرح اطلاعات را مشخص می‌نماید.

مزایا:

  • سادگی: یادگیری آنها آسان است.
  • وضوح ساختار: محتوا را از نمای ظاهری جدا می‌کنند.

معایب:

  • فاقد منطق محاسباتی: نمی‌توانید الگوریتم‌های پیچیده را مستقیماً در آنها پیاده‌سازی کنید.

مثال‌ها:

  • HTML (HyperText Markup Language)
  • XML (eXtensible Markup Language)
  • Markdown

زبان‌های Hybride یا نیمه‌کامپایل‌شونده (Just-In-Time Compilation)

Java Compiled or Interpreted

برخی از زبان‌ها، مانند Java، رویکردی میان کامپایل و تفسیر دارند. آنها ابتدا به یک کد میانی (Intermediate Code) یا «Bytecode» کامپایل شده و سپس با یک Interpreter یا با استفاده از «JIT Compiler» (Just-In-Time Compiler) اجرا می‌شوند. نتیجه این است که این زبان‌ها می‌توانند از مزایای هر دو جهان بهره ببرند؛ یعنی سرعت بهتر از زبان‌های کاملاً مفسری و انعطاف‌پذیری بیشتر از زبان‌های کامپایل‌شوندهٔ سنتی.

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

درک تفاوت بین Compiled Languages، Interpreted Languages و Markup Languages از مهم‌ترین دانسته‌هایی است که یک برنامه‌نویس نیاز دارد تا انتخاب‌های هوشمندانه‌تری داشته باشد. با آشنایی با «Compiler»، «Interpreter» و نحوهٔ کارکرد آنها، می‌توانید چرخهٔ توسعه، آزمایش، بهبود، و در نهایت ارائهٔ نرم‌افزار را بهتر مدیریت کنید. همچنین با فهم کاربرد زبان‌های نشانه‌گذاری، می‌توانید با ساختاردهی مناسب محتوا، وب‌سایت‌ها و مستندات بهتری بسازید. به این ترتیب، مسلح به این دانش اولیه، آماده‌اید تا گام‌های بعدی را در مسیر برنامه‌نویسی بردارید.

آشنایی با محیط‌های توسعهٔ یکپارچه (Integrated Development Environment - IDE)

IDE ComponentsCode EditorSyntax HighlightCompilerIntegratedDebuggerBreakpointsBuild ToolsAutomationVersion CtrlGitAll-in-One Development Environment

یک IDE (مخفف Integrated Development Environment) مجموعه‌ای از ابزارها و امکانات نرم‌افزاری است که برای کمک به برنامه‌نویسان در فرآیند توسعهٔ کد طراحی شده است. در حقیقت، IDE‌ها شبیه به یک جعبه‌ابزار کامل برای یک نجار هستند؛ آنها تمام وسایل مورد نیاز جهت نوشتن، مدیریت و رفع اشکال (Debugging) نرم‌افزار را در یک محیط مجتمع ارائه می‌کنند.

برخلاف استفادهٔ جداگانه از یک Text Editor ساده برای نوشتن کد، یک IDE معمولاً شامل امکانات زیر است:

  1. Code Editor: ویرایشگر کد پیشرفته با قابلیت‌هایی نظیر برجسته‌سازی نحو (Syntax Highlighting)، تکمیل خودکار (Auto-completion) و قالب‌بندی (Formatting).
  2. Compiler / Interpreter Integration: ادغام‌شده با Compiler یا Interpreter زبان هدف، به صورتی که نیاز نیست از ابزارهای خارجی برای کامپایل یا اجرای کد استفاده کنید.
  3. Debugger: ابزاری برای یافتن و رفع خطاها، که امکان توقف اجرای برنامه در نقاط خاص (Breakpoints) و بررسی مقادیر متغیرها را فراهم می‌کند.
  4. Build Tools: ابزارهای مدیریت پروژه که وظیفهٔ ساخت (Build)، تست و پکیج کردن نرم‌افزار را ساده‌تر می‌کنند.
  5. Version Control Integration: پشتیبانی از سیستم‌های کنترل نسخه (Version Control Systems) مثل Git، برای مدیریت تغییرات در کد و همکاری گروهی.

به طور خلاصه: یک IDE باعث می‌شود تمام گام‌های اصلی توسعه — از نوشتن کد تا تست و اجرا — در یک محیط واحد و یکپارچه انجام گیرند. این یکپارچگی منجر به صرفه‌جویی در زمان، کاهش خطا و بهبود تجربهٔ برنامه‌نویسی می‌شود.

مثال‌های رایج از IDE

Popular IDEs

  • Visual Studio: محصول شرکت مایکروسافت، پشتیبانی قوی از زبان‌هایی مانند C++، C# و Visual Basic دارد.
  • IntelliJ IDEA: انتخابی محبوب برای توسعه‌دهندگان Java که توسط شرکت JetBrains ارائه شده و امکانات هوشمندی برای کدنویسی ارائه می‌کند.
  • Eclipse: یک IDE متن‌باز (Open-Source) برای Java و بسیاری زبان‌های دیگر، با پلاگین‌های فراوان.
  • PyCharm: مختص زبان Python که انواع ابزارهای پیشرفته برای تست، اشکل‌زدایی و توسعهٔ سریع را ارائه می‌دهد.
  • Android Studio: برای توسعهٔ اپلیکیشن‌های Android با امکانات ویژهٔ موبایل و شبیه‌ساز (Emulator).

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

🎯 آنچه در این فصل یاد می‌گیرید:

  • Compiled Languages: کد منبع → Compiler → Machine Code (C, C++, Rust)
  • Interpreted Languages: کد منبع → Interpreter → اجرای خط به خط (Python, JS)
  • Markup Languages: تگ‌ها → مرورگر → نمایش (HTML, XML)
  • Hybrid Languages: Bytecode + JIT Compiler (Java)
  • IDE: Code Editor + Compiler + Debugger + Build Tools + Git
  • Compiler: Lexical → Syntax → Semantic → Optimization → Code Gen → Linking

آزمون / Quiz

سوال ۱: زبان‌های کامپایل‌شونده چه تفاوتی با زبان‌های مفسری دارند؟+
زبان‌های کامپایل‌شونده خط به خط اجرا می‌شوند
✅ زبان‌های کامپایل‌شونده ابتدا به کد ماشین تبدیل می‌شوند، اما مفسری خط به خط اجرا می‌شوند
Compiler کل کد را تبدیل می‌کند، Interpreter خط به خط اجرا می‌کند.
هیچ تفاوتی ندارند
سوال ۲: HTML چه نوع زبانی است؟+
زبان کامپایل‌شونده
زبان مفسری
✅ زبان نشانه‌گذاری (Markup Language)
HTML برای ساختاردهی محتوا استفاده می‌شود، نه برای محاسبات.
سوال ۳: کدام مورد یک IDE نیست؟+
Visual Studio
✅ Notepad (ویرایشگر متن ساده)
Notepad فقط یک ویرایشگر متن است، بدون Compiler، Debugger یا Build Tools.
PyCharm
سوال ۴: کامپایلر چه کاری انجام می‌دهد؟+
کد را خط به خط اجرا می‌کند
✅ کد منبع را به کد ماشین تبدیل می‌کند (Lexical → Syntax → Semantic → Code Gen)
کامپایلر کد سطح بالا را به کد باینری قابل اجرا توسط CPU تبدیل می‌کند.
网页 را نمایش می‌دهد
سوال ۵: Java چه نوع زبانی است؟+
فقط کامپایل‌شونده
فقط مفسری
✅ Hybride (نیمه‌کامپایل‌شونده) — Bytecode + JIT Compiler
Java ابتدا به Bytecode کامپایل می‌شود، سپس با JIT Compiler اجرا می‌شود.