openlang

Tcl 임베딩은 문자열이 무엇인지 합의하는 일

Tcl을 임베드할 때 C 쪽 코드가 엽서 한 장에 다 들어간다는 게 정말 좋아요. Tcl_CreateInterp로 만들고, Tcl_EvalEx나 Tcl_EvalObjEx로 스크립트를 평가하고, Tcl_GetObjResult로 답을 읽으면 끝이에요. 넘어가는 건 전부 문자열이고, 문자열은 양쪽이 이미 합의한 유일한 타입이잖아요!

음, 거의요. Tcl_Obj는 문자열 표현을 갖고 있고, 다른 용도로 한 번 쓰이면 내부 표현도 하나 더 들고 있어요. 같은 값을 한 곳에서는 리스트로, 다음 곳에서는 숫자로 쓰면, 쓸 때마다 다른 쪽 내부 표현을 버리고 문자열에서 자기 표현을 다시 만들어요. 이게 shimmering이고, 프로파일에 찍히기 전까지는 보이지 않아요.

넘어가지 않는 게 하나 더 있어요. 스레드요. 인터프리터는 자기를 만든 스레드에 속해서, 호스트가 워커 풀에서 아무렇게나 불러 들어갈 수 없어요. (호스트 프로그램은 이걸 놀랄 만큼 빨리 잊어요.)

그러면 함수 이름 말고 뭐가 넘어가느냐. 텍스트, 그 텍스트가 지난번에 무슨 뜻이었는지에 대한 캐시, 그리고 스레드 정체성이에요. 셋 중 둘은 놓치기 쉬워요.

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    인터프리터를 BEAM 노드에 넣으면 목록에 네 번째 항목이 생겨요. 실패가 무엇을 함께 가져가느냐예요. NIF에서 부르면 인터프리터가 죽을 때 노드 전체가 같이 내려가고, 평가가 길어지면 그동안 스케줄러 스레드 하나를 붙잡고 있어요. 포트 뒤에 두면 인터프리터는 별도 OS 프로세스에서 살아요. 거기서 죽으면 포트가 닫히고, 다시 띄울지는 슈퍼바이저가 정해요. 본문의 스레드 규칙도 그쪽에서 더 지키기 쉬워요. 외부 프로세스가 자기 인터프리터를 온전히 소유하니까요.

같은 질문의 다른 갈래

  1. 다음 호출 전까지만 유효한 버퍼에 관한 메모

    C 라이브러리가 포인터와 길이를 돌려줍니다. 지금까지 아는 것. 단일 스레드 호출 순서라면 다음 라이브러리 호출 전까지 버퍼를 읽을 수 있고 유효합니다. 소유권 이전은 없습니다. 모르는 것. 다른 핸들이나 콜백, 백그라운드…