| GCOBOL(1) | 1 (gcc cobol compiler) | GCOBOL(1) |
نام (NAME)
gcobol —
کامپایلر
کوبول
پروژه گنو
خلاصه دستور (SYNOPSIS)
gcobol
[-Dname[=value]]
[-E]
[-fdefaultbyte=value]
[-fsyntax-only]
[-Icopybook-path]
[-fmax-errors=nerror]
[-nomain | -main
filename |
-main=filename
-main=filename:program-id]
[-fcobol-exceptions
exception[,exception...]]
[-copyext ext]
[-ffixed-form | -ffree-form]
[-findicator-column]
[-fexec-charset=encoding]
[-fexec-national-charset=encoding]
[-dialect dialect-name]
[-include filename]
[-preprocess
preprocess-filter]
[-fflex-debug]
[-fyacc-debug]
[-Wno-apply-commit]
[-Wno-file-code-set]
[-Wno-high-order-bit]
[-Wno-bad-line-directive]
[-Wno-bad-numeric]
[-Wno-binary-long-long]
[-Wno-call-giving]
[-Wno-call-literal]
[-Wno-cdf-dollar]
[-Wno-cdf-invalid-parameter]
[-Wno-cdf-name-not-found]
[-Wno-cobol-eject]
[-Wno-cobol-resume]
[-Wno-cobol-volatile]
[-Wno-comp-6] [-Wno-comp-x]
[-Wno-copybook-found]
[-Wno-ec-unknown]
[-Wno-entry-convention]
[-Wno-iconv-error]
[-Wno-include-file-found]
[-Wno-include-file-not-found]
[-Wno-inspect-trailing]
[-Wno-length-of]
[-Wno-level-1-occurs]
[-Wno-level-78]
[-Wno-level-78-defined]
[-Wno-literal-concat]
[-Wno-locale-error]
[-Wno-move-corresponding]
[-Wno-move-index]
[-Wno-move-pointer]
[-Wno-nllanginfo-error]
[-Wno-operator-space]
[-Wno-preprocessor-error]
[-Wno-procedure-not-found]
[-Wno-procedure-pointer]
[-Wno-replace-error]
[-Wno-returning-number]
[-Wno-segment-error]
[-Wno-segment-negative]
[-Wno-stop-number]
[-Wno-stray-indicator]
[-Wno-usage-typename]
[-Wno-recording-mode]
[-Wno-set-locale-to]
[-Wno-set-to-locale] filename
[...]
توضیحات (DESCRIPTION)
gcobol کد
منبع COBOL را به
کد شیء
کامپایل
میکند و به
صورت
اختیاری یک
پرونده
باینری
اجرایی یا
شیء مشترک (shared
object) تولید
مینماید.
به عنوان
یکی از
اجزای GCC،
تمام
گزینههایی
را که بر
تولید کد و
پیونددهی
اثر
میگذارند
میپذیرد.
گزینههای
اختصاصی COBOL
در ادامه
فهرست
شدهاند.
گزینهها (OPTIONS)
-mainfilename- کامپایلر
gcobolیک تابعmain() را به عنوان نقطه ورود ایجاد میکند که نخستین PROGRAM-ID را در filename فراخوانی مینماید.گزینه
-mainحالت پیشفرض است. هنگامی که هیچیک از گزینههای-nomain-،-cیا-sharedوجود نداشته باشند، یک گزینه-mainضمنی پیش از نام نخستین پرونده منبع در خط فرمان درج میشود. -main=filename- ماژول شیء .o
برای filename
شامل یک
نقطه ورود
main() خواهد بود که نخستین PROGRAM-ID را در filename فراخوانی میکند. -main=filename:program-id- ماژول شیء .o
برای filename
شامل یک
نقطه ورود
main() خواهد بود که نقطه ورود program-id را فراخوانی مینماید. -nomain- هیچ نقطه
ورود
main() توسط این کامپایل ایجاد نخواهد شد. گزینه-nomainبا-mainناسازگار است و در صورت استفاده از-sharedبه طور ضمنی اعمال میشود. همچنین در صورت عدم وجود-main-،توسط-cنیز به طور ضمنی در نظر گرفته میشود.برای نمونههایی از کاربرد
-mainو-nomainبه بخشهای پایینتر مراجعه کنید. -Dname[=expr]- یک نام CDF (برای استفاده با >>IF) تعریف میکند تا مقدار expr را داشته باشد.
-E- ورودی COBOL
پردازششده
توسط CDF را در
قالب
مرجع
فرمآزاد
(free-form reference format) در
خروجی
استاندارد
مینویسد.
برخی
نشانگرهای
غیر-COBOL در
خروجی
گنجانده
میشوند تا
نشان دهند
فایلهای copybook
در کجا درج
شدهاند.
برای
یکدستی
شماره خطوط
با ورودی،
خطوط خالی
حفظ
میشوند.
برخلاف کامپایلر C، این گزینه مانع از کامپایل نمیشود. برای جلوگیری از کامپایل، گزینه
را نیز همراه آن به کار ببرید.-fsyntax-only -fdefaultbyte=value- از value ، عددی بین 0 تا 255، به عنوان مقدار پیشفرض برای تمام اقلام داده WORKING-STORAGE که فاقد بند VALUE هستند استفاده میکند. به طور پیشفرض، اقلام داده الفبایی-عددی با فاصله خالی و اقلام داده عددی با صفر مقداردهی اولیه میشوند. این گزینه مقدار پیشفرض را با value جایگزین میکند.
-fsyntax-only- تنها تجزیهکننده (parser) را فراخوانی میکند. کد را برای یافتن خطاهای نحوی بررسی میکند، اما فراتر از آن عملی انجام نمیدهد.
-copyextext- برای
دستورالعمل
CDF به صورت
COPY nameچنانچه name بدون گیومه باشد، چندین حالت مختلف از name آزموده میشود، همانطور که در زیر در بخش Copybooks توضیح داده شده است. گزینه
-copyextنامهای جستجوشده را گسترش میدهد تا ext را نیز شامل شوند. اگر ext کاملاً با حروف بزرگ یا کاملاً با حروف کوچک باشد، هر دو حالت آزموده میشوند و اولویت با حالتی است که ارائه شده است. اگر ext ترکیبی از حروف بزرگ و کوچک باشد، تنها همان نسخه آزموده میشود. برای نمونه، بادر صورت وجود دستورالعمل CDF به صورت-copyext.abcCOPY nameکامپایلرgcobolنامهای ‘name.abc’ و ‘name.ABC’ را به ترتیب به نامهای احتمالی جستجو اضافه میکند. -ffixed-form- استفاده از قالب مرجع فرمثابت (fixed-form reference format) سختگیرانه در خواندن ورودی COBOL: خطوط 72 کاراکتری، با ناحیه توالی 6 کاراکتری و یک ستون نشانگر. دادههای پس از ستون 72 نادیده گرفته میشوند.
-ffree-form- ورودی COBOL را
وادار
میکند تا
به عنوان
قالب
مرجع
فرمآزاد
(free-form reference format) تفسیر
شود. شکستن
خطوط
بیاهمیت
است، جز
اینکه
‘
*’ در ابتدای خط به عنوان نشانگر توضیح عمل میکند. معادل است با-indicator-column0. -findicator-column- محل ناحیه
نشانگر (Indicator Area)
را در یک
پرونده COBOL در
قالب
مرجع (Reference Format)
شرح
میدهد،
جایی که ۶
ستون اول —
موسوم به
“ناحیه
شماره
توالی” —
نادیده
گرفته
میشوند و
ستون هفتم —
ناحیه
نشانگر —
میتواند
حاوی
کاراکتری
با اهمیت
برای
کامپایلر
باشد.
اگرچه قالب مرجع به معنای دقیق کلمه، دادههای پس از ستون ۷۲ را نادیده میگیرد، با این گزینه
gcobolخطوط طولانی COBOL را میپذیرد که گاه به عنوان قالب منبع گسترشیافته (extended source format) شناخته میشود. متن پس از ستون ۷۲ به عنوان متن عادی COBOL در نظر گرفته میشود. (با این حال، ادامه خط تا زمانی معتبر است که متنی پس از ستون ۷۲ ظاهر نشود.)هیچ حداکثری برای طول خط وجود ندارد. بدون توجه به قالب کد منبع، کل برنامه میتواند در یک خط قرار گیرد.
به طور پیشفرض،
gcobolقالب کد منبع را با بررسی خطی که حاوی عبارت "program-id" است به صورت خودکار تشخیص میدهد. هرگاه کاراکترهایی پس از ستون ۷۲ در آن خط وجود داشته باشد، فرض میشود پرونده در قالب منبع گسترشیافته است و ناحیه نشانگر در ستون ۷ قرار دارد. در غیر این صورت، ستونهای ۱ تا ۶ بررسی میشوند. اگر این کاراکترها همگی رقم یا فاصله خالی باشند، فرض میشود پرونده در قالب مرجع فرمثابت است، باز هم با نشانگر در ستون ۷. اگر به عنوان قالب مرجع فرمثابت یا قالب منبع گسترشیافته تشخیص داده نشود، فرض میشود پرونده در قالب مرجع فرمآزاد است. -fcobol-exceptionsexception [,exception...]- به طور
پیشفرض
هیچ شرط
خطایی (از
جمله
خطاهای
مهلک) فعال
نیست و طبق
استاندارد
ISO، شرایط
خطا تنها از
طریق
دستورالعمل
CDF موسوم به
TURN فعال
میشوند.
این گزینه
یک یا چند
شرط خطا را
به طور
پیشفرض
فعال
میکند،
گویی دستور
TURN در
بالای
نخستین
پرونده کد
منبع آمده
است. این
گزینه
همچنین
میتواند
بیش از یک
بار در خط
فرمان ظاهر
شود.
مقدار exception نام یک شرط خطای سطح ۱، ۲ یا ۳ است، همانطور که در ISO/IEC 1989:2023 شرح داده شده است. ‘
EC-ALL’ به معنای فعالسازی تمام شرایط خطا است.شکل
-fno-cobol-exceptionsشرط exception را غیرفعال میکند، دقیقاً به گونهای که گویی دستور>>TURN exception CHECKING OFFدرج شده باشد.همه شرایط خطا پیادهسازی نشدهاند. هر موردی که پیادهسازی نشده باشد یک پیام هشدار تولید میکند.
-fmax-errors=nerror- nerror
بیانگر
تعداد
پیامهای
خطای
تولیدشده
است. بدون
این گزینه،
gcobolتلاش میکند با از سرگیری کامپایل در دستور بعدی، از یک خطای نحوی بازیابی شود و تا انتهای پرونده ادامه دهد. با این گزینه،gcobolپیامها را با تولید شدن شمارش کرده و با رسیدن به nerror متوقف میشود. -fstatic-call,-fno-static-call- با
-fno-static-call-،کامپایلرgcobolهرگز از پیونددهی ایستا (static linking) برایCALL programاستفاده نمیکند. به طور پیشفرض یا با-fstatic-call-،اگر program یک لیترال الفبایی-عددی باشد،gcobolاز پیونددهی ایستا استفاده میکند؛ به این معنا که کامپایلر یک نماد خارجی program برای پیونددهنده تولید میکند تا آن را حل کند. (در آینده این قابلیت با اقلام داده CONSTANT نیز کار خواهد کرد.) با پیونددهی ایستا، اگر program توسط ماژول کد منبع یا پرونده شیء یا کتابخانه دیگری در زمان ساخت ارائه نشود، پیونددهنده خطای “نماد حلنشده (unresolved symbol)” تولید خواهد کرد. با-fno-static-call-،کامپایلرgcobolهمواره از پیونددهی پویا استفاده میکند.این گزینه دستور CALL را تنها برای لیترالها تحت تأثیر قرار میدهد. اگر program یک قلم داده غیرثابت باشد، همواره با استفاده از پیونددهی پویا توسط dlsym(3) حل میشود، زیرا مقدار آن در زمان اجرا تعیین میگردد.
-fexec-charset=encoding- مجموعه کاراکترهای اجرایی پیشفرض را برای اقلام داده و لیترالهای الفبایی-عددی در صورت عدم وجود CHARACTER CLASSIFICATION در CONFIGURATION SECTION تنظیم میکند. encoding نام یک کدگذاری است همانگونه که توسط iconv(3) تعریف شده است. مگر اینکه خلاف آن مشخص شده باشد، کدگذاری زمان اجرا برای هر دو حالت الفبایی-عددی و NATIONAL برابر با CP1252 تعریفشده در iconv(3) است.
-fexec-national-charset=encoding- مجموعه
کاراکترهای
اجرایی
پیشفرض را
برای اقلام
داده و
لیترالهای
NATIONAL در صورت
عدم وجود
CHARACTER CLASSIFICATION در
CONFIGURATION SECTION
تنظیم
میکند.
encoding نام یک
کدگذاری
است
همانگونه
که توسط
iconv(3)
تعریف شده
است. برای
استفاده از
کدگذاری EBCDIC
برای اقلام
داده، برای
نمونه
میتوان از
استفاده کرد.
-fexec-national-charset=CP1140 -dialectdialect-name- به طور
پیشفرض،
gcobolنحو COBOL را همانطور که توسط ISO/IEC 1989:2023 تعریف شده میپذیرد، به همراه برخی افزونهها برای سازگاری عقبرو با COBOL-85. نحوهای بیشتر با این گزینه پشتیبانی میشوند. مقدار dialect-name میتواند یکی از موارد زیر باشد:- ibm
- برای مشخص
کردن نحو IBM COBOL
6.4:
- EJECT
- EQUAL به عنوان عملگر انتساب
- LENGTH OF
- PROCEDURE POINTER
- قطعه (segment) در SECTION
- STOP <number>
- VOLATILE
- ثباتهای
اختصاصی
هر برنامه:
- RETURN-CODE
- S9(4)
- SORT-CONTROL
- X(160)
- SORT-CORE-SIZE
- S9(8)
- SORT-FILE-SIZE
- S9(8)
- SORT-MESSAGE
- X(8)
- SORT-MODE-SIZE
- S9(5)
- SORT-RETURN
- S9(4)
- TALLY
- 9(5)
- WHEN-COMPILED
- X(16)
- XML-CODE
- S9(9)
- XML-EVENT
- X(30)
- XML-INFORMATION
- S9(9)
- XML-NAMESPACE
- X(0) تا X(32,768)
- XML-NNAMESPACE
- N(0) تا N(16,384)
- XML-NAMESPACE-PREFIX
- X(0) تا X(4,096)
- XML-NNAMESPACE-PREFIX
- N(0) تا N(2,048)
- XML-NTEXT
- N(0) تا N(2,000,000)
- XML-TEXT
- X(0) تا X(2,147,483,646)
- gnu
- برای مشخص کردن نحو GnuCOBOL، که عموماً با MicroFocus سازگار است.
- mf
- برای مشخص
کردن نحو MicroFocus:
- BINARY-LONG-LONG
- CALL ... GIVING
- CDF $IF
- COMPUTATIONAL-6
- COMPUTATIONAL استفادهشده با PICTURE X
- INSPECT ... TRAILING
- OCCURS در LEVEL 01
- ثابتهای LEVEL 78
- MOVE POINTER
- RETURNING <number>
- USAGE IS TYPENAME
-includefilename- پرونده
filename را به
گونهای
پردازش
میکند که
گویی
COPY “filename”به عنوان نخستین خط پرونده منبع اصلی آمده است. اگر filename یک مسیر مطلق نباشد، پوشه جستجوشده پوشه کاری فعلی است، نه پوشهای که پرونده منبع اصلی را در بر دارد. نام دقیقاً عیناً استفاده میشود؛ هیچ دگرگونی اعمال نمیشود و هیچ پوشهای جستجو نمیگردد.
اگر چندین گزینه
-includeداده شود، پروندهها به همان ترتیبی که در خط فرمان آمدهاند اضافه میشوند. -preprocesspreprocess-filter- پس از اعمال
تمام
دستکاریهای
متنی CDF و پیش
از ارسال
متن
آمادهشده
COBOL به
کامپایلر
cobol1
، ورودی
میتواند
توسط یک یا
چند فیلتر
بیشتر
تغییر یابد.
به رسم سنتی
sed(1) ، هر
preprocess-filter از
ورودی
استاندارد
میخواند و
در خروجی
استاندارد
مینویسد.
برای ارسال گزینهها به preprocess-filter ، از یک رشته جداشده با کاما استفاده کنید، مشابه روشی که گزینههای پیونددهنده به
-Wl ارسال میشوند. (بعد از کاما هیچ فاصلهای نگذارید، زیرا پوسته آن را به عنوان جداکننده گزینه در نظر میگیرد.) کامپایلرgcobolهنگام فراخوانی preprocess-filter هر کاما را با یک فاصله جایگزین میکند. برای نمونه،ابزار tee(1) را با آرگومان نام پرونده خروجی output.cbl فراخوانی میکند و باعث میشود یک رونوشت از ورودی در پرونده نوشته شود.-preprocesstee,output.cblکامپایلر
gcobolپوشه کاری فعلی و پوشههای موجود در متغیر محیطی PATH را برای یافتن یک پرونده اجرایی که نام آن با preprocess-filter مطابقت دارد جستجو میکند. نخستین موردی که یافت شود استفاده میگردد. اگر موردی یافت نشود، یک خطا گزارش شده و کامپایلر فراخوانی نمیشود.گزینه
-preprocessمیتواند بیش از یک بار در خط فرمان ظاهر شود. هر preprocess-filter به نوبه خود و به ترتیب ظاهر شدن اعمال میشود.فیلتر preprocess-filter باید وضعیت خروج صفر برگرداند که نشاندهنده موفقیت است. اگر وضعیت خروج غیرصفر بازگرداند، یک خطا گزارش شده و کامپایلر فراخوانی نمیشود.
-fflex-debug,-fyacc-debug- پیامهای
مفیدی برای
توسعه
کامپایلر
تولید
میکنند.
گزینه
-fflex-debugجریان توکنشده ورودی را چاپ میکند. گزینه-fyacc-debugعملیات انتقال و کاهش (shift and reduce) انجامشده توسط تجزیهکننده را نشان میدهد.
پیامهای تشخیصی (Diagnostic Messages)
بسیاری از گزینههای هشدار میتوانند برای تبدیل پیامهای خطا به هشدار یا نادیده گرفتن پیامهای مرتبط با گویشهای مختلف COBOL استفاده شوند. کاربر میتواند این موارد را ترکیب کند. گروهی از ویژگیها را میتوان با تعیین یک گویش (یا بیش از یک گویش) فعال کرد و ویژگیهای منفرد را میتوان به صورت هشدار، خطا یا پنهانسازی تنظیم نمود.
-Wno-apply-commit- هشدار در صورت استفاده از APPLY COMMIT.
-Wno-bad-line-directive- هشدار در
صورت
برخورد با
دستورالعمل
نادرست
‘
#line’. -Wno-binary-long-long- هشدار در صورت استفاده از BINARY-LONG-LONG.
-Wno-call_giving- هشدار در صورت استفاده از CALL ... GIVING.
-Wno-call_literal- هشدار در صورت استفاده از CALL با یک پارامتر لیترال از طریق مرجع (by reference).
-Wno-cdf-dollar- هشدار در صورت استفاده از CDF $IF.
-Wno-comp-6- هشدار در صورت استفاده از COMPUTATIONAL-6.
-Wno-comp-x- هشدار در صورت استفاده از COMPUTATIONAL با PICTURE X.
-Wno-file-code-set- هشدار در صورت استفاده از FILE CODE SET.
-Wno-inspect-trailing- هشدار در صورت استفاده از INSPECT ... TRAILING.
-Wno-level-1-occurs- هشدار در صورت استفاده از Level 01 با OCCURS.
-Wno-level-78-defined- هشدار در صورت تعریف ثابت Level 78 توسط CDF.
-Wno-move-index- هشدار در صورت استفاده از MOVE INDEX.
-Wno-move-pointer- هشدار در صورت استفاده از MOVE POINTER.
-Wno-returning-number- هشدار در صورت استفاده از RETURNING <number>.
-Wno-usage-typename- هشدار در صورت استفاده از USAGE IS TYPENAME.
-Wno-bad-numeric- هشدار در صورت نامعتبر بودن رشته عددی.
-Wno-cdf-invalid-parameter- هشدار در صورت تعریف نشدن CDF PARAMETER ارجاعشده.
-Wno-cdf-name-not-found- هشدار در صورت تعریف نشدن نام CDF ارجاعشده.
-Wno-cobol-eject- هشدار در صورت استفاده از EJECT سبک IBM (به جای خطا).
-Wno-cobol-resume- هشدار در صورت استفاده از RESUME استاندارد ISO همراه با -dialect ibm (به جای خطا).
-Wno-cobol-volatile- هشدار در صورت استفاده از VOLATILE (به جای خطا در صورت وجود -dialect ibm).
-Wno-copybook-found- چاپ پیام هنگام پردازش copybook.
-Wno-ec-unknown- هشدار در صورت ارجاع به شرط خطای پیادهسازینشده یا ناشناخته.
-Wno-entry-convention- چاپ پیام هنگام مشخص شدن ENTRY CONVENTION.
-Wno-high-order-bit- هشدار در صورت استفاده از HIGH-ORDER-LEFT HIGH-ORDER-RIGHT.
-Wno-include-file-found- چاپ پیام هنگام پردازش پرونده درجشده (include file).
-Wno-length-of- هشدار در صورت استفاده از LENGTH OF.
-Wno-level-78- هشدار در صورت استفاده از Level 78.
-Wno-literal-concat- هشدار در صورت استفاده لیترالهای الحاقشده از کدگذاریهای مختلف.
-Wno-locale-error- هشدار در صورت شکست locale(3).
-Wno-move-corresponding- هشدار در صورتی که COBOL MOVE فیلدهای متناظری نداشته باشد.
-Wno-nllanginfo-error- هشدار در صورت شکست nl_langinfo(3).
-Wno-recording-mode- هشدار در صورت استفاده از RECORDING MODE.
-Wno-segment- هشدار در صورت استفاده از قطعههای SECTION.
-Wno-set-locale-to- هشدار در صورت استفاده از SET LOCALE ... TO.
-Wno-set-to-locale- هشدار در صورت استفاده از SET ... TO LOCALE. هشدار در صورت نامعتبر بودن دستورالعمل line (به جای خطا).
-Wno-iconv-error- هشدار در صورتی که iconv(3) نتواند بین کدگذاریها تبدیل انجام دهد (به جای خطا).
-Wno-include-file-not-found- هشدار در صورت پیدا نشدن پرونده include (به جای خطا).
-Wno-operator-space- هشدار در صورتی که عملگر رابطهای با فاصله همراه نباشد (به جای خطا).
-Wno-preprocessor-error- هشدار در صورت شکست پیشپردازنده (به جای خطا).
-Wno-procedure-pointer- هشدار در صورت استفاده از PROCEDURE POINTER.
-Wno-procedure-not-found- هشدار در صورت پیدا نشدن رویه ارجاعشده (به جای خطا).
-Wno-replace-error- هشدار در صورتی که REPLACE نتواند پردازش شود (به جای خطا).
-Wno-segment-error- هشدار در صورت نامعتبر بودن بخش SEGMENT (به جای خطا).
-Wno-segment-negative- هشدار در صورتی که بازه SEGMENT منفی باشد (به جای خطا).
-Wno-stop-number- هشدار در صورت استفاده از STOP <number> سبک IBM (به جای خطا).
-Wno-stray-indicator- هشدار در صورتی که ستون نشانگر معنی شناختهشدهای نداشته باشد (به جای خطا).
سناریوهای کامپایل (COMPILATION SCENARIOS)
این
دستورها
معادل
یکدیگرند.
کد xyz.cob
کامپایل
میشود و یک
تابع
main()
درج
میگردد که
نخستین PROGRAM-ID را
در پرونده
منبع xyz.cob
فراخوانی
میکند.
-nomain
مانع از
تولید تابع
main()
توسط
کامپایلر gcobol
میشود.
باید یک
نقطه ورود
main() در
ماژول elsewhere.o
وجود داشته
باشد؛ در
غیر این
صورت
پیونددهنده
خطای “missing main”
(فقدان تابع
اصلی) را
گزارش
خواهد کرد.
main()
تولیدشده
که نخستین PROGRAM-ID
را در ماژول
aaa.cob
فراخوانی
میکند،
کامپایل
شده و با هم
پیوند
میخورند.
-main
ccc.cobmain()
خواهد بود
که نخستین PROGRAM-ID
را در bbb
فراخوانی
میکند.
دستور
چهارم این
سه پرونده .o
را به یک
پرونده a.out
پیوند
میدهد.
EBCDIC
گزینه
-fexec-charset=cp1140
هنگام کار
با
برنامههای
مینفریم COBOL
که برای
پروندههای
دارای
کدگذاری EBCDIC
در نظر
گرفته
شدهاند،
بسیار مفید
است. با این
گزینه، در
حالی که متن
COBOL در قالب ASCII
باقی
میماند،
لیترالهای
کاراکتری و
مقادیر
اولیه
فیلدها
رشتههای EBCDIC
را در
باینری
کامپایلشده
تولید
میکنند و
هر داده
کاراکتری
خواندهشده
از یک
پرونده به
عنوان
دادههای EBCDIC
تفسیر
میشود.
دادههای
پرونده
تبدیل
نمیشوند؛
بلکه فرض بر
این است که
پرونده از
نمایش EBCDIC
استفاده
میکند.
لیترالهای
رشتهای در
متن COBOL
تبدیل
میشوند،
به گونهای
که میتوان
آنها را به
شکلی
معنادار با
دادههای
درون
پرونده
مقایسه کرد.
صفحه کد 1140
یکی از
چندین صفحه
کد EBCDIC است؛
این صفحه کد
اغلب
سودمند است
زیرا قرابت
نزدیکی با
صفحه کد
پرکاربرد 1252
دارد که
بسیاری از
کاراکترهای
اروپای
غربی را
فراهم
میسازد.
تنها دادههای پرونده و لیترالهای کاراکتری تحت تأثیر قرار میگیرند. دادههای خواندهشده از محیط یا نوشتهشده در آن، یا دادههای دریافتی از خط فرمان، مطابق با locale(7) حاکم در حین اجرا تفسیر میشوند. همین امر در مورد ACCEPT و DISPLAY نیز صادق است. نامهای شناختهشده برای سیستمعامل، مانند نام پروندهها و نام متغیرهای محیطی، عیناً و بدون تغییر پردازش میشوند.
در حال حاضر، این یک تنظیم همه-یا-هیچ است. پشتیبانی از USAGE و CODESET ، که امکان تبدیل بین کدگذاریها را فراهم میآورد، همچنان به عنوان یک هدف در آینده باقی مانده است.
همچنین ببینید بخش متغیرهای مجموعه ویژگیها (Feature-set Variables) در زیر.
REDEFINES ... USAGE POINTER
طبق
استاندارد
ISO، قلم
دادهای که
قلم دیگری
را REDEFINES
میکند
نباید
بزرگتر از
قلمی باشد
که آن را
بازتعریف
مینماید،
مگر اینکه
آن قلم
دارای LEVEL 01
بوده و EXTERNAL
نباشد. در
، با
استفاده از
-dialect ibm ،
این قاعده
برای REDEFINES
همراه با
USAGE POINTER که عضو
بازتعریفشده
آن یک USAGE COMP-5
چهار بایتی
است
(معمولاً
PIC
S9(8))، یا
برعکس،
منعطفتر
شده است. در
این صورت،
عضو
بازتعریفشده
به ۸ بایت
تغییر
اندازه
مییابد تا
اشارهگر
را در خود
جای دهد. این
ویژگی
امکان
انجام
محاسبات
اشارهگر
را در یک
سیستم ۶۴
بیتی با کد
منبعی که
هدف آن
سیستم ۳۲
بیتی بوده
فراهم
میسازد.
همچنین ببینید بخش متغیرهای مجموعه ویژگیها (Feature-set Variables) در زیر.
نکات پیادهسازی (IMPLEMENTATION NOTES)
کامپایلر
gcobol یک
کامپایلر
بر پایه gcc
است و در
موارد
کاربردی از
قراردادهای
gcc پیروی
میکند.
گاهی این
قراردادها
(و انتظارات
کاربر) با
شیوههای
رایج در
مینفریم
تعارض
دارند. مگر
در مواردی
که
استاندارد ISO
انجام کاری
را برای
کامپایلر
الزامی
کرده باشد،
هرگونه
تعارض از
این دست به
نفع gcc
حلوفصل
میشود.
پیونددهی (Linking)
برخلاف زبان C، دستور CALL در زبان COBOL به صورت ضمنی بیانگر پیونددهی پویا است، زیرا برای
کامپایلر
gcobol در
صورت امکان
از
پیونددهی
ایستا
پشتیبانی
میکند،
مگر اینکه
با گزینه
-fno-static-call
غیرفعال
شود. اگر
مقدار
پارامتر در
زمان
کامپایل
مشخص باشد،
کامپایلر
یک مرجع
خارجی
تولید
میکند تا
توسط
پیونددهنده
حل شود.
برنامه
ارجاعشده
معمولاً از
طریق یک
ماژول شیء،
یک
کتابخانه
ایستا یا یک
شیء مشترک (shared
object) ارائه
میشود. اگر
ارائه
نشود،
پیونددهنده
خطای “نماد
حلنشده (unresolved
symbol)” را در
زمان ساخت
یا هنگام
اجرای
برنامه (در
صورت
استفاده از
شیء مشترک)
گزارش
میکند. این
ویژگی
برنامهنویس
را در اولین
فرصت ممکن
از خطا آگاه
میسازد.
برنامههایی
که انتظار
میرود با
وجود
نمادهای
حلنشده به
درستی اجرا
شوند (شاید
به این دلیل
که منطق
برنامه به
آن CALL خاص
نیاز پیدا
نخواهد کرد)
میتوانند
از گزینه
-no-static-call
استفاده
کنند. این
گزینه همه
دستورهای
CALL را
وادار
میکند تا
به صورت
پویا و در
زمان اجرا
حل شوند.
شرایط خطای پیادهسازیشده (Implemented Exception Conditions)
به طور پیشفرض، طبق استاندارد ISO، هیچ شرط خطایی (EC) فعال نیست. شرایط خطای پیادهسازیشده را میتوان در خط فرمان یا از طریق دستورالعمل TURN فعال کرد. هر تلاشی برای فعالسازی شرط خطایی که پیادهسازی نشده باشد، به عنوان خطا در نظر گرفته میشود.
یک شرط خطای فعالشده که توسط یک DECLARATIVE مدیریت نشده باشد، در لاگ سیستم و خروجی خطای استاندارد نوشته میشود. (سازندگان قصد دارند این بخش را به یک گزینه تبدیل کنند.) یک شرط خطای مهلک که با RESUME مدیریت نشود، با فراخوانی abort(3) و پایان فرآیند خاتمه مییابد.
تمام شرایط خطا پیادهسازی نشدهاند. هر تلاشی برای فعالسازی شرط خطایی که پیادهسازی نشده باشد پیام هشداری تولید میکند. موارد زیر پیادهسازی شدهاند:
- EC-FUNCTION-ARGUMENT
- برای توابع
زیر:
- ACOS
- ANNUITY
- ASIN
- LOG
- LOG10
- PRESENT-VALUE
- SQRT
- EC-SORT-MERGE-FILE-OPEN
- EC-BOUND-SUBSCRIPT
- اندیس عدد صحیح نباشد، کمتر از ۱ باشد یا بیشتر از مقدار occurs باشد.
- EC-BOUND-REF-MOD
- آغاز refmod عدد صحیح نباشد، کمتر از ۱ باشد، بزرگتر از اندازه متغیر باشد، طول عدد صحیح نباشد، طول کمتر از ۱ باشد و مجموع آغاز+طول از اندازه متغیر فراتر رود.
- EC-BOUND-ODO
- عبارت DEPENDING عدد صحیح نباشد، بزرگتر از حد بالای occurs باشد، کمتر از حد پایین occurs باشد و برای قلم ارسالکننده اندیس بزرگتر از DEPENDING باشد.
- EC-SIZE-ZERO-DIVIDE
- برای هر دو تقسیم ممیز ثابت و ممیز شناور.
- EC-SIZE-TRUNCATION
- EC-SIZE-EXPONENTIATION
تا زمان
نگارش این
متن، هیچ
کامپایلر COBOL
پیادهسازی
کاملی از
شرایط خطای
ISO/IEC 1989:2023 ارائه
نکرده است.
gcobol به
شرایط
خطایی
اولویت
میدهد که
جامعه
کاربران
آنها را
باارزشتر
بدانند.
افزونهها به استاندارد ISO کوبول (EXTENSIONS TO ISO COBOL)
زبان
استاندارد
COBOL هیچ
امکانی
برای
متغیرهای
محیطی
آنگونه که
در یونیکس و
ویندوز
تعریف
شدهاند،
یا
آرگومانهای
خط فرمان در
نظر نگرفته
است. gcobol از
آنها با
استفاده از
نحوی شبیه
به GnuCOBOL
پشتیبانی
میکند.
همچنین ISO و IBM
روشهای
ناسازگاری
را برای
بازگرداندن
وضعیت خروج
برنامه به
سیستمعامل
تعریف
کردهاند.
gcobol از نحو IBM
پشتیبانی
مینماید.
متغیرهای محیطی (Environment Variables)
برای خواندن یک متغیر محیطی:
FROM ENVIRONMENT envarکه در آن target یک قلم داده تعریفشده در DATA DIVISION است و envar نام یک متغیر محیطی را مشخص میکند. envar میتواند یک لیترال رشتهای یا قلم داده الفبایی-عددی باشد که مقدار آن نام یک متغیر محیطی است. مقدار متغیر محیطی نامبرده به target منتقل (MOVE) میشود. قوانین همانند دستور MOVE هستند.
برای نوشتن در یک متغیر محیطی:
TO sourceکه در آن source یک قلم داده تعریفشده در DATA DIVISION است و envar نام یک متغیر محیطی را مشخص میکند. envar باز هم میتواند یک لیترال رشتهای یا قلم داده الفبایی-عددی حاوی نام متغیر محیطی باشد. مقدار متغیر محیطی نامبرده برابر با مقدار source تنظیم میشود.
آرگومانهای خط فرمان (Command-line Arguments)
برای خواندن آرگومانهای خط فرمان، از ثباتهای COMMAND-LINE و COMMAND-LINE-COUNT (تنها) در یک دستور ACCEPT استفاده کنید. اگر بدون اندیس استفاده شود، COMMAND-LINE کل خط فرمان را به عنوان یک رشته واحد برمیگرداند. همراه با اندیس، COMMAND-LINE جدولی از آرگومانهای خط فرمان است. برای نمونه، اگر برنامه به صورت زیر اجرا شود:
-i input
outputآنگاه
مقدار input را به درون target منتقل میکند. نام برنامه نخستین بخش در کل خط فرمان است و در جدول COMMAND-LINE در خانه COMMAND-LINE(1) یافت میشود.
برای دریافت تعداد آرگومانهای ارائهشده در خط فرمان، از دستور زیر استفاده کنید:
FROM COMMAND-LINE-COUNTاگر ACCEPT به یک متغیر محیطی یا آرگومان خط فرمان ناموجود ارجاع دهد، مقدار مقصد برابر با LOW-VALUES قرار میگیرد.
پارامترهای خط فرمان سیستم همچنین از طریق LINKAGE SECTION در برنامهای که اجرا از آنجا شروع میشود قابل دسترسی هستند. ساختار داده به این صورت است:
linkage section. 01 argc pic 999. 01 argv. 02 argv-table occurs 1 to 100 times depending on argc. 03 argv-element pointer. 01 argv-string pic x(100) .
procedure division using by value argc by reference argv. set address of argv-string to argv-element(3) display argv-string
دستورالعمل #line (#line directive)
تجزیهکننده خطوطی به شکل زیر را میپذیرد:
SELECT ... ASSIGN TO
در عبارت
شناسه filename میتواند داخل گیومه باشد یا نباشد. اگر داخل گیومه باشد، نشاندهنده نام پرونده آنگونه که برای سیستمعامل شناخته شده است میباشد. اگر بدون گیومه باشد، نشاندهنده یک عنصر داده یا یک متغیر محیطی است که حاوی نام پرونده است. اگر filename با نام یک عنصر داده مطابقت داشته باشد، آن عنصر استفاده میشود. در غیر این صورت، حل نام filename تا زمان اجرا به تعویق میافتد، زمانی که نام باید در محیط برنامه وجود داشته باشد.
XML PARSE
کامپایلر
gcobol دستور
XML PARSE
مربوط به IBM
را
شبیهسازی
میکند.
مقادیر زیر
برای XML-EVENT
تعریف
شدهاند:
- COMMENT
- متن یک توضیح (کامنت) بین "<!--" و "-->"
- CONTENT-CHARACTERS
- بخشی از متن یا تمام محتوای کاراکتری عنصر بین تگهای شروع و پایان.
- END-OF-ELEMENT
- تگ پایان عنصر، همراه با نام در صورت وجود در ورودی.
- PROCESSING-INSTRUCTION-DATA
- دستورالعمل پردازش (پس از نام هدف)، بدون در نظر گرفتن "?>".
- PROCESSING-INSTRUCTION-TARGET
- نام هدف دستورالعمل پردازش در XML-TEXT یا XML-NTEXT ظاهر میشود.
- START-OF-ELEMENT
- نام تگ شروع عنصر یا تگ عنصر خالی.
وضعیت پیادهسازی ISO کوبول (ISO COBOL Implementation Status)
انواع داده USAGE (USAGE Data Types)
کامپایلر
gcobol از
بندهای USAGE IS
زیر
پشتیبانی
میکند:
- INDEX
- برای استفاده به عنوان اندیس در یک جدول.
- POINTER
- برای متغیرهایی که مقدار آنها نشانی یک تابع خارجی، PROGRAM-ID یا قلم داده است. انتساب از طریق دستور SET انجام میشود.
- BINARY, COMP, COMPUTATIONAL, COMP-4, COMPUTATIONAL-4
- عدد صحیح big-endian از ۱ تا ۱۶ بایت، مطابق با بند PICTURE.
- COMP-1, COMPUTATIONAL-1, FLOAT-BINARY-32
- ممیز شناور با دقت تکی (۴ بایتی) IEEE 754، همانطور که سختافزار فراهم میکند.
- COMP-2, COMPUTATIONAL-2, FLOAT-BINARY-64
- ممیز شناور با دقت مضاعف (۸ بایتی) IEEE 754، همانطور که سختزار فراهم میکند.
- COMP-3, COMPUTATIONAL-3, PACKED-DECIMAL
- در حال حاضر پیادهسازی نشده است.
- COMP-5, COMPUTATIONAL-5
- عدد صحیح little-endian از ۱ تا ۱۶ بایت، مطابق با PICTURE.
- FLOAT-BINARY-128, FLOAT-EXTENDED
- ممیز شناور ۱۲۸ بیتی را طبق IEEE 754 پیادهسازی میکند.
کامپایلر
gcobol از
انواع عدد
صحیح ISO به
صورت
BINARY-<type>
پشتیبانی
میکند که
بیشتر
آنها نام
مستعار COMP-5
هستند.
| COMP-5 | Compatible | ||
| Picture | BINARY Type | Bytes | Value |
| BINARY-CHAR [UNSIGNED] | 1 | 0 — 256 | |
| S9(1...4) | BINARY-CHAR SIGNED | 1 | -128 — +127 |
| 9(1...4) | BINARY-SHORT [UNSIGNED] | 2 | 0 — 65535 |
| S9(1...4) | BINARY-SHORT SIGNED | 2 | -32768 — +32767 |
| 9(5...9) | BINARY-LONG [UNSIGNED] | 4 | 0 — 4,294,967,295 |
| S9(5...9) | BINARY-LONG SIGNED | 4 | -2,147,483,648 — +2,147,483,647 |
| 9(10...18) | BINARY-LONG-LONG [UNSIGNED] | 8 | 0 — 18,446,744,073,709,551,615 |
| S9(10...18) | BINARY-LONG-LONG SIGNED | 8 | -9,223,372,036,854,775,808 — +9,223,372,036,854,775,807 |
اینها اندازه را (به بایت) مشخص میکنند و نمیتوان همراه با یک بند PICTURE به کار برد. طبق استاندارد ISO، حالت SIGNED پیشفرض برای نامهای مستعار BINARY-type است.
تمامی محاسبات — هم اعداد صحیح و هم ممیز شناور — با استفاده از فرمهای میانی ۱۲۸ بیتی انجام میپذیرد.
نامهای محیط (Environment Names)
در gcobol
دستور
DISPLAY UPONنامهای SYSOUT و STDOUT را به خروجی استاندارد، و SYSPUNCH ، SYSPCH و STDERR را به خروجی خطای استاندارد نگاشت میکند.
وضعیت خروج (Exit Status)
کامپایلر
gcobol از نحو ISO
برای
بازگرداندن
وضعیت خروج
به
سیستمعامل
پشتیبانی
میکند:
علاوه بر
این، gcobol
از نحو IBM نیز
برای
بازگرداندن
وضعیت خروج
به
سیستمعامل
پشتیبانی
میکند. از
ثبات RETURN-CODE
استفاده
کنید:
MOVE ZERO TO RETURN-CODE. GOBACK.
ثبات RETURN-CODE به عنوان یک عدد صحیح باینری ۴ بایتی تعریف شده است.
امکان هدایت کامپایلر (COMPILER-DIRECTING FACILITY)
از امکان هدایت کامپایلر (CDF) باید با احتیاط استفاده شود زیرا هنوز مجموعه آزمونهای جامعی برای آن تعیین نشده است.
دستکاری متن CDF (CDF Text Manipulation)
- COPY copybook [OF|BY library] [REPLACING ...]
- اگر copybook یک
لیترال
باشد، به
عنوان نام
پرونده
لیترال در
نظر گرفته
میشود، چه
وجود داشته
باشد و چه
وجود
نداشته
باشد. اگر
copybook یک
کلمه COBOL
باشد،
gcobolابتدا به دنبال متغیر محیطی با نام copybook میگردد و در صورت یافتن، محتوای آن متغیر را به عنوان نام پرونده copybook استفاده میکند. اگر آن پرونده وجود نداشته باشد، به جستجو برای پروندهای با یکی از نامهای زیر ادامه میدهد:- copybook (دقیقاً به همین شکل)
- copybook.cpy
- copybook.CPY
- copybook.cbl
- copybook.CBL
- copybook.cob
- copybook.COB
به همان ترتیب. کامپایلر ابتدا در همان پوشه حاوی پرونده کد منبع جستجو میکند، و سپس در هر copybook-path که با گزینه
-Iمشخص شده باشد. آرگومان copybook-path میتواند (مانند متغیرPATHدر پوسته) فهرستی جداشده با دونقطه (:) باشد. گزینه-Iمیتواند چندین بار در خط فرمان تکرار شود. هر copybook-path متوالی به موارد پیشین الحاق میگردد. مسیرهای نسبی (که با ‘/’آغاز نمیشوند) به صورت نسبی نسبت به پوشه کاری فعلی کامپایلر جستجو میشوند.برای نمونه،
ابتدا پوشهای را که برنامه COBOL در آن قرار دارد جستجو میکند، سپس /usr/local/include ، و در نهایت زیرپوشه include از پوشهای که-I/usr/local/include:includegcobolاز آنجا فراخوانی شده است را جستجو مینماید.برای عبارت REPLACING ، هر دو شکل شبهمتن امروزی و اشکال COBOL/85 شناخته میشوند. (اشکال قدیمیتر در مجموعه آزمون NIST CCVS/85 استفاده شدهاند.)
- REPLACE ...
- کامپایلر
gcobolاز تمام نحو استاندارد ISO برای REPLACE پشتیبانی میکند.
دستورالعملهای CDF (CDF Directives)
- >>DEFINE name AS {expression | PARAMETER} [OVERRIDE]
- متغیر name
را به عنوان
یک متغیر
کامپایل با
مقدار expression
تعریف
میکند. اگر
name قبلاً
تعریف شده
باشد،
استفاده از
OVERRIDE
الزامی
است، در غیر
این صورت
دستورالعمل
نامعتبر
خواهد بود.
عبارت AS PARAMETER
پذیرفته
میشود،
اما هیچ
اثری در
gcobolندارد. - >>DEFINE name AS OFF
- تعریف name را آزاد میکند و استفاده از آن را پس از آن نامعتبر میسازد.
- >>IF
cce text
[>>ELSE
alt-text]
>>END-IF - عبارت cce
را که یک
عبارت
شرطی ثابت
(constant conditional expression) است
برای
کامپایل
شرطی
ارزیابی
میکند. در
صورتی که یک
نام باشد،
cce
میتواند
با پارامتر
خط فرمان
-Dتعریف شود. اگر درست (true) باشد، متن text از زبان COBOL کامپایل میشود. اگر نادرست (false) باشد، متن else-text (در صورت وجود) کامپایل خواهد شد. عبارت [IS [NOT]] DEFINED پشتیبانی میشود. لیترالهای بولی پشتیبانی نمیشوند. - >>EVALUATE
- پیادهسازی نشده است.
- >>CALL-CONVENTION convention
- شناسه convention
میتواند
یکی از
موارد زیر
باشد:
- COBOL
- استفاده از تطبیق نام نماد استاندارد و غیرحساس به حروف بزرگ و کوچک COBOL. برای CALL “name ،” مقدار name توسط کامپایلر با حروف کوچک درج میشود.
- C
- استفاده از تطبیق نام نماد حساس به حروف بزرگ و کوچک. مقصد CALL به هیچ وجه تغییر نمیکند و عیناً استفاده میشود.
- VERBATIM
- یک نام مستعار برای >>CALL-CONVENTION C.
- >>COBOL-WORDS EQUATE keyword WITH alias
- کلمه alias را مترادفی برای keyword قرار میدهد.
- >>COBOL-WORDS UNDEFINE keyword
- کلمه keyword را از گرامر COBOL حذف میکند. استفاده از آن در یک برنامه موجب بروز خطای نحوی از سوی کامپایلر خواهد شد.
- >>COBOL-WORDS SUBSTITUTE keyword BY new-word
- کلمه keyword به عنوان کلمه کلیدی از گرامر حذف شده و new-word جایگزین آن میشود. پس از آن میتوان از keyword به عنوان کلمه تعریفشده توسط کاربر استفاده نمود.
- >>COBOL-WORDS RESERVE new-word
- با new-word مانند یک کلمه کلیدی COBOL رفتار میکند. این کلمه دیگر توسط برنامه، چه به عنوان کلمه کلیدی و چه به عنوان کلمه تعریفشده توسط کاربر، قابل استفاده نخواهد بود.
- >>DISPLAY string ...
- رشته string را به عنوان پیام هشدار در خروجی خطای استاندارد مینویسد.
- >>SOURCE format
- قالب format میتواند یکی از موارد زیر باشد:
- >>FLAG-02
- پیادهسازی نشده است.
- >>FLAG-85
- پیادهسازی نشده است.
- >>FLAG-NATIVE-ARITHMETIC
- پیادهسازی نشده است.
- >>LEAP-SECOND
- پیادهسازی نشده است.
- >>LISTING
- پیادهسازی نشده است.
- >>PAGE
- پیادهسازی نشده است.
- >>PROPAGATE
- پیادهسازی نشده است.
- >>PUSH directive
- >>POP directive
- با PUSH ، وضعیت CDF را به یک پشته منتقل کنید. با POP ، به وضعیت قبلی که در پشته قرار گرفته بود بازگردید. دستورالعمل directive میتواند یکی از موارد زیر باشد:
- >>TURN [ec
[file
...] ...] CHECKING {[ON] [[WITH] LOCATION] | OFF} - شرط خطای
ec را که
به صورت
اختیاری با
رابطهای
پرونده
file مرتبط
است فعال
(یا با OFF،
غیرفعال)
میکند. اگر
LOCATION مشخص
شده باشد،
gcobolدر زمان اجرا نام پرونده منبع و شماره خط دستوری را که شرط خطا را ایجاد کرده گزارش میدهد.
متغیرهای مجموعه ویژگیها (Feature-set Variables)
برخی
گزینههای
خط فرمان بر
متغیرهای
مجموعه
ویژگیها
(feature-set) در CDF که
مختص gcobol
هستند اثر
میگذارند.
آنها را
میتوان با
استفاده از
>>DEFINE
و >>IF
تنظیم و
آزمایش
کرد، و با
کاراکتر
‘%’ در
ابتدای نام
شناخته
میشوند،
که در غیر
این صورت در
شناسههای
COBOL نامعتبر
است:
- %EBCDIC-MODE
- توسط گزینه
-fexec-charset=<encoding> برای تمام کدگذاریهای EBCDIC تنظیم میشود. - %64-BIT-POINTER
- به طور ضمنی
با
-dialect ibmفعال میگردد.
برای مقداردهی یک متغیر مجموعه ویژگیها، از دستور زیر استفاده کنید:
>>SET
feature [AS] {ON |
OFF}برای آزمایش یک متغیر مجموعه ویژگیها، از دستور زیر استفاده کنید:
>>IF
feature DEFINEDتوابع درونی (Intrinsic functions)
کامپایلر
gcobol تمامی
توابع
درونی
تعریفشده
توسط ISO/IEC 1989:2023 و
چند تابع
دیگر را
پیادهسازی
کرده است.
این توابع
بر حسب حروف
الفبا در
زیر فهرست
شدهاند:
- ABS ACOS ANNUITY ASIN ATAN
- BASECONVERT BIT-OF BIT-TO-CHAR BOOLEAN-OF-INTEGER BYTE-LENGTH
- CHAR CHAR-NATIONAL COMBINED-DATETIME CONCAT CONVERT COS CURRENT-DATE
- DATE-OF-INTEGER DATE-TO-YYYYMMDD DAY-OF-INTEGER DAY-TO-YYYYDDD DISPLAY-OF
- E EXCEPTION-FILE EXCEPTION-FILE-N EXCEPTION-LOCATION EXCEPTION-LOCATION-N EXCEPTION-STATEMENT EXCEPTION-STATUS EXP EXP10
- FACTORIAL FIND-STRING FORMATTED-CURRENT-DATE FORMATTED-DATE FORMATTED-DATETIME FORMATTED-TIME FRACTION-PART
- HEX-OF HEX-TO-CHAR HIGHEST-ALGEBRAIC
- INTEGER INTEGER-OF-BOOLEAN INTEGER-OF-DATE INTEGER-OF-DAY INTEGER-OF-FORMATTED-DATE INTEGER-PART
- LENGTH LOCALE-COMPARE LOCALE-DATE LOCALE-TIME LOCALE-TIME-FROM-SECONDS LOG LOG10 LOWER-CASE LOWEST-ALGEBRAIC
- MAX MEAN MEDIAN MIDRANGE MIN MOD MODULE-NAME
- NATIONAL-OF NUMVAL NUMVAL-C NUMVAL-F ORD
- ORD-MAX ORD-MIN
- PI PRESENT-VALUE
- RANDOM RANGE REM REVERSE
- SECONDS-FROM-FORMATTED-TIME SECONDS-PAST-MIDNIGHT SIGN SIN SMALLEST-ALGEBRAIC SQRT STANDARD-COMPARE STANDARD-DEVIATION SUBSTITUTE SUM
- TAN TEST-DATE-YYYYMMDD TEST-DAY-YYYYDDD TEST-FORMATTED-DATETIME TEST-NUMVAL TEST-NUMVAL-C TEST-NUMVAL-F TRIM
- ULENGTH UPOS UPPER-CASE USUBSTR USUPPLEMENTARY UUID4 UVALID UWIDTH
- VARIANCE
- WHEN-COMPILED
- YEAR-TO-YYYY
نمایش DISPLAY ممیز شناور دودویی (Binary floating point DISPLAY)
نحوه نمایش اعداد ممیز شناور دودویی توسط دستور DISPLAY به مقدار آن بستگی دارد.
هنگامی که یک مقدار شش یا تعداد کمتری رقم اعشاری در سمت چپ نقطه اعشار داشته باشد، به صورت 123456.789... نمایش داده میشود.
هنگامی که مقدار کمتر از ۱ باشد و بیش از سه صفر در سمت راست نقطه اعشار نداشته باشد، به صورت 0.0001234... نمایش داده میشود.
در غیر این صورت، از نماد علمی (نمایی) استفاده میشود: 1.23456E+7.
در همه موارد، صفرهای انتهایی در سمت راست عدد از مقدار نمایشدادهشده حذف میشوند.
- COMP-1
- با ۹ رقم اعشاری نمایش داده میشود.
- COMP-2
- با ۱۷ رقم اعشاری نمایش داده میشود.
- FLOAT-EXTENDED
- با ۳۶ رقم اعشاری نمایش داده میشود.
این تعداد ارقام با الزامات استاندارد IEEE 754 برای تبادل اطلاعات مطابقت دارد. به عنوان یک نمونه، توضیحات مربوط به مقادیر binary64 در COMP-2 (طبق ویکیپدیا).
اگر یک عدد ممیز شناور با دقت مضاعف IEEE 754 به یک رشته اعشاری با حداقل ۱۷ رقم بااهمیت (معنادار) تبدیل شود، و سپس دوباره به نمایش دقت مضاعف بازگردانده شود، نتیجه نهایی باید با عدد اصلی مطابقت داشته باشد.
عدد ۱۷ رقم از آن جهت انتخاب شده است که دستور DISPLAY محتوای یک متغیر COMP-2 را بدون پنهان کردن هیچ اطلاعاتی نشان دهد.
انتقال MOVE ممیز شناور دودویی (Binary floating point MOVE)
در حین اجرای دستور MOVE ، ممکن است یک مقدار ممیز شناور کوتاه (ترانکیت) شود. تغییر مقادیر Numeric Display هنگام انتقال از طریق یک مقدار ممیز شناور غیرعادی نخواهد بود.
این برنامه:
01 PICV999 PIC 9999V999. 01 COMP2 COMP-2. PROCEDURE DIVISION. MOVE 1.001 to PICV999 MOVE PICV999 TO COMP2 DISPLAY "The result of MOVE " PICV999 " TO COMP2 is " COMP2 MOVE COMP2 to PICV999 DISPLAY "The result of MOVE COMP2 TO PICV999 is " PICV999
این نتیجه را تولید میکند:
The result of MOVE 0001.001 TO COMP2 is 1.00099999999999989 The result of MOVE COMP2 TO PICV999 is 0001.000
با این حال، پیادهسازی داخلی میتواند نتایجی تولید کند که ممکن است شگفتآور به نظر برسد:
The result of MOVE 0055.110 TO COMP2 is 55.1099999999999994 The result of MOVE COMP2 TO PICV999 is 0055.110
منشأ این
ناسازگاری
روش
ذخیرهسازی
و تبدیل
اعداد در
کامپایلر
gcobol است.
تبدیل
مقدار ممیز
شناور به
مقدار
نمایشی
عددی 0055110 از
طریق ضرب 55.109999...
در 1000 و سپس
کوتاه کردن
(ترانکیت)
نتیجه به یک
عدد صحیح
انجام
میشود. و
مشخص شده
است که با
وجود اینکه
55.11
نمیتواند
به عنوان یک
مقدار دقیق
در ممیز
شناور
نمایش
یابد،
حاصلضرب
این ضرب،
یعنی 55110، یک
مقدار دقیق
است.
در مواردی که داشتن نتایج قابل پیشبینی برای تبدیلات اهمیت دارد، باید بتوانیم گرد کردن را اعمال کنیم، که این کار را میتوان با یک دستور محاسباتی انجام داد:
MOVE 1.001 to PICV999 MOVE PICV999 TO COMP2 DISPLAY "The result of MOVE " PICV999 " TO COMP2 is " COMP2 MOVE COMP2 to PICV999 DISPLAY "The result of MOVE COMP2 TO PICV999 is " PICV999 ADD COMP2 to ZERO GIVING PICV999 ROUNDED DISPLAY "The result of ADD COMP2 to ZERO GIVING PICV999 ROUNDED is " PICV999 The result of MOVE 0001.001 TO COMP2 is 1.00099999999999989 The result of MOVE COMP2 TO PICV999 is 0001.000 The result of ADD COMP2 to ZERO GIVING PICV999 ROUNDED is 0001.001
محاسبات ممیز شناور دودویی (Binary floating point computation)
کامپایلر
gcobol تلاش
میکند تا
در صورت
امکان
محاسبات
داخلی را با
استفاده از
اعداد صحیح
باینری
انجام دهد.
بدین
ترتیب،
محاسبات
ریاضی ساده
بین مقادیر
باینری و
مقادیر
نمایش عددی
با نتایج
میانی
باینری
پایان
مییابند.
اگر یک مقدار ممیز شناور در میان متغیرهای مشخصشده برای یک محاسبه قرار گیرد، نتیجه میانی به یک مقدار ممیز شناور ۱۲۸ بیتی تبدیل میشود.
هشداری در مورد مقایسه ممیز شناور دودویی (A warning about binary floating point comparison)
قاعده بنیادین هنگام انجام مقایسههای شامل مقادیر ممیز شناور: هرگز و تحت هیچ شرایطی تساوی دقیق را بررسی نکنید. این کار اصلاً ارزش دردسرهایش را ندارد.
برای نمونه:
WORKING-STORAGE SECTION. 01 COMP1 COMP-1 VALUE 555.11. 01 COMP2 COMP-2 VALUE 555.11. PROCEDURE DIVISION. DISPLAY "COMPARE " COMP1 " with " COMP2 IF COMP1 EQUAL COMP2 DISPLAY "Equal" ELSE DISPLAY "Not equal" END-IF MOVE COMP1 to COMP2 DISPLAY "COMPARE " COMP1 " with " COMP2 IF COMP1 EQUAL COMP2 DISPLAY "Equal" ELSE DISPLAY "Not equal" END-IF
نتایج:
COMPARE 555.1099854 with 555.110000000000014 Not equal COMPARE 555.1099854 with 555.1099853515625 Equal
چرا؟ باز
هم این
موضوع به
ساختار
داخلی gcobol
مربوط
میشود.
هنگامی که
مقادیر
ممیز شناور
با
اندازههای
مختلف باید
با هم
مقایسه
شوند،
ابتدا به
ممیز شناور
۱۲۸ بیتی
تبدیل
میشوند. و
مشخص شده
است که وقتی
یک COMP1 به یک COMP2
منتقل
میشود، و
هر دو به FLOAT-EXTENDED
تبدیل
میگردند،
دو مقدار
حاصل
(احتمالاً)
برابر
خواهند
بود.
از بررسی تساوی اجتناب کنید مگر اینکه واقعاً بدانید چه کار میکنید و کد را کاملاً آزمایش کرده باشید. و حتی پس از آن نیز بهتر است از آن دوری کنید.
در نهایت،
به طور
مشهودی
مشخص است که
پیادهسازی
تبدیلها و
مقایسههای
ممیز شناور
در gcobol
دقیقاً با
رفتار سایر
کامپایلرهای
COBOL یکسان
نیست.
این هشدار را جدی بگیرید.
محیط (ENVIRONMENT)
COBPATH- در صورت
تعریف شدن،
مسیرهای
پوشهای را
مشخص
میکند که
باید توسط
کتابخانه
زمان اجرای
،یعنی libgcobol.so ، برای یافتن اشیاء مشترک (shared objects) استفاده شوند. همانندLD_LIBRARY_PATH ،میتواند شامل چندین نام پوشه باشد که با دونقطه (‘:’) از هم جدا شدهاند. ابتداCOBPATHجستجو میشود و به دنبال آنLD_LIBRARY_PATH. توجه داشته باشید کهCOBPATHمحل جستجوی پیونددهنده زمان اجرا را برای یافتن خود libgcobol.so تغییر نمیدهد. نحوه جستجوی پیونددهنده زمان اجرا برای libgcobol.so هنگام بارگذاری پرونده اجرایی توسط ld.so(8) کنترل میشود، نه توسط libgcobol.هر پوشه برای یافتن پروندههایی که نام آنها به ‘
.so’ ختم میشود جستجو میگردد. برای هر پروندهای از این دست، فراخوانی dlopen(3) آزموده میشود و در صورت موفقیت، فراخوانی dlsym(3). هیچ رابطهای بین نام نماد و نام پرونده تعریف نشده است.بدون
COBPATH ،پروندههای باینری تولیدشده توسطgcobolهمانگونه رفتار میکنند که از هر برنامه کامپایلشده با gcc انتظار میرود. هر شیء مشترکی که مورد نیاز برنامه باشد در خط فرمان با گزینه-llibrary ذکر میشود و با دنبال کردن RPATH پرونده اجرایی یا طبق پیکربندی پیونددهنده زمان اجرا، ld.so(8) ، یافت میگردد. UPSI- زبان COBOL یک
سوییچ
نشانگر
وضعیت قابل
برنامهریزی
توسط کاربر
(UPSI) را تعریف
میکند. در
،این تنظیمات با UPSI-0 تا UPSI-7 مشخص میشوند که در آن 0 تا 7 نشاندهنده موقعیت بیت است. مقدار سوییچهای UPSI از متغیر محیطیUPSIگرفته میشود که مقدار آن رشتهای از حداکثر هشت کاراکتر 1 و 0 است. نخستین کاراکتر نشاندهنده مقدار UPSI-0 است و مقادیر ناموجود برابر با 0 در نظر گرفته میشوند. برای نمونه، مقدار UPSI=1000011 در محیط، بیتهای 0، 5 و 6 را روشن میکند؛ به این معنا که UPSI-0 ، UPSI-5 و UPSI-6 روشن هستند. GCOBOL_TEMPDIR- باعث
میشود هر
پرونده
موقتی که در
حین پردازش
CDF ایجاد
میشود در
پروندهای
نوشته شود
که نام آن
در مقدار
GCOBOL_TEMPDIRمشخص شده است. اگر مقدار آن تنها “/” باشد، اثر متفاوتی دارد: خواندن هر copybook در خروجی خطای استاندارد گزارش میشود. این ویژگی برای کمک به عیبیابی خطاهای ناشناخته copybook طراحی شده است.
متغیرها برای توسعهدهندگان (Variables for Developers)
GCOBOL_SHOW- ردیابی از فراخوانیهای داخلی انجامشده توسط تجزیهکننده برای آمادهسازی درخت GENERIC را تولید میکند.
GCOBOL_TRACE- در زمان
کامپایل،
پرونده
اجرایی را
تولید
میکند که
اجرا را
ردیابی
کرده و آن
را به همان
توابع
تولید کدی
نگاشت
میکند که
در
GCOBOL_SHOWمشاهده میشود، و همچنین مقادیر اقلام داده و شرایط انشعاب را ردیابی مینماید.
فایلها (FILES)
پروندههای
اجرایی
تولیدشده
توسط gcobol
به
کتابخانه
پشتیبانی
زمان اجرای
libgcobol نیاز
دارند که هم
به عنوان
کتابخانه
ایستا و هم
به عنوان
شیء مشترک
ارائه
میشود.
سازگاری (COMPATIBILITY)
استاندارد
ISO تعیین
ساختار
پیشفرض
پروندهها
را بر عهده
پیادهسازی
گذاشته
است؛ در
، حالت
پیشفرض
SEQUENTIAL است.
قالب روی دیسک (On-Disk Format)
هرگونه
توانایی در
استفاده از
پروندههای
تولیدشده
توسط سایر
کامپایلرهای
COBOL، یا
استفاده آن
کامپایلرها
از
پروندههای
تولیدشده
توسط ،
حاصل شانس و
شهود است.
کامپایلرهای
گوناگون
استاندارد ISO
را به
شکلهای
متفاوتی
تفسیر
میکنند و
متن
استاندارد
همواره
قطعی نیست.
برای
پروندههای
با ساختار
ORGANIZATION IS LINE
SEQUENTIAL (به
صراحت یا به
صورت
پیشفرض)،
gcobol در
صورت نبود
دستورالعمل
خاص، یک
پرونده
متنی
معمولی
لینوکس
تولید
میکند:
برای هر WRITE،
دادهها
نوشته شده و
به دنبال
آنها یک
کاراکتر خط
جدید ASCII NL (هگز 0A)
میآید. در
هنگام READ،
رکورد تا
اندازه
رکورد
مشخصشده
یا تا رسیدن
به NL خوانده
میشود، هر
کدام که
زودتر رخ
دهد.
کاراکتر NL در
دادههای
واردشده به
بافر رکورد
گنجانده
نمیشود؛
این
کاراکتر
تنها به
عنوان
نشانگر
پایان
رکورد روی
دیسک عمل
میکند. در
نتیجه،
پروندههای
SEQUENTIAL و LINE SEQUENTIAL
به یک شکل
کار
میکنند:
برنامه COBOL
هرگز
نشانگر
پایان
رکورد را
نمیبیند.
با این
حال،
هنگامی که
READ و
WRITE همراه
با ADVANCING
استفاده
میشوند،
شرایط
تغییر
میکند. اگر
ADVANCING همراه
با
پروندههای
LINE SEQUENTIAL به کار
رود، توسط
gcobol رعایت
میشود.
سایر کامپایلرها ممکن است چنین عمل نکنند. طبق استاندارد ISO، در دستور WRITE (بخش 14.9.47.3 قواعد عمومی)، عبارت ADVANCING برای پروندههایی که “پرونده فیزیکی از موقعیتیابی عمودی پشتیبانی نمیکند” نادیده گرفته میشود (ignored)ADVANCING ، دستور WRITE به گونهای عمل میکند که گویی “کاربر عبارت AFTER ADVANCING 1 LINE را مشخص کرده است”. برخی پیادهسازیهای دیگر این را بدین معنا تفسیر میکنند که نخستین WRITE در یک پرونده LINE SEQUENTIAL منجر به درج یک NL در ابتدای خط اول میشود، و هیچ NL پایانی در خط آخر درج نمیگردد. برخی نیز فراتر رفته و استفاده از ADVANCING را با پروندههای LINE SEQUENTIAL ممنوع میدانند.
همچنین ببینید (SEE ALSO)
استانداردها (STANDARDS)
استاندارد
مرجع برای
gcobol برابر
با ISO/IEC 1989:2023 است.
- اگر
gcobolکدی مطابق با این استاندارد را کامپایل کند، برنامه حاصل باید به درستی اجرا شود؛ هر نتیجه دیگری یک باگ محسوب میشود. - اگر
gcobolکدی را کامپایل کند که با این استاندارد سازگار نیست، اما بر اساس مشخصات دیگری به درستی اجرا شود، این نشاندهنده یک افزونه غیراستاندارد است. در آینده گزینه-pedanticبرای چنین کدهایی پیامهای تشخیصی تولید خواهد کرد. - اگر
gcobolکدی را رد کند که با آن استاندارد سازگار است، نشاندهنده جنبهای از COBOL است که در فهرست کارهای آینده قرار دارد (یا ندارد). اگر مایلید کامپایل شدن آن را ببینید، لطفاً با توسعهدهندگان تماس بگیرید.
وضعیت آزمونهای اعتبارسنجی کامپایلر NIST کوبول (Status of NIST COBOL Compiler Verification Suite)
- NC 100%
- هسته اصلی (Nucleus)
- SQ 100%
- ورودی/خروجی ترتیبی (Sequential I/O)
- RL 100%
- ورودی/خروجی نسبی (Relative I/O)
- IX 100%
- ورودی/خروجی شاخصدار (Indexed I/O)
- IC 100%
- ارتباط بین برنامهها (Inter-Program Communication)
- ST 100%
- مرتبسازی و ادغام (Sort-Merge)
- SM 100%
- دستکاری متن منبع RW \n گزارشنویس (Report Writer)
- CM
- ارتباطات (Communication)
- DB to do?
- اشکالزدایی (Debug)
- SG
- بخشبندی (Segmentation)
- IF 100%
- توابع درونی (Intrinsic Function)
در جایی که
gcobol ۱۰۰٪
آزمونها
را در یک
ماژول با
موفقیت پشت
سر
میگذارد،
ما
آزمونهای
(اندک) مربوط
به
ویژگیهای
منسوخ را
مستثنی
میکنیم.
سازندگان
ویژگیهایی
را که در سال
۱۹۸۵ منسوخ
شده بودند،
امروزه
کاملاً و
واقعاً
منسوخ
میدانند و
آنها را
پیادهسازی
نکردهاند.
ویژگیهای به تعویق افتاده قابل توجه (Notable deferred features)
ماژولهای CCVS-85 که در بالا با وضعیتی مشخص نشدهاند (CM و SG) در فهرست “شاید محتمل” قرار دارند، به این معنی که در انتظار اعلام نیاز طرف علاقهمندی هستند که کدهای واقعی با استفاده از آن ویژگی داشته باشد.
کامپایلر
gcobol
بخشهای Report Writer
یا Screen Section را
پیادهسازی
نمیکند.
فراتر از COBOL/85 (Beyond COBOL/85)
کامپایلر
gcobol به طور
فزایندهای
ISO/IEC 1989:2023 را
پیادهسازی
میکند.
برای
نمونه،
DECLARATIVES
توسط CCVS-85
آزمایش
نمیشود،
اما توسط
gcobol
پیادهسازی
شده است. به
همین
ترتیب،
شرایط خطا (Exception
Conditions) در سال
۱۹۸۵ تعریف
نشده
بودند، و
gcobol شامل
تعداد
فزایندهای
از آنها
است.
سازندگان به خوبی آگاه هستند که یک کامپایلر کامل و خالص COBOL-85 بیشتر کدهای موجود COBOL را کامپایل نخواهد کرد. هر شرکتی افزونههایی را ارائه کرده (و میکند)، و بیشتر محیطها به انواع پیشپردازندهها و سیستمهای کمکی تعریفشده در خارج از استاندارد متکی هستند. هدف صریح افزودن یک فرانتاند استاندارد ISO COBOL به GCC، ایجاد پایهای است که بر روی آن بتوان هرگونه افزونه مورد نیاز را بنا کرد.
تاریخچه (HISTORY)
زبان COBOL
ممکن است به
خوبی
قدیمیتر
از خواننده
این متن
باشد. تا
جایی که
نویسندگان
آگاهی
دارند،
کامپایلرهای
آزاد COBOL
نخستین بار
در سال ۲۰۰۰
ظاهر شدند.
در همان
زمان پروژه
قبلی COBOL برای GCC
موسوم به
cobolforgcc
به
موفقیتهایی
دست یافت،
اما هرگز به
طور رسمی در
GCC ادغام نشد.
این
کامپایلر،
، توسط
COBOLworx
در پاییز
۲۰۲۱ آغاز
شد. این
پروژه
پیادهسازی
کامل
ویژگیهای
اصلی زبان
را در
دسامبر
۲۰۲۲ اعلام
کرد.
نویسندگان (AUTHORS)
- James K. Lowden
- (jklowden@cobolworx.com) مسئول تجزیهکننده (parser) است.
- Robert Dubner
- (rdubner@cobolworx.com) مسئول تولید درخت GIMPLE است که ورودی بخش انتهایی (back-end) کامپایلر GCC محسوب میشود.
هشدارها (CAVEATS)
- کامپایلر
gcobolتنها بر روی پردازندههای x64 و Apple M1 تحت سیستمعامل لینوکس در حالت ۶۴ بیتی آزمایش شده است. - پشتیبانی
از
ورودی/خروجی
(I/O) به طور
گسترده
آزمایش
نشده است و
بسیاری از
ویژگیهای
مرتبط با VSAM و
سایر
زیرسیستمهای
مینفریم
را
پیادهسازی
یا
شبیهسازی
نمیکند. در
حالی که
پروندههای
LINE-SEQUENTIAL
پروندههای
متنی
معمولی
هستند که
میتوان
آنها را با
ابزارهای
استاندارد
دستکاری
کرد،
پروندههای
INDEXED و RELATIVE
تولیدشده
توسط
gcobolبا پروندههای هیچ کامپایلر دیگر COBOL سازگار نیستند. بهبود و ارتقای پشتیبانی از I/O به آسانی برای مشتریان تجاری در دسترس خواهد بود.
| February 2025 | Linux |