잭슨 구조화 프로그래밍

Jackson structured programming
JSP 다이어그램의 예.

Jackson Structured Programming(JSP)은 영국의 소프트웨어 컨설턴트 Michael A에 의해 개발된 구조화된 프로그래밍 방법입니다. 잭슨과 그의 1975년 책 프로그램 [1]디자인의 원칙에서 묘사했다.JSP의 기술은 프로그램이 입력으로 읽고 출력으로 생성해야 하는 파일의 데이터 구조를 분석한 후 이러한 데이터 구조를 바탕으로 프로그램 설계를 생성함으로써 프로그램 제어 구조가 자연스럽고 직관적인 방식으로 이러한 데이터 구조를 처리하는 것이다.

JSP는 시퀀스, 반복 및 선택(또는 대안)의 세 가지 기본 구조를 사용하여 (데이터와 프로그램 모두의) 구조를 설명합니다.이러한 구조는 (실제로) 정규 표현의 시각적 표현으로 도식화됩니다.

서론

마이클 A. 잭슨은 원래 1970년대에 JSP를 개발했다.그는 1975년 그의 책 프로그램 디자인의 원리(Principle of Program Design)[1]에서 이 시스템을 문서화했다.2001년 컨퍼런스 [2]토크에서, 그는 이 방법의 배후에 있는 원래의 원동력에 대한 회고적 분석을 제공하고, 이후의 소프트웨어 엔지니어링 개발과 관련시켰습니다.잭슨의 목적은 COBOL 배치 파일 처리 프로그램을 수정하고 유지 관리하는 것이었지만, 이 방법은 시퀀스, 반복 및 선택("if/then/else") 구조화된 제어 구조를 가진 모든 프로그래밍 언어를 위한 프로그램을 설계하는 데 사용될 수 있다.

Jackson Structured Programming은 Warnier/Orr 구조화[3][4] 프로그래밍과 비슷했지만 JSP는 입력 및 출력 데이터 구조를 모두 고려했으며 Warnier/Orr 방식은 거의 출력 스트림의 구조에 초점을 맞췄다.

방법에 대한 동기

JSP가 개발될 당시 대부분의 프로그램은 테이프에 저장된 순차 파일을 처리하는 배치 코볼 프로그램이었다.입력 파일을 일련의 레코드로 읽어내는 일반적인 프로그램으로, 모든 프로그램이 동일한 구조를 가지고 있습니다.파일 내의 모든 레코드를 한 번에 하나씩 처리하는 메인 루프입니다.Jackson은 이 프로그램 구조가 거의 항상 잘못되었다고 주장하면서 프로그래머들에게 더 복잡한 데이터 구조를 찾도록 장려했습니다.Jackson은 프로그램 설계[1] 원칙 3장에서 JSP를 사용하여 설계된 프로그램과 기존의 단일 루프 구조를 사용하여 설계된 프로그램의 두 가지 버전을 제시합니다.다음은 COBOL에서 Java로 변환된 그의 예입니다.이 2개의 프로그램의 목적은 정렬된 파일 내의 반복 레코드(행) 그룹을 인식하고 각 레코드와 파일 내에서 발생한 횟수를 나열하는 출력 파일을 생성하는 것입니다.

다음은 기존의 싱글 루프 버전의 프로그램입니다.

스트링 ; 인트 세어보세요 = 0; 스트링 첫 번째 Line Ofirst Line Of Group = 무효;  // 단일 메인 루프를 시작합니다. 하는 동안에 (( = .회선 읽기()) != 무효) {     한다면 (첫 번째 Line Ofirst Line Of Group == 무효    !.동등.(첫 번째 Line Ofirst Line Of Group)) {         한다면 (첫 번째 Line Ofirst Line Of Group != 무효) {             시스템..나가..인쇄(첫 번째 Line Ofirst Line Of Group + " " + 세어보세요);         }         세어보세요 = 0;         첫 번째 Line Ofirst Line Of Group = ;     }     세어보세요++; } 한다면 (첫 번째 Line Ofirst Line Of Group != 무효) {     시스템..나가..인쇄(첫 번째 Line Ofirst Line Of Group + " " + 세어보세요); } 

다음은 같은 프로그램의 JSP 스타일 버전입니다.(기존 프로그램과는 달리) 2개의 루프가 있으며, 하나는 다른 하나는 다른 하나는 내부에 중첩되어 있습니다.외부 루프는 반복 레코드 그룹을 처리하는 반면 내부 루프는 그룹 내 개별 레코드를 처리합니다.

스트링 ; 인트 number Of Lines In Group;   = .회선 읽기(); // 외부 루프 시작: 프로세스 1 그룹 하는 동안에 ( != 무효) {       number Of Lines In Group = 0;     스트링 첫 번째 Line Ofirst Line Of Group = ;      // begin inner loop : 그룹 내 프로세스1 레코드     하는 동안에 ( != 무효 & & .동등.(첫 번째 Line Ofirst Line Of Group)) {         number Of Lines In Group++;          = .회선 읽기();     }     시스템..나가..인쇄(첫 번째 Line Ofirst Line Of Group + " " + number Of Lines In Group); } 

Jackson은 기존의 싱글 루프 버전이 입력 파일의 구조(반복되는 개별 레코드를 포함하는 반복 레코드 그룹)를 자연스러운 방식으로 처리하지 못했다고 비판합니다.부자연스러운 설계의 한 가지 징후는 제대로 작동하기 위해 파일의 처음과 마지막 레코드를 처리하기 위한 특수 코드를 포함하도록 강요받는 것입니다.

기본 방법

JSP는 프로그램 자체의 구조에서 프로그램의 입력과 출력의 기존 구조를 포착하기 위해 반정식 단계를 사용합니다.

그 목적은 평생 동안 쉽게 수정할 수 있는 프로그램을 만드는 것입니다.Jackson의 주요 통찰력은 요구사항 변경은 대개 기존 구조에 대한 사소한 수정이라는 것이었습니다.JSP를 사용하여 작성된 프로그램의 경우 입력, 출력 및 프로그램의 내부 구조가 모두 일치하므로 입력 및 출력에 대한 작은 변경은 프로그램에 대한 작은 변경으로 변환됩니다.

JSP는 다음 4가지 컴포넌트 유형으로 프로그램을 구축합니다.

  • 기본 조작
  • 시퀀스
  • 반복
  • 선택 사항

이 방법은 프로그램의 입력을 네 가지 기본 구성요소 유형으로 설명하는 것으로 시작합니다.그런 다음 동일한 방식으로 프로그램의 출력을 기술합니다.각 입력 및 출력은 별도의 데이터 구조 다이어그램(DSD)으로 모델링됩니다.JSP를 디지털 신호 처리(DSP)와 같은 계산 부하가 높은 애플리케이션에서 작동시키려면 입출력 데이터 구조보다 내부 데이터 구조에 초점을 맞춘 알고리즘 구조 다이어그램을 그려야 합니다.

입력 및 출력 구조는 프로그램 구조도(PSD)로 알려진 최종 프로그램 구조로 통합되거나 병합됩니다.이 단계는 입력과 출력을 결합하기 위해 소량의 고급 제어 구조를 추가하는 것을 포함할 수 있습니다.일부 프로그램은 출력을 수행하기 전에 모든 입력을 처리하는 반면, 다른 프로그램은 한 개의 레코드로 읽고 한 개의 레코드를 쓴 후 반복합니다.이러한 접근방식은 PSD에 반영되어야 합니다.

언어 중립인 PSD는 프로그래밍 언어로 구현됩니다.JSP는 제어 구조 수준의 프로그래밍에 맞춰져 있기 때문에 구현된 설계에서는 원시적인 조작, 시퀀스, 반복 및 선택만 사용합니다.JSP는 클래스의 메서드 내에서 제어 흐름을 쉽게 구조화할 수 있지만 클래스 및 객체 수준에서 프로그램을 구조화하는 데 사용되지 않습니다.

JSP는 각 기본 컴포넌트 유형에 대한 다이어그램 요소를 사용하여 입력, 출력 및 프로그램의 구조를 설명합니다.

간단한 조작이 박스로 그려집니다.

A box labeled 'A'
수술

일련의 조작은 라인으로 연결된 상자로 표시됩니다.다음 예에서 A는 연산 B, C 및 D로 이루어진 시퀀스입니다.

A box labeled 'A' connected to three boxes below it labeled 'B', 'C' and 'D'
순서

반복은 다시 결합된 상자로 표시됩니다.또, 반복 조작의 박스 우측 상단 구석에 별이 있습니다.다음 예에서 A는 동작 B의 호출이 0 이상인 반복입니다.

A box labeled 'A' connected to a box labeled 'B' below it with a star in the top right corner
반복

선택 항목은 시퀀스와 비슷하지만 각 옵션 작업의 오른쪽 상단 모서리에 원이 그려집니다.이 예에서 A는 조작 B, C 또는 D 중 하나만을 선택한 것입니다.

A box labeled 'A' connected to three boxes below it labeled 'B', 'C' and 'D' each with a circle in the top right hand corner
선곡

위의 그림에서는 요소 B, C 또는 D가 아닌 시퀀스 또는 반복 요소 A라는 점에 유의하십시오(위 그림에서는 모두 기본입니다).Jackson은 요소가 무엇인지 결정하기 위한 'Look-down rule'을 부여합니다. 즉, 요소 아래에 있는 요소를 보고 그것이 무엇인지 알아냅니다.

작업 예

예를 들어 JSP 프로그래머가 런렝스 인코더를 설계 및 코드화하는 방법을 나타냅니다.런렝스 인코더는 입력이 실행에서 발생하는 것으로 간주할 수 있는 바이트 스트림인 프로그램입니다.런은 같은 값의 1개 이상의 바이트 발생으로 구성됩니다.프로그램의 출력은 바이트 쌍의 스트림이며, 각 바이트 쌍은 실행에 대한 압축된 설명입니다.각 쌍에서 첫 번째 바이트는 실행 시 반복되는 바이트 값이고 두 번째 바이트는 실행 시 해당 값이 반복된 횟수를 나타내는 숫자입니다.예를 들어 입력 스트림(AAAAAAAA)에서 문자 "A"가 8번 발생하면 출력 스트림에서 바이트 쌍으로 "A8"이 생성됩니다.런렝스 인코더는 비트맵을 대략적으로 압축하기 위해 자주 사용됩니다.

JSP를 사용하는 경우 첫 번째 단계는 프로그램 입력 스트림의 데이터 구조를 설명하는 것입니다.프로그램에는 동일한 바이트 값의 0개 이상의 실행으로 구성된 입력 스트림이 하나만 있습니다.입력 스트림의 JSP 데이터 구조도를 다음에 나타냅니다.

JSP RLE input.png

두 번째 단계는 출력 데이터 구조를 설명하는 것입니다.이 경우 출력 데이터 구조는 0 이상의 바이트 쌍 반복으로 구성됩니다.

JSP RLE output1.png

다음 단계에서는 입력 및 출력 구조의 구성요소 간의 대응 관계를 설명합니다.

JSP RLE correspondence.png

다음 단계는 두 데이터 구조 간의 대응 관계를 사용하여 입력 데이터 구조를 처리하고 출력 데이터 구조를 생성할 수 있는 프로그램 구조를 만드는 것입니다.아래 구조 충돌에 대한 설명을 참조하십시오.)

JSP RLE program.png

프로그램 구조가 완료되면 프로그래머는 프로그램이 수행해야 할 연산 목록을 작성하고 프로그램 구조도는 적절한 구조 구성요소에서 해당 연산들을 떼어냄으로써 구체화된다.

  1. 한 바이트를 읽다
  2. 기억 바이트
  3. 0으로 되돌리다
  4. 증분 카운터
  5. 출력 기억 바이트
  6. 출력 카운터

또한 이 단계에서 반복(루프) 및 선택(if-then-else 또는 케이스 스테이트먼트)에 대한 조건이 나열되고 프로그램 구조 다이어그램에 추가됩니다.

  1. 바이트 수가 많을 때
  2. 더 많은 바이트가 있고 이 바이트는 실행의 첫 번째 바이트와 같으며 카운트는 여전히 바이트에 맞춥니다.

그림이 완성되면 사용하는 프로그래밍 언어로 번역할 수 있습니다.여기 C로의 번역이 있습니다.

#실패하다 <stdio.h> #실패하다 <stdlib.h>  인트 주된(인트 argc,  *argv[]) {     인트 c;     인트 first_byte;     인트 세어보세요;      c = 취득하다();   /* 첫 번째 바이트 가져오기 */     하는 동안에 (c != EOF) {         /* 실행의 첫 번째 바이트를 처리합니다 */         first_byte = c;         세어보세요 = 1;         c = 취득하다();   /* 다음 바이트 가져오기 */          /* 실행 중 후속 바이트 처리 */         하는 동안에 (c != EOF & & c == first_byte & & 세어보세요 < > 255) {             /* 같은 값의 1바이트를 처리합니다*/             세어보세요++;             c = 취득하다();   /* 다음 바이트 가져오기 */         }          풋차(first_byte);         풋차(세어보세요);     }     돌아가다 종료_SUCCESS; } 

어려운 설계 문제를 처리하는 기술

프로그램 설계 원칙에서 잭슨은 특정 종류의 설계 문제를 제기하는 상황을 인식하고 이를 처리하는 기술을 제공했습니다.

이러한 상황 중 하나는 프로그램이 하나의 입력 파일이 아닌 두 개의 입력 파일을 처리하는 경우입니다.1975년에는 트랜잭션 처리 프로그램을 설계하는 방법이 표준적인 문제 중 하나였다.이러한 프로그램에서는 업데이트 레코드의 시퀀셜 파일이 순차적인 마스터 파일에 대해 실행되어 업데이트된 마스터 파일이 출력으로 생성됩니다(예를 들어, 은행은 그날 입출금 기록을 바탕으로 고객의 계좌 잔액을 업데이트하는 배치 프로그램을 실행합니다).프로그램 설계의 원칙은 설계의 이면에 있는 논리에 대한 설명과 함께 이 문제에 대한 표준 해결책을 제시했습니다.

또 다른 종류의 문제는 잭슨이 "인식 어려움"이라고 부르는 것과 관련이 있으며, 오늘날에는 구문 분석 문제라고 부릅니다.기본 JSP 설계 기법은 POST 및 KIT 연산에 의해 보완되어 현재 백트랙킹 파서라고 불리는 설계를 가능하게 되었습니다.

JSP는 또한 경계 충돌, 순서 충돌 및 인터리빙 충돌이라고 불리는 세 가지 상황을 인식하고 이러한 상황에 대처하기 위한 기술을 제공했습니다.구조 충돌 상황에서는 입력 및 출력 데이터 구조가 너무 호환되지 않기 때문에 입력 파일에서 출력 파일을 생성할 수 없습니다.실제로 두 가지 프로그램을 작성해야 합니다.첫 번째 프로그램은 입력 스트림을 처리하여 더 작은 청크로 분해하여 중간 파일에 씁니다.두 번째 프로그램은 중간 파일을 읽고 원하는 출력을 생성합니다.

JSP 및 객체 지향 설계

JSP는 객체 지향 기술이 보급되기 훨씬 전에 개발되었습니다.이 방법 및 후속 메서드 JSD는 현재 "개체"라고 불리는 것을 다소 독립적인 메서드의 집합으로 취급하지 않습니다.대신 C A R Hoare의 작업에 따라 JSP와 JSD는 소프트웨어 객체를 코루틴으로 [5][6]기술합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b c 를 클릭합니다Jackson, MA (1975), Principles of Program Design, Academic.
  2. ^ Jackson, MA (2001), JSP in Perspective (PDF), sd&m Pioneers’ Conference, Bonn, June 2001, retrieved 2017-01-26{{citation}}: CS1 유지보수: 위치(링크)
  3. ^ Warnier, JD (1974), Logical Construction of Programs, NY: Van Nostrand Reinhold
  4. ^ Orr, KT (1980), "Structured programming in the 1980s", Proceedings of the ACM 1980 Annual Conference, New York, NY: ACM Press, pp. 323–26, doi:10.1145/800176.809987, ISBN 978-0897910286, S2CID 26834496
  5. ^ 를 클릭합니다Wieringa, R (Dec 1998), "A survey of structured and object-oriented software specification methods and techniques", Comput Surv, 30 (4): 459–527, CiteSeerX 10.1.1.107.5410, doi:10.1145/299917.299919, S2CID 14967319.
  6. ^ 를 클릭합니다Henderson-Sellers, Brian; Edwards, JM (Sep 1990), "The object-oriented systems life cycle", Communications of the ACM, 33 (9): 142–59, doi:10.1145/83880.84529, S2CID 14680399.

외부 링크