프로그래밍 언어론
1장
예캉
2017. 10. 18. 01:21
01 프로그래밍 언어란?
프로그래밍 언어 : 컴퓨터 시스템을 동작시키는 프로그램을 작성하기 위한 언어
이 장에서는 프로그래밍 언어의 개요, 좋은 프로그래밍 언어를 설계하는 원칙, 고급 언어로 작성된 프로그램이 실행되도록 처리하는 방법과 패러다임에 따른 프로그래밍 언어의 분류를 알아본다.
컴퓨터 시스템은 스스로 인식할 수 있는 명령어들로 이루어진 프로그램에 의해 동작된다. 프로그래밍 언어란 이러한 프로그램을 작성하기 위한 인공적인 언어이다. 프로그래밍 언어는 사람이 사용하기 편리한 정도에 따라 저급 언어와 고급언어로 분류된다.
저급 언어 : 기계어, 어셈블리어(기계어보단 보기 쉽지만 호환성X)
초기에 사용되던 하드웨어 지향의 기계 중심 언어로, 하드웨어와 밀접한 기능을 제어하는 프로그램을 작성하는 데 주로 사용.
mov ax, X
add ax, Y
mov z, ax <- 어셈블리어의 예
컴퓨터 기종에 따라 다르게 표현되고 복잡하다는 문제점=> 이러한 문제점 해결하고자 고급언어 만들어짐.
고급 언어 : C, C++, JAVA 등 대부분의 언어(영어,함수.. 사람이해는 쉬우나 기계는 어려움. 실행시 속도가 느림)
사람이 사용하는 기호 체계와 매우 흡사 기종에 관계없이 거의 동일하게 표현됨.
Z=X+Y; <- 고급 언어 예
응용 분야별 구분
-범용 언어 : C C++
-인공지능언어: LISP Pnolog # 논리 연산과 융통성이 중요시
-병렬처리: Linda
-페이지 기술언어 : HTML XHTML
-데이터베이스 질의어 : SQL
프로그래밍 언어의 실행 방식에 의한 구분
- 함수형 언어
- 수학 함수와 같은 원리의 함수들로 프로그램을 구성
- 변수, 배정문 등을 사용하지 않음
ex) LISP
(first(sort'(3 9 7 5)))
=> first와 sort는 함수로 미리 정의 되어 있어야 함!
- 논리 언어
- 기호 논리의 원리를 기반
- 개체에 대한 사실과 개체 사이의 관계 규칙을 이용해 원하는 결과 도출
ex)Prolog
father(a,c).
male(X):-father(X,Y).
male(a). => 질의어
- 명령 언어
- 폰노이만 구조라 불리는 컴퓨터 구조를 기반.
- 절차적 언어
- 배정문과 변수 사용
- 객체지향적 언어
- 함수형 언어, 논리형 언어, 명령형 언어 어느 것과도 결합 가능.
- 객체 단위로 모든 처리를 기술
- 추상데이터 타입, 상속, 동적 바인딩 지원
ex) C++ JAVA Small talk 등
- 시각형 언어
- VB, VC++
- 2000년대 들어 사용
- MS사의 VS에서 지원
02 프로그래밍 언어의 설계 원칙
대부분의 성공한 언어들은 설계 시 특정한 목표가 있었다. Fortran은 실행효율, Cobol은 판독성, Pascal은 간결한 교육용 언어의 제공, C++는 C언어와의 호환과 추상화 제공이 목표였다.
라우든이 제시한 좋은 프로그래밍 언어 설계원칙
- 1960년대
- 효율성 : 적은 실행 메모리, 짧은 실행 시간
언어에 대한 효율성은 4가지로 분류
-목적 코드의 효율성
: 번역기 효율적인 실행 코드를 생성할 수 있어야 함. 여기서 번역기는 컴파일러 또는 인터프리터
-번역의 효율성
:번역기가 효율적으로 실행코드를 생성할 수 있어야 함. 즉 설계된 언어가 번역기에 의해 빠르게 번역될 수 있어야 함을 의미. 번역의 효율성은 신뢰성과는 상반되는 성질로, 번역기가 오류 검사를 하지 않으면 번역의 효율성은 높아지나 신뢰성은 떨어진다.
-구현 용이성
:번역기가 효율적으로 작성할 수 있어야 함. 설계된 언어가 복잡하면 구현 용이성이 떨어지는데 이러한 언어의 예로 ALGOL 60과 Ada가 있다.
-프로그래밍 용이성
: 설계된 언어로 얼마나 빠르고 쉽게 프로그램을 작성할 수 있는가에 달렸다. 언어 구조가 간결하면 프로그래밍 효율성이 높아지는데 LISP가 이에 해당.
- 1970년 이후
-> 해독성, 판독성, 가독성
- 작성된 프로그램을 쉽게 이해할 수 있어야 함
- 대부분의 고급언어 ( C, COBOL)
-- 영어 단어를 사용한명령어
-- 수학적 수식과 비슷한 수식
- 주석 허용
-- 유지 보수의 중요성 ( C, C++, PASCAL)
-> 간결성
- 언어가 복잡하지 않고 간결해야 함 (LISP Prolog)
- 지나친 간결성은 의미 파악을 어렵게 함
-> 보안성(프로그램 검증의 용이성)
- 프로그래밍 오류를 줄이고 오류 발견을 쉽게 하는 언어를 설계하는 원칙
- 신뢰성과 정확성에 밀접한 연관을 가지고 프로그래머가 범할 수 있는 오류의 수를 최소화하자는 것
-> 획일성
- 비슷한 것은 비슷하게 보이고 비슷한 의미를 가져야 하며, 다른 것은 다르게 보이고, 다른 의미를 가져야 한다는 원칙.
획일성이 부족한 예 : C++에서 클래스 정의와 함수 정의
class A{...}; -> 클래스 정의 시에는 세미콜론이 와야 함
void f(){...} -> 함수 정의 시에는 세미 콜론이 없어야 함
-> 추상화, 단순화
- 추상화
: 객체의 필수적인 속성만을 가지고 객체를 묘사함
- 복잡한 것을 간단하게 사용할 수 있게 해 복잡한 기능을 수행하는 프로그램을 간단하게 작성할 수 있게 해줌
- C++ Java
-> 정확성
- 프로그램의 실행을 예측할 수 있도록 하는 언어에 대한 정확한 정의가 있는지
- 언어에 대한 정확한 정의는 프로그램과 번역기의 신뢰성에 도움을 줌
-> 기계 독립성
- 언어가 특정 기계에 의존적이지 않고 독립적인 것을 의미
- 메모리 할당이나 기계 구조 등의 내용과는 독립적인 미리 정의된 데이터 타입을 제공하는 것
-> 제약성
- 언어에 대한 최소한의 지식과 일부 언어 구조만 알고 있더라도 프로그램을 작성할 수 있는 성질
03 프로그램 처리 기법
고급 언어로 작성된 프로그램을 컴퓨터가 바로 인식해서 실행할 수 없다. 고급언어로 작성된 프로그램을 컴퓨터가 인식할 수 있는 형식을 변환하는 과정을 거쳐야 한다.
cpu에 의해 실행: sf -> 컴파일러 obj -> 링커 -> 로더
링커와 obj, 라이브러리 파일과 매칭
- 소스 프로그램/파일
- 프로그래머가 문제해결을 위한 계산절차와 데이터를 프로그래밍 언어를 이용해 작성한 것
- 고급언어로 작성되며 보조 기억장치에 저장됨
- 사람은 이해 가능하나 컴퓨터가 실행할 수는 없음
- 확장자 : .c .cpp .java
- 목적 프로그램/파일
- 소스프로그램을 기계가 이해할 수 있는 2진수로 표현된 기계어로 번역한 결과물
- 사람은 이해하기 어려우며 컴퓨터는 이해할 수 있음
- 컴퓨터가 바로 실행시킬 수 없음
- 보조기억장치에 저장됨
- 확장자 : .obj
- 실행가능 프로그램/파일
- 라이브러리 함수들과 목적 프로그램의 결합 결과 생성된 파일
- 보조 기억장치에 저장됨
- 확장자 : .exe
*고급 언어로 작성된 프로그램이 실행되도록 처리하는 방법
-컴파일기법,해석기법,하이브리드기법
컴파일 기법
- 고급 언어로 작성된 프로그램을 컴퓨터가 바로 실행할 수 있는 프로그램으로 변환하는 방식
- 컴파일 하는 프로그램 : 컴파일러
- 번역이 완료되면 빠르게 프로그램을 실행시킬 수 있는 장점
- Fortran Algol Pascal C C++ gcc 등
원시 프로그램 -> 컴파일러 -> 목적 프로그램
목적 프로그램 -> 컴퓨터(입력) -> 결과
*컴파일 단계
시간이 오래 걸린다.
미리 오류 검사를 끝내서 실행시간은 짧으나 소스 수정하면 다시 해야하는 단점이 있다.
원시프로그램 -> 어휘 분석 단계 -> 구문 분석 단계 -> 중간 코드 생성 단계 -> 최적화 단계 -> 코드 생성 단계 -> 목적 프로그램
어휘 분석 단계 : 원시 프로그램을 토큰 단위로 자르고, 토큰 관련 정보를 구문 분석 단계로 전달
구문 분석 단계 : 어휘 분석 단계에서 전달받은 토큰들이 문법적으로 옳은지를 검사하고, 오류가 없으면 파스 트리라 불리는 구조를 생성
중간 코드 생성 단계 : 기계어는 아니지만 어느 기계에도 의존적이지 않으면서도 기계어에 가까운 중간 코드로 된 프로그램을 생성, 의미적인 오류를 검사
최적화 단계 : 중간 코드에서 불필요한 코드를 제거하거나 더 효율적인 코드로 개선하여 중간 코드의 크기를 줄이고 실행 속도를 빠르게 함
코드 생성 단계 : 최적화된 중간 코드로부터 해당 컴퓨터가 인식할 수 있는 목적 프로그램을 생성
*해석 기법
- 고급 언어로 작성된 프로그램을 바로 실행
- 해석 프로그램 : 인터프리터
- 인터프리터 : 고급 언어를 자신의 기계어로 취급하는 컴퓨터를 시뮬레이션 한 것
- Basic LISP Scheme 등
원시 프로그램 -> 인터프리터(입력) -> 결과
*하이브리드 기법
- 컴파일 기법과 해석 기법을 혼합한 형태
- 컴파일 기법의 빠른 실행속도, 인터프리터 기법의 융통성을 취함
- 고급 언어로 작성된 프로그램을 해석할 수 있도록 중간 코드 형태로 번역
-> 번역된 중간코드 형태의 프로그램을 인터프리터가 해석하여 실행
원시 프로그램 ->어휘 분석 단계 -> 구문 분석 단계 -> 중간 코드 생성 단계 -중간코드->인터프리터(입력)->결과
ex) Java
-바이트 코드라고 하는 중간 코드로 번역
- 운영체제마다 별도로 존재하는 자바 가상 기계가 바이트 코드를 실행