스켈레톤 (컴퓨터 프로그래밍)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
스켈레톤 코드는 소프트웨어 개발 과정에서 복잡한 코드를 효율적으로 작성하기 위해 사용되는 프로그래밍 기법이다. 주로 병렬 컴퓨팅 환경에서 활용되며, 함수의 뼈대만 제공하여 개발자가 컴파일 오류를 최소화하면서 코드를 개발하도록 돕는다. 스켈레톤 코드는 의사 코드와 유사하게 프로그램의 구조를 계획하는 데 사용되며, 객체 지향 프로그래밍에서 클래스와 인터페이스의 기본 구조를 정의하는 데 중요한 역할을 한다. 알고리즘적 스켈레톤 프레임워크는 데이터 병렬, 태스크 병렬, 해결 스켈레톤 등 다양한 유형으로 분류되어 병렬 프로그래밍의 효율성을 높이는 데 기여한다.
더 읽어볼만한 페이지
- 프로그래밍 언어 주제 - 프로그래밍 패러다임
프로그래밍 패러다임은 프로그래머에게 프로그램 작성 방식을 제시하는 관점 또는 스타일이며, 구조적 프로그래밍을 시작으로 절차적, 객체 지향, 선언형 등으로 발전해 명령형, 선언형, 멀티 패러다임 프로그래밍 언어로 분류된다. - 프로그래밍 언어 주제 - 프로그램 최적화
프로그램 최적화는 컴퓨터 프로그램의 효율성을 높이는 과정으로, 더 효율적인 구현 방식을 선택하거나 불필요한 기능을 제거하여 문제 해결에 집중하며, 다양한 수준에서 플랫폼 의존적이거나 독립적인 기술을 활용하여 수행되지만, 특정한 품질 지표를 개선하기 위해 다른 측면을 희생하는 트레이드오프가 발생할 수 있다. - 컴퓨터 프로그래밍 - 순서도
순서도는 컴퓨터 알고리즘이나 프로세스를 시각적으로 표현하는 도구로, 흐름 공정 차트에서 기원하여 컴퓨터 프로그래밍 분야에서 알고리즘을 설명하는 데 사용되며, 다양한 종류와 소프트웨어 도구가 존재한다. - 컴퓨터 프로그래밍 - 의사코드
의사코드는 컴퓨터 과학 및 수치 계산 분야에서 알고리즘을 설명하기 위해 사용되는 비표준적인 언어로, 자연어와 프로그래밍 언어의 요소를 혼합하여 알고리즘의 논리적 흐름을 이해하기 쉽게 하고 프로그래머가 실제 코드로 구현하기 전에 알고리즘을 설계하고 검토하는 데 유용하다.
| 스켈레톤 (컴퓨터 프로그래밍) | |
|---|---|
| 스켈레톤 (컴퓨터 프로그래밍) | |
| 프로그래밍 | |
| 종류 | 디자인 패턴 |
| 스켈레톤 | |
| 분야 | 소프트웨어 디자인 분산 객체 통신 |
| 목적 | 알고리즘 구조 정의 추상 메서드 구현 강제 메서드 호출 위임 |
| 구현 방법 | 추상 클래스 또는 인터페이스 사용 메서드 스텁 또는 더미 코드 작성 |
| 활용 예시 | |
| 디자인 패턴 | 템플릿 메서드 패턴 팩토리 메서드 패턴 |
| 분산 객체 통신 | |
| 역할 | 클라이언트 요청 수신 및 객체 메서드 호출 마샬링/언마샬링 |
| 장점 | |
| 디자인 패턴 | 코드 재사용성 증가 유연성 향상 |
| 분산 객체 통신 | 네트워크 통신 단순화 플랫폼 독립성 제공 |
2. 역사적 배경
스켈레톤 코드는 소프트웨어[2] 개발 초기부터 존재해 왔으며, 복잡한 시스템을 구축하는 과정에서 자연스럽게 발생한 개념이다. 현대 소프트웨어는 여러 가지 이유로 복잡해지는 경우가 많다. 이는 단일 프로그래머만으로는 개발할 수 없거나, 다른 모듈 또는 부분을 별도로 가져와야 할 수 있음을 의미한다. 프로그램 자체도 복잡해질 수 있으며, 일부 프로그램은 여러 메서드가 동시에 단일 변수에 접근하거나 디스플레이용 픽셀을 생성하기도 한다.
스켈레톤 코드는 프로그래머가 컴파일 시 오류를 최소화하면서 코드를 개발하도록 돕기 위해 사용된다. 주로 병렬 컴퓨팅에서 발견되지만, 프로그래밍 언어의 문서와 같이 다른 상황에도 적용된다. 이는 잠재적으로 혼란스러운 메서드의 핵심 기능을 단순화하는 데 도움이 된다. 또한 더 큰 프로그램 내의 작은 함수가 임시로 전체 기능을 사용하지 않고 작동하도록 하는 데에도 사용할 수 있다.
이 프로그래밍 방식은 완전한 함수를 작성하는 것보다 더 쉬운데, 스켈레톤 함수는 주요 기능을 포함할 필요가 없으며 개발 중에 사용하도록 하드코딩할 수 있기 때문이다.
2. 1. 병렬 프로그래밍의 등장
병렬 프로그래밍은 효율성을 높이기 위해 여러 기능을 동시에 실행하는 방식으로 가장 일반적으로 사용된다. 이러한 프로그램은 복잡성과 관련 하드웨어와의 상호 연결성 때문에 개발하기 가장 어려운 유형에 속한다. 많은 개발자들이 이 핵심 기능을 갖춘 프로그램을 작성하려 시도했지만,[10] 그 결과는 다양했다.알고리즘적 스켈레톤 프레임워크는 병렬 프로그래밍에서 나중에 개발할 방법을 추상적으로 설명하기 위해 사용된다. 이 프레임워크는 단일 유형으로 제한되지 않으며, 각 유형은 개발자의 프로그램 효율성을 높이기 위한 서로 다른 목적을 가지고 있다. 이는 데이터 병렬, 태스크 병렬 및 해상도의 세 가지 주요 유형으로 분류할 수 있다.[10]
2. 2. 현대적 사용
현대 소프트웨어[2]는 여러 가지 이유로 복잡해지는 경우가 많아, 단일 프로그래머가 개발하기 어렵거나 다른 모듈을 별도로 가져와야 할 수 있다. 스켈레톤 코드는 프로그래머가 컴파일 시 오류를 최소화하면서 코드를 개발하도록 돕는다.스켈레톤 코드는 주로 병렬 컴퓨팅에서 발견되지만, 프로그래밍 언어의 문서와 같이 다른 상황에도 적용된다. 이는 잠재적으로 혼란스러운 메서드의 핵심 기능을 단순화하고, 더 큰 프로그램 내의 작은 함수가 임시로 전체 기능을 사용하지 않고 작동하도록 하는 데에도 사용할 수 있다.
스켈레톤 프로그래밍은 다양한 프로그래밍 응용 분야에서 구현될 수 있다. 대부분의 프로그래밍 언어는 내장 함수와 메서드의 정의를 돕기 위해 스켈레톤 코드를 사용하며, 이는 새로운 프로그래머가 작성된 메서드의 구문과 의도된 구현을 이해하는 간단한 수단을 제공한다.
자바는 객체 지향 언어로, 자바 패키지의 각 객체 부분에 대한 완전히 분리된 메서드를 가진 구조화된 문서 페이지에 크게 중점을 둔다.[4] 각 메서드는 메서드의 이름과 함께 통합 개발 환경에서 사용될 구문이 블록 상단에 명확하게 표시되는 동일한 형식으로 정의된다.
파이썬은 내장 메서드를 문서화하는 데 유사한 접근 방식을 가지고 있지만, 범위 및 데이터 유형에 대한 고정의 부족을 모방한다.[5] 이 문서는 각 메서드의 구문과 함께 간략한 설명과 해당 메서드 또는 함수의 전형적인 사용 예제를 포함한다.
제3자 개발자가 작성한 클래스는 주로 라이브러리의 일부로, 스켈레톤 코드 형태로 프로그래밍을 선보이기도 한다. 이는 라이브러리를 처음 접하는 사람들에게 함수와 메서드의 작동 방식을 알려주는 데 도움이 된다. P5.js는 문서 페이지에서 이 형식을 사용하여 특정 포함 함수의 사용 목적을 설명한다.[6]
자연어 인터페이스(NLI)는 프로그래머가 입출력을 시도하는 상황에서 가장 일반적으로 발견되며, 일반적으로 프로그래밍 언어 특정 전문 용어를 사용하지 않고 구어체로 표현하여 프로그램을 만들거나 메서드를 만들 때 사용된다. 이것의 구현은 백그라운드에서 실행되는 함수를 암시하기 위해 작은 스켈레톤 코드 집합을 사용한다.[7]
3. 주요 개념 및 특징
현대 소프트웨어[2]는 여러 가지 이유로 복잡해지는 경우가 많다. 단일 프로그래머만으로는 개발이 어렵거나, 다른 모듈을 가져와야 할 수 있다. 프로그램 자체가 복잡해져 여러 메서드가 단일 변수에 접근하거나 디스플레이용 픽셀을 생성하기도 한다. 스켈레톤 코드는 컴파일 시 오류를 최소화하면서 코드를 개발하도록 돕는다.
스켈레톤 코드는 병렬 컴퓨팅뿐만 아니라 프로그래밍 언어 문서 등에도 쓰인다. 이는 복잡한 메서드의 핵심 기능을 단순화하고, 큰 프로그램 내 작은 함수가 임시로 전체 기능 없이 작동하도록 한다.
스켈레톤 함수는 주요 기능을 포함할 필요 없이 개발 중 사용하도록 하드코딩할 수 있어, 완전한 함수를 작성하는 것보다 쉽다. 보통 메서드 도입을 위한 구문적으로 올바른 코드와 프로그램 작동을 나타내는 주석이 포함되지만, 항상 필수적인 것은 아니다.
3. 1. 의사 코드와의 관계
의사 코드는 주로 새로운 소프트웨어의 구조를 계획할 때 사용된다. 이는 더 큰 시스템 내의 특정 기능을 평이한 영어로 나타낸 것이며, 전체 프로그램의 표현이 될 수도 있다. 의사 코드는 스켈레톤 프로그래밍과 유사하지만, 주로 비공식적인 프로그래밍 방식이라는 점에서 차이가 있다.[3] 더미 코드 역시 이와 매우 유사하며, 단순히 자리 표시자로 사용되거나 클래스 또는 인터페이스 내의 메서드가 의도하는 바를 나타내기 위해 코드를 사용한다.프로그래머는 의사 코드에 크게 의존하며, 이는 그들의 심리에 측정 가능한 영향을 미칠 정도이다.[3] 일반적인 프로그래머는 의사 코드를 작성하거나, 스켈레톤 코드를 작성하거나, 다이어그램을 그리는 방식으로 코드를 단순화하는 것에 익숙하며, 이는 최종 구현을 얼마나 잘 작성할 수 있는지에 영향을 준다. 이러한 현상은 다양한 프로그래밍 패러다임과 다양한 언어로 작업하는 프로그래머들이 참여한 여러 애플리케이션에서 발견되었다.
이러한 프로그램 설계 방법은 종종 펜과 종이로 수행되므로, 실제로 구현될 내용과 더욱 거리가 멀다. 스켈레톤 프로그래밍은 이를 모방하지만, 일반적으로 통합 개발 환경 또는 텍스트 편집기에서 작성된다는 점에서 다르다. 이는 초기 설계 단계 이후 프로그램의 추가 개발을 돕는다. 스켈레톤 프로그램은 실행될 경우 단순한 기능이 작동하도록 한다.
3. 2. 클래스 및 인터페이스 정의
객체 지향 프로그래밍에서 스켈레톤 코드는 다형성과 추상화를 지원하기 위해 클래스와 인터페이스의 기본 구조를 정의하는 데 사용된다.[9]다형성은 메서드를 재정의하거나 오버로드할 수 있게 해주며(자식 클래스에서 동일한 이름을 가진 메서드는 부모 클래스에 작성된 메서드보다 우선순위를 갖는다), 메서드의 정의는 언어의 구문에 의해 정의된 스켈레톤 프레임워크를 기반으로 한다.[9]
클래스 구현과 유사하게, 스켈레톤 코드는 인터페이스의 일부인 메서드를 정의하는 데 사용될 수 있다. 인터페이스는 클래스 내에 있어야 하는 메서드를 정의하여, 다른 사람이 메서드를 사용하거나 개인적인 필요에 따라 클래스를 구현할 수 있게 해준다.
추상 클래스는 클래스 구현과 거의 동일하지만, 언어에 따라 적어도 하나의 메서드가 추상으로 정의된다. 추상 클래스는 인터페이스와 매우 유사한 정의 스타일을 갖지만, 자식 클래스에서 구현해야 한다는 사실을 식별하기 위해 일반적으로 'abstract' 키워드가 사용된다.
3. 3. 알고리즘적 스켈레톤
병렬 프로그래밍에서 알고리즘적 스켈레톤은 복잡한 병렬 알고리즘을 추상화하여 개발 효율성을 높이는 역할을 한다. 이러한 스켈레톤은 데이터 병렬, 태스크 병렬 및 해결(Resolution)의 세 가지 주요 유형으로 분류할 수 있다.[10]데이터 병렬 알고리즘에는 '맵', '포크', '리듀스', '스캔'이 있다.
- '맵'은 대규모 데이터 집합에 대해 단일 연산을 동시에 적용한 다음, 최종적으로 데이터를 다시 구조화한다.
- '포크'는 특정 데이터 유형에 대해 다른 연산을 사용하는 다중 데이터 병렬 처리를 의미한다.[10]
- '리듀스' 또는 '스캔'은 데이터 집합에 접두사를 적용한 다음, 해당 데이터에 연산을 적용하며, 런타임 중에 일련의 부분 결과를 가진다.
태스크 병렬 알고리즘에는 '순차', '팜', '파이프', 'if', 'for', 'while' 등이 있다.
- '순차'는 중첩된 스켈레톤 알고리즘 세트를 닫고 종료한다.
- '팜'은 작업 그룹, 워커 또는 다른 함수의 마스터 또는 슬레이브로 알려져 있으며, 여러 스레드에서 작업을 복제하고 동시에 실행하여 주어진 작업을 완료한다.
- '파이프'는 각 메서드 또는 함수가 순차적으로 실행되는 형태로, 입력 데이터 집합에 대해 다양한 작업을 동시에 계산하여 성능과 속도를 향상시킨다.
- 'if'는 조건에 따라 코드 집합을 두 개의 주요 섹션으로 분할한다.
- 'for'는 프로그래머가 지정한 횟수만큼 작업을 수행한다.
- 'while'은 조건문이 충족되기 전까지 작업을 여러 번 계산한다.
해결(Resolution) 알고리즘은 지정된 문제를 해결하기 위해 여러 방법을 조합하여 사용하며, '분할 정복' 또는 '분기 한정'의 두 가지 주요 유형이 있다.[10]
- '분할 정복'은 맵 스켈레톤과 while 스켈레톤을 결합하여 문제를 해결한다.
- '분기 한정'은 작업을 분기로 나누고, 각 분기에는 특정 목적, 즉 '한계'가 있으며, 조건문이 분기를 중단시킨다.
4. 병렬 프로그래밍에서의 활용
병렬 프로그래밍은 여러 기능을 동시에 실행하여 효율성을 높이는 방식으로, 알고리즘적 스켈레톤 코드가 가장 활발하게 활용되는 분야 중 하나이다. 이러한 프로그램은 복잡성과 하드웨어와의 상호 연결성 때문에 개발하기 어렵다.[10]
알고리즘적 스켈레톤 프레임워크는 병렬 프로그래밍에서 나중에 개발할 방법을 추상적으로 설명하기 위해 사용된다. 이 프레임워크는 데이터 병렬, 태스크 병렬, 해상도의 세 가지 주요 유형으로 분류할 수 있다.[10]
4. 1. 데이터 병렬 처리 (Data-parallel)
스켈레톤 알고리즘은 대규모 데이터 기반 소프트웨어에서 작동하는 프로그램을 개발하는 데 사용되며, 일반적으로 나중에 사용하기 위해 데이터 간의 연결을 식별한다. 데이터 병렬 알고리즘에는 '맵', '포크', '리듀스', '스캔'이 포함된다.[10]- '맵'은 가장 일반적으로 사용되는 데이터 병렬 알고리즘이며, 일반적으로 대규모 데이터 집합에 대해 단일 연산을 수행하는 것을 포함한다. 효율성을 높이기 위해 여러 데이터 집합에 대해 이 연산을 동시에 적용한 다음, 최종적으로 데이터를 다시 구조화한다.
- '포크'는 '맵'과 유사하지만 특정 데이터 유형에 대해 다른 연산을 사용한다. 이를 다중 데이터 병렬 처리라고 한다.[10]
- '리듀스' 또는 '스캔'은 데이터 집합에 접두사를 적용한 다음, 해당 데이터에 연산을 적용하는 데 사용된다. '맵'과는 달리, 이들은 메서드 자체의 런타임 중에 일련의 부분 결과를 갖는다.
4. 2. 태스크 병렬 처리 (Task-parallel)
이러한 연산은 이름에서 알 수 있듯이 작업을 처리한다. 이 범주에 속하는 각 알고리즘 유형은 작업 간의 동작 변화로 인해 다르다. 작업 병렬 알고리즘에는 '순차', '팜', '파이프', 'if', 'for', 'while' 등이 있다.- '순차'는 중첩된 스켈레톤 알고리즘 세트를 닫고 종료한다. 스켈레톤의 일부인 메서드와 프로그램은 닫기 전에 프로그램의 종료 측면으로 포함된다.
- '팜'은 작업 그룹, 워커 또는 다른 함수의 마스터 또는 슬레이브로 알려져 있다. 여러 스레드에서 작업을 복제하고 이를 동시에 실행하여 주어진 작업을 완료한다. 이렇게 하면 특정 스레드의 부하가 분산되어 스레드 간에 마스터/슬레이브 관계가 효과적으로 생성된다.
- '파이프'는 각 메서드 또는 함수가 순차적으로 실행되는 보다 전통적인 형태의 알고리즘이다. 프로그래머가 코드를 작성한 순서를 따른다. 이는 일반적으로 입력인 데이터 집합에 대해 다양한 작업을 동시에 계산하여 성능과 속도를 향상시킴으로써 병렬화된다. 각 동시 계산은 단계라고 한다. 파이프 알고리즘은 중첩될 수 있으며, 하나가 다른 하나 안에 있어 각각의 책임 분담을 통해 속도와 단계 수를 증가시킨다.
- 'if'는 프로그램에 조건부 작업 분할을 제공하며, 여기서 스켈레톤 코드 집합은 두 개의 주요 섹션으로 분할된다. 조건문이 프로그램에 제공되므로 따를 특정 알고리즘을 제공한다.
- 'for'는 프로그래머가 지정한 횟수만큼 작업을 수행하여 보다 효율적인 코드 집합을 허용한다. 코드가 실행되는 횟수는 미리 설정된 값이며, 이는 런타임에 변경할 수 없음을 나타낸다. 주어진 횟수만큼 작업을 완료해야 한다.
- 'while'은 'for' 알고리즘의 작동과 매우 유사한 알고리즘으로, 여러 번 작업을 완료한다. 그러나 'while' 알고리즘에서는 조건문이 충족되기 전에 프로그램이 작업을 여러 번 계산한다. 즉, 'while' 알고리즘은 실행할 때마다 서로 다른 횟수만큼 작업을 수행할 수 있다.
4. 3. 해결 스켈레톤 (Resolution skeletons)
해결 알고리즘은 지정된 문제를 해결하기 위해 여러 방법을 조합하여 사용한다. 알고리즘에 주어진 문제는 "문제의 집합"이 될 수 있다.[10] 이러한 스켈레톤에는 '분할 정복'과 '분기 한정'의 두 가지 주요 유형이 있다.- '''분할 정복'''은 맵 스켈레톤을 기반으로 사용하며, 이를 while 스켈레톤과 결합하여 문제를 해결한다. 맵 알고리즘에서는 데이터에 대한 함수가 동시에 적용된다. '분할 정복'에서는 제공된 데이터 집합에 맵 스켈레톤을 사용하여 함수가 적용되지만, 이는 'while' 알고리즘을 사용하여 재귀적으로 적용될 수 있다. 'while'은 전체 문제가 해결될 때만 중단된다.
- '''분기 한정'''은 맵 알고리즘을 사용하는 알고리즘이지만, 작업을 동시에 실행하기 위해 'while' 알고리즘을 적용하는 대신 이 알고리즘은 작업을 분기로 나눈다. 각 분기에는 특정 목적, 즉 '한계'가 있으며, 조건문이 분기를 중단시킨다.
5. 한국의 스켈레톤 코드 활용 현황 및 전망
대한민국의 IT 산업은 빠르게 발전하고 있으며, 스켈레톤 코드는 효율적인 소프트웨어 개발을 위한 핵심 도구로 인식되고 있다.
참조
[1]
서적
Head First Design Patterns
http://shop.oreilly.[...]
O'REILLY
2012-08-28
[2]
웹사이트
Why is Software Development Difficult?
https://levelup.gitc[...]
2020-11-15
[3]
논문
What Does Pseudo-Code Do? A Psychological Analysis of the use of Pseudo-Code by Experienced Programmers
https://www.tandfonl[...]
1994-06-01
[4]
웹사이트
Object (Java Platform SE 8 )
https://docs.oracle.[...]
2020-10-02
[5]
웹사이트
Built-in Functions — Python v3.0.1 documentation
https://docs.python.[...]
2020-10-03
[6]
웹사이트
reference {{!}} p5.js
https://p5js.org/ref[...]
2020-11-15
[7]
웹사이트
A first peek at something new we're working on.
https://twitter.com/[...]
2020-11-19
[8]
논문
Generating Java Class Skeleton Using a Natural Language Interface
SciTePress - Science and Technology Publications
2004
[9]
간행물
Informatics Education - Supporting Computational Thinking
http://dx.doi.org/10[...]
Springer Berlin Heidelberg
2020-11-18
[10]
논문
A survey of algorithmic skeleton frameworks: high-level structured parallel programming enablers
http://dx.doi.org/10[...]
2010-11-01
[11]
저널
Head First Design Patterns
http://shop.oreilly.[...]
O'REILLY
2012-08-28
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com