Home 8장 프로그래밍 언어 처리
Post
Cancel

8장 프로그래밍 언어 처리

어셈블리 언어

초기에는 컴퓨터 프로그래머들이 프로그램의 각 명령에 대한 비트 조합을 하나하나 알아내야 했다. 그래서 프로그램을 작성하는 더 나은 방법을 고안해내기 위해 나타난 것이 어셈블리 언어이다.

어셈블리 언어를 사용하면 프로그래머가 모든 비트 조합을 외우지 않고 이해하기 쉬운 mnemonics을 통해 명령어를 쓸 수 있다. 그리고 주소에 이름(label)을 붙일 수 있고, 코드에 주석을 달아서 다른 사람들이 프로그램을 더 쉽게 읽고 이해하도록 도와줄 수 있다. 이런 어셈블리 언어를 기계어 코드를 생성해 주는 프로그램을 어셈블러라고 부르고 어셈블러는 레이블이나 심볼의 값을 결정해 채워 넣어준다.

고수준 언어

고수준 언어는 어셈블리 언어보다 더 높은 추상화 단계에서 작동한다. 고수준 언어의 소스 코드는 컴파일러라는 프로그램에 의해 실행된다. 컴파일러는 소스코드를 기계어로 번역(컴파일)해준다. 대표적으로 포트란, 베이직 등이 있다.

구조적 프로그래밍

포트란, 베이직 언어는 비구조적 언어라고 불린다. 구조적 프로그래밍은 스파게티 코드 문제를 해결하기 위해 개발됐다. 대표적으로 C, 파스칼, 자바 등이 있다.

어휘 분석

어휘 분석은 코드를 기호로부터 단어와 같은 성격의 토큰으로 변환하는 과정이다.

1) 상태기계

상태로 이뤄진 집합과 한 상태에서 다른 상태로 전이되는 원인의 목록으로 이뤄진 상태 기계로 만들 수 있다.

2) 정규식

언어를 지정하기 위한 언어를 정의하는 방법으로 정규식이 나타났다. 정규식은 패턴 매칭에서 중추적 역할을 한다.

단어에서 문장으로

언어를 처리하려면 어휘 분석만으로 충분하지 않다. 여러 단어를 모아서 어떤 문법에 맞는 문장으로 분석할 필요가 있다. 예를 들어 1+2, a=5는 문법에 맞지만 1+++2는 문법에 맞지 않는다. 패턴 매칭이 필요한데 문자 시퀀스에 대한 패턴 매칭이 아니고 토큰으로 이뤄진 시퀀스에 대한 패턴 매칭이 필요하다.

yacc 프로그램은 스택을 사용하는 시프트-리듀스 파서다. 시프트는 토큰을 스택에 넣는다는 뜻이고 리듀스는 스택의 맨 위부터 매치된 토큰들을 스택에 넣는다는 뜻이고, 리듀스는 스택의 맨 위부터 매치된 토큰들을 다른 어떤 것으로 대치한다는 뜻이다.

누구나 프로그래밍 언어를 만들 수 있는 시대

파스 트리

고수준 언어를 실행하는 방법이 컴파일만 있지는 않다. 고수준 언어를 컴파일할 수도 있지만 인터프리트할 수도 있다. 인터프리터는 컴파일과 다르게 실제 기계에 사용할 기계어를 만들어내지 않는다. 대신 가상 머신에서 실행된다. 일반적으로 컴파일이 된 코드는 기계어이기 때문에 더 빠르게 실행된다. 마치 영어책을 한국어로 번역하는 것과 같다. 인터프리터에 의해 실행되는 코드는 마치 누군가 영어로된 책을 보면서 한국어로 즉시 번역해 읽어주는 것처럼 수명이 짧다.

일반적으로 컴파일러나 인터프리터는 파스 트리를 구성한다.

인터프리터

컴파일러

코드 생성기는 특정 대상 기계에 대한 기계어 코드를 만들어 낸다.

최적화

대부분의 언어 도구에는 최적화기라는 추가 단계가 파스 트리와 코드 생성기 사이에 들어간다. 최적화기는 파스 트리를 분석하고 이 결과를 활용해 더 효율적인 코드를 생성해내도록 파스 트리를 변환한다.

하드웨어를 다룰 때 주의하라

This post is licensed under CC BY 4.0 by the author.

7장 데이터 구조와 처리

9장 웹 브라우저