문제

간단한 프로그래밍 언어의 통역사를 개발하고 있습니다.

  1. 거기 있습니다 트리 구조화 된 동적 데이터, 각 데이터 노드에 연관된 (소유)가있는 곳 타입 객체.
  2. ListType, StructType 등의 여러 종류가 있습니다. typeref. Typeref에는 일부 콘크리트 유형을 나타내는 이름 (문자열)이 있습니다.
  3. (거의) 글로벌 맵 (사전)이 있습니다. 환경 - (std::map<string, Type*>) 유형 이름을 유형-개체로 변환합니다.

문제는 여러 프로그램이로드 될 수 있고 각 프로그램이 동일한 이름과 관련된 다른 유형을 가질 수 있다는 것입니다. 이 단일 가정은 하나의 글로벌 (정적) 환경을 갖는 것이 불가능합니다. 그렇지 않으면 완벽한 솔루션이 될 것입니다.

따라서 환경의 맥락에서 모든 작업을 수행하기 위해서는 각 유형의 환경에 대한 포인터 (#1) (#1) (예 : 첫 번째 인수로서 어디서나 제공함으로써)를 수행하기 위해서는 (#1) (#2)가 필요하다고 생각합니다.

내가 보는 문제 :
(#1) 모든 연결된 데이터 노드가 동일한 환경을 갖기 때문에 정보 중복성. 환경은 엄격하게 별도의 데이터에 대해서만 다릅니다.
(#2) 서브 루틴으로 환경을 많은 사소한 통과로 코드를 난독 화합니다.

이 문제가 내가 부를 일반적인 패턴과 일치하는 것 같습니다. 거의 정적 데이터. 어떤 아이디어라도 최고의 솔루션은 무엇입니까?

도움이 되었습니까?

해결책 3

스레드-로컬 스토리지를 사용한다는 아이디어는 흥미롭지 만 마침내 다른 솔루션으로 끝났습니다.

나는 두 단계로 유형을 사용합니다. 먼저 그들은 모두 생성 된 다음 "컴파일"됩니다. 편집에는 환경이 필요하지만 한 번만 수행됩니다. 모든 유형 이름을 적절한 유형 객체로 변환하는 것으로 구성됩니다. 편집 후 환경이 더 이상 필요하지 않습니다.

그럼에도 불구하고, 나는 그것이 일반적인 솔루션보다 여전히 해결 방법이라고 생각합니다.

다른 팁

환경을 분리하는 것은 무엇입니까? 실행 컨텍스트 인 경우 (컨텍스트의 개체는 동일한 컨텍스트에서만 호출하는 개체) 환경 당 하나의 스레드를 사용하고 스레드-로컬 스토리지 (또는 키가있는 글로벌 맵에 "로컬 글로벌"을 저장할 수 있습니다. 스레드 ID).

이것은 몇 가지 단점이 있습니다. 우선, 교차 컨텍스트 호출이있는 경우 작동하지 않습니다. 그리고 물론 그것은 당신을 나사산 모델로 강요합니다.

콘크리트 유형을위한 글로벌 1 개, 하나는 Typerefs 용으로 2 개의 유형 저장소를 원할 수 있습니다. 로컬 스토리지는 현재 구문 분석되고있는 프로그램의 맥락에 적용되어야합니다.

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