8장 프로그래밍 언어 처리

young·2022년 8월 28일
0

📖 8장 keywords

  • 어셈블리 언어 / 어셈블러
    부트스트랩
  • 고수준 언어 / 컴파일러
    Fortran, 정수 변수 이름의 유래
  • 구조적 프로그래밍
  • 어휘 분석 (정규식 패턴 매칭), 문법 파싱, 파스 트리
  • 컴파일러와 인터프리터
  • 최적화

"프로그램을 기계에서 실행하기 위해 변환하는 방법"
"프로그램을 컴파일하거나 인터프리트 하는 과정"

어셈블리 언어

복잡한 비트 조합으로 명령어를 입력하는 대신 이해하기 쉬운 니모닉(mnemonics)을 통해 명령어를 입력할 수 있다.
주소에 레이블(label)을 붙일 수 있고, 코드에 주석을 달 수도 있다.

어셈블리 언어로 작성된 코드를 기계어 코드로 변환하는 프로그램을 어셈블러라고 한다.
어셈블러는 변환 과정에서 레이블이나 심볼의 값을 결정해 채워 넣는다.

컴퓨터의 발전 과정에서 프로그래머들은 어셈블러를 만들어 보다 나은 작업 환경을 구축할 수 있었고,
어셈블러에서 작동하는 어셈블러 언어를 통해 더 나은 어셈블러를 만들 수 있었고,
개선된 어셈블러 언어를 통해 다시 더 나은 어셈블러를 만들고... 이러한 개선의 흐름은 계속해서 이어졌다.

-> 이러한 과정이 부트스트랩이다.

컴퓨터 부팅 과정에서 작은 프로그램을 메모리로 읽어오고,
작은 프로그램을 통해 더 큰 프로그램을 불러오고,
더 큰 프로그램을 통해 운영체제를 불러온다.

초기 컴퓨터에서는 사람이 직접 부트스트랩 프로그램을 입력해야만 했다.

고수준 언어

고수준 언어는 어셈블리 언어보다 더 높은 추상화 단계에서 작동한다.

고수준 언어는 컴파일러에 의해 실행된다.
컴파일러는 소스 코드를 기계어로 컴파일 해준다.

초기의 고수준 언어 중 하나인 FORTRAN은 "식 변환기"를 줄인 말이다.
포트란은 어셈블리 언어보다 훨씬 단순하게 수식을 계산하는 프로그램을 쉽게 작성할 수 있었다.

포트란에서는 명시적으로 사용하려는 메모리를 선언하지 않고 I, J같은 변수를 사용하면 메모리가 할당된다.
이 영향으로 현재까지 다른 프로그래밍 언어에서도 정수 변수 이름으로 i, j, k, l, m, n을 사용한다.

포트란 이후에 등장한 언어로는 베이직 등이 있으며 대부분 포트란의 영향을 받아 만들어졌다.

구조적 프로그래밍

초기의 포트란과 베이직 언어는 비구조적 언어이다.
구조적 프로그래밍은 비구조적 언어의 스파게티 코드 문제를 해결하기 위해 개발됐다.

이후 등장한 프로그래밍 언어로는 파스칼, C 등이 있다.

어휘 분석

: lexical analysis

어휘 분석은 코드를 기호에서 단어와 비슷한 토큰으로 변환하는 과정이다.

또한 이름, 숫자, 연산자 등 토큰 유형에 따라 토큰을 구분해야 한다.

그 방법 중 정규식패턴 매칭에서 중추적 역할을 한다.
정규식 자체도 언어이기 때문에 서로 호환이 되지 않는 몇 가지 정규식 언어가 존재하기도 한다.

정규식은 왼쪽에서 오른쪽으로 처리되고, 백슬래시\를 통해 특별한 기능을 이스케이프 하는 등 여러 규칙이 있다.

문법 파싱

어휘 분석으로 단어를 모으면 이를 문법에 맞는 문장으로 분석해야 한다.
이후 언어를 처리할 수 있게 된다.

Parse Tree

고수준 언어는 컴파일할 수도 있지만, 인터프리트할 수도 있다.
이는 언어 설계 자체 보다는 구현에 따라 선택된다.

컴파일 언어는 소스 코드를 대상 기계에 맞는 기계어로 변환한다.
같은 프로그램에 대해 다른 컴파일러를 사용하여 다른 대상 기계를 위한 프로그램을 만들어낼 수 있다.

인터프리터 언어는 실제 기계를 위한 기계어 대신, 소프트웨어로 만들어진 가상 머신에서 실행된다.
일부 인터프리터 언어는 인터프리터에 의해 직접 실행되기도 한다.

컴파일된 코드는 기계어이기 때문에 대부분 더 빠르게 실행된다.

컴파일러나 인터프리터는 문법 파싱 이후 파스 트리(parse tree)를 구성한다.
파스 트리는 트리 형식의 데이터 구조다.

프론트엔드는 파스 트리를 구성한다.

입력 프로그램
➞ 프론트엔드 : 어휘 분석문법 파싱
➞ 미들엔드 : 파스 트리
➞ 백엔드 : 기계 1 & 기계 2 & 기계 3...

컴파일러

컴파일러는 인터프리터와 다르게 백엔드에 실행 코드 대신 코드 생성기가 들어간다.
코드 생성기는 특정 대상 기계에 대한 기계어 코드를 만든다.

입력 프로그램
➞ 프론트엔드 : 어휘 분석문법 파싱
➞ 미들엔드 : 파스 트리
➞ 백엔드: 코드 생성기어셈블리 언어어셈블러기계어

컴퓨터를 컴파일된 기계어로 실행하면 코드가 더 작고 효율적이다.
따라서 인터프리터로 실행할 때보다 훨씬 더 빠르게 실행된다.

최적화

파스 트리와 코드 생성기 사이에는 최적화 단계가 있다.
최적화기는 파스 트리를 분석하고 더 효율적으로 파스 트리를 변환한다.

profile
즐겁게 공부하고 꾸준히 기록하는 나의 프론트엔드 공부일지

0개의 댓글