[ 프로그램 언어와 번역 ]
□ 저급 언어와 고급 언어
○ 저급 언어
- 기계 중심의 언어로 상이한 기계에서 기종에 맞게 수정해야 실행할 수 있음
- 기계간 차이가 있어 호환성이 낮음
- 기계어, 어셈블리어 등이 있음
○ 고급 언어
- 사람 중심의 언어로 개발자가 원시 프로그램을 작성할 때 쉽게 이해할 수 있도록 작성된 언어
- 상이한 기계에서 별도의 수정이 필요없어 호환성이 높음
- C, C++, Java, COBOl, FORTRAN 등이 있음
- 기계어로 컴파일러/인터프리터와 같이 번역이 필요함
○ 기계어
- 0과 1만을 사용하여 명령어와 데이터를 나타내고 컴퓨터가 이해할 수 있어 실행 속도가 빠름
- 호환성이 없고 기계마다 언어가 달라 프로그램 작성이 어려움
- 기계어는 언어 번역기를 이용하는 언어 번역 과정을 거치지 않음
□ 원시 프로그램과 목적 프로그램
○ 원시 프로그램
- 사용자가 작성한 프로그램으로 기계어로 번역하기 이전의 프로그램
○ 목적 프로그램
- 원시 프로그램이 기계어로 번역된 프로그램 파일
- 컴퓨터가 이해할 수 있는 0과 1로 구성됨
□ 언어 번역 프로그램
○ 어셈블러
- 저급 언어인 어셈블리어로 작성된 원시 프로그램을 기계어로 변환
- 기계어로 구성된 파일인 목적 프로그램을 생성한다
- 어셈블리어는 일반적으로 하드웨어 제어에 사용된다
- 어셈블리어는 기계어 멍령을 연상할 수 있는 연상 기호와 기계어를 1:1로 대응시켜 만든 언어
- 어셈블리어 = 니모닉 언어(연상기호 언어)
○ 컴파일러
- C언어, FORTRAN과 같은 고급 언어로 작성된 원시 프로그램을 목적 프로그램(기계어)으로 변환
- 컴파일러 방식은 실행에 필요한 정보가 컴파일 시간에 이미 계산된어 실행 속도가 빠름
- 실행시간의 효율성을 중시하는 프로그래밍 언어에서 대부분 컴파일러 사용
- 실행에 필요한 기억장소는 정적으로 할당
- 반복문이 많은 경우 인터프리터 방식보다 유리함
- COBOL 언어, C언어, C++, PASCAL 등에서 사용
○ 인터프리터
- 원시 프로그램을 입력으로 받아 목적 프로그램으로 변환하지 않고 직접 실행에서 결과를 출력해 주는 방식
- 고급 언어로 작성된 원시 프로그램 명령어를 한번에 한 줄씩 번역하여 실행
- 컴파일러와 다르게 목적 프로그램을 생성하지 않음 => 대화식으로 실행 처리(번역과 실행이 한번에 이루어짐)
- 한줄 단위로 번역하여 문법상 오류를 쉽게 찾을 수 있음
- 실행에 필요한 기억 장소가 동적으로 할당
- 반복문이 많은 경우 컴파일러보다 불리함
- BASIC, PROLOG, LISP, Python 등에서 사용
컴파일러 | 인터프리터 |
- 목적 프로그램 생성 - 융통성이 없음 - 프로그램을 한꺼번에 번역 - 기억장소가 추가로 필요하지 않음(정적 할당) - 반복문에서 유리 - 실행시간의 효율성 중시 - 정적 자료 구조형 |
- 목적 프로그램을 생성 X - 융통성이 있음 - 프로그램을 한 줄씩 번역하여 곧바로 실행 - 기억장소가 추가로 필요 - 대화식 프로그램에서 유리 - 실행시간의 유연성 중시 - 동적 자료 구조형 |
○ 프리프로세서
- 고급 언어를 다른 고급 언어로 번역하는 고급언어 번역기
- 컴파일 하기 이전에 변환 처리되는 프로그램으로 선행처리기, 전처리기라고 함
- 원시 프로그램을 목적 프로그램으로 변환하는 것이 아니라 다른 고급 언어로 전환 -> 다양한 프로그래밍이 가능
- 상수 정의 치환, 매크로 확장 등 컴파일러가 처리하기 전에 먼저 처리하여 확장된 원시 프로그램을 생성
○ 크로스 컴파일러
- 컴퓨터 기종이 다른 경우에 사용되는 컴파일러
- 다른 기종에 맞게 번역하는 것
○ 매크로 프로세서
- 어셈블리어를 사용하기 쉽도록 명령어들을 매크로(문자)로 치환하여 확장
- 치환 과정 : 매크로 정의 인식 -> 매크로 정의 저장 -> 매크로 호출 인식 -> 매크로 호출 확장
□ 다양한 언어 종류
○ 스크립트 언어
- 원시 코드를 컴파일하지 않고 실행할 수 있는 프로그래밍 언어
- 별도의 컴파일 없이 내장된 번역기에 의해 번역되어 바로 실행됨
- Javascript, PHP, Basic, Python 등
○ 컴파일 언어
- 원시 코드를 컴파일러를 통해 기계어로 변경해 사용자가 실행할 수 있는 실행 파일 생성
- C언어, COBOL, PASCAL, Java 언어 등
○ 객체 기반 언어
- 클래스 선언, 상속, 객체 생성 등을 사용하는 언어
- C++, Java 등
○ 객체 지향 언어
- 클래스 선언, 상속 등을 사용할 수 없으며 생성된 객체 사용하거나 객체 기술의 일부만을 사용하는 언어
- Javascript 등
○ 정적 타이핑
- 변수의 타입을 선언한 후 그 변수에 상수를 기억시키는 방식
- 변수 타입이 선언 시에 정해짐
○ 동적 타이핑
- 변수 타입 선언 없이 기억시키려는 상숫값의 타입에 따라 변수 타입이 정해지는 방식
- 변수 타입이 실행 시에 정해짐
□ 프로그램 수행 순서
○컴파일러 순서 : 원시 프로그램 -> 컴파일러 -> 목적 프로그램 -> 링커 -> 로더 -> 실행
- 원시 프로그램 : 프로그래머가 작성한 프로그램
- 컴파일러 : FORTRAN, C언어로 작성된 원시 프로그램을 기계어로 번역
- 목적 프로그램 : 기계어로 번역된 프로그램
- 링커 : 여러 개의 목적 파일을 하나의 프로그램으로 연결
- 로더 : 프로그램이 실행될 수 있는 환경을 설정하고 프로그램을 주기억 장치에 적재함
- 실행 : CPU에 의해 프로그램이 실행됨
□ 링커
○ 링커
- 번역 프로그램에 의해 번역된 여러 개의 목적 프로그램과 사용되는 내장 함수를 하나로 모아 실행가능한 프로그램으로 생성하는 기능
- 여러 목적 모듈들을 로드 모듈로 생성해 주는 것
- 링키지 에디터 : 재배치 형태의 기계어로 된 여러 개의 프로그램을 묶어서 로드 모듈 작성
○ SLL : Static Link Library
- 하나의 프로그램이 번역될 때 내장 함수가 링크되어 프로그램에 삽입
- 사용자 프로그램과 라이브러리의 연결은 프로그램이 실행되기 전에 작업
- 실행 프로그램 메모리가 커지고 실행 파일 용량이 커지며 실행 속도는 느려짐
- 변경과 갱신이 어려움
- 여러 사용자 프로그램이 하나의 라이브러리를 공유할 수 없음
○ DLL : Dynamic Link Library
- 내장 함수가 하나의 프로그램이 번역될 때에는 링크되지 않고 프로그램이 실행될 때 동적으로 링크됨
- 사용자 프로그램과 라이브러리의 연결은 프로그램이 실행된 후 작업됨
- 실행 프로그램의 메모리가 작고 실행 파일 용량이 작으며 실행 속도가 빠름
- 메모리와 디스크 공간을 절약할 수 있음
- 변경과 갱신이 SLL보다 용이함
- 여러 사용자 프로그램이 하나의 라이브러리를 공유할 수 있음
○ 라이브러리
- 필요할 때 찾아서 쓸 수 있도록 모듈화 되어 제공되는 부품화된 프로그램
- ex) 내장 함수, 지원 함수, 지원 프로그램 등
- 구성 : 도움말, 설치 파일, 샘플 코드
- 표준 라이브러리 : 프로그래밍 언어가 기본적으로 가진 라이브러리, 별도의 파일 설치 없이 사용 가능
- 외부 라이브러리 : 별도로 파일 설치가 필요, 누구나 개발하여 설치하며 공유도 가능함
□ 로더
○ 로더의 의미
- 좁은 의미 로더 : 프로그램을 주기억 장치에 적재하는 자체
- 넓은 의미 로더 : 할당, 연결, 재배치, 적재를 모두 포함한 로더(할당-연결-재배치-적재 순)
○ 로더의 일반적 기능
- 할당 : 실행 프로그램을 실행시키기 위해 주기억 장치 내에 옮겨 놓을 공간을 확보하는 것
- 연결 : 여러 목적 프로그램을 하나의 프로그램 내에서 실행시키기 위해 연결하는 기능
- 재배치 : 보조 기억 장치에 저장된 프로그램이 사용하는 각 주소를 할당된 기억 장소의 실제 주소로 배치시키는 기능
- 적재 : 기계어로 번역된 목적 프로그램을 실행하기 위해 주기억 장치로 적재하는 기능
○ 로더의 종류
- Compile-and-go 로더 : 번역 프로그램과 로더가 하나로 구성된 로더, 프로그램 실행시 매번 컴파일 해야 함, 프로그램 배포시 원시 프로그램을 공개 해야하는 단점
- 직접 연결 로더 : 일반적인 로더, 로더가 할당, 연결, 재배치, 적재를 모두 수행하는 로더
- 동적 로더 : 프로그램을 실행이 필요한 부분만 차례로 적재하거나 교체하면서 적재, 주기억 장치가 작은 경우 파일을 분할하여 적재하는 것을 의미, 오버레이와 스와핑이 있음
- 절대 로더 : 주기억 장치 할당과 목적 프로그램 연결을 프로그래머가 직접 담당
˙ 할당, 연결 : 프로그래머가 직접
˙ 재배치 : 어셈블러의 지원
˙ 적재 : 로더
□ 컴파일러
○ 컴파일러 단계
- 어휘 분석 -> 구문 분석 -> 의미 분석 -> 중간 코드 생성 -> 코드 최적화 -> 코드 생성
○ 어휘 분석
- 원시 프로그램을 하나의 긴 문자열로 보고 문자를 스캐닝하여 문법적으로 의미 있는 단위로 분할하는 것
- 토큰이라는 문법적단위로 분석
- 일반적으로 파서가 파스 크리를 형성해 나가는 과정에서 새로운 토큰을 요구하면 원시 프로그램을 문자 단위로 읽어 토큰을 생성하여 파서에게 주는 방식으로 구성
○ 구문 분석
- 프로그램 수식 확인, 후위 형식 변환, 문법 오류 확인
- 주어진 문장이 정당하게 하나의 문장으로 사용될 수 있는가를 확인하는 작업
- 주어진 문법에 맞는가를 검사하여 옳으면 중간 코드 생성
- 구문 분석기는 결과물로 파스 트리 생성
○ 의미 분석
- 구문 트리를 보고 어떤 의미와 기능을 하는지 분석하여 기능을 수행할 환경을 조성하는 단계
- 의미 분석의 주요 역할인 자료형 검사 수행
- 매크로 처리, Symbol 테이블 유지
[ 자료 객체 ]
□ 예약어
○ 예약어 정의
- 프로그래밍 언어에서 시스템이 알고 있는 특수한 기능을 수행하도록 이미 용도가 정해진 언어
○ 예약어 특징
- 프로그램 번역시 예약어 사용은 심볼 테이블 검색 시간을 단축
- 번역 과정에서 성능을 향상 시킬 수 있음
- 프로그램의 신뢰성 향상
- 오류 회복이 가능함
- 예약어는 프로그램이 언어에서 사용하는 명령어, 연산, 함수명
- 새로운 프로그래밍 언어일수록 기능이 많아지기 때문에 예약어 수가 많아짐
□ 변수와 식별자
○ 변수
- 기억 장치의 한 장소를 추상화한 것으로 프로그램이 동작하는 동안 수시로 변할 수 있는 공간
- 어떤 값을 주기억 장치에 저장하기 위해 사용하는 공간
- 변수 유형은 컴파일 시간에 한 번 정해지면 일반적으로 그대로 유지
○ 식별자
- 프로그램의 구성 요소를 구별하기 위한 기준으로 변수명이 식별자에 포함됨
□ 포인터
○ 포인터 정의
- 기억 장소의 명칭, 기호 번지
- 변수명에는 실제 기억 장소의 위치인 절대 번지가 존재하는데 이 절대 번지를 포인터 상수라고 함
- 프로그래머가 하나의 변수를 선언하면 변수명과 변수가 실제로 위치하는 절대 번지가 함께 확보됨
- ex) int a = 10; int *p = &a;
- 포인터 상수를 사용하기 위해 변수 a 앞에 &를 붙임
- 포인터 상수를 변수에 기억시켜 사용하기 위해 포인터 변수 p앞에 *를 붙임
○ 포인터 특징
- 자료 객체를 참조하기 위해 주소를 값으로 하는 형식
- 커다란 배열에 원소를 효율적으로 저장하고자 할 때 이용
- 하나의 자료에 동시에 많은 리스트 연결이 가능
- 고급 언어에서 주로 사용되는 기법
□ 바인딩
○ 바인딩 정의
- 프로그램에서 어떤 변수의 명칭과 그 메모리 주소, 데이터형 또는 실제 값을 연결하는 것
- 바인딩 시간 : 프로그램에서 변수들이 갖는 속성이 완전히 결정되는 시간
○ 바인딩 시간 종류
- 언어 정의 시간 : 프로그램의 자료구조, 택일문 등을 확정하는 시간
- 언어 구현 시간 : 프로그램의 자료구조인 정수형이나 실수형이 실제 가지는 값을 할당하는 시간
- 번역 시간
˙ 컴파일 시간 : 변수의 형과 구조를 결정하는 시간
˙ 링크 시간 : 외부 함수 간에 호출 정보를 인식하는 시간
˙ 적재 시간 : 전역 변수의 위치를 할당하는 시간
- 실행 시간 : 자동 변수의 값이나 연산을 수행하는 시간
○ 정적 바인딩과 동적 바인딩
- 정적 바인딩
˙ 프로그램 실행 시간 전에 속성 연결하는 방식
˙ 언어 정의 시간, 언어 구현 시간, 번역 시간, 정적 변수 확보 등이 있음
˙ 동적 바인딩에 비해 효율성이 좋음
- 동적 바인딩
˙ 프로그램 실행 시간에 속성을 연결하는 방식
˙ 실행시간, 프로그램 호출 시간, 모듈의 가동 시간, 지역 변수 확보 등이 있음
˙
'자격증 > 정보처리기사' 카테고리의 다른 글
Part4 - chapter04 : 프로그램 개발 환경 구축 (0) | 2022.02.23 |
---|---|
Part4 - chapter03 : 객체지향 기술 (0) | 2022.02.14 |
Part4 - chapter02 : 프로그래밍 언어 활용 (0) | 2022.02.14 |
Part4 - chapter02 : 알고리즘과 코딩(수정전) (0) | 2022.01.08 |
Part4 - chapter01 : 프로그래밍 언어 기초(수정전) (0) | 2022.01.04 |