مشخصات زبان برنامه‌نویسی

در برنامه نویسی کامپیوتر ، **مشخصات زبان برنامه نویسی** (یا **استاندارد** یا **تعریف** ) یک مصنوع مستندسازی است که یک زبان برنامه نویسی را تعریف می کند تا کاربران و مجریان بتوانند در مورد معنای برنامه های آن زبان توافق کنند. مشخصات معمولاً جزئی و رسمی هستند و عمدتاً توسط مجریان استفاده می‌شوند و کاربران در صورت ابهام به آنها مراجعه می‌کنند. برای مثال، به دلیل پیچیدگی، مشخصات C++ اغلب توسط کاربران ذکر شده است. اسناد مرتبط شامل یک مرجع زبان برنامه نویسی است که به صراحت برای کاربران در نظر گرفته شده است، و یک منطق زبان برنامه نویسی، که توضیح می دهد که چرا مشخصات همانطور که هست نوشته شده است. اینها معمولاً غیر رسمی تر از مشخصات هستند.

## استانداردسازی
همه زبان‌های برنامه‌نویسی اصلی دارای مشخصات نیستند و زبان‌ها می‌توانند برای چندین دهه بدون مشخصه وجود داشته باشند و محبوب باشند. یک زبان ممکن است یک یا چند پیاده سازی داشته باشد که رفتار آنها به عنوان یک استاندارد *عملی* عمل می کند، بدون اینکه این رفتار در یک مشخصات مستند شده باشد. Perl (از طریق Perl 5 ) نمونه قابل توجهی از زبان بدون مشخصات است، در حالی که PHP تنها در سال 2014 و پس از 20 سال استفاده مشخص شد.  یک زبان ممکن است پیاده سازی شود و سپس مشخص شود، یا مشخص شود و سپس اجرا شود، یا اینها ممکن است با هم توسعه یابند، که امروزه معمول است. این به این دلیل است که پیاده‌سازی‌ها و مشخصات بررسی‌هایی را روی یکدیگر ارائه می‌کنند: نوشتن یک مشخصات مستلزم بیان دقیق رفتار یک پیاده‌سازی است و پیاده‌سازی بررسی می‌کند که یک مشخصه ممکن، عملی و سازگار است. از ALGOL 68 (1968) تا حد زیادی از نوشتن مشخصات قبل از پیاده سازی به دلیل مشکلات غیرمنتظره در پیاده سازی زمانی که پیاده سازی به تعویق افتاده است اجتناب شده است. با این حال، زبان‌ها هنوز هم گاهی اوقات پیاده‌سازی می‌شوند و بدون مشخصات رسمی محبوبیت پیدا می‌کنند: یک پیاده‌سازی برای استفاده ضروری است، در حالی که یک ویژگی مطلوب است اما ضروری نیست (به طور غیررسمی، "گفتگوهای کد").

## فرم ها
مشخصات زبان برنامه نویسی می تواند اشکال مختلفی داشته باشد، از جمله:

* تعریفی صریح از نحو و معناشناسی زبان. در حالی که نحو معمولاً با استفاده از یک دستور زبان رسمی مشخص می شود، تعاریف معنایی ممکن است به زبان طبیعی (مثلاً رویکرد اتخاذ شده برای زبان C ) یا یک معناشناسی رسمی (مثلاً مشخصات استاندارد ML  و Scheme  ) نوشته شود. یک مثال قابل توجه زبان C است که بدون مشخصات رسمی محبوبیت پیدا کرد، در عوض به عنوان بخشی از یک کتاب، *[[زبان برنامه‌نویسی سی (کتاب)|زبان برنامه نویسی C]]* (1978) توصیف شد، و خیلی بعد به طور رسمی در ANSI C (1989) استاندارد شد.
* توصیفی از رفتار یک کامپایلر (که گاهی اوقات "مترجم" نامیده می شود) برای زبان (به عنوان مثال، زبان C++ و Fortran ). نحو و معنای زبان باید از این توصیف استنتاج شود، که ممکن است به زبان طبیعی یا رسمی نوشته شود.
* پیاده سازی ''مدل'' ، که گاهی اوقات به زبانی که مشخص می شود نوشته می شود (به عنوان مثال، Prolog ). نحو و معنای زبان در رفتار پیاده سازی مدل صریح است.

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

* مجموعه کاراکترهای خاص (مجموعه نمادهای غیر خالی و محدود)
* عبارات منظم که واژگان آن را توصیف می کند (برای نشانه گذاری بر اساس الفبا)
* یک دستور زبان بدون متن که نحوه ترکیب واژگان را برای ایجاد یک برنامه صحیح توضیح می دهد.

مشخصات نحو به طور کلی توصیف زبان طبیعی را به منظور ارائه درک متوسط فرض می کند. با این حال، نمایش رسمی مؤلفه های ذکر شده در بالا معمولاً بخشی از بخش است زیرا به نفع اجرا و تأیید زبان و مفاهیم آن است.

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

* **[[زبان طبیعی]]** : توصیف توسط زبان طبیعی انسان.
* **[[معنی‌شناسی (علوم رایانه)|معناشناسی صوری]]** : توصیف توسط ریاضیات .
* **[[Reference implementation|پیاده سازی مرجع]]** : شرح توسط برنامه کامپیوتری .
* **[[Test suite|مجموعه تست]]** : شرح با مثال هایی از برنامه ها و رفتارهای مورد انتظار آنها. در حالی که تعداد کمی از مشخصات زبان به این شکل شروع می شوند، تکامل برخی از مشخصات زبان تحت تأثیر معنایی یک مجموعه آزمایشی قرار گرفته است (به عنوان مثال، در گذشته مشخصات Ada برای مطابقت با رفتار مجموعه آزمون ارزیابی انطباق Ada اصلاح شده است).

## زبان طبیعی
بیشتر زبان‌های پرکاربرد با استفاده از توصیف‌های زبان طبیعی از معناشناسی آنها مشخص می‌شوند. این توصیف معمولاً به شکل یک *کتابچه راهنمای مرجع* برای زبان است. این راهنماها می توانند تا صدها صفحه اجرا شوند. به عنوان مثال، نسخه چاپی *مشخصات زبان جاوا، ویرایش سوم.* 596 صفحه می باشد. 

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

## معناشناسی رسمی
معناشناسی رسمی بر پایه ریاضیات است. در نتیجه، می‌توانند دقیق‌تر و کمتر از معناشناسی ارائه شده در زبان طبیعی باشند. با این حال، توضیحات تکمیلی زبان طبیعی از معناشناسی اغلب برای کمک به درک تعاریف رسمی گنجانده شده است. به عنوان مثال، استاندارد ISO برای Modula-2 شامل تعریف زبان رسمی و طبیعی در صفحات مخالف است.

زبان های برنامه نویسی که معنایی آنها به طور رسمی توضیح داده می شود می توانند از مزایای بسیاری برخوردار شوند. به عنوان مثال:

* معناشناسی رسمی، اثبات ریاضی صحت برنامه را امکان پذیر می کند.
* معناشناسی رسمی طراحی سیستم های نوع و اثبات درستی آن نوع سیستم ها را تسهیل می کند.
* معناشناسی رسمی می تواند استانداردهای یکسان و بدون ابهام را برای پیاده سازی یک زبان ایجاد کند.

پشتیبانی خودکار ابزار می تواند به درک برخی از این مزایا کمک کند. برای مثال، یک اثبات‌کننده یا بررسی‌کننده قضیه خودکار می‌تواند اعتماد برنامه‌نویس (یا طراح زبان) را نسبت به صحت اثبات‌های مربوط به برنامه‌ها (یا خود زبان) افزایش دهد. قدرت و مقیاس پذیری این ابزارها بسیار متفاوت است: تأیید رسمی کامل از نظر محاسباتی فشرده است، به ندرت فراتر از برنامه های حاوی چند صد خط است. و ممکن است به کمک دستی قابل توجهی از یک برنامه نویس نیاز داشته باشد. ابزارهای سبک‌تر مانند بررسی‌کننده‌های مدل به منابع کمتری نیاز دارند و در برنامه‌های حاوی ده‌ها هزار خط استفاده شده‌اند. بسیاری از کامپایلرها چک های نوع استاتیک را برای هر برنامه ای که کامپایل می کنند اعمال می کنند.

## پیاده سازی مرجع
پیاده سازی مرجع یک پیاده سازی واحد از یک زبان برنامه نویسی است که به عنوان معتبر تعیین شده است. رفتار این پیاده سازی برای تعریف رفتار مناسب یک برنامه نوشته شده در زبان برگزار می شود. این رویکرد دارای چندین ویژگی جذاب است. اولاً، دقیق است و نیازی به تفسیر انسانی ندارد: اختلافات مربوط به معنای یک برنامه را می توان به سادگی با اجرای برنامه در اجرای مرجع حل و فصل کرد (به شرطی که اجرا برای آن برنامه رفتار قطعی داشته باشد).

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

با این وجود، چندین زبان با موفقیت از رویکرد پیاده سازی مرجع استفاده کرده اند. به عنوان مثال، مفسر Perl برای تعریف رفتار معتبر برنامه های Perl در نظر گرفته می شود. در مورد Perl، مدل منبع باز توزیع نرم‌افزار به این واقعیت کمک کرده است که هیچ‌کس تا به حال پیاده‌سازی دیگری از زبان را تولید نکرده است، بنابراین مسائل مربوط به استفاده از پیاده‌سازی مرجع برای تعریف معنایی زبان بحث‌انگیز است.

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

مزیت اصلی این رویکرد برای توصیف معنایی این است که به راحتی می توان تشخیص داد که آیا پیاده سازی زبان یک مجموعه آزمایشی را می گذراند یا خیر. کاربر می تواند به سادگی تمامی برنامه های مجموعه آزمایشی را اجرا کند و خروجی ها را با خروجی های مورد نظر مقایسه کند. با این حال، هنگامی که به تنهایی مورد استفاده قرار می گیرد، رویکرد مجموعه آزمایشی دارای اشکالات عمده ای نیز می باشد. به عنوان مثال، کاربران می خواهند برنامه های خود را اجرا کنند که بخشی از مجموعه آزمایشی نیستند. در واقع، پیاده سازی زبانی که *فقط* می تواند برنامه های مجموعه آزمایشی خود را اجرا کند، تا حد زیادی بی فایده خواهد بود. اما یک مجموعه آزمایشی به خودی خود توضیح نمی دهد که پیاده سازی زبان در هر برنامه ای که در مجموعه آزمایشی نیست چگونه باید عمل کند. تعیین آن رفتار مستلزم برون یابی از سوی اجراکننده است و اجراکننده های مختلف ممکن است مخالف باشند. علاوه بر این، مجموعه آزمایشی نمی‌تواند به راحتی رفتاری را که در نظر گرفته شده یا مجاز است غیرقطعی باشد، آزمایش کند.

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

## لینک های خارجی

### مشخصات زبان
چند نمونه از مشخصات زبان رسمی یا پیش نویس:

* مشخصات نوشته شده در درجه اول در ریاضیات رسمی:
** تعریف استاندارد ML، ویرایش اصلاح شده - یک تعریف رسمی در سبک معنایی عملیاتی
** طرح R5RS - یک تعریف رسمی در سبک معنایی معنایی
* مشخصات نوشته شده در درجه اول به زبان طبیعی:
** گزارش الگول 60
** راهنمای مرجع Ada 95
** مشخصات زبان جاوا
** پیش نویس استاندارد C++
* مشخصات از طریق مجموعه آزمایشی:
** مشخصه‌های جامعه محور روبی بالفعل

## یادداشت‌ها
رده:موضوعات مربوط به زبان‌های برنامه‌نویسی