زبان برنامه‌نویسی: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
جز جزئی
خط ۱۱:
* نسل پنج زبانهایی مانند prolog , ops5 - تمرکز بر [[حل مسئله]] و استفاده از الگوریتمهای نوشته شده توسط برنامه‌نویس
 
یک زبان برنامه‌نویسی یک [[زبان مصنوعی]] است که برای بیان محاسباتی که توسط یک ماشین (مخصوصا رایانه) قابل انجام است، طراحی شده‌است. زبان‌های برنامه‌نویسی برای ایجاد برنامه‌هایی به کار می‌روند که رفتار یک ماشین را مشخص می‌کنند، الگوریتم دقیق را بیان می‌کنند، و یا روشی برای ارتباط انسانند.
بسیاری از زبان‌های برنامه‌نویسی تعدادی قالب از ویژگی‌های نوشته شده دستوری(syntax) و معناشناسی (semantics) دارند، چرا که رایانه‌ها دستورهای دقیقاً مشخص نیاز دارند. برخی توسط سند خصوصیات (specification document) تعیین شده‌اند. (برای مثال یک استاندارد ISO)، در حالی که برخی دیگر دارای پیاده‌سازی غالبی می‌باشند. (مانند Perl)
اولین زبان برنامه‌نویسی به قبل از اختراع رایانه بازمی‌گردد، و برای هدایت رفتار ماشین‌هایی مانند دستگاه‌های نساجی اتوماتیک و نوازنده‌های پیانو به کار می‌رفت.
خط ۳۶:
== تعاریف ==
ویژگی‌هایی که غالباً برای تشکیل یک زبان برنامه‌نویسی مهم شمرده می‌شوند:
* تابع :یک زبان برنامه‌نویسی، زبانی است که برای نوشتن برنامه‌های رایانه‌ای به کار می‌رود که رایانه‌ای را برای انجام محاسبات یا اجرای الگوریتم و یا احتمالاً کنترل دستگاه‌های خارجی مثل چاپگر، ربات و… درگیر می‌کنند.
* هدف: زبان‌های برنامه‌نویسی با [[زبان‌های طبیعی]] تفاوت دارند و آن اینکه زبان‌های طبیعی فقط برای فعل و انفعالات بین مردم به کار می‌روند، در حالیکه زبان‌های برنامه‌نویسی همچنین به انسانها اجازه می‌دهد که از طریق دستورهای با ماشین‌ها ارتباط برقرار کنند. برخی زبان‌های برنامه‌نویسی بوسیله یک دستگاه استفاده می‌شوند تا دستگاه دیگری را کنترل کند. برای مثال برنامه‌های پست اسکریپت(post script) غالباً توسط برنامه دیگری برای کنترل یک چاپگر و یا نمایشگر ایجاد می‌شوند.
* ساختارها: زبان‌های برنامه‌نویسی ممکن است ساختارهایی برای تعریف و تغییر [[داده ساختارها]] یا کنترل جریان اجرا داشته باشند.
* توان بیانگر: [[نظریه محاسبات]]، زبان‌ها را بوسیله محاسباتی که توان بیان آنها را دارند [[طبقه‌بندی]] می‌کند. تمام زبان‌های «کامل تورینگ» می‌توانند مجموعه یکسانی از الگوریتم‌ها را پیاده‌سازی کنند.ANSI/ISO SQL و Charity مثال‌هایی هستند از زبان‌هایی که کامل تورینگ نیستند، ولی غالباً زبان برنامه‌نویسی نامیده می‌شوند.
خط ۵۱:
* توانایی برنامه‌نویس‌ها: از تازه‌کارهایی که بیش از هر چیز به سادگی نیاز دارند تا حرفه‌ای‌هایی که با پیچیدگی قابل توجهی کنار می‌آیند.
* برنامه‌ها باید سرعت، اندازه و سادگی را بسته به سیستم‌ها از ریزپردازنده‌ها تا ابر رایانه‌ها متناسب نگه دارند.
* برنامه‌ها ممکن است یک بار نوشته شوند و تا نسل‌ها تغییر نکنند، و یا ممکن است پیوسته اصلاح شوند.
* در نهایت، برنامه‌نویس‌ها ممکن است در علایق متفاوت باشند: آنها ممکن است به بیان مسائل با زبانی خاص خو گرفته باشند.
 
خط ۷۳:
list ::= '(' expression* ')'
این گرامر موارد ذیل را مشخص می‌کند:
* یک عبارت یا atom است و یا یک لیست
* یک atom یا یک عدد است و یا یک سمبل
* یک عدد دنباله ناشکسته‌ای از یک یا تعداد بیشتری اعداد دهدهی است، که یک علامت مثبت و یا منفی می‌تواند پیش از آن بیاید.
* یک سمبل حرفی است که بعد از هیچ یا تعدادی کاراکتر (جز فاصله) می‌آید.
* یک لیست تعدادی پرانتز است که می‌تواند صفر یا چند عبارت در خود داشته باشد.
"۱۲۳۴۵"، "()"، "(a b c۲۳۲ (۱))" مثال‌هایی هستند از دنباله‌های خوش فرم در این گرامر.
 
همه برنامه‌هایی که از لحاظ دستوری درست هستند، از نظر معنا درست نیستند. بسیاری از برنامه‌های درست دستوری، بد فرم اند، با توجه به قوانین زبان؛ و ممکن است (بسته به خصوصیات زبان و درست بودن پیاده‌سازی) به خطای ترجمه و یا استثنا(exception) منتج شود.
در برخی موارد، چنین برنامه‌هایی ممکن است رفتار نامشخصی از خود نشان دهند. حتی اگر یک برنامه در یک زبان به خوبی بیان شده باشد، ممکن است دقیقاً مطلوب نویسنده آن نبوده باشد.
 
به عنوان مثال در زبان طبیعی، ممکن نیست به برخی از جملات درست از لحاظ گرامری، معنای خاصی اطلاق کرد و یا ممکن است جمله نادرست باشد:
* «ایده‌های بی [[رنگ سبز]] با خشم می‌خوابند.» از نظر دستوری خوش فرم است ولی معنای مورد قبولی ندارد.
* «جان یک مجرد متأهل است.» از نظر دستوری درست است، ولی معنایی را بیان می‌کند که نمی‌تواند درست باشد.
خط ۹۳:
 
=== معناشناسی ایستا ===
معناشناسی ایستا محدودیت‌هایی بر روی ساختار مجاز متن‌ها تعیین می‌کند که بیان آنها در فرمول دستوری استاندارد مشکل و یا غیرممکن است. مهمترین این محدودیت‌ها به وسیله [[سیستم نوع]] گذاری انجام می‌شود.
 
=== سیستم نوع گذاری ===
خط ۱۰۰:
==== زبان‌های نوع گذاری شده و بدون نوع گذاری ====
یک زبان نوع گذاری شده‌است اگر مشخصات هر عملیات، نوع داده‌های قابل اجرا توسط آن را با نشان دادن نوع‌هایی که برای آنها قابل اجرا نیست، تعیین کند. برای مثال، «این متن درون گیومه قرار دارد» یک رشته‌است. در غالب زبان‌های برنامه‌نویسی، تقسیم یک رشته با یک عدد معنایی ندارد. در نتیجه غالب زبان‌های برنامه‌نویسی مدرن ممکن است اجرای این عملیات را توسط برنامه‌ها رد کنند. در برخی زبان‌ها، عبارات بی‌معنی ممکن است هنگام ترجمه(compile) پیدا شود (چک کننده نوع ایستا)، و توسط کامپایلر رد شود، در حالی که در سایر برنامه‌ها، هنگام اجرا پیدا شود. (چک کننده نوع دینامیک) که به استثنای در حال اجرا منتج شود(runtime exception).
حالت خاص زبان‌های نوع دار زبان‌های تک نوعند. این زبان‌ها غالباً اسکریپتی و یا مارک آپ هستند، مانند rexx وSGML و فقط یک داده گونه دارند—غالباً رشته‌های کاراکتری که هم برای داده‌های عددی و هم برای داده‌های سمبلی کاربرد دارند.
در مقابل، یک زبان بدون نوع گذاری، مثل اکثر زبان‌های اسمبلی، این امکان را می‌دهد که هر عملیاتی روی هر داده‌ای انجام شود، که معمولاً دنباله‌ای از بیت‌ها با طول‌های متفاوت در نظر گرفته می‌شوند. زبان‌های سطح بالا که بی نوع هستند شامل زبان‌های ساده رایانه‌ای و برخی از انواع زبان‌های نسل چهارم.
 
خط ۱۱۳:
نوع گذاری ضعیف این امکان را ایجاد می‌کند که با متغیری به جای متغیری دیگر برخورد شود، برای مثال رفتار با یک رشته به عنوان یک عدد. این ویژگی بعضی اوقات ممکن است مفید باشد، اما ممکن است باعث ایجاد برخی مشکلات برنامه شود که موقع کامپایل و حتی اجرا پنهان بمانند.
 
نوع گذاری قوی مانع رخ دادن مشکل فوق می‌شود. تلاش برای انجام عملیات روی نوع نادرست متغیر منجر به رخ دادن خطا می‌شود. زبان‌هایی که نوع گذاری قوی دارند غالباً با نام «نوع-امن» و یا امن شناخته می‌شوند.
تمام تعاریف جایگزین برای «ضعیف نوع گذاری شده» به زبان‌ها اشاره می‌کند، مثل perl, JavaScript, C++، که اجازه تعداد زیادی تبدیل نوع داخلی را می‌دهند. در جاوااسکریپت، برای مثال، عبارت ۲*x به صورت ضمنی x را به عدد تبدیل می‌کند، و این تبدیل موفقیت آمیز خواهد بود حتی اگر x خالی، تعریف نشده، یک آرایه، و یا رشته‌ای از حروف باشد. چنین تبدیلات ضمنی غالباً مفیدند، اما خطاهای برنامه‌نویسی را پنهان می‌کنند.
 
قوی و ایستا در حال حاضر عموماً دو مفهوم متعامد فرض می‌شوند، اما استفاده در ادبیات تفاوت دارد، برخی عبارت «قوی نوع گذاری شده» را به کار می‌برند و منظورشان قوی، ایستایی نوع گذاری شده‌است، و یا، حتی گیچ کننده تر، منظورشان همان ایستایی نوع گذاری شده‌است؛ بنابراین C هم قوی نوع گذاری شده و هم ضعیف و ایستایی نوع گذاری شده نامیده می‌شود.
خط ۱۲۱:
وقتی که داده مشخص شد، ماشین باید هدایت شود تا عملیات‌ها را روی داده انجام دهد. معناشناسی اجرا ی یک زبان تعیین می‌کند که چگونه و چه زمانی ساختارهای گوناگون یک زبان باید رفتار برنامه را ایجاد کنند.
 
برای مثال، معناشناسی ممکن است استراتژی را که به وسیله آن عبارات ارزیابی می‌شوند را تعریف کند و یا حالتی را که ساختارهای کنترلی تحت شرایطی دستورها را اجرا می‌کنند.
 
=== کتابخانه هسته ===
خط ۱۴۱:
پیاده‌سازی یک زبان برنامه‌نویسی امکان اجرای آن برنامه را روی پیکربندی مشخصی از سخت‌افزار و نرم‌افزار را فراهم می‌کند. بطور وسیع، دو راه رسیدن به پیاده‌سازی زبان برنامه‌نویسی وجود دارد. کامپایل کردن و تفسیر کردن. بطور کلی با هر بک از ابن دو روش می‌توان یک زبان را پیاده‌سازی کرد.
 
خروجی یک کامپایلر ممکن است با سخت‌افزار و یا برنامه‌ای به نام مفسر اجرا شود. در برخی پیاده‌سازی‌ها که از مفسر استفاده می‌شود، مرز مشخصی بین کامپایل و تفسیر وجود ندارد. برای مثال، برخی پیاده‌سازی‌های زبان برنامه‌نویسی بیسیک کامپایل می‌کنند و سپس کد را خط به خط اجرا می‌کنند.
 
برنامه‌هایی که مستقیماً روی سخت‌افزار اجرا می‌شوند چندین برابر سریعتر از برنامه‌هایی که با کمک نرم‌افزار اجرا می‌شوند، انجام می‌شوند.
خط ۱۷۸:
دهه ۸۰ سال‌های یکپارچگی نسبی بود. C++ برنامه‌نویسی شئ گرا و برنامه‌نویسی سیستمی را ترکیب کرده بود. [[ایالات متحده]] ایدا (زبان برنامه‌نویسی سیستمی که بیشتر برای استفاده توسط پیمان کاران دفاعی بود) را استاندارد سازی کرد. در ژاپن و جاهای دیگر، هزینه‌های گزافی صرف تحقیق در مورد زبان نسل پنجم می‌شد که دارای ساختارهای برنامه‌نویسی منطقی بود. انجمن زبان کاربردی به سمت استانداردسازی ML و Lisp حرکت کرد. به جای ایجاد مثال‌های جدید، تمام این تلاش‌ها ایده‌هایی که در دهه‌های قبل حلق شده بودند را بهتر کرد.
 
یک گرایش مهم در طراحی زبان در دهه ۸۰ تمرکز بیشتر روی برنامه‌نویسی برای سیستم‌های بزرگ از طریق مدول‌ها، و یا واحدهای کدهای سازمانی بزرگ مقیاس بود. مدول-۲، ایدا؛ و ML همگی سیستم‌های مدولی برجسته‌ای را در دهه ۸۰ توسعه دادند. با وجود اینکه زبان‌های دیگر، مثل PL/i، پشتیبانی بسیار خوبی برای برنامه‌نویسی مدولی داشتند. سیستم‌های مدولی غالباً با ساختارهای برنامه‌نویسی عام همراه شده‌اند.
 
رشد سریع اینترنت در میانه دهه ۹۰ فرصت‌های ایجاد زبان‌های جدید را فراهم کرد. Perl، در اصل یک ابزار نوشتن یونیکس بود که اولین بار در سال ۱۹۸۷ منتشر شد، در وب‌گاه‌های دینامیک متداول شد. جاوا برای برنامه‌نویسی جنب سروری مورد استفاده قرار گرفت. این توسعه‌ها اساساً نو نبودند، بلکه بیشتر بهینه‌سازی شده زبان و مثال‌های موجود بودند، و بیشتر بر اساس خانواده زبان برنامه‌نویسی C بودند.