본문 바로가기
자격증/정보처리기사

Part4 - chapter01 : 프로그래밍 언어 기초

by jun_code 2022. 2. 13.

[ 프로그램 언어와 번역 ]

저급 언어와 고급 언어

    ○ 저급 언어

        - 기계 중심의 언어로 상이한 기계에서 기종에 맞게 수정해야 실행할 수 있음

        - 기계간 차이가 있어 호환성이 낮음

        - 기계어, 어셈블리어 등이 있음

 

    ○ 고급 언어

        - 사람 중심의 언어로 개발자가 원시 프로그램을 작성할 때 쉽게 이해할 수 있도록 작성된 언어

        - 상이한 기계에서 별도의 수정이 필요없어 호환성이 높음

        - 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앞에 *를 붙임

 

    ○ 포인터 특징

        - 자료 객체를 참조하기 위해 주소를 값으로 하는 형식

        - 커다란 배열에 원소를 효율적으로 저장하고자 할 때 이용

        - 하나의 자료에 동시에 많은 리스트 연결이 가능

        - 고급 언어에서 주로 사용되는 기법

 

□ 바인딩

    ○ 바인딩 정의

        - 프로그램에서 어떤 변수의 명칭과 그 메모리 주소, 데이터형 또는 실제 값을 연결하는 것

        - 바인딩 시간 : 프로그램에서 변수들이 갖는 속성이 완전히 결정되는 시간

    ○ 바인딩 시간 종류

        - 언어 정의 시간 : 프로그램의 자료구조, 택일문 등을 확정하는 시간

        - 언어 구현 시간 : 프로그램의 자료구조인 정수형이나 실수형이 실제 가지는 값을 할당하는 시간

        - 번역 시간

            ˙ 컴파일 시간 : 변수의 형과 구조를 결정하는 시간

            ˙ 링크 시간 : 외부 함수 간에 호출 정보를 인식하는 시간

            ˙ 적재 시간 :  전역 변수의 위치를 할당하는 시간

        - 실행 시간 : 자동 변수의 값이나 연산을 수행하는 시간

    ○ 정적 바인딩과 동적 바인딩

        - 정적 바인딩

            ˙ 프로그램 실행 시간 전에 속성 연결하는 방식

            ˙ 언어 정의 시간, 언어 구현 시간, 번역 시간, 정적 변수 확보 등이 있음

            ˙ 동적 바인딩에 비해 효율성이 좋음

        - 동적 바인딩

            ˙ 프로그램 실행 시간에 속성을 연결하는 방식

            ˙ 실행시간, 프로그램 호출 시간, 모듈의 가동 시간, 지역 변수 확보 등이 있음

            ˙