Кіріспе

Бағдарламалау тілінің синтаксис ережесі, код блогын шегіндіру арқылы бөліп көрсетеді – бұл бағдарламалау тілінің синтаксистік ерекшелігі.

Офсайд ережесі компьютерлік бағдарламалау тілінің синтаксисін сипаттайды, ол код блогының шектерін шегіндіру арқылы анықтайды. Бұл терминді Питер Лэндин ойлап тапқан, мүмкін футболдағы офсайд ережесімен байланысты әжуалық ретінде. Офсайд ережесіне негіделген тілдер, кіріспе синтаксистік мағынаға ие болмайтын, тек стиль мәселесі болып табылатын еркін форматтағы тілдерден өзгеше. Офсайд ережесіне негіделген тілдер маңызды шегіндіруге ие деп те сипатталады.

Анықтама

Питер Лэндин 1966 жылғы «Келесі 700 бағдарламалау тілі» мақаласында Off-side ережесін былай анықтады: «Алдыңғы жолдағы бірінші бос емес символдың сол жағындағы кез келген бос орынсыз символ жаңа жарияланымның басталуы деп есептеледі».

Іске асыру

Офсайд ережесін лексикалық талдау кезеңінде, Python сияқты, жүзеге асыруға болады, онда көтеріңкі (үлкен) бағытталғандық лексордың INDENT белгісін шығаруына, ал төмендеуші (кіші) бағытталғандық DEDENT белгісін шығаруына себеп болады. Бұл белгілер, блоктар үшін жақшаларды пайдаланатын тілдердегі ашық жақша { және жабық жақша } сияқты, сөз тіркесім грамматикасы жақшалар немесе бағытталғандық қолданылсын, одан тәуелді емес екенін көрсетеді. Бұл лексордың күйді сақтауын қажет етеді, атап айтқанда, ағымдағы бағытталғандық деңгейін, соның салдарынан бағытталғандық өзгерген кезде оларды анықтауға мүмкіндік береді, демек лексикалық грамматика контекстсіз емес: INDENT және DEDENT белгілері бұрынғы бағытталғандық деңгейінің контексттік ақпаратына тәуелді.

Баламалар

C тілінің кең қолданылуы мен әсері арқылы танымал болған, блоктарды анықтаудың негізгі баламасы – ақ бос орынды елемеу және блоктарды жақшалармен ({ және }) немесе басқа белгілермен нақты көрсету. Бұл форматтау еркіндігін арттырады, мысалы, break және continue сияқты шағын код бөліктерін ендіруді қажет етпейді. Бірақ, дұрыс ендірілмеген код оқырманды жаңылыстыруы мүмкін, мысалы, goto fail қатесі сияқты. Lisp және басқа S-өрнек негізгі тілдерде операторлар мен өрнектер арасында айырма жасалмайды, ал скобкалар тілдегі барлық операторлардың ауқымын анықтау үшін жеткілікті. Жақшалы тілдердегідей, ақ бос орынды оқырман көбінесе елемейді (яғни, оқу функциясы). Ақ бос орын токендерді бөлу үшін қолданылады. Lisp кодының нақты құрылымы автоматты ендіруге мүмкіндік береді, бұл адам оқырмандары үшін көрінетін белгіні құрайды. Тағы бір балама – әр блок нақты кілт сөздермен басталып, аяқталуы. Мысалы, ALGOL 60 және оның мұрагері Pascal-да блоктар begin кілт сөзімен басталып, end кілт сөзімен аяқталады. Кейбір тілдерде (бірақ Pascal-да емес), жаңа жолдар маңызды (жақшалы тілдерден айырмашылығы), бірақ ендіру маңызды емес. BASIC және Fortran тілдерінде блоктар блок атауымен (мысалы, IF) басталып, END блок атауымен аяқталады (мысалы, END IF). Fortran-да әр блоктың өзіне тән бірегей блок атауы болуы мүмкін, бұл ұзақ кодқа қосымша нақтылық қосады. ALGOL 68 және Bourne қабығы (sh және bash) ұқсас, бірақ блок соңы әдетте блок атауының кері жазылуымен беріледі (мысалы, case операторы switch операторын бастайды және ол сәйкес esac-қа дейін созылады; сондай-ақ, if then [elif [else ]]fi немесе ALGOL68-де for do od немесе bash-те for do done циклдары). Modula 2-де осыған ұқсас нұсқасы бар, бұл Pascal сияқты тіл, ол бір және көпжолды блоктар арасындағы айырманы жояды. Бұл блок ашушыны ({ немесе BEGIN) функция деңгейіндегі блоктан басқа барлық блоктар үшін жіберуге мүмкіндік береді, тек блок аяқтау токенін (} немесе END) қажет етеді. Бұл сондай-ақ, дұрыс емес else жағдайларын да түзетуге көмектеседі. Көбінесе, аяқтау токені блок қалған бөлігімен бір деңгейде орналастырылады, бұл оқуға оңай блок құрылымын қамтамасыз етеді. Fortran тәсілінің бір артықшылығы – ол ұзақ, ұялы немесе күрделі кодты оқуды жақсартады. Жабылатын жақшалардың немесе шығыстардың тобы ғана қандай блоктар жабылып жатқанын көрсетпейді, сондықтан кері оралу және жөндеу кезінде мұқият тексеру қажет. Сонымен қатар, END кілт сөзіне қосымша жұрнақтарды қолдауға болатын тілдер осындай белгілерді жақсартады, мысалы, continue және continue for x, end loop маркері индекс айнымалысын NEXT I және NEXT көрсетеді, сондай-ақ, бірегей аталатын циклдар CYCLE X1 және CYCLE. Дегенмен, қазіргі заманғы код редакторлары көбінесе синтаксистің ерекшелендірілуі және кодты бүктеу сияқты визуалды көрсеткіштерді ұсынады, бұл кемшіліктерді жоюға көмектеседі.

Өнімділік

Scala тілінде ерте нұсқаларда тек қымыз жақшалар қолданылды. Scala 3 блоктарды құрылымдау үшін жолдарды жылдыру мүмкіндігін қосты. Дизайнер Мартин Одерски бұл Scala 3 өзінің еңбек өнімділігін арттырған ең маңызды жаңалық екенін, ол бағдарламаларды 10%-дан астам қысқартатынын және бағдарламашыларды "көңіл күйінде" ұстайтынын айтты, сондай-ақ оны пайдалануға кеңес береді.