'زبانهای برنامهنویسی' ساختارهای زبانی دستورمداری در هستند که بهوسیلهٔ آنها میتوان یک را بهوسیلهٔ ساختارهای دستوری متفاوت برای اجرای رایانه توصیف کرد و با این روش امکان نوشتن برنامه جهت تولید جدید بوجود میآید. معمولاً هر زبان برنامهنویسی دارای یک محیط نرمافزاری برای وارد کردن متن برنامه، اجرا، و رفع اشکال آن هستند. عموماً زبانهای را به پنج نسل تقسیم میکنند:
تقسیمبندی
زبانهای برنامهنویسی را میتوان از چهار دیدگاه متفاوت مورد بررسی قرار داده و تقسیم بندی کرد: الف) روشهای برنامهنویسی ۱-زیر روالی ۲-ساخت یافته ۳-مدولار ۴-شئ گرا ب) نزدیکی به زبان ماشین ۱-سطح پایین ۲-سطح میانی ۳-سطح بالا ج) نوع ترجمه ۱-مفسری ۲-کامپایلری د) ۱-مبتنی بر متن ۲-مبتنی بر گرافیک (ویژوال)
تعاریف
ویژگیهایی که غالباً برای تشکیل یک زبان برنامهنویسی مهم شمرده میشوند:
کاربرد
زبان برنامهنویسی یک مکانیزم برای تعریف دادهها، و عملیات یا تبدیلهایی که ممکن است بطور اتوماتیک روی آن داده انجام شوند، فراهم میکند. یک از انتزاعات آماده در زبان استفاده میکند تا مفاهیم به کار رفته در محاسبات را بیان کند. این مفاهیم به عنوان یک مجموعه از سادهترین عناصر موجود بیان میشوند (مفاهیم ابتدایی نامیده میشوند). با غالب تفاوتی دارد و آن این است که نیاز به بیان دقیق تر و کامل تری دارد. هنگام استفاده از زبانهای طبیعی برای ارتباط با دیگر انسانها، نویسندگان و گویندگان میتوانند مبهم باشند و اشتباهات کوچک داشته باشند، و همچنان انتظار داشته باشند که مخاطب آنها متوجه شده باشد. اگرچه، مجازا، رایانهها "دقیقاً آنچه که به آنها گفته شده را انجام میدهند." و نمیتوانند "بفهمند" که نویسنده دقیقاً چه کدی مد نظر نویسنده بودهاست] البته امروزه برنامههایی برای انجام این کار تولید شدهاند و تلاشهای بسیاری در این زمینه انجام شده ولی هنوز به نتیجهٔ رضایت بخشی نرسیده است[. ترکیب تعریف زبان، یک برنامه، و ورودی برنامه بطور کامل رفتار خروجی را به هنگام اجرای برنامه (در محدوده کنترل آن برنامه) مشخص میکند. برنامههای یک رایانه ممکن است در یک فرایند ناپیوسته بدون دخالت انسان اجرا شوند، یا یک کاربر ممکن است دستورات را در یک مرحله فعل و انفعال مفسر تایپ کند. در این حالت "دستور"ها همان برنامهها هستند، که اجرای آنها زنجیروار به هم مرتبطند. به زبانی که برای دستور دادن به برنامهای استفاده میشود، زبان اسکریپت میگویند. بسیاری از زبانها کنار گذاشته شدهاند، برای رفع نیازهای جدید جایگزین شدهاند، با برنامههای دیگر ترکیب شدهاند و در نهایت استعمال آنها متوقف شدهاست. با وجود اینکه تلاشهایی برای طراحی یک زبان رایانه" کامل" شدهاست که تمام اهداف را تحت پوشش قرار دهد، هیچیک نتوانستند بطور کلی این جایگاه را پر کنند. نیاز به زبانهای رایانهای گسترده از گستردگی زمینههایی که زبانها استفاده میشوند، ناشی میشود:
المانها
تمام زبانهای برنامهنویسی تعدادی بلوکهای ابتدایی برای توضیح داده و پردازش یا تبدیل آنها (مانند جمع کردن دو عدد با انتخاب یک عضو از یک مجموعه) دارند. این «عناصرابتدایی» بوسیله قوانین معناشناسی و دستوری تعریف میشوند که ساختار و معنای مربوطه را توضیح میدهند.
دستور(syntax)
فرم سطحی یک زبان برنامهنویسی دستور آن نامیده میشود. غالب زبانهای برنامهنویسی کاملاً متنی اند؛ و از دنبالهٔ متون شامل کلمات، اعداد، نشانگذاری، بسیار شبیه طبیعی استفاده میکنند. از طرف دیگر، برنامههایی نیز وجود دارند که بیشتر گرافیکی اند، و از روابط بصری بین سمبلها برای مشخص کردن برنامه استفاده میکنند. دستور یک زبان ترکیبات ممکن سمبلها برای ایجاد یک برنامهٔ درست را از نظر دستوری مشخص میکند. معنایی که به یک ترکیب سمبلها داده میشود با معناشناسی اداره میشود (قراردادی یا نوشته شده در پیادهسازی منبع). از آنجا که اغلب زبانها متنی هستند، این مقاله دستور متنی را مورد بحث قرار میدهد.
برنامهنویسی معمولاً بوسیله ترکیب عبارات معین (برای ساختار لغوی) و فرم توضیح اعمال (برای ساختار گرامری) تعریف میشوند. متن زیر یک گرامر ساده، به زبان lisp است: expression ::= atom | list atom ::= number | symbol number ::= [+-]?['۰'-'۹']+ symbol ::= ['A'-'Za'-'z']. * list ::= '(' expression* ')' این گرامر موارد ذیل را مشخص میکند:
همه برنامههایی که از لحاظ دستوری درست هستند، از نظر معنا درست نیستند. بسیاری از برنامههای درست دستوری، بد فرم اند، با توجه به قوانین زبان؛ و ممکن است (بسته به خصوصیات زبان و درست بودن پیادهسازی) به خطای ترجمه و یا استثنا(exception) منتج شود. در برخی موارد، چنین برنامههایی ممکن است رفتار نامشخصی از خود نشان دهند. حتی اگر یک برنامه در یک زبان به خوبی بیان شده باشد، ممکن است دقیقاً مطلوب نویسنده آن نبوده باشد.
به عنوان مثال در زبان طبیعی، ممکن نیست به برخی از جملات درست از لحاظ گرامری، معنای خاصی اطلاق کرد و یا ممکن است جمله نادرست باشد:
گرامر مورد نیاز برای مشخص کردن یک زبان برنامهنویسی میتواند با جایگاهش در «سلسله مراتب چامسکی» طبقهبندی شود. دستور اغلب زبانهای برنامهنویسی میتواند بوسیله یک گرامر نوع ۲ مشخص گردد، برای مثال،
معناشناسی ایستا
معناشناسی ایستا محدودیتهایی بر روی ساختار مجاز متنها تعیین میکند که بیان آنها در فرمول دستوری استاندارد مشکل و یا غیر ممکن است. مهمترین این محدودیتها به وسیله گذاری انجام میشود.
سیستم نوع گذاری
یک سیستم نوع گذاری مشخص میکند که یک زبان برنامهنویسی چگونه مقادیر و عبارات را در نوع(type) دستهبندی میکند، چگونه میتواند آن نوعها را تغییر دهد و رفتار متقابل آنها چگونهاست. این کارعموما توضیح داده ساختارهایی که میتوانند در آن زبان ایجاد شوند را شامل میشود. طراحی و مطالعه سیستمهای نوع گذاری بوسیله ریاضیات قراردادی را تئوری نوع گذاری گویند.
زبانهای نوع گذاری شده و بدون نوع گذاری
یک زبان نوع گذاری شدهاست اگر مشخصات هر عملیات، نوع دادههای قابل اجرا توسط آن را با نشان دادن نوعهایی که برای آنها قابل اجرا نیست، تعیین کند. برای مثال، «این متن درون گیومه قرار دارد» یک رشتهاست. در غالب زبانهای برنامهنویسی، تقسیم یک رشته با یک عدد معنایی ندارد. در نتیجه غالب زبانهای برنامهنویسی مدرن ممکن است اجرای این عملیات را توسط برنامهها رد کنند. در برخی زبانها، عبارات بیمعنی ممکن است هنگام ترجمه(compile) پیدا شود (چک کننده نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامهها، هنگام اجرا پیدا شود.(چک کننده نوع دینامیک) که به استثنای در حال اجرا منتج شود(runtime exception). حالت خاص زبانهای نوع دار زبانهای تک نوعند. این زبانها غالباً اسکریپتی و یا مارک آپ هستند، مانند rexx وSGML و فقط یک داده گونه دارند—غالباً رشتههای کاراکتری که هم برای دادههای عددی و هم برای دادههای سمبلی کاربرد دارند. در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبانهای اسمبلی، این امکان را میدهد که هر عملیاتی روی هر دادهای انجام شود، که معمولاً دنبالهای از بیتها با طولهای متفاوت در نظر گرفته میشوند. زبانهای سطح بالا که بی نوع هستند شامل زبانهای ساده رایانهای و برخی از انواع زبانهای نسل چهارم.
در عمل، در حالیکه تعداد بسیار کمی از دیدگاه نظریه نوع، نوع گذاری شده تلقی میشوند (چک کردن یا رد کردن تمام عملیاتها)، غالب زبانهای امروزی درجهای از نوع گذاری را فراهم میکنند. بسیاری از زبانهای تولیدکننده راهی را برای گذشتن یا موقوف کردن سیستم نوع فراهم میکنند.
نوع گذاری ایستا و متحرک
در نوع گذاری ایستا تمام عبارات نوعهای خود را قبل از اجرای برنامه تعیین میکنند (معمولاً در زمان کامپایل). برای مثال، ۱ و (۲+۲) عبارات عددی هستند؛ آنها نمیتوانند به تابعی که نیاز به یک رشته دارد داده شوند، یا در متغیری که تعریف شده تا تاریخ را نگه دارد، ذخیره شوند.
زبانهای نوع گذاری شده ایستا میتوانند با مانیفست نوع گذاری شوند یا با استفاده از نوع استنباط شوند. در حالت اول، برنامه نویس بیشتر صریحاً نوعها را در جایگاههای منتنی مشخص مینویسد (برای مثال، در تعریف متغیرها). در حالت دوم، کامپایلر نوع عبارات و تعریفها را بر اساس متن استنباط میکند. غالب زبانهای مسیر اصلی(mainstream) ایستا نوع گذاری شده، مانند C#,C++ و Java، با مانیفست نوع گذاری میشوند
نوع گذاری قوی و ضعیف
نوع گذاری ضعیف این امکان را ایجاد میکند که با متغیری به جای متغیری دیگر برخورد شود، برای مثال رفتار با یک رشته به عنوان یک عدد. این ویژگی بعضی اوقات ممکن است مفید باشد، اما ممکن است باعث ایجاد برخی مشکلات برنامه شود که موقع کامپایل و حتی اجرا پنهان بمانند.
نوع گذاری قوی مانع رخ دادن مشکل فوق میشود. تلاش برای انجام عملیات روی نوع نادرست متغیر منجر به رخ دادن خطا میشود. زبانهایی که نوع گذاری قوی دارند غالباً با نام «نوع-امن» و یا امن شناخته میشوند. تمام تعاریف جایگزین برای «ضعیف نوع گذاری شده» به زبانها اشاره میکند، مثل perl, JavaScript, C++، که اجازه تعداد زیادی تبدیل نوع داخلی را میدهند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل میکند، و این تبدیل موفقیت آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، و یا رشتهای از حروف باشد. چنین تبدیلات ضمنی غالباً مفیدند، اما خطاهای برنامهنویسی را پنهان میکنند.
قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض میشوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت «قوی نوع گذاری شده» را به کار میبرند و منظورشان قوی، ایستایی نوع گذاری شدهاست، و یا، حتی گیچ کننده تر، منظورشان همان ایستایی نوع گذاری شدهاست؛ بنابراین C هم قوی نوع گذاری شده و هم ضعیف و ایستایی نوع گذاری شده نامیده میشود.
معناشناسی اجرا
وقتی که داده مشخص شد، ماشین باید هدایت شود تا عملیاتها را روی داده انجام دهد. معناشناسی اجرا ی یک زبان تعیین میکند که چگونه و چه زمانی ساختارهای گوناگون یک زبان باید رفتار برنامه را ایجاد کنند.
برای مثال، معناشناسی ممکن است استراتژی را که بویسله آن عبارات ارزیابی میشوند را تعریف کند و یا حالتی را که ساختارهای کنترلی تحت شرایطی دستورها را اجرا میکنند.
کتابخانه هسته
اغلب زبانهای برنامهنویسی یک کتابخانه هسته مرتبط دارند (گاهی اوقات "کتابخانه استاندارد" نامیده میشوند، مخصوصا وقتی که به عنوان قسمتی از یک زبان استاندارد ارائه شده باشد)، که به طور قراردادی توسط تمام پیادهسازیهای زبان در دسترس قرار گرفته باشند. کتابخانه هسته معمولاً تعریف الگوریتمها، داده ساختارها و مکانیزمهای ورودی و خروجی پرکاربرد را در خود دارد. کاربران یک زبان، غالباً با کتابخانه هسته به عنوان قسمتی از آن رفتار میکنند، اگرچه طراحان ممکن است با آن به صورت یک مفهوم مجزا رفتار کرده باشند. بسیاری از خصوصیات زبان هستهای را مشخص میکنند که باید در تمام پیادهسازیها موجود باشند، و در زبانهای استاندارد شده این کتابخانه هسته ممکن است نیاز باشد؛ بنابراین خط بین زبان و کتابخانه هسته آن از زبانی به زبان دیگر متفاوت است. درواقع، برخی زبانها به گونهای تعریف شدهاند که برخی از ساختارهای دستوری بدون اشاره به کتابخانه هسته قابل استفاده نیستند. برای مثالف در جاوا، یک رشته به عنوان نمونهای از کلاس “java.lang.String” تعریف شده است؛ مشابها، در سمال تاک(smalltalk) یک تابع بی نام (یک "بلاک") نمونهای از کلاس BlockContext کتابخانه میسازد. بطور معکوس، Scheme دارای چندین زیرمجموعه مرتبط برای ایجاد سایر ماکروهای زبان میباشد، و در نتیجه طراحان این زحمت را نیز تحمل نمیکنند که بگویند کدام قسمت زبان به عنوان ساختارهای زبان باید پیادهسازی شوند، و کدام یک به عنوان بخشی ازکتابخانه.
عمل
طراحان زبان و کاربران باید مصنوعاتی ایجاد کنند تا برنامهنویسی را در عمل ممکن سازند و کنترل کنند. مهمترین این مصنوعات خصوصیات و پیادهسازیهای زبان هستند.
خصوصیات
خصوصیات یک زبان برنامهنویسی باید تعریفی فراهم کند که کاربران و پیاده کنندههای زبان میتوانند از آن استفاده کنند تا مشخص کنند که رفتار یک برنامه درست است. با داشتن کد منبع: خصوصیات یک زبان برنامهنویسی چندین قالب میتواند بگیرد، مانند مثالهای زیر:
پیادهسازی یک زبان برنامهنویسی امکان اجرای آن برنامه را روی پیکربندی مشخصی از سختافزار و نرمافزار را فراهم میکند. بطور وسیع، دو راه رسیدن به پیادهسازی زبان برنامهنویسی وجود دارد. کامپایل کردن و تفسیر کردن. بطور کلی با هر بک از ابن دو روش میتوان یک زبان را پیادهسازی کرد.
خروجی یک کامپایلر ممکن است با سختافزار و یا برنامهای به نام مفسر اجرا شود. در برخی پیادهسازیها که از مفسر استفاده میشود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیادهسازیهای زبان برنامهنویسی بیسیک کامپایل میکنند و سپس کد را خط به خط اجرا میکنند.
برنامههایی که مستقیماً روی سختافزار اجرا میشوند چندین برابر سریعتر از برنامههایی که با کمک نرمافزار اجرا میشوند، انجام میشوند.
یک تکنیک برای بهبود عملکرد برنامههای تفسیر شده کامپایل در لحظه آن است. در این روش ، دقیقاً قبل از اجرا، بلوکهای کدهای بایتی که قرار است استفاده شوند را برای اجرای مستقیم روی سختافزار ترجمه میکند.
تاریخچه
پیشرفتهای اولیه
اولین زبان برنامهنویسی به قبل از رایانههای مدرن باز میگردد. قرن ۱۹ دستگاههای نساجی و متون نوازنده پیانو قابل برنامهنویسی داشت که امروزه به عنوان مثالهایی از زبانهای برنامهنویسی با حوزه مشخص شناخته میشوند. با شروع ، پانچ کارتها داده را کد گذاری کردند و پردازش مکانیکی را هدایت کردند. در دهه ۱۹۳۰ و ۱۹۴۰، صورت گرایی حساب لاندای آلونزو چرچ و مفاهیم ریاضی بیان الگوریتمها را فراهم کردند؛ حساب لاندا همچنان در طراحی زبان مؤثر است.
در دهه ۴۰، اولین رایانههای دیجیتال که توسط برق تغذیه میشدند ایجاد شدند. اولین طراحی شده برای کامپیوتر پلانکالکول بود، که بین سالهای ۱۹۴۵ و ۱۹۴۳ توسط کنراد زوس برای ز۳ آلمان طراحی شد.
کامپیوترهای اوایل ۱۹۵۰، بطور خاص ÜNIVAC ۱ و IBM ۷۰۱ از برنامههای زبان ماشین استفاده میکردند. برنامهنویسی زبان ماشین نسل اول توسط نسل دومی که نامیده میشوند جایگزین شد. در سالهای بعد دهه ۵۰، زبان برنامهنویسی اسمبلی، که برای استفاده از دستورات ماکرو تکامل یافته بود، توسط سه زبان برنامهنویسی سطح بالا دیگر: FORTRAN,LISP , COBOL مورد استفاده قرار گرفت. نسخههای به روز شده این برنامهها همچنان مورد استفاده قرار میگیرند، و هر کدام قویا توسعه زبانهای بعد را تحت تاثیر قرار دادند. در پایان دهه ۵۰ زبان algol ۶۰ معرفی شد، و بسیاری از زبانهای برنامهنویسی بعد، با ملاحظه بسیار، از نسل algol هستند. قالب و استفاده از زبانهای برنامهنویسی به شدت متاثر از محدودیتهای رابط بودند.
پالایش
دوره دهه ۶۰ تا اواخر دهه ۷۰ گسترش مثالهای عمده زبان پرکاربرد امروز را به همراه داشت. با این حال بسیاری از جنبههای آن ایدههای اولیه نسل سوم زبان برنامهنویسی بود:
دهههای ۶۰ و ۷۰ مناقشات بسیاری روی به خود دیدند، و اینکه آیا زبانهای برنامهنویسی باید طوری طراحی شوند که آنها را پشتیبانی کنند.
«ادسگر دیکسترا» در نامهای معروف در ۱۹۶۸ که در ارتباطات ACM منتشر شد، استدلال کرد که دستورgoto باید از تمام زبانهای سطح بالا حذف شود.
در دهههای ۶۰ و ۷۰ توسعهٔ تکنیکهایی صورت گرفت که اثر یک برنامه را کاهش میداد و در عین حال برنامه نویس و کاربر را بهبود بخشید. دسته کارت برای ۴GL اولیه بسیار کوچکتر از برنامهٔ هم سطح بود که با ۳GL deck نوشته شده بود.
یکپارچگی و رشد
دهه ۸۰ سالهای یکپارچگی نسبی بود. C++ برنامهنویسی شئ گرا و برنامهنویسی سیستمی را ترکیب کرده بود. ایدا (زبان برنامهنویسی سیستمی که بیشتر برای استفاده توسط پیمان کاران دفاعی بود) را استاندارد سازی کرد. در ژاپن و جاهای دیگر، هزینههای گزافی صرف تحقیق در مورد زبان نسل پنجم میشد که دارای ساختارهای برنامهنویسی منطقی بود. انجمن زبان کاربردی به سمت استانداردسازی ML و Lisp حرکت کرد. به جای ایجاد مثالهای جدید، تمام این تلاشها ایدههایی که در دهههای قبل حلق شده بودند را بهتر کرد.
یک گرایش مهم در طراحی زبان در دهه ۸۰ تمرکز بیشتر روی برنامهنویسی برای سیستمهای بزرگ از طریق مدولها، و یا واحدهای کدهای سازمانی بزرگ مقیاس بود. مدول-۲، ایدا؛ و ML همگی سیستمهای مدولی برجستهای را در دهه ۸۰ توسعه دادند. با وجود اینکه زبانهای دیگر، مثل PL/i، پشتیبانی بسیار خوبی برای برنامهنویسی مدولی داشتند. سیستمهای مدولی غالباً با ساختارهای برنامهنویسی عام همراه شدهاند.
رشد سریع اینترنت در میانه دهه ۹۰ فرصتهای ایجاد زبانهای جدید را فراهم کرد. Perl، در اصل یک ابزار نوشتن یونیکس بود که اولین بار در سال ۱۹۸۷ منتشر شد، در وبگاههای دینامیک متداول شد. جاوا برای برنامهنویسی جنب سروری مورد استفاده قرار گرفت. این توسعهها اساساً نو نبودند، بلکه بیشتر بهینهسازی شده زبان و مثالهای موجود بودند، و بیشتر بر اساس خانواده زبان برنامهنویسی C بودند. پیشرفت زبان برنامهنویسی همچنان ادامه پیدا میکند، هم در تحقیقات و هم در صنعت. جهتهای فعلی شامل امنیت و وارسی است، گونههای جدید مدولی(mixin، نمایندهها، جنبهها) و تجمع .
۴GLها نمونهای از زبانهایی هستند که محدوده استفاده آنها مشخص است، مثل SQL. که به جای اینکه دادههای اسکالر را برگردانند، مجموعههایی را تغییر داده و بر میگردانند که برای اکثر زبانها متعارفند. Perl برای مثال، با «مدرک اینجا» خود میتواند چندین برنامه ۴GL را نگه دارد، مانند چند برنامه جاوا سکریبت، در قسمتی از کد پرل خود و برای پشتیبانی از چندین زبان برنامهنویسی با تناسب متغیر در «مدرک اینجا» استفاده کند.
سنجش استفاده از زبان
مشکل است که مشخص کنیم کدام زبان برنامهنویسی بیشتر مورد استفادهاست، و اینکه کاربرد چه معنی میدهد با توجه به زمینه تغییر میکند. یک زبان ممکن است زمان بیشتری از برنامه نویس بگیرد، زبان دیگر ممکن است خطوط بیشتری داشته باشد، و دیگری ممکن است زمان بیشتری از پردازنده را مصرف کند. برخی زبانها برای کاربردهای خاص بسیار محبوبند. برای مثال: کوبول همچنان در مراکزداده متحد، غالباً روی کامپیوترهای بزرگ توانا است؛ fortran در مهندسی برنامههای کاربردی، C در برنامههای تعبیه شده و سیستمهای عامل؛ و بقیه برنامهها معمولاً برای نوشتن انواع دیگر برنامهها کاربرد دارند. روشهای مختلفی برای سنجش محبوبیت زبانها، هر یک متناسب یا یک ویژگی محوری متفاوت پیشنهاد شدهاست:
این حقیقت که این دستهبندی ممکن است در راستای محورهای مختلف انجام شوند، این وظیفه را پیچیده تر میکند؛ برای مثال، جاوا هم یک زبان شیءگرا (چون به تشویق میکند) و زبان همزمان (چون ساختارهای داخلی برای اجرای چندین جریان موازی دارد) است. پایتون یک زبان اسکریپتی شیءگراست.
در نگاه کلی، زبانهای برنامهنویسی به مثالهای برنامهنویسی و یک دستهبندی بر اساس محدوده استفاده تقسیم میشوند. مثالها شامل ، برنامهنویسی شیءگرا، برنامهنویسی کاربردی، وبرنامهنویسی منطقی؛ برخی زبانها ترکیب چند مثالند. یک زبان اسمبلی مثالی از یک مدل مستقیم متضمن معماری ماشین نیست. با توجه به هدف، زبانهای برنامهنویسی ممکن است همه منظوره باشند، زبانهای برنامهنویسی سیستمی، زبانهای اسکریپتی، زبانهای محدوده مشخص، زبانهای همزمان/ گسترده (و یا ترکیب اینها). برخی زبانهای همه منظوره تا حد زیادی برای اهداف آموزشی طراحی شدهاند.
یک زبان برنامهنویسی ممکن است با فاکتورهای غیر مرتبط به مثالهای برنامهنویسی دستهبندی شود. برای مثال، غالب زبانهای برنامهنویسی کلمات کلیدی را استفاده میکنند، در حالیکه تعداد کمی این کار را نمیکنند. سایر زبانها ممکن است براساس داخلی دستهبندی شوند.
منبع : ویکی پدیا
- نسل اول - زبان صفرو یک
- نسل دوم زبانهایی مانند اسمبلی -قابل فهم تر برای انسان
- نسل سوم زبانهایی مانند کوبول و پی ال وان و... -دستورات قابل فهم تر برای انسان و نیاز به کمپایلرها
- نسل چهارم مثل زبانهای اوراکل و و اس کیو الها - نزدیک به محاورههای انسانی
- نسل پنج زبانهایی مانند prolog , ops5 - تمرکز بر و استفاده از الگوریتمهای نوشته شده توسط برنامه نویس
تقسیمبندی
زبانهای برنامهنویسی را میتوان از چهار دیدگاه متفاوت مورد بررسی قرار داده و تقسیم بندی کرد: الف) روشهای برنامهنویسی ۱-زیر روالی ۲-ساخت یافته ۳-مدولار ۴-شئ گرا ب) نزدیکی به زبان ماشین ۱-سطح پایین ۲-سطح میانی ۳-سطح بالا ج) نوع ترجمه ۱-مفسری ۲-کامپایلری د) ۱-مبتنی بر متن ۲-مبتنی بر گرافیک (ویژوال)
تعاریف
ویژگیهایی که غالباً برای تشکیل یک زبان برنامهنویسی مهم شمرده میشوند:
- تابع :یک زبان برنامهنویسی، زبانی است که برای نوشتن برنامههای رایانهای به کار میرود که رایانهای را برای انجام محاسبات یا اجرای الگوریتم و یا احتمالاً کنترل دستگاههای خارجی مثل چاپگر، ربات و... درگیر میکنند.
- هدف: زبانهای برنامهنویسی با تفاوت دارند و آن اینکه زبانهای طبیعی فقط برای فعل و انفعالات بین مردم به کار میروند، در حالیکه زبانهای برنامهنویسی همچنین به انسانها اجازه میدهد که از طریق دستورات با ماشینها ارتباط برقرار کنند. برخی زبانهای برنامهنویسی بوسیله یک دستگاه استفاده میشوند تا دستگاه دیگری را کنترل کند. برای مثال برنامههای پست اسکریپت(post script) غالباً توسط برنامه دیگری برای کنترل یک چاپگر و یا نمایشگر ایجاد میشوند.
- ساختارها: زبانهای برنامهنویسی ممکن است ساختارهایی برای تعریف و تغییر یا کنترل جریان اجرا داشته باشند.
- توان بیانگر: ، زبانها را بوسیله محاسباتی که توان بیان آنها را دارند میکند. تمام زبانهای «کامل تورینگ» میتوانند مجموعه یکسانی از الگوریتمها را پیادهسازی کنند.ANSI/ISO SQL و Charity مثالهایی هستند از زبانهایی که کامل تورینگ نیستند، ولی غالباً زبان برنامهنویسی نامیده میشوند.
کاربرد
زبان برنامهنویسی یک مکانیزم برای تعریف دادهها، و عملیات یا تبدیلهایی که ممکن است بطور اتوماتیک روی آن داده انجام شوند، فراهم میکند. یک از انتزاعات آماده در زبان استفاده میکند تا مفاهیم به کار رفته در محاسبات را بیان کند. این مفاهیم به عنوان یک مجموعه از سادهترین عناصر موجود بیان میشوند (مفاهیم ابتدایی نامیده میشوند). با غالب تفاوتی دارد و آن این است که نیاز به بیان دقیق تر و کامل تری دارد. هنگام استفاده از زبانهای طبیعی برای ارتباط با دیگر انسانها، نویسندگان و گویندگان میتوانند مبهم باشند و اشتباهات کوچک داشته باشند، و همچنان انتظار داشته باشند که مخاطب آنها متوجه شده باشد. اگرچه، مجازا، رایانهها "دقیقاً آنچه که به آنها گفته شده را انجام میدهند." و نمیتوانند "بفهمند" که نویسنده دقیقاً چه کدی مد نظر نویسنده بودهاست] البته امروزه برنامههایی برای انجام این کار تولید شدهاند و تلاشهای بسیاری در این زمینه انجام شده ولی هنوز به نتیجهٔ رضایت بخشی نرسیده است[. ترکیب تعریف زبان، یک برنامه، و ورودی برنامه بطور کامل رفتار خروجی را به هنگام اجرای برنامه (در محدوده کنترل آن برنامه) مشخص میکند. برنامههای یک رایانه ممکن است در یک فرایند ناپیوسته بدون دخالت انسان اجرا شوند، یا یک کاربر ممکن است دستورات را در یک مرحله فعل و انفعال مفسر تایپ کند. در این حالت "دستور"ها همان برنامهها هستند، که اجرای آنها زنجیروار به هم مرتبطند. به زبانی که برای دستور دادن به برنامهای استفاده میشود، زبان اسکریپت میگویند. بسیاری از زبانها کنار گذاشته شدهاند، برای رفع نیازهای جدید جایگزین شدهاند، با برنامههای دیگر ترکیب شدهاند و در نهایت استعمال آنها متوقف شدهاست. با وجود اینکه تلاشهایی برای طراحی یک زبان رایانه" کامل" شدهاست که تمام اهداف را تحت پوشش قرار دهد، هیچیک نتوانستند بطور کلی این جایگاه را پر کنند. نیاز به زبانهای رایانهای گسترده از گستردگی زمینههایی که زبانها استفاده میشوند، ناشی میشود:
- محدوده برنامهها از متون بسیار کوچک نوشته شده توسط افراد عادی تا سیستمهای بسیار بزرگ نوشته شده توسط صدها برنامه نویس است
- توانایی برنامه نویسها: از تازهکارهایی که بیش از هر چیز به سادگی نیاز دارند تا حرفهایهایی که با پیچیدگی قابل توجهی کنار میآیند.
- برنامهها باید سرعت، اندازه و سادگی را بسته به سیستمها از ریزپردازندها تا ابر رایانهها متناسب نگه دارند.
- برنامهها ممکن است یک بار نوشته شوند و تا نسلها تغییر نکنند، و یا ممکن است پیوسته اصلاح شوند.
- در نهایت، برنامه نویسها ممکن است در علایق متفاوت باشند: آنها ممکن است به بیان مسائل با زبانی خاص خو گرفته باشند.
المانها
تمام زبانهای برنامهنویسی تعدادی بلوکهای ابتدایی برای توضیح داده و پردازش یا تبدیل آنها (مانند جمع کردن دو عدد با انتخاب یک عضو از یک مجموعه) دارند. این «عناصرابتدایی» بوسیله قوانین معناشناسی و دستوری تعریف میشوند که ساختار و معنای مربوطه را توضیح میدهند.
دستور(syntax)
فرم سطحی یک زبان برنامهنویسی دستور آن نامیده میشود. غالب زبانهای برنامهنویسی کاملاً متنی اند؛ و از دنبالهٔ متون شامل کلمات، اعداد، نشانگذاری، بسیار شبیه طبیعی استفاده میکنند. از طرف دیگر، برنامههایی نیز وجود دارند که بیشتر گرافیکی اند، و از روابط بصری بین سمبلها برای مشخص کردن برنامه استفاده میکنند. دستور یک زبان ترکیبات ممکن سمبلها برای ایجاد یک برنامهٔ درست را از نظر دستوری مشخص میکند. معنایی که به یک ترکیب سمبلها داده میشود با معناشناسی اداره میشود (قراردادی یا نوشته شده در پیادهسازی منبع). از آنجا که اغلب زبانها متنی هستند، این مقاله دستور متنی را مورد بحث قرار میدهد.
برنامهنویسی معمولاً بوسیله ترکیب عبارات معین (برای ساختار لغوی) و فرم توضیح اعمال (برای ساختار گرامری) تعریف میشوند. متن زیر یک گرامر ساده، به زبان lisp است: expression ::= atom | list atom ::= number | symbol number ::= [+-]?['۰'-'۹']+ symbol ::= ['A'-'Za'-'z']. * list ::= '(' expression* ')' این گرامر موارد ذیل را مشخص میکند:
- یک عبارت یا atom است و یا یک لیست
- یک atom یا یک عدد است و یا یک سمبل
- یک عدد دنباله ناشکستهای از یک یا تعداد بیشتری اعداد دهدهی است، که یک علامت مثبت و یا منفی میتواند پیش از آن بیاید.
- یک سمبل حرفی است که بعد از هیچ یا تعدادی کاراکتر (جز فاصله) میآید.
- یک لیست تعدادی پرانتز است که میتواند صفر یا چند عبارت در خود داشته باشد.
همه برنامههایی که از لحاظ دستوری درست هستند، از نظر معنا درست نیستند. بسیاری از برنامههای درست دستوری، بد فرم اند، با توجه به قوانین زبان؛ و ممکن است (بسته به خصوصیات زبان و درست بودن پیادهسازی) به خطای ترجمه و یا استثنا(exception) منتج شود. در برخی موارد، چنین برنامههایی ممکن است رفتار نامشخصی از خود نشان دهند. حتی اگر یک برنامه در یک زبان به خوبی بیان شده باشد، ممکن است دقیقاً مطلوب نویسنده آن نبوده باشد.
به عنوان مثال در زبان طبیعی، ممکن نیست به برخی از جملات درست از لحاظ گرامری، معنای خاصی اطلاق کرد و یا ممکن است جمله نادرست باشد:
- "ایدههای بی با خشم میخوابند."از نظر دستوری خوش فرم است ولی معنای مورد قبولی ندارد.
- "جان یک مجرد متاهل است." از نظر دستوری درست است، ولی معنایی را بیان میکند که نمیتواند درست باشد.
گرامر مورد نیاز برای مشخص کردن یک زبان برنامهنویسی میتواند با جایگاهش در «سلسله مراتب چامسکی» طبقهبندی شود. دستور اغلب زبانهای برنامهنویسی میتواند بوسیله یک گرامر نوع ۲ مشخص گردد، برای مثال،
معناشناسی ایستا
معناشناسی ایستا محدودیتهایی بر روی ساختار مجاز متنها تعیین میکند که بیان آنها در فرمول دستوری استاندارد مشکل و یا غیر ممکن است. مهمترین این محدودیتها به وسیله گذاری انجام میشود.
سیستم نوع گذاری
یک سیستم نوع گذاری مشخص میکند که یک زبان برنامهنویسی چگونه مقادیر و عبارات را در نوع(type) دستهبندی میکند، چگونه میتواند آن نوعها را تغییر دهد و رفتار متقابل آنها چگونهاست. این کارعموما توضیح داده ساختارهایی که میتوانند در آن زبان ایجاد شوند را شامل میشود. طراحی و مطالعه سیستمهای نوع گذاری بوسیله ریاضیات قراردادی را تئوری نوع گذاری گویند.
زبانهای نوع گذاری شده و بدون نوع گذاری
یک زبان نوع گذاری شدهاست اگر مشخصات هر عملیات، نوع دادههای قابل اجرا توسط آن را با نشان دادن نوعهایی که برای آنها قابل اجرا نیست، تعیین کند. برای مثال، «این متن درون گیومه قرار دارد» یک رشتهاست. در غالب زبانهای برنامهنویسی، تقسیم یک رشته با یک عدد معنایی ندارد. در نتیجه غالب زبانهای برنامهنویسی مدرن ممکن است اجرای این عملیات را توسط برنامهها رد کنند. در برخی زبانها، عبارات بیمعنی ممکن است هنگام ترجمه(compile) پیدا شود (چک کننده نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامهها، هنگام اجرا پیدا شود.(چک کننده نوع دینامیک) که به استثنای در حال اجرا منتج شود(runtime exception). حالت خاص زبانهای نوع دار زبانهای تک نوعند. این زبانها غالباً اسکریپتی و یا مارک آپ هستند، مانند rexx وSGML و فقط یک داده گونه دارند—غالباً رشتههای کاراکتری که هم برای دادههای عددی و هم برای دادههای سمبلی کاربرد دارند. در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبانهای اسمبلی، این امکان را میدهد که هر عملیاتی روی هر دادهای انجام شود، که معمولاً دنبالهای از بیتها با طولهای متفاوت در نظر گرفته میشوند. زبانهای سطح بالا که بی نوع هستند شامل زبانهای ساده رایانهای و برخی از انواع زبانهای نسل چهارم.
در عمل، در حالیکه تعداد بسیار کمی از دیدگاه نظریه نوع، نوع گذاری شده تلقی میشوند (چک کردن یا رد کردن تمام عملیاتها)، غالب زبانهای امروزی درجهای از نوع گذاری را فراهم میکنند. بسیاری از زبانهای تولیدکننده راهی را برای گذشتن یا موقوف کردن سیستم نوع فراهم میکنند.
نوع گذاری ایستا و متحرک
در نوع گذاری ایستا تمام عبارات نوعهای خود را قبل از اجرای برنامه تعیین میکنند (معمولاً در زمان کامپایل). برای مثال، ۱ و (۲+۲) عبارات عددی هستند؛ آنها نمیتوانند به تابعی که نیاز به یک رشته دارد داده شوند، یا در متغیری که تعریف شده تا تاریخ را نگه دارد، ذخیره شوند.
زبانهای نوع گذاری شده ایستا میتوانند با مانیفست نوع گذاری شوند یا با استفاده از نوع استنباط شوند. در حالت اول، برنامه نویس بیشتر صریحاً نوعها را در جایگاههای منتنی مشخص مینویسد (برای مثال، در تعریف متغیرها). در حالت دوم، کامپایلر نوع عبارات و تعریفها را بر اساس متن استنباط میکند. غالب زبانهای مسیر اصلی(mainstream) ایستا نوع گذاری شده، مانند C#,C++ و Java، با مانیفست نوع گذاری میشوند
نوع گذاری قوی و ضعیف
نوع گذاری ضعیف این امکان را ایجاد میکند که با متغیری به جای متغیری دیگر برخورد شود، برای مثال رفتار با یک رشته به عنوان یک عدد. این ویژگی بعضی اوقات ممکن است مفید باشد، اما ممکن است باعث ایجاد برخی مشکلات برنامه شود که موقع کامپایل و حتی اجرا پنهان بمانند.
نوع گذاری قوی مانع رخ دادن مشکل فوق میشود. تلاش برای انجام عملیات روی نوع نادرست متغیر منجر به رخ دادن خطا میشود. زبانهایی که نوع گذاری قوی دارند غالباً با نام «نوع-امن» و یا امن شناخته میشوند. تمام تعاریف جایگزین برای «ضعیف نوع گذاری شده» به زبانها اشاره میکند، مثل perl, JavaScript, C++، که اجازه تعداد زیادی تبدیل نوع داخلی را میدهند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل میکند، و این تبدیل موفقیت آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، و یا رشتهای از حروف باشد. چنین تبدیلات ضمنی غالباً مفیدند، اما خطاهای برنامهنویسی را پنهان میکنند.
قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض میشوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت «قوی نوع گذاری شده» را به کار میبرند و منظورشان قوی، ایستایی نوع گذاری شدهاست، و یا، حتی گیچ کننده تر، منظورشان همان ایستایی نوع گذاری شدهاست؛ بنابراین C هم قوی نوع گذاری شده و هم ضعیف و ایستایی نوع گذاری شده نامیده میشود.
معناشناسی اجرا
وقتی که داده مشخص شد، ماشین باید هدایت شود تا عملیاتها را روی داده انجام دهد. معناشناسی اجرا ی یک زبان تعیین میکند که چگونه و چه زمانی ساختارهای گوناگون یک زبان باید رفتار برنامه را ایجاد کنند.
برای مثال، معناشناسی ممکن است استراتژی را که بویسله آن عبارات ارزیابی میشوند را تعریف کند و یا حالتی را که ساختارهای کنترلی تحت شرایطی دستورها را اجرا میکنند.
کتابخانه هسته
اغلب زبانهای برنامهنویسی یک کتابخانه هسته مرتبط دارند (گاهی اوقات "کتابخانه استاندارد" نامیده میشوند، مخصوصا وقتی که به عنوان قسمتی از یک زبان استاندارد ارائه شده باشد)، که به طور قراردادی توسط تمام پیادهسازیهای زبان در دسترس قرار گرفته باشند. کتابخانه هسته معمولاً تعریف الگوریتمها، داده ساختارها و مکانیزمهای ورودی و خروجی پرکاربرد را در خود دارد. کاربران یک زبان، غالباً با کتابخانه هسته به عنوان قسمتی از آن رفتار میکنند، اگرچه طراحان ممکن است با آن به صورت یک مفهوم مجزا رفتار کرده باشند. بسیاری از خصوصیات زبان هستهای را مشخص میکنند که باید در تمام پیادهسازیها موجود باشند، و در زبانهای استاندارد شده این کتابخانه هسته ممکن است نیاز باشد؛ بنابراین خط بین زبان و کتابخانه هسته آن از زبانی به زبان دیگر متفاوت است. درواقع، برخی زبانها به گونهای تعریف شدهاند که برخی از ساختارهای دستوری بدون اشاره به کتابخانه هسته قابل استفاده نیستند. برای مثالف در جاوا، یک رشته به عنوان نمونهای از کلاس “java.lang.String” تعریف شده است؛ مشابها، در سمال تاک(smalltalk) یک تابع بی نام (یک "بلاک") نمونهای از کلاس BlockContext کتابخانه میسازد. بطور معکوس، Scheme دارای چندین زیرمجموعه مرتبط برای ایجاد سایر ماکروهای زبان میباشد، و در نتیجه طراحان این زحمت را نیز تحمل نمیکنند که بگویند کدام قسمت زبان به عنوان ساختارهای زبان باید پیادهسازی شوند، و کدام یک به عنوان بخشی ازکتابخانه.
عمل
طراحان زبان و کاربران باید مصنوعاتی ایجاد کنند تا برنامهنویسی را در عمل ممکن سازند و کنترل کنند. مهمترین این مصنوعات خصوصیات و پیادهسازیهای زبان هستند.
خصوصیات
خصوصیات یک زبان برنامهنویسی باید تعریفی فراهم کند که کاربران و پیاده کنندههای زبان میتوانند از آن استفاده کنند تا مشخص کنند که رفتار یک برنامه درست است. با داشتن کد منبع: خصوصیات یک زبان برنامهنویسی چندین قالب میتواند بگیرد، مانند مثالهای زیر:
- تعریف صریح دستور، معناشناسی ایستا، ومعناشناسی اجرای زبان. درحالیکه دستور معمولاً با یک معناشناسی قراردادی مشخص میشود، تعاریف معناشناسی ممکن است در نوشته شده باشند (مثل زبان C)، یا معناشناسی قراردادی (مثل StandardML ,Scheme)
- توضیح رفتار یک مترجم برای زبان (مثل C,fortran). دستور و معناشناسی یک زبان باید از این توضیح استنتاج شوند، که ممکن است به زبان طبیعی یا قراردادی نوشته شود.
- پیادهسازی منبع یا مدل. گاهی اوقات در زبانهای مشخص شده (مثل: prolog,ANSI REXX). دستور و معناشناسی صریحاً در رفتار پیادهسازی مدل موجودند.
پیادهسازی یک زبان برنامهنویسی امکان اجرای آن برنامه را روی پیکربندی مشخصی از سختافزار و نرمافزار را فراهم میکند. بطور وسیع، دو راه رسیدن به پیادهسازی زبان برنامهنویسی وجود دارد. کامپایل کردن و تفسیر کردن. بطور کلی با هر بک از ابن دو روش میتوان یک زبان را پیادهسازی کرد.
خروجی یک کامپایلر ممکن است با سختافزار و یا برنامهای به نام مفسر اجرا شود. در برخی پیادهسازیها که از مفسر استفاده میشود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیادهسازیهای زبان برنامهنویسی بیسیک کامپایل میکنند و سپس کد را خط به خط اجرا میکنند.
برنامههایی که مستقیماً روی سختافزار اجرا میشوند چندین برابر سریعتر از برنامههایی که با کمک نرمافزار اجرا میشوند، انجام میشوند.
یک تکنیک برای بهبود عملکرد برنامههای تفسیر شده کامپایل در لحظه آن است. در این روش ، دقیقاً قبل از اجرا، بلوکهای کدهای بایتی که قرار است استفاده شوند را برای اجرای مستقیم روی سختافزار ترجمه میکند.
تاریخچه
پیشرفتهای اولیه
اولین زبان برنامهنویسی به قبل از رایانههای مدرن باز میگردد. قرن ۱۹ دستگاههای نساجی و متون نوازنده پیانو قابل برنامهنویسی داشت که امروزه به عنوان مثالهایی از زبانهای برنامهنویسی با حوزه مشخص شناخته میشوند. با شروع ، پانچ کارتها داده را کد گذاری کردند و پردازش مکانیکی را هدایت کردند. در دهه ۱۹۳۰ و ۱۹۴۰، صورت گرایی حساب لاندای آلونزو چرچ و مفاهیم ریاضی بیان الگوریتمها را فراهم کردند؛ حساب لاندا همچنان در طراحی زبان مؤثر است.
در دهه ۴۰، اولین رایانههای دیجیتال که توسط برق تغذیه میشدند ایجاد شدند. اولین طراحی شده برای کامپیوتر پلانکالکول بود، که بین سالهای ۱۹۴۵ و ۱۹۴۳ توسط کنراد زوس برای ز۳ آلمان طراحی شد.
کامپیوترهای اوایل ۱۹۵۰، بطور خاص ÜNIVAC ۱ و IBM ۷۰۱ از برنامههای زبان ماشین استفاده میکردند. برنامهنویسی زبان ماشین نسل اول توسط نسل دومی که نامیده میشوند جایگزین شد. در سالهای بعد دهه ۵۰، زبان برنامهنویسی اسمبلی، که برای استفاده از دستورات ماکرو تکامل یافته بود، توسط سه زبان برنامهنویسی سطح بالا دیگر: FORTRAN,LISP , COBOL مورد استفاده قرار گرفت. نسخههای به روز شده این برنامهها همچنان مورد استفاده قرار میگیرند، و هر کدام قویا توسعه زبانهای بعد را تحت تاثیر قرار دادند. در پایان دهه ۵۰ زبان algol ۶۰ معرفی شد، و بسیاری از زبانهای برنامهنویسی بعد، با ملاحظه بسیار، از نسل algol هستند. قالب و استفاده از زبانهای برنامهنویسی به شدت متاثر از محدودیتهای رابط بودند.
پالایش
دوره دهه ۶۰ تا اواخر دهه ۷۰ گسترش مثالهای عمده زبان پرکاربرد امروز را به همراه داشت. با این حال بسیاری از جنبههای آن ایدههای اولیه نسل سوم زبان برنامهنویسی بود:
- APL برنامهنویسی آرایهای را معرفی کرد و برنامهنویسی کاربردی را تحت تاثیر قرار داد.
- PL/i(NPL) دراوایل دهه ۶۰ طراحی شده بود تا ایدههای خوب فورترن و کوبول را بهم پیوند دهد.
- در دهه ۶۰، Simula اولین زبانی بود که را پشتیبانی میکرد، در اواسط دهه۷۰. Smalltalk به دنبال آن به
- C بین سالهای ۱۹۶۹ تا ۱۹۷۳ به عنوان زبان برنامهنویسی سیستمی طراحی شد و همچنان محبوب است.
- PASCAL و BASIC (که در ابنده به زبان معروف شد) در ابتدا یک زبان آموزشی بودند ولی بعدها با ارائه کامپایلرهای مختلف آن کاربردی شدند.
- LISP از جمله زبانهایی بود که براساس پردازش لیستها کار میکرد و برای الگوریتمهای مناسب بود.
- Prolog، طراحی شده در ۱۹۷۲، اولین زبان بود؛ که برای الگوریتمهای هوش مصنوعی مناسب بود.
- در ۱۹۷۸ ML سیستم نوع چند ریخت روی لیسپ ایجاد کرد، و در زبانهای برنامهنویسی کاربردی ایستا نوع گذاری شده پیشگام شد.
دهههای ۶۰ و ۷۰ مناقشات بسیاری روی به خود دیدند، و اینکه آیا زبانهای برنامهنویسی باید طوری طراحی شوند که آنها را پشتیبانی کنند.
«ادسگر دیکسترا» در نامهای معروف در ۱۹۶۸ که در ارتباطات ACM منتشر شد، استدلال کرد که دستورgoto باید از تمام زبانهای سطح بالا حذف شود.
در دهههای ۶۰ و ۷۰ توسعهٔ تکنیکهایی صورت گرفت که اثر یک برنامه را کاهش میداد و در عین حال برنامه نویس و کاربر را بهبود بخشید. دسته کارت برای ۴GL اولیه بسیار کوچکتر از برنامهٔ هم سطح بود که با ۳GL deck نوشته شده بود.
یکپارچگی و رشد
دهه ۸۰ سالهای یکپارچگی نسبی بود. C++ برنامهنویسی شئ گرا و برنامهنویسی سیستمی را ترکیب کرده بود. ایدا (زبان برنامهنویسی سیستمی که بیشتر برای استفاده توسط پیمان کاران دفاعی بود) را استاندارد سازی کرد. در ژاپن و جاهای دیگر، هزینههای گزافی صرف تحقیق در مورد زبان نسل پنجم میشد که دارای ساختارهای برنامهنویسی منطقی بود. انجمن زبان کاربردی به سمت استانداردسازی ML و Lisp حرکت کرد. به جای ایجاد مثالهای جدید، تمام این تلاشها ایدههایی که در دهههای قبل حلق شده بودند را بهتر کرد.
یک گرایش مهم در طراحی زبان در دهه ۸۰ تمرکز بیشتر روی برنامهنویسی برای سیستمهای بزرگ از طریق مدولها، و یا واحدهای کدهای سازمانی بزرگ مقیاس بود. مدول-۲، ایدا؛ و ML همگی سیستمهای مدولی برجستهای را در دهه ۸۰ توسعه دادند. با وجود اینکه زبانهای دیگر، مثل PL/i، پشتیبانی بسیار خوبی برای برنامهنویسی مدولی داشتند. سیستمهای مدولی غالباً با ساختارهای برنامهنویسی عام همراه شدهاند.
رشد سریع اینترنت در میانه دهه ۹۰ فرصتهای ایجاد زبانهای جدید را فراهم کرد. Perl، در اصل یک ابزار نوشتن یونیکس بود که اولین بار در سال ۱۹۸۷ منتشر شد، در وبگاههای دینامیک متداول شد. جاوا برای برنامهنویسی جنب سروری مورد استفاده قرار گرفت. این توسعهها اساساً نو نبودند، بلکه بیشتر بهینهسازی شده زبان و مثالهای موجود بودند، و بیشتر بر اساس خانواده زبان برنامهنویسی C بودند. پیشرفت زبان برنامهنویسی همچنان ادامه پیدا میکند، هم در تحقیقات و هم در صنعت. جهتهای فعلی شامل امنیت و وارسی است، گونههای جدید مدولی(mixin، نمایندهها، جنبهها) و تجمع .
۴GLها نمونهای از زبانهایی هستند که محدوده استفاده آنها مشخص است، مثل SQL. که به جای اینکه دادههای اسکالر را برگردانند، مجموعههایی را تغییر داده و بر میگردانند که برای اکثر زبانها متعارفند. Perl برای مثال، با «مدرک اینجا» خود میتواند چندین برنامه ۴GL را نگه دارد، مانند چند برنامه جاوا سکریبت، در قسمتی از کد پرل خود و برای پشتیبانی از چندین زبان برنامهنویسی با تناسب متغیر در «مدرک اینجا» استفاده کند.
سنجش استفاده از زبان
مشکل است که مشخص کنیم کدام زبان برنامهنویسی بیشتر مورد استفادهاست، و اینکه کاربرد چه معنی میدهد با توجه به زمینه تغییر میکند. یک زبان ممکن است زمان بیشتری از برنامه نویس بگیرد، زبان دیگر ممکن است خطوط بیشتری داشته باشد، و دیگری ممکن است زمان بیشتری از پردازنده را مصرف کند. برخی زبانها برای کاربردهای خاص بسیار محبوبند. برای مثال: کوبول همچنان در مراکزداده متحد، غالباً روی کامپیوترهای بزرگ توانا است؛ fortran در مهندسی برنامههای کاربردی، C در برنامههای تعبیه شده و سیستمهای عامل؛ و بقیه برنامهها معمولاً برای نوشتن انواع دیگر برنامهها کاربرد دارند. روشهای مختلفی برای سنجش محبوبیت زبانها، هر یک متناسب یا یک ویژگی محوری متفاوت پیشنهاد شدهاست:
- شمارش تعداد تبلیغات شغلی که از آن زبان نام میبرند.
- تعداد کتابهای آموزشی و شرح دهندهٔ آن زبان که فروش رفتهاست.
- تخمین تعداد خطوطی که در آن زبان نوشته شدهاند- که ممکن است زبانهایی را که در جستجوها کمتر پیدا میشوند دست کم گرفته شوند.
- شمارش ارجاعهای زبان (برای مثال، به اسم زبان) در موتورهای جستجوهای اینترنت.
این حقیقت که این دستهبندی ممکن است در راستای محورهای مختلف انجام شوند، این وظیفه را پیچیده تر میکند؛ برای مثال، جاوا هم یک زبان شیءگرا (چون به تشویق میکند) و زبان همزمان (چون ساختارهای داخلی برای اجرای چندین جریان موازی دارد) است. پایتون یک زبان اسکریپتی شیءگراست.
در نگاه کلی، زبانهای برنامهنویسی به مثالهای برنامهنویسی و یک دستهبندی بر اساس محدوده استفاده تقسیم میشوند. مثالها شامل ، برنامهنویسی شیءگرا، برنامهنویسی کاربردی، وبرنامهنویسی منطقی؛ برخی زبانها ترکیب چند مثالند. یک زبان اسمبلی مثالی از یک مدل مستقیم متضمن معماری ماشین نیست. با توجه به هدف، زبانهای برنامهنویسی ممکن است همه منظوره باشند، زبانهای برنامهنویسی سیستمی، زبانهای اسکریپتی، زبانهای محدوده مشخص، زبانهای همزمان/ گسترده (و یا ترکیب اینها). برخی زبانهای همه منظوره تا حد زیادی برای اهداف آموزشی طراحی شدهاند.
یک زبان برنامهنویسی ممکن است با فاکتورهای غیر مرتبط به مثالهای برنامهنویسی دستهبندی شود. برای مثال، غالب زبانهای برنامهنویسی کلمات کلیدی را استفاده میکنند، در حالیکه تعداد کمی این کار را نمیکنند. سایر زبانها ممکن است براساس داخلی دستهبندی شوند.
منبع : ویکی پدیا