قطع‌کردن (برنامه‌نویسی)

از ویکی‌پدیا، دانشنامهٔ آزاد

در طراحی زبان رایانه ای، قطع کردن(به انگلیسی: stropping) روشی است که توالی ای از حروف را به داشتن خاصیتی ویژه مانند واژه رزروشده، نوع خاصی از متغیر یا مکان حافظه علامت گذاری می‌کند و به این ترتیب فضای نام متفاوتی از اسم‌های معمولی (شناساگرها) خواهند داشت تا از مشابهت غلط آن‌ها جلوگیری شود. این روش در بیشتر زبان‌های مدرن استفاده نمی‌شود - به جای آن کلمات کلیدی، کلمات رزرو شده هستند و نمی‌توان به عنوان شناساگر از آن‌ها استفاده کرد. استروپینگ اجازه می‌دهد تا از همان دنباله حروف هم به عنوان کلمات کلیدی و هم به عنوان شناساگر استفاده کرد، و به این ترتیب عمل تجزیه را ساده‌تر می‌کند. برای مثال اجازه می‌دهد نام متغیری if باشد، بدون اینکه با کلمه کلیدی if تداخل داشته باشد. استروپینگ در درجه اول در دهه ۱۹۶۰ با الگول و زبانهای مرتبط همراه بود. اگرچه این روش استفاده‌های مدرن دارد، اما با سایر تکنیک‌های مشابه که از نظر ظاهری شباهت زیادی دارند، به راحتی اشتباه گرفته می‌شود.

تاریخچه[ویرایش]

روش قطع کردن در توسعه الگول در دهه ۱۹۶۰ پدید آمد که از آن برای تمایزهای تایپی مختلف (boldface و underline) استفاده می‌شد که در زبان نشر استفاده می‌شده‌است و نمی‌تواند مستقیماً در زبان سخت‌افزاری نشان داده شود. یک ماشین‌تحریر می‌تواند دارای نویسه‌های bold باشد، اما در مورد کدگذاری در کارت‌های پانچ، هیچ کاراکتر Boldای وجود ندارد. اصطلاح «قطع کردن» در الگول ۶۰، از اپاستروف به وجود آمد، زیرا برخی از پیاده سازیهای الگول ۶۰ از آپوستروف‌ها در اطراف متن استفاده می‌کردند تا نشان دهندهٔ مهم بودن آن باشند.[۱] برای مثال 'if' نشان دهندهٔ کلمهٔ کلیدی «اگر» است. این روش در الگول۶۸ نیز بسیار مهم است، که در آن روش‌های مختلف بریدن، معروف به رژیم‌های بریدن(stropping regimes)، استفاده شده‌است. آپاستروف‌های اصلی الگول ۶۰ به‌طور گسترده مورد استفاده قرار نگرفت در صورتی که حروف بزرگ بیش‌تر رایج بود.[۲] مانند .IF و IF که روش بریدن برای همهٔ این‌ها اعمال می‌شود.

دستور زبان[ویرایش]

گسترهٔ وسیعی از دستور زبان‌های مختلف برای قطع کردن استفاده شده‌است:

  • در الگول ۶۰ به صورت رایج از دو علامت نقل و قول در دو طرف کلمهٔ مخصوص استفاده می‌شد. به‌طور کلی به خاطر اسم آپاستروف‌ها به «بریدن» مشهور شدند (همان‌طور که در تاریخچه اشاره‌ای به آن شد. (به عنوان مثال 'BEGIN' یا ‘BEGIN’).
  • در الگول۶۸[۲][۳] در برخی از پیاده‌سازی‌ها قبل از کلمهٔ مورد نظر یک حرف نقل و قول می‌آید. (برای مثال BEGIN')[۴]

در حقیقت، اغلب اینگونه است که چندین قرارداد قطع کردن ممکن است در یک زبان مورد استفاده قرار گیرد. به عنوان مثال، در الگول۶۸ انتخاب بین "بریدن"های مختلف را می‌توان با یک دستورالعمل کامپایلر (عملگر در واژه‌شناسی الگول) که به صورت "نقطه" (POINT)، "بالایی"(UPPER)، "نقل و قول"(QUOTE) یا "عطف به"(RES) نامیده می‌شوند، انتخاب کرد.

  • نقطه (point) برای ۶-بیت، همانند FOR. - یک قرارداد مشابه در FORTRAN 77 استفاده شده‌است، که در آن کلمات کلیدی منطقی به عنوان .EQ. و … قطع می‌شوند.
  • روش بالایی (UPPER) برای ۷-بیت مانند FOR - با حروف کوچک که برای شناسه‌های معمولی استفاده می‌شوند.
  • نقل‌وقول (QUOTE) همانند آن در ALGOL 60 به عنوان 'for' استفاده شده‌است.
  • عطف به (RES)، کلمات رزرو شده، همان‌طور که در زبان‌های مدرن استفاده می‌شود - for رزرو شده‌است و برای شناسه‌های معمولی در دسترس نیست.

نظام‌های مختلف قواعد یک ویژگی واژگانی برای کاراکترهای منقطع شده (stropped) هستند، هر چند در برخی موارد، این تفسیرها، تفاسیر ساده‌ای دارند: در آپاستروف تنها(single apostrophe) و نظام نقطه‌ای، اولین کاراکتر به عنوان یک کاراکتر فرار عمل می‌کند، در حالی که در نظام‌های آپاستروف، به عنوان حائل عمل می‌کنند. مثال دیگر: برنامه‌های ALGOL 68RS حتی در یک پردازنده یک زبان نیز می‌توانند از چندین نوع روش قطع کردن استفاده کنند.

مثال‌های سبک‌های مختلف الگول ۶۸[ویرایش]

توجه داشته باشید به دستورالعمل پیشرو pr (مخفف pragmat)، که خود به سبک نقطه یا نقل قول قطع می‌شوند، و همچنین ¢ برای کامنت (از "") تنظیم شده‌است - به الگول ۶۸: عناصر مهم زبانی مراجعه کنید.

الگول ۶۸ با استفاده از قطع کردن

به روش عطف به (کلمات رزرو شده)

برای کامپایلر کد کاراکتر ۶ بیتی برای کامپایلر کد کاراکتر ۷ بیتی قطع کردن به روش نقل قول

(مانند wikitext)

الگول ۶۸ "سخت"

نسخه معمولی منتشر شده

PR RES .PR.
;mode .xint = int
;xint sum sq:=0.
for i while
sum sq≠70×70  
do
sum sq+:=i↑2  
od

PR POINT .PR.
;MODE .XINT = .INT.
;XINT SUM SQ:=0.
FOR I .WHILE.
SUM SQ .NE 70*70  
DO.
SUM SQ .PLUSAB I .UP 2  
OD.

PR UPPER .PR.
;MODE XINT = INT
;XINT sum sq:=0
FOR i WHILE
sum sq/=70*70  
DO
sum sq+:=i**2  
OD

'pr' quote 'pr'
;'mode' 'xint' = 'int'
;'xint' sum sq:=0
'for' i 'while'
sum sq≠70×70  
'do'
sum sq+:=i↑2  
'od'

 underline or ¢
¢ bold typeface   
;mode xint = int 
;xint sum sq:=0 
for i while 
sum sq≠70×70  
do 
sum sq+:=i↑2    
od 

زبان‌های دیگر[ویرایش]

به دلایل مختلف فورترن‎۷۷ دارای این مقادیر "منطقی" و عملگرها است: .TRUE., .FALSE., .EQ., .NE., .LT., .LE., .GT., .GE., .EQV., .NEQV., .OR., .AND., .NOT.[۵]

.AND., .OR. و .XOR. همچنین در تست‌های ترکیبی در عبارت‌های IF و IFF در پرونده‌های دسته ای که تحت پردازنده‌های خط فرمان JP Software مانند 4DOS ,[۶] 4OS2 و 4NT / Take Command اجرا می‌شوند، استفاده شده‌اند.

استفادهٔ مدرن[ویرایش]

اکثر زبان‌های مدرن کامپیوتر از روش قطع کردن (stropping) استفاده نمی‌کنند، با دو استثنا قابل توجه:

استفاده از زبانهای زیادی در Microsoft's .NET Common Language Infrastructure (CLI) به روشی برای استفاده از متغیرها به زبانی متفاوت نیاز دارد که ممکن است در یک زبان مکالمه کلمات کلیدی باشند. این کار گاهی اوقات با پیشوندهایی مانند @ در #c یا شناسه در براکت‌ها در ویژوال بیسیک دات‌نت انجام می‌شود. دومین نمونه مهم در بسیاری از پیاده‌سازی‌های ساختار، جستجوی زبان است. در این زبانها کلمات محفوظ با محدود کردن واژگان از آنها به عنوان ستون، جدول یا نام متغیر قابل استفاده هستند. به صورت استاندارد کلمات محصور شده با " " مشخص می‌شوند اما در عمل مکانیسم دقیق با اجرا تغییر می‌کند؛ برای مثال، مای‌اس‌کیوال اجازه می‌دهد که واژه‌های رزرو شده در زمینه‌های دیگر با استفاده از محصور کردن آنها توسط backticks انجام شود یا مایکروسافت اس‌کیوال سرور از براکت‌های مربعی استفاده می‌کند. قطع کردن(stropping) نیز می‌توانند در زبان برنامه‌نویسی Nim مورد استفاده قرار گیرند. در زبان Nim کلمه رزرو شده می‌تواند به عنوان یک شناسه با ضمیمه کردن آن در براکت استفاده شود. نمونه‌های دیگری نیز وجود دارند. برای مثال، Web IDL از یک زیرخط _ برای نشانه‌گذاری شناسه‌ها استفاده می‌کند که در غیر این صورت با کلمات محفوظ برخورد می‌کند.[۷]

قطع نکردن توسط کامپایلر[ویرایش]

در ابتدا در کامپایلر، قطع نکردن (unstropping) در طول مرحله بازسازی خط اول رخ می‌داد، که همچنین فضاهای خالی را نیز از بین می‌برد. پس از آن تجزیه و تحلیل بدون اسکنر (بدون نشانه گذاری) دنبال شد که در دهه ۱۹۶۰، برای الگول استاندارد بود. در استفاده مدرن، قطع نکردن(unstropping) به عنوان بخشی از تحلیل واژگانی انجام می‌شود. یک امر واضح این است اگر فرد واژگان را به دو مرحله اسکنر و ارزیاب متمایز کند: اسکنر رشته قطع شده(stropped) را در طبقه‌بندی به درستی دسته‌بندی می‌کند و سپس ارزیاب هنگام محاسبه مقدار از تکنیک جدانکردن (unstrops) استفاده می‌کند. به عنوان مثال، در زبانی که زیرخط _ در اول کلمه برای بریدن شناسه‌ها برای جلوگیری از برخورد با کلمات محفوظ استفاده می‌شود، دنباله if_ به عنوان یک شناسه (نه به عنوان کلمه رزرو شده در صورت) توسط اسکنر طبقه‌بندی می‌شود سپس ارزیاب این مقدار را به عنوان نوع-نشانه (شناسه، اگر) مقدار خواهد داد.

تکنیک‌های مشابه[ویرایش]

تعدادی روش مشابه وجود دارند که به‌طور کلی با پیشوند یا پسوند گذاری شناسه، برخوردهای مختلف با آن را نشان دهند ولی از لحاظ مفهوم با یکدیگر متفاوتند. به‌طور دقیق قطع کردن (stropping) متشکل از نمایش‌های مختلف برای یک اسم، در فضاهای نام متفاوت است و در مرحله نشان گذاری کردن رخ می‌دهد. از حروف بزرگ برای کلمات کلیدی همچنان به عنوان یک قرارداد برای نوشتن دستور زبان برای واژگان و تجزیه استفاده می‌شود - علامت گذاری کلمه رزرو شده به عنوان کلاس نشانگر IF، و سپس بیان عبارت "if-then-else" با IF Expression THEN Statement ELSE Statement که در آن اصطلاح‌های با حروف بزرگ کلمات کلیدی هستند و اصطلاحاتی که فقط حرف اول آن‌ها بزرگ است نمادهای غیر پایانی در یک قاعده تولید هستند (نمادهای پایانی با حروف کوچک مشخص می‌شوند).

قرارداد نامگذاری[ویرایش]

ممکن است از قراردادهای نامگذاری برای جلوگیری از تصادم استفاده شود که به صورت معمول از زیرخط پیشوند یا پسوند استفاده می‌شود. زیرخط پیشوندی اغلب برای نشان دادن اعضای خصوصی در برنامه‌نویسی شی گرا استفاده می‌شود. این اسامی ممکن است توسط کامپایلر تفسیر شوند و تأثیراتی داشته باشند، هرچند این کار معمولاً در مرحله تجزیه و تحلیل معنایی انجام می‌شود، نه مرحله نشانه گذاری. به عنوان مثال، در پایتون، یک زیرخط پیشوندی، یک شاخص خصوصی ضعیف است، در حالی که دو زیرخط برجسته روی یک ویژگی کلاس، دستکاری نام را نشان می‌دهد.[۸]

کلمات رزرو شده[ویرایش]

زبان‌های مدرن به‌طور کلی از واژه‌های رزرو شده به جای قطع کردن (stropping) برای تمایز کلمات کلیدی از شناسه‌ها به عنوان کلمات کلیدی استفاده می‌کنند. این برجسته‌ترین قسمت در زبان C است، در جایی که شناسه‌ها از شناسه‌هایی که از زیرخط (underscore) شروع می‌شوند جداست، اگرچه جزئیات دقیق شناسه در یک دامنه محفوظ است.[۹] به‌طور مشابه در ++C هر شناسه ای که حاوی دو زیرخط باشد برای هرگونه استفاده محفوظ است، در حالی که شناسه‌ای که با تأکید زیر شروع می‌شود در فضای جهانی محفوظ است؛ بنابراین می‌توان با استفاده از کلمه رزرو شده foo__کلمه کلیدی جدید foo را اضافه کرد. در حالی که این از نظر سطحی شبیه به قطع کردن (stropping) است، معنی‌شناسی متفاوتی دارند. به عنوان یک کلمه محفوظ، رشته foo__ شناسه foo__ را در فضای نام شناسه مشترک نشان می‌دهد. در قطع کردن(Stropping) (با پیشوند کلمات کلیدی توسط __)، رشته foo__ کلمه کلیدی foo را در یک نام جداگانه برای کلید واژه‌ها نشان می‌دهد؛ بنابراین با استفاده از کلمات رزرو شده، علائم foo__ و foo (شناسه، foo__) و (شناسه، foo) - مقادیر مختلفی در همان دسته هستند - در حالی که در تکنیک قطع کردن(stropping) نشانه‌های foo__ و foo (کلمه کلیدی، foo) و (شناسه، foo) - مقادیر یکسان در دسته‌های مختلف. این مسئله همان مشکل برخورد فضای نام را به گونه‌ای حل می‌کند که برای یک برنامه‌نویس نیز یک‌سان است، اما از نظر دستور زبان و اجرای رسمی تفاوت دارد.

امضاها[ویرایش]

یک پدیده نحو مشابه اما از نظر معنایی متفاوت امضاءها هستند که در عوض خصوصیات متغیرها را نشان می‌دهد. این موارد در پرل(Perl)، روبی (Ruby) و زبان‌های مختلف دیگر برای شناسایی ویژگی‌های متغیرها / ثابت‌ها مشترک است:در Perl برای تعیین نوع متغیر و در Ruby برای تشخیص متغیرها از ثابت و نشان دادن دامنه. توجه داشته باشید تکنیک معناشناختی متغیر را تحت تأثیر قرار می‌دهد، نه نحو بودن این که آیا آن یک شناسه یا کلمه کلیدی است.

موازی با زبان انسان[ویرایش]

قطع کردن (stropping) در زبانهای برنامه‌نویسی رایانه ای مورد استفاده قرار می‌گیرد تا کار کامپایلر (یا به عبارت دقیق تر پارسر) آسانتر شود؛ یعنی در توانایی رایانه‌های نسبتاً کوچک و کند در دسترس در روزهای اولیه محاسبات در قرن بیستم باشد. با این حال، روشهای مشابه برای کمک به درک مطلب برای افراد نیز به‌طور معمول مورد استفاده قرار می‌گیرند. برخی از نمونه‌ها عبارتند از:

  • قرار دادن کلمات مهم به صورت پررنگ، مانند ذکر کردن روش‌های قطع کردن در بالای این صفحه، زیرا تعریف بریدن، هدف اصلی صفحه است.
  • فرمت بندی کلمات جدید در به سبک خوابیده هنگامی که برای اولین بار در متن معرفی می‌شوند. این روش معمولاً در داستانهای علمی و تخیلی هنگام معرفی گیاهان، غذاها و موجودات اختراع شده استفاده می‌شود؛ در سفرنامه و نوشتارهای تاریخی هنگام توصیف کلمات بیگانه ناآشنا و مانند آن. همچنین با استفاده از یک فونت مخصوص که در صورت ممکن مخصوص زبان مورد نظر باشد، برای مثال استفاده فونت Gothic برای کلمات آلمانی.
  • استفاده از یک زبان دیگر، به‌طور معمول لاتین یا یونانی برای نشان دادن اصطلاحات فنی. این شبیه به استفاده از کلمات رزرو شده‌است، اما معمولاً برای کمک به خوانایی، با متن به سبک خوابیده ترکیب می‌شود. مثلا:
    • نام علمی معمولی یا «نامهای لاتین» گیاهان و حیوانات به خواننده کمک می‌کند تا ببیند که سینه‌سرخ اروپایی نام فنی ویژه رابین اروپایی است، به گونه ای که سینه‌سرخ اروپایی نمی‌تواند این منظور را برساند.
    • بسیاری از اصطلاحات حقوقی که یک عبارت کوتاه لاتین به یک قانون بزرگ و حقوقی مربوط می‌شود (بیشتر در کشورهای خارجی).
    • منطق و اصطلاحات ریاضی
  • در زبان نوشتار ژاپنی، دو سری حروف نوشتاری مجزا هیراگانا و کاتاکانا، هر دو مجموعه هجاهای یکسانی را نشان می‌دهند، با این حال به ترتیب برای متمایز کردن کلمات ژاپنی واژگان با کلمات خارجی وارداتی به کار می‌روند. از کاتاکانا برای تأکید نیز استفاده می‌شود، دقیقاً مانند سبک خوابیده در انگلیسی.

جستارهای وابسته[ویرایش]

منابع[ویرایش]

  1. King, Peter R., ed. (1974-06-18). "(unknown)". Proceedings of an International Conference on ALGOL 68 Implementation. Department of Computer Science, University of Manitoba, Winnipeg: University of Manitoba, Department of Computer Science: 148. More serious problems are posed by "stropping", the technique used to distinguish boldface text from roman text. Some implementations demand apostrophes around boldface (whence the name stropping); others require backspacing and underlining; […] {{cite journal}}: Cite uses generic title (help)
  2. ۲٫۰ ۲٫۱ van Wijngaarden, Adriaan; Mailloux, Barry James; Peck, John Edward Lancelot; Koster, Cornelis Hermanus Antonius; Sintzoff, Michel; Lindsey, Charles Hodgson; Meertens, Lambert Guillaume Louis Théodore; Fisker, Richard G., eds. (1976). "Section 9.3 Representations" (PDF). Revised Report on the Algorithmic Language ALGOL 68. Springer-Verlag. pp. 94, 123. ISBN 978-0-387-07592-1. OCLC 1991170. Archived (PDF) from the original on 2019-04-19. Retrieved 2019-05-11.
  3. «نسخه آرشیو شده» (PDF). بایگانی‌شده از اصلی (PDF) در ۲ ژانویه ۲۰۱۴. دریافت‌شده در ۱ فوریه ۲۰۲۰.
  4. Lindsey, Charles Hodgson; van der Meulen, Sietse G. (1977). Informal Introduction to ALGOL 68. North-Holland. pp. 348–349. ISBN 978-0-7204-0726-6. OCLC 230034877.
  5. «نسخه آرشیو شده». بایگانی‌شده از اصلی در ۲۶ ژانویه ۲۰۲۰. دریافت‌شده در ۱ فوریه ۲۰۲۰.
  6. Brothers, Hardin; Rawson, Tom; Conn, Rex C.; Paul, Matthias R.; Dye, Charles E.; Georgiev, Luchezar I. (2002-02-27). 4DOS 8.00 online help.
  7. Web IDL, "3.1. Names". […] For all of these constructs, the identifier is the value of the identifier token with any single leading U+005F LOW LINE ("_") character (underscore) removed. […] Note […] A leading "_" is used to escape an identifier from looking like a reserved word so that, for example, an interface named “interface” can be defined. The leading "_" is dropped to unescape the identifier. […]
  8. PEP 008: Descriptive: Naming Styles
  9. C99 standard, 7.1.3 Reserved identifiers