Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Мазмұны
Кіріспе
Бағдарламалау тілінің синтаксис ережесі, код блогын шегіндіру арқылы бөліп көрсетеді – бұл бағдарламалау тілінің синтаксистік ерекшелігі.
Programming language syntax rule that defines code block demarcation via indentation
the programming language syntax feature
Офсайд ережесі компьютерлік бағдарламалау тілінің синтаксисін сипаттайды, ол код блогының шектерін шегіндіру арқылы анықтайды. Бұл терминді Питер Лэндин ойлап тапқан, мүмкін футболдағы офсайд ережесімен байланысты әжуалық ретінде. Офсайд ережесіне негіделген тілдер, кіріспе синтаксистік мағынаға ие болмайтын, тек стиль мәселесі болып табылатын еркін форматтағы тілдерден өзгеше. Офсайд ережесіне негіделген тілдер маңызды шегіндіруге ие деп те сипатталады.
The off side rule describes syntax of a computer programming language that defines the bounds of a code block via indentation. The term was coined by Peter Landin, possibly as a pun on the offside law in association football. An off side rule language is contrasted with a free form language in which indentation has no syntactic meaning, and indentation is strictly a matter of style. An off side rule language is also described as having significant indentation.
Анықтама
Питер Лэндин 1966 жылғы «Келесі 700 бағдарламалау тілі» мақаласында Off-side ережесін былай анықтады: «Алдыңғы жолдағы бірінші бос емес символдың сол жағындағы кез келген бос орынсыз символ жаңа жарияланымның басталуы деп есептеледі».
Peter Landin, in his 1966 article "The Next 700 Programming Languages", defined the off side rule thus: "Any non whitespace token to the left of the first such token on the previous line is taken to be the start of a new declaration."
Іске асыру
Офсайд ережесін лексикалық талдау кезеңінде, Python сияқты, жүзеге асыруға болады, онда көтеріңкі (үлкен) бағытталғандық лексордың INDENT белгісін шығаруына, ал төмендеуші (кіші) бағытталғандық DEDENT белгісін шығаруына себеп болады. Бұл белгілер, блоктар үшін жақшаларды пайдаланатын тілдердегі ашық жақша { және жабық жақша } сияқты, сөз тіркесім грамматикасы жақшалар немесе бағытталғандық қолданылсын, одан тәуелді емес екенін көрсетеді. Бұл лексордың күйді сақтауын қажет етеді, атап айтқанда, ағымдағы бағытталғандық деңгейін, соның салдарынан бағытталғандық өзгерген кезде оларды анықтауға мүмкіндік береді, демек лексикалық грамматика контекстсіз емес: INDENT және DEDENT белгілері бұрынғы бағытталғандық деңгейінің контексттік ақпаратына тәуелді.
The off side rule can be implemented in the lexical analysis phase, as in Python, where increasing the indenting results in the lexer outputting an INDENT token, and decreasing the indenting results in the lexer outputting a DEDENT token. These tokens correspond to the opening brace { and closing brace } in languages that use braces for blocks, and means that the phrase grammar does not depend on whether braces or indentation are used. This requires that the lexer hold state, namely the current indent level, and thus can detect changes in indentation when this changes, and thus the lexical grammar is not context free: INDENT and DEDENT depend on the contextual information of the prior indent level.
Баламалар
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. Дегенмен, қазіргі заманғы код редакторлары көбінесе синтаксистің ерекшелендірілуі және кодты бүктеу сияқты визуалды көрсеткіштерді ұсынады, бұл кемшіліктерді жоюға көмектеседі.
The primary alternative to delimiting blocks by indenting, popularized by broad use and influence of the language C, is to ignore whitespace characters and mark blocks explicitly with curly brackets (i. e., { and }) or some other delimiter. While this allows for more formatting freedom – a developer might choose not to indent small pieces of code like the break and continue statements – sloppily indented code might lead the reader astray, such as the goto fail bug. Lisp and other S expression based languages do not differentiate statements from expressions, and parentheses are enough to control the scoping of all statements within the language. As in curly bracket languages, whitespace is mostly ignored by the reader (i. e., the read function). Whitespace is used to separate tokens. The explicit structure of Lisp code allows automatic indenting, to form a visual cue for human readers. Another alternative is for each block to begin and end with explicit keywords. For example, in ALGOL 60 and its descendant Pascal, blocks start with keyword begin and end with keyword end. In some languages (but not Pascal), this means that newlines are important (unlike in curly brace languages), but the indentation is not. In BASIC and Fortran, blocks begin with the block name (such as IF) and end with the block name prepended with END (e. g., END IF). In Fortran, each and every block can also have its own unique block name, which adds another level of explicitness to lengthy code. ALGOL 68 and the Bourne shell (sh, and bash) are similar, but the end of the block is usually given by the name of the block written backward (e. g., case starts a switch statement and it spans until the matching esac; similarly conditionals if then [elif [else ]]fi or for loops for do od in ALGOL68 or for do done in bash). An interesting variant of this occurs in Modula 2, a Pascal like language which does away with the difference between one and multiline blocks. This allows the block opener ({ or BEGIN) to be skipped for all but the function level block, requiring only a block terminating token (} or END). It also fixes dangling else. Custom is for the end token to be placed on the same indent level as the rest of the block, giving a blockstructure that is very readable. One advantage to the Fortran approach is that it improves readability of long, nested, or otherwise complex code. A group of outdents or closing brackets alone provides no contextual cues as to which blocks are being closed, necessitating backtracking, and closer scrutiny while debugging. Further, languages that allow a suffix for END like keywords further improve such cues, such as continue versus continue for x, and end loop marker specifying the index variable NEXT I versus NEXT, and uniquely named loops CYCLE X1 versus CYCLE. However, modern source code editors often provide visual indicators, such as syntax highlighting, and features such as code folding to assist with these drawbacks.
Өнімділік
Scala тілінде ерте нұсқаларда тек қымыз жақшалар қолданылды. Scala 3 блоктарды құрылымдау үшін жолдарды жылдыру мүмкіндігін қосты. Дизайнер Мартин Одерски бұл Scala 3 өзінің еңбек өнімділігін арттырған ең маңызды жаңалық екенін, ол бағдарламаларды 10%-дан астам қысқартатынын және бағдарламашыларды "көңіл күйінде" ұстайтынын айтты, сондай-ақ оны пайдалануға кеңес береді.
In the language Scala, early versions allowed curly braces only. Scala 3 added an option to use indenting to structure blocks. Designer Martin Odersky said that this was the single most important way Scala 3 improved his own productivity, that it makes programs over 10% shorter and keeps programmers "in the flow", and advises its use.