프로그래밍 언어 설계 원칙
효율성
- 목적 코드의 효율성 : 번역기가 효율적인 실행 코드를 생성 할 수 있어야 함 일반적으로 정적 코드가 효율이 더 좋습니다.
- 예를 들어, 파스칼과 C 언어는 타입 처리를 컴파일 시점에 해결하여 실행 시 효율적입니다. 반면, 파이썬은 런타임 때 타입 체크를 하기 때문에 실행 속도가 느려집니다.
- 번역의 효율성
- 번역기가 효율적으로 코드를 생성 할 수 있어야 한다 코드 최적화를 통해 더 효율적인 실행 코드를 생성합니다.
- 구현 용이성 : 설계된 언어로 얼마나 빠르고 쉽게 프로그램을 작성 할 수 있는가 이는 언어의 구문, 표현력, 라이브러리 지원 등이 사용자의 편의를 높여줄수록 좋습니다.
일반성
일반성은 밀접한 관련 개념들을 하나의 일반적인 것으로 결합하는 성질을 말합니다.
예를 들어, 대입 연산자 = (:=)가 배열, 레코드 등 모든 데이터 타입에 적용되는 것이 일반성을 높여줍니다.
일반성이 높다면, 다양한 문제와 상황에 유연하게 대처 가능합니다.
또한, 예외적인 상황이 얼마나 있는가로 일반성을 확인합니다.
C언어는 메모리 관리를 수동으로 해야 하지만, 운영체제 이식성이 높고 개발에 필요한 기본 기능을 제공하는 면에서 일반성이 높다고 볼 수 있습니다.
직교성
한 언어의 구성 요소가 문맥에 따라 다른 의미를 가져서는 안되는 성질입니다.
예를 들어, 매개 변수 전달에 있어 데이터 타입에 상관없이 동일한 전달 방식을 지원한다면, 직교성이 높다고 볼 수 있습니다.
C 언어의 함수 호출 시 인자 전달 방식이 값에 의한 호출과 참조에 의한 호출을 지원합니다.
이로 인해 코드의 의미가 달라지기 때문에 직교성이 상대적으로 낮습니다.
동일한 연산자를 사용했을 때 동일하게 동작해야 하는 것이 직교성의 목표입니다.
획일성
획일성은 비슷한 것은 비슷한 의미를, 다른 것은 다른 의미를 가져야 한다는 원칙입니다.
획일성이 부족한 예로 C++의 클래스 정의와 함수 정의를 들 수 있습니다.
class A{...};
void f{...}
클래스를 정의할 때는 세미콜론이 필요하지만, 함수 정의에는 세미콜론이 없어야 합니다.
이와 반대로 파스칼은 모든 정의 뒤에 세미콜론을 붙입니다.
이렇게 보면 파스칼이 획일성이 더 높다고 볼 수 있습니다.
표현력과 간결성
표현력은 언어가 복잡한 과정이나 구조를 얼마나 쉽게 표현할 수 있는지를 의미합니다.
언어가 계산을 표현하는데 있어 편리한 방법을 포함하느냐를 측정하는 지표입니다.
언어가 편리하게 다양한 연산을 지원하면 좋을 것 같지만, 언어가 다양한 연산을 지원할수록 프로그램이 복잡해 질 수 있습니다.
따라서 간결성이 낮아진다고 볼 수 있습니다.
간결성은 표현력과 상충되는 개념으로, 코드의 간결함과 명료함을 중시합니다.
이를 균형있게 유지하는 것이 중요하며, 언어 설계자들은 이 두 가지 원칙 사이에서 적절한 타협을 찾아야 합니다.
- 기억하자! 간결성과 표현력은 상충 된다
정확성
정확성은 프로그램의 실행을 예측할 수 있도록 언어에 대한 정확한 정의가 있는지를 확인하는 원칙입니다.
언어에 대한 정확한 정의는 프로그램과 번역기의 신뢰성에 도움을 줍니다.
정확성을 높이기 위해 해당 언어의 표준화 기구에서 언어의 표준을 정하기도 합니다.
이를 통해 언어의 구현과 사용에 일관성을 제공할 수 있습니다.
기계 독립성
기계 독립성은 언어가 특정 기계에 의존적이지 않고, 독립적인 것을 의미합니다.
메모리 할당이나 기계 구조 등의 내용과는 독립적인 미리 정의된 데이터 타입을 제공한다면 기계 독립성이 높다고 볼 수 있습니다.
이를 통해 다양한 기계와 운영체제에서도 언어를 사용할 수 있게 됩니다.
예로 들면, C 언어의 경우 limits.h 라는 헤더 파일이 있어서 미리 헤더에서 정의를 할 수 있습니다.
미리 정의된 헤더 파일을 통해 기계나 운영체제의 구현 방식과 상관없이 인터페이스를 제공할 수 있습니다.
제약성
제약성은 언어에 대한 최소한의 지식과 일부 언어 구조만 알아도 프로그램을 작성할 수 있는 성질입니다.
제약성이 높은 언어는 학습하기 쉽고, 빠르게 프로그래밍을 시작할 수 있게 됩니다.
제약성이 높은 좋은 예시로 Lisp가 있습니다.
Lisp의 경우 최소한의 구조만으로도 프로그램을 작성할 수 있으며, 문법 자체가 복잡하지 않아 많은 지식이 없어도 프로그램을 바로 작성할 수 있습니다.
보안성
보안성은 프로그래밍 오류를 줄이고 오류 발견을 쉽게 하는 언어를 설계하는 원칙입니다.
보안성은 신뢰성과 정확성에 밀접한 연관을 가지고 있으며, 프로그래머가 범할 수 있는 오류를 최소화하기 위한 속성입니다.
보안성이 높은 언어는 예외 처리 등의 기능이 잘 구현되어 있어야 합니다.
C 언어의 경우 포인터 연산이 자유로워 오류 발생 가능성이 높아 보안성이 낮다고 볼 수 있습니다
반면에 Java와 같은 언어는 포인터 연산을 허용하지 않고 가비지 컬렉터를 통한 메모리 관리 기능을 제공하여 보안성이 높다고 볼 수 있습니다.
이렇게 언어가 프로그래머의 실수를 방지하고 오류를 쉽게 찾아낼 수 있도록 설계되어 있으면 보안성이 높다고 할 수 있습니다.
확장성
확장성은 사용자가 언어에 새로운 기능을 추가 할 수 있도록 하자는 성질입니다.
사용자가 새로운 타입을 정의하는 것, 라이브러리에 새로운 함수를 추가하는 것, 번역기에 새로운 키워드를 추가하는 것 등을 예시로 듭니다.
확장성이 높은 언어는 사용자의 요구에 맞게 언어를 쉽게 변경하거나 추가할 수 있습니다.
확장성이 좋은 언어로 Lisp가 있습니다.
Lisp는 매크로를 통해 언어를 확장할 수 있습니다. 이를 통해 프로그래머는 언어를 자신의 필요에 맞게 확장하여 사용할 수 있습니다.
레퍼런스
- [[목적 코드]]
- 프로그래밍 언어 설계 원칙
- 프로그래밍 언어의 변천사
'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글
함수형 언어 (0) | 2023.04.09 |
---|---|
Scheme (0) | 2023.04.09 |
형식 언어 (3) - 형식 문법 표현 방법 (0) | 2023.04.08 |
형식 언어 (2) - 언어 (0) | 2023.04.08 |
형식 언어 (1) - 문자열 (0) | 2023.04.08 |