https://solidity.readthedocs.io/en/v0.4.24/
문서를 읽고 있는데 문득 Solidity는 어떻게 만들었을까? 생각이 들어서 찾아보기로 했습니다.
찾아보니 Solidity는 컴파일러가 어떻게 어휘 구문 의미분석을 하느냐에 따라서 문법이 결정되는것 이였습니다.
번역기의 종류
소스프로그램 > 번역기 > 목적프로그램
어셈블리어 > 어셈블러 > 기계어 프로그램
고급언어 > 컴파일러 > 어셈블리어 or 기계어
고급언어 > 프리프로세서 > 고급언어
고급언어 > 인터프리터 > 실행결과
어셈블러
LOAD R1,a //a를 R1레지스터에 로드한다.
ADD R1, #2 //R1레지스터의 값에 +2를 한다.
STORE b, R1 //R1레지스터값을 b에 넣는다.
b = a + 2를 계산하는 코드
프리프로세서
코볼언어로 작성되었는데 코볼 컴파일러가 없고 C컴파일러가있을경우 코볼언어를 C언어로 변환해주는 프리프로레서로 코볼을 C로 바꿔고 C를 컴파일하여 사용가능하다
인터프리터
컴파일러 기법은 인터프리터보다 실행속도 10배이상 빠름
인터프리터는 한줄 단위로 번역과 실행하여 반복문일때 실행시간이 많이 늘어남
반만 한줄 단위로 실행되기 때문에 매번 같은 메모리를 사용하여 메모리를 줄일수있는 장점이 있음
인터프리터 처리과정
컴파일러란
특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 프로그램을 말한다.
원래의 문서를 소스 코드 혹은 원시 코드라고 부르고, 출력된 문서를 목적 코드라고 부른다.
목적 코드는 주로 다른 프로그램이나 하드웨어가 처리하기에 용이한 형태로 출력되지만 사람이 읽을 수 있는 문서 파일이나 그림 파일 등으로 옮기는 경우도 있다.
원시 코드에서 목적 코드로 옮기는 과정을 컴파일(번역)이라고 한다.
요약: 어떤 프로그래밍 언어로 쓰여진 소스 파일을 다른 언어로 바꾸어주는 번역 프로그램.
컴파일러 구조
어휘 분석기
소스코드를 정규문법에 따라 토큰으로 분류하는걸 어휘분석기라고 합니다.
예를들어
'여긴 어딘가. 나는 누구인가?'
'ㅇ' 'ㅕ' 'ㄱ' 'ㅣ' 'ㄴ'로 나누면 아무런 의미가 없지만
여긴은 의미를 갖게 됩니다. 의미있는 조각을 어휘항목이라고 하며 소스코드에서 이러한 어휘항목을 검출하여 토큰을 생성하는 역할의 하는게 어휘분석기라고 합니다.
요약하면 예약어, 연산자, 상수, 프로그래머가 정의한 식별자, 괄호 쉼표 세미클론등을 토큰테이블에 올려둡니다.
구문분석기
어휘분석기에서 만든 토큰스크림이 생성가능한것인지 판별하고 토큰스크림에서 파서트리(parse tree)를 생성합니다.
토큰스크림을 받아서 주어진 문법이 맞는지 검사하여 문장이 맞을경우 파스 트리에 출력하고 올바르지 않으면 에러를 던집니다.
의미분석기
구문 트리와 기호표에 있는 정보를 이용하여 소스프로그램이 언어 정보에 의미적으로 일치하는지 검사하고 중간코드 생성에 이용하기 위해 자료형 정보를 수집하여 구문 트리나 기호표에 저장합니다.
이곳에서 가장 중요한 일은 형식 검사입니다.
int string형의 각각 1 + '한글'를 한다면 서로 다른 형이 연산하게 되는것인데 컴파일러에 따라 에러를 낼지 형변환하여 연산을 진행할지 이곳에서 결정됩니다.