Goto 문: 두 판 사이의 차이

내용 삭제됨 내용 추가됨
GOTO문을(를) GOTO 문(으)로 옮김
 
"GOTO문"이 "GOTO 문"보다 더 옳습니다.
1번째 줄:
'''GOTO 문'''은 여러 [[프로그래밍 언어]]에 등장하는 프로그램의 어느 부분에서 [[행번호 (전산학)|행번호]]나 [[레이블 (전산학)|레이블]]이 있는 다른 부분으로 건너뛸 때 사용하는 명령이다. 프로그램의 흐름을 바꾸는 기본적인 명령이며, 다른 흐름 제어문도 컴파일러가 GOTO문과 비슷하게 바꾼다.
#REDIRECT [[GOTO 문]]
 
GOTO 문은 [[포트란]], [[알골 프로그래밍 언어|알골]], [[코볼]], [[스노볼]], [[베이직]], [[커먼 리스프]], [[C (프로그래밍 언어)|C]], [[C++]], [[D (프로그래밍 언어)|D]], [[파스칼 (프로그래밍 언어)|파스칼]], [[펄]], [[PHP|PHP6]] 등지에서 사용되며, 특히 [[어셈블리어|어셈블리]]에서 많이 발견된다. 어셈블리어에서는 GOTO 대신에 BRA(branch에서 유래), JMP, JUMP등으로 쓰이기도 한다.
 
그러나 GOTO 문이 모든 [[고급언어]]에서 사용가능한 것은 아니다. 예를 들어, [[자바 (프로그래밍 언어)|자바]]와 같은 언어에서 GOTO는 [[예약어]]이긴 하지만 아무 기능을 하지 않는다.
 
== 비판 ==
고급 언어에서 GOTO 문은 비판의 대상이 되어 왔는데, GOTO 문이 과도하게 사용되면 읽고 유지하기 힘든 [[스파게티 코드]]가 나오기 쉽기 때문이다. [[구조적 프로그래밍]]은 [[1960년대]]와 [[1970년대]]에 더 두드러졌는데 많은 [[컴퓨터 과학자]]들의 결론은 프로그램이 항상 GOTO 문 대신 일명 ‘구조적’인 흐름 제어문([[순환문]], if-then-else문)을 사용해야 한다는 것이다. 그러나, GOTO문의 사용이 종종 나쁜 습관이긴 하지만, 많은 프로그래밍 언어에서 GOTO 문을 사용하지 않고는 간단히 되지 않는 경우(중첩 순환문을 빠져나갈 때나 [[예외 처리]]할 때)가 있다고 주장하는 사람들이 있다.
 
GOTO문에 대한 한 가지 유명한 비판은 [[1968년]]에 [[에츠허르 데이크스트라]]의 'GOTO 문의 해로움'<ref>{{언어고리|en}} [[에츠허르 데이크스트라]]: [http://www.acm.org/classics/oct95/ Go To Statement Considered Harmful]. ''Communications of the ACM'' '''11''':3 (1968), 147–148.</ref>이라는 서신이다. 이 서신에서 데이크스트라는 더 높은 수준의 언어에서는 GOTO 문을 제한하지 않으면 안된다고 했는데, 이것은 프로그램의 정확성을 분석하고 증명하는 것을 (특히 순환문을 포함해서) 어렵게하기 때문이라고 했다. [[도널드 크누스]]의 'GOTO 문을 사용한 구조적 프로그래밍'<ref>{{언어고리|en}} [[도널드 크누스]]: [http://pplab.snu.ac.kr/courses/adv_pl04/papers/p261-knuth.pdf Structured Programming with Goto Statements]. ''Computing Surveys'' '''6''':4 (1974), 261–301.<!-- This link probably violated copyright --></ref>에서는 GOTO의 적절한 위치를 고찰한다. 일반적으로 이것들은 특정 프로그래밍 구조가 없기 때문이다. 이런 경우들에서 GOTO 문은 항상 원하는 구조를 에뮬레이트 할 수 있고, 따라서 이것이 프로그래밍의 기본적인 요소의 하나라는 것이다. 다른 해법은 [[매크로]]를 이용하여 원하는 제어 구조를 만드는 것이다.([[리스프]]와 그 변종이나 [[포스 프로그래밍 언어|포스]]에서는 이렇게 해서 대부분의 일을 할 수 있다.)
 
== 변형 ==
''계산된 GOTO 문''은 수식의 값에 따라 몇 군데의 레이블로 분기하거나, 변수에 저장되어 있는 레이블로 분기한다. 계산된 GOTO 문은 보통 GOTO 문보다 문제가 더 심각한데, 프로그래머가 어떤 구문을 본다고 해도 다음에 무엇이 수행될지 알 수 없기 때문이다. [[베이직]]의 ON GOTO 문은 전자의 계산된 GOTO 문을 지원하며, 각각의 사례별로 분기에 유용하다. [[C (프로그래밍 언어)|C]]에서는 [[switch문]]을 지원한다. 어떤 C 컴파일러들은 레이블 변수에 따라 분기하는 GOTO 문을 제공하기도 한다.
 
[[이어하기]]({{llang|en|continuation}})은 프로그램의 임의의 위치에서 기억했던 위치로 분기하는 점에서 계산된 GOTO 문과 비슷하다. 그러나 이어하기은 현재 함수를 벗어날 수 있지만 GOTO 문은 그렇지 않기 때문에 이어하기가 더 유연하다. 이어하기를 실행하면 보통 분기하는 것 뿐만 아니라 보통 프로그램의 [[호출 스택]]을 조절하는 것까지 한다.
 
베이직 언어를 [[패러디]]한 [[인터칼 프로그래밍 언어|인터칼]]과 같은 언어에서는 [[COME FROM 문]]을 GOTO 문 대신에 쓰기도 한다.
 
[[펄]]과 같은 언어에서는 @_variable에 있는 현재 인자를 사용하여 서브루틴을 호출하는 방법으로 GOTO 문을 사용한다.
 
== 읽을거리 ==
<!-- * [[제어 구조#GOTO 문]] -->
* [[항해형 데이터베이스]]
 
== 주석 ==
<references/>
 
== 바깥 고리 ==
* {{언어고리|en}} [http://www.geek-central.gen.nz/peeves/programming_discipline.html A Structured Discipline of Programming]
 
<!--
[[분류:베이직 프로그래밍 언어]]
-->
 
[[분류:프로그래밍 구성체]]
 
[[ca:GOTO]]
[[de:Sprunganweisung]]
[[en:Goto]]
[[es:GOTO]]
[[fr:Goto]]
[[he:פקודת goto]]
[[it:GOTO]]
[[ja:Goto文]]
[[nl:GOTO]]
[[pl:Goto]]
[[pt:Goto (programação)]]
[[ru:GOTO]]
[[sv:Goto]]
[[uk:Безумовний перехід]]