7

LLVM을 네이티브 코드 생성기로 사용하여 Erlang의 경량 프로세스 ("녹색 스레드")를 지원하는 동시 언어를 설계하고자합니다. 경량 프로세스는 네이티브 OS 쓰레드에 M : N 형식으로 할당되고, 쓰레드 간의 작업 도용이 가능해야한다 (즉, 프로세스는 필요할 경우 쓰레드간에 전달 될 수있는 데이터 구조로 표현되어야한다). 한 번에 매우 많은 수의 프로세스가 존재할 수 있으므로 프로세스가 많은 메모리를 차지하지 않아야하며 프로세스 간의 컨텍스트 전환이 가능한 한 빨리 이루어져야합니다. 또한 컨텍스트 전환 중에 또는 가비지 콜렉션이 발생하는 경우 경량 프로세스를 "일시 중지"하는 것이 더 간단해야합니다. Erlang이 LLVM 백엔드를 가지고 있다는 것을 이해합니다. 그러나 구현에 관한 정보는 거의 찾을 수 없습니다. 누군가가 이것이 가능할 수있는 방법을 설명 할 수 있습니까?LLVM은 "친환경 스레드"/ 경량 프로세스 구현을위한 모든 기능을 제공합니까?

+0

스텍 스택이 필요할 수 있습니다. GCC는 그것들을 가지고있다. 그래서 아마 LLVM도있다. –

답변

0

저는 LLVM 또는 Erlang과 관련하여 특별한 경험이 없습니다.

하지만 필자는 PARLANSE라는 프로그래밍 언어에서 이러한 시스템을 구현했습니다. 예, 컨텍스트 스위치를 저렴하게 만드는 것은 어렵습니다. 이것

자세한 내용은 SO 답 : 나는 LLVM의이 https://stackoverflow.com/a/999610/120163

무엇 약간의 지식이 어려울 수 있습니다 제안합니다. 무슨 생성해야 컨텍스트 전환 코드입니다. LLVM이 직접 을 지원하는지 잘 모르겠습니다. 순수 C 코드를 생성 할 때 쉽게 할 수있는 것은 아닙니다. 왜냐하면 언어 기본 요소가 컴퓨터/스레드 상태를 잘 처리 할 수 ​​없기 때문입니다.

그가 C 플러스 14 기능을 지원하려고 시도 할 때 Clang이 여기에 뒤섞인다면 반드시 이 "C++ 기본"스레드로 넘어 가지 않으면 안됩니다. 이를 가능하게하는 컨텍스트 스위칭 지원이 있어야합니다. 따라서 누군가가 이미 문제를 해결했거나 이미 해결했기 때문일 수 있습니다.

0

LLVM은 이러한 유형의 시스템을 구현하는 것과 직접 관련이 없습니다. LLVM의 IR보다 낮은 구조의 언어에 대한 많은 프론트 엔드가 있습니다.

LLVM은 단일 스레드 실행을위한 원시 코드를 생성하는 컴파일러 기술입니다. 컨텍스트 스위칭을 구현하거나, 스택을 적절히 설정하는 것 (선인장 스택 또는 기타 기술) 및 기타 관심사는 주로 런타임 및 환경의 책임입니다.

한 가지 예외는 필요에 따라 스택을 확장하기위한 런타임 호출의 합성을 지원하고 잠재적으로 스택을 비 인접 영역으로 분할하는 것입니다. 코멘트에 표시된 바와 같이, LLVM은 테스트가 잘되지 않았지만이를 지원합니다. 그러나 프론트 엔드는 스택의 사용을 제어하여 LLVM에서 어떤 지원도 필요로하지 않도록합니다.