2016-06-18 5 views
1

역 추적을 사용하는 재귀 적 파생어에서 모든 토큰을 목록에 보관하는 것은 좋지 않은 생각입니까? 무한한 수의 토큰이 없으면 좋은 접근 방법이라고 읽었습니다.하지만 큰 파일이 있고 토큰 수가 많으면 어떻게 될까요? 성능에 큰 영향을 줄까요?구문 분석 : 목록에있는 모든 토큰을 좋지 않게 생각하고 있습니까?

+0

FWIW는 일반적으로 프로그램의 텍스트 표현이 토큰 목록보다 크기 때문에 소스 코드를 RAM에 완전히로드 할 수 있으면 토큰 목록이 비교적 작아집니다. 즉, 코드가 RAM에 거의 들어 가지 않으면 단일 바이트를 추가해도 메모리가 폭발적으로 늘어날 수 있습니다. 그러나 이것이 기술적으로 문제가 될 수는 있지만 실제로는 거의 없다고 말할 수는 없습니다. 나는 이것이 실제로 문제가 될 때까지 이것에 대해 걱정할 때까지 기다릴 것입니다. – uliwitness

답변

2

너무 걱정하지 않아도됩니다. 파일이 너무 커서 한 번에 모든 토큰을 저장하면 상당한 양의 메모리가 필요하다면 추상 구문 트리도 너무 많은 메모리를 사용하게됩니다. 일반적으로 전체 파일의 표현을 조만간 메모리에 표시해야 할 가능성이 높습니다. 단일 패스 컴파일러는 대부분의 현대 언어에서 가능하지도 않으며, 단일 패스 컴파일러 (예 : C)를 사용하기 위해 방해가되는 언어는 개발 경험이 떨어지는 언어로 비용을 지불합니다.

또한, 우리는 C/C++ 스타일의 프리 프로세서 모델에 대해 얘기하지 않는 가정, 합리적인 코드 파일도 매우 공간 비효율적 토큰 데이터 형식이 현실적으로보고있는 것을 의미 메가 바이트보다 작은 더 이상은 수십 메가 바이트가 아닙니다. 큰 파일은 병리학 적이며 문제가 아닌 큰 파일을 쓰는 사람들의 문제입니다.

+0

의도 한 언어 사용을 고려해야합니다. 사람들은 10 억 라인 C 프로그램을 작성하지 않지만 일부 다른보다 조밀 한 언어에서 수십억 줄의 C 코드를 생성하는 코드 생성기가 있습니다. –

+0

@ChrisDodd C는 적당한 크기의 C 및 C++ 파일을 컴파일 할 때 #include에서 100k + 라인의 코드를 토큰 화하기 때문에 종종 이상한 예입니다. 또한 최신 C 컴파일러는 더 이상 단일 패스가 아니므로 10 억 라인의 코드를 쓰면 문자 그대로 기가 바이트의 메모리를 소비하게됩니다. – delnan

+0

@delnan : 그리고 수십억 개의 RAM이있는 PC를 구입하여 신용 카드를 거의 알아 채지 못했기 때문에 억 라인 C 프로그램을 매일 컴파일하는 경우 문제가되지 않습니다. (필자는 백만 줄의 C 소스 파일을 보았지만 [10 억 라인을 보지 못했습니다]). –

1

저는 @Delnan과 일반적으로 일치합니다. 어쨌든 대부분의 컴파일러는 컴파일되는 프로그램의 크기에 비해 방대한 양의 메모리가있는 시스템에서 실행되므로 공간이 문제가되지 않습니다.

만약 내가 당신이 전체 AST를 저장하려고한다면, 당신은 본질적으로 토큰리스트를 어쨌든 AST의 잎처럼 저장하고 있습니다.

방향을 제시합니다. 전체 토큰 목록을 단독으로 저장하지 마십시오. AST 잎을 표현하기 위해 AST 잎을 사용하기 만하면됩니다.

관련 문제