شناسه (زبان‌های کامپیوتری)

در زبان‌های برنامه‌نویسی کامپیوتر، یک **شناسه** توکن لغوی است (نماد نیز نامیده می‌شود، اما نباید با نماد نوع داده اولیه اشتباه گرفته شود) که موجودیت‌های زبان را نام‌گذاری می‌کند. برخی از انواع موجودیت‌هایی که یک شناسه ممکن است نشان دهد شامل متغیرها، انواع داده‌ها، برچسب‌ها، زیرروال‌ها و ماژول‌ها می‌شود.

## فرم لغوی
اینکه کدام توالی از کاراکترها شناسه‌ها را تشکیل می‌دهد، به دستور لغوی زبان بستگی دارد. یک قانون رایج، دنباله‌های حرفی عددی است، که استفاده از زیرخط نیز در آن مجاز است (در برخی زبان‌ها، _ مجاز نیست)، و این شرط را هم دارد که نمی‌تواند با یک رقم شروع شود (برای ساده‌تر کردن واژگان با اجتناب از اشتباه گرفتن با لفظ اعداد صحیح) – پس `foo, foo1, foo_bar, _foo` مجاز هستند، اما `1foo` نیست - این تعریفی است که در نسخه‌های قبلی C و C++، Python و بسیاری از زبان‌های دیگر استفاده می‌شود. نسخه‌های بعدی این زبان‌ها، همراه با بسیاری از زبان‌های مدرن دیگر، از کاراکترهای یونیکد بیشتری در یک شناسه پشتیبانی می‌کنند. با این حال، یک محدودیت رایج اجازه ندادن کاراکترهای فضای خالی و عملگرهای زبان است. این کار توکن‌سازی را با مستقل از فرم و مستقل از متن کردن ساده می‌کند. به عنوان مثال، منع `+` در شناسه‌ها به دلیل استفاده از آن به عنوان یک عملیات باینری به این معنی است که `a+b` و `a + b` می‌توانند به‌طور یکسان تبدیل به توکن بشوند، در حالی که اگر `+` مجاز بود، `a+b` به‌جای جمع، یک شناسه محسوب می‌شد. فضای سفید در شناسه به ویژه مشکل‌ساز می‌شود، زیرا اگر فاصله در شناسه‌ها مجاز باشد، عبارتی مانند `if rainy day then 1`  با `rainy day` به عنوان یک شناسه، قانونی است درحالی که نشانه‌گذاری آن مستلزم بافت عبارتی بودن در شرط if است. با این حال برخی از زبان‌ها فاصله‌ها را در شناسه‌ها مجاز می‌شمارند، مانند ALGOL 68 و برخی از انواع ALGOL - برای مثال، این عبارت معتبر است: `;'''real''' half pi` که می‌تواند به عنوان `;real. half pi` وارد شود (کلمات کلیدی به صورت پررنگ، مشخصا از طریق stropping نشان داده می‌شوند). در ALGOL این امکان‌پذیر بود زیرا کلمات کلیدی از نظر نحوی متمایز می‌شوند، بنابراین خطر برخورد یا ابهام وجود ندارد، فضاها در فاز بازسازی خط حذف می‌شوند و منبع از طریق تجزیه بدون اسکنر پردازش می‌شود، بنابراین واژگان می‌تواند حساس به متن باشند.

در بیشتر زبان‌ها، برخی از دنباله‌های کاراکتر شکل لغوی یک شناسه را دارند، اما به عنوان کلمات کلیدی شناخته می‌شوند - برای مثال، `if` اغلب یک کلمه کلیدی برای یک جمله شرطی if است، اما از نظر لغوی به همان شکل `ig` یا `foo` یعنی دنباله‌ای از حروف است. این همپوشانی می‌تواند به روش‌های مختلفی مدیریت شود: ممکن است آن‌ها از شناسه بودن منع شوند- که نشانه‌سازی (توکن سازی) و تجزیه را ساده می‌کند - در این صورت آن‌ها کلمات رزرو شده هستند؛ هر دوی آنها ممکن است مجاز باشند، اما از راه‌های دیگر، مثلاً از طریق stropping، متمایز شوند؛ یا توالی کلمات کلیدی ممکن است به عنوان شناسه مجاز باشند و از طریق معنا از متن تعیین شوند، که در این صورت به یک واژگان حساس به زمینه نیاز است. کلمات غیرکلیدی نیز، به ویژه برای سازگاری پیشرو، ممکن است کلمات رزرو شده (ممنوع به عنوان شناسه) باشند و این به این دلیل است که ممکن است یک کلمه در آینده تبدیل به یک کلمه کلیدی شود. در چند زبان، به عنوان مثال PL/1، این تمایز روشن نیست.

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

برای پیاده‌سازی زبان‌های برنامه‌نویسی که از کامپایلر استفاده می‌کنند، شناسه‌ها اغلب فقط موجودیت‌های زمان کامپایل هستند. این به این معنی است که در زمان اجرا، برنامه کامپایل شده به جای توکن‌های شناسه متنی، ارجاعاتی به آدرس‌ها و آفست‌های حافظه دارد (این آدرس‌های حافظه یا آفست‌ها توسط کامپایلر به هر شناسه اختصاص داده شده‌اند).

در زبان‌هایی که از بازتاب پشتیبانی می‌کنند، مانند ارزیابی تعاملی کد منبع (با استفاده از یک مفسر یا یک کامپایلر افزایشی)، شناسه‌ها نیز موجودیت‌های زمان اجرا هستند که گاهی اوقات حتی به عنوان اشیاء درجه یک هستند که می‌توانند آزادانه دستکاری و ارزیابی شوند. در Lisp به این نمادها می‌گویند.

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

در برخی از زبان‌ها مانند Go، منحصربه‌فرد بودن شناسه‌ها بر اساس املا و نمایان بودن آن‌ها است.

در HTML یک شناسه یکی از ویژگی‌های احتمالی عنصر HTML است که در داخل سند (document) منحصر به فرد است.

## منابع

رده:عناصر نحوی
رده:فراداده
رده:مفاهیم زبان برنامه‌نویسی
رده:شناساگرها