Characteristics of Programming Language
프로그래밍 언어의 특성
- 프로그래밍 언어는 Machine-Readable(기계가 읽을 수 있는)하고 또한, Human-Readable(사람이 읽을 수 있는)한 형태로 Computation(계산)*을 기술하기 위한 표기체제이다.
- 이전 시대의 프로그래밍 언어들에 비해 High-Level Abtraction(높은 수준의 추상화)가 이루어져서 가독성과 Processor간 이식성이 높아지고, 프로그램 작성도 용이해졌다.
- 프로그래밍 언어는 더 이상 Computation을 서술하기 위한 도구에 그치지 않고, IDE(통합 개발 환경)**의 일부분으로 제공되고 있다.
* Computation (계산)
- 수학적으로 정의할 수 있는 개념을 일컫는다.
- 계산은 컴퓨터가 수행 가능한 모든 작업을 포함하는데, 작업이라 함은 데이터의 조작, 텍스트 처리, 정보 저장, 검색 등을 의미한다.
※ Turing Complete : 모든 종류의 계산을 기술할 수 있는 언어를 지칭하는 표현이다.
** IDE (Integrated Development Environment ; 통합 개발 환경)
- 프로그램을 작성하고 번역하는 기능을 제공한다.
- 또한, 프로그램 파일 조작, 변경 사항 유지, 디버깅, 테스트, 분석하는 도구 일체를 포함한다.
Property : Machine-Readable (기계가 읽을 수 있는 특성)
- 프로그래밍 언어는 단순한 구조를 띄고 있어 효율적인 번역이 가능해야 한다.
- 모호하지 않고 유한한 단계적 처리로 번역할 수 있는 번역 알고리즘이 존재해야 한다.
- 번역 알고리즘은 위 조건을 만족시키면서 동시에 제한된 시간 내에 번역이 가능해야 한다.
- 위 조건들을 만족시키기 위해서는, 프로그래밍 언어는 Context Free Language(문맥 자유 언어)*이어야만 한다.
* Context Free Language (문맥 자유 언어)
- 문맥에 관계없이 항상 같은 내용으로 번역되는 언어이다.
* Context Sensitive Language (문맥 의존 언어)
- 문맥에 따라 해석이 바뀌는 언어이다.
- 대부분의 자연어가 이에 해당한다.
ex) "Saving private Ryan"와 같은 구문을,
누군가는 "라이언 일병을 구하기"로 해석하고,
누군가는 "저축하는 개인적인 라이언"으로 해석한다.
Property : Human-Readable (사람이 읽을 수 있는 특성)
- 프로그래밍 언어는 Machine Independent(기계 독립적)한 추상성을 띄어서 자연어와 비슷하게 구현되어야 한다.
- 프로그램의 크기가 점차 방대해지고 있음에 따라, 프로그래밍 언어는 Locality(지역성)*을 띄어야 한다.
* Locality (지역성) : 소스코드의 특정 부분만 보고 프로그램의 해당 영역을 파악할 수 있게하는 특성이다.
History (프로그래밍 언어의 역사)
1. 하드웨어적 프로그래밍
- 1940년 이전의 ENIAC(에니악) 시절엔 Hard-Wired(전선 연결) 방식으로 프로그래밍을 수행했다. 이는 프로그래밍을 하드웨어적으로 구현하는 방식이다.
2. Assembly Language (어셈블리어)
- 이후 Symbol(\(\texttt{LDA X, ADD Y, STA Z}\)와 같은)을 사용하는 Symbolic Language(기호 언어)인 Assembly Language(어셈블리언어)가 탄생했다.
- Machine Dependent(기계 종속적) 특성으로 인해 Processor마다 문법이 다르다는 점에서 오는 불편함이 있었다.
- 또한 Low-Level Abstraction(저급 수준의 추상화)와 읽고 쓰기에 어려움 등의 한계점도 있다.
3. High-Level Language (고급 언어)
- Abstraction(추상화)를 통해 직관적이고 쉬운 프로그래밍이 가능해졌다.
- 또한 가독성이 좋고, 다른 Processor에 이식하기에도 용이해졌다.
- 고급 언어의 특징으로는 배정, 반복, 선택과 같은 기능들이 있다.
The Importance of Programming Language Consideration (PL 고찰의 중요성)
1. 사용중인 PL의 심도있는 이해를 통한 효율적인 알고리즘 작성이 가능해진다.
- PL의 세부적인 기능(특징)들은 프로그래머들이 숙지하지 못하고 있는 경우가 있는데, 이 때문에 PL의 창시자는 해당 PL의 지침서 제작에 신중해야 한다.
2. 프로그래밍 실력이 증가한다.
- 해당 PL의 세부적인 구조를 잘 이해하고 있다면, 해당 PL로 구현하기에 적합한 알고리즘을 완성도있게 설계할 수 있다.
3. 적재적소에 알맞는 PL을 선택할 수 있다.
- 문제 해결 과정에서, 하나의 PL에만 전문적인 프로그래머는 문제 풀이를 위한 자료 구조와 프로그램 구조를 모색할 때, 자신있는 PL로의 구현을 우선시하게 되어 사고의 영역이 좁아지게 된다.
- 프로그래머는 다양한 PL 구조를 숙지하여 PL 어휘의 구사력을 높여 적재적소에 알맞는 PL을 사용할 수 있어야 한다.
4. 하나의 PL을 완전히 숙지하고 있다면, 다른 PL을 비교적 쉽게 터득할 수 있다.
- 모든 PL들은 공통된 영역이 있고, 저마다의 개성(특징)을 갖고 분리된 구조이다.
- 하나의 PL을 심도있게 숙지하고 있다면 다른 언어를 배울 때, 오랜시간이 걸리지 않는다.
5. 새로운 PL을 설계할 수 있다.