랑아
article thumbnail

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) 프로그래밍 언어별 특성

  1. FORTRAN
    • 1954년에 초기 버전에 개발된 언어로 시스템에 의존적이고, 프로그램 작성을 위해서는 컴퓨터 시스템 관련 지식이 많이 필요하다는 특징을 가지고 있음
    • 1977년 FORTRAN 77이 등장하였으나 그 이후에 등장한 언어와 비교하여 자료 구조가 제한적이었음
    • 재귀 함수, 구조체, 포인터 등은 제공되지 않았으며, FORTRAN 90이 등장하고 나서야 포함되었음
  2. COBOL
    • 1960년에 미국 국방성에 의해 개발
    • 단순한 입출력 구현 시에도 많은 형식적인 문장이 필요함
    • 프로그램 크기가 크고 구문이 복잡함
    • 순차적 방식의 언어로, 웹 응용 프로그램과 쉽게 통합할 수 있다는 장점이 있음
    • 자료 구조의 선언 부분과 프로그램의 실행 부분을 분리하였다는 특징이 있음
  3. PASCAL
    • 1971년 개발되어 1980년대 말까지 많이 쓰인 언어
    • 잘 짜인 구조와 간결성으로 인해 프로그래밍 언어로써 성공하였으나, 분리 컴파일과 문자열의 적절한 처리 등을 제공하지 못했음
    • 사용자 정의 추상화 기능은 제공하나 정보 은닉 기능이 없어 현대의 프로그래밍 기법을 적용하기에는 다소 부족하다는 단점이 있음
  4. C언어
    • 1972년에 개발된 언어로, UNIX 운영체제 구현에 사용되는 언어
    • 범용 언어로 개발되었으나 문법의 간결성, 효율적 실행, 효과적인 포인터 타입 제공이라는 특징으로 인해 가장 많이 사용되는 시스템 프로그래밍 언어
  5. C++
    • C언어를 발전시킨 언어로 클래스, 상속 등을 제공하는 객체지향 프로그래밍 언어
    • 대형 프로젝트 수행 시 모듈별 분리가 가능하여 개발과 유지 관리에 적합함
  6. Java
    • C++에 비해 단순하고 분산 환경 및 보안성을 지원함
    • Java 언어는 컴파일을 거쳐야 함
    • 컴파일을 통해 생성된 Class 파일을 가상 머신을 통해 실행해야 함
  7. JavaScript
    • 1995년에 개발된 객체기반 스크립트 언어로 웹 페이지 동작을 구현할 수 있음
    • 빠른 시간에 코드를 완성할 수 있고 확장성이 좋으며 배우기 쉽다는 장점이 있음
    • 보안이나 성능이 다른 언어에 비하여 부족하다는 단점이 있음
  8. Perl
    • 텍스트 처리에 주안점을 두고 개발된 인터프리터 언어로 CGI용으로도 많이 사용됨
    • 변수를 명시적으로 선언할 필요가 없음
    • 모든 변수가 지정되지 않았을 경우에는 기본 초기 값을 가짐
  9. Python
    • Guido van Rossum이 개발한 언어로 영국의 6인조 코미디 그룹인 몬티 파이썬에서 언어 명칭을 붙임
    • 문법이 매우 쉬워서 초보자들이 입문하기 쉬운 언어
    • 배우기 쉽고 이식성이 좋은 언어
    • 다양한 함수들도 많이 제공되어 스타트업과 글로벌 기업에서도 많이 사용함
    • Perl 언어처럼 인터프리터 언어이면서 객체지향 언어, 스크립트 언어
    • 객체를 생성하고 사용할 수 있는 객체지향 언어
    • 시스템 프로그래밍, 하드웨어 제어 등을 제외하고 거의 모든 기능을 수행할 수 있는 언어
    • Python은 C언어로 구현되었기 때문에 CPython이라고도 함
    • 동적 타이핑을 지원하는 인터프리터 방식의 언어
      • 동적 타이핑 : 변수 타입 선언 없이 기억시키려는 상숫값의 타입에 따라 변수 타입이 정해지는 방식으로 변수 타입이 실행 시에 정해짐
    • Javascript처럼 스크립트 형태로 사용하는 Brython도 있음
  10. C#
    • 2000년에 .NET 환경에 맞춰 설계된 언어
    • C언어와 C++의 발전된 형태로, Visual Basic과 같이 사용자 인터페이스를 쉽게 만드는 컴포넌트 기능을 제공하기도 함
    • .NET 환경에서 실행되기 때문에 .NET 환경이 설치되어야 함
    • C# 컴파일러를 필요로 함
  11. GOLANG
    • 2009년 Google에서 만든 언어로 짧게 GO라고도 부름
    • C언어와 직접적인 연관을 가지고 있으며, 내장 라이브러리를 많이 지원함
    • if, for, switch 등과 같이 C언어와 유사한 제어 구조를 가지고 있음
    • 하드웨어 사양이 낮더라도 빠른 컴파일이 가능함
  12. DART
    • Javascript와 Java의 영향을 받아 개발됨
    • 객체지향 언어
    • 백그라운드에서 작동한다는 점에서 Javascript와 차이를 가지고 있음
    • Javascript와 유사하지만 복잡하지 않고 단순함
    • 별도의 라이브러리 설치 없이 HTML 페이지를 수정할 수 있음
  13. CEYLON
    • Java에 기반을 둔 언어
    • 코드를 패키지와 모듈로 정리하여 가상 머신에서 컴파일을 수행함
    • CEYLON Herd라는 저장소에서 모듈을 발행함

2. 프로그램 수행 순서

  1. 프로그램 수행 순서(컴파일러 순서)
    • 원시 프로그램 -> 컴파일러 -> 목적 프로그램 -> 링커 -> 로더 -> 실행
  2. 프로그램 수행 단계별 작업 내용
    • 원시 프로그램 : 프로그래머에 의해 작성된 프로그램
    • 컴파일러 : FORTRAN이나 C언어로 작성된 원시 프로그램을 기계어로 번역함
    • 목적 프로그램 : 기계어로 번역된 프로그램
    • 링커 : 여러 개의 목적 파일을 하나의 프로그램으로 연결함
    • 로더 : 프로그램이 실행될 수 있는 환경을 설정하고 프로그램을 주기억 장치에 적재함
    • 실행 : CPU에 의해서 프로그램이 실행됨
profile

랑아

@RangA

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!