01. 프로그램 언어와 번역
01. 프로그램 언어의 개념
1) 프로그램 언어의 정의
- 컴퓨터가 이해할 수 있도록 작성된 명령어들의 집합
- 인간과 컴퓨터 간의 정보 교환에 이용되는 약속된 명령어 표기법
- 프로그램은 명령어들의 조합으로 구성
- 명령어들의 조합은 기계가 이해할 수 있는 0과 1의 값으로 작성됨
- 명령어들이 영문으로 작성되는 경우 0과 1의 값으로 번역되어 컴퓨터에 잔달됨
2) 컴퓨터에 명령어를 전달하는 방법
- 컴퓨터에 명령은 0과 1로 구성된 비트 값으로 전달됨
- 비트의 0과 1을 컴퓨터가 이해할 수 있는 방식으로 변환하여 전달함
- 프로그램 자체를 0과 1로만 작성할 수도 있지만 어렵고 복잡함
- 프로그램을 보다 쉽게 작성하여 컴퓨터에 전달하고, 효율적인 프로그램을 구현하기 위해 프로그래밍 언어는 점진적으로 발전함
02. 저급 언어와 고급 언어
1) 저급 언어(Low Level Language)
- 기계 중심의 언어로 배우기 어려움
- 기계가 이해할 수 있도록 만들어진 언어
- 상이한 기계에서 기종에 맞게 수정해야 실행할 수 있음
- 기종 간에 큰 차이가 있어 호환성이 떨어짐
- 기계어, Assembly Language(어셈블리어) 등의 언어는 저급 언어에 해당함
- 어셈블리어는 어셈블러(Assembler)에 의해 기계어로 변역됨
2) 고급 언어(High Level Language)
- 사람 중심의 언어로, 배우기가 쉬움
- 개발자가 원시 프로그램을 작성할 때 쉽게 이해할 수 있도록 작성된 언어
- 상이한 기계에서 별다른 수정 없이 실행 가능함
- 기종 간에 큰 차이가 없어 호환성이 높음
- C, C++, Java, COBOL, FORTRAN 등의 언어는 고급 언어에 해당함
- 기계어로 번역(컴파일러, 인터프리터)이 필요함
3) 기계어(Machine Language)
- 2진수 0과 1만 사용하여 명령어와 데이터를 나타냄
- 기계어는 언어 번역기를 이용하는 언어 번역 과정을 거치지 않음
- 컴퓨터가 직접 이해할 수 있어 실행 속도가 빠름
- 전문적인 지식이 없으면 이해하기 어려움
- 호환성이 없고 기계마다 언어가 달라 프로그램 작성이 어려움
- 프로그램의 유지보수가 어려움
03. 원시 프로그램과 목적 프로그램
1) 원시 프로그램(Source Program, 원시 코드)
- 사용자(프로그래머)가 작성한 프로그램으로 기계어로 번역하기 이전의 프로그램
- 기계어로 번역되기 전 프로그래머에 의해 작성된 프로그램 파일을 의미함
2) 목적 프로그램(Object Program, 목적 코드)
- 원시 프로그램이 기계어로 번역된 프로그램 파일
- 컴퓨터가 이해할 수 있는 파일로 0과 1로 구성되어 있음
04. 언어 번역 프로그램
1) 어셈블러(Assembler)
- 저급 언어인 어셈블리어로 작성된 원시 프로그램을 기계어로 변환함
- 기계어로 구성된 파일인 목적 프로그램을 생성함
- 어셈블리어는 일반적으로 하드웨어 제어에 사용됨
- 어셈블리어는 기계어 명령을 연상할 수 있는 연상 기호와 기계어를 1:1로 대응시켜 만든 언어
- 어셈블리어는 니모닉(Mnemonic, 연상 기호) 언어
- 니모닉이란 어셈블리 명령어가 지정하는 동작을 개략적으로 짐작할 수 있도록 'MOV', 'LOAD', 'ADD', 'STORE', 'INT' 등을 기호로 표현하는 언어
2) 컴파일러(Compiler)
- C언어, FORTRAN과 같은 고급 언어로 작성된 원시 프로그램을 목적 프로그램(기계어)으로 변환함
- 컴파일러 방식은 실행에 필요한 정보가 컴파일 시간에 이미 계산되기 때문에 실행 속도가 빠름
- COBOL, C언어, C++, PASCAL, FORTRAN 언어 등이 컴파일러 방식으로 번역됨
- 실행 시간의 효율성을 중시하는 프로그래밍 언어는 대부분 컴파일러를 사용함
- 실행에 필요한 기억 장소는 정적으로 할당됨
- 반복문이 많을 경우 인터프리터 방식에 비하여 유리함
3) 인터프리터(Interpreter)
- 원시 프로그램을 입력으로 받아 목적 프로그램으로 변환하지 않고 직접 실행해서 즉시 결과를 출력하여 주는 방식
- 고급 언어로 작성된 원시 프로그램 명령어들을 한 번에 한 줄씩 번역하여 실행하는 방식
- 컴파일러 방식과 다르게 목적 프로그램을 생성하지 않음
- 목적 프로그램은 실행하지 않고 대화식으로 실행 처리함
- BASIC, PROLOG, LISP, Python 등이 인터프리터 방식의 언어에 속함
- 컴파일러 방식은 번역 시에 기억 장소를 확보하지만 인터프리터 방식은 프로그램 실행 시에 기억 장소를 확보함
- 한 줄 단위로 번역이 이루어지기 때문에 문법상의 오류를 쉽게 발견할 수 있음
- 사용상에 있어서 융통성이 있음
- 실행에 필요한 기억 장소는 동적으로 할당됨
- 반복문이 많은 경우 컴파일 기법에 비하여 불리함
4) 컴파일러와 인터프리터의 비교
- 컴파일러
- 목적 프로그램을 생성함
- 융통성이 없음
- 프로그램을 한꺼번에 번역하여 실행함
- 기억 장소가 추가로 필요하지 않음
- 반복문이 많을 경우 인터프리터에 비해 유리함
- 실행 시간의 효율성을 중시함
- 정적 자료 구조형
- 인터프리터
- 목적 프로그램을 생성하지 않음
- 융통성이 있음
- 프로그램을 한 줄씩 번역하여 곧바로 실행함
- 기억 장소가 추가로 필요함
- 대화식 프로그램일 경우에 컴파일러에 비해 유리함
- 실행 시간의 유연성을 중시함
- 동적 자료 구조형
5) 프리프로세서(Preprocessor)
- 고급 언어를 또 다른 고급 언어로 번역하는 고급 언어 번역기
- 컴파일하기 이전에 변환 처리되는 프로그램으로 전처리기, 선행 처리기하고 함
- 원시 프로그램을 목적 프로그램으로 번역하지는 않고 다른 고급 언어로 전환하는 역할을 수행함
- 프리프로세서를 이용하여 더욱 다양한 언어로 프로그래밍 할 수 있음
- 텍스트 파일을 변환 처리하여 논리적 오류를 최소화하고, 프로그래밍을 단순하고 용이하게 해주는 방안
- 상수 정의 치환, 매크로 확장 등 컴파일러가 처리하기 전, 먼저 처리하여 확장된 원시 프로그램을 생성하는 것
6) 크로스 컴파일러(Cross Compiler)
- 컴퓨터 기종이 다른 경우에 사용되는 컴파일러
- 원시 프로그램으로 번역된 목적 프로그램이 기종에 따라 다르게 적용될 때 필요한 컴파일러
- 원시 프로그램을 컴파일러가 수행되고 있는 컴퓨터의 기계어로 번역하지 않고 다른 기종에 맞게 번역하는 것
7) 매크로 프로세서(Macro Processor)
- 어셈블리어를 사용하기 쉽도록 명령어들을 매크로(문자)로 치환하여 확장시킴
- 매크로 프로세서의 치환 과정
- 매크로 정의 인식 -> 매크로 정의 저장 -> 매크로 호출 인식 -> 매크로 호출 확장
05. 프로그래밍 언어의 언어별 특성
1) 프로그래밍 언어별 특성
- FORTRAN
- 1954년에 초기 버전에 개발된 언어로 시스템에 의존적이고, 프로그램 작성을 위해서는 컴퓨터 시스템 관련 지식이 많이 필요하다는 특징을 가지고 있음
- 1977년 FORTRAN 77이 등장하였으나 그 이후에 등장한 언어와 비교하여 자료 구조가 제한적이었음
- 재귀 함수, 구조체, 포인터 등은 제공되지 않았으며, FORTRAN 90이 등장하고 나서야 포함되었음
- COBOL
- 1960년에 미국 국방성에 의해 개발
- 단순한 입출력 구현 시에도 많은 형식적인 문장이 필요함
- 프로그램 크기가 크고 구문이 복잡함
- 순차적 방식의 언어로, 웹 응용 프로그램과 쉽게 통합할 수 있다는 장점이 있음
- 자료 구조의 선언 부분과 프로그램의 실행 부분을 분리하였다는 특징이 있음
- PASCAL
- 1971년 개발되어 1980년대 말까지 많이 쓰인 언어
- 잘 짜인 구조와 간결성으로 인해 프로그래밍 언어로써 성공하였으나, 분리 컴파일과 문자열의 적절한 처리 등을 제공하지 못했음
- 사용자 정의 추상화 기능은 제공하나 정보 은닉 기능이 없어 현대의 프로그래밍 기법을 적용하기에는 다소 부족하다는 단점이 있음
- C언어
- 1972년에 개발된 언어로, UNIX 운영체제 구현에 사용되는 언어
- 범용 언어로 개발되었으나 문법의 간결성, 효율적 실행, 효과적인 포인터 타입 제공이라는 특징으로 인해 가장 많이 사용되는 시스템 프로그래밍 언어
- C++
- C언어를 발전시킨 언어로 클래스, 상속 등을 제공하는 객체지향 프로그래밍 언어
- 대형 프로젝트 수행 시 모듈별 분리가 가능하여 개발과 유지 관리에 적합함
- Java
- C++에 비해 단순하고 분산 환경 및 보안성을 지원함
- Java 언어는 컴파일을 거쳐야 함
- 컴파일을 통해 생성된 Class 파일을 가상 머신을 통해 실행해야 함
- JavaScript
- 1995년에 개발된 객체기반 스크립트 언어로 웹 페이지 동작을 구현할 수 있음
- 빠른 시간에 코드를 완성할 수 있고 확장성이 좋으며 배우기 쉽다는 장점이 있음
- 보안이나 성능이 다른 언어에 비하여 부족하다는 단점이 있음
- Perl
- 텍스트 처리에 주안점을 두고 개발된 인터프리터 언어로 CGI용으로도 많이 사용됨
- 변수를 명시적으로 선언할 필요가 없음
- 모든 변수가 지정되지 않았을 경우에는 기본 초기 값을 가짐
- Python
- Guido van Rossum이 개발한 언어로 영국의 6인조 코미디 그룹인 몬티 파이썬에서 언어 명칭을 붙임
- 문법이 매우 쉬워서 초보자들이 입문하기 쉬운 언어
- 배우기 쉽고 이식성이 좋은 언어
- 다양한 함수들도 많이 제공되어 스타트업과 글로벌 기업에서도 많이 사용함
- Perl 언어처럼 인터프리터 언어이면서 객체지향 언어, 스크립트 언어
- 객체를 생성하고 사용할 수 있는 객체지향 언어
- 시스템 프로그래밍, 하드웨어 제어 등을 제외하고 거의 모든 기능을 수행할 수 있는 언어
- Python은 C언어로 구현되었기 때문에 CPython이라고도 함
- 동적 타이핑을 지원하는 인터프리터 방식의 언어
- 동적 타이핑 : 변수 타입 선언 없이 기억시키려는 상숫값의 타입에 따라 변수 타입이 정해지는 방식으로 변수 타입이 실행 시에 정해짐
- Javascript처럼 스크립트 형태로 사용하는 Brython도 있음
- C#
- 2000년에 .NET 환경에 맞춰 설계된 언어
- C언어와 C++의 발전된 형태로, Visual Basic과 같이 사용자 인터페이스를 쉽게 만드는 컴포넌트 기능을 제공하기도 함
- .NET 환경에서 실행되기 때문에 .NET 환경이 설치되어야 함
- C# 컴파일러를 필요로 함
- GOLANG
- 2009년 Google에서 만든 언어로 짧게 GO라고도 부름
- C언어와 직접적인 연관을 가지고 있으며, 내장 라이브러리를 많이 지원함
- if, for, switch 등과 같이 C언어와 유사한 제어 구조를 가지고 있음
- 하드웨어 사양이 낮더라도 빠른 컴파일이 가능함
- DART
- Javascript와 Java의 영향을 받아 개발됨
- 객체지향 언어
- 백그라운드에서 작동한다는 점에서 Javascript와 차이를 가지고 있음
- Javascript와 유사하지만 복잡하지 않고 단순함
- 별도의 라이브러리 설치 없이 HTML 페이지를 수정할 수 있음
- CEYLON
- Java에 기반을 둔 언어
- 코드를 패키지와 모듈로 정리하여 가상 머신에서 컴파일을 수행함
- CEYLON Herd라는 저장소에서 모듈을 발행함
2. 프로그램 수행 순서
- 프로그램 수행 순서(컴파일러 순서)
- 원시 프로그램 -> 컴파일러 -> 목적 프로그램 -> 링커 -> 로더 -> 실행
- 프로그램 수행 단계별 작업 내용
- 원시 프로그램 : 프로그래머에 의해 작성된 프로그램
- 컴파일러 : FORTRAN이나 C언어로 작성된 원시 프로그램을 기계어로 번역함
- 목적 프로그램 : 기계어로 번역된 프로그램
- 링커 : 여러 개의 목적 파일을 하나의 프로그램으로 연결함
- 로더 : 프로그램이 실행될 수 있는 환경을 설정하고 프로그램을 주기억 장치에 적재함
- 실행 : CPU에 의해서 프로그램이 실행됨
'정보처리기사 > 프로그래밍 언어 활용' 카테고리의 다른 글
프로그래밍 언어 활용 3 (0) | 2023.05.29 |
---|---|
프로그래밍 언어 활용 2 (0) | 2023.05.29 |
프로그래밍 언어 활용 1 (0) | 2023.05.29 |
프로그래밍 언어 기초 3 (0) | 2023.05.29 |
프로그래밍 언어 기초 2 (0) | 2023.05.29 |