에 가다

Goto
1982년 Sinclair ZX Spectrum 가정용 컴퓨터의 "GOTO" 키. 네이티브 BASIC(원키 명령 입력)으로 구현됩니다.

GoTo(프로그래밍 언어에 따라 GOTO, GOTO 또는 기타 케이스 조합)는 많은 컴퓨터 프로그래밍 언어에서 볼 수 있는 문장입니다.이 명령어는 다른 코드 행에 대한 단방향 제어 전송을 수행합니다.반대적으로 함수 호출은 보통 제어를 반환합니다.점프 로케이션은 보통 라벨을 사용하여 식별되지만 일부 언어에서는 행 번호를 사용합니다.기계코드 레벨에서는gotobranch 또는 jump 스테이트먼트의 형태로 스택 조정과 조합되어 있습니다.많은 언어가 다음을 지원합니다.goto스테이트먼트 및 많은 경우 스테이트먼트를 사용하지 않습니다(「언어 지원」 참조).

구조화된 프로그램 정리가 증명한 것은goto흐름도로 표현될 수 있는 프로그램을 작성하기 위해 스테이트먼트는 필요하지 않다; 코드 복제와 추가 변수가 i일 수 있다는 경고와 함께 시퀀스, 선택/선택, 반복/반복의 세 가지 프로그래밍 구조의 조합은 튜링 기계에 의해 수행될 수 있는 계산에 충분하다.ntproducted.[1]

과거에 학계와 산업계에서 상당한 논쟁이 있었다.goto진술들.이전에는 goto의 사용이 일반적이었지만, 1960년대와 1970년대에 구조화된 프로그래밍이 등장한 이후 goto의 사용은 현저하게 감소하였다.주요 비판은 goto 문을 사용하는 코드가 대체 구문보다 이해하기 어렵다는 것입니다.Goto는 특정 일반적인 사용 패턴에서 계속 사용되지만, 가능하다면 일반적으로 다른 방법이 사용됩니다.학계나 소프트웨어 업계에서는 그 사용에 대한 논의가 계속되고 있습니다.

사용.

goto label

gotoif 스테이트먼트와 조합되어 조건부 제어 이전이 발생하는 경우가 많습니다.

IF condition THEN goto label

프로그래밍 언어에 따라 수신처에 대해 다른 제한이 부과됩니다.goto진술.예를 들어 C 프로그래밍 언어에서는 다른 [2]함수에 포함된 라벨로의 점프를 허용하지 않지만 setjmp/longjmp 함수를 사용하여 단일 콜 체인 내에서 점프를 수행할 수 있습니다.

비판

1959년 열린 ALGOL 전 회의에서 하인즈 제마넥은 GOTO의 상징적 반대자가 된 에즈거 W. 다이크스트라를 포함해 GOTO의 [3]발언에 대해 아무도 관심을 두지 않았다[citation needed].1970년대와 1980년대에는 GOTO 문장의 사용이 "구조화 프로그래밍" 패러다임을 지지하는 경향이 감소하였고, goto는 "유지할 수 없는 스파게티 코드"로 이어진다는 비판을 받았다(아래 참조).GNU 파스칼 코딩 표준과 같은 일부 프로그래밍 스타일 코딩 표준에서는 GOTO 문 사용을 권장하지 않습니다.[4]Böhm-Jacopini 증명(1966)은 소프트웨어 개발을 위해 구조화된 프로그래밍을 채택할 것인가에 대한 문제를 해결하지 못했는데, 부분적으로는 그 적용에 추가적인 [5]국지 변수의 도입이 필요하기 때문에 건설이 프로그램을 개선하기보다는 모호하게 할 가능성이 높았기 때문이다.그러나 컴퓨터 과학자, 교육자, 언어 설계자 및 애플리케이션 프로그래머들 사이에서 GOTO의 과거 어디서나 사용되던 사용에서 서서히 벗어나고 있는 중요한 논쟁을 불러일으켰습니다.아마도 GOTO에 대한 가장 유명한 비판은 1968년 Edsger Dijkstra의 "유해하다고 생각되는 발언으로 가라"[3]라는 편지일 것이다.이 서한에서 Dijkstra는 제한되지 않은 [6]GOTO 문장은 프로그램(특히 루프를 수반하는 것)의 분석과 검증 작업을 복잡하게 하기 때문에 상위 언어에서 폐지되어야 한다고 주장했다.이 편지 자체는 1987년 3월 ACM(Communications of the ACM)에 보낸 "해로 간주되는 GOTO" 편지와 다이크스트라의 "약간 실망스러운 서신"[8][7] 포함한 다른 사람들의 추가 답장을 포함한 논쟁을 촉발시켰다.

대체적인 관점은 Donald Knuth의 Statements 구조화 프로그래밍에 제시되어 있습니다.이것은 많은 일반적인 프로그래밍 태스크를 분석하고 그 중 몇 [9]가지에서 GOTO가 사용하기에 최적의 언어 구조라는 것을 알아냅니다.The C Programming Language에서 Brian Kernighan과 Dennis Ritchie다음과 같이 경고합니다.goto 는 "무한히 사용 가능"하지만, 기능 종료 에러 핸들러 및 [10]루프로부터의 멀티 레벨 브레이크에 사용할 수도 있습니다.이 두 가지 패턴은 다른 [11][12][13][14]저자에 의해 C에 관한 수많은 후속 서적에서 찾아볼 수 있습니다. 2007년 입문 교과서에서는 오류 처리 패턴이 "C [11]언어에 내장된 예외 처리의 부족"을 회피하는 방법이라고 언급하고 있습니다.리눅스 커널 디자이너 그리고 코더 리누스 토발즈나 소프트웨어 엔지니어와 책 작가 스티브 맥코넬은 포함한 다른 프로그래머들도 견해의 데이 크스트라가 GOTOs 수 있게 하는 유용한 언어 기능 프로그램 속도, 크기 및 코드 명확성 개선, 때 현명한 방법에서 추가적으로 상대적으로 합리적인 프로그래머가 사용된다며 반대한다.[15][16]컴퓨터 공학 교수인 John Regehr에 따르면, 2013년에 리눅스 커널 [17]코드에 약 10만 개의 goto 인스턴스가 있었다.

다른 학계에서는 더 극단적인 관점을 취했고 심지어 다음과 같은 지시도 있다고 주장했다.break그리고.return루프의 중간부터가 Böhm-Jacopini 결과에는 필요하지 않기 때문에 잘못된 관행이며,[18] 따라서 루프가 단일 출구점을 가져야 한다고 주장했다.예를 들어, Bertrand Meyer는 그의 2009년 교과서에서 다음과 같은 지시를 썼다.break그리고.continue'오래된 것일 뿐'goto'[19]양가죽을 쓰고'그러나 Böhm-Jacopini 결과의 약간 수정된 형식을 사용하면 루프에서 다단계 절단이 [20]허용되는 한 구조화 프로그래밍에서 추가 변수를 피할 수 있다.C와 같은 일부 언어에서는 다음 언어를 통해 멀티 레벨의 휴식 시간을 허용하지 않기 때문입니다.break키워드, 몇몇 교재들은 프로그래머에게 사용하라고 조언한다.goto그런 [14]상황에서MISRA C 2004 표준에서는goto,continue, 및 복수return그리고.break스테이트먼트를 [21]참조해 주세요.MISRA C 표준의 2012년 판은 다음과 같은 금지 사항을 하향 조정했습니다.goto"필수"에서 "필수" 상태로; 2012년 판에는 후방 점프만 금지하고 앞으로 점프하지 않는 추가 필수 규칙이 있다.goto를 클릭합니다.[22][23]

포트란 1978년을 결정하고 연속적인 개정의 비교적 느슨한 의미 규칙 goto의 허용 사용을 관리하는 더 엄격해 졌다. 컴퓨터 프로그래머가 되고 떠난 still-executing DO루프 입력하는 GOTO를 사용할 수 있도록"신장된 거리"1978,[24]의 언어와 1995년 여러 형태로 제거되었다 구조적 프로그래밍 구문을 소개했다.의 sComputed GOTO 및 Assigned GOTO를 포함한 Fortran GOTO가 [25]삭제되었습니다.Java Python과 같이 널리 사용되는 일부 현대 프로그래밍 언어에는 GOTO 문장이 없습니다(언어 지원 참조). 그러나 대부분은 선택 항목에서 벗어나거나 반복의 다음 단계로 넘어가는 방법을 제공합니다.코드에서의 제어 흐름을 방해하는 것은 바람직하지 않다는 관점은 일부 프로그래밍 언어의 설계에서 볼 수 있습니다. 예를 들어 Ada[26] 꺾쇠 괄호를 사용하여 라벨 정의를 시각적으로 강조합니다.

comp.lang.c FAQ[27] 목록의 항목 17.10은 GOTO 사용 문제를 직접 다루고 있습니다.

비록 스타일에 대한 토론이 종종 그러한 규칙에만 집중되는 것처럼 보이지만, 작문 스타일과 마찬가지로, 프로그래밍 스타일은 어느 정도 예술이고 융통성 없는 규칙에 의해 체계화될 수 없다.goto 스테이트먼트의 경우, goto의 제한 없는 사용이 빠르게 유지보수가 불가능한 스파게티 코드로 이어진다는 것은 오랫동안 관찰되어 왔다.그러나 goto 스테이트먼트에 대한 단순하고 무분별한 금지가 반드시 아름다운 프로그래밍으로 이어지는 것은 아닙니다.비구조화 프로그래머는 goto를 사용하지 않고 비잔틴의 엉킴을 구축할 수 있습니다(대신 이상한 루프와 부울 제어 변수를 대체할 수도 있습니다).많은 프로그래머들은 보통 goto는 피해야 하지만 필요에 따라 몇 가지 제약이 있는 상황에서 허용됩니다.다단계 브레이크 스테이트먼트로서 스위치 스테이트먼트 내에서 공통 액션을 통합하거나 에러 반환이 여러 개 있는 함수로 정리 태스크를 집중시키는 것입니다. (...) 특정 구조를 맹목적으로 회피합니다.또는 규칙을 이해하지 않고 따르는 것은 규칙이 회피해야 할 만큼의 문제를 야기할 수 있습니다.게다가, 프로그래밍 스타일에 대한 많은 의견들은 단지 의견일 뿐이다.그들은 강하게 주장되고 강하게 느낄 수 있고, 그들은 확고한 증거와 주장에 의해 뒷받침될 수 있지만, 반대 의견들은 똑같이 강하게 느껴지고, 지지되고, 주장될 수 있다."스타일 전쟁"에 휘말리는 것은 보통 무의미하다. 왜냐하면 어떤 문제에 있어서, 반대자들은 절대 동의하거나 동의하지 않거나 논쟁을 멈출 수 없기 때문이다.

일반적인 사용 패턴

gotos의 전체적인 사용은 감소하고 있지만, 일부 언어에서는 goto가 프로그램의 논리를 가장 짧고 쉽게 표현할 수 있는 상황이 여전히 존재한다(gotos 없이 동일한 논리를 표현할 수 있는 반면, 동등한 코드는 더 길고 종종 더 이해하기 어려울 수 있다).다른 언어에는 구조화된 대체 수단, 특히 예외와 테일콜이 있습니다.

goto가 유용한 상황은 다음과 같습니다.

  • 코드를 읽기 쉽고 쉽게 하기[15][28] 위해
  • 작은 프로그램을 만들고 코드 중복을[15][28] 없애려면
  • 상태 전이 테이블과 goto를 사용하여 상태 간 전환(테일제거 없음), 특히 자동으로 생성된 C [29]코드로 유한 상태 머신을 구현합니다.를 들어 표준 LR 파서의 goto라고 입력합니다.
  • 언어에서 직접 지원되지 않는 경우 다단계 중단 및 계속 구현. 이는 [14]C에서 일반적인 관용어입니다.Java는 goto 키워드를 예약하지만 실제로 구현하지는 않습니다.대신 Java는 break 및 continue [30]문을 구현합니다.Java 문서에 따르면 [31]C에서 gotos를 사용하는 것이 가장 일반적인 방법(90%)이었습니다. Java는 이러한 측면에서 goto를 사용하지 않고 다단계 break을 제공하는 BLIS 프로그래밍 언어(더 정확히는 BLIS-11 버전)보다 [32]앞선 첫 번째 언어였습니다.
  • 추가 루프가 발생할 가능성이 있는 경우 단일 레벨의 브레이크 또는 계속(재시도) 스테이트먼트를 대신합니다.이 프랙티스는 Netbsd [33]코드로 확인되고 있습니다.
  • 오류 처리(예외 없음), 특히 리소스 할당 해제와 같은 [11][14][33][29][34]정리 코드.C++는 이 사용 사례에 대한 goto 문 대신 Resource Acquisition Is Initialization(RAII)을 제공합니다.RAI는 디스트럭터를 사용하거나 예외 [35]처리에서 사용되는 시도 및 캐치 예외를 사용합니다.setjmp와 longjmp도 다른 대안으로 콜스택의 일부를 분리할 수 있다는 장점이 있습니다.
  • 스택의 팝인(Algol, PL/I 등)
  • 비디오 [36]게임용 대화 시스템 등 선형 방식으로 작동하는 특수 스크립트 언어입니다.

이러한 용도는 C에서 비교적 일반적이지만 C++ 또는 상위 수준의 [34]기능을 가진 다른 언어에서는 훨씬 덜 일반적입니다.단, 함수 내에서 예외를 던지고 잡는 것은 일부 언어에서는 매우 비효율적일 수 있습니다.주요 예는 Objective-C입니다.Goto가 훨씬 더 빠른 [37]대안입니다.

goto 문의 또 다른 용도는 인수 불량 레거시 코드를 수정하는 것입니다.goto를 피하기 위해서는 광범위한 리팩터링 또는 코드 복제가 필요합니다.예를 들어, 특정 코드만 관심 있는 큰 함수가 주어진 경우 goto 문을 사용하면 함수를 수정하지 않고도 관련 코드만 건너뛸 수 있습니다.이 사용법은 코드 [38]냄새로 간주되지만 가끔 사용됩니다.

대체 수단

구조화된 프로그래밍

서브루틴의 현대적인 개념은 David WheelerEDSAC를 프로그래밍할 때 발명했습니다.서브루틴 호출 명령 없이 콜을 구현하고 머신으로 되돌리기 위해 그는 휠러 [39]점프라고 불리는 특별한 자기 수정 코드 패턴을 사용했습니다.이를 통해 라이브러리에서 가져온 루틴의 잘 중첩된 실행을 사용하여 프로그램을 구성할 수 있게 되었습니다.이 작업은 다음 명령어만 사용하여 수행할 수 없습니다.goto라이브러리에서 꺼낸 대상 코드가 어디로 돌아가야 할지 모르기 때문입니다.

나중에 파스칼과 같은 고급 언어는 서브루틴(프로시저 또는 함수라고도 함)에서 다음과 같은 추가 제어 구조에 이르기까지 일반화된 구조화된 프로그래밍을 중심으로 설계되었습니다.

이러한 새로운 언어 메커니즘은 이전에는 다음과 같이 기술되었을 동등한 흐름을 대체했습니다.gotoifs. 멀티웨이 브랜칭은 점프 명령이 동적으로(조건부로) 결정되는 "계산된 goto"를 대체합니다.

특정 상황에서는 레거시 프로그램을 멀티레벨 루프 [40]종료문으로 대체함으로써 로컬에서 레거시 프로그램의 go 문을 제거할 수 있습니다.

예외

실제로 구조화된 프로그래밍의 기본 3개 구조 템플릿을 엄격하게 준수하면 구조화된 유닛을 조기에 종료할 수 없기 때문에 고도로 중첩된 코드가 생성되고 가능한 모든 조건을 처리하기 위한 매우 복잡한 프로그램 상태 데이터와의 조합이 급증합니다.

일반적으로 두 가지 솔루션이 채택되고 있습니다.구조화 유닛을 조기에 종료하는 방법, 그리고 보다 일반적인 예외입니다.두 가지 경우 모두 구조 위로 올라가 블록이나 함수에 대한 제어를 되돌리지만 임의의 코드 위치로 이동하지는 않습니다.이는 조기 종료로 인해 엄격히 구조화된 것이 아니라 구조화된 프로그래밍의 협착이 약간 완화되는 비터미널 위치에서 리턴 문을 사용하는 것과 유사합니다.C, 그리고continue추가 없이 루프를 종료하거나 다음 반복을 계속할 수 있도록 한다.while또는if진술.일부 언어에서는 다단계 휴식도 가능합니다.예외적인 상황을 처리하기 위해 다음과 같은 특수한 예외 처리 구조가 추가되었습니다.try/catch/finally자바어.

슬로우 캐치 예외 처리 메커니즘은 goto가 [41]악용될 수 있는 것처럼 비투명 제어 구조를 만들기 위해 쉽게 악용될 수 있습니다.

테일 콜

1977년 시애틀에서 열린 ACM 컨퍼런스에 전달된 논문에서 Guy L. Steel은 GOTO와 구조화된 프로그래밍에 대한 논쟁을 요약하고 프로시저의 꼬리 위치에 있는 프로시저 호출이 호출된 프로시저에 대한 직접적인 제어 이전으로 가장 최적으로 처리될 수 있으며, 일반적으로 불필요한 스택 조작을 제거할 수 있음을 관찰했다.운용을 실시합니다.[42]이러한 "테일 콜"은 프로시저 콜이 어디에나 있는 언어인 리스프(Lisp)에서 매우 일반적이기 때문에, 이러한 형태의 최적화는 다른 언어에서 사용되는 GOTO에 비해 프로시저 콜 비용을 크게 절감합니다.스틸은 제대로 시행되지 않은 프로시저 호출이 프로시저 호출에 비해 GOTO가 저렴하다는 인위적인 인식을 가져왔다고 주장했다.Steel은 또한 기계 코드 스택 조작 명령과 함께 "일반적으로 콜은 매개변수를 전달하고 기계 코드 JUMP 명령으로 균일하게 코드화될 수 있는 GOTO 문으로 유용하게 생각될 수 있다"[42]고 주장했다.Steel은 Lisp에서 프로시저 호출 비용이 훨씬 낮았기 때문에 Lisp에서 잘 최적화된 수치 알고리즘이 당시 상용 Fortran 컴파일러에 의해 생성된 코드보다 더 빨리 실행될 수 있다는 증거를 인용했다.Steel이 Gerald Jay Sussman과 함께 개발한 리스프 방언인 Scheme에서는 테일콜 최적화가 [43]필수입니다.

Steel의 논문은 컴퓨터 과학에 새로운 내용을 많이 소개하지는 않았지만, 적어도 MIT에서 실행되었기 때문에 프로시저 호출 최적화의 범위를 밝혀냈으며, 이는 프로시저의 모듈화 촉진 품질을 복잡한 대규모 단일 프로시저의 일반적인 코딩 습관에 대한 보다 신뢰할 수 있는 대안으로 만들었다.내부 제어 구조와 광범위한 상태 데이터.특히 Steel에 의해 논의된 테일콜 최적화는 이 절차를 단일 테일 재귀(같은 함수를 호출하는 테일 재귀)를 통해 반복을 구현하는 신뢰할 수 있는 방법으로 변화시켰습니다.또한 테일 콜 최적화를 통해 테일 콜을 가정하여 무한 깊이 상호 재귀가 가능합니다.이것에 의해, 유한 상태의 머신과 같이 제어의 전송이 가능하게 됩니다.그 이외의 경우는 일반적으로 goto 문을 사용합니다.

코루틴

코루틴은 구조화된 프로그래밍의 보다 급진적인 이완으로, 복수의 출구점(비꼬리 위치의 반환점)뿐만 아니라 goto 문과 유사한 복수의 진입점도 허용합니다.코루틴은 코드의 임의의 포인트로 점프하는 것이 아니라 지정된 포인트(수율 후 계속)에서만 현재 실행 중인 코루틴을 재개할 수 있기 때문에 goto보다 더 제한됩니다.코루틴의 제한된 형태는 발생기이며, 이는 어떤 용도로도 충분합니다.더 제한적인 것은 폐쇄입니다. 즉, (정적 변수를 통해) 상태를 유지하지만 실행 위치는 유지하지 않는 서브루틴입니다.상태 변수와 구조화된 제어(특히 스위치문 전체)의 조합에 의해 서브루틴이 후속 콜의 임의의 포인트에서 실행을 재개할 수 있습니다.코루틴이 없는 경우 goto 문을 대체하는 구조화된 대체 수단입니다.예를 들어, 이것은 C의 일반적인 관용어입니다.

속행

연속은 프로그램의 임의의 지점에서 이전에 표시된 지점으로 제어를 이전한다는 점에서 GOTO와 유사합니다.GOTO가 대부분의 구조화된 프로그래밍 언어에서는 수행할 수 없는 제어 권한을 현재 기능에서 이전할 수 있기 때문에 GOTO보다 연속성이 더 유연합니다.로컬 변수 및 함수 인수를 저장하기 위해 스택프레임을 유지하는 언어 구현에서 연속 실행은 점프에 더해 프로그램의 콜스택을 조정하는 것을 포함한다.C 프로그래밍 언어의 longjmp 함수는 현재 컨텍스트를 주변 컨텍스트로 이스케이프하기 위해 사용할 수 있는 이스케이프 연속의 예입니다.또한 공통 Lisp GO 연산자에는 이러한 스택 언바인딩 속성이 있습니다.이는 구조가 어휘 스코프임에도 불구하고 점프할 라벨이 클로저에서 참조될 수 있기 때문입니다.

Scheme(구성표)에서 계속은 필요에 따라 외부 컨텍스트에서 내부 컨텍스트로 컨트롤을 이동할 수도 있습니다.다음에 실행되는 코드를 거의 무제한으로 제어할 수 있기 때문에 코루틴이나 공동 멀티태스킹과 같은 복잡한 제어 구조를 비교적 [43]쉽게 작성할 수 있습니다.

메시지 전달

비절차적 패러다임에서 goto는 관련성이 낮거나 완전히 존재하지 않는다.주요 대안 중 하나는 동시 컴퓨팅, 프로세스통신객체 지향 프로그래밍에서 특히 중요한 메시지 전달입니다.이러한 경우에 개별 구성요소는 자의적인 지배력 이전을 하지 않지만, 전체 지배력은 선매권과 같은 복잡한 방법으로 계획될 수 있다.영향력 있는 언어Simula와 Smalltalk는 메시지와 사물의 개념을 도입한 최초의 언어 중 하나이다.객체 지향 프로그래밍은 상태 데이터를 캡슐화함으로써 소프트웨어의 복잡성을 객체 간의 상호작용(메시지)으로 줄였습니다.

바리에이션

goto 스테이트먼트의 클래스에는 많은 다른 언어 구조가 있습니다.

계산된 GOTO 및 할당된 GOTO

Fortran에서 계산은 식 값을 기반으로 리스트 내의 여러 라벨 중 하나로 점프합니다.예를 들면,goto (20,30,40) iC의 동등한 구성은 switch 문이며 새로운 [44]Fortran에서는CASE statement는 구문론적인 [45]대안으로 권장됩니다.BASIC에는'On GoTo'동일한 목표를 달성했지만 Visual Basic에서는 이 구조가 [46]더 이상 지원되지 않습니다.

Fortran 95 이전 버전에서 Fortran은 또한 정수 변수에 저장(할당)되는 스테이트먼트 라벨(행 번호)에 제어를 이전하는 할당된 goto 변형을 가지고 있었다.할당되지 않은 정수 변수로 점프하는 것은 불행히도 가능했으며 할당된 [47]gotos와 관련된 버그의 주요 원인이었습니다.포트란assignstatement에서는 정수 변수에 상수(기존) 행 번호만 할당할 수 있습니다.단, 이 변수는 나중에 실수로 정수로 처리될 수 있습니다.예를 들어 변수를 증가시키면 다음과 같이 지정되지 않은 동작이 발생할 수 있습니다.goto시간. 다음 코드는 그 동작에 대해goto i줄 서 있을 때i미지정:

    할당하다200 로. i     i = i+1     에 가다i ! 지정되지 않은 동작 200 쓰다(*,*) "유효한 줄 번호입니다." 

몇몇 C 컴파일러는 원래 [48]gcc에 의해 도입된 gotos와 관련하여 2개의 비표준 C/C++ 확장을 구현합니다.GNU 확장을 통해 현재 함수 내의 라벨 주소를void*단항 접두사 라벨연산자 사용 &&goto 명령도 임의의 위치로 점프할 수 있도록 확장되어 있습니다.void*표현.이 C 확장자는 이를 지원하는 C 컴파일러 문서에서는 계산된 goto라고 합니다.그 의미는 Fortran이 할당한 goto의 슈퍼셋입니다.이것은 goto 타겟으로서 임의의 포인터 표현을 허용하는 반면 Fortran이 할당한 goto는 점프 [49]타겟으로서 임의의 표현을 허용하지 않기 때문입니다.C의 표준 goto와 마찬가지로 GNU C 확장은 계산된 goto의 타깃을 현재 함수에만 배치할 수 있도록 합니다.현재 함수를 벗어나려고 하면 지정되지 않은 [49]동작이 발생합니다.

BASIC의 일부 변형은 GNU C에서 사용되는 의미에서의 계산 GOTO를 지원합니다.즉, 타겟은 리스트의 1 행이 아닌 임의의 행 번호일 수 있습니다.를 들어, MTS BASIC에서는, 다음과 같이 쓸 수 있습니다.GOTO i*1000변수 i의 값의 1000배(예:[50] 선택한 메뉴 옵션을 나타낼 수 있음)의 번호가 매겨진 라인으로 점프합니다.

PL/Ilabel 변수는 계산되거나 할당된 효과를 달성합니다.GOTOs.

바꾸다

1985년 ANSI COBOL 표준까지는 ALTER 문이 있어 기존 GO TO의 수신처를 변경하는 데 사용할 수 있었다.이 문장은 [51]그 자체로 단락에 있어야 했다.다형성을 허용했던 그 특징은 자주 비난받았고 거의 [52]사용되지 않았다.

Perl GOTO

Perl 에는, 의 배리언트가 있습니다.goto전통적인 GOTO 스테이트먼트가 아닌 스테이트먼트입니다.함수명을 취득하여 하나의 함수 호출을 다른 함수 호출(테일 호출)로 효과적으로 대체함으로써 제어를 전송합니다.새로운 함수는 GOTO로 돌아가지 않고 원래 함수가 [53]호출된 위치로 돌아갑니다.

에뮬레이트 GOTO

기본적으로 GOTO를 지원하지 않는 프로그래밍 언어가 몇 가지 있습니다.GOTO 에뮬레이션을 사용하면 GOTO를 이러한 프로그래밍 언어로 사용할 수 있습니다.다만, 몇개의 제약이 있습니다.Java,[54] JavaScript,[55] [56][57]Python에서 GOTO를 에뮬레이트할 수 있다.

PL/I 레이블 변수

PL/I에는 "할당된 goto"와 "computed goto"를 모두 구현하기 위해 사용할 수 있는 데이터 유형 LABEL이 있습니다. PL/I는 현재 블록에서 브랜치를 허용합니다.호출 프로시저는 라벨을 인수로서 호출 프로시저에 전달할 수 있습니다.이 프로시저는 브랜치로 종료할 수 있습니다.라벨 변수의 값에는 스택프레임의 주소가 포함되어 있으며 goto out block은 스택을 팝합니다.

/* 이것은 할당된 goto */*에 해당하는 기능을 구현합니다. 라벨은 *//declare where; where = something; goto where; ... something: /* statement */;... 
/* 이것은 계산된 goto *//declare where(5) 라벨, declare inx fixed, 여기서 (1) = abc; where(2) = xyz; ... goto where(inx), ... abc: /* 문과 동등합니다.xyz: /* 문 */;... 

동일한 결과를 얻는 더 간단한 방법은 LABEL 유형 변수의 명시적 선언이 필요하지 않은 레이블 상수 배열을 사용하는 것입니다.

/* 이것은 계산된 goto */declarate inx fixed, ...goto where(inx), ...여기서 (1) : /* 스테이트먼트 */; ...여기서 (2) : /* 스테이트먼트 */;에 상당하는 것을 실장합니다. 

MS/DOS GOTO

Goto는 콜론으로 시작하는 라벨에 실행을 지시합니다.Goto의 대상은 변수가 될 수 있습니다.

@set off SET D8str=%date%SET D8dow=%D8str:~0,3%For %D in (월요일 수요일 금요일)에서 다음과 같은 경우D" == "%D8dow%" goto SHOP%%D 에코 오늘 %D8dow%는 쇼핑 날이 아닙니다.goto end : SHOPMON 에코 점심으로 피자 사세요 - 월요일은 피자 데이입니다.goto end : SHOP Wed echo를 집에 가져가기 위해 Calzone을 구입합니다.오늘은 수요일입니다.goto end:SHOPFRI 에코가 셀처 사줘 칼로리 제로 음료가 필요할 때를 대비해서:종료

언어 지원

많은 언어가 다음을 지원합니다.goto많은 사람들이 그렇지 않습니다.자바에서는goto예약어이지만 사용할 수 없습니다.단, 컴파일된 file.class는 GOTO [58]및 LABEL을 생성합니다.Python은 goto를 지원하지 않지만 [56][57]goto를 제공하는 몇 가지 joke 모듈이 있습니다.Seed7에는 goto 문이 없으며 break-statement 및 continue 스테이트먼트와 같은 숨겨진 goto도 [59]생략됩니다.PHP에서는 에 대한 네이티브 지원은 없었습니다.goto버전 5.3까지([60]기능을 에뮬레이트하기 위해 사용 가능)

C# 프로그래밍 언어에는goto단, 현재 범위 밖의 라벨로 점프할 수 없기 때문에 이 라벨은 현재보다 훨씬 덜 강력하고 위험합니다.[61]goto키워드를 지정합니다.또한 C#에서는 허용되지 않는 암묵적인 폴스루 대신 goto case 또는 goto default가 사용되는 경우가 많습니다.이러한 라벨은 case 및 default입니다.

PL/I 프로그래밍 언어에는 GOTO 문이 있으며, GOTO 문은 블록 외 전송을 위해 스택을 언인드하고 외부에서 블록으로의 전송을 허용하지 않습니다.

다른 언어들은 명시적인 오류 해결을 위해 그들만의 개별 키워드를 가질 수 있으며, 이것은 하나의 버전으로 간주될 수 있다.goto이 특정 목적에 한정되어 있습니다.예를 들어, Go에서는fallthrough키워드와 암묵적인 폴스루([62]fallthrough)는next디폴트로는 명시적인 폴스루이지만 모듈의 디폴트 동작으로서 암묵적인 폴스루를 설정할 수도 있습니다.

goto 문장이 있는 대부분의 언어에서는 그렇게 부르지만 컴퓨팅 초기에는 다른 이름이 사용되었습니다.예를 들어 MAD에서는 TRANSFER TO 문이 [63]사용되었습니다.APL은 오른쪽 포인팅 화살표를 사용합니다.goto를 위해서.

C haso는 위에서 설명한 바와 같이 다양한 관용구에서 흔히 사용된다.

Perl에도 함수가 있습니다.(위 참조)

Scheme와 같은 기능적 프로그래밍 언어에는 일반적으로 goto가 없으며 대신 연속을 사용합니다.

「 」를 참조해 주세요.

메모들

  1. ^ 와트 핀들레이 2004.
  2. ^ Kernighan & Ritchie 1988, 페이지 224, A9.6 점프 스테이트먼트.
  3. ^ a b 다이크스트라 1968년
  4. ^ GNU Pascal 개발팀 2005, 5.1 각종 Pascal 프로그래밍 힌트
  5. ^ Louden & Lambert 2012.
  6. ^ "고토 성명을 제한 없이 사용하면 프로세스의 진척 상황을 설명하는 의미 있는 좌표를 찾는 것이 매우 어려워집니다.지금 상태 그대로의 진술은 너무 원시적이고, 자신의 프로그램을 망치기엔 너무 많은 초대입니다."
  7. ^ 1987년 루빈.
  8. ^ Dijkstra, Edsger W. On a Somewhat Disappointing Correspondence (EWD-1009) (PDF). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin. (등기) (1987년 5월)
  9. ^ 크누트 1974년
  10. ^ Kernighan & Ritchie 1988, 페이지 65~66, 3.8 Goto and Labels.
  11. ^ a b c 바인 2007, 페이지 262
  12. ^ 가이슬러 2011.
  13. ^ Prata 2013.
  14. ^ a b c d Sahni & Cmelik 1995.
  15. ^ a b c Andrews 2003.
  16. ^ McConnell 2004.
  17. ^ Regehr 2013.
  18. ^ 로버츠 1995년
  19. ^ 2009년 마이어
  20. ^ Kozen & Tseng 2008.
  21. ^ 스택 오버플로우 질문 2012.
  22. ^ Pitchford & Tapp 2013.
  23. ^ 2013년 윌리엄스
  24. ^ ANSI X3.9-1978American National Standard – 프로그래밍 언어 FORTRAN. American National Standards Institute.ISO 1539-1980이라고도 하며 비공식적으로 FORTRAN 77이라고도 합니다.
  25. ^ ISO/IEC 1539-1:1997.정보기술 – 프로그래밍 언어 – Fortran – 파트 1: 기본 언어.비공식적으로 Fortran 95로 알려져 있습니다.이 표준에는 두 가지 부분이 더 있습니다.파트 1은 ANSI에 의해 정식으로 채택되었습니다.
  26. ^ 반즈 2006.
  27. ^ 1995년 서밋
  28. ^ a b 토발즈 2016.
  29. ^ a b 2004년 코젠스
  30. ^ Java Tutorial 2012.
  31. ^ 고슬링 & 맥길튼 1996년
  32. ^ Brender 2002, 960–965페이지.
  33. ^ a b 스피넬리스 2003.
  34. ^ a b 알랭 2019.
  35. ^ Strustrup 2012.
  36. ^ Hoad, Nathan (28 July 2022). "nathanhoad/godot_dialogue_manager". Retrieved 28 July 2022.
  37. ^ Chisnall 2012.
  38. ^ 2021년 콘티에리
  39. ^ Wilkes, Wheeler & Gill 1951.
  40. ^ 램쇼 1988년
  41. ^ Siedersleben 2006.
  42. ^ a b 스틸 1977년
  43. ^ a b Kelsey, Clinger & Rees 1998.
  44. ^ 즉, i가 0보다 작거나 같거나 크면 프로그램이 라벨 20, 30 또는 40으로 점프합니다.
  45. ^ Lahey Computer Systems, Inc. 2004
  46. ^ Microsoft 2021.
  47. ^ 1997년.
  48. ^ z/OS 2.5.0을 참조하십시오.
  49. ^ a b GCC, GNU 컴파일러 컬렉션 2021.
  50. ^ Fronczak & Lubbers 1974, 226페이지.
  51. ^ ALTER 문은 COBOL 1985 표준에서 사용되지 않는 것으로 간주되어 2002년에 삭제되었습니다.「 COBOL > Self-Modifying code 」를 참조해 주세요.
  52. ^ Van Tassel 2004.
  53. ^ Perl 구문 매뉴얼 2021.
  54. ^ GOTO for Java 2009.
  55. ^ Sexton 2012.
  56. ^ a b 2004년 힌들
  57. ^ a b Noack 2015.
  58. ^ 고슬링 등 (2005) C 및 C++와는 달리 Java 프로그래밍 언어에는 goto 문이 없습니다.식별자 문 라벨은 break(1414.15) 또는 continue(1414.16) 문과 함께 사용됩니다.키워드 const와 goto는 현재 사용되지 않지만 예약되어 있습니다.이것에 의해, 이러한 C++ 키워드가 프로그램에 올바르게 표시되지 않는 경우, Java 컴파일러는 보다 좋은 에러 메세지를 작성할 수 있습니다.
  59. ^ Seed7 프로그래밍 언어 2021 매뉴얼
  60. ^ PHP 매뉴얼 2021.
  61. ^ 바그너 2021
  62. ^ Go Programming Language Specification 2021.
  63. ^ 갤러 1962, 페이지 26-28, 197, 211.

레퍼런스

  • Contieri, Maxi (2021-11-02). "Code Smell 100 - GoTo". Maximiliano Contieri - Software Design. Retrieved 2021-11-14.
  • Fronczak, Edward J.; Lubbers, Clark E. (September 1974). MTS, Michigan Terminal System. University of Michigan Computing Center. UOM:39015034770076.
  • Geisler, Sandra (2011). C All-in-One Desk Reference For Dummies. John Wiley & Sons. pp. 217–220. ISBN 978-1-118-05424-6.
  • Hindle, Richie (April 1, 2004). "goto for Python". Entrian Solutions. Hertford, UK: Entrian Solutions Ltd. Retrieved 2021-11-10.
  • McConnell, Steve (December 2004). Code Complete: A Practical Handbook of Software Construction, Second Edition (2nd ed.). Microsoft Press. ISBN 978-0735619678.
  • Meyer, Bertrand (2009). Touch of Class: Learning to Program Well with Objects and Contracts. Springer Science & Business Media. p. 189. ISBN 978-3-540-92144-8.
  • Perl syntax manual (2021). Goto (Report). Retrieved 2021-11-14.
  • PHP Manual (2021). "goto". PHP. Retrieved 2021-11-13.
  • Roberts, Eric S. (March 1995). "Loop exits and structured programming: reopening the debate". ACM SIGCSE Bulletin. 27 (1): 268–272. doi:10.1145/199691.199815.
  • Steele, Guy Lewis (January 1977). "Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO". ACM '77: Proceedings of the 1977 Annual Conference: 153–162. doi:10.1145/800179.810196. S2CID 9807843.
  • Vine, Michael A. (2007). C Programming for the Absolute Beginner. Cengage Learning. ISBN 978-1-59863-634-5.
  • Wehr, Jason (1997). "Go to ( assigned )". www.personal.psu.edu/jhm/f90/201.html. Retrieved 2021-11-13.
  • z/OS 2.5.0 in IBM Documentation (2021). "Computed goto statement (IBM extension)". IBM. Retrieved 2021-11-13. This document describes the syntax, semantics, and IBM z/OS® XL C/C++ implementation of the C and C++ programming languages. For a general-purpose C or C++ standard reference, see cppreference.com.