오프사이드 규칙

Off-side rule

컴퓨터 프로그래밍 언어는 언어의 블록이 [1][2]들여쓰기에 의해 표현되는 경우 구문오프사이드 규칙을 따르는 것으로 알려져 있습니다.이 용어는 피터 랜딘에 의해 만들어진 것으로, 아마도 축구오프사이드 규칙에 대한 말장난으로 보인다.이것은 자유형 언어, 특히 곱슬브래킷 프로그래밍 언어와 대조되는데, 들여쓰기는 계산적 의미가 없고 들여쓰기 스타일은 코딩 규칙과 포맷의 문제일 뿐이다.

정의.

피터 랜딘은 1966년 기사에서 오프사이드 규칙을 다음과 같이 정의했다: "앞줄에 있는 첫 번째 토큰의 왼쪽에 있는 공백이 아닌 [3]토큰은 새로운 선언의 시작이라고 간주됩니다."

코드 예시

다음은 Python의 들여쓰기 블록의 예입니다.콜론은 읽기 쉽도록 Python 언어 구문의 일부이며 오프사이드 규칙을 구현하는 데 필요하지 않습니다.

Python에서는 선언이 아닌 문장의 경계를 정의하기 위해 규칙이 사용됩니다.

방어하다 짝수(a):     "'a'가 짝수인지 판단하세요."""     한다면 a % 2 == 0:         인쇄물('짝수!')         돌아가다 진실의     인쇄물('이상하다!')     돌아가다 거짓의 

또한 Python은 괄호 안의 오프사이드 규칙을 일시 중단합니다.괄호 안의 문은 괄호가 일치하거나 일치하지 않을 때까지 계속됩니다.

{     '이것': 진실의,     '그것': 거짓의,     "그들": [1, 2, 3, 4, 5,  6, 7, 8, 9, 10, 11, 23] } 

사전에서는 키를 들여쓰고 목록을 두 줄로 나눕니다.

실행

오프사이드 규칙은 Python에서와 같이 어휘 분석 단계에서 구현될 수 있으며, 들여쓰기를 증가시키면 렉서 출력으로 이어집니다.INDENT토큰을 줄이고 들여쓰기를 줄이면 렉서 출력으로 출력됩니다.DEDENT토큰입니다.[4] 이 토큰들은 시작 괄호에 해당합니다.{및 클로징 브레이스}블록에 중괄호를 사용하는 언어에서는 문법이 중괄호 또는 들여쓰기 중 어느 쪽을 사용하느냐에 따라 달라지지 않음을 의미합니다.이것은 렉서 보유 상태, 즉 현재 들여쓰기 수준을 요구하며, 따라서 이것이 변경되었을 때 들여쓰기 변화를 감지할 수 있으며, 따라서 어휘 문법은 문맥이 자유롭지 않다.INDENT그리고.DEDENT이전 들여쓰기 수준의 컨텍스트 정보에 따라 달라집니다.

대체 수단

언어 C의 광범위한 사용과 영향으로 널리 알려진 들여쓰기에 의한 블록 구분의 주요 대안은 공백 문자를 무시하고 블록에 명시적으로 대괄호(예:{그리고.}) 또는 기타 딜리미터를 지정합니다.이것에 의해, 보다 자유로운 포맷이 가능하게 됩니다(개발자는 break and continue 문과 같은 작은 코드 조각을 들여쓰지 않는 것을 선택할 수 있습니다).게토 에러 버그 등, 서투르게 들여쓰기 된 코드가 판독자를 오인시킬 가능성이 있습니다.

lisp 및 기타 S-expression 기반 언어는 문장과 식을 구분하지 않으며 괄호는 언어 내의 모든 문장의 범위를 제어하기에 충분합니다.컬리 괄호 언어와 마찬가지로 공백은 대부분 판독기에 의해 무시됩니다(즉, 읽기 함수).공백은 [5]토큰을 구분하는 데 사용됩니다.Lisp 코드의 명시적 구조는 자동 들여쓰기를 허용하여 인간 독자를 위한 시각적 신호를 형성합니다.

또 다른 방법은 각 블록이 명시적 키워드로 시작하고 끝나는 것입니다.예를 들어, ALGOL 60과 그 후속 Pascal에서는 blocks는 키워드로 시작합니다. begin키워드로 끝납니다.end(Pascal이 아닌) 일부 언어에서는 (컬리 괄호 언어와는 달리) 줄바꿈이 중요하다는[citation needed] 것을 의미하지만 들여쓰기는 그렇지 않습니다.BASIC 및 Fortran에서 블록은 블록 이름으로 시작합니다(예:IF), 선두에 블록명을 붙입니다.END(예:END IF) Fortran에서는 각 블록과 각 블록이 고유한 블록 이름을 가질 수도 있습니다.이것에 의해, 장문의 코드에 한층 더 명시성이 부가됩니다.ALGOL 68과 Bourne 쉘(sh, bash)은 유사하지만, 일반적으로 블록의 끝은 거꾸로 쓴 블록 이름(예를 들어,case스위치 스테이트먼트를 시작하여 일치할 때까지 계속됩니다.esac; 마찬가지로 조건 if...then...[elif...[else...]]fi또는 루프의 경우 for...do...odALGOL68 또는for...do...done배쉬 중)

이것의 흥미로운 변형은 하나의 블록과 여러 줄 블록 사이의 차이를 없애는 파스칼과 유사한 언어인 Modula-2에서 발생합니다.이것에 의해, 블록 오프너가 가능하게 됩니다.{또는BEGIN기능 레벨 블록을 제외한 모든 블록에 대해 건너뜁니다.블록 종단 토큰만 필요합니다( ).}또는END). 매달린 다른 것도 수리할 수선합니다.커스텀은end블록의 나머지 부분과 동일한 들여쓰기 수준에 배치되어 읽기 쉬운 블록 구조를 제공합니다.

Fortran 접근법의 장점 중 하나는 긴 코드, 중첩 코드 또는 기타 복잡한 코드의 가독성을 향상시킨다는 것입니다.아웃텐트 또는 닫힘 괄호 그룹만으로는 닫히는 블록에 대한 컨텍스트 단서를 제공하지 않으므로 디버깅 중에 백트래킹 및 면밀한 조사가 필요합니다.또한 END와 같은 키워드에 접미사를 붙일 수 있는 언어는 다음과 같은 신호를 더욱 개선합니다.continuecontinue for x그러나 최신 소스 코드 편집기는 구문 강조 표시와 같은 시각적 표시기와 이러한 결점을 보완하는 코드 폴딩 등의 기능을 제공하는 경우가 많습니다.

생산성

Scala 언어에서는 이전 버전에서는 곱슬곱슬한 괄호만 사용할 수 있습니다.Scala 3은 블록 구조에 들여쓰기를 사용하는 옵션을 추가했습니다.디자이너 마틴 오더스키(Martin Odersky)는 이를 통해 전체적으로 생산성이 10% 향상되며, 이는 Scala 3에서 도입된 가장 생산적인 변화임이 밝혀졌으며,[6] 그 사용을 조언하고 있습니다.

오프사이드 규칙 언어

프로그래밍 언어

기타 언어

「 」를 참조해 주세요.

레퍼런스

  1. ^ Hutton, G. (December 6, 2012). "Parsing Using Combinators". In Davis, Kei; Hughes, John (eds.). Functional Programming: Proceedings of the 1989 Glasgow Workshop 21–23 August 1989, Fraserburgh, Scotland. Springer Science & Business Media. pp. 362–364. ISBN 9781447131663. Retrieved September 3, 2015.
  2. ^ Turner, D.A. (August 13, 2013). "Some History of Functional Programming Languages (Invited Talk)". In Loidl, Hans Wolfgang; Peña, Ricardo (eds.). Trends in Functional Programming: 13th International Symposium, TFP 2012, St Andrews, UK, June 12–14, 2012, Revised Selected Papers. Springer. p. 8. ISBN 9783642404474. Retrieved September 3, 2015.
  3. ^ Landin, P. J. (March 1966). "The next 700 programming languages" (PDF). Communications of the ACM. 9 (3): 157–166. doi:10.1145/365230.365257. S2CID 13409665.
  4. ^ Python Documentation, 2. 어휘 분석: 2.1.8. 들여쓰기
  5. ^ "CLHS: Section 2.1.4.7".
  6. ^ Odersky, Martin (June 17, 2020). Martin Odersky: A Scala 3 Update (video). YouTube. Event occurs at 36:35–45:08. Archived from the original on December 21, 2021. Retrieved April 25, 2021.
  7. ^ Syme, Don. "Detailed Release Notes for the F# May 2009 CTP Update and Visual Studio 2010 Beta1 releases". Archived from the original on January 21, 2019.
  8. ^ Haskell 보고서– 레이아웃
  9. ^ MoonScript, Lua로 컴파일되는 언어
  10. ^ MoonScript 0.5.0 –언어 가이드
  11. ^ 구조 변경텍스트 마크업 사양 – 구분