به بیان ساده، زبان برنامه نویسی نوعی زبان نوشتاری است که به وسیله آن میتوان برای کامپیوترها مشخص کرد که چه کاری را باید انجام دهند. دلیل اهمیت بسیار زیاد زبانهای برنامه نویسی این است که انسان تنها با استفاده از یک زبان برنامه نویسی میتواند کامپیوترها را هدایت کند تا در نهایت بتوان وظایف تکراری را به کامپیوترها واگذار کرد. البته امروزه کاربرد و اهمیت سیستمهای کامپیوتری بسیار فراتر از انجام وظایف تکراری است و با استفاده از زبانهای برنامه نویسی میتوان کارهای بسیار بیشتری انجام داد. با توجه به اهمیت روزافزون زبانهای برنامه نویسی، در این مقاله بهطور جامع به این سوال پاسخ داده شده است که زبان برنامه نویسی چیست و کلیه موارد مهم مربوط به آن شرح داده شدهاند.
زبان برنامه نویسی چیست ؟
معمولاً وقتی افراد به این درک میرسند که برنامه نویسی چیست ، سعی میکنند درک بهتری نیز در مورد مهمترین مفهوم بعدی دنیای برنامهنویسی، یعنی انواع زبان های برنامه نویسی پیدا کنند. یک زبان برنامه نویسی مجموعهای از قوانین است که رشتهها (یا در زبانهای برنامه نویسی بصری یا Visual، اجزای گرافیکی) را به کدهای ماشین تبدیل میکند تا عملیات مورد نظر در ماشین اجرا شوند. به بیان دقیقتر، زبان برنامه نویسی نوعی نظام نشانهگذاری نوشتاری (یا گرافیکی) است که برای ارتباط میان انسان و ماشین استفاده میشود. زبانهای برنامه نویسی نوعی «زبان کامپیوتری» (Computer Language) به حساب میآیند و در «برنامه نویسی کامپیوتری» برای پیادهسازی الگوریتمها مورد استفاده قرار میگیرند.
در زبانهای برنامه نویسی دستورالعملهایی برای هدایت کامپیوترها تعریف شده است. ماشینهای قابل برنامه نویسی هم وجود دارند که به جای «زبانهای برنامه نویسی عمومی» (General Programming Language) از مجموعهای از دستورالعملهای خاص استفاده میکنند. در زمانهای بسیار دور، از برنامهها برای هدایت رفتار دستگاههایی مثل ماشین بافندگی ژاکارد، جعبههای موسیقی و پیانولا استفاده میشد. اما برنامههای تعبیه شده در این ماشینها (مثل طومارهای یک پیانولا)، ثابت بودند و امکان تولید رفتار متفاوت در پاسخ به ورودیهای متفاوت یا وضعیتهای مختلف در آنها وجود نداشت.
تاکنون هزاران زبان برنامه نویسی ایجاد شده است و همه ساله زبانهای برنامه نویسی جدیدی هم در حال ساخته شدن هستند. بسیاری از زبانهای برنامه نویسی به صورت دستوری یا «Imperative» (یعنی به عنوان دنبالهای از عملیاتی برای اجرا) نوشته میشوند. در حالی که، زبانهای برنامه نویسی دیگری هم هستند که از حالت «اعلانی» (Declarative) استفاده میکنند. حالت اعلانی یعنی شرایطی که در آن نحوه رسیدن به نتیجه تعیین نمیشود، بلکه نتیجه مورد انتظار مشخص میشود. «مشخصههای» (اصول | Specification) یک زبان برنامه نویسی معمولاً به دو جزء تقسیم میشوند:
- «سینتکس» (نحو | Syntax)
- معناشناسی (معنا و مفهوم | Semantics)
این دو جزء معمولاً تشکیل دهنده یک «زبان رسمی» (Formal Language) هستند. برخی از زبانها به وسیله یک «سند مشخصات» تعریف میشوند. برای مثال، مشخصههای زبان برنامه نویسی C به وسیله یک استاندارد ISO تعیین شدهاند. این در حالی است که سایر زبانهایی مثل Perl دارای سیستم اجرایی غالب و برتر هستند و به عنوان زبان مرجع با آنها رفتار میشود. برخی از زبانهای برنامه نویسی هر دو ویژگی را با هم دارند؛ یعنی این رویه رایج است که اصول پایه زبان در برخی از زبانهای برنامه نویسی به وسیله یک استاندارد معین تعریف میشوند و بخشهای اضافه (افزونهها) از یک سیستم اجرایی غالب برداشته میشوند.
زمینه «نظریه زبانهای برنامه نویسی» (Programming Language Theory) زیر مجموعهای از حوزه علوم کامپیوتر به حساب میآید. در این حوزه به موارد زیر در خصوص زبانهای برنامه نویسی پرداخته میشود:
- طراحی (Design)
- سیستم اجرایی زبانهای برنامه نویسی (پیادهسازی | Implementation)
- تجزیه و تحلیل (Analysis)
- تعیین مشخصات و مولفهها (Characterization)
- طبقهبندی (Classification)
پس از ارائه پاسخ این سوال که زبان برنامه نویسی چیست ، اکنون بهتر است به شرح مفاهیم مهم در زبانهای برنامه نویسی پرداخته شود.
مفهوم های مهم در ارتباط با زبان برنامه نویسی
یک زبان برنامه نویسی نوعی نمادگذاری و نشانهگذاری برای نوشتن برنامهها به حساب میآید. این نمادگذاریها، اصول محاسبات و الگوریتمها به حساب میآیند. برخی از مولفان اصطلاح «زبان برنامه نویسی» را تنها به آن زبانهایی محدود میکنند که قابلیت ابراز و اجرای تمام الگوریتمهای ممکن را دارند.
ویژگی های مهم اجزای تشکیل دهنده زبان های برنامه نویسی چه هستند؟
در ادامه، ویژگیها و خصوصیتهای مهمی فهرست شدهاند که اغلب پیرامون اجزای تشکیل دهنده یک زبان برنامه نویسی مطرح میشوند:
- عملکرد و هدف
- مفاهیم انتزاعی
- قدرت بیان
در ادامه به هر یک از موارد فوق، بهطور جامع پرداخته شده است.
عملکرد و هدف زبان های برنامه نویسی چیست ؟
یک زبان برنامه نویسی کامپیوتری زبانی است که برای نوشتن برنامههای کامپیوتری مورد استفاده قرار میگیرد. برنامه کامپیوتری شامل یک کامپیوتر میشود که نوعی از محاسبات را انجام میدهد یا الگوریتم خاصی را اجرا میکند و همچنین احتمال دارد کنترل و هدایت برخی از دستگاههای جانبی مثل پرینترها، دیسکگردانها، رباتها و سایر موارد هم بهوسیله یک برنامه کامپیوتری نوشته شده با یک زبان برنامه نویسی خاص انجام شود.
برای مثال، برنامههای نوشته شده با PostScript اغلب به وسیله برنامه دیگری برای کنترل و هدایت یک پرینتر یا صفحه نمایش ایجاد میشوند. بهطور عمومیتر، یک زبان برنامه نویسی ، محاسبات لازم را در ماشینی انجام میدهد که البته این ماشین در برخی موارد ممکن است انتزاعی باشد.
این مسئله بهطور عمومی پذیرفته شده است که مشخصههای کامل یک زبان برنامه نویسی شامل توصیفهای احتمالاً ایدهآل یک ماشین یا پردازنده برای آن زبان میشوند. در واقع، در اکثر مضمونهای کاربردی، زبان برنامه نویسی شامل یک کامپیوتر هم میشود؛ بنابراین، زبانهای برنامه نویسی معمولاً به این شکل تعریف میشوند و مورد مطالعه قرار میگیرند. زبانهای برنامه نویسی با «زبانهای طبیعی» (Natural Language) متفاوت هستند. زبانهای طبیعی تنها برای تعامل میان انسانها مورد استفاده قرار میگیرند. این در حالی است که زبانهای برنامه نویسی امکان انتقال دستورالعملهای مورد نیاز به ماشینها را برای انسانها بهوجود میآورند.
مفاهیم انتزاعی زبان برنامه نویسی چیست ؟
زبانهای برنامه نویسی معمولاً شامل مفهومهای انتزاعی (Abstraction) برای تعریف و کار با ساختارهای داده یا مدیریت جریان اجرایی میشوند. این ضرورت عملی که یک زبان برنامه نویسی از مفاهیم انتزاعی کافی پشتیبانی میکند، به وسیله «اصل انتزاع در برنامه نویسی» (Abstraction Principle) بروز داده میشود. اصل انتزاع گاهی به عنوان یک توصیهنامه برای برنامه نویس جهت بهرهمندی صحیح از مفاهیم انتزاعی آن زبان برنامه نویسی مدون میشود.
معنی قدرت بیان در زبان برنامه نویسی چیست ؟
نظریه محاسبات، زبانهای برنامه نویسی را به وسیله میزان محاسباتی طبقهبندی میکند که این زبانها میتوانند از خود بروز دهند. تمام زبانهای برنامه نویسی که بر اساس قانون تورینگ کامل هستند و به اصطلاح «Turing Complete» خوانده میشوند، میتوانند مجموعه الگوریتمهای مشترک و یکسانی را پیادهسازی کنند. این زبانها به طور قطع «زبان برنامه نویسی» محسوب میشوند. از جمله زبانهایی که Turing Complete به حساب نمیآیند اما همچنان به آنها زبان برنامه نویسی میگویند، میتوان ANSI/ISO SQL-92 و Charity را مثال زد.
آیا زبان نشانه گذاری همان زبان برنامه نویسی است؟
زبانهای نشانهگذاری مثل HTML و XML که دادههای ساختاریافته را تعریف میکنند، معمولاً زبان برنامه نویسی به حساب نمیآیند. اگرچه، در صورتی که معناشناسی محاسباتی لازم تعریف شود، امکان به اشتراک گذاشتن سینتکس زبانهای نشانهگذاری (نمادگذاری | Markup Language) با زبانهای برنامه نویسی فراهم خواهد شد. برای مثال، XSLT یک زبان Turing Complete است که بهطور کامل از سینتکس XML استفاده میکند. علاوه بر این، زبان «لاتک» (LaTeX) که اکثراً برای ساختاردهی سندها از آن استفاده میشود (و کارکردی مشابه برنامه Word دارد) نیز یکی از زبانهای Turing Complete به حساب میآید.
تفاوت زبان کامپیوتری با زبان برنامه نویسی چیست ؟
اصطلاح «زبان کامپیوتری» (Computer Language) معمولاً به جای عبارت زبان برنامه نویسی بهکار میرود. اگرچه استفاده از هر کدام از این دو اصطلاح در میان مولفان مختلف، تفاوت دارد که این مسئله شامل دامنه و قلمروی دقیق هر یک از این دو هم میشود. در یک کاربرد و مورد استفاده از این دو اصطلاح، زبانهای برنامه نویسی به عنوان زیرمجموعهای از «زبانهای کامپیوتری» در نظر گرفته میشود.
بهطور مشابه، زبانهایی که در کاربردهای محاسباتی استفاده میشوند و هدفی متفاوت از بیان و ابراز برنامههای کامپیوتری دارند، «زبانهای کامپیوتری طراحی شده بهصورت عمومی» (Generically Designated Computer Languages) محسوب میشوند. برای نمونه، گاهی، زبانهای نشانهگذاری (مثل HTML) به عنوان زبان کامپیوتری در نظر گرفته میشوند تا از این طریق روی این مسئله تاکید شود که این زبانها برای اهداف برنامه نویسی استفاده نمیشوند.
یک کاربرد دیگر در خصوص هر یک از دو اصطلاح زبان کامپیوتری و زبان برنامه نویسی این است که، زبانهای برنامه نویسی ساختارهایی نظری و تئوریک برای ماشینهای انتزاعی برنامه نویسی به حساب میآیند، اما زبانهای کامپیوتری زیرمجموعهای هستند که روی کامپیوترهای فیزیکی دارای منابع سختافزاری متناهی اجرا میشوند. معمولاً تاکید میشود که زبانهای با مشخصههای رسمی به همان اندازهای زبان برنامه نویسی به حساب میآیند که زبانهای مورد نظر برای اجرا، زبان برنامه نویسی محسوب میشوند.
همچنین این بحث و عقیده هم از جانب برخی متخصصان وجود دارد که تمام آن قالبهای ورودی متنی و حتی گرافیکی که رفتار یک کامپیوتر را تحت تاثیر قرار میدهند با وجود اینکه Turing-Complete نیستند، زبان برنامه نویسی به حساب میآیند. اظهاراتی هم در این خصوص وجود دارند که در آنها ناآگاهی از مفاهیم زبان برنامه نویسی ، دلیل بسیاری از کاستیها در قالبهای ورودی تلقی شدهاند.
فیلم های آموزش برنامه نویسی
زبانهای برنامه نویسی بسیاری برای هدفها و کاربردهای مختلف وجود دارند. در بسیاری از زمینههای مختلف علمی، تحقیقاتی، صنعتی، پزشکی و تجاری از برنامه نویسی استفاده میشود. درآمد بالای برنامه نویسی و سایر جذابیتهای متعدد آن، افراد زیادی را به سمت این حوزه جذب میکند و بسیاری از افراد به دنبال آن هستند تا با کمترین هزینه، دورههای کاربردی و جامع آموزش برنامه نویسی را بگذرانند.
یکی از روشهای مقرون به صرفه برای یادگیری کار با یک زبان برنامه نویسی ، استفاده از دورههای آموزش آنلاین ویدیویی است. یکی از جامعترین مجموعه دورههای آموزش برنامه نویسی در سایت تم آف وجود دارد. در این مجموعه جامع، دورههای آموزشی بسیاری با محوریت برنامه نویسی از سطوح مقدماتی، تکمیلی و پیشرفته برای زبانهای برنامه نویسی مختلف ارائه شدهاند و علاقهمندان میتوانند بر حسب نیاز از هر یک از این دورههای ویدیویی استفاده کنند.
- برای دسترسی به مجموعه فیلم های آموزش برنامه نویسی + اینجا کلیک کنید.
تاریخچه زبان های برنامه نویسی
در این بخش سعی شده است تا موارد مهم پیرامون تاریخچه زبانهای برنامه نویسی تا جای ممکن بهطور جامع و به بیان ساده شرح داده شوند.
ابداع های اولیه، سرآغاز تاریخچه زبان های برنامه نویسی
ابتداییترین کامپیوترها نظیر Colossus بدون کمک یک برنامه ذخیره شده برنامهریزی میشدند. برنامهریزی کامپیوترهای اولیه به وسیله ویرایش مدارهای آنها یا تنظیم مجموعه کنترلهای فیزیکی آنها انجام میشد.
کمی بعدتر، امکان نوشتن برنامهها به «زبان ماشین» (Machine Language) فراهم شد. در این روش، برنامه نویس هر دستورالعمل را به صورت عددی مینوشت؛ بنابراین، سختافزار میتواند آن دستورالعمل را بهطور مستقیم اجرا کند. برای مثال، دستورالعمل اضافه کردن مقدارهای دو موقعیت حافظه ممکن است سه عدد را شامل شوند:
- یک «opcode» (کد عملیات) که عملیات جمع (Add) را انتخاب میکند.
- دو عدد بعدی هم به دو موقعیت حافظهای مربوط میشوند که مقادیر مورد نظر در آنها ذخیره شدهاند.
برنامههایی که در قالب دهدهی یا دودویی هستند، از طریق «کارتهای پانچ شده» (Punched Card)، نوارهای کاغذی، نوارهای آهنربایی یا از طریق سوئیچهایی در پنل جلویی وارد کامپیوتر میشدند. بعدها زبانهای ماشین با عنوان «زبانهای برنامه نویسی نسل اول» (First-Generation Programming Languages) یا به اختصار «1GL» نامیده شدند.
گام بعدی، توسعه و خلق زبانهایی بود که آنها را «زبانهای برنامه نویسی نسل دوم» (2GL) یا «زبانهای اسمبلی» (Assembly Languages) نامیدند. این زبانها نیز همچنان به معماری مجموعه دستورالعملهای یک کامپیوتر خاص وابسته بودند. زبانهای اسمبلی (Assembly) باعث شدند که امکان خواندن برنامه توسط انسان تسهیل شود و برنامه نویسان هم از انجام محاسبههای ملالتبار مربوط به آدرسدهی خلاص شدند.
اولین «زبانهای برنامه نویسی سطح بالا» (High Level) یا همان «زبانهای برنامه نویسی نسل سوم» (3GL) در سال دهه ۱۳۳۰ شمسی (۱۹۵۰ میلادی) پدید آمدند. یکی از اولین زبانهای برنامه نویسی سطح بالایی که طراحی شد، «Plankalkül» (پلنکلکولوس) نام دارد که برای کامپیوتر آلمانی Z3 در بازه سالهای ۱۳۲۱ تا ۱۳۲۳ توسعه داده شده است. البته پیادهسازی آن تا سال ۱۳۷۶ (۱۹۹۸) به تعویق افتاد. زبان «Short Code» نوشته توسط «جان ماکلی» (John Mauchly) در سال ۱۳۲۷ ارائه شده است.
- مقاله مرتبط: برنامه نویسی سطح بالا و پایین چیست؟ | به زبان ساده
Short Code یکی از اولین زبانهای برنامه نویسی سطح بالایی به حساب میآید که تا کنون برای یک کامپیوتر الکترونیک توسعه داده شده است. برخلاف کدهای ماشین، امکان نمایش عبارتهای ریاضی به شکلی قابل درک در گزارههای زبان Short Code وجود داشت. اگرچه، در هر بار اجرا، برنامه باید به کدهای ماشین ترجمه میشد که این مسئله باعث میشد روال کار نسبت به اجرای مستقیم کدهای ماشین بسیار کندتر انجام شود.
در اوایل دهه ۱۳۳۰ شمسی (۱۹۵۰ میلادی)، «آلک گلنی» (Alick Glennie) اولین زبان از مجموعه سیستمهای کدنویسی ساده شده «Autocode» را توسعه داد. این Autocode به عنوان یک زبان برنامه نویسی، از یک کامپایلر (ترجمه کننده) برای تبدیل خودکار کدهای نوشته شده با این زبان به کدهای ماشین استفاده میکرد. اولین کدها و اولین کامپایلر در سال ۱۳۳۰ (۱۹۵۲ میلادی) برای کامپیوتر Mark 1 در دانشگاه منچستر توسعه داده شد. Mark 1 اولین زبان برنامه نویسی سطح بالای کامپایلی به حساب میآید.
دومین Autocode هم در سال ۱۳۳۲ شمسی (۱۹۵۴ میلادی) توسط تونی بروکر (Tony Brooker) برای کامپیوتر Mark 1 توسعه داده شد و نام «Mark 1 Autocode» را برای آن انتخاب کردند. علاوه بر این، تونی بروکر Autocode دیگری را هم برای کامپیوتر تجاری Ferranti Mercury در سال ۱۹۵۰ در ارتباط با دانشگاه منچستر توسعه داده است.
نسخه Autocode مربوط به کامپیوتر EDSAC 2 توسط «دیوید هارتلی» (David Hartley) از آزمایشگاه ریاضی دانشگاه کمبریج در سال ۱۳۳۹ (۱۹۶۱) ابداع شد. این نسخه که با نام «EDSAC 2 Autocode» شناخته میشد، توسعهای مستقیم از Mercury Autocode به حساب میآمد که برای شرایط محلی مربوطه تطبیق داده شده بود. این Autocode برای بهینهسازی کدهای شی و امکانات عیبشناسی زبان منبع مورد توجه قرار گرفته بود که در آن زمان بسیار پیشرفته بودند. یک رشته از توسعههای امروزی اما مستقل، «Atlas Autocode» نام دارد که برای ماشین Atlas 1 در دانشگاه منچستر به حساب میآید.
در سال ۱۹۵۴، زبان برنامه نویسی FORTRAN در شرکت IBM توسط «جان باکوس» (John Backus) ابداع شد. زبان FORTRAN اولین زبان سطح بالای پراستفادهي همهمنظورهای به حساب میآید که سیستم اجرایی آن تابع محور است. این زبان برنامه نویسی همچنان به عنوان یک گزینه محبوب برای انجام محاسبات با حجم زیاد محسوب میشود. زبان FORTRAN برای ایجاد برنامههایی مورد استفاده قرار میگیرد که در ارزیابی عملکرد و رتبهبندی سریعترین ابرکامپیوترهای جهان به کار گرفته میشوند.
یکی دیگر از زبانهای برنامه نویسی اولیه، توسط «گرِیس هاپر» در ایالات متحده ابداع شده است که «FLOW-MATIC» نام دارد. این زبان برنامه نویسی در شرکت Remington Rand برای کامپیوتر UNIVAC در بازه سالهای ۱۹۵۵ تا ۱۹۵۹ ساخته شد. هاپر متوجه شد که مشتریان دادههای تجاری با نشانهگذاری ریاضیاتی چندان راحت نبودند و در اوایل سال ۱۹۵۵، او و اعضای تیمش، مشخصاتی را برای یک زبان برنامه نویسی انگلیسی نوشتند و نمونه اولیهای از آن را پیادهسازی کردند.
کامپایلر FLOW-MATIC در اوایل سال ۱۹۵۸ به صورت عمومی در دسترس قرار گرفت و بهطور قابل ملاحظهای در سال ۱۹۵۹ تکمیل شده بود. FLOW-MATIC در طراحی و خلق زبان برنامه نویسی COBOL تاثیر بهسزایی داشته است، چرا که تنها FLOW-MATIC و بازمانده مستقیمش یعنی AIMACO در آن زمان مورد استفاده قرار میگرفتند.
تاریخچه زبان های برنامه نویسی، اصلاحات انجام شده
استفاده روزافزون از زبانهای برنامه نویسی سطح بالا، ضرورت بهکارگیری «زبانهای برنامه نویسی سطح پایین» (Low Level) یا همان «زبانهای برنامه نویسی سیستمی» (System Programming Languages) را به وجود آورد. این نوع زبانها، امکانات تسهیل کنندهای را در سطوح مختلف بین زبانهای اسمبلی و زبانهای سطح بالا فراهم کردهاند. زبانهای سیستمی میتوانند برای اجرای وظایفی استفاده شوند که نیاز به دسترسی مستقیم به سختافزار دارند؛ اما با این حال همچنان ساختارهای کنترلی و امکانات بررسی خطای سطح بالاتری را فراهم میکنند.
در بازه دهههای ۱۹۶۰ تا ۱۹۷۰ توسعه الگوهای زبانهای برنامه نویسی کلیدی انجام شده است که اکنون مورد استفاده هستند. این الگوها یا همان پارادایمهای کلیدی برنامه نویسی در ادامه به همراه زبانی فهرست و معرفی شده که این الگوها برای اولین بار در آنها بهکار گرفته شدهاند:
- در زبان APL، رویکرد «برنامه نویسی آرایهای» (Array Programming) معرفی شد که در خلق الگوی «برنامه نویسی تابعی» (Functional Programming) از آن تاثیر گرفته شده است.
- در زبان ALGOL هم «برنامه نویسی ساختیافته رویهای» (Structured Procedural Programming) و «اصول قاعدهمند زبان برنامه نویسی» (Language Specification) بهبود داده شدند. گزارش اصلاحشده در خصوص زبان الگوریتمی ALGOL 60 بعداً به مدلی برای نحوه نوشتن اصول زبانهای برنامه نویسی تبدیل شد.
- زبان Lisp که در سال ۱۳۳۷ شمسی (۱۹۵۸ میلادی) پیادهسازی شد، اولین زبان برنامه نویسی تابعی دارای قابلیت بررسی نوع به صورت پویا (نوعدهی پویا) محسوب میشود.
- در دهه ۱۳۴۰ (۱۹۶۰ میلادی)، Simula، اولین زبان برنامه نویسی برای پشتیبانی از «برنامه نویسی شیگرا» (Object Oriented Programming) طراحی شد. در اواسط دهه ۱۳۵۰ (۱۹۷۰ میلادی)، زبان Smalltalk به عنوان اولین زبان برنامه نویسی شیگرای خالص معرفی شد.
- زبان C بین سالهای ۱۳۴۸ و ۱۳۵۲ به عنوان یک زبان برنامه نویسی سیستمی برای سیستم عامل یونیکس توسه داده شده است و همچنان زبان محبوبی به حساب میآید.
- زبان برنامه نویسی Prolog که در سال ۱۳۵۱ (۱۹۷۲ میلادی) طراحی شده است، اولین «زبان برنامه نویسی منطقی» (Logic Programming) به شمار میرود.
- در سال ۱۳۵۷ (۱۹۷۸ میلادی)، سازندگان زبان ML، سیستمی با نوع چندریختی بر پایه زبان Lisp ساختند. این ابداع به خلق زبانهای تابعی با قابلیت بررسی نوع (نوعدهی) به صورت ایستا (Statically Typed) منجر شد.
با الهام گرفتن از هر یک از زبانهای برنامه نویسی فهرست شده فوق، زبانهای جدیدی ایجاد شدهاند. اکثر زبانهای برنامه نویسی مدرن و امروزی، حداقل یکی از زبانهای فوق را به عنوان سرمنشاء خود به حساب میآورند.
- مقاله مرتبط: انواع زبان های برنامه نویسی + معرفی، کاربرد، مزایا و معایب
در دهههای ۱۳۴۰ (1960) و ۱۳۵۰ (1970) نیز بحثهای قابل توجهی پیرامون مزایای برنامه نویسی ساختاریافته (Structured Programming) و این مسئله وجود داشته است که آیا زبانهای برنامه نویسی باید برای پشتیبانی از این قابلیت طراحی شوند؟ در این خصوص، «ادسخر دیکسترا» (Edsger Dijkstra) در مقاله مشهوری که در مجله «ارتباطهای ACM» منتشر شده است، این بحث را مطرح کرد که گزارههای Goto باید از زبانهای برنامه نویسی سطح بالاتر حذف شوند.
یکپارچه سازی و رشد زبان های برنامه نویسی
دهه ۱۳۶۰ (۱۹۸۰ میلادی) سالهای تثبیت نسبی زبانهای برنامه نویسی به حساب میآید. در زبان برنامه نویسی C++، شیگرایی و برنامه نویسی سیستمی با یکدیگر تلفیق شدند. دولت ایالات متحده آمریکا زبان Ada را استانداردسازی کرد. Ada یک زبان برنامه نویسی سیستمی به حساب میآید که از پاسکال مشتق شده و با هدف استفاده توسط پیمانکاران امور دفاعی ایجاد شده است.
زبان های برنامه نویسی نسل پنجم
در ژاپن و سایر نقاط جهان، هزینههای هنگفتی صرف زبانهایی شده است که به آنها زبانهای برنامه نویسی نسل پنجم گفته میشود. زبانهای نسل پنجم، ساختارهای برنامه نویسی منطقی را به کار میگیرند. جامعه زبانهای برنامه نویسی تابعی به سمت استانداردسازی ML و Lisp حرکت کردند. به جای اختراع و خلق الگوهای جدید برنامه نویسی، تمام این جابجاییها و حرکتها براساس ایدههای خلق شده در دهههای گذشته شکل گرفتهاند.
طراحی زبان های برنامه نویسی برای کامپیوترهای بزرگ
یک رویکرد مهم در طراحی زبان برای برنامه نویسی برای سیستمهای با مقیاس بزرگ در طول دهه ۱۳۶۰ (۱۹۸۰)، تمرکز افزوده بر استفاده از ماژولهایی با مقیاس بزرگ و در سطح سازمانی بوده است. به وسیله زبانهای Ada ،Modula-2 و ML، سیستمهای ماژولی قابل توجهی در دهه ۱۳۶۰ ساخته شده است که اغلب با ساختارهای برنامه نویسی عام (Generic Programming) مرتبط میشدند.
فراهم شدن بستر مناسب برای خلق زبان های برنامه نویسی جدید
رشد سریع اینترنت در اواسط دهه ۱۳۷۰ (۱۹۸۰ میلای) باعث شد که فرصتهایی برای خلق زبانهای برنامه نویسی جدید به وجود بیایند. زبان برنامه نویسی Perl که در اصل یک ابزار اسکریپتنویسی مبتنی بر یونیکس به حساب میآید و اولین بار در سال ۱۳۶۵ (۱۹۸۷) منتشر شد، در ساخت وبسایتهای پویا بسیار رواج پیدا کرد. جاوا هم در حوزه برنامه نویسی سمت سرور محبوب شد و همچنین ماشینهای مجازی بایتکُد (Bytecode) بار دیگر در کاربردهای تجاری با این تضمین که «یک بار بنویس و همه جا اجرایش کن» رایج شدند.
برای مثال، UCSD Pascal برای مدتی در اوایل دهه ۱۹۸۰ محبوبیت پیدا کرده بود. این ابداعها و دستآوردها اساساً چندان تازه و جدید نبودند. در عوض، آنها اصلاحاتی از بسیاری از زبانها و الگوهای فعلی برنامه نویسی به حساب میآمدند. البته سینتکس این زبانها اغلب براساس خانواده زبانهای برنامه نویسی C ایجاد شده بود.
تحولات زبانهای برنامه نویسی هم در صنعت و هم در تحقیقات علمی ادامه داشتهاند. مسیرهای فعلی این تحولات، مباحث امنیت و تایید قابلیت اطمینان، انواع جدید ماژولی بودن (Mixinها، واگذاریها یا Delegateها، جنبهها یا Aspectها) و یکپارچهسازی پایگاه دادهها مثل زبان برنامه نویسی LINQ شرکت مایکروسافت را شامل میشوند.
پیدایش زبان های برنامه نویسی نسل چهارم
زبانهای برنامه نویسی نسل چهارم (4GL) زبانهای کامپیوتری هستند که هدف آنها فراهم کردن سطح بالاتری از انتزاع نسبت به جزئیات سختافزاری داخلی کامپیوترها در زبانهای نسل سوم است. زبانهای برنامه نویسی نسل پنجم به جای استفاده از الگوریتمهای ساخته شده توسط برنامه نویس، مبتنی بر حل مسئله با استفاده از محدودیتهای داده شده به برنامه هستند. اکنون در ادامه پاسخ به این سوال که زبان برنامه نویسی چیست ، توضیحات لازم پیرامون اجزای زبانهای برنامه نویسی ارائه شدهاند.
اجزای زبان های برنامه نویسی چیست ؟
تمام زبانهای برنامه نویسی تعدادی عنصر اصلی اولیه برای توصیف دادهها، پردازشها و تغییرهای اعمال شده روی آنها دارند. از جمله این پردازشها میتوان به عملیات جمع دو عدد یا انتخاب آیتمی از یک مجموعه اشاره کرد. این عنصرهای اولیه به وسیله قوانین نحوی (Syntactic) و معنایی (Semantic) تعریف میشوند. این قوانین نحوی و معنایی، ساختار و مفهوم زبانهای برنامه نویسی را توصیف میکنند. در ادامه این بخش، برای روشنتر شدن پاسخ این سوال که زبان برنامه نویسی چیست ، به اجزای اصلی زبانهای برنامه نویسی پرداخته شده است.
نحو یا سینتکس در زبان برنامه نویسی چیست ؟
شکل و فُرم ظاهری و سطحی یک زبان برنامه نویسی را «سینتکس» (Syntax) یا «نحو» آن زبان مینامند. اکثر زبانهای برنامه نویسی به طور کامل «متنی» (Textual) هستند. زبانهای برنامه نویسی درست مثل زبانهای طبیعی از توالیهای متنی شامل کلمهها، عددها و علامتهای دستوری تشکیل شدهاند. از طرف دیگر، زبانهای برنامه نویسی دیگری هم وجود دارند که طبیعت آنها بصریتر و گرافیکیتر است. در چنین زبانهایی از رابطههای مجازی میان نمادها برای مشخص کردن اجزای یک برنامه استفاده میشود. یکی از محبوبترین زبانهای برنامه نویسی دیداری، اسکرچ (Scratch) نام دارد.
سینتکس یک زبان برنامه نویسی، مشخص کننده ترکیبهای ممکن نمادهایی است که به تولید یک برنامه با قواعد نحوی صحیح خواهد انجامید.
- مقاله مرتبط: سینتکس چیست؟ — مفهوم Syntax یا نحو در برنامه نویسی به بیان ساده
معنا و مفهوم تعیین شده برای ترکیب نمادها به وسیله «معناشناسی» (Semantics) مشخص میشود (که یا به صورت فُرمی است یا به صورت سخت در یک پیادهسازی مرجع کدگذاری شده است.) با توجه به اینکه اکثر زبانها متنی هستند، در این مقاله نیز بیشتر به زبانهای برنامه نویسی دارای قالبهای متنی پرداخته شده است.
سینتکس زبانهای برنامه نویسی معمولاً به وسیله ترکیبی از «عبارتهای منظم» (Regular Expressions) برای ساختار واژگانی و «فرم باکوس نائور» (Backus–Naur form) برای ساختارهای گرامری (ساختار دستور زبان) تعریف شدهاند. فرم باکوس نائور یکی از روشهای بیان قاعدهها به حساب میآید که برای گرامر مستقل از متن ارائه شده است و اغلب از آن به عنوان دستور زبان رسمی در علوم کامپیوتر استفاده میشود.
مثالی برای ساختار دستور زبان
در ادامه به عنوان مثال یک ساختار گرامری ساده براساس زبان Lisp ارائه شده است:
expression ::= atom | list
atom ::= number | symbol
number ::= [+-]?['0'-'9']+
symbol ::= ['A'-'Z''a'-'z'].*
list ::= '(' expression* ')'
موارد زیر در ساختار گرامری فوق تعیین شدهاند:
- «عبارت» (Expression) یا یک «اتم» (atom) است یا یک «لیست» (List) به حساب میآید.
- یک اتم یا از نوع «عددی» (number) یا به صورت یک «نماد» (symbol) است.
- عدد، دنباله شناخته نشدهای از یک یا بیش از یک رقم دهدهی به حساب میآید که بر اساس نیاز، قبل از علامت بهاضافه یا منها و بعد از آن استفاده میشود.
- «نماد» (Symbol) حرفی است که بعد از آن (با در نظر نگرفتن فضای سفید) هر کاراکتر دیگری نوشته میشود یا ممکن است هیچ کاراکتری هم بعد از آن قرار نگیرد.
- لیست به جفت پرانتزهایی گفته میشود که چند عبارت میتوانند در داخل آن قرار بگیرند. همچنین ممکن است یک لیست تهی هم باشد.
حال در ادامه مثالهایی از توالیهای نمادین در قالب این دستور زبان ارائه شدهاند:
- 12345
- ()
- (a b c232 (1))
تفاوت سینتکس و معناشناسی در زبان برنامه نویسی چیست؟
باید در نظر داشت، تمام برنامههایی که به لحاظ نحوی (سینتکس) صحیح هستند، لزوماً از نظر معنایی هم صحیح نخواهند بود. در واقع، بسیاری از برنامههای با سینتکس درست، براساس قوانین زبانی شکل و فُرم مناسبی ندارند. چنین برنامههایی (بسته به مشخصات زبان و درستی پیادهسازی آنها) به خطایی در ترجمه یا اجرا منجر خواهند شد. در برخی از موارد، چنین برنامههایی ممکن است رفتار تعریف نشدهای را از خود نشان دهند. حتی زمانی که یک برنامه به خوبی با یک زبان خاص نوشته شده باشد، باز هم احتمال دارد معنا و مفهومی را از خود بروز دهد که مقصود برنامه نویس نبوده است.
مثالی برای درک بهتر تفاوت سینتکس و معناشناسی
برای مثال در استفاده از زبانهای طبیعی ممکن است نتوان معنا و مفهومی را به یک جمله صحیح از لحاظ گرامری انتقال داد. همچنین در زبانهای طبیعی ممکن است جمله از لحاظ قواعد نحوی ساختار درستی داشته باشد، اما معنا و مفهوم جمله غلط و اشتباه باشد:
- جمله «ایدههای سبز بیرنگ خشمگین میخوابند» از لحاظ گرامری (نحوی) صحیح است، اما هیچ مفهوم کلی قابل قبولی ندارد.
- جمله «رضا یک مجرد متاهل است» از لحاظ ساختار و قواعد دستوری درست است، اما معنا و مفهومی را منتقل میکند که به هیچ عنوان نمیتواند صحیح باشد.
حال پس از بررسی تفاوت سینتکس و معناشناسی در زبانهای طبیعی، بهتر است در ادامه مثالی از این تمایز در زبانهای برنامه نویسی هم ارائه شود. قطعه کد زیر نوشته شده به زبان C به لحاظ سینتکس صحیح است، اما عملیاتی را اجرا میکند که به لحاظ معنایی تعریف نشده و نامفهوم هستند. در واقع، عملیات *p >> 4
هیچ مفهومی برای مقداری با نوع مختلط (Complex) ندارد و p->im
هم تعریف نشده است، زیرا مقدار p
اشارهگر Null است:
complex *p = NULL;
complex abs_p = sqrt(*p >> 4 + p->im);
اگر تعریف نوع در خط اول حذف شده بود، برنامه در طول عملیات کامپایل (ترجمه به زبان ماشین) خطایی را برای متغیر شناسایی نشده p
صادر میکرد. اگرچه، برنامه همچنان به لحاظ دستوری عملکرد صحیحی دارد، زیرا تعریف نوع تنها اطلاعات معنایی را فراهم میسازد.
قواعد نحوی مورد نیاز در یک زبان برنامه نویسی را میتوان به وسیله موقعیت آن در «سلسله مراتب چامسکی» (Chomsky Hierarchy) طبقهبندی کرد (دانلود رایگان کتاب آموزش نظریه زبان ها و ماشین). سینتکس اکثر زبانهای برنامه نویسی را میتوان با استفاده از گرامر نوع دو (Type-2) تعیین کرد. یعنی این نوع دستور زبانها «مستقل از متن» (Context Free) هستند. برخی از زبانها از جمله Perl و Lisp شامل ساختارهایی هستند که امکان اجرا را در طول «فاز تجزیه» (Parsing Phase) فراهم میکنند.
زبانهایی هم هستند که به برنامه نویس اجازه میدهند تا رفتار «تجزیه کننده» (Parser) را تغییر دهند. در این زبانها، تحلیل سینتکس به یک مسئله اثبات نشدنی تبدیل شده است و بهطور کلی مرز میان تجزیه و اجرا بسیار گنگ و غیر قابل تشخیص است. برخلاف سیستم مبتنی بر ماکرو در زبان Lisp و بلوکهای BEGIN
در زبان Perl که ممکن است محاسبات عمومی و کلی را شامل شوند، ماکروهای C صرفاً جایگزینهایی برای رشتهها هستند و نیازی به اجرای کدها در آن وجود ندارد.
Semantics یا معنا شناسی در زبان برنامه نویسی چیست ؟
مفهوم معناشناسی برخلاف قالب و ظاهر زبان برنامه نویسی یا همان سینتکس آن، به معنای زبانها مربوط میشود. اصطلاح «معناشناسی» (Semantics) محدودیتهای ساختار متنهای معتبری را تعیین میکند که ابراز و بیان آنها در صورتبندیهای نحوی بسیار دشوار یا ناممکن است. معناشناسی در زبان برنامه نویسی دارای دو نوع است که در ادامه به شرح هر یک پرداخته میشود.
معناشناسی ایستا چیست؟
برای زبانهای برنامه نویسی کامپایلری، «معناشناسی ایستا» (Static Semantics) اساساً شامل آن دسته از قوانین معنایی میشود که امکان بررسی آنها در طول زمان کامپایل وجود دارد. مثالهای مربوط به این مورد به شرح زیرند:
- بررسی این مسئله که هر شناساگر پیش از استفاده اعلان میشود (در زبانهایی که نیاز به اعلانها دارند.
- برچسبهای یک گزارهی Case قابل تشخیص و متمایز هستند.
بسیاری از محدودیتهای مهم از این دست، مثل بررسی اینکه شناساگرها در بستر مناسبی مورد استفاده قرار میگیرند یا خیر (مثلاً اضافه نکردن یک عدد صحیح به نام تابع) یا اینکه فراخوانیهای زیرروالها دارای تعداد و نوع آرگومان مناسب باشند، میتوانند به وسیله تعریف منطقی با نام «سیستم نوع» (Type System) اعمال شوند.
سایر انواع تجزیه-تحلیل ایستا نظیر تجزیه-تحلیل جریان دادهها نیز ممکن است بخشی از معناشناسی ایستا باشند. زبانهای برنامه نویسی جدیدتری مثل جاوا و C# (سیشارپ) دارای تجزیه-تحلیل تخصیص قطعی (Definite Assignment Analysis) یعنی نوعی از تجزیه-تحلیل جریان دادهها به عنوان بخشی از معناشناسی ایستای خود هستند.
معناشناسی پویا چیست؟
پس از آنکه دادهها مشخص شدند، لازم است به ماشین فرمان داده شود تا عملیات لازم را روی دادهها اجرا کند. برای مثال، معناشناسی ممکن است خط مشئی را تعریف کند که به وسیله آن مقادیر عبارتها مورد ارزیابی قرار بگیرند یا رفتاری مشخص شود که در آن ساختارهای کنترلی بر اساس شرطها گزارههایی را اجرا کنند. در «معناشناسی پویا» (Dynamic Semantics) در یک زبان برنامه نویسی که از آن با عنوان «معناشناسی اجرایی» (Execution Semantics) هم یاد میشود، این مسئله تعریف میشود که چگونه و در چه زمانی ساختارهای مختلف یک زبان برنامه نویسی باید رفتار برنامه را تولید کنند.
روشهای بسیاری برای تعریف معناشناسی اجرایی وجود دارند. اغلب برای تعیین معناشناسی اجرایی زبانهای برنامه نویسی که در عمل به طور رایج مورد استفاده قرار میگیرند از زبانهای طبیعی استفاده میشود. تحقیقات علمی قابلتوجهی در خصوص معناشناسی فُرمی زبانهای برنامه نویسی انجام شده است؛ این تحقیقات امکان تعیین معناشناسی اجرایی را در حالت فُرمگونه فراهم کردهاند. نتایج به دست آمده از این زمینه تحقیقاتی، کاربردهای محدودی را در طراحی زبان برنامه نویسی و پیادهسازی خارج از محیط دانشگاهی به خود دیده است.
سیستم تعیین نوع در زبان برنامه نویسی چیست؟
سیستم تعیین نوع (Type System) به چگونگی طبقهبندی مقادیر و عبارتها در قالب نوعهای داده، نحوه تغییر و کار با این نوعها و چگونگی تعامل آنها با یکدیگر مربوط میشود. هدف یک سیستم تعیین نوع، تایید و معمولاً تعیین میزانی از صحت و درستی در برنامههای نوشته شده به وسیله یک زبان برنامه نویسی از طریق شناسایی برخی از عملیات ناصحیح است. هر گونهای از سیستم تعیین نوع تصمیمپذیر (Decidable) شامل میزانی از مصالحه میشود. در حالی که این سیستم بسیاری از برنامههای ناصحیح را نمیپذیرد، اما همچنان میتواند صحت برخی از برنامههای درست اما غیرمعمول را هم نقض کند.
برای عبور از این نقطه ضعف، برخی از زبانهای برنامه نویسی دارای نارساییهایی (Loophole) در خصوص تعیین نوع هستند، یعنی معمولاً تبدیلهای بررسی نشدهای وجود دارند که ممکن است توسط برنامه نویس استفاده شوند تا بهطور مشخص اجرای عملیاتی را بین نوعهای متفاوت مُجاز کنند که در حالت معمولی اجرای آنها غیرمجاز است. در اکثر زبانهای با قابلیت تعیین نوع، سیستم تعیین نوع تنها برای بررسی نوع در برنامهها استفاده میشود، اما در تعدادی از زبانهای برنامه نویسی که معمولاً زبانهای تابعی هستند، «استنباط نوع» (Type Inference) انجام میشود تا دیگر نیاز نباشد که برنامه نویس حاشیهنویسی برای نوع انجام دهد. طراحی رسمی و مطالعه سیستمهای تعیین نوع را «نظریه نوع» (Type Theory) مینامند.
مقایسه زبان های برنامه نویسی دارای نوع و زبان های بدون نوع
یک زبان برنامه نویسی، «دارای نوع» (Typed) نامید میشود، اگر نوع دادههای سازگار با عملیات مربوطه در اصول مربوط به عملیات در آن زبان تعریف شده باشند. برای مثال، “this text between the quotes”
یک رشته (String) است و در بسیاری از زبانهای برنامه نویسی، عملیات تقسیم کردن یک داده از نوع رشتهای هیچ معنایی ندارد و اجرا نخواهد شد. عملیات ناصحیح و اشتباه میتوانند در زمان کامپایل شدن برنامه شناسایی شوند و با یک پیام خطای کامپایل (ترجمه به زبان ماشین) به وسیله کامپایلر نقض شوند. به این روش، «بررسی نوع ایستا» (Static Type Checking) گفته میشود.
در روشی دیگر، خطای نوع در زمان اجرای برنامه شناسایی میشود و در پی آن یک استثناء زمان اجرا (Run-Time) رخ میدهد. به این روش، «بررسی نوع پویا» (Dynamic Type Checking) میگویند. بسیاری از زبانهای برنامه نویسی از یک تابع به نام «کنترل کننده استثناء» (Exception Handler) استفاده میکنند تا این استثناء را مدیریت کنند و برای مثال همیشه «-۱» را به عنوان نتیجه بازمیگردانند.
یک نوع خاص از زبانهای دارای نوع، زبانهای «تک نوعی» (Single-Typed) هستند. این زبانها اغلب زبانهای اسکریپتنویسی یا نشانهگذاری (Markup) مثل REXX یا SGML هستند و تنها یک نوع داده دارند. این نوع داده هم در این زبانها معمولاً از نوع رشته کاراکتری است که هم برای دادههای نمادین و هم برای دادههای عددی استفاده میشوند.
از طرف دیگر، یک «زبان بدون نوع» (Untyped Language) مثل اکثر زبانهای اسمبلی، اجازه اجرای هر نوع عملیاتی را روی دادهها میدهند که این دادهها اکثراً دنبالههایی از بیتهایی با طولهای مختلف هستند. از جمله زبانهای بدون نوع سطح بالا میتوان به Tcl ،BCPL و برخی از گونههای زبان Forth اشاره کرد.
عملاً در حالیکه زبانهای اندکی براساس نظریه نوع (تایید یا نقض همه عملیات) به عنوان زبان دارای نوع در نظر گرفته میشوند، اکثر زبانهای برنامه نویسی جدید و مُدرن، میزانی از بررسی نوع را انجام میدهند. بسیاری از زبانهای برنامه نویسی مورد استفاده در تولید نرم افزارهای تجاری، ابزارها و روشهایی را برای عبور کردن از سد سیستم بررسی نوع یا تضعیف آن ارائه کردهاند و در این راه، در ازای فراهم کردن امکان مدیریت بیشتر روی اجرای برنامه، امنیت نوع (Type Safety) را تقلیل دادهاند. در این خصوص مفهوم «Casting» (تبدیل نوع موقت) مطرح میشود که از موضوع بحث این مقاله خارج است.
مقایسه بررسی نوع ایستا با بررسی نوع پویا
در بررسی نوع ایستا (Static typing)، نوع تمام عبارتهای برنامه پیش از زمان اجرای آن و معمولاً در زمان کامپایل تعیین میشوند. برای مثال، 1
و 2+2
عبارتها یا گزارههایی از نوع عدد صحیح (Integer) هستند. این گزارهها را نمیتوان به تابعی ارجاع داد که انتظار دریافت دادهای از نوع رشتهای را دارد. همچنین امکان ذخیرهسازی این دادهها در متغیری وجود ندارد که برای نگهداری تاریخ تعریف شده است.
زبانهایی با بررسی نوع ایستا میتوانند «بررسی نوع آشکار» (Manifest Typing) داشته باشند یا اینکه بررسی نوع در آنها به صورت «استنباط نوع» (Type Inference) باشد. در حالت اول، برنامه نویس باید بهطور واضح و مشخص نوع داده را به صورت برخی از موقعیتهای متنی بنویسد (مثلاً نوع داده در هنگام تعریف متغیر مشخص میشود). در حالت دوم، کامپایلر نوع داده گزارهها را براساس محتوای آن استنباط میکند. اکثر زبانهای مطرح و جریان اصلی با بررسی نوع ایستا، مثل C# ،C++ و جاوا بررسی نوع را به صورت استنباطی انجام میدهند.
استنباط کامل نوع از گذشته در زبانهای برنامه نویسی کمتر شناخته شدهای مثل Haskell و ML به گرفته میشد. اگرچه، بسیاری از زبانهای برنامه نویسی با بررسی نوع آشکار از استنباط نوع ناقص یا نسبی پشتیبانی میکنند. برای مثال، C++، جاوا و C# همگی در برخی از موارد محدود و خاص از استنباط نوع پشتیبانی میکنند. علاوه بر این، برخی از زبانهای برنامه نویسی این امکان را میدهند تا برخی از انواع داده به صورت خودکار به انواع داده دیگر تبدیل شوند. برای مثال، میتوان زمانی که برنامه انتظار دادهای از نوع اعشاری شناور (Float) را دارد، به جای آن از دادهای با نوع int (صحیح) استفاده کرد.
در بررسی نوع پویا (Dynamic Typing) که به آن «Latent Typing» یعنی «بررسی نوع پنهانی» هم میگویند، ایمنی نوع عملیات در زمان اجرا بررسی میشود. به بیان دیگر، نوع دادهها به جای اینکه با گزارههای متنی مرتبط باشند، با مقادیر زمان اجرا مرتبط هستند. برخلاف زبانهای با نوعدهی آشکار، زبانهایی که بررسی نوع را به صورت پویا انجام میدهند، برنامه نویس را ملزم به نوشتن نمادهای نوعدهی مشخص در گزارهها نمیکنند.
علاوه بر قابلیتهای دیگر، بررسی نوع پویا این امکان را فراهم میکند تا یک متغیر واحد بتواند در مراحل مختلف اجرای برنامه به مقادیری با نوع دادههای گوناگون اشاره کند. اگرچه در این شیوه خطای نوعدهی تا زمانی که یک قطعه کد اجرا نشود، بهطور خودکار قابل شناسایی نیست که این مسئله باعث میشود فرآیند «عیبیابی» (دیباگ کردن) بهطور بالقوه دشوارتر شود. زبانهای Smalltalk ،Lisp، پرل، پایتون، جاوا اسکریپت و روبی همگی نمونههایی از زبانهای برنامه نویسی با نوعدهی پویا هستند.
نوع دهی ضعیف و نوع دهی قوی در زبان برنامه نویسی چیست ؟
«نوعدهی یا تعیین نوع ضعیف» (Weak typing) به این صورت است که میتوان با مقداری از یک نوع به عنوان نوع دیگر رفتار کرد. برای مثال، در نوعدهی ضعیف میتوان با یک نوع رشتهای به عنوان یک عدد برخورد کرد. این قابلیت میتواند در برخی مواقع بسیار کاربردی و مفید باشد. البته این شیوه ممکن است باعث شود در زمان کامپایل یا حتی در Runtime برخی از انواع خطاها در برنامه شناسایی نشوند.
در روش «نوعدهی قوی» (Strong Typing) امکان جلوگیری از بروز اینگونه خطاها وجود دارد. تلاش برای انجام عملیات روی نوع ناصحیحی از یک مقدار در نوعدهی قوی منجر به صدور خطا میشود. از زبانهای برنامه نویسی با نوعدهی قوی اغلب با عنوان «نوع ایمن» (Type Safe) یا «ایمن» یاد میشود.
تعریفی دیگر برای زبانهای با نوعدهی ضعیف به زبانهایی مثل Perl و جاوا اسکریپت اطلاق میشود که اجازه میدهند تعداد زیادی تبدیل نوع انجام شود. برای مثال در جاوا اسکریپت، عبارت 2 * x
بهطور ضمنی و تلویحی x را به نوع عددی تبدیل میکند و این تبدیل نوع حتی اگر x
از نوع null
، undefined
، آرایه یا رشتهای از حروف باشد هم با موفقیت انجام خواهد شد. چنین تبدیل نوعهای تلویحی اغلب مفید هستند، اما ممکن است خطاهای برنامه نویسی را بپوشانند.
بهطور کلی، نوعدهی قوی و ایستا مفاهیمی متعامد به حساب میآیند اما کاربرد آنها در ادبیات متفاوت است. برخی افراد اصطلاح نوعدهی قوی را برای اشاره به «نوعدهی ایستای قوی» (Strongly, Statically Typed) بهکار میبرند یا حتی بهگونهای گیجکنندهتر، منظور آنها تنها نوعدهی ایستا است. مثلاً از زبان C هم به عنوان زبانی با نوعدهی قوی یاد میکنند و هم آن را زبانی با نوعدهی ایستای ضعیف به حساب میآورند.
ممکن است برای برخی از برنامه نویسان حرفهای عجیب بهنظر برسد که زبان C میتواند به عنوان زبانی با نوعدهی ایستای ضعیف در نظر گرفته شود. اگرچه باید مد نظر داشت که استفاده از اشارهگر عمومی یعنی اشارهگر void* امکان Casting (تبدیل نوع موقت) اشارهگرها را به سایر اشارهگرها بدون نیاز به تبدیل نوع ضمنی (Explicit Cast) فراهم میکند. این قابلیت به میزان زیادی مشابه تبدیل نوع موقت آرایهای از بایتها به هر نوعی از انواع داده در زبان C بدون استفاده از تبدیل نوع ضمنی مثل (int)
یا (char)
است.
کتابخانه استاندارد و سیستم زمان اجرا در زبان برنامه نویسی چیست ؟
اکثر زبانهای برنامه نویسی دارای یک کتابخانه هستهای متصل هستند که اغلب به آن کتابخانه استاندارد گفته میشود. خصوصاً در صورتی که این کتابخانه به عنوان بخشی از استاندارد زبان منتشر شده گنجانده شده باشد. این کتابخانه هستهای بهطور معمول به وسیله تمام پیادهسازیهای زبان مربوطه در دسترس قرار داده میشوند. کتابخانههای هستهای معمولاً شامل تعاریفی برای الگوریتمهای رایج مورد استفاده، ساختارهای داده و ساز و کارهایی برای ورودی و خروجی میشوند.
مرز بین یک زبان و کتابخانه هستهای آن در زبانهای برنامه نویسی مختلف متفاوت است. در برخی موارد، طراحان زبان ممکن است با کتابخانه هستهای به عنوان یک موجودیت مجزا و جدا از آن زبان رفتار کنند. اگرچه، کتابخانه هستهای یک زبان اغلب توسط کاربران آن زبان به عنوان بخشی از آن در نظر گرفته میشود و حتی ممکن است برای برخی از مشخصههای این زبان نیاز باشد که کتابخانه استاندارد در تمام پیادهسازیها در دسترس باشد. در واقع، برخی از زبانها بهگونهای طراحی شدهاند که حتی معنا و مفهوم برخی از ساختارهای نحوی خاص در آنها را نمیتوان بدون اشاره به کتابخانه هستهای آن زبان توصیف کرد.
برای مثال، در جاوا یک رشته لیترال به عنوان نمونهای از کلاس java.lang.String
تعریف میشود. بهطور مشابه، در Smalltalk، یک گزاره تابع بینام (Anonymous) یا یک «بلاک» (block) نمونهای از کلاس BlockContext
آن کتابخانه را میسازد. از سوی دیگر، «اسکیم» (Scheme) حاوی چندین زیرمجموعه یکپارچه و پیوسته که برای ساخت بخشهای باقیمانده زبان مربوطه به عنوان ماکروهای کتابخانه کفایت میکند و به این ترتیب، طراحان زبان حتی به این زحمت نخواهند افتاد که بگویند کدام بخشهای زبان باید به عنوان ساختارهای زبانی پیادهسازی شوند و کدام بخشها باید به عنوان اجزایی از یک کتابخانه پیادهسازی شوند.
طراحی و پیاده سازی زبان های برنامه نویسی چگونه است؟
زبانهای برنامه نویسی خصوصیتهای مشترکی با زبانهای طبیعی دارند که این وجه اشتراک به هدف و مقصود آنها به عنوان وسایل ارتباطی مربوط میشود. هم زبانهای طبیعی و هم زبانهای برنامه نویسی دارای قالبی نحوی هستند که جدا از معناشناسی آنها است که این مسئله نشان دهنده خانوادههای زبانی تشکیل شده از زبانهای مرتبط با یکدیگر است که یکی از دیگری منشعب میشود.
اما زبانهای برنامه نویسی به عنوان ساختارهای مصنوعی، به شکلی اساسی و بنیادی نسبت به زبانهایی متفاوت هستند که از طریق استفاده و کاربردشان تکامل یافتهاند. تفاوت مهم در اینجا است که یک زبان برنامه نویسی میتواند بهطور کامل توصیف و مطالعه شود. چرا که این زبان دارای تعریفی دقیق و پایانپذیر است. بر خلاف آن، زبانهای طبیعی دارای معانی متغیر هستند که توسط کاربران آنها در اجتماعات مختلف تبیین میشوند. در حالی که زبانهای ساختيافته زبانهای مصنوعی هم به حساب میآیند که از پایه با هدف و مقصودی مشخص طراحی شدهاند. آنها برخلاف زبانهای برنامه نویسی ، کاستیهایی در خصوص تعریف کامل و دقیقشان دارند.
بسیاری از زبانهای برنامه نویسی از صفر طراحی شدهاند، تغییراتی برای سازگاری با نیازهای جدید در آنها اعمال شده است و با سایر زبانها تلفیق شدهاند. بسیاری از آنها در نهایت به ورطه بلا استفادگی کشیده شدهاند. اگرچه تلاشهایی برای طراحی یک زبان برنامه نویسی جهانشمول برای تمام مقاصد صورت گرفته است، اما تمام این تلاشها برای پذیرش زبانی در این جایگاه با شکست مواجه شدهاند.
علت نیاز به چندین زبان برنامه نویسی چیست ؟
نیاز به زبانهای برنامه نویسی متنوع به دلیل وجود زمینههای مختلف و متفاوت ایجاد شده است:
- برنامه نویسان در مورد میزان تخصص با یکدیگر تفاوت دارند. برنامه نویسان تازهکار بیش از هر چیز نیازمند ساز و کاری ساده و آسان هستند و برنامه نویسان حرفهای هم معمولاً با بسیاری از پیچیدگیهای قابل توجه مشکلی ندارند.
- برنامهها باید تعادل لازم را میان سرعت، اندازه و سادگی در سیستمهایی برقرار کنند که گستره آنها از میکروکنترلرها شروع میشود و تا ابَرکامپیوترها ادامه پیدا میکند.
- برنامهها ممکن است یک بار نوشته شوند و برای مدتهای مدید تغییر نکنند یا ممکن است برنامههایی هم وجود داشته باشند که دائماً نیاز به اعمال تغییرات مختلف در آنها وجود داشته باشد.
- معمولاً سلیقه برنامه نویسان متفاوت است: هر برنامه نویس به حل مسئلهها بهگونهای خاص و ابراز آنها با زبانهای بهخصوص عادت دارند.
اهمیت انتزاع در زبان برنامه نویسی چیست ؟
یک روند رایج در توسعه زبانهای برنامه نویسی این موضوع بوده است که سطح بالاتری از انتزاع (Abstraction) برای افزایش توانایی حل مسائل بهکار گرفته شود. زبانهای برنامه نویسی اولیه، وابستگی زیادی به سختافزار کامپیوتری داشتند که روی آن اجرا میشدند. با توسعه و ساخت زبانهای برنامه نویسی جدید، قابلیتهایی اضافه شدهاند که به برنامه نویسان اجازه میدهند تا بتوانند ایدههایی را ابراز کنند.
این ایدهها اغلب از ترجمه صرف به دستورالعملهای ساختافزاری فاصله دارند. بنابراین با توجه به اینکه برنامه نویسان درگیری کمتری با پیچیدگیهای سختافزار کامپیوتر دارند، برنامههای ساخته شده توسط آنها میتوانند محاسبات بیشتری را با تلاش کمتری از جانب برنامه نویسان انجام دهند. این مسئله به برنامه نویسان اجازه میدهد تا کارایی بیشتری را در هر واحد زمانی داشته باشند.
زبان برنامه نویسی طبیعی چیست ؟
«برنامه نویسی به زبان طبیعی» (Natural Language programming) راهی برای حذف نیاز به زبان تخصصی برای برنامه نویسی به حساب میآید. اگرچه، این هدف هنوز چندان دستیافتنی نیست و البته در خصوص مزایای آن هم جای بحث وجود دارد. ادسخر دیکسترا بر این عقیده بود که استفاده از یک زبان رسمی برای جلوگیری از معرفی ساختارهای بیمعنی بسیار ضرورت دارد و ایده برنامه نویسی به زبان طبیعی را احمقانه میداند. در خصوص برنامه نویسی به زبانهای طبیعی، تاکنون رویکردهایی ترکیبی در زبانهای Structured English و SQL پیادهسازی شده است.
طراحان و کاربران یک زبان باید مصنوعاتی بسازند که رویه برنامه نویسی را ممکن میسازند و باعث میشوند که بتوان فرآیند برنامه نویسی را مدیریت کرد. مهمترین جزء این مصنوعات، «مشخصههای آن زبان» (Language Specification) و «پیادهسازی» آن به حساب میآیند. در ادامه به شرح هر یک از این دو مورد پرداخته شده است.
مشخصه ها یا اصول زبان های برنامه نویسی چیست ؟
مشخصهها یا اصول یک زبان برنامه نویسی، دستسازههایی هستند که کاربران آن زبان و طراحان آن در مورد آنها به توافق رسیدهاند تا مشخص شود که آیا یک قطعه کد منبع برنامهای معتبر در آن زبان است و در این صورت، رفتار آن چگونه خواهد بود؟ مشخصههای یک زبان برنامه نویسی میتوانند شکلهای مختلفی داشته باشند که در ادامه فهرست شدهاند:
- تعریفی ضمنی از سینتکس آن زبان، معناشناسی ایستا و معناشناسی اجرایی آن زبان از جمله اشکال مشخصههای یک زبان برنامه نویسی هستند. در حالی که سینتکس معمولاً با استفاده از قواعد دستوری رسمی مشخص میشود، تعاریف معنایی ممکن است به زبان طبیعی نوشته شوند (برای مثال میتوان به زبان C اشاره کرد) یا آنها را به صورت معناشناسی رسمی بنویسند (مثلاً در Standard ML و Scheme این کار انجام شده است).
- توصیف رفتار یک کامپایلر برای آن زبان نیز یکی دیگر از انواع مشخصههای زبان برنامه نویسی محسوب میشود. برای مثال میتوان مشخصههای زبانهای C++ و Fortran را نام برد. سینتکس و معناشناسی آن زبان باید از این توصیفها استنباط شود که ممکن است به زبان طبیعی یا به زبان رسمی نوشته شده باشند.
- ارجاع یا پیادهسازی یک مدل که گاهی به زبانی نوشته میشود که مشخصههای آن تعیین میشوند نیز از جمله موارد مشخصههای زبانهای برنامه نویسی به حساب میآید. برای مثال، در این خصوص میتوان Prolog یا ANSI REXX را نام برد. سینتکس و معناشناسی یک زبان در رفتار پیادهسازی مرجع آن صریح و روشن است.
پیاده سازی زبان های برنامه نویسی به چه معناست؟
یک پیادهسازی از یک زبان برنامه نویسی (Implementation of a Programming Language) روشی را برای نوشتن برنامهها به آن زبان فراهم میکند و آنها را روی یک یا بیش از یک پیکربندی سختافزاری و نرمافزاری اجرا میکند. بهطور گسترده دو رویکرد برای پیادهسازی زبانهای برنامه نویسی وجود دارند:
- کامپایل کردن (Compilation)
- تفسیر کردن (Interpretation)
بهطور کلی امکان پیادهسازی یک زبان با هر یک از دو روش فوق امکانپذیر است. خروجی یک کامپایلر میتواند به وسیله سختافزار با برنامهای به نام مفسر (Interpreter) اجرا شود. در برخی از پیادهسازیهایی که از رویکرد مفسری استفاده میکنند، هیچ مرز مشخصی میان کامپایل و تفسیر وجود ندارد. برای مثال، در برخی از پیادهسازیهای زبان Basic، ابتدا عملیات کامپایل انجام میشود و سپس کدهای منبع به صورت خط به خط اجرا میشوند.
- مقاله مرتبط: کامپایلر چیست و چکار می کند؟ — برنامه نویسی به زبان ساده
برنامههایی که بهطور مستقیم روی سختافزار اجرا میشوند، معمولاً سرعت اجرای بسیار بیشتری نسبت به زبانهای تفسیر شده دارند. یک روش برای بهبود اجرای برنامههای تفسیری، استفاده از شیوه «کامپایل درجا» (Just-in-Time Compilation) است. در این روش، ماشین مجازی بلافاصله پیش از اجرا، بلوکهای بایتکدی را ترجمه میکند که قرار است در کدهای ماشین برای اجرای مستقیم روی سختافزار ترجمه شوند. حال در ادامه مقاله زبان برنامه نویسی چیست به شرح چیستی زبان اختصاصی پرداخته شده است.
زبان برنامه نویسی اختصاصی چیست؟
اگرچه اکثر زبانهای برنامه نویسی رایج و پر استفاده، دارای مشخصهها و پیادهسازیهایی کاملاً آزاد هستند، بسیاری از زبانهای برنامه نویسی هم وجود دارند که «اختصاصی» به حساب میآیند. این زبانهای اختصاصی (Proprietary Languages) تنها از سوی یک سازنده و تولید کننده ارائه میشوند. سازندگان این زبانها مالکیت معنوی زبانهای اختصاصی مربوطه را متعلق به خود میدانند. زبانهای برنامه نویسی اختصاصی معمولاً «زبانهای با دامنه خاص» (Domain Specific Languages) هستند یا اینکه به عنوان زبانهای اسکریپتنویسی تعبیه شده برای یک محصول خاص مورد استفاده قرار میگیرند. برخی از زبانهای اختصاصی تنها به صورت داخلی در یک سازمان تجاری بهکار گرفته میشوند. این در حالی است که زبانهای اختصاصی دیگری هم وجود دارند که برای کاربران خارج از آن دایره در دسترس قرار دارند.
جایگاه برخی از زبانهای برنامه نویسی هم در جایی بین زبانهای اختصاصی و زبانهای آزاد قرار میگیرد. برای مثال، شرکت اوراکل مالکیت معنوی برخی از بخشهای زبان برنامه نویسی جاوا را متعلق به خود میداند. یا مثلاً زبان برنامه نویسی C# که توسط مایکروسافت ساخته شده است دارای پیادهسازیهای آزاد بسیاری در اکثر بخشهای سیستم خود است. با این حال این زبان نیز بخشی به نام «زمان اجرای زبان مشترک» (Common Language Runtime) یا به اختصار CLR دارد که محیطی بسته و اختصاصی به حساب میآید.
کاربرد زبان برنامه نویسی چیست ؟
تاکنون هزاران زبان برنامه نویسی عمدتاً در حوزه محاسبات ساخته شدهاند. معمولاً برای پروژههای نرم افزاری شخصی از ۵ یا بیش از ۵ زبان برنامه نویسی استفاده میشود. زبانهای برنامه نویسی نسبت به بسیاری از سایر اشکال بیان انسانی متفاوت هستند، چرا که آنها نیاز به درجهای از دقت و کامل بودن دارند. در زمان استفاده از یک زبان طبیعی برای برقراری ارتباط با سایر افراد، نویسندگان و متکلمان انسانی ممکن است بیانی دوپهلو و مبهم داشته باشند و خطاهای اندکی هم از آنها سر بزند و همچنان انتظار داشته باشند که قصد و قرض انها توسط دیگران قابل درک باشد.
اما، به قول معروف کامپیوترها دقیقاً کاری را انجام میدهند که از آنها خواسته شده است و نمیتوانند بفهمند که مثلاً در صورت وجود خطا، برنامه نویس قصد نوشتن چه کدهای را داشته است. ترکیب تعریف زبان برنامه نویسی، یک برنامه و ورودیهای آن برنامه باید بهطور کامل رفتار بیرونی را تعیین کنند که قرار است در زمان اجرای برنامه اتفاق بیوفتند.
یک زبان برنامه نویسی ساز و کاری ساختار یافته را برای تعریف بخشهایی از دادهها، عملیات و تبدیلهایی فراهم میکند که باید به صورت خودکار روی آن دادهها اجرا شوند. برنامه نویس برای نمایش مفهومهای مربوط به محاسبات مورد نظر از انتزاعی استفاده می کند که در زبان برنامه نویسی وجود دارد. این مفهومها به عنوان مجموعهای از عنصرهای در دسترس (که پایه و مبنای آن زبان به حساب میآیند و به آنها Primitiveمیگویند) بازنمایی میشوند. برنامه نویسی فرآیندی است که در آن برنامه نویسان این اجزای پایه را با هم ترکیب میکنند تا برنامههایی جدید بسازند یا تغییرات لازم را در برنامههای فعلی برای سازگاری با نیازهای جدید یا محیطهای در حال تحول به وجود بیاورند.
برنامههای ساخته شده برای یک کامپیتور ممکن است در قالب پردازش دستهای (Batch Process) و بدون تعامل انسانی اجرا شوند. یا ممکن است کاربری دستورات را در یک نشست تعاملی در یک مفسر وارد کند. در چنین حالتی، «دستورات» (Commands) خیلی ساده به برنامههایی گفته میشود که اجرای آنها به یکدیگر زنجیر شده است. وقتی که یک زبان برنامه نویسی قابلیت اجرای دستورات را از طریق مفسر (مثل یک شل یونیکس یا دیگر واسطهای خط فرمان) و بدون کامپایل کردن داشته باشد، به زبان، «زبان برنامه نویسی اسکریپتی» (Scripting Programming Language) میگویند.
اندازه گیری میزان استفاده از زبان های برنامه نویسی مختلف
مشخص کردن این مسئله بسیار دشوار است که کدام زبان برنامه نویسی از همه بیشتر استفاده میشود. چرا که، مفهوم میزان استفاده در بسترها و چارچوبهای مختلف تفاوت دارد. یک زبان ممکن است زمان بیشتری از وقت یک برنامه نویس را اشغال کند، تعداد خط کدهای یک زبان ممکن است بیشتر باشند یا یک زبان برنامه نویسی دیگر هم ممکن است زمان بیشتری از CPU را اشغال و مصرف کند. برخی از زبانهای برنامه نویسی دیگر هم در برخی از کاربردهای خاص بسیار محبوب و رایج هستند.
برای مثال، زبان COBOL همچنان در مراکز داده سازمانهای تجاری و اغلب در کامپیوترهای بزرگ (Mainframe) مورد استفاده قرار میگیرد، زبان Fortran در کاربردهای علمی و مهندسی بهکار گرفته میشود؛ زبان Ada در هوافضا، حمل و نقل، موارد نظامی و کاربردهای زمان واقعی و تعبیه شده استفاده میشود؛ زبان C هم در کاربردهای تعبیه شده و سیستم عاملها بهکار ميرود. سایر زبانها هم اغلب برای توسعه و ساخت بسیاری از کاربردها و موارد استفاده دیگر مورد استفاده قرار میگیرند.
روشهای گوناگونی در خصوص اندازهگیری میزان محبوبیت زبانهای برنامه نویسی وجود دارند که هر کدام منوط به پیشقدری است که اندازهگیری میشود:
- شمارش تعداد آگهیهای شغلی که یک زبان برنامه نویسی را به عنوان مهارت مورد نیاز اعلام میکنند.
- تعداد کتابهایی که یک زبان برنامه نویسی را آموزش میدهند یا آن را معرفی و توصیف میکنند.
- تخمین تعداد خط کدهای نوشته شده به یک زبان هم روش دیگری برای تعیین میزان محبوبیت زبانهای مختلف به حساب میآید. البته معمولاً در این روش، زبانهایی که چندان در جستجوهای عمومی ظاهر نمیشوند دست کم گرفته خواهند شد.
- شمارش تعداد ارجاعها یک زبان برنامه نویسی (یعنی شمارش میزان اشاره به نام آن زبان) در یک موتور جستجوی وب
با ترکیب و جمعآوری اطلاعات از وبسایتهای مختلف، سایت stackify.com ده تا از محبوبترین زبانهای برنامه نویسی را به ترتیب نزولی زیر معرفی کرده است:
- جاوا
- زبان C
- C++
- پایتون
- C#
- جاوا اسکریپت
- VB.NET
- زبان برنامه نویسی R
- PHP
- متلب
همچنین ده تا از زبانهای برنامه نویسی آینده که توسط وبسایت Stackify معرفی شدهاند نیز در ادامه به ترتیب معرفی شدهاند:
- پایتون
- زبان برنامه نویسی R
- سوئیفت
- Go
- اسکالا
- C#
- کاتلین
- جاوا ۸
- متلب
- Solidity
در ادامه مقاله زبان برنامه نویسی چیست به شرح مفهوم دیالکت یک زبان پرداخته شده است.
نسخه های خاص یک زبان برنامه نویسی چیست ؟
یک «نسخه» (Dialect) از یک زبان برنامه نویسی به گونه یا نسخهای بسطیافته (نسبتاً کوچکی) از آن زبان گفته میشود که طبیعت ذاتی آن تغییری نکرده است. مثلاً در خصوص زبانهایی مثل اسکیم و Forth، استانداردهای ارائه شده توسط سازندگان آنها ناکافی و غیرمستدل بودند؛ بنابراین، در این زبانها مشتقاتی از استاندارد اولیه بهوجود آمده است و در واقع نسخهها یا دیالکتهای جدید ایجاد شدهاند. در سایر موارد، یک دیالکت یا نسخه برای استفاده در یک زبان برنامه نویسی با دامنه خاص ایجاد میشود که اغلب زیرمجموعهای از آن به حساب میآید.
در دنیای زبان برنامه نویسی Lisp، اکثر زبانهایی که از سینتکسی با بیان نمادین (S-Expression) و معناشناسی شبیه به Lisp استفاده میکنند، دیالکتهایی از زبان Lisp به حساب میآیند. اگرچه، این زبانها بهطور گستردهای گوناگون هستند. با توجه به اینکه که برای اکثر زبانهای برنامه نویسی دیالکتهای مختلفی وجود دارد، ممکن است پیدا کردن مستندات درست برای برنامه نویسان تازهکار دشوار باشد. زبان برنامه نویسی BASIC دیالکتهای بسیار زیادی دارد.
طبقه بندی زبان های برنامه نویسی چیست ؟
هیچ طرح طبقهبندی و دستهبندی فراگیری برای زبانهای برنامه نویسی وجود ندارد. یک زبان برنامه نویسی معمولاً تنها از یک زبان مادر مشتق نمیشود. زبانهای برنامه نویسی معمولاً با ترکیب عناصری از چندین زبان برنامه نویسی قدیمیتر به همراه ایدههایی تازه و جاری در زمان خود خلق میشود.
ایدههایی که از یک زبان برنامه نویسی سرچشمه میگیرند، در خانوادهای از زبانهای مرتبط منتشر میشوند و سپس ناگهان از شکافهای خانوادگی جهش میکنند تا در خانوادهای کاملاً متفاوت ظاهر شوند. فرآیند پیدایش زبانهای برنامه نویسی جدید با این واقعیت حتی پیچیدهتر هم میشوند که زبانها را می توان در چندین محور مختلف طبقهبندی و دستهبندی کرد. برای مثال، جاوا هم یک زبان برنامه نویسی شیگرا است (چون سازماندهی شیگرا در آن وجود دارد) و هم یک زبان برنامه نویسی دارای قابلیت همزمانی (Cuncurrent Language) به حساب میآید (زیرا جاوا حاوی ساختارهای درونساخته برای اجرای چندین نخ به صورت موازی است). پایتون هم یک زبان برنامه نویسی شیگرای اسکریپتی به حساب میآید.
- مقالههای مرتبط:
- انواع برنامه نویسی – معرفی حوزه ها و کاربردهای مختلف برنامه نویسی
- انواع زبان های برنامه نویسی + معرفی، کاربرد، مزایا و معایب
بهطور کلی، زبانهای برنامه نویسی را میتوان براسا «الگوهای برنامه نویسی» (پارادایمهای برنامه نویسی) و همچنین طبقهبندی براساس دامنه استفاده مورد نظر تقسیم کرد و به این ترتیب «زبانهای برنامه نویسی همهمنظوره» هم از «زبانهای برنامه نویسی خاص یک دامنه مشخص» متمایز میشوند. از دیرباز، زبانهای برنامه نویسی به عنوان توصیف کننده محاسبات در قالب جملات امری یعنی صادر کردن دستورها در نظر گرفته شدهاند. این نوع زبانهای برنامه نویسی را به طور کلی «زبانهای برنامه نویسی دستوری» (Imperative Programming Languages) مینامند.
تحقیقات بسیار زیادی در زمینه زبانهای برنامه نویسی با هدف کم رنگتر کردن مرز میان یک برنامه به عنوان مجموعهای از دستورالعملها با برنامهای به عنوان اظهاری پیرامون پاسخ مطلوب انجام شده است. تولید برنامهای به عنوان ابرازگری راجع به پاسخ مورد نظر، قابلیت اصلی «زبانهای برنامه نویسی اعلانی» (Declarative Programming Language) به حساب میآید. از جمله سایر الگوها و پارادایمهای زبانهای برنامه نویسی میتوان به موارد زیر اشاره کرد:
- برنامه نویسی رویهای (Procedural Programming)
- برنامه نویسی شیگرا (object-Oriented Programming)
- برنامه نویسی تابعی (Functional Programming)
- برنامه نویسی منطقی (Logic Programming)
برخی از زبانهای برنامه نویسی ترکیبهایی از چند الگو به حساب میآیند و به اصطلاح «چند پارادایمی» (Multi-Paradigmatic) خوانده میشوند. یک زبان اسمبلی آنقدرها هم پارادایم یا الگو به حساب نمیآید، بلکه مدلی مستقیم از یک معماری ماشینی زیربنایی است.
به لحاظ هدف و مقصود، زبانهای برنامه نویسی را میتوان در دستههای زیر طبقهبندی کرد:
- «همهمنظوره» (General Purpose)
- «زبانهای برنامه نویسی سیستمی» (System Programming Languages)
- «زبانهای اسکریپتی» (Scripting Languages)
- «زبانهای خاص یک دامنه مشخص» (Domain-Specific Languages)
- زبانهای توزیعی با قابلیت همزمانی (Concurrent/Distributed Languages)
البته زبانهایی هم هستند که ترکیبی از موارد فوق به حساب میآیند. برخی از زبانهای برنامه نویسی همهمنظوره هم به میزان گستردهای برای اهداف آموزشی طراحی شدهاند.
علاوه بر این، یک زبان برنامه نویسی ممکن است به وسیله عواملی نامرتبط با الگوی برنامه نویسی هم دستهبندی شود. برای مثال، اکثر زبانهای برنامه نویسی از کلمههای کلیدی زبان انگلیسی استفاده میکنند، اما دسته کوچکی از زبانهای برنامه نویسی هم وجود دارند که کلمههای کلیدی آنها به زبان دیگری نوشته شده است. زبانهای دیگری هم هستند که در دسته «زبانهای برنامه نویسی محرمانه» (Esoteric Programming Language) قرار میگیرند.
جمعبندی
زبان طبیعی روش و ابزاری برای برقراری ارتباط میان انسانها برای انتقال مقصود و بعضاً تقاضا یا دستور دادن است. زبان برنامه نویسی هم مشابه زبان طبیعی، ابزاری برای برقراری ارتباط به حساب میآید. اما این برقراری ارتباط انسان با کامپیوتر صورت میگیرد. زبان برنامه نویسی ابزاری برای انسانها است تا از طریق آن امکان انتقال دستورالعملهای لازم به کامپیوترها فراهم شود و به این شیوه میتوان محاسبات و سایر فرایندهای مورد نیاز انسانها را از طریق کامپیوترها خودکارسازی کرد.
در این مقاله سعی شد تا بهطور جامع شرح داده شود که زبان برنامه نویسی چیست و همچنین به کلیه مباحث و مفاهیمی که به زبانهای برنامه نویسی مرتبط هستند پرداخته شد. از جمله مباحث مهم مطرح شده در این مقاله میتوان به تاریخچه زبانهای برنامه نویسی، اجزای آنها، نوعگذاری در زبانهای مختلف، کتابخانه استاندارد