GCOBOL(1) 1 (gcc cobol compiler) GCOBOL(1)

gcobol — کامپایلر کوبول پروژه گنو

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 [...]

gcobol کد منبع COBOL را به کد شیء کامپایل می‌کند و به صورت اختیاری یک پرونده باینری اجرایی یا شیء مشترک (shared object) تولید می‌نماید. به عنوان یکی از اجزای GCC، تمام گزینه‌هایی را که بر تولید کد و پیونددهی اثر می‌گذارند می‌پذیرد. گزینه‌های اختصاصی COBOL در ادامه فهرست شده‌اند.

filename
کامپایلر gcobol یک تابع () را به عنوان نقطه ورود ایجاد می‌کند که نخستین PROGRAM-ID را در filename فراخوانی می‌نماید.

گزینه -main حالت پیش‌فرض است. هنگامی که هیچ‌یک از گزینه‌های -nomain -، -c یا -shared وجود نداشته باشند، یک گزینه -main ضمنی پیش از نام نخستین پرونده منبع در خط فرمان درج می‌شود.

=filename
ماژول شیء .o برای filename شامل یک نقطه ورود () خواهد بود که نخستین PROGRAM-ID را در filename فراخوانی می‌کند.
=filename:program-id
ماژول شیء .o برای filename شامل یک نقطه ورود main() خواهد بود که نقطه ورود program-id را فراخوانی می‌نماید.
هیچ نقطه ورود main() توسط این کامپایل ایجاد نخواهد شد. گزینه -nomain با -main ناسازگار است و در صورت استفاده از -shared به طور ضمنی اعمال می‌شود. همچنین در صورت عدم وجود -main -، توسط -c نیز به طور ضمنی در نظر گرفته می‌شود.

برای نمونه‌هایی از کاربرد -main و -nomain به بخش‌های پایین‌تر مراجعه کنید.

name[=expr]
یک نام CDF (برای استفاده با >>IF) تعریف می‌کند تا مقدار expr را داشته باشد.
ورودی COBOL پردازش‌شده توسط CDF را در قالب مرجع فرم‌آزاد (free-form reference format) در خروجی استاندارد می‌نویسد. برخی نشانگرهای غیر-COBOL در خروجی گنجانده می‌شوند تا نشان دهند فایل‌های copybook در کجا درج شده‌اند. برای یکدستی شماره خطوط با ورودی، خطوط خالی حفظ می‌شوند.

برخلاف کامپایلر C، این گزینه مانع از کامپایل نمی‌شود. برای جلوگیری از کامپایل، گزینه

-fsyntax-only
را نیز همراه آن به کار ببرید.
=value
از value ، عددی بین 0 تا 255، به عنوان مقدار پیش‌فرض برای تمام اقلام داده WORKING-STORAGE که فاقد بند VALUE هستند استفاده می‌کند. به طور پیش‌فرض، اقلام داده الفبایی-عددی با فاصله خالی و اقلام داده عددی با صفر مقداردهی اولیه می‌شوند. این گزینه مقدار پیش‌فرض را با value جایگزین می‌کند.
تنها تجزیه‌کننده (parser) را فراخوانی می‌کند. کد را برای یافتن خطاهای نحوی بررسی می‌کند، اما فراتر از آن عملی انجام نمی‌دهد.
ext
برای دستورالعمل CDF به صورت
COPY name
چنانچه name بدون گیومه باشد، چندین حالت مختلف از name آزموده می‌شود، همان‌طور که در زیر در بخش Copybooks توضیح داده شده است. گزینه -copyext نام‌های جستجوشده را گسترش می‌دهد تا ext را نیز شامل شوند. اگر ext کاملاً با حروف بزرگ یا کاملاً با حروف کوچک باشد، هر دو حالت آزموده می‌شوند و اولویت با حالتی است که ارائه شده است. اگر ext ترکیبی از حروف بزرگ و کوچک باشد، تنها همان نسخه آزموده می‌شود. برای نمونه، با
-copyext .abc
در صورت وجود دستورالعمل CDF به صورت
COPY name
کامپایلر gcobol نام‌های ‘name.abc’ و ‘name.ABC’ را به ترتیب به نام‌های احتمالی جستجو اضافه می‌کند.
استفاده از قالب مرجع فرم‌ثابت (fixed-form reference format) سخت‌گیرانه در خواندن ورودی COBOL: خطوط 72 کاراکتری، با ناحیه توالی 6 کاراکتری و یک ستون نشانگر. داده‌های پس از ستون 72 نادیده گرفته می‌شوند.
ورودی COBOL را وادار می‌کند تا به عنوان قالب مرجع فرم‌آزاد (free-form reference format) تفسیر شود. شکستن خطوط بی‌اهمیت است، جز اینکه ‘*’ در ابتدای خط به عنوان نشانگر توضیح عمل می‌کند. معادل است با -indicator-column 0.
محل ناحیه نشانگر (Indicator Area) را در یک پرونده COBOL در قالب مرجع (Reference Format) شرح می‌دهد، جایی که ۶ ستون اول — موسوم به “ناحیه شماره توالی” — نادیده گرفته می‌شوند و ستون هفتم — ناحیه نشانگر — می‌تواند حاوی کاراکتری با اهمیت برای کامپایلر باشد.

اگرچه قالب مرجع به معنای دقیق کلمه، داده‌های پس از ستون ۷۲ را نادیده می‌گیرد، با این گزینه gcobol خطوط طولانی COBOL را می‌پذیرد که گاه به عنوان قالب منبع گسترش‌یافته (extended source format) شناخته می‌شود. متن پس از ستون ۷۲ به عنوان متن عادی COBOL در نظر گرفته می‌شود. (با این حال، ادامه خط تا زمانی معتبر است که متنی پس از ستون ۷۲ ظاهر نشود.)

هیچ حداکثری برای طول خط وجود ندارد. بدون توجه به قالب کد منبع، کل برنامه می‌تواند در یک خط قرار گیرد.

به طور پیش‌فرض، gcobol قالب کد منبع را با بررسی خطی که حاوی عبارت "program-id" است به صورت خودکار تشخیص می‌دهد. هرگاه کاراکترهایی پس از ستون ۷۲ در آن خط وجود داشته باشد، فرض می‌شود پرونده در قالب منبع گسترش‌یافته است و ناحیه نشانگر در ستون ۷ قرار دارد. در غیر این صورت، ستون‌های ۱ تا ۶ بررسی می‌شوند. اگر این کاراکترها همگی رقم یا فاصله خالی باشند، فرض می‌شود پرونده در قالب مرجع فرم‌ثابت است، باز هم با نشانگر در ستون ۷. اگر به عنوان قالب مرجع فرم‌ثابت یا قالب منبع گسترش‌یافته تشخیص داده نشود، فرض می‌شود پرونده در قالب مرجع فرم‌آزاد است.

exception [,exception...]
به طور پیش‌فرض هیچ شرط خطایی (از جمله خطاهای مهلک) فعال نیست و طبق استاندارد ISO، شرایط خطا تنها از طریق دستورالعمل CDF موسوم به TURN فعال می‌شوند. این گزینه یک یا چند شرط خطا را به طور پیش‌فرض فعال می‌کند، گویی دستور TURN در بالای نخستین پرونده کد منبع آمده است. این گزینه همچنین می‌تواند بیش از یک بار در خط فرمان ظاهر شود.

مقدار exception نام یک شرط خطای سطح ۱، ۲ یا ۳ است، همان‌طور که در ISO/IEC 1989:2023 شرح داده شده است. ‘EC-ALL’ به معنای فعال‌سازی تمام شرایط خطا است.

شکل -fno-cobol-exceptions شرط exception را غیرفعال می‌کند، دقیقاً به گونه‌ای که گویی دستور

>>TURN exception CHECKING OFF
درج شده باشد.

همه شرایط خطا پیاده‌سازی نشده‌اند. هر موردی که پیاده‌سازی نشده باشد یک پیام هشدار تولید می‌کند.

=nerror
nerror بیانگر تعداد پیام‌های خطای تولیدشده است. بدون این گزینه، gcobol تلاش می‌کند با از سرگیری کامپایل در دستور بعدی، از یک خطای نحوی بازیابی شود و تا انتهای پرونده ادامه دهد. با این گزینه، gcobol پیام‌ها را با تولید شدن شمارش کرده و با رسیدن به nerror متوقف می‌شود.
, -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) حل می‌شود، زیرا مقدار آن در زمان اجرا تعیین می‌گردد.

encoding
مجموعه کاراکترهای اجرایی پیش‌فرض را برای اقلام داده و لیترال‌های الفبایی-عددی در صورت عدم وجود CHARACTER CLASSIFICATION در CONFIGURATION SECTION تنظیم می‌کند. encoding نام یک کدگذاری است همان‌گونه که توسط iconv(3) تعریف شده است. مگر اینکه خلاف آن مشخص شده باشد، کدگذاری زمان اجرا برای هر دو حالت الفبایی-عددی و NATIONAL برابر با تعریف‌شده در iconv(3) است.
encoding
مجموعه کاراکترهای اجرایی پیش‌فرض را برای اقلام داده و لیترال‌های NATIONAL در صورت عدم وجود CHARACTER CLASSIFICATION در CONFIGURATION SECTION تنظیم می‌کند. encoding نام یک کدگذاری است همان‌گونه که توسط iconv(3) تعریف شده است. برای استفاده از کدگذاری EBCDIC برای اقلام داده، برای نمونه می‌توان از
-fexec-national-charset=CP1140
استفاده کرد.
dialect-name
به طور پیش‌فرض، gcobol نحو COBOL را همان‌طور که توسط ISO/IEC 1989:2023 تعریف شده می‌پذیرد، به همراه برخی افزونه‌ها برای سازگاری عقبرو با COBOL-85. نحوهای بیشتر با این گزینه پشتیبانی می‌شوند. مقدار dialect-name می‌تواند یکی از موارد زیر باشد:
ibm
برای مشخص کردن نحو IBM COBOL 6.4:
gnu
برای مشخص کردن نحو GnuCOBOL، که عموماً با MicroFocus سازگار است.
mf
برای مشخص کردن نحو MicroFocus:
filename
پرونده filename را به گونه‌ای پردازش می‌کند که گویی
COPY “filename”
به عنوان نخستین خط پرونده منبع اصلی آمده است. اگر filename یک مسیر مطلق نباشد، پوشه جستجوشده پوشه کاری فعلی است، نه پوشه‌ای که پرونده منبع اصلی را در بر دارد. نام دقیقاً عیناً استفاده می‌شود؛ هیچ دگرگونی اعمال نمی‌شود و هیچ پوشه‌ای جستجو نمی‌گردد.

اگر چندین گزینه -include داده شود، پرونده‌ها به همان ترتیبی که در خط فرمان آمده‌اند اضافه می‌شوند.

preprocess-filter
پس از اعمال تمام دستکاری‌های متنی CDF و پیش از ارسال متن آماده‌شده COBOL به کامپایلر ورودی می‌تواند توسط یک یا چند فیلتر بیشتر تغییر یابد. به رسم سنتی sed(1) ، هر preprocess-filter از ورودی استاندارد می‌خواند و در خروجی استاندارد می‌نویسد.

برای ارسال گزینه‌ها به preprocess-filter ، از یک رشته جداشده با کاما استفاده کنید، مشابه روشی که گزینه‌های پیونددهنده به - ارسال می‌شوند. (بعد از کاما هیچ فاصله‌ای نگذارید، زیرا پوسته آن را به عنوان جداکننده گزینه در نظر می‌گیرد.) کامپایلر gcobol هنگام فراخوانی preprocess-filter هر کاما را با یک فاصله جایگزین می‌کند. برای نمونه،

-preprocess tee,output.cbl
ابزار tee(1) را با آرگومان نام پرونده خروجی output.cbl فراخوانی می‌کند و باعث می‌شود یک رونوشت از ورودی در پرونده نوشته شود.

کامپایلر gcobol پوشه کاری فعلی و پوشه‌های موجود در متغیر محیطی PATH را برای یافتن یک پرونده اجرایی که نام آن با preprocess-filter مطابقت دارد جستجو می‌کند. نخستین موردی که یافت شود استفاده می‌گردد. اگر موردی یافت نشود، یک خطا گزارش شده و کامپایلر فراخوانی نمی‌شود.

گزینه -preprocess می‌تواند بیش از یک بار در خط فرمان ظاهر شود. هر preprocess-filter به نوبه خود و به ترتیب ظاهر شدن اعمال می‌شود.

فیلتر preprocess-filter باید وضعیت خروج صفر برگرداند که نشان‌دهنده موفقیت است. اگر وضعیت خروج غیرصفر بازگرداند، یک خطا گزارش شده و کامپایلر فراخوانی نمی‌شود.

, -fyacc-debug
پیام‌های مفیدی برای توسعه کامپایلر تولید می‌کنند. گزینه -fflex-debug جریان توکن‌شده ورودی را چاپ می‌کند. گزینه -fyacc-debug عملیات انتقال و کاهش (shift and reduce) انجام‌شده توسط تجزیه‌کننده را نشان می‌دهد.

بسیاری از گزینه‌های هشدار می‌توانند برای تبدیل پیام‌های خطا به هشدار یا نادیده گرفتن پیام‌های مرتبط با گویش‌های مختلف COBOL استفاده شوند. کاربر می‌تواند این موارد را ترکیب کند. گروهی از ویژگی‌ها را می‌توان با تعیین یک گویش (یا بیش از یک گویش) فعال کرد و ویژگی‌های منفرد را می‌توان به صورت هشدار، خطا یا پنهان‌سازی تنظیم نمود.

هشدار در صورت استفاده از APPLY COMMIT.
هشدار در صورت برخورد با دستورالعمل نادرست ‘#line’.
هشدار در صورت استفاده از BINARY-LONG-LONG.
هشدار در صورت استفاده از CALL ... GIVING.
هشدار در صورت استفاده از CALL با یک پارامتر لیترال از طریق مرجع (by reference).
هشدار در صورت استفاده از CDF $IF.
هشدار در صورت استفاده از COMPUTATIONAL-6.
هشدار در صورت استفاده از COMPUTATIONAL با PICTURE X.
هشدار در صورت استفاده از FILE CODE SET.
هشدار در صورت استفاده از INSPECT ... TRAILING.
هشدار در صورت استفاده از Level 01 با OCCURS.
هشدار در صورت تعریف ثابت Level 78 توسط CDF.
هشدار در صورت استفاده از MOVE INDEX.
هشدار در صورت استفاده از MOVE POINTER.
هشدار در صورت استفاده از RETURNING <number>.
هشدار در صورت استفاده از USAGE IS TYPENAME.
هشدار در صورت نامعتبر بودن رشته عددی.
هشدار در صورت تعریف نشدن CDF PARAMETER ارجاع‌شده.
هشدار در صورت تعریف نشدن نام CDF ارجاع‌شده.
هشدار در صورت استفاده از EJECT سبک IBM (به جای خطا).
هشدار در صورت استفاده از RESUME استاندارد ISO همراه با -dialect ibm (به جای خطا).
هشدار در صورت استفاده از VOLATILE (به جای خطا در صورت وجود -dialect ibm).
چاپ پیام هنگام پردازش copybook.
هشدار در صورت ارجاع به شرط خطای پیاده‌سازی‌نشده یا ناشناخته.
چاپ پیام هنگام مشخص شدن ENTRY CONVENTION.
هشدار در صورت استفاده از HIGH-ORDER-LEFT HIGH-ORDER-RIGHT.
چاپ پیام هنگام پردازش پرونده درج‌شده (include file).
هشدار در صورت استفاده از LENGTH OF.
هشدار در صورت استفاده از Level 78.
هشدار در صورت استفاده لیترال‌های الحاق‌شده از کدگذاری‌های مختلف.
هشدار در صورت شکست locale(3).
هشدار در صورتی که COBOL MOVE فیلدهای متناظری نداشته باشد.
هشدار در صورت شکست nl_langinfo(3).
هشدار در صورت استفاده از RECORDING MODE.
هشدار در صورت استفاده از قطعه‌های SECTION.
هشدار در صورت استفاده از SET LOCALE ... TO.
هشدار در صورت استفاده از SET ... TO LOCALE. هشدار در صورت نامعتبر بودن دستورالعمل line (به جای خطا).
هشدار در صورتی که iconv(3) نتواند بین کدگذاری‌ها تبدیل انجام دهد (به جای خطا).
هشدار در صورت پیدا نشدن پرونده include (به جای خطا).
هشدار در صورتی که عملگر رابطه‌ای با فاصله همراه نباشد (به جای خطا).
هشدار در صورت شکست پیش‌پردازنده (به جای خطا).
هشدار در صورت استفاده از PROCEDURE POINTER.
هشدار در صورت پیدا نشدن رویه ارجاع‌شده (به جای خطا).
هشدار در صورتی که REPLACE نتواند پردازش شود (به جای خطا).
هشدار در صورت نامعتبر بودن بخش SEGMENT (به جای خطا).
هشدار در صورتی که بازه SEGMENT منفی باشد (به جای خطا).
هشدار در صورت استفاده از STOP <number> سبک IBM (به جای خطا).
هشدار در صورتی که ستون نشانگر معنی شناخته‌شده‌ای نداشته باشد (به جای خطا).

gcobol xyz.cob
gcobol -main xyz.cob
gcobol -main=xyz.cob xyz.cob

این دستورها معادل یکدیگرند. کد xyz.cob کامپایل می‌شود و یک تابع () درج می‌گردد که نخستین PROGRAM-ID را در پرونده منبع xyz.cob فراخوانی می‌کند.

gcobol -nomain xyz.cob elsewhere.o
گزینه -nomain مانع از تولید تابع () توسط کامپایلر gcobol می‌شود. باید یک نقطه ورود main() در ماژول elsewhere.o وجود داشته باشد؛ در غیر این صورت پیونددهنده خطای “missing main” (فقدان تابع اصلی) را گزارش خواهد کرد.
gcobol aaa.cob bbb.cob ccc.cob
gcobol -main aaa.cob bbb.cob ccc.cob
این دو دستور معادل هستند. این سه ماژول کد منبع به همراه یک تابع () تولیدشده که نخستین PROGRAM-ID را در ماژول aaa.cob فراخوانی می‌کند، کامپایل شده و با هم پیوند می‌خورند.
gcobol aaa.cob bbb.cob -main ccc.cob
gcobol -main=ccc.cob aaa.cob bbb.cob ccc.cob
این دو دستور نتیجه یکسانی دارند: یک پرونده اجرایی a.out ایجاد می‌شود که اجرای آن از نخستین PROGRAM-ID در ccc.cob آغاز می‌گردد.
gcobol -main=bbb.cob:b-entry aaa.cob bbb.cob ccc.cob
یک پرونده اجرایی a.out ایجاد می‌شود که اجرای آن از PROGRAM-ID به نام b-entry آغاز می‌گردد.
gcobol -c aaa.cob
gcobol -c -main bbb.cob
gcobol -c ccc.cob
gcobol aaa.o bbb.o ccc.o
سه دستور اول هر کدام یک پرونده .o ایجاد می‌کنند. پرونده bbb.o حاوی یک نقطه ورود () خواهد بود که نخستین PROGRAM-ID را در bbb فراخوانی می‌کند. دستور چهارم این سه پرونده .o را به یک پرونده a.out پیوند می‌دهد.

گزینه -fexec-charset=cp1140 هنگام کار با برنامه‌های مین‌فریم COBOL که برای پرونده‌های دارای کدگذاری EBCDIC در نظر گرفته شده‌اند، بسیار مفید است. با این گزینه، در حالی که متن COBOL در قالب ASCII باقی می‌ماند، لیترال‌های کاراکتری و مقادیر اولیه فیلدها رشته‌های EBCDIC را در باینری کامپایل‌شده تولید می‌کنند و هر داده کاراکتری خوانده‌شده از یک پرونده به عنوان داده‌های EBCDIC تفسیر می‌شود. داده‌های پرونده تبدیل نمی‌شوند؛ بلکه فرض بر این است که پرونده از نمایش EBCDIC استفاده می‌کند. لیترال‌های رشته‌ای در متن COBOL تبدیل می‌شوند، به گونه‌ای که می‌توان آن‌ها را به شکلی معنادار با داده‌های درون پرونده مقایسه کرد. صفحه کد 1140 یکی از چندین صفحه کد EBCDIC است؛ این صفحه کد اغلب سودمند است زیرا قرابت نزدیکی با صفحه کد پرکاربرد 1252 دارد که بسیاری از کاراکترهای اروپای غربی را فراهم می‌سازد.

تنها داده‌های پرونده و لیترال‌های کاراکتری تحت تأثیر قرار می‌گیرند. داده‌های خوانده‌شده از محیط یا نوشته‌شده در آن، یا داده‌های دریافتی از خط فرمان، مطابق با locale(7) حاکم در حین اجرا تفسیر می‌شوند. همین امر در مورد ACCEPT و DISPLAY نیز صادق است. نام‌های شناخته‌شده برای سیستم‌عامل، مانند نام پرونده‌ها و نام متغیرهای محیطی، عیناً و بدون تغییر پردازش می‌شوند.

در حال حاضر، این یک تنظیم همه-یا-هیچ است. پشتیبانی از USAGE و که امکان تبدیل بین کدگذاری‌ها را فراهم می‌آورد، همچنان به عنوان یک هدف در آینده باقی مانده است.

همچنین ببینید بخش متغیرهای مجموعه ویژگی‌ها (Feature-set Variables) در زیر.

طبق استاندارد ISO، قلم داده‌ای که قلم دیگری را REDEFINES می‌کند نباید بزرگ‌تر از قلمی باشد که آن را بازتعریف می‌نماید، مگر اینکه آن قلم دارای LEVEL 01 بوده و EXTERNAL نباشد. در ، با استفاده از -dialect ibm ، این قاعده برای REDEFINES همراه با USAGE POINTER که عضو بازتعریف‌شده آن یک USAGE COMP-5 چهار بایتی است (معمولاً )، یا برعکس، منعطف‌تر شده است. در این صورت، عضو بازتعریف‌شده به ۸ بایت تغییر اندازه می‌یابد تا اشاره‌گر را در خود جای دهد. این ویژگی امکان انجام محاسبات اشاره‌گر را در یک سیستم ۶۴ بیتی با کد منبعی که هدف آن سیستم ۳۲ بیتی بوده فراهم می‌سازد.

همچنین ببینید بخش متغیرهای مجموعه ویژگی‌ها (Feature-set Variables) در زیر.

کامپایلر gcobol یک کامپایلر بر پایه gcc است و در موارد کاربردی از قراردادهای gcc پیروی می‌کند. گاهی این قراردادها (و انتظارات کاربر) با شیوه‌های رایج در مین‌فریم تعارض دارند. مگر در مواردی که استاندارد ISO انجام کاری را برای کامپایلر الزامی کرده باشد، هرگونه تعارض از این دست به نفع gcc حل‌وفصل می‌شود.

برخلاف زبان C، دستور CALL در زبان COBOL به صورت ضمنی بیانگر پیونددهی پویا است، زیرا برای

CALL program
شناسه program می‌تواند متغیری باشد که مقدار آن در زمان اجرا مشخص می‌شود. با این وجود، پارامتر می‌تواند یک مقدار ثابت در زمان کامپایل نیز باشد؛ خواه یک لیترال الفبایی-عددی، یا یک قلم داده CONSTANT.

کامپایلر gcobol در صورت امکان از پیونددهی ایستا پشتیبانی می‌کند، مگر اینکه با گزینه -fno-static-call غیرفعال شود. اگر مقدار پارامتر در زمان کامپایل مشخص باشد، کامپایلر یک مرجع خارجی تولید می‌کند تا توسط پیونددهنده حل شود. برنامه ارجاع‌شده معمولاً از طریق یک ماژول شیء، یک کتابخانه ایستا یا یک شیء مشترک (shared object) ارائه می‌شود. اگر ارائه نشود، پیونددهنده خطای “نماد حل‌نشده (unresolved symbol)” را در زمان ساخت یا هنگام اجرای برنامه (در صورت استفاده از شیء مشترک) گزارش می‌کند. این ویژگی برنامه‌نویس را در اولین فرصت ممکن از خطا آگاه می‌سازد.

برنامه‌هایی که انتظار می‌رود با وجود نمادهای حل‌نشده به درستی اجرا شوند (شاید به این دلیل که منطق برنامه به آن CALL خاص نیاز پیدا نخواهد کرد) می‌توانند از گزینه -no-static-call استفاده کنند. این گزینه همه دستورهای CALL را وادار می‌کند تا به صورت پویا و در زمان اجرا حل شوند.

به طور پیش‌فرض، طبق استاندارد ISO، هیچ شرط خطایی (EC) فعال نیست. شرایط خطای پیاده‌سازی‌شده را می‌توان در خط فرمان یا از طریق دستورالعمل TURN فعال کرد. هر تلاشی برای فعال‌سازی شرط خطایی که پیاده‌سازی نشده باشد، به عنوان خطا در نظر گرفته می‌شود.

یک شرط خطای فعال‌شده که توسط یک مدیریت نشده باشد، در لاگ سیستم و خروجی خطای استاندارد نوشته می‌شود. (سازندگان قصد دارند این بخش را به یک گزینه تبدیل کنند.) یک شرط خطای مهلک که با مدیریت نشود، با فراخوانی 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 به شرایط خطایی اولویت می‌دهد که جامعه کاربران آن‌ها را باارزش‌تر بدانند.

زبان استاندارد COBOL هیچ امکانی برای متغیرهای محیطی آن‌گونه که در یونیکس و ویندوز تعریف شده‌اند، یا آرگومان‌های خط فرمان در نظر نگرفته است. gcobol از آن‌ها با استفاده از نحوی شبیه به GnuCOBOL پشتیبانی می‌کند. همچنین ISO و IBM روش‌های ناسازگاری را برای بازگرداندن وضعیت خروج برنامه به سیستم‌عامل تعریف کرده‌اند. gcobol از نحو IBM پشتیبانی می‌نماید.

برای خواندن یک متغیر محیطی:

ACCEPT target FROM ENVIRONMENT envar

که در آن target یک قلم داده تعریف‌شده در DATA DIVISION است و envar نام یک متغیر محیطی را مشخص می‌کند. envar می‌تواند یک لیترال رشته‌ای یا قلم داده الفبایی-عددی باشد که مقدار آن نام یک متغیر محیطی است. مقدار متغیر محیطی نام‌برده به target منتقل (MOVE) می‌شود. قوانین همانند دستور MOVE هستند.

برای نوشتن در یک متغیر محیطی:

SET ENVIRONMENT envar TO source

که در آن source یک قلم داده تعریف‌شده در DATA DIVISION است و envar نام یک متغیر محیطی را مشخص می‌کند. envar باز هم می‌تواند یک لیترال رشته‌ای یا قلم داده الفبایی-عددی حاوی نام متغیر محیطی باشد. مقدار متغیر محیطی نام‌برده برابر با مقدار source تنظیم می‌شود.

برای خواندن آرگومان‌های خط فرمان، از ثبات‌های COMMAND-LINE و (تنها) در یک دستور ACCEPT استفاده کنید. اگر بدون اندیس استفاده شود، COMMAND-LINE کل خط فرمان را به عنوان یک رشته واحد برمی‌گرداند. همراه با اندیس، COMMAND-LINE جدولی از آرگومان‌های خط فرمان است. برای نمونه، اگر برنامه به صورت زیر اجرا شود:

-i input output

آن‌گاه

ACCEPT target FROM COMMAND-LINE(3)

مقدار input را به درون target منتقل می‌کند. نام برنامه نخستین بخش در کل خط فرمان است و در جدول COMMAND-LINE در خانه COMMAND-LINE(1) یافت می‌شود.

برای دریافت تعداد آرگومان‌های ارائه‌شده در خط فرمان، از دستور زیر استفاده کنید:

ACCEPT target FROM COMMAND-LINE-COUNT

اگر ACCEPT به یک متغیر محیطی یا آرگومان خط فرمان ناموجود ارجاع دهد، مقدار مقصد برابر با قرار می‌گیرد.

پارامترهای خط فرمان سیستم همچنین از طریق 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 lineno “filename”
.اثر آن تنظیم شماره خط فعلی به lineno و نام پرونده ورودی فعلی به filename است. پیش‌پردازنده‌ها می‌توانند از این دستورالعمل برای کنترل نام پرونده و شماره خطوط گزارش‌شده در پیام‌های خطا و در اشکال‌زدا (debugger) استفاده کنند.

در عبارت

ASSIGN TO filename

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

کامپایلر gcobol دستور مربوط به IBM را شبیه‌سازی می‌کند. مقادیر زیر برای XML-EVENT تعریف شده‌اند:

متن یک توضیح (کامنت) بین "<!--" و "-->"
بخشی از متن یا تمام محتوای کاراکتری عنصر بین تگ‌های شروع و پایان.
تگ پایان عنصر، همراه با نام در صورت وجود در ورودی.
دستورالعمل پردازش (پس از نام هدف)، بدون در نظر گرفتن "?>".
نام هدف دستورالعمل پردازش در XML-TEXT یا XML-NTEXT ظاهر می‌شود.
نام تگ شروع عنصر یا تگ عنصر خالی.

کامپایلر gcobol از بندهای USAGE IS زیر پشتیبانی می‌کند:

برای استفاده به عنوان اندیس در یک جدول.
برای متغیرهایی که مقدار آن‌ها نشانی یک تابع خارجی، PROGRAM-ID یا قلم داده است. انتساب از طریق دستور انجام می‌شود.
,
عدد صحیح big-endian از ۱ تا ۱۶ بایت، مطابق با بند PICTURE.
, ,
ممیز شناور با دقت تکی (۴ بایتی) IEEE 754، همان‌طور که سخت‌افزار فراهم می‌کند.
, ,
ممیز شناور با دقت مضاعف (۸ بایتی) IEEE 754، همان‌طور که سخت‌زار فراهم می‌کند.
,
در حال حاضر پیاده‌سازی نشده است.
,
عدد صحیح little-endian از ۱ تا ۱۶ بایت، مطابق با
,
ممیز شناور ۱۲۸ بیتی را طبق IEEE 754 پیاده‌سازی می‌کند.

کامپایلر gcobol از انواع عدد صحیح ISO به صورت پشتیبانی می‌کند که بیشتر آن‌ها نام مستعار 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، حالت پیش‌فرض برای نام‌های مستعار type است.

تمامی محاسبات — هم اعداد صحیح و هم ممیز شناور — با استفاده از فرم‌های میانی ۱۲۸ بیتی انجام می‌پذیرد.

در gcobol دستور

DISPLAY UPON

نام‌های و را به خروجی استاندارد، و و را به خروجی خطای استاندارد نگاشت می‌کند.

کامپایلر gcobol از نحو ISO برای بازگرداندن وضعیت خروج به سیستم‌عامل پشتیبانی می‌کند:

STOP RUN [WITH] {NORMAL | ERROR} [STATUS] status

علاوه بر این، gcobol از نحو IBM نیز برای بازگرداندن وضعیت خروج به سیستم‌عامل پشتیبانی می‌کند. از ثبات RETURN-CODE استفاده کنید:

MOVE ZERO TO RETURN-CODE.
GOBACK.

ثبات RETURN-CODE به عنوان یک عدد صحیح باینری ۴ بایتی تعریف شده است.

از امکان هدایت کامپایلر (CDF) باید با احتیاط استفاده شود زیرا هنوز مجموعه آزمون‌های جامعی برای آن تعیین نشده است.

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 متوالی به موارد پیشین الحاق می‌گردد. مسیرهای نسبی (که با ‘/’آغاز نمی‌شوند) به صورت نسبی نسبت به پوشه کاری فعلی کامپایلر جستجو می‌شوند.

برای نمونه،

-I /usr/local/include:include
ابتدا پوشه‌ای را که برنامه COBOL در آن قرار دارد جستجو می‌کند، سپس /usr/local/include ، و در نهایت زیرپوشه include از پوشه‌ای که gcobol از آنجا فراخوانی شده است را جستجو می‌نماید.

برای عبارت REPLACING ، هر دو شکل شبه‌متن امروزی و اشکال COBOL/85 شناخته می‌شوند. (اشکال قدیمی‌تر در مجموعه آزمون NIST CCVS/85 استفاده شده‌اند.)

کامپایلر gcobol از تمام نحو استاندارد ISO برای REPLACE پشتیبانی می‌کند.

>>DEFINE name AS {expression | } [OVERRIDE]
متغیر name را به عنوان یک متغیر کامپایل با مقدار expression تعریف می‌کند. اگر name قبلاً تعریف شده باشد، استفاده از OVERRIDE الزامی است، در غیر این صورت دستورالعمل نامعتبر خواهد بود. عبارت AS PARAMETER پذیرفته می‌شود، اما هیچ اثری در gcobol ندارد.
>>DEFINE name AS OFF
تعریف name را آزاد می‌کند و استفاده از آن را پس از آن نامعتبر می‌سازد.
>> cce text [>> alt-text] >>
عبارت cce را که یک عبارت شرطی ثابت (constant conditional expression) است برای کامپایل شرطی ارزیابی می‌کند. در صورتی که یک نام باشد، cce می‌تواند با پارامتر خط فرمان -D تعریف شود. اگر درست (true) باشد، متن text از زبان COBOL کامپایل می‌شود. اگر نادرست (false) باشد، متن else-text (در صورت وجود) کامپایل خواهد شد. عبارت [ []] پشتیبانی می‌شود. لیترال‌های بولی پشتیبانی نمی‌شوند.
>>
پیاده‌سازی نشده است.
>>CALL-CONVENTION convention
شناسه convention می‌تواند یکی از موارد زیر باشد:
استفاده از تطبیق نام نماد استاندارد و غیرحساس به حروف بزرگ و کوچک COBOL. برای CALL “name ،” مقدار name توسط کامپایلر با حروف کوچک درج می‌شود.
استفاده از تطبیق نام نماد حساس به حروف بزرگ و کوچک. مقصد CALL به هیچ وجه تغییر نمی‌کند و عیناً استفاده می‌شود.
یک نام مستعار برای >>CALL-CONVENTION C.
>>COBOL-WORDS EQUATE keyword WITH alias
کلمه alias را مترادفی برای keyword قرار می‌دهد.
>>COBOL-WORDS UNDEFINE keyword
کلمه keyword را از گرامر COBOL حذف می‌کند. استفاده از آن در یک برنامه موجب بروز خطای نحوی از سوی کامپایلر خواهد شد.
>>COBOL-WORDS SUBSTITUTE keyword new-word
کلمه keyword به عنوان کلمه کلیدی از گرامر حذف شده و new-word جایگزین آن می‌شود. پس از آن می‌توان از keyword به عنوان کلمه تعریف‌شده توسط کاربر استفاده نمود.
>>COBOL-WORDS RESERVE new-word
با new-word مانند یک کلمه کلیدی COBOL رفتار می‌کند. این کلمه دیگر توسط برنامه، چه به عنوان کلمه کلیدی و چه به عنوان کلمه تعریف‌شده توسط کاربر، قابل استفاده نخواهد بود.
>>DISPLAY string ...
رشته string را به عنوان پیام هشدار در خروجی خطای استاندارد می‌نویسد.
>>SOURCE format
قالب format می‌تواند یکی از موارد زیر باشد:
کد منبع مطابق با قالب مرجع فرم‌ثابت در زبان COBOL با طول خط نامحدود است.
کد منبع مطابق با قالب مرجع فرم‌آزاد در زبان COBOL است. کاراکتر ‘*’ در ابتدای خط به عنوان توضیح (کامنت) شناخته می‌شود.
>>
پیاده‌سازی نشده است.
>>
پیاده‌سازی نشده است.
>>
پیاده‌سازی نشده است.
>>
پیاده‌سازی نشده است.
>>
پیاده‌سازی نشده است.
>>
پیاده‌سازی نشده است.
>>
پیاده‌سازی نشده است.
>>PUSH directive
 
>>POP directive
با PUSH ، وضعیت CDF را به یک پشته منتقل کنید. با POP ، به وضعیت قبلی که در پشته قرار گرفته بود بازگردید. دستورالعمل directive می‌تواند یکی از موارد زیر باشد:
 
 
 
 
 
>>TURN [ec [file ...] ...] {[] [[WITH] LOCATION] | OFF}
شرط خطای ec را که به صورت اختیاری با رابط‌های پرونده file مرتبط است فعال (یا با OFF، غیرفعال) می‌کند. اگر LOCATION مشخص شده باشد، gcobol در زمان اجرا نام پرونده منبع و شماره خط دستوری را که شرط خطا را ایجاد کرده گزارش می‌دهد.

برخی گزینه‌های خط فرمان بر متغیرهای مجموعه ویژگی‌ها (feature-set) در CDF که مختص gcobol هستند اثر می‌گذارند. آن‌ها را می‌توان با استفاده از و >>IF تنظیم و آزمایش کرد، و با کاراکتر ‘%’ در ابتدای نام شناخته می‌شوند، که در غیر این صورت در شناسه‌های COBOL نامعتبر است:

توسط گزینه -fexec-charset=<encoding> برای تمام کدگذاری‌های EBCDIC تنظیم می‌شود.
به طور ضمنی با -dialect ibm فعال می‌گردد.

برای مقداردهی یک متغیر مجموعه ویژگی‌ها، از دستور زیر استفاده کنید:

>>SET feature [AS] {ON | OFF}
اگر feature برابر با %EBCDIC-MODE باشد، این دستورالعمل باید پیش از PROGRAM-ID قرار گیرد.

برای آزمایش یک متغیر مجموعه ویژگی‌ها، از دستور زیر استفاده کنید:

>>IF feature DEFINED

کامپایلر 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 به مقدار آن بستگی دارد.

هنگامی که یک مقدار شش یا تعداد کمتری رقم اعشاری در سمت چپ نقطه اعشار داشته باشد، به صورت نمایش داده می‌شود.

هنگامی که مقدار کمتر از ۱ باشد و بیش از سه صفر در سمت راست نقطه اعشار نداشته باشد، به صورت نمایش داده می‌شود.

در غیر این صورت، از نماد علمی (نمایی) استفاده می‌شود: .

در همه موارد، صفرهای انتهایی در سمت راست عدد از مقدار نمایش‌داده‌شده حذف می‌شوند.

COMP-1
با ۹ رقم اعشاری نمایش داده می‌شود.
COMP-2
با ۱۷ رقم اعشاری نمایش داده می‌شود.
FLOAT-EXTENDED
با ۳۶ رقم اعشاری نمایش داده می‌شود.

این تعداد ارقام با الزامات استاندارد IEEE 754 برای تبادل اطلاعات مطابقت دارد. به عنوان یک نمونه، توضیحات مربوط به مقادیر binary64 در COMP-2 (طبق ویکی‌پدیا).

اگر یک عدد ممیز شناور با دقت مضاعف IEEE 754 به یک رشته اعشاری با حداقل ۱۷ رقم بااهمیت (معنادار) تبدیل شود، و سپس دوباره به نمایش دقت مضاعف بازگردانده شود، نتیجه نهایی باید با عدد اصلی مطابقت داشته باشد.

عدد ۱۷ رقم از آن جهت انتخاب شده است که دستور DISPLAY محتوای یک متغیر COMP-2 را بدون پنهان کردن هیچ اطلاعاتی نشان دهد.

در حین اجرای دستور 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

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

اگر یک مقدار ممیز شناور در میان متغیرهای مشخص‌شده برای یک محاسبه قرار گیرد، نتیجه میانی به یک مقدار ممیز شناور ۱۲۸ بیتی تبدیل می‌شود.

قاعده بنیادین هنگام انجام مقایسه‌های شامل مقادیر ممیز شناور: هرگز و تحت هیچ شرایطی تساوی دقیق را بررسی نکنید. این کار اصلاً ارزش دردسرهایش را ندارد.

برای نمونه:

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 یکسان نیست.

این هشدار را جدی بگیرید.

در صورت تعریف شدن، مسیرهای پوشه‌ای را مشخص می‌کند که باید توسط کتابخانه زمان اجرای ، یعنی 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) ، یافت می‌گردد.

زبان COBOL یک سوییچ نشانگر وضعیت قابل برنامه‌ریزی توسط کاربر (UPSI) را تعریف می‌کند. در ، این تنظیمات با UPSI-0 تا مشخص می‌شوند که در آن 0 تا 7 نشان‌دهنده موقعیت بیت است. مقدار سوییچ‌های UPSI از متغیر محیطی UPSI گرفته می‌شود که مقدار آن رشته‌ای از حداکثر هشت کاراکتر 1 و 0 است. نخستین کاراکتر نشان‌دهنده مقدار UPSI-0 است و مقادیر ناموجود برابر با 0 در نظر گرفته می‌شوند. برای نمونه، مقدار در محیط، بیت‌های 0، 5 و 6 را روشن می‌کند؛ به این معنا که UPSI-0 ، و روشن هستند.
باعث می‌شود هر پرونده موقتی که در حین پردازش CDF ایجاد می‌شود در پرونده‌ای نوشته شود که نام آن در مقدار GCOBOL_TEMPDIR مشخص شده است. اگر مقدار آن تنها “/” باشد، اثر متفاوتی دارد: خواندن هر copybook در خروجی خطای استاندارد گزارش می‌شود. این ویژگی برای کمک به عیب‌یابی خطاهای ناشناخته copybook طراحی شده است.

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

پرونده‌های اجرایی تولیدشده توسط gcobol به کتابخانه پشتیبانی زمان اجرای libgcobol نیاز دارند که هم به عنوان کتابخانه ایستا و هم به عنوان شیء مشترک ارائه می‌شود.

استاندارد ISO تعیین ساختار پیش‌فرض پرونده‌ها را بر عهده پیاده‌سازی گذاشته است؛ در ، حالت پیش‌فرض SEQUENTIAL است.

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

برای پرونده‌های با ساختار (به صراحت یا به صورت پیش‌فرض)، gcobol در صورت نبود دستورالعمل خاص، یک پرونده متنی معمولی لینوکس تولید می‌کند: برای هر WRITE، داده‌ها نوشته شده و به دنبال آن‌ها یک کاراکتر خط جدید ASCII NL (هگز 0A) می‌آید. در هنگام READ، رکورد تا اندازه رکورد مشخص‌شده یا تا رسیدن به NL خوانده می‌شود، هر کدام که زودتر رخ دهد. کاراکتر NL در داده‌های واردشده به بافر رکورد گنجانده نمی‌شود؛ این کاراکتر تنها به عنوان نشانگر پایان رکورد روی دیسک عمل می‌کند. در نتیجه، پرونده‌های SEQUENTIAL و LINE SEQUENTIAL به یک شکل کار می‌کنند: برنامه COBOL هرگز نشانگر پایان رکورد را نمی‌بیند.

با این حال، هنگامی که و WRITE همراه با ADVANCING استفاده می‌شوند، شرایط تغییر می‌کند. اگر ADVANCING همراه با پرونده‌های LINE SEQUENTIAL به کار رود، توسط gcobol رعایت می‌شود.

سایر کامپایلرها ممکن است چنین عمل نکنند. طبق استاندارد ISO، در دستور WRITE (بخش 14.9.47.3 قواعد عمومی)، عبارت ADVANCING برای پرونده‌هایی که “پرونده فیزیکی از موقعیت‌یابی عمودی پشتیبانی نمی‌کند” نادیده گرفته می‌شود ADVANCING ، دستور WRITE به گونه‌ای عمل می‌کند که گویی “کاربر عبارت AFTER ADVANCING 1 LINE را مشخص کرده است”. برخی پیاده‌سازی‌های دیگر این را بدین معنا تفسیر می‌کنند که نخستین WRITE در یک پرونده LINE SEQUENTIAL منجر به درج یک NL در ابتدای خط اول می‌شود، و هیچ NL پایانی در خط آخر درج نمی‌گردد. برخی نیز فراتر رفته و استفاده از ADVANCING را با پرونده‌های LINE SEQUENTIAL ممنوع می‌دانند.

gcc(1)

استاندارد مرجع برای gcobol برابر با ISO/IEC 1989:2023 است.

  • اگر gcobol کدی مطابق با این استاندارد را کامپایل کند، برنامه حاصل باید به درستی اجرا شود؛ هر نتیجه دیگری یک باگ محسوب می‌شود.
  • اگر gcobol کدی را کامپایل کند که با این استاندارد سازگار نیست، اما بر اساس مشخصات دیگری به درستی اجرا شود، این نشان‌دهنده یک افزونه غیراستاندارد است. در آینده گزینه -pedantic برای چنین کدهایی پیام‌های تشخیصی تولید خواهد کرد.
  • اگر gcobol کدی را رد کند که با آن استاندارد سازگار است، نشان‌دهنده جنبه‌ای از COBOL است که در فهرست کارهای آینده قرار دارد (یا ندارد). اگر مایلید کامپایل شدن آن را ببینید، لطفاً با توسعه‌دهندگان تماس بگیرید.

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 ۱۰۰٪ آزمون‌ها را در یک ماژول با موفقیت پشت سر می‌گذارد، ما آزمون‌های (اندک) مربوط به ویژگی‌های منسوخ را مستثنی می‌کنیم. سازندگان ویژگی‌هایی را که در سال ۱۹۸۵ منسوخ شده بودند، امروزه کاملاً و واقعاً منسوخ می‌دانند و آن‌ها را پیاده‌سازی نکرده‌اند.

ماژول‌های CCVS-85 که در بالا با وضعیتی مشخص نشده‌اند (CM و SG) در فهرست “شاید محتمل” قرار دارند، به این معنی که در انتظار اعلام نیاز طرف علاقه‌مندی هستند که کدهای واقعی با استفاده از آن ویژگی داشته باشد.

کامپایلر gcobol بخش‌های Report Writer یا Screen Section را پیاده‌سازی نمی‌کند.

کامپایلر gcobol به طور فزاینده‌ای ISO/IEC 1989:2023 را پیاده‌سازی می‌کند. برای نمونه، توسط CCVS-85 آزمایش نمی‌شود، اما توسط gcobol پیاده‌سازی شده است. به همین ترتیب، شرایط خطا (Exception Conditions) در سال ۱۹۸۵ تعریف نشده بودند، و gcobol شامل تعداد فزاینده‌ای از آن‌ها است.

سازندگان به خوبی آگاه هستند که یک کامپایلر کامل و خالص COBOL-85 بیشتر کدهای موجود COBOL را کامپایل نخواهد کرد. هر شرکتی افزونه‌هایی را ارائه کرده (و می‌کند)، و بیشتر محیط‌ها به انواع پیش‌پردازنده‌ها و سیستم‌های کمکی تعریف‌شده در خارج از استاندارد متکی هستند. هدف صریح افزودن یک فرانت‌اند استاندارد ISO COBOL به GCC، ایجاد پایه‌ای است که بر روی آن بتوان هرگونه افزونه مورد نیاز را بنا کرد.

زبان COBOL ممکن است به خوبی قدیمی‌تر از خواننده این متن باشد. تا جایی که نویسندگان آگاهی دارند، کامپایلرهای آزاد COBOL نخستین بار در سال ۲۰۰۰ ظاهر شدند. در همان زمان پروژه قبلی COBOL برای GCC موسوم به
cobolforgcc به موفقیت‌هایی دست یافت، اما هرگز به طور رسمی در GCC ادغام نشد.

این کامپایلر، ، توسط COBOLworx در پاییز ۲۰۲۱ آغاز شد. این پروژه پیاده‌سازی کامل ویژگی‌های اصلی زبان را در دسامبر ۲۰۲۲ اعلام کرد.

James K. Lowden
(jklowden@cobolworx.com) مسئول تجزیه‌کننده (parser) است.
Robert Dubner
(rdubner@cobolworx.com) مسئول تولید درخت GIMPLE است که ورودی بخش انتهایی (back-end) کامپایلر GCC محسوب می‌شود.

  • کامپایلر gcobol تنها بر روی پردازنده‌های x64 و Apple M1 تحت سیستم‌عامل لینوکس در حالت ۶۴ بیتی آزمایش شده است.
  • پشتیبانی از ورودی/خروجی (I/O) به طور گسترده آزمایش نشده است و بسیاری از ویژگی‌های مرتبط با VSAM و سایر زیرسیستم‌های مین‌فریم را پیاده‌سازی یا شبیه‌سازی نمی‌کند. در حالی که پرونده‌های LINE-SEQUENTIAL پرونده‌های متنی معمولی هستند که می‌توان آن‌ها را با ابزارهای استاندارد دستکاری کرد، پرونده‌های INDEXED و RELATIVE تولیدشده توسط gcobol با پرونده‌های هیچ کامپایلر دیگر COBOL سازگار نیستند. بهبود و ارتقای پشتیبانی از I/O به آسانی برای مشتریان تجاری در دسترس خواهد بود.
February 2025 Linux