موضوع مقاله: زبان برنامه‌نویسی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # زبان برنامه‌نویسی | مقدمه: هنگام کامپایل و اجرا، خروجی "سلام، دنیا!" می‌دهد.|جایگزین= زبان‌های برنامه‌نویسی ساختارهای زبانی دستور مدار الگوریتم را به‌وسیلهٔ ساختارهای دستوری متفاوت برای اجرای رایانه توصیف کرد و با این روش امکان نوشتن برنامه جهت تولید نرم‌افزارهای جدید برای وارد کردن متن برنامه، اجرا، همگردانی و رفع اشکال آن هستند. | ## بخش 1: زبان برنامه‌نویسی | یک زبان برنامه‌نویسی مجموعه‌ای از دستورالعمل‌ها و قواعد است که برای بیان محاسباتی که توسط یک ماشین (مخصوصاً رایانه) قابل انجام است، طراحی شده است. زبان‌های برنامه‌نویسی برای ایجاد برنامه‌هایی به کار می‌روند که رفتار یک ماشین را مشخص می‌کنند، الگوریتم دقیق را بیان می‌کنند، یا روشی برای تعامل انسان و رایانه هستند. (مانند Perl) اولین زبان برنامه‌نویسی به قبل از اختراع رایانه بازمی‌گردد، و برای هدایت رفتار ماشین‌هایی مانند دستگاه‌های نساجی اتوماتیک و نوازنده‌های پیانو به کار می‌رفت. تعاریف ویژی‌هایی که غالباً برای تشکیل یک زبان برنامه‌نویسی مهم شمرده می‌شوند: کاربرد: یک زبان برنامه‌نویسی، زبانی است که برای نوشتن برنامه‌های رایانه‌ای به کار می‌رود که رایانه‌ای را برای انجام محاسبات یا اجرای الگوریتم یا احتمالاً کنترل دستگاه‌های خارجی مثل چاپگر، ربات و… درگیر می‌کنند. هدف: زبان‌های برنامه‌نویسی با زبان‌های طبیعی تفاوت دارند و آن اینکه زبان‌های طبیعی فقط برای فعل و انفعالات بین مردم به کار می‌روند، درحالی‌که زبان‌های برنامه‌نویسی همچنین به انسان‌ها اجازه می‌دهد که از طریق دستورها با ماشین‌ها ارتباط برقرار کنند. برخی زبان‌های برنامه‌نویسی به وسیلهٔ یک دستگاه استفاده می‌شوند تا دستگاه دیگری را کنترل کند. ساختارها: زبان‌های برنامه‌نویسی ممکن است ساختارهایی برای تعریف و تغییر داده ساختارها یا کنترل جریان اجرا داشته باشند. توان بیانگر: نظریه محاسبات، زبان‌ها را به وسیلهٔ محاسباتی که توان بیان آن‌ها را دارند طبقه‌بندی می‌کند. تمام زبان‌های «کامل تورینگ» می‌توانند مجموعه یکسانی از الگوریتم‌ها را پیاده‌سازی کنند. برخی مؤلفین اصطلاح «زبان برنامه‌نویسی» را محدود به آن‌هایی می‌کنند که می‌توانند تمام الگوریتم‌های ممکن را پیاده‌سازی کنند، گاهی اصطلاح «زبان رایانه» برای زبان‌های برنامه‌نویسی محدودتر به کار می‌رود. یک زبان برنامه‌نویسی (که می‌تواند کامل تورینگ نباشد) ممکن است در این زبان‌های غیر محاسباتی (میزبان) تعبیه شوند. تاریخچه‌های برنامه‌نویسی پیشرفت‌های اولیه اولین زبان برنامه‌نویسی به قبل از رایانه‌های مدرن بازمی‌گردد. قرن ۱۹ دستگاه‌های نساجی و متون نوازنده پیانو قابل برنامه‌نویسی داشت که امروزه به عنوان مثال‌هایی از زبان‌های برنامه‌نویسی با حوزه مشخص شناخته می‌شوند. با شروع قرن بیستم، کارت پانچ، داده را کدگذاری کردند و پردازش مکانیکی را هدایت کردند. در دهه ۱۹۳۰ و ۱۹۴۰، صورت گرایی حساب لاندای آلونزو چرچ و ماشین تورینگ آلن تورینگ مفاهیم ریاضی بیان الگوریتم‌ها را فراهم کردند؛ حساب لامبدا همچنان در طراحی زبان مؤثر است. اولین زبان برنامه‌نویسی سطح بالا طراحی شده برای رایانه پلان کلکول بود، که بین سال‌های ۱۹۴۵ و ۱۹۴۳ توسط کنراد زوس برای ز۳ آلمان طراحی شد. برنامه‌نویسی زبان ماشین نسل اول توسط نسل دومی که زبان اسمبلی نامیده می‌شود، جایگزین شد. در سال‌های بعد دهه ۵۰، زبان برنامه‌نویسی اسمبلی، که برای استفاده از دستورهای ماکرو تکامل یافته بود، توسط سه زبان برنامه‌نویسی سطح بالا دیگر: فورترن، کوبال و لیسپ مورد استفاده قرار گرفت. نسخه‌های به روز شدهٔ این برنامه‌ها همچنان مورد استفاده قرار می‌گیرند، و هر کدام توسعه زبان‌های بعد را تحت تأثیر قرار دادند. در پایان دههٔ ۵۰ زبان، الگول ۶۰ معرفی شد، و بسیاری از زبان‌های برنامه‌نویسی بعد، با ملاحظهٔ بسیار، از نسل الگول هستند. PL/i(NPL) دراوایل دهه ۶۰ طراحی شده بود تا ایده‌های خوب فورترن و کوبول را بهم پیوند دهد. در دهه ۱۹۶۰، سیمولا اولین زبانی بود که برنامه‌نویسی شیء گرا را پشتیبانی می‌کرد، به دنبال آن در اواسط دهه ۱۹۷۰، Smalltalk به عنوان اولین زبان کاملاً شیء گرا معرفی شد. سی (C) بین سال‌های ۱۹۶۹ تا ۱۹۷۳ به عنوان زبان برنامه‌نویسی سیستمی طراحی شد و در سیستم عامل‌های بسیاری بکار گرفته شد. پاسکال و بیسیک (که در آینده به زبان ویژوال بیسیک معروف شد) در ابتدا یک زبان آموزشی بودند ولی بعدها با ارائه کامپایلرهای مختلف آن کاربردی شدند. لیسپ از جمله زبان‌هایی بود که براساس پردازش لیست‌ها کار می‌کرد و برای الگوریتم‌های هوش مصنوعی مناسب بود. پرولوگ، طراحی شده در ۱۹۷۲، اولین زبان برنامه‌نویسی منطقی بود؛ که برای الگوریتم‌های هوش مصنوعی مناسب بود. در ۱۹۷۸، ML سیستم نوع چند ریخت روی لیسپ ایجاد کرد، و در زبان‌های برنامه‌نویسی کاربردی ایستا نوع‌گذاری شده پیشگام شد. هر یک از این زبان‌ها یک خانوادهٔ بزرگ از وارثین خود را به جای گذاشتند، و مدرن‌ترین زبان‌ها، از تبار حداقل یکی از زبان‌های بالا به‌شمار می‌آیند. دهه‌های ۱۹۶۰ و ۱۹۷۰، مناقشات بسیاری روی برنامه‌نویسی ساخت یافته به خود دیدند، و اینکه آیا زبان‌های برنامه‌نویسی باید طوری طراحی شوند که آن‌ها را پشتیبانی کنند. «ادسگر دیکسترا» در نامه‌ای معروف در ۱۹۶۸ که در ارتباطات ACM منتشر شد، استدلال کرد که دستور goto باید از تمام زبان‌های سطح بالا حذف شود. در دهه‌های ۱۹۶۰ و ۱۹۷۰ توسعهٔ تکنیک‌هایی صورت گرفت که اثر یک برنامه را کاهش می‌داد و در عین حال بهره‌وری برنامه‌نویس و کاربر را بهبود بخشید. دسته کارت برای 4GL اولیه بسیار کوچکتر از برنامهٔ هم سطح بود که با 3GL deck نوشته شد دهه ۱۹۸۰ سال‌های یکپارچگی نسبی بود. ایالات متحده ایدا (زبان برنامه‌نویسی سیستمی که بیشتر برای استفاده توسط پیمان کاران دفاعی بود) را استانداردسازی در ژاپن و جاهای دیگر، هزینه‌های گزافی صرف تحقیق در مورد زبان نسل پنجم می‌شد که دارای ساختارهای برنامه‌نویسی منطقی بود. به جای ایجاد مثال‌های جدید، تمام این تلاش‌ها ایده‌هایی که در دهه‌های قبل خلق شده بودند را بهتر کرد. یک گرایش مهم در طراحی زبان در دهه ۱۹۸۰ تمرکز بیشتر روی برنامه‌نویسی برای سیستم‌های بزرگ از طریق مدول‌ها، یا واحدهای کدهای سازمانی بزرگ مقیاس بود. با وجود اینکه زبان‌های دیگر، مثل PL/i، پشتیبانی بسیار خوبی برای برنامه‌نویسی مدولی داشتند. Perl، در اصل یک ابزار نوشتن یونیکس بود که اولین بار در سال ۱۹۸۷ منتشر شد، در وبگاه‌های دینامیک متداول شد. این توسعه‌ها اساساً نو نبودند، بلکه بیشتر بهینه‌سازی شده زبان و مثال‌های موجود بودند، و بیشتر بر اساس خانواده زبان برنامه‌نویسی C بودند. جهت‌های فعلی شامل امنیت و وارسی قابلیت اعتماد است، گونه‌های جدید مدولی (mixin، نماینده‌ها، جنبه‌ها) و تجمع پایگاه داده. که به جای اینکه داده‌های اسکالر را برگردانند، مجموعه‌هایی را تغییر داده و برمی‌گردانند که برای اکثر زبان‌ها متعارفند. Perl برای مثال، با «مدرک اینجا» خود می‌تواند چندین برنامه ۴GL را نگه دارد، مانند چند برنامه جاوا اسکریپت، در قسمتی از کد پرل خود و برای پشتیبانی از چندین زبان برنامه‌نویسی با تناسب متغیر در «مدرک اینجا» استفاده کند. نسل دوم، زبان‌هایی مانند اسمبلی و مشتق آن هستند که برای انسان قابل فهم‌تر هستند. نسل سوم، زبان‌هایی مانند کوبول و پی‌ال‌وان و … هستند که دارای دستورهای قابل فهم‌تری برای انسان هستند و به کامپایلرها نیاز دارند. نسل چهارم، زبان‌هایی مانند اوراکل و فاکس پرو و اس‌کیوال و … هستند و این نسل از زبان‌ها چیزی نزدیک به محاوره‌های انسانی است. نسل پنجم، زبان‌هایی مانند prolog, ops5، ویژوال بیسیک هستند که تمرکز آن‌ها بر حل مسئله و استفاده از الگوریتم‌های نوشته شده توسط برنامه‌نویس است. الگوها زبان‌های برنامه‌نویسی را می‌توان از چهار دیدگاه متفاوت مورد بررسی قرار داده و تقسیم‌بندی کرد: روش‌های برنامه‌نویسی زیر روالی ساخت یافته مدولار شیء گرا نزدیکی به زبان ماشین سطح پایین سطح میانی سطح بالا نوع ترجمه و تفسیر مفسری کامپایلری رابط برنامه‌نویسی مبتنی بر متن مبتنی بر گرافیک (ویژوال) نکته: امروزه با وجود ماشین‌های مجازی، تقسیم‌بندی زبان‌های برنامه‌نویسی بر اساس نوع ترجمه، اشتباه می‌باشد. ماشین مجازی HipHop (مورد استفاده شرکت فیسبوک برای کاهش مرحله تفسیر در PHP) و همچنین کامپایل زبان برنامه‌نویسی پایتون به کلاس‌های جاوا نمونه‌هایی از چندگانگی نوع ترجمه در زبان‌های برنامه‌نویسی می‌باشد. عنصرها تمام زبان‌های برنامه‌نویسی تعدادی بلوک‌های ابتدایی برای توضیح داده و پردازش یا تبدیل آن‌ها (مانند جمع کردن دو عدد با انتخاب یک عضو از یک مجموعه) دارند. این «عناصر ابتدایی» به وسیلهٔ قوانین معناشناسی و دستوری تعریف می‌شوند که ساختار و معنای مربوط را توضیح می‌دهند. بیشتر زبان‌های برنامه‌نویسی کاملاً متنی‌اند؛ و از دنبالهٔ متون شامل واژگان، اعداد و نشان‌گذاری‌های بسیار شبیه زبان نوشتاری طبیعی استفاده می‌کنند. از طرف دیگر، برنامه‌هایی نیز وجود دارند که بیشتر گرافیکی‌اند، و از روابط بصری بین سمبل‌ها برای مشخص کردن برنامه استفاده می‌کنند. دستور یک زبان، ترکیبات ممکن سمبل‌ها برای ایجاد یک برنامهٔ درست را از نظر دستوری مشخص می‌کند. معنایی که به یک ترکیب سمبل‌ها داده می‌شود با معناشناسی اداره می‌شود (قراردادی یا نوشته شده در پیاده‌سازی منبع). از آنجا که بیشتر زبان‌ها متنی هستند، این مقاله دستور متنی را مورد بحث قرار می‌دهد. دستور زبان برنامه‌نویسی معمولاً به وسیلهٔ ترکیب عبارات معین (برای ساختار لغوی) و فرم توضیح اعمال (برای ساختار گرامری) تعریف می‌شوند. مثال‌های رو به رو دنباله‌هایی خوش فرم در این گرامر هستند: a b c232 (1 ، ، 12345) همهٔ برنامه‌هایی که از لحاظ دستوری درست هستند، از نظر معنا درست نیستند. | ## بخش 2: زبان برنامه‌نویسی | بسیاری از برنامه‌های درست دستوری، بد فرم هستند و با توجه به قوانین زبان؛ ممکن است (بسته به خصوصیات زبان و درست بودن پیاده‌سازی) نتیجهٔ آن‌ها خطای ترجمه یا استثنا (exception) باشد. حتی اگر یک برنامه در یک زبان به خوبی بیان شده باشد، ممکن است دقیقاً مطلوب نویسنده آن نبوده باشد. به عنوان مثال در زبان طبیعی، ممکن نیست به برخی از جملات درست از لحاظ گرامری، معنای خاصی اطلاق کرد یا ممکن است جمله نادرست باشد: «ایده‌های بیرنگ سبز با خشم می‌خوابند.» از نظر دستوری خوش فرم است ولی معنای مورد قبولی ندارد. «جان یک مجرد متأهل است.» از نظر دستوری درست است، ولی معنایی را بیان می‌کند که نمی‌تواند درست باشد. این تکّه کد در زبان C از نظر دستوری درست است، اما کاری را انجام می‌دهد که از نظر معنایی تعریف نشده است. دستور بیشتر زبان‌های برنامه‌نویسی می‌تواند به وسیلهٔ یک گرامر نوع ۲ مشخص گردد، برای نمونه، گرامرهای مستقل از متن. معناشناسی ایستا معناشناسی ایستا محدودیت‌هایی بر روی ساختار مجاز متن‌ها تعیین می‌کند که بیان آن‌ها در فرمول دستوری استاندارد مشکل یا غیرممکن است. برخلاف باور برخی از برنامه‌نویسان محدودیت‌های اعمال شده، اعمال نشده‌اند بلکه در واقع ناشی از زیرساخت‌های آن زبان برنامه‌نویسی هستند تا سرعت پردازش را افزایش دهند و قدرت پردازش پردازنده را برای تایپ‌کستینگ‌های خودکار متعدد صرف نکنند. استفاده از روش ایستا صرفاً سرعت پردازش‌هایی را افزایش می‌دهد که در کسری از ثانیه به محاسبه حجم انبوهی از داده‌ها نیاز دارند. سیستم نوع‌گذاری یک سیستم نوع‌گذاری مشخص می‌کند که یک زبان برنامه‌نویسی چگونه مقادیر و عبارات را در نوع (type) دسته‌بندی می‌کند، چگونه می‌تواند آن نوع‌ها را تغییر دهد و رفتار متقابل آن‌ها چگونه است. این کار عموماً توضیح داده ساختارهایی که می‌توانند در آن زبان ایجاد شوند را شامل می‌شود. طراحی و مطالعه سیستم‌های نوع‌گذاری به وسیلهٔ ریاضیات قراردادی را تئوری نوع‌گذاری می‌گویند. زبان‌های نوع‌گذاری شده و بدون نوع‌گذاری یک زبان نوع‌گذاری شده است اگر مشخصات هر عملیات، نوع داده‌های قابل اجرا توسط آن را با نشان دادن نوع‌هایی که برای آن‌ها قابل اجرا نیست، تعیین کند. در نتیجه بیشتر زبان‌های برنامه‌نویسی مدرن ممکن است اجرای این عملیات را توسط برنامه‌ها رد کنند. در برخی زبان‌ها، عبارات بی‌معنی ممکن است هنگام ترجمه (compile) پیدا شود (چک‌کنندهٔ نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامه‌ها، هنگام اجرا پیدا شود. بیشتر این زبان‌ها اسکریپتی یا مارک آپ هستند، مانند rexx و SGML و فقط یک داده گونه دارند—غالباً رشته‌های کاراکتری که هم برای داده‌های عددی و هم برای داده‌های سمبلی کاربرد دارند. در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبان‌های اسمبلی، این امکان را می‌دهد که هر عملیاتی روی هر داده‌ای انجام شود، که معمولاً دنباله‌ای از بیت‌ها با طول‌های متفاوت در نظر گرفته می‌شوند. زبان‌های سطح بالا که بی نوع هستند شامل زبان‌های ساده رایانه‌ای و برخی از انواع زبان‌های نسل چهارم. در عمل، درحالی‌که تعداد بسیار کمی از دیدگاه نظریه نوع، نوع‌گذاری شده تلقی می‌شوند (چک کردن یا رد کردن تمام عملیات‌ها)، بیشتر زبان‌های امروزی درجه‌ای از نوع‌گذاری را فراهم می‌کنند. بسیاری از زبان‌های تولیدکننده راهی را برای گذشتن یا موقوف کردن سیستم نوع فراهم می‌کنند. نوع‌گذاری ایستا و پویا در نوع‌گذاری ایستا تمام عبارات نوع‌های خود را قبل از اجرای برنامه تعیین می‌کنند (معمولاً در زمان کامپایل). برای مثال، ۱ و (۲+۲) عبارات عددی هستند؛ آن‌ها نمی‌توانند به تابعی که نیاز به یک رشته دارد داده شوند، یا در متغیری که تعریف شده تا تاریخ را نگه دارد، ذخیره شوند. زبان‌های نوع‌گذاری شده ایستا می‌توانند با مانیفست نوع‌گذاری شوند یا با استفاده از نوع استنباط شوند. در حالت اول، برنامه‌نویس بیشتر صریحاً نوع‌ها را در جایگاه‌های متنی مشخص می‌نویسد (برای مثال، در تعریف متغیرها). نوع‌گذاری قوی و ضعیف نوع‌گذاری ضعیف این امکان را ایجاد می‌کند که با متغیری به جای متغیری دیگر برخورد شود، برای مثال رفتار با یک رشته به عنوان یک عدد. این ویژگی بعضی اوقات ممکن است مفید باشد، اما ممکن است باعث ایجاد برخی مشکلات برنامه شود که موقع کامپایل و حتی اجرا پنهان بمانند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل می‌کند، و این تبدیل موفقیت‌آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، یا رشته‌ای از حروف باشد. چنین تبدیل‌های ضمنی در بیشتر موارد مفیدند، اما خطاهای برنامه‌نویسی را پنهان می‌کنند. قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض می‌شوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت «قوی نوع‌گذاری شده» را به کار می‌برند و منظورشان قوی، ایستایی نوع‌گذاری شده است، و یا، حتی گیج‌کننده‌تر، منظورشان همان ایستایی نوع‌گذاری شده است؛ بنابراین C هم قوی نوع‌گذاری شده و هم ضعیف و ایستایی نوع‌گذاری شده نامیده می‌شود. معناشناسی اجرا وقتی که داده مشخص شد، ماشین باید هدایت شود تا عملیات‌ها را روی داده انجام دهد. معناشناسی اجرا ی یک زبان تعیین می‌کند که چگونه و چه زمانی ساختارهای گوناگون یک زبان باید رفتار برنامه را ایجاد کنند. برای مثال، معناشناسی ممکن است استراتژی را که به وسیله آن عبارات ارزیابی می‌شوند را تعریف کند یا حالتی را که ساختارهای کنترلی تحت شرایطی دستورها را اجرا می‌کنند. کتابخانهٔ هسته بیشتر زبان‌های برنامه‌نویسی یک کتابخانهٔ هسته مرتبط دارند (گاهی "کتابخانهٔ استاندارد" نامیده می‌شوند، مخصوصاً وقتی که به عنوان قسمتی از یک زبان استاندارد ارائه شده باشند)، که به‌طور قراردادی توسط تمام پیاده‌سازی‌های زبان در دسترس قرار گرفته باشند. کتابخانهٔ هسته معمولاً تعریف الگوریتم‌ها، داده ساختارها و مکانیزم‌های ورودی و خروجی پرکاربرد را در خود دارد. کاربران یک زبان، در بیشتر موارد با کتابخانهٔ هسته به عنوان قسمتی از آن رفتار می‌کنند، اگرچه طراحان ممکن است با آن به صورت یک مفهوم مجزا رفتار کرده باشند. بسیاری از ویژگی‌های زبان هسته‌ای را مشخص می‌کنند که باید در تمام پیاده‌سازی‌ها موجود باشند، و در زبان‌های استاندارد شده این کتابخانهٔ هسته ممکن است نیاز باشد؛ بنابراین خط بین زبان و کتابخانهٔ هستهٔ آن از زبانی به زبان دیگر متفاوت است. در واقع، برخی زبان‌ها به گونه‌ای تعریف شده‌اند که برخی از ساختارهای دستوری بدون اشاره به کتابخانه هسته قابل استفاده نیستند. به‌طور معکوس، Scheme دارای چندین زیرمجموعه مرتبط برای ایجاد سایر ماکروهای زبان می‌باشد، و در نتیجه طراحان زبان حتی این زحمت را نیز تحمل نمی‌کنند که بگویند کدام قسمت زبان به عنوان ساختارهای زبان باید پیاده‌سازی شوند، و کدام یک به عنوان بخشی از کتابخانه. مقدار حافظه اختصاص داده شده برای یک متغیر عدد کوتاه ۸ بیتی در زبان ایستا قابل مقایسه با یک متغیر طولانی ۳۲بیتی نیست که این موضوع در زبان ایستا به صراحت و مستقیم توسط کد نوشته‌شده برنامه‌نویس تعیین می‌شود (در زبان پویا نیاز به اجرای کد زیرساختاری اضافی کوچک دیگری هست تا تشخیص دهد که چه نوع مقداری به این متغیر اختصاص داده شده؟ این تفاوت ظرفیت عددها در زمان تفکیک برنامه‌های ۶۴بیتی در مقایسه با برنامه‌های ۳۲بیتی حتی برای عموم مردم کاملاً فاحش می‌شود (با اشاره به این نکته حاشیه‌ای که برنامه‌های ۳۲بیتی به دلیل محدودیت عددی توان اندازه‌گیری حافظه بیشتر از ۴میلیارد و اندی بایت را ندارند که معادل ۴گیگابایت است که در مبنای ۲ به توان ۳۲ محاسبه شده باشد در نتیجه سیستم‌عامل ۳۲بیتی نمی‌تواند روی یک سیستم با رَم بیش از ۴ گیگابایت نصب شود). تفاوت زبان‌های پویا با ایستا فقط در تعریف نوع متغیر نیست بلکه همان‌طور که دربارهٔ اعداد مطرح شد به زمینه مدیریت حافظه یا مموری منیجمنت نیز کشیده می‌شود همچنین بارگذاری خودکار کتابخانه‌ها و گسترده کردن کتابخانه‌های محیط اجرای برنامه. البته زبان‌های ایستای مدرن مانند C# با زبان میانجی IL یا جاوا و ماشین مجازی‌اش از مدیریت حافظه بهره می‌برند و به نوعی دورگه و هیبرید هستند تا تعادلی بین مدیریت حافظه و مدیریت پردازش را بدون تایپ‌کستیگ ایجاد کنند. تفاوت سرعت پردازش زبان‌های ایستا و پویا در برنامه‌هایی که نیاز به پردازش‌های بسیار حجیم در مدت زمان بسیار کوتاه دارند خودش را نشان می‌دهد بنابراین تفاوت سرعت پردازش در مورد حتی وبگاه‌های بسیار شلوغ آنقدر نیست که امکانات فراهم شده توسط یک زبان سطح بالا مانند php یا python را فدای سرعت C++ کنند البته برای مثال فیسبوک مجبور شد که php را به‌واسطه c++ بر روی facebook hiphop گسترش دهد تا به سرعت پردازش مطلوب خودش برسد. مسئولیت استفاده و تضمین خالی کردن بخش اشغال‌شده از heap پس از پایان کار به عهده خود برنامه‌نویس است در غیر اینصورت برنامه ممکن است دچار نشت حافظه شود. در زمان ران‌تایم جدولی از کداسپیس درون ساختار زبان برای تعیین حافظه مورد استفاده هر بخش از کد (مثلاً یک تابع یا فانکشن) اختصاص داده می‌شود که به هر بخش از آن اصطلاحاً Scope گفته می‌شود که تعیین می‌کند که کدام متغیرها توسط کدام بخش از کد استفاده می‌شوند تا در آغاز یک scope آن متغیرها درون محیط مثلاً یک تابع ایجاد شوند و پس از اجرا کاملاً پاک شوند (کسانی که در محیط ساده بورن شل کار کرده‌اند با این موضوع به خوبی آشنا می‌شوند). اما در زمان استفاده از رفرنس خارجی در قالب pointer (اختصاصی زبان C++) آن متغیری که به ظاهر در محیط اسکوپ استفاده می‌شود در واقع فقط یک میان‌بر رفرنس است به پوینتری که فضایی را روی حافظه تعیین کرده است که خارج از محدوده اسکوپ مثلاً تابع فعلی ما قرار دارد در نتیجه با پایان کار فانکشن ما، فضای اختصاصی آن پوینتر تخلیه نمی‌شود بلکه فقط متغیر رفرنسی که به آن اشاره می‌کرده پاک می‌شود و نشت حافظه رخ می‌دهد (به آن pointer که هیچ متغیر رفرنسی نداشته باشد پوینتر وحشی یا wild گفته می‌شود) و این پوینتر می‌تواند یک شی بانک اطلاعاتی دارای حجم انبوهی از داده‌های استخراج شده باشد یا یک شی ارتباطی بانک اطلاعاتی که از دسترس خارج شده‌اند اما فضای حافظه را تا زمان بازبودن برنامه اشغال می‌کنند. رفرنس‌های پوینتر حتی در زبان‌های سطح بالا مانند php و python یا C# هنوز در لایه زیرین ناپیدا استفاده می‌شوند برای انتقال متغیرها در سراسر برنامه اما زبان سطح بالا تعداد رفرنس‌های موجود به هر پوینتر را حفظ می‌کند و زمانی که این تعداد صفر بشود زمان مرگ پوینتر و تخلیه آن فرا رسیده یا آن را به سطل زباله گاربیج‌کالکشن می‌فرستد تا همه آن‌ها را با هم و در یک نوبت تخلیه کند و از بار پردازشی اضافه ناشی از تخلیه مکرر بکاهد اگرچه تعداد نوبت‌های تخلیه گاربیج‌کالکشن در تنظیمات برنامه یا سرور ماشین مجازی قابل تنظیم است. طراحی و پیاده‌سازی زبان برنامه‌نویسی یک مکانیزم ساخت یافته برای تعریف داده‌ها، و عملیات یا تبدیل‌هایی که ممکن است به‌طور اتوماتیک روی آن داده انجام شوند، فراهم می‌کند. یک برنامه‌نویس از انتزاعات آماده در زبان استفاده می‌کند تا مفاهیم به کار رفته در محاسبات را بیان کند. این مفاهیم به عنوان یک مجموعه از ساده‌ترین عناصر موجود بیان می‌شوند (مفاهیم ابتدایی نامیده می‌شوند). زبان‌های برنامه‌نویسی با بیشتر زبان‌های انسانی تفاوتی دارد و آن این است که نیاز به بیان دقیق تر و کامل تری دارد. هنگام استفاده از زبان‌های طبیعی برای ارتباط با دیگر انسان‌ها، نویسندگان و گویندگان می‌توانند مبهم باشند و اشتباهات کوچک داشته باشند، و همچنان انتظار داشته باشند که مخاطب آن‌ها متوجه شده باشد. اگرچه، مجازا، رایانه‌ها «دقیقاً آنچه که به آن‌ها گفته شده را انجام می‌دهند.» و نمی‌توانند «بفهمند» که نویسنده دقیقاً چه کدی مد نظر داشته است] البته امروزه برنامه‌هایی برای انجام این کار تولید شده‌اند و تلاش‌های بسیاری در این زمینه انجام شده ولی هنوز به نتیجهٔ رضایت بخشی نرسیده است[. ترکیب تعریف زبان، یک برنامه، و ورودی برنامه به‌طور کامل رفتار خروجی را به هنگام اجرای برنامه (در محدوده کنترل آن برنامه) مشخص می‌کند. برنامه‌های یک رایانه ممکن است در یک فرایند ناپیوسته بدون دخالت انسان اجرا شوند، یا یک کاربر ممکن است دستورهای را در یک مرحله فعل و انفعال مفسر تایپ کند. در این حالت «دستور»ها همان برنامه‌ها هستند، که اجرای آن‌ها زنجیروار به هم مرتبطند. | ## بخش 3: زبان برنامه‌نویسی | بسیاری از زبان‌ها کنار گذاشته شده‌اند، برای رفع نیازهای جدید جایگزین شده‌اند، با برنامه‌های دیگر ترکیب شده‌اند و در نهایت استعمال آن‌ها متوقف شده است. با وجود اینکه تلاش‌هایی برای طراحی یک زبان رایانه« کامل» شده است که تمام اهداف را تحت پوشش قرار دهد، هیچ‌یک نتوانستند به‌طور کلی این جایگاه را پر کنند. نیاز به زبان‌های رایانه‌ای گسترده از گستردگی زمینه‌هایی که زبان‌ها استفاده می‌شوند، ناشی می‌شود: محدوده برنامه‌ها از متون بسیار کوچک نوشته شده توسط افراد عادی تا سیستم‌های بسیار بزرگ نوشته شده توسط صدها برنامه‌نویس است. توانایی برنامه‌نویس‌ها: از تازه‌کارهایی که بیش از هر چیز به سادگی نیاز دارند تا حرفه‌ای‌هایی که با پیچیدگی قابل توجهی کنار می‌آیند. برنامه‌ها باید سرعت، اندازه و سادگی را بسته به سیستم‌ها از ریزپردازنده‌ها تا ابر رایانه‌ها متناسب نگه دارند. برنامه‌ها ممکن است یک بار نوشته شوند و تا نسل‌ها تغییر نکنند، یا ممکن است پیوسته اصلاح شوند. در نهایت، برنامه‌نویس‌ها ممکن است در علایق متفاوت باشند: آن‌ها ممکن است به بیان مسائل با زبانی خاص خو گرفته باشند. یک سیر رایج در گسترش زبان‌های برنامه‌نویسی این است که قابلیت حل مسائلی با درجات انتزاعی بالاتری را اضافه کنند. همان‌طور که زبان‌های برنامه‌نویسی جدید گسترش پیدا کرده‌اند، ویژگی‌هایی به برنامه‌ها افزوده شده که به برنامه‌نویس اجازه دهد که ایده‌هایی که از ترجمه ساده به دستورهای سخت‌افزار دورتر هستند نیز استفاده کند. چون برنامه‌نویس‌ها کمتر به پیچیدگی رایانه محدود شده‌اند، برنامه‌های آن‌ها می‌تواند محاسبات بیشتری با تلاش کمتر از سوی برنامه‌نویس انجام دهند. «پردازنده‌های زبان طبیعی» به عنوان راهی برای ازبین بردن نیاز به زبان‌های اختصاصی برنامه‌نویسی پیشنهاد شده‌اند. «ادسگر دیجسترا» موافق بود که استفاده از یک زبان رسمی برای جلوگیری از مقدمه‌سازی ساختارهای بی‌معنی واجب است، و زبان برنامه‌نویسی طبیعی را با عنوان «احمقانه» رد کرد، «آلن پرلیس» نیز مشابهاً این ایده را رد کرد. مشخصات خصوصیات یک زبان برنامه‌نویسی باید تعریفی فراهم کند که کاربران و پیاده‌کننده‌های زبان می‌توانند از آن استفاده کنند تا مشخص کنند کد منبع یک برنامه در آن زبان درست و معتبر است یا خیر، اگر اینطور باشد رفتار او چگونه خواهد بود. مشخصات زبان برنامه‌نویسی می‌تواند اشکال مختلفی داشته باشد، از جمله موارد زیر: تعریف صریح دستور، معناشناسی ایستا، و معناشناسی اجرای زبان. دستور و معناشناسی یک زبان باید از این توضیح استنتاج شوند، که ممکن است به زبان طبیعی یا قراردادی نوشته شود. پیاده‌سازی پیاده‌سازی یک زبان برنامه‌نویسی امکان اجرای آن برنامه را روی پیکربندی مشخصی از سخت‌افزار و نرم‌افزار را فراهم می‌کند. در برخی پیاده‌سازی‌ها که از مفسر استفاده می‌شود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیاده‌سازی‌های زبان برنامه‌نویسی بیسیک کامپایل می‌کنند و سپس کد را خط به خط اجرا می‌کنند. برنامه‌هایی که مستقیماً روی سخت‌افزار اجرا می‌شوند، چندین برابر سریعتر از برنامه‌هایی که در نرم‌افزار تفسیر می‌شوند اجرا می‌شوند. در این روش ماشین مجازی، دقیقاً قبل از اجرا، بلوک‌های کدهای بایتی که قرار است استفاده شوند را برای اجرای مستقیم روی سخت‌افزار ترجمه می‌کند زبان‌های اختصاصی اگرچه بیشترین زبان‌های برنامه‌نویسی متداول دارای مشخصات و پیاده‌سازی‌های کاملاً باز هستند، بسیاری از زبان‌های برنامه‌نویسی فقط به عنوان زبان‌های برنامه‌نویسی اختصاصی با اجرای فقط از یک فروشنده منفرد موجود هستند، که ممکن است ادعا کنند چنین یک زبان اختصاصی خاصیت معنوی آنها است. زبان‌های برنامه‌نویسی اختصاصی معمولاً زبان‌های خاص دامنه یا زبان‌های برنامه‌نویسی داخلی برای یک محصول واحد هستند. برخی از زبان‌های اختصاصی فقط در داخل یک فروشنده استفاده می‌شوند، در حالی که برخی دیگر در دسترس کاربران خارجی است. به عنوان مثال، شرکت Oracle ادعا می‌کند حقوق اختصاصی برخی از جنبه‌های زبان برنامه‌نویسی جاوا، و زبان برنامه‌نویسی #C مایکروسافت، که پیاده‌سازی‌های بیشتری در اکثر بخش‌های سیستم دارد، همچنین دارای اجرای مشترک زبان مشترک (CLR) به عنوان یک محیط بسته است. بسیاری از زبان‌های اختصاصی، علی‌رغم ماهیت اختصاصی، به‌طور گسترده مورد استفاده قرار می‌گیرند. کاربرد هزاران زبان مختلف برنامه‌نویسی، به‌طور عمده در زمینهٔ محاسبات ایجاد شده‌اند. پروژه‌های نرم‌افزاری انفرادی معمولاً از پنج زبان برنامه‌نویسی یا بیشتر استفاده می‌کنند. زبان‌های برنامه‌نویسی با بسیاری از اشکال دیگر بیان انسان متفاوتند زیرا نیاز به درجهٔ دقت و صحت بیشتری دارند. هنگام استفاده از یک زبان طبیعی برای برقراری ارتباط با افراد دیگر، نویسندگان و گویندگان بشر می‌توانند مبهم باشند و خطاهای کوچکی مرتکب شوند و همچنان انتظار دارند که هدف آنها درک شود. با این حال، به‌طور تصویری، رایانه‌ها «دقیقاً کاری را که به آنها گفته می‌شود انجام دهند» انجام می‌دهند و نمی‌توانند «بفهمند» چه برنامه‌ای را برای برنامه‌نویسی برنامه‌نویس نوشته است. ترکیب تعریف زبان، یک برنامه و ورودی‌های برنامه باید به‌طور کامل رفتارهای خارجی را که هنگام اجرای برنامه رخ می‌دهد، در دامنه کنترل آن برنامه مشخص کند. از طرف دیگر، ایده‌های مربوط به یک الگوریتم را می‌توان بدون استفاده از دقت مورد نیاز برای اجرای با استفاده از pseudocode که به زبان طبیعی با کد نوشته شده با یک زبان برنامه‌نویسی متصل می‌شود، به انسان‌ها انتقال داد. یک زبان برنامه‌نویسی یک مکانیسم ساختاری برای تعریف بخش‌هایی از داده‌ها و عملیات یا تحولاتی که ممکن است به‌طور خودکار بر روی آن داده‌ها انجام شود فراهم می‌کند. یک برنامه‌نویس از انتزاعات موجود در زبان برای نشان دادن مفاهیم درگیر در یک محاسبه استفاده می‌کند. این مفاهیم به عنوان مجموعه ای از ساده‌ترین عناصر موجود (به نام ابتدایی) ارائه می‌شوند. برنامه‌نویسی فرایندی است که توسط آن برنامه‌نویسان این اولیه را برای تهیه برنامه‌های جدید ترکیب می‌کنند، یا برنامه‌های موجود را با کاربردهای جدید یا یک محیط در حال تغییر تطبیق می‌دهند. برنامه‌های رایانه ممکن است در یک فرایند دسته ای بدون تعامل انسان اجرا شود، یا ممکن است یک کاربر دستورالعمل‌ها را در یک جلسه تعاملی یک مترجم تایپ کند. در این حالت «دستورها» صرفاً برنامه‌هایی هستند که اجرای آنها با هم زنجیر شده است. هنگامی‌که یک زبان می‌تواند دستورها خود را از طریق یک مترجم اجرا کند (مانند پوسته یونیکس یا دیگر رابط خط فرمان)، بدون تدوین، به آن اسکریپت می‌گویند. اندازه‌گیری میزان استفاده از زبان مشکل است که مشخص کنیم کدام زبان برنامه‌نویسی بیشتر مورد استفاده است، و اینکه کاربرد چه معنی می‌دهد با توجه به زمینه تغییر می‌کند. یک زبان ممکن است زمان بیشتری از برنامه‌نویس بگیرد، زبان دیگر ممکن است خطوط بیشتری داشته باشد، و دیگری ممکن است زمان بیشتری از پردازنده را مصرف کند. برای مثال: کوبول همچنان در مراکز داده متحد، غالباً روی رایانه‌های بزرگ توانا است؛ fortran در مهندسی برنامه‌های کاربردی، Ada در هوا و فضا، حمل و نقل، نظامی، برنامه‌های واقعی و جاسازی شده در زمان واقعی؛ و C در برنامه‌های تعبیه شده و سیستم‌های عامل؛ و بقیه برنامه‌ها معمولاً برای نوشتن انواع دیگر برنامه‌ها کاربرد دارند.. روش‌های مختلفی برای سنجش محبوبیت زبان‌ها، هر یک متناسب یا یک ویژگی محوری متفاوت پیشنهاد شده است: شمارش تعداد آگهی‌های شغلی که زبان را ذکر می‌کنند تعداد کتابهای فروخته شده که زبان را آموزش می‌دهد یا توصیف می‌کند تخمین تعداد خطوط موجود کد که به زبان نوشته شده‌اند - که ممکن است زبان‌هایی را که غالباً در جستجوی عمومی یافت نمی‌شوند دست کم بگیرند شمارش ارجاع‌های زبان (برای مثال، به اسم زبان) در موتورهای جستجوهای اینترنت. مطابق امار گیت‌هاب بیشتر پروژه های آزاد در سال 2024 از زبان پایتون استفاده می‌کردند در حالی که در تمامی سال های گذشته جاوااسکریپت رتبه اول را در بین زبان های استفاده شده در پروژه های آزاد را داشت. این به‌خاطر این است که در همین سال پروژه های مربوط به یادگیری ماشین و یادگیری عمیق در گیت‌هاب آمار بیشتری داشتند. با زبان‌هایی مانند Scheme و Forth، ممکن است استانداردها توسط مجریان ناکافی، ناکافی یا نامشروع تلقی شوند، بنابراین آنها در بیشتر موارد با ایجاد یک گویش جدید از استاندارد منحرف می‌شوند. در موارد دیگر، یک گویش برای استفاده در یک زبان خاص دامنه، بیشتر زیر مجموعه ایجاد می‌شود. در دنیای Lisp، بیشتر زبان‌هایی که از اصطلاحات اصطلاحاتی اصطلاحات S و اصطلاحات شبیه به Lisp استفاده می‌کنند، لهجه‌های Lisp در نظر گرفته می‌شوند، گرچه تفاوت‌های وحشیانه‌ای دارند، به عنوان مثال، راکت و کلوژ. از آنجا که معمول است که یک زبان چند لهجه داشته باشد، پیدا کردن اسناد مناسب برای یک برنامه‌نویس بی‌تجربه بسیار دشوار است. انفجار گویش‌های چهارم منجر به این جمله شد که «اگر یک مورد دیگر را دیده‌اید … یکی دیگر را دیده‌اید.» طبقه‌بندی‌ها هیچ برنامهٔ غالبی برای دسته‌بندی زبان‌های برنامه‌نویسی وجود ندارد. زبان‌ها معمولاً با ترکیب عنصرهای چند زبان پیشینه به وجود می‌آیند که هر بار ایده‌های جدید در گردشند. ایده‌هایی که در یک زبان ایجاد می‌شوند در یک خانواده از زبان‌های مرتبط پخش می‌شوند، و سپس از بین خلأهای بین خانواده‌ها منتقل شده و در خانواده‌های دیگر ظاهر می‌شوند. این حقیقت که این دسته‌بندی ممکن است در راستای محورهای مختلف انجام شوند، این وظیفه را پیچیده‌تر می‌کند؛ برای مثال، جاوا هم یک زبان شیءگرا (چون به برنامه‌نویسی شیءگرا تشویق می‌کند) و هم یک زبان هم‌زمان (چون ساختارهای داخلی برای اجرای چندین جریان موازی دارد) است. در نگاه کلی، زبان‌های برنامه‌نویسی به مثال‌های برنامه‌نویسی و یک دسته‌بندی بر اساس محدودهٔ استفاده تقسیم می‌شوند. مثال‌ها شامل برنامه‌نویسی رویه‌ای، برنامه‌نویسی شیءگرا، برنامه‌نویسی کاربردی، و برنامه‌نویسی منطقی؛ برخی زبان‌ها ترکیب چند مثالند. با توجه به هدف، زبان‌های برنامه‌نویسی ممکن است همه منظوره باشند، زبان‌های برنامه‌نویسی سیستمی، زبان‌های اسکریپتی، زبان‌های خاص دامنه، زبان‌های همزمان/ گسترده (و یا ترکیب اینها). یک زبان برنامه‌نویسی ممکن است با فاکتورهای غیر مرتبط به مثال‌های برنامه‌نویسی دسته‌بندی شود. | ## جمع‌بندی | برای مثال، بیشتر زبان‌های برنامه‌نویسی کلمات کلیدی زبان انگلیسی را استفاده می‌کنند، درحالی‌که تعداد کمی این کار را نمی‌کنند.