문제

나는 읽었다 Sebesta 책, 컴파일러는 대부분의 시간을 소스 소스 코드로 보냅니다. 따라서 구문 분석기와 달리 Lexer를 최적화하는 것이 필수적입니다.

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

구문 분석이 파생 과정을 의미합니다.

도움이 되었습니까?

해결책

첫째, 나는 그것이 실제로 사실이라고 생각하지 않습니다. 많은 컴파일러에서 대부분의 시간은 소스 코드에 소스에 소비되지 않습니다. 예를 들어, C ++ 컴파일러 (예 : G ++)에서 대부분의 시간은 시맨틱 분석, 특히 과부하 분해능 (수행 할 암시 적 템플릿 인스턴스를 찾으려고 시도)에서 지출됩니다. 또한 C 및 C ++에서 대부분의 시간은 종종 최적화에 소비됩니다 (개별 기능 또는 전체 번역 장치의 그래프 표현을 작성한 다음이 그래프에서 긴 알고리즘을 실행).

어휘 및 구문 분석을 비교할 때, 어휘 분석이 더 비싸다는 것이 사실 일 수 있습니다. 이는 주 머신을 사용하기 때문에 요소 당 고정 된 수의 동작이 있지만 구문 분석 (토큰)보다 어휘 분석 (문자)에서 요소의 수가 훨씬 큽니다.

다른 팁

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

foreach (x in o)

문자별로 문자를 읽습니다 - "F", "O"등.

어휘 분석기는 볼 수있는 키워드를 결정해야합니다 ( "foreach", "for"등이 있습니다.)

구문 분석이 발생할 때까지 프로그램 코드는 일련의 토큰입니다. 즉, 어휘 분석이 반드시 가장 시간이 많이 걸리는 프로세스는 아니며, 가장 큰 스트림을 가지고 있다는 위의 답변에 동의합니다.

그것은 당신이 렉싱과 구문 분석 사이의 선을 그리는 곳에 달려 있습니다. 나는 토큰이 무엇인지에 대한 견해를 매우 제한적인 경향이 있으며, 결과적으로, 내 파서는 렉싱보다 구문 분석에 더 많은 시간을 소비합니다.

렉싱이 비싸다는 것은 확실히 예전입니다. 그 중 일부는 제한된 메모리와 관련이 있으며 비트의 프로그램으로 읽기 위해 여러 파일 작업을 수행해야했습니다. 이제 메모리가 GB로 측정되었으므로 이것은 더 이상 문제가되지 않으며 같은 이유로 더 많은 작업이 수행 될 수 있으므로 최적화가 더 중요합니다. 물론 최적화가 많은 도움이되는지 여부는 또 다른 질문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top