프로그래밍 언어론 (chapter4-1)

Chapter4 프로그래밍 언어의 구문과 구현 기법

구문은 프로그래밍 언어의 구조를 의미

프로그래밍 언어의 정의 -> 언어 구문 + 언어 의미로 구성

4.1 언어 구문

오늘날 컴퓨터 대부분 -> 두 개의 문자 코드계를 사용

  1. IBM에서 제안한 EBCDIC(extended binary coded decimal intercahnge code) -> 8비트
  2. ANSI에서 제안한 ASCII 코드 -> 7비트

프로그래밍 언어의 어휘 구조는 프로그래밍 언어 알파벳 문자로 구성된 단어 즉 어휘 토큰이다.

번역기는 일반적으로 어휘 분석 단계에서 입력 프로그램의 일련의 문자들을 토큰으로 구분하고, 구문 분석 단계에서 이를 처리하여 구문구조를 결정한다.

한 개 이상의 어휘 토큰을 가지고 구문적으로 허용된 프로그램의 일부 구조를 언어구성자라고 한다. 이러한 언어 구성자를 부르는 이름이 식별자라는 토큰이다.

번역 과정의 속도 향상, 프로그램 신뢰성 향상을 위해 프로그래밍 언어는 일부 식별자를 미리 정의하여 사용. 정의된 식별자 중 일부를 재 정의할 수 없도록 정의하여 사용 -> 이를 예약어라고 한다. ex) c에서는 if, while, int 등 32개의 예약어가 있으며, scanf, printf, strcnp #define 등은 예약어가 아닌 미리 정의된 식별자로 간주

문맥 자유 문법과 BNF

구문 형식을 정의하는 가장 보편적인 기법 -> BNF 표기법 Algol 60 구문을 정의할 때 최초로 사용

BNF -> 생성 규칙들의 집합

이후 생략

4.2 프로그래밍 언어 구현 기법

4.2.1 번역기법

번역 기법 : 주어진 고급 프로그래밍 언어로 구성된 프로그램을 실제 주어진 컴퓨터의 기계어로 번역하여 동등한 의미의 기계어 프로그램을 만들어 실행시키는 방법.

번역기 -> 어떤 원시언어로 작성된 프로그램을 입력으로 읽어들여서 목적 언어로 된 기능이 동등한 프로프로그램을 출력해주는 언어 처리기로 정의한다.

  • 컴파일러 -> 원시 언어가 고급 언어, 목적 언어가 실제 기계 언어에 가까운 저급 언어인 번역기이다.

  • 어셈블러 : 어셈블러는 컴파일과 같이 목적 언어가 준기계어 형태이나 원시 언어가 어셈블리 언어인 번역기이다. 어셈블러에서는 어셈블리어 하나가 하나의 기계어 명령으로 단순 번역되는 경우가 대부분이다.

  • 링커 : 재배치 형태의 기계어로 된 여러개의 프로그램(대부분의 경우 각각 컴파일 된 목적 코드와 라이브러리 프로그램)을 묶어서 로드 모듈이라는 어느 정도 실행 가능한 하나의 기계어로 번역해주는 번역기이다.

  • 로더 : 로더는 로드 모듈로 된 기계어 프로그램을 어느 정도 실행 가능한 하나의 기계어로 번역해서 주기억 장치에 적재하게 된다.

  • 프리프로세서 : 원시 언어과 목적 언어가 모드 고급 언어인 번역기. 한 고급 언어로 작성된 프로그램을 그에 대응되는 다른 고급언어로 번역해서, 그 출력된 고급 언어를 이미 구현된 방법으로 실행시킬 때 사용한다.

4.2.2 인터프리터 기법

고급 언어를 기계어로 취급하는 컴퓨터를 가상하여 주어진 컴퓨터에서 시뮬레이션하여 실행시키는 방법도 있다. 이 고급 언어를 기계어로 하는 컴퓨터를 정의하는 알고리즘과 자료 구조를 시뮬레이션 하여 수행하는 프로그램은 주어진 컴퓨터의 기계어로 되어있다. 다시 말하면 고급 언어를 기계어로 하는 컴퓨터를 하드웨어로 구성하는 대신에 이 고급 언어 기계를 다른 기계에서 실행되는 소프트웨어로 시뮬레이션 하여 구성하는 방법으로서 인터프리터 기법이라 부른다.

4.2.3 인터프리터 기법과 번역 기법

둘 다 고급 언어로 된 프로그램을 입력으로 받아들이지만, 번역기는 단지 그 입력 프로그램과 동일한 목적 언어로 된 프로그램을 출력. 인터프리터는 직접 그 입력 프로그램을 실행시키는 것

번역기 -> 입력 프로그램의 매 문장을 입력된 순서대로 처리 인터프리터 -> 그 입력 프로그램의 논리적 순서에 따라 문장들을 처리. (순환 부분 등은 계속 반복처리 해야함)

컴파일러 언어 : 고급 언어를 번역하여 목적 모듈을 출력시켜서 그 목적 모듈을 링크, 로드하여 실행시키는 방법으로 구현하는 언어를 컴파일러 언어라 부른다.

인터프리터 언어 : 고급 언어를 적당한 중간 코드까지만 번역해서 곧바로 실행시키는 방법을 택하는 언어를 인터프리터 언어라고 부른다.

하이브리드 구현 기법: 많은 경우 프로그래밍 언어는 번역 기법과 시뮬레이션 기법을 함께 사용. 프로그램을 좀더 실행시키기 쉬운 형태로 번역한 후, 그 번역된 형태의 프로그램을 디코드해서 시뮬레이션을 실행한다. 이러한 기법은 주로 인터프리터 기법에 속하지만, 이 기법을 하이브리드 기현 구법이라고도 한다.

번역기법과 시뮬레이션 기법의 장단점

번역 기법의 장점 :-> 매우 간결, 효율적. 반복문이나 계속 호출되는 부프로그램처럼 많은 횟수로 반복 처리되는 프로글매을 실행할 때 번역 기법이 가장 큰 장점을 갖는다. 즉 이 경우 인터프리터 기법 같으면 매번 처리할 때마다 형 검사 등 많은 작업을 수행하면서 시뮬레이션을 해야한다.

번역 기법의 단점 :-> 한 줄의 원시 프로그램이 때로는 몇 백개의 기계어 명령으로 번역되기 때문에 때로는 번역된 프로그램이 매우 큰 기억 장치를 요구한다. 특히 입출력 명령문들은 입출력 FORMAT을 위한 코드 외에 기계 상태 파악 코드와 버퍼 등으로 인하여 더욱 큰 기억 장치를 요구. 이런 경우 라이브러리 루틴 등을 이용하여 시뮬레이션 기법으로 처리하면 효율적이다. 프로그램이 실행될 떄 까지 원시 언어의 형태를 유지하기 떄문에 기억 장소는 추가로 필요하지 않으나 실행되는 동안에 디코딩하는 시간을 매우 많이 요구할 경우가 발생. 시뮬레이션 기법은 매 실행마다 형 검사 등을 수행하기 때문에 실행 중에 자료와 동적 변화나 사용자와의 대화가 쉬워 유현성 높은 언어 구현에 편리하다

그러므로 번역 기법은 기계어 번역이 쉽게 이루어질 수 있으면서, 기억 장소를 특별히 많이 요구하지 않고, 기계의 실행 시간을 중시하는 경우에 사용. 그 반대의 경우에는 시뮬레이션 기법이 사용. 결과적으로 실행 시간의 효율을 중시하는 프로그램이 언어에서는 주로 번역 기법을. 사용자의 유연성을 즁시하는 언어에서는 주로 시뮬레이션 기법을 사용한다.

JAVA -> 바이트코드라 부르는 중간 언어가 거의 기계어 수준, 한번 바이트 코드로 번역된 것을 다시 번역하지 않고 계속 사용하기에, JAVA 컴파일러라 부르지만, 호환성을 갖게 하려고 중간 언어의 실행을 하드웨어 인터프리터가 아닌 소프트웨어 인터프리터가 행하므로 하이브리드 구현 기법을 택한 것이라고 볼 수 있다.


참고자료

프로그래밍 언어 개념 - 원유헌 저

0%