프로그래밍 언어의 평가 기준
프로그래밍 언어의 대표적인 평가 기준으로 다음의 9가지를 꼽을 수 있다.
평가 기준 | 의미 |
작성력 | 프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성 |
가독성 | 작성된 프로그램을 보고 쉽게 이해할 수 있도록 하는 특성 |
신뢰성 | 작성된 프로그램이 오류에 빠지는 가능성을 줄이는 특성 |
직교성 | 언어 기능이 서로 간섭하지 않고 자유롭게 조합될 수 있는 특성 |
일관성 | 유사한 기능을 같은 형태로 나타낼 수 있는 특성 |
확장성 | 사용자가 원하는 새로운 기능을 추가할 수 있는 특성 |
효율성 | 작성된 프로그램이 효율적으로 수행될 수 있도록 하는 특성 |
유연성 | 프로그래머가 표현하고 싶은 내용을 유연하게 수용하는 특성 |
이식성 | 프로그램을 다른 실행 환경으로 이전할 수 있는 특성 |
작성력
프로그램 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성
작성력은 수식이나 문장, 기능을 쉽게 표현함으로써 프로그래머의 의도를 자연스럽게 나타낼 수 있는 특성이다. 프로그래밍 언어가 제공하는 기본 기능 중 하나이기도 하다. 지원되는 구문 구조가 간결할수록 작성력이 좋다. 지원되는 구문 구조가 많은 경우 작성력의 저하 요인이 된다. 소수의 구문 구조를 조합하여 사용하는 것이 좋다.
예를 들어 '1부터 5까지의 정수 중 3이 있으면 문장을 출력하는 프로그램'을 작성하려 한다고 가정해보자. 다음은 각각 Python과 C로 작성된 프로그램이다.
if 3 in [1,2,3,4,5]: print("3이 있습니다") # Python
#include <stdio.h>
int main() // C
{
int numArr[5] = { 1, 2, 3, 4, 5 };
for(int i = 0; i < 5; i++) {
if (numArr[i] == 3) {
printf("3이 있습니다.\n");
}
}
return 0;
}
같은 문제를 해결하는 프로그램이지만 프로그램의 코드 길이부터가 다르다. 프로그래머가 제시된 프로그램을 작성하려 할 때 Python은 C와 비교하여 필요한 코드를 쉽게 표현할 수 있고 의도를 자연스럽게 나타낼 수 있다. 따라서 Python은 작성력이 뛰어난 언어라고 할 수 있다. 또한 작성력은 프로그래밍 언어의 요구사항 중 표현 풍부성과 유지 보수성을 지원한다. 즉 Python은 비교적 프로그래머의 아이디어를 쉽게 표현할 수 있고 작성된 프로그램을 쉽게 유지보수할 수 있는 언어이다.
가독성
작성된 프로그램을 쉽게 읽고 이해할 수 있도록 하는 특성
프로그램 코드가 간결할 수록(여기서는 다루지 않지만 '간결성'도 평가 기준 중 하나이다.) 가독성은 낮아진다. 이는 C의 증감 연산자를 통해 이해할 수 있다.
a의 값을 1 증가시킬때 C는 증감 연산자를 사용하여 a++;로 표현할 수 있다. 그에 반해 PASCAL은 a:=a+1;로, COBOL은 ADD a TO 1 GIVING a;로 표현된다.
a의 값에 1을 더하여 a에 저장한다. | |
C | a++; |
PASCAL | a:=a+1; |
COBOL | ADD a TO 1 GIVING a; |
C -> PASCAL -> COBOL 순으로 가독성이 좋고 역으로 COBOL -> PASCAL -> C 순으로 간결성이 좋다. COBOL은 영어와 문법이 유사하여 가독성이 좋은 언어이다.
신뢰성
작성된 프로그램이 오류에 빠지는 가능성을 줄이는 특성
신뢰성에 영향을 끼치는 요인들로는 타입 검사(Type Checking), 예외처리(Exception Handling), 별칭(Aliasing)이 있다.
타입 검사(Type Checking) |
- compile 혹은 실행 시 type error 검출 |
신뢰성 향상 |
예외처리(Exception Handling) |
프로그램 실행시 run-time error가 발생한 경우, 이를 인식하고 오류를 처리할 수 있는 필요한 조치를 취할 수 있는 기능 |
신뢰성 향상 |
별칭(Aliasing) |
메모리의 한 저장 장소를 여러 이름으로 접근할 수 있는 기능 |
신뢰성 하락 |
직교성
언어 기능이 서로 간섭하지 않고 자유롭게 조합될 수 있는 특성
언어의 구성 요소를 임의로 조합해서 프로그램을 작성할 수 있는 기능이다. 구성 요소들이 의미적으로 서로 독립적이어야 한다. 이 특성이 부족한 언어에서는 구성 요소의 사용 규칙에 예외적인 경우가 많다. 완벽에 가까운 직교성을 지원하는 언어는 가독성을 저하시킬 수 있다. 함수형 언어가 직교성이 우수하다.
덧셈 연산자를 예로 들어보자. C는 문자열에 덧셈 연산을 적용할 수 없지만 Python은 가능하다.(문자열 덧셈을 허용하는 C 컴파일러도 문자열 자체를 접합하는 것이 아니라 포인터 덧셈으로 간주하여 계산한다.)
print("hello" + "world")
출력 결과: helloworld
이런 측면에서 Python이 C보다 직교성이 우수하다고 볼 수 있다. 그러나 Python도 완전히 직교성을 지원하는 것은 아니다. 집합의 경우 덧셈 연산을 적용할 수 없다.
일관성
유사한 기능을 같은 형태로 나타낼 수 있는 특성
유사한 기능을 같은 방식으로 지원하는 특성을 뜻한다. 예를 들면 C++의 경우 클래스를 정의할 때와 함수를 정의할 때 모두 중괄호 쌍을 사용하는데, 클래스를 정의할 때는 다음과 같이 클래스 정의 끝에 반드시 세미콜론을 써야한다.
class 클래스 {
클래스 정의
}; //세미콜론O
int 함수() {
함수 정의
} //세미콜론X
이는 일관성이 결여된 사례라고 볼 수 있다.
효율성
작성된 프로그램이 효율적으로 수행될 수 있도록 하는 특성
설계된 언어가 번역기(컴파일러/인터프리터)로 빠르게 번역하여 실행코드를 생성할 수 있음을 뜻한다. 효율성과 신뢰성은 상반된다. 번역기가 검사를 적게 하면 효율적이지만 신뢰성은 떨어진다.
C 프로그램의 경우 assert라는 매크로를 통해 프로그램 수행 도중 특정 조건을 검사할 수 있다.
assert(x != NULL); //x가 NULL인지 검사
수행 중에 해당 지점에서 x가 NULL이면 프로그램을 중단하고 실패한 위치를 출력해준다. assert는 신뢰성을 높일 수 있는 도구지만 프로그램 실행 시 매번 검사를 해야하므로 효율성은 떨어뜨린다.(C 컴파일러에서 전처리기 옵션 NDEBUG를 사용해서 assert 검사를 끌 수 있도록 하고있다.)
유연성
프로그래머가 표현하고 싶은 내용을 유연하게 수용하는 특성
C에서 유연성의 대표적인 사례로 union을 들 수 있다. 다음은 C로 작성된 부동소수점 수를 무부호 정수로 바꾸어 해석하는 함수이다.
unsigned int function_example(float f) {
union {
float f;
unsigned int i;
} u;
u.f = f;
return u.i;
}
C에서 부동소수점 수를 정수로 형 변환하면 소수점 이하 버림이 발생하지만 위와 같이 union을 통해 변환하면 값 중심의 변화가 아니라 float 내부 표기 구조를 파악할 수 있다. 이는 프로그래머에게 큰 유연성을 제공하는 것이라고 볼 수 있다.
이식성
프로그램을 다른 실행 환경으로 이전할 수 있는 특성
이식성이 좋은 대표적인 언어는 JAVA이다. JAVA는 컴파일러를 사용하는 언어와 인터프리터 언어의 중간형태를 띄고 있다. 컴파일 결과로 중간 코드를 만들며 JVM이 인터프리터 방식으로 중간 코드를 수행한다. JVM 덕분에 한 번 작성한 프로그램은 여러 컴퓨터에서 아무 수정 없이 수행될 수 있다. 실행 환경에 종속적이지 않다.
프로그래밍 언어의 평가 기준 사이의 관계
<신뢰성 ↔ 효율성>, <신뢰성 ↔ 유연성>, <작성력 → 신뢰성>, <가독성 → 신뢰성>
- 신뢰성을 높이려면 더 많이 검사해야하고 이는 검사 비용에 따른 효율성 저하를 일으킨다.
- 프로그램 작성 시 제약이 적으면 안정성이 낮아진다.
- 프로그램을 쉽게 작성할 수 있으면 오류 가능성이 적어져 신뢰성이 향상한다.
- 읽고 이해하기 쉬운 프로그램은 오류 가능성이 적어져 신뢰성이 향상한다.
<작성력 ↔ 가독성>,
- 프로그램 코드가 간결할 수록 가독성은 낮아진다.
<직교성 → 작성력>, <직교성 ↔ 가독성>
- 간결한 구문 구조를 조합하여 사용할 수 있는 언어는 작성력이 좋다.
- 완벽에 가까운 직교성은 가독성의 저하 요인이지만 작성력에는 좋다.
'기타 정보 > 소프트웨어 공학' 카테고리의 다른 글
[자료구조] 배열 - 정리 및 연습문제 (0) | 2021.04.21 |
---|---|
[자료구조] 자료구조란 무엇인가? - 정리 및 연습문제 (0) | 2021.04.20 |
제어장치 - 제어장치의 구성과 명령어 수행 과정 (0) | 2021.04.20 |
처리장치 - 제어단어의 이해와 마이크로 연산의 제어단어 변환 (0) | 2021.04.20 |
프로그래밍 언어의 구문의 표현 - BNF, EBNF, 구분 도표 표현법 (0) | 2021.04.20 |
프로그래밍 언어의 요구사항과 설계 원칙 (0) | 2021.04.20 |
리팩토링이란 무엇인가? (0) | 2019.12.27 |
1. 소프트웨어 공학이란? - 소프트웨어 공학의 정의와 개발과정 (0) | 2019.12.27 |