3

Sebesta book에서 컴파일러는 대부분의 시간을 소스 코드에 사용합니다. 그러므로 구문 분석기와 달리 렉서를 최적화하는 것이 필요합니다.컴파일러는 파싱하는 동안 대부분의 시간을 어디에 소비합니까?

이것이 사실이라면 일반적으로 구문 분석보다 어휘 분석 단계에 많은 시간이 걸리는 이유는 무엇입니까?

구문 분석을 통해 파생 프로세스를 의미합니다.

+0

둘 다 왜 최적화하지 않습니까? – bbqchickenrobot

답변

7

처음에는 사실이라고 생각하지 않습니다. 많은 컴파일러에서, 대부분의 시간은 소스 코드를 렉싱하는데 소비하지 않습니다. 예를 들어, C++ 컴파일러 (예 : g ++)에서는 의미 론적 분석, 특히 과부하 해결 (수행 할 암시 적 템플릿 인스턴스화를 찾으려고 노력)에서 대부분의 시간을 소비합니다. 또한 C 및 C++에서 대부분의 시간은 최적화에 소요됩니다 (개별 함수 또는 전체 번역 단위의 그래프 표현을 만든 다음이 그래프에서 긴 알고리즘을 실행하는 경우).

어휘 분석과 구문 분석을 비교할 때 어휘 분석이 비용이 많이들 수 있습니다. 두 가지 모두 상태 시스템을 사용하기 때문입니다. 즉, 요소 ​​당 고정 된 수의 작업이 있지만 구문 분석 (토큰)보다 어휘 분석 (문자)에서 요소 수가 훨씬 큽니다.

+0

필자는 전혀 확신 할 수는 없지만 어휘 토큰 유형 (예 : 100 개의 토큰 유형과 비교했을 때 2^16의 가능한 문자 값)이있는 다양한 문자 값도 있습니다. – ChrisW

+0

또한, 특정 토큰이 주어진다면 합법적으로이 토큰 유형을 따를 수있는 토큰 유형이 매우 적습니다 (아마도 하나의 토큰 유형 만있을 수도 있습니다). 즉, 구문 분석기의 각 토큰에 대한 switch 문은 렉서의 각 문자에 대한 switch 문보다 훨씬 적은 수의 사례를 포함합니다. – ChrisW

1

어휘 분석은 소스 코드의 모든 문자가 토큰으로 변환되는 프로세스입니다. 예를 들어

foreach (x in o) 

은 문자로 문자를 읽기 - "F", "O"등

키워드를 결정해야하는 어휘 분석기는 없다 "에 대한"등 ("foreach는"을 들키지

)

구문 분석이 발생할 때까지는 프로그램 코드가 일련의 토큰에 불과합니다. 즉, 어휘 분석이 반드시 가장 많은 시간을 소비하는 프로세스는 아니며 가장 큰 작업 흐름을 가지고 있다는 점에서 위의 대답에 동의합니다.

0

정말 어휘와 구문 분석 사이에 선을 그 으려는 위치에 따라 다릅니다. 필자는 토큰이 무엇인지에 대한 제한된 견해를 가지고있는 경향이 있습니다. 결과적으로 파서는 렉싱보다는 구문 분석에 더 많은 시간을 소비합니다. 빠르기 때문에가 아니라 단순히 작업을 덜기 때문입니다.

0

필자는 렉 싱이 비싸다는 것은 틀림없이 사실이었습니다. 그 중 일부는 제한된 메모리와 관련이 있고 여러 파일 작업을 수행하여 프로그램 비트로 읽어야했습니다. 메모리가 GB로 측정되었으므로 더 이상 문제가되지 않으며 동일한 이유로 더 많은 작업을 수행 할 수 있으므로 최적화가 더 중요합니다. 물론 최적화가 많은 도움이되는지 여부는 또 다른 질문입니다.

관련 문제