흐름 제어

Control flow

컴퓨터 과학에서 제어 흐름(또는 제어 흐름)은 명령 프로그램의 개별 문장, 명령 또는 함수 호출이 실행 또는 평가되는 순서입니다.명시적 제어 흐름에 대한 강조는 명령형 프로그래밍 언어와 선언형 프로그래밍 언어를 구분합니다.

명령형 프로그래밍 언어에서 제어 흐름문은 둘 이상의 경로 중 어느 쪽을 따를지에 대한 선택을 하는 문입니다.엄격하지 않은 기능 언어의 경우 동일한 결과를 얻기 위해 기능 및 언어 구조가 존재하지만 일반적으로 제어 흐름 문이라고 불리지는 않습니다.

일련의 문장은 일반적으로 블록으로 구성되며, 그룹화와 더불어 어휘 범위도 정의된다.

인터럽트 및 신호서브루틴과 유사한 방식으로 제어 흐름을 변경할 수 있는 저레벨 메커니즘이지만 인라인 제어 흐름 문을 실행하는 것이 아니라 (비동기적으로 발생할 수 있는) 외부 자극 또는 이벤트에 대한 응답으로 발생합니다.

기계어 또는 어셈블리 언어 수준에서 제어 흐름 명령은 일반적으로 프로그램 카운터를 변경함으로써 작동합니다.일부 중앙 처리 장치(CPU)에서는 조건부 또는 무조건 분기 명령(점프라고도 함)만 사용할 수 있습니다.

분류

제어 흐름을 나타내는 흐름도.

언어에 따라 지원되는 제어 흐름문의 종류는 다양하지만 그 효과에 따라 분류할 수 있습니다.

  • 다른 문장에서 계속(무조건 분기 또는 점프)
  • 조건(선택지 - 조건부 분기)이 충족되는 경우에만 일련의 문 실행
  • 어떤 조건이 충족될 때까지 스테이트먼트 세트를 0회 이상 실행(즉, 루프 - 조건부 브랜치와 동일)
  • 제어 흐름이 일반적으로 반환되는 일련의 원거리 스테이트먼트 실행(서브루틴, 코루틴연속)
  • 프로그램 중지, 추가 실행 방지(무조건 중지)

원어민

라벨

라벨소스 코드 내의 고정 위치에 할당된 명시적인 이름 또는 번호로 소스 코드의 다른 곳에 나타나는 제어 흐름 문에 의해 참조될 수 있습니다.라벨은 소스 코드 내의 위치를 표시하며 다른 효과는 없습니다.

번호는 일부 언어(BASIC )에서 사용되는 이름 있는 라벨 대신 사용됩니다.소스 코드의 각 텍스트 행의 시작 부분에 배치되는 정수입니다.이를 사용하는 언어에서는 다음 각 행에서 행의 값이 증가해야 하지만 연속되는 행일 필요는 없다는 제약이 따르는 경우가 있습니다.예를 들어 BASIC에서는 다음과 같습니다.

10 허락하다 X = 3 20 인쇄하다 X 

C 및 Ada같은 다른 언어에서 라벨은 식별자이며, 보통 행의 시작 부분에 나타나고 콜론이 바로 뒤에 나옵니다.예를 들어, C:

성공.: 인쇄물(수술은 성공적이었다.\n"); 

언어 ALGOL 60은 (둘 다 다음 문장에 콜론으로 링크된) 라벨로서 정수와 식별자를 모두 허용했지만, 다른 ALGOL 변형에서 정수를 허용한 경우는 거의 없었습니다.초기 Fortran 컴파일러는 정수를 라벨로만 허용했습니다.Fortran-90부터는 영숫자 라벨도 사용할 수 있게 되었습니다.

에 가다

goto 문(go-to-to와 에 따라 발음되는 영어 단어의 조합)은 무조건적인 제어 이전의 가장 기본적인 형태입니다.

키워드는 언어에 따라 대문자 또는 소문자 중 하나이지만 일반적으로 다음과 같이 표기됩니다.

   에 가다 라벨. 

goto 스테이트먼트의 효과는 다음 스테이트먼트가 지정된 라벨(또는 그 직후)에 표시되는 스테이트먼트가 되도록 하는 것입니다.

Goto 스테이트먼트는 많은 컴퓨터 과학자들, 특히 Dijkstra에 의해 유해하다고 여겨져 왔습니다.

서브루틴

서브루틴의 용어는 다양하며, 루틴, 프로시저, 함수(특히 결과를 반환하는 경우) 또는 메서드(특히 클래스 또는 형식 클래스에 속하는 경우)라고도 합니다.

1950년대에 컴퓨터 메모리는 현재 표준으로 볼 때 매우 작았기 때문에 서브루틴은 주로 프로그램 크기를 줄이기 위해 사용되었습니다[citation needed].코드 조각은 한 번 작성되었다가 프로그램의 다른 여러 곳에서 여러 번 사용되었다.

오늘날 서브루틴은 예를 들어 일부 알고리즘을 분리하거나 데이터 액세스 방법을 숨김으로써 프로그램을 보다 구조화하는데 더 자주 사용됩니다.많은 프로그래머가 하나의 프로그램에서 작업하는 경우 서브루틴은 작업을 분할하는 데 도움이 되는 모듈러 방식의 한 종류입니다.

순서

구조화 프로그래밍에서 연속 명령어의 순서화된 시퀀스는 반복, 재귀 및 선택과 함께 프로그램의 구성 요소로 사용되는 기본 제어 구조 중 하나로 간주됩니다.

최소한의 구조화된 제어 흐름

1966년 5월, Böhm과 Jacopini는 ACM의 Communications of the ACM에 gotos를 가진 모든 프로그램은 중복 코드 및/또는 부울 변수(true/false flags) 추가와 함께 선택(IF THEN ELSE) 및 루프(WHIN 조건 DO xxxxx)만을 포함하는 goto-free 형식으로 변환될 수 있다는 것을 보여주었다[1].이후 저자들은 선택이 루프(그리고 더 많은 부울 변수)로 대체될 수 있음을 보여주었다.

이러한 미니멀리즘이 가능하다고 해서 반드시 바람직한 것은 아닙니다.결국 이론상 컴퓨터는 하나의 기계 명령(다른 기계 명령에서 하나의 숫자를 빼고 결과가 부정적일 경우 분기)만 필요로 하지만 실제 컴퓨터에는 수십 개 또는 수백 개의 기계 명령이 있습니다.

Böhm과 Jacopini의 기사가 보여준 것은 모든 프로그램이 무료가 될 수 있다는 것이었다.다른 연구에서는 주로 제어 흐름을 방해하지 않고 어디서든 문장으로 사용할 수 있기 때문에 하나의 진입과 출구가 있는 제어 구조가 다른 어떤 [citation needed]형태보다 훨씬 이해하기 쉽다는 것을 보여주었다.즉, 컴포넌트는 컴포넌트가 가능했습니다.(비엄격한 프로그래밍 언어, 최근에는 컴포넌트 소프트웨어 트랜잭션 등 이후 개발도 이 전략을 계속하여 프로그램의 컴포넌트를 더욱 자유롭게 컴포넌트 할 수 있게 되었습니다.)

일부 학자들은 Böhm-Jacopini 결과에 대해 순수주의 접근법을 취했고 심지어 다음과 같은 명령도 주장했습니다.break그리고.return루프의 중간부터의 것은 Böhm-Jacopini 증명에서는 필요하지 않기 때문에 나쁜 관행이며, 따라서 그들은 모든 루프가 하나의 출구점을 가져야 한다고 주장했다.이 순수주의 접근법은 1990년대 중반까지 [2]학계에서 입문 프로그래밍을 가르치기 위해 선호되었던 언어 파스칼(1968-1969년 설계)에 구현되어 있다.Böhm-Jacopini 정리를 직접 적용하면 구조화된 차트에 추가 국소 변수가 도입될 수 있으며 일부 코드 [3]중복이 발생할 수도 있다.파스칼은 이 두 가지 문제와 에릭 S에 의해 인용된 경험적 연구에 의해 영향을 받는다. Roberts, 학생 프로그래머는 배열에서 요소를 검색하는 함수를 작성하는 것을 포함한 몇 가지 간단한 문제에 대해 파스칼에서 올바른 솔루션을 만드는 데 어려움을 겪었습니다.Roberts가 인용한 1980년 Henry Shapiro의 연구에 따르면 파스칼이 제공한 제어 구조만을 사용하여 피실험자의 20%만이 올바른 솔루션을 제공했으며 [2]루프 중간에서 반환을 쓸 수 있는 경우 이 문제에 대해 잘못된 코드를 쓴 피험자는 없었다.

실제 제어 구조

제어 구조를 가진 대부분의 프로그래밍 언어에는 관련된 [clarification needed]제어 구조의 유형을 나타내는 초기 키워드가 있습니다.그 후 제어구조가 최종 키워드를 가지고 있는지 여부에 대해 언어가 분할됩니다.

  • 최종 키워드 없음: ALGOL 60, C, C++, Haskell, Java, Pascal, Perl, PHP, PL/I, Python, PowerShell.이러한 언어에는 문장을 그룹화하는 방법이 필요합니다.
    • ALGOL 60 및 Pascal:begin...end
    • C, C++, Java, Perl, PHP 및 PowerShell: 대괄호 {...}
    • PL/I:DO...END
    • Python: 들여쓰기 수준 사용(오프사이드 규칙 참조)
    • Haskell : 들여쓰기 레벨 또는 곱슬 괄호 사용 가능, 자유롭게 혼재 가능
    • Lua: 용도do...end
  • 최종 키워드:Ada, ALGOL 68, Modula-2, Fortran 77, Mythryl, Visual Basic.최종 키워드의 형식은 다음과 같습니다.
    • 아다: 마지막 키워드는end+ space + initial 키워드(예:if...end if,loop...end loop
    • ALGOL 68, Mythryl: 초기 키워드의 철자가 거꾸로 되어 있습니다.if...fi,case...esac
    • Fortran 77: 최종 키워드는END+ initial 키워드 예:IF...ENDIF,DO...ENDDO
    • Modula-2: 같은 최종 키워드END무슨 일이 있어도
    • Visual Basic: 모든 제어 구조에는 고유한 키워드가 있습니다. If...End If;For...Next;Do...Loop;While...Wend

선택.

If-then-(else)문

조건부 식과 조건부 구성은 프로그래머가 지정부울 조건이 참인지 거짓인지에 따라 다른 계산 또는 액션을 수행하는 프로그래밍 언어의 기능입니다.

  • IF..GOTO비구조화 언어에서 볼 수 있는 폼은 일반적인 머신 코드 명령을 모방하여 조건이 충족되면 라벨 또는 행 번호로 이동합니다(GOTO).
  • IF..THEN..(ENDIF)점프에 한정되는 것이 아니라 간단한 스테이트먼트 또는 네스트된 블록은 THEN key 키워드를 따를 수 있습니다.이것은 구조화된 형태입니다.
  • IF..THEN..ELSE..(ENDIF)위와 같으나 조건이 false일 경우 두 번째 액션을 수행합니다.이것은 가장 일반적인 형태 중 하나이며 다양한 종류가 있습니다.단말기가 필요한 것도 있습니다.ENDIF다른 사람들은 그렇지 않다.C 및 관련 언어에는 terminal 키워드나 then'은 필요 없지만 조건 주위에 괄호가 필요합니다.
  • 조건문은 다른 조건문 안에 중첩될 수 있습니다.일부 언어에서는ELSE그리고.IF합쳐지다ELSEIF이 때문에, 일련의 하드웨어가 필요 없게 됩니다.ENDIF또는 복합문 끝에 있는 기타 최종문.
파스칼: 아다: C: 스크립트: Python: 리스프:
한다면 a > 0 그리고나서   기입하다("네.") 또 다른   기입하다("아니요."); 
한다면 a > 0 그리고나서       Put_Line(풋_라인)("네"); 또 다른       Put_Line(풋_라인)("아니요"); 끝. 한다면; 
한다면 (a > 0) {      인쇄물("네"); } 또 다른 {     인쇄물("아니요"); } 
[ $a - gt 0 ]의 경우, 에코 「yes」의 경우 에코 「no의 fi.
한다면 a > 0:      인쇄물("네") 또 다른:     인쇄물("아니요") 
(프린터   (한다면 (플러스 a)       "네"       "아니요")) 

일반적이지 않은 변형은 다음과 같습니다.

  • Fortran과 같은 일부 언어에는 숫자 값이 양수, 음수 또는 0인지 테스트하는 3방향 또는 산술 if가 있습니다.
  • 일부 언어들은 기능적인 형태의 언어들을 가지고 있다.if스테이트먼트(예를 들어 Lisp의 경우) cond.
  • 일부 언어에는 연산자 형식이 있습니다.if예를 들어 C의 3진 연산자.
  • Perl은 C-style을 보완합니다.if와 함께when그리고.unless.
  • Smalltalk 사용ifTrue그리고.ifFalse기본적인 언어 구조가 아닌 조건부 구현을 위한 메시지입니다.

케이스 및 스위치 스테이트먼트

스위치 문(또는 대소문자 문 또는 멀티웨이 브랜치)은 지정된 상수와 값을 비교하여 일치하는 첫 번째 상수에 따라 액션을 수행합니다.일반적으로 일치하는 항목이 없는 경우 기본 액션("else", "그렇지 않은 경우")을 실행하는 조항이 있습니다.switch 문을 사용하면 룩업테이블 등의 컴파일러 최적화가 가능합니다.동적 언어에서는 대소문자가 상수 표현으로 제한되지 않고 오른쪽 셸 스크립트의 예와 같이 패턴 매칭으로 확장될 수 있습니다.*)는 기본 대소문자를 임의의 문자열과 일치하는 글로브로서 구현합니다.사례 로직은 SQL과 같이 기능적인 형태로 구현될 수도 있습니다.decode진술.

파스칼: 아다: C: 스크립트: 리스프:
사례. 일부 Char    'a': 액션 온a;   'x': 액션 OnX;   'y','z':액션 On YandZ;   또 다른 액션 On No Match; 끝.; 
사례. 일부 Char    언제 'a' => 액션 온a;   언제 'x' => 액션 OnX;   언제 'y'   'z' => 액션 On YandZ;   언제 다른이들 => 액션 On No Match; 끝.; 
전환하다 (일부 Char) {   사례. 'a': 액션 온a; 브레이크.;   사례. 'x': 액션 OnX; 브레이크.;   사례. 'y':   사례. 'z': 액션 On YandZ; 브레이크.;   체납: 액션 On No Match; } 
케이스 $someChar in a) 액션OnA; x) 액션OnX; [yz]) 액션OnYandZ; *) 액션OnNoMatch; esac
(사례. 썸차   ((#\a)     액션 온 어)   ((#\x)     액션 온 엑스)   ((#\y #\z) Y&Z에 의한 액션)   (또 다른      일치하지 않는 액션)) 

루프

루프는 한 번 지정되지만 여러 번 연속해서 실행할 수 있는 일련의 스테이트먼트입니다.루프 내부(아래 xxx로 표시된 루프 본체)는 특정 횟수 또는 각 항목 집합에 대해 1회 또는 특정 조건이 충족될 때까지 또는 무기한으로 준수됩니다.

Haskell Scheme와 같은 함수형 프로그래밍 언어에서 루프는 명시적 루프 구조 대신 재귀 또는 고정점 반복을 사용하여 표현될 수 있습니다.테일 재귀는 반복으로 쉽게 변환할 수 있는 특수한 재귀입니다.

카운트 제어 루프

대부분의 프로그래밍 언어에는 루프를 일정 횟수 반복하는 구성이 있습니다.대부분의 경우 카운트는 위가 아니라 아래가 될 수 있으며 1 이외의 스텝사이즈를 사용할 수 있습니다.

I = 1 to N for I : = 1 to N 시작 xxx 다음 끝; ------------------------------------------------------------------------------------------------------------------------- (I =1; I <=N; ++I > {xxxxxxxx} 끝 끝 끝 {xx}의 끝

이 예에서 N < 1일 경우 루프의 본체는 프로그래밍 언어에 따라 1회(I가 값 1) 또는 전혀 실행되지 않을 수 있습니다.

많은 프로그래밍 언어에서 정수만 카운트 제어 루프에서 안정적으로 사용할 수 있습니다.부동소수점 번호는 하드웨어 제약으로 인해 부정확하게 표현되므로 다음과 같은 루프가 발생합니다.

X의 경우:= 0.1단계에서 1.0단계 실행

는 반올림 오류, 하드웨어 및 컴파일러 버전에 따라 9회 또는 10회 반복될 수 있습니다.또한 반복 덧셈에 의해 X의 증가가 발생하는 경우, 누적 반올림 오차는 각 반복에서의 X의 값이 예상 시퀀스 0.1, 0.2, 0.3, ..., 1.0과 상당히 다를 수 있음을 의미할 수 있다.

상태 제어 루프

대부분의 프로그래밍 언어에는 조건이 변경될 때까지 루프를 반복하는 구조가 있습니다.루프 시작 시 상태를 테스트하는 변형도 있고 마지막에 테스트하는 변형도 있습니다.테스트가 시작 단계에 있는 경우 본문을 완전히 건너뛸 수 있습니다. 마지막 단계에 있는 경우 본문은 항상 최소 한 번 실행됩니다.

실행 중(테스트)은 테스트까지 xxxxxx루프를 반복합니다. -----------------------------------------------------------------------------------------------------------------------------------------------------------------

컨트롤 브레이크는 일반적인 루프 내에서 값의 그룹에 대한 처리를 트리거하기 위해 사용되는 값 변경 검출 방법입니다.값은 루프 내에서 감시되며 변경에 따라 프로그램플로우가 관련된 그룹 이벤트 처리로 전환됩니다.

실행 기간(파일 종료) IF new-zipcode <> current-zipcode display_current-zipcode = new-zipcode zipcount = 0 ENDIF zipcount+LOUP

수집 제어 루프

몇몇 프로그래밍 언어(: Ada, D, C++11, Smalltalk, PHP, Perl, Object Pascal, Java, C#, MATLAB, Visual Basic, Ruby, Python, JavaScript, Fortran 95 및 이후)는 배열 또는 집합의 모든 요소를 통해 암묵적인 루프를 허용하는 특별한 구조를 가지고 있다.

일부 컬렉션은 [:eachElement xxx]를 실행합니다. 
컬렉션항목에 대해 xxx 끝을 시작합니다. foreach (항목; myCollection) {xx} {xx}이(가) 일부 어레이 {xx}($k => $v) {xx} 컬렉션 <String> coll, (String s: coll) {xxx} 컬렉션 각각에 대해 {xx} 포어치합니다.
forall(인덱스 = 첫 번째: 마지막: 단계...)

Scala에는 수집 제어 루프를 일반화하는 for-expressions가 있으며 비동기 프로그래밍과 같은 다른 용도도 지원합니다.Haskell은 do-expressions와 comprehensions를 가지고 있으며, 이는 Scala의 for-expressions와 유사한 기능을 제공합니다.

일반 반복

C와 같은 일반적인 반복 구조for스테이트먼트 및 공통 리스프do형식을 사용하여 위의 루프 중 하나를 표현할 수 있습니다.또한 일부 컬렉션에 대한 루프도 병렬로 표시할 수 있습니다.보다 구체적인 루프 구조를 사용할 수 있는 경우, 보통 일반적인 반복 구조보다 선호됩니다. 이는 종종 표현의 목적을 명확하게 하기 때문입니다.

무한 루프

무한 루프는 프로그램세그먼트 루프를 영원히 또는 오류와 같은 예외적인 조건이 발생할 때까지 확실하게 하기 위해 사용됩니다.예를 들어 이벤트 구동 프로그램(서버 등)은 영원히 루프하여 이벤트가 발생했을 때 처리하고 프로세스가 오퍼레이터에 의해 종료되었을 때만 정지합니다.

무한 루프는 다른 제어 흐름 구조를 사용하여 구현할 수 있습니다.가장 일반적으로 비구조화 프로그래밍에서는 이것이 점프백업(goto)인 반면 구조화 프로그래밍에서는 조건을 생략하거나 명시적으로 true로 설정함으로써 절대 끝나지 않도록 설정된 무기한 루프(while loop)입니다.while (true) ...일부 언어에는 무한 루프에 대한 특별한 구조가 있으며, 일반적으로 무한 루프에서 조건을 생략합니다.예를 들어 Ada (loop ... end loop포트란([4] )DO ... END DO), [Go](for { ... }, 및 Ruby ( )loop do ... end).

종종 무한 루프는 조건 제어 루프에서 프로그래밍 오류로 인해 의도치 않게 생성되며 루프 조건은 루프 내에서 변경되지 않는 변수를 사용합니다.

다음 반복과 함께 계속

루프 본체 내에서 루프 본체의 나머지 부분을 건너뛰고 루프의 다음 반복을 계속해야 할 경우가 있습니다.일부 언어에는 다음과 같은 문구가 있습니다.continue(대부분의 언어),skip,[5] 또는next(Perl and Ruby) 이 기능을 수행합니다.그 결과 가장 안쪽의 루프 본체가 조기에 종료되고 다음 반복에서 정상적으로 재개됩니다.루프의 마지막 반복일 경우 루프 전체가 조기에 종료됩니다.

현재 반복 다시 실행

Perl이나 [7]Ruby와 같은[6] 몇몇 언어들은redo현재 반복을 처음부터 다시 시작하는 문입니다.

재시작 루프

루비는retry첫 번째 [8]반복부터 루프 전체를 재시작하는 스테이트먼트입니다.

루프로부터의 조기 종료

카운트 제어 루프를 사용하여 테이블을 검색할 경우 필요한 항목이 발견되는 즉시 검색을 중지하는 것이 좋습니다.일부 프로그래밍 언어는 다음과 같은 문구를 제공합니다.break(대부분의 언어),Exit(Visual Basic) 또는last(Perl). 즉, 전류 루프를 즉시 종료하고 해당 루프 직후에 제어권을 스테이트먼트로 이전합니다.조기 종료 루프의 다른 용어는 루프 앤 하프입니다.

다음 예시는 루프로부터의 조기 종료중간 테스트를 모두 지원하는 Ada에서 실행됩니다.두 기능 모두 매우 유사하며 두 코드 스니펫을 비교하면 차이가 나타납니다.중간조건이 자기포함형 구성인 동안 조기종료if 문과 결합해야 합니다.

와 함께 Ada.텍스트 입출력; 와 함께 에이다.정수 본문 입출력;  절차. 인쇄_제곱       X : 정수; 시작한다.     읽기_데이터 : 고리         아다.정수 본문 입출력.얻다(X);     퇴장 읽기_데이터 언제 X = 0;         아다.본문 입출력.놓다 (X * X);         아다.본문 입출력.신규_라인;     끝. 고리 읽기_데이터; 끝. 인쇄_제곱; 

Python은 루프가 일찍 종료되었는지 여부에 따라 코드의 조건부 실행을 지원합니다.break또는 루프가 있는 else-communications를 사용하여 설정되지 않도록 합니다.예를들면,

위해서 n  set_of_internals(설정):     한다면 프라임(n):         인쇄물("집합에 소수가 포함되어 있습니다.)         브레이크. 또 다른:     인쇄물("수집합에 소수가 없습니다.") 

else위의 예에서 절은 에 링크되어 있습니다.for내부가 아닌 스테이트먼트if진술.양쪽 Python의for그리고.whileloops는 이러한 else 구를 지원합니다.이것은 루프의 조기 종료가 발생하지 않은 경우에만 실행됩니다.

일부 언어에서는 중첩된 루프의 분리를 지원합니다.이론에서는 이를 다단계 분단이라고 합니다.일반적인 사용 예로는 다차원 테이블을 검색하는 것이 있습니다.이는 bash 및 [10]PHP와[9] 같이 멀티레벨 브레이크(N레벨에서 브레이크아웃) 또는 Java 및 [11]Perl과 같이 라벨이 붙은 브레이크(breakout and continue)를 통해 수행할 수 있습니다.멀티레벨 브레이크의 대안으로는 다른 레벨을 분리하기 위해 테스트되는 상태 변수와 함께 단일 브레이크, 분리되는 수준에서 포착되는 예외, 함수에 중첩된 루프를 배치하고 중첩된 루프 전체를 종료하기 위한 복귀 사용, 라벨 및 goto 문 사용 등이 있습니다.C에는 다단계 브레이크가 포함되어 있지 않습니다.일반적인 대안은 goto를 사용하여 라벨이 붙은 [12]브레이크를 구현하는 것입니다.Python에는 다단계 중단 또는 연속이 없습니다. 이는 PEP 3136에서 제안되었으며, 추가된 복잡성은 드물지만 합법적으로 [13]사용할 가치가 없다는 이유로 거부되었습니다.

다단계 휴식 개념은 이론적인 컴퓨터 과학에서 어느 정도 관심을 가지고 있는데, 그 이유는 이것이 오늘날 코사라주 계층 [14]구조라고 불리는 것을 만들어 내기 때문입니다.1973년 S. Rao Kosaraju는 구조화 프로그래밍에 변수를 추가하는 것을 피할 수 있다는 것을 증명함으로써 구조화 프로그램 정리를 다듬었다. 단, 임의의 깊이, 루프로부터의 다단계 브레이크가 [15]허용된다면 말이다.또한, Kosaraju는 프로그램의 엄격한 계층구조가 존재함을 증명했다. 즉, 모든 정수 n에 대해,[14] 추가된 변수를 도입하지 않고는 n 미만의 깊이 n의 다단계 구분을 가진 프로그램으로 다시 쓸 수 없는 다단계 구분을 포함하는 프로그램이 존재한다.

할 수도 있다return루프된 스테이트먼트를 실행하는 서브루틴에서 네스트된 루프와 서브루틴을 모두 제거합니다.다중 절단에 대해 제안된 다른 제어 구조들이 있지만, 이러한 구조들은 일반적으로 예외로 구현된다.

David Watt는 2004년 교과서에서 다단계 브레이크와 리턴 문장의 유사성을 설명하기 위해 Tennent의 시퀀서 개념을 사용합니다.와트는 이스케이프 시퀀서로 알려진 시퀀서의 클래스는 "텍스트로 둘러싸인 명령 또는 프로시저의 실행을 종료하는 시퀀서"로 정의되며 루프로부터의 브레이크(멀티 레벨 브레이크 포함)와 리턴 스테이트먼트를 모두 포함합니다.그러나 일반적으로 구현되는 바와 같이 반환 시퀀서는 (반환) 값을 전달할 수도 있지만, 현대 언어로 구현된 브레이크 시퀀서는 일반적으로 전달할 [16]수 없습니다.

루프 변형 및 불변량

루프 바리안트루프 불변량은 [17]루프의 정확성을 나타내기 위해 사용됩니다.

실질적으로 루프 바리안트는 음이 아닌 초기 값을 갖는 정수식입니다.이 변종 값은 루프가 반복될 때마다 감소해야 하지만 루프가 올바르게 실행되는 동안에는 절대 음수가 되어서는 안 됩니다.루프 배리언트는 루프가 종료되는 것을 보증하기 위해 사용됩니다.

루프 불변성은 첫 번째 루프 반복 전에는 참이어야 하며 반복 후에는 참이어야 합니다.즉, 루프가 올바르게 종료되면 종료 조건과 루프 불변성이 모두 충족됩니다.루프 불변수는 연속적인 반복 중에 루프의 특정 속성을 모니터링하기 위해 사용됩니다.

에펠과 같은 일부 프로그래밍 언어에는 루프 변형 및 불변성에 대한 네이티브 지원이 포함되어 있습니다.Java의 루프 문에 대한 Java 모델링 언어의 사양과 같은 경우에 지원은 추가 기능입니다.

서브언어 루프

일부 리스프 방언은 루프를 기술하기 위한 광범위한 하위 언어를 제공합니다.초기 예는 Interlisp의 Conversional Lisp에서 확인할 수 있습니다.Common Lisp[18] 이러한 서브 언어를 구현하는 Loop 매크로를 제공합니다.

루프 시스템 상호 참조 테이블

프로그래밍 언어 조건부 고리 조기 종료 루프 연속 다시 하다 재시도 교정 설비
시작한다. 가운데 끝. 세어보세요 수집 일반적인 무한의 변종 불변의
아다 네. 네. 네. 네. 어레이 아니요. 네. 깊이 내포된 아니요.
APL 네. 아니요. 네. 네. 네. 네. 네. 깊이 내포된 네. 아니요. 아니요.
C 네. 아니요. 네. 아니요. 아니요. 네. 아니요. 깊이 내포된 깊이 내포된 아니요.
C++ 네. 아니요. 네. 아니요. 네, 그렇습니다. 네. 아니요. 깊이 내포된 깊이 내포된 아니요.
C# 네. 아니요. 네. 아니요. 네. 네. 아니요. 깊이 내포된 깊이 내포된
코볼 네. 아니요. 네. 네. 아니요. 네. 아니요. 깊이 내포된 깊이 내포된 아니요.
일반적인 리스프 네. 네. 네. 네. 빌트인만 네. 네. 깊이 내포된 아니요.
D 네. 아니요. 네. 네. 네. 네. 네, 그렇습니다[14]. 깊이 내포된 깊이 내포된 아니요.
에펠 네. 아니요. 아니요. 네, 그렇습니다. 네. 네. 아니요. 한 단계 아니요. 아니요. 아니요. 정수만 네.
F# 네. 아니요. 아니요. 네. 네. 아니요. 아니요. 아니요. 아니요. 아니요.
포트란 77 네. 아니요. 아니요. 네. 아니요. 아니요. 아니요. 한 단계 네.
포트란 90 네. 아니요. 아니요. 네. 아니요. 아니요. 네. 깊이 내포된 네.
Fortran 95 이후 네. 아니요. 아니요. 네. 어레이 아니요. 네. 깊이 내포된 네.
하스켈 아니요. 아니요. 아니요. 아니요. 네. 아니요. 네. 아니요. 아니요. 아니요.
자바 네. 아니요. 네. 아니요. 네. 네. 아니요. 깊이 내포된 깊이 내포된 아니요. 비고정적인 비고정적인
자바스크립트 네. 아니요. 네. 아니요. 네. 네. 아니요. 깊이 내포된 깊이 내포된 아니요.
자연의 네. 네. 네. 네. 아니요. 네. 네. 네. 네. 네. 아니요.
OCaml 네. 아니요. 아니요. 네. 어레이, 리스트 아니요. 아니요. 아니요. 아니요. 아니요.
PHP 네. 아니요. 네. 아니요. 네, 그렇습니다. 네. 아니요. 깊이 내포된 깊이 내포된 아니요.
네. 아니요. 네. 아니요. 네. 네. 아니요. 깊이 내포된 깊이 내포된 네.
파이썬 네. 아니요. 아니요. 아니요. 네. 아니요. 아니요. 깊이 내포된 깊이 내포된 아니요.
리볼 아니요. 네. 네. 네. 네. 아니요. 네. 한 단계 아니요. 아니요.
루비 네. 아니요. 네. 네. 네. 아니요. 네. 깊이 내포된 깊이 내포된 네. 네.
표준 ML 네. 아니요. 아니요. 아니요. 어레이, 리스트 아니요. 아니요. 아니요. 아니요. 아니요.
Visual Basic.그물 네. 아니요. 네. 네. 네. 아니요. 네. 루프 타입별로 1레벨 루프 타입별로 1레벨
PowerShell 네. 아니요. 네. 아니요. 네. 네. 아니요. ? 네.
  1. a while (true)는 전용 언어 구조가 아니기 때문에 이 목적을 위한 무한 루프로서 카운트되지 않습니다.
  2. abcdefgh C의for (init; test; increment)loop은 일반적인 루프 구성입니다.구체적으로 카운트 구성이라고는 할 수 없지만, 자주 사용됩니다.
  3. a b c APL, C, C++ 및 C#에서는 라벨과 gotos를 사용하여 딥브레이크를 실행할 수 있습니다.
  4. a 개체 위에 반복이 PHP 5에 추가되었습니다.
  5. abc 카운팅 루프는 예를 들어 Python의 목록이나 생성기를 통해 반복함으로써 시뮬레이션될 수 있습니다.range().
  6. a b c d e 딥 브레이크는 예외 처리를 사용하여 달성할 수 있습니다.
  7. a 특별한 구성은 없습니다.while기능을 사용할 수 있습니다.
  8. a 특별한 구조는 없지만 사용자는 일반적인 루프 함수를 정의할 수 있습니다.
  9. a C++11 규격에서는 의 범위 베이스가 도입되었습니다.STL에는,std::for_each STL 컨테이너에서 반복하고 각 요소에 대해 단항 함수를 호출할 수 있는 템플릿 함수입니다.[19]이 기능은 이러한 [20]컨테이너에 매크로로 구성할 수도 있습니다.
  10. a 카운트 제어 루프는 정수 간격에 걸쳐 반복함으로써 영향을 받습니다.종료 조건을 추가하여 조기 종료합니다.
  11. a 에펠은 예약어를 지원한다.retry단, 루프 제어가 아닌 예외 처리에서는 사용됩니다.
  12. a Java Modeling Language(JML) 동작 인터페이스 사양 언어가 필요합니다.
  13. a 루프 변형은 정수여야 합니다.초한 변형은 지원되지 않습니다.[1]
  14. a D는 무한 수집과 이러한 수집을 반복하는 기능을 지원합니다.여기에는 특별한 구성이 필요하지 않습니다.
  15. a 딥 브레이크는 다음을 사용하여 달성할 수 있습니다.GO TO및 절차.
  16. a Common Lisp는 범용 수집 유형의 개념보다 앞서 있습니다.

구조화된 비로컬 제어 흐름

많은 프로그래밍 언어, 특히 보다 역동적인 프로그래밍 스타일을 선호하는 언어들은 로컬이 아닌 제어 흐름에 대한 구성을 제공합니다.이로 인해 실행 흐름은 특정 컨텍스트에서 튀어나와 사전 정의된 시점에서 재개됩니다.조건, 예외계속은 3가지 일반적인 비로컬 제어 구조입니다.제너레이터, coroutines, async 키워드 등 보다 이국적인 것도 존재합니다.

조건들

PL/I에는 약 22개의 표준 조건(예: ZERODIVIDE SUBSCRIPTRANGE ENDFILE)이 있으며, 는 ON 조건 액션에 의해 대행 수신될 수 있습니다.프로그래머는 자신의 명명된 조건을 정의하여 사용할 수도 있습니다.

비구조화 if와 마찬가지로 지정할 수 있는 스테이트먼트는 1개뿐이므로 대부분의 경우 제어 흐름을 재개해야 할 위치를 결정하기 위해 GOTO가 필요합니다.

안타깝게도 일부 구현에서는 공간과 시간 모두에서 상당한 오버헤드가 발생했기 때문에(특히 SUBSCRIPTRANGE), 많은 프로그래머들이 조건의 사용을 피하려고 했습니다.

일반적인 구문 예:

  조건. 에 가다 라벨. 

예외

현대 언어에는 예외 처리를 위한 특수 구조화된 구조가 있으며, 이 구조들은 다음과 같은 사용에 의존하지 않습니다.GOTO또는 (멀티 레벨) 파손 또는 반환.예를 들어 C++에서는 다음과 같이 쓸 수 있습니다.

해라 {     xxx1                                  // 여기 어딘가에     xxx2                                  // 사용: 'throw' 'some Value;     xxx3 } 또 만나 (일부 클래스& 일부 ID) {             // someClass의 캐치 값     액션 For Some Class  } 또 만나 (일부 타입& anotherId) {           // 일부 캐치 값유형     액션 For Some Type } 또 만나 (...) {                           // 아직 잡히지 않은 것을 잡다     action For Anything Else } 

개수와 종류에 관계없이catch위의 절을 사용할 수 있습니다.없는 경우catch특정과 일치하다throw제어는 일치할 때까지 서브루틴 콜 또는 네스트된 블록을 통해 역류합니다.catch또는 메인 프로그램의 끝에 도달할 때까지 프로그램이 적절한 오류 메시지와 함께 강제로 중지됩니다.

C++의 영향으로catch는 Java 또는 C# 등 현재 널리 사용되는 다른 언어로 패턴 매칭 예외 핸들러를 선언하기 위해 예약된 키워드입니다.아다와 같은 다른 언어들은 키워드를 사용한다.exception예외 핸들러를 도입하여 다른 키워드를 사용할 수도 있습니다(when패턴 매칭을 위해 Ada)를 사용합니다.AppleScript와 같은 일부 언어에서는 예외 핸들러 구문에 플레이스 홀더를 통합하여 예외가 발생할 때 여러 정보를 자동으로 추출합니다.이 접근방식은 다음과 같이 예시하고 있습니다.on errorAppleScript에서 구성:

해라     세트 마이넘버 로. 마이넘버 / 0  에러 e  번호 n  부터 f  로. t  부분적인 결과 pr     한다면 ( e = "0으로 나눌 수 없다" ) 그리고나서 디스플레이 대화 상자 "그러면 안 돼" 끝. 해라 

David Watt의 2004년 교과서에서는 예외 처리도 시퀀서의 프레임워크로 분석합니다(루프로부터의 조기 종료에 관한 이 기사에서 소개).와트는 일반적으로 산술 오버플로우 또는 파일을 찾을 수 없는 것과 같은 입출력 장애로 나타나는 비정상적인 상황은 "일부 낮은 수준의 프로그램 유닛에서 감지되지만 핸들러가 높은 수준의 프로그램 유닛에서 더 자연스럽게 위치하는" 오류의 일종이라고 지적합니다.예를 들어, 프로그램에는 파일을 읽기 위한 호출이 여러 개 포함되어 있을 수 있지만 파일을 찾을 수 없을 때 실행하는 액션은 프로그램에 대한 해당 파일의 의미(목적)에 따라 다르므로 이 비정상적인 상황에 대한 처리 루틴을 낮은 수준의 시스템 코드에서 찾을 수 없습니다.Watts는 또한 싱글 출구 구조화된 프로그래밍이나 심지어 (멀티 출구) 리턴 시퀀서로 인해 상태 플래그 테스트를 호출자에게 도입하면 "어플리케이션 코드가 상태 플래그 테스트에 의해 혼란스러워지는 경향이 있다"며 "프로그래머가 상태 플래그 테스트를 잊어버리거나 게을리 할 수 있다"고 지적했다.실제로 상태 플래그로 나타나는 비정상적인 상황은 기본적으로 무시됩니다."와트는 상태 플래그 테스트와 달리 예외는 반대되는 기본 동작을 가지며 프로그래머가 어떤 식으로든 예외를 명시적으로 처리하지 않는 한 프로그램이 종료되도록 합니다(아마도 이를 무시하기 위한 명시적 코드를 추가함).이러한 주장을 바탕으로 Watt는 점프 시퀀서 또는 이스케이프 시퀀서는 위에서 설명한 [21]시멘틱스를 가진 전용 예외 시퀀서만큼 적합하지 않다고 결론지었다.

오브젝트 Pascal, D, Java, C# 및 Python에서finally절을 추가할 수 있습니다.try건설하다.제어가 어떻게 떠나든try내부 코드finally절의 실행이 보증됩니다.이 기능은 처리가 완료되면 고가의 자원(열린 파일이나 데이터베이스 연결 등)을 포기해야 하는 코드를 작성할 때 유용합니다.

파일 스트림 스템 = 무효;                    // C#의 예 해라 {     스템 = 신규 파일 스트림("logfile.txt", 파일 모드.만들다);     돌아가다 프로세스 스터프(스템);             // 예외가 발생할 수 있음 }  마침내. {     한다면 (스템 != 무효)         스템.가까운.(); } 

이 패턴은 매우 일반적이기 때문에 C#에는 다음과 같은 특별한 구문이 있습니다.

사용. (변화하다 스템 = 신규 파일 스트림("logfile.txt", 파일 모드.만들다)) {     돌아가다 프로세스 스터프(스템); // 예외가 발생할 수 있음 } 

퇴사 후using-block, 컴파일러가 보증하는 것은stm오브젝트가 해방되어 파일을 초기화 및 해제했을 때의 부작용으로부터 추상화하면서 변수를 파일스트림에 효과적으로 바인드합니다.파이썬의with진술과 루비의 블록 논거에 대한File.open비슷한 취지에 익숙해져 있습니다.

위에서 언급한 모든 언어는 표준 예외와 해당 예외가 발생하는 상황을 정의합니다.사용자는 자신의 예외를 던질 수 있습니다.실제로 C++는 다음과 같은 기본 유형을 포함하여 거의 모든 유형을 던지고 잡을 수 있습니다.int반면에 자바와 같은 다른 언어들은 관대하지 않다.

속행

비동기

C# 5.0에서는 비동기 I/O를 "직접 스타일"로 지원하기 위해 async 키워드가 도입되었습니다.

제너레이터

세미코루틴이라고도 알려진 발전기는 일반적으로 다음을 사용하여 일시적으로 소비자 방법에 대한 제어를 제공할 수 있습니다.yield키워드(수익률 설명).async 키워드와 마찬가지로 "다이렉트 스타일" 프로그래밍을 지원합니다.

코루틴

코루틴은 서로 제어할 수 있는 기능이며, 스레드 없이 공동 멀티태스킹의 한 형태입니다.

코루틴은 프로그래밍 언어가 연속 또는 생성기를 제공하는 경우 라이브러리로 구현될 수 있습니다. 따라서 코루틴과 생성기의 실제 차이는 기술적인 세부 사항입니다.

비 로컬 제어 흐름 상호 참조

프로그래밍 언어 조건들 예외 발전기/코루틴 비동기
아다 아니요. 네. ? ?
C 아니요. 아니요. 아니요. 아니요.
C++ 아니요. 네. 네, BOOST를 사용하여 ?
C# 아니요. 네. 네. 네.
코볼 네. 네. 아니요. 아니요.
일반적인 리스프 네. 아니요. ? ?
D 아니요. 네. 네. ?
에펠 아니요. 네. ? ?
얼랑 아니요. 네. 네. ?
F# 아니요. 네. 네. 네.
가세요 아니요. 네. 네. ?
하스켈 아니요. 네. 네. 아니요.
자바 아니요. 네. 아니요. 아니요.
자바스크립트 ? 네. 네. 네.
목표-C 아니요. 네. 아니요. ?
PHP 아니요. 네. 네. ?
PL/I 네. 아니요. 아니요. 아니요.
파이썬 아니요. 네. 네. 네, 그렇습니다[22].
리볼 네. 네. 아니요. ?
루비 아니요. 네. 네. 내선번호로[23]
아니요. 네. 실험적인 네, 그렇습니다[26].
스칼라 아니요. 네. 실험적인[27] 확장을 통해 실험적인 확장을 통해
TCL 흔적을 통해 네. 네. 이벤트 루프를 통해
Visual Basic.그물 네. 네. 아니요. ?
PowerShell 아니요. 네. 아니요. ?

제안된 제어 구조

1973년의 스푸핑 데이타메이션[28] 기사에서, R. 로렌스 클락은 GOTO 스테이트먼트가 COMEFROM 스테이트먼트로 대체될 수 있다고 제안하고 몇 가지 재미있는 예를 제시했습니다.COME FROM은 INTERCAL이라는 난해한 프로그래밍 언어로 구현되었습니다.

Donald Knuth의 1974년 기사 "Structured Programming with go to Statements"[29]는 위에 나열된 제어 구조에서 다루지 않은 두 가지 상황을 식별하고 이러한 상황을 처리할 수 있는 제어 구조의 예를 제시하였다.그 효용성에도 불구하고, 이러한 구조물은 아직 주류 프로그래밍 언어로 진입하지 못했습니다.

테스트를 중간에 두고 루프합니다.

다음은 1972년 [30]달(Dahl)에 의해 제안되었다.

루프 루프 xxx1 읽기(char), 테스트 중, End Of File이 아닌 경우, xxx2 쓰기(char), 반복, 반복;

xxx1을 생략하면 테스트가 선두에 있는 루프(기존의 while 루프)가 표시됩니다.xxx2를 생략하면 테스트를 맨 아래에 두고 여러 언어의 do while 루프와 같은 루프가 발생합니다.while을 생략하면 무한 루프가 발생합니다.여기서의 시공은 중간에 체크가 있는 상태에서 실행 루프라고 생각할 수 있습니다.따라서 이 단일 구조는 대부분의 프로그래밍 언어에서 여러 구성을 대체할 수 있습니다.

이 구조가 없는 언어에서는 일반적으로 동등한 무한 루프와 브레이크 관용구를 사용하여 에뮬레이트합니다.

반면 (true) {xx1(테스트가 아닌) break xx2}

가능한 변형으로는 테스트 중에 여러 개를 허용하는 방법이 있습니다.루프 내에서는 exit을 사용하면 (다음 항을 참조) 이 경우에 대응할 수 있습니다.

Ada에서는 (다음 절의 exitwhen 문과 혼동하지 말 것) 중간에 exit when 구가 있는 표준 무한 루프(loop - end loop)를 사용하여 위의 루프 구성(loop-while-repeat)을 나타낼 수 있다.

와 함께 Ada.텍스트_입출력; 와 함께 Ada.Integer_텍스트_IO;  절차. 인쇄_제곱       X : 정수; 시작한다.     읽기_데이터 : 고리         아다.정수_텍스트_IO.얻다(X);     퇴장 읽기_데이터 언제 X = 0;         아다.본문 입출력.놓다 (X * X);         아다.본문 입출력.신규_라인;     끝. 고리 읽기_데이터; 끝. 인쇄_제곱; 

루프 이름 지정(이 예에서는 Read_Data 등)은 옵션이지만 여러 중첩된 루프의 외부 루프를 남길 수 있습니다.

네스트된 루프에서 여러 개의 조기 종료/종료

이것은 [31]Zahn에 의해 1974년에 제안되었다.수정된 버전이 여기에 나와 있습니다.

EventA, EventB 또는 EventC가 종료되고 xxx가 EventA: actionA EventB: actionB EventC: actionC endex;

exit 를 사용하여 xxx 에서 발생할 수 있는 이벤트를 지정합니다.이러한 이벤트는 이벤트 이름을 스테이트먼트로 사용하여 표시됩니다.어떤 이벤트가 발생하면 관련 액션이 수행되고 종료 직후 제어가 통과됩니다.이 구성은 어떤 상황이 적용되는지 결정하는 것과 그 상황에 대해 취해야 할 조치를 명확하게 구분합니다.

exit예외 처리와 개념적으로 유사하며 예외 또는 유사한 구조가 여러 언어에서 이 목적으로 사용됩니다.

다음 간단한 예에서는 2차원 테이블에서 특정 항목을 검색하는 방법을 보여 줍니다.

찾거나 누락된 경우 종료합니다. I : = 1 ~ N의 경우 J : = 1 ~ M경우 표 [I,J] = 표적을 찾은 후 누락됨; 종료: 인쇄("항목은 표 안에 있음"); 누락: 인쇄("항목은 표 안에 없음"); 종료;

보안.

소프트웨어를 공격하는 한 가지 방법은 프로그램 실행 흐름을 수정하는 것입니다.스택 [32][33][34]카나리, 버퍼 오버플로우 보호, 섀도 스택, vtable 포인터 검증 등 다양제어 흐름 무결성 기술을 사용하여 이러한 공격을 방지합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Böhm, Jacopini."플로우 다이어그램, 튜링 기계 및 두 가지 구성 규칙만 있는 언어" Comm. ACM, 9(5):366-371, 1966년 5월
  2. ^ a b Roberts, E. [1995] "루프 종료구조화된 프로그래밍: 토론 재개", ACM SIGCSE Bulletin, (27) 1: 268–272.
  3. ^ David Anthony Watt; William Findlay (2004). Programming language design concepts. John Wiley & Sons. p. 228. ISBN 978-0-470-85320-7.
  4. ^ Ada 프로그래밍: 컨트롤: 엔드리스 루프
  5. ^ "What is a loop and how we can use them?". Retrieved 2020-05-25.
  6. ^ "redo - perldoc.perl.org". perldoc.perl.org. Retrieved 2020-09-25.
  7. ^ "control_expressions - Documentation for Ruby 2.4.0". docs.ruby-lang.org. Retrieved 2020-09-25.
  8. ^ "control_expressions - Documentation for Ruby 2.3.0". docs.ruby-lang.org. Retrieved 2020-09-25.
  9. ^ Advanced Bash Scripting Guide: 11.3. 루프 제어
  10. ^ PHP 매뉴얼: "break"
  11. ^ perldoc: 마지막
  12. ^ comp.lang.c FAQ 목록 · "질문 20.20b"
  13. ^ [Python-3000] PEP 3136, Guido van Rossum 발표
  14. ^ a b Kozen, Dexter (2008). "The Böhm–Jacopini Theorem Is False, Propositionally". Mathematics of Program Construction (PDF). Lecture Notes in Computer Science. Vol. 5133. pp. 177–192. CiteSeerX 10.1.1.218.9241. doi:10.1007/978-3-540-70594-9_11. ISBN 978-3-540-70593-2.
  15. ^ 코사라주, S.라오. "구조화된 프로그램 분석", "프로"제5회 ACM 시럽Theory of Computing, 1973년 5월, 240-252년, J. Computer and System Sciences, 9, 3(1974년 12월).에 의해 인용된.
  16. ^ David Anthony Watt; William Findlay (2004). Programming language design concepts. John Wiley & Sons. pp. 215–221. ISBN 978-0-470-85320-7.
  17. ^ Meyer, Bertrand (1991). Eiffel: The Language. Prentice Hall. pp. 129–131.
  18. ^ "Common Lisp LOOP macro".
  19. ^ 각각에 대해서.Sgi.com 를 참조해 주세요.2010년 11월 9일에 취득.
  20. ^ 제1장 부스트.포어치.Boost-sandbox.sourceforge.net (2009-12-19)2010년 11월 9일에 취득.
  21. ^ David Anthony Watt; William Findlay (2004). Programming language design concepts. John Wiley & Sons. pp. 221–222. ISBN 978-0-470-85320-7.
  22. ^ "Asyncio — Asynchronous I/O — Python 3.10.2 documentation".
  23. ^ "Socketry/Async". GitHub. 25 February 2022.
  24. ^ "Generators - the Rust Unstable Book".
  25. ^ "Corona - Rust".
  26. ^ "Getting Started - Asynchronous Programming in Rust".
  27. ^ http://storm-enroute.com/coroutines/
  28. ^ 우리가 어디서 왔는지 모르면 GOTO가 어디에 있는지 모른다. 이 언어 혁신은 모든 기대에 부응합니다.R. Lawrence Clark*에 의해 Wayback Machine에서 아카이브된 2018-07-16, 1973년 12월 Datamation에서
  29. ^ Knuth, Donald E. "Structured Programming with Go-to-Statements" ACM Computing Survey 6(4):261-301, 1974년 12월
  30. ^ Dahl & Dijkstra & Hoare, "Structured Programming" 학술 프레스, 1972.
  31. ^ Zahn, C. T. "자연적인 하향식 구조 프로그래밍을 위한 제어 성명"은 1974년 파리 프로그래밍 언어 심포지엄에서 발표되었습니다.
  32. ^ Payer, Mathias; Kuznetsov, Volodymyr. "On differences between the CFI, CPS, and CPI properties". nebelwelt.net. Retrieved 2016-06-01.
  33. ^ "Adobe Flash Bug Discovery Leads To New Attack Mitigation Method". Dark Reading. 10 November 2015. Retrieved 2016-06-01.
  34. ^ Endgame. "Endgame to Present at Black Hat USA 2016". www.prnewswire.com. Retrieved 2016-06-01.

추가 정보

  • Hoare, C.A.R. "파티션:알고리즘 63", "Quicksort: Algorithm 64", "Find: Algorithm 65." 명령어.ACM 4, 321-322, 1961.

외부 링크