- 어셈블리 언어
프로그래머들이 비트조합을 외우지 않고 이해하기 쉬운 니모닉을 통해 명령어를 쓸 수 있다.
주소에 이름label을 붙일 수 있고 코드에 주석을 달 수도 있다.
어셈블리 언어로 작성된 코드를 읽어서 기계어 코드를 생성해주는 프로그램을 어셈블러라고 부른다.
어셈블러는 변환과정에서 레이블이나 심볼의 값을 결정해 채워 넣어준다.


- 고수준 언어
고수준 언어는 어셈블리 언어보다 더 높은 추상화 단계에서 작동한다.
고수준 언어의 소스 코드는 컴파일러라는 프로그램에 의해 실행된다.
컴파일러는 소스코드를 기계어(목적코드)로 번역compile 해준다.


- 구조적 프로그래밍
GOTO(명시적인 분기)와 레이블을 조합할 때 아무런 구조를 강요하지 않는 
포트란이나 베이직을 비구조적 언어라고 부른다.
구조적 프로그래밍은 잘못된 GOTO사용으로 인해 발생할 수 있는 
스파게티 코드 문제를 해결하기 위해 개발됐다.


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


- 상태기계
입력에서 언어 토큰을 안정적으로 추출하기 위해 사용한다.


- 정규식
언어를 지정하기 위한 언어이다.
유닉스 grep유틸리티 명령globally search a regular expression and print에서 출발하였다.
정규식은 패턴 매칭에서 중추적인 역할을 한다.


- 단어에서 문장으로
언어를 처리하기 위해선 단어token를 모아 어떤 문법에 맞는 문장으로 분석할 필요가 있다.
오늘날에도 여전히 쓰이는 yacc 프로그램은 시프트-리듀스 파서이다.
상태 테이블을 만들고, 이 테이블을 사용해 작동하는 코드를 생성해준다.(컴파일)
시프트는 토큰을 스택에 넣는 다는 뜻이고, 
리듀스는 스택의 맨 위부터 매치된 토큰들을 다른 어떤 것으로 대치한다는 뜻이다.


- 파스트리
고수준 언어를 컴파일 할수도 있지만, 인터프리트 할 수도 있다.
인터프리트냐 컴파일이냐 선택은 언어 설계 자치보다는 구현에 의해 이뤄진다.

컴파일언어는 프로그램을 컴파일하여 기계코드를 만들어 낸다. 컴파일 이후에 실행할 준비가 된다.
인터프리터언어는 가상머신에서 실행된다.

일반적으로 컴파일러나 인터프리터는 파스트리를 구성한다.
파스트리는 언어문법으로부터 만들어낸 DAG(유향 비순환 그래프) 데이터 구조이다.

https://m.blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=qfqf8505&logNo=221390581784&categoryNo=27&proxyReferer=

- 인터프리터
프론트엔드는 파스트리를 만든다.
파스트리는 어떤 중간 언어로 표현된다.
백엔드는 이 언어를 실행할 대상환경마다 하나씩 존재한다.


- 컴파일러
인터프리터와 유사하지만,
백엔드 실행 코드 대신 코드 생성기가 들어간다.
코드 생성기는 특정 대상 기계에 대한 기계어 코드를 만들어 낸다.


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

- 하드웨어를 다룰 때 주의하라
하드웨어를 조작하는 코드를 최적화하면 예기치 못한 문제가 발생할 수도 있다.

+ Recent posts