uC++라고, 울 학교 교수가 만든게 이씀.
이름에서 보이듯이 C++ 확장이임.
근데 기능이 참 가지가지 있다능 ㅡㅡ)
1) Sequel
일종의 루틴. 코드블럭 내부에서 선언 가능.
호출하면 내부 코드를 실행한 후, 리턴하지 않고 속한 코드블럭에서 강제로 빠져나옴.
일종의 예외처리 기능.
{
sequel StackOverflow{ ... } // handler
class Stack {
...
void push(int a) { ... if(...) StackOverflow(); ... }
...
}
}
2) Resumption
throw의 변형. 예외처리 후 예외가 발생한 곳으로 되돌아 올 수 있음.
이 언어에만 있는 특이한 기능은 아니고, 옛날 옛적에 이미 논문이 나왔을 정도의 일반적 개념임.
원리는 exception handler를 찾을 때 스택을 정리하지 않고 보존.
핸들러는 스택 최상부에 새로 스택프레임을 할당해서 실행함 ㅡ ㅡ)
일반적으로 Resumption의 개념에는 Recursive resumption이라는 위험이 있음.
Recursive Resumption이라는건, Resumption을 rethrow할 때, 이미 사용된 핸들러를 다시 호출하는 상황임.
이런 상황이 발생하는 이유는, Exception Handler를 찾는 방식에 있음.
보통 Stack의 top에서 bottom까지의 linear search를 통해 사용 가능한 handler를 찾는데,
일반적인 Exception이 stack을 unwind하는 반면,
Resumption은 이를 보존하기 때문에 사용한 handler를 재사용하는 문제점이 있음.
이를 방지하기 위해 marking이라는 테크닉이 사용됨. (무려 논문까지 있음)
다른 방법도 있긴 한데, 이 방법의 강점은 exception과 resumption의 코드가 거의 일치한다는 점임 ㅇㅇ
3) Non-local Exception
여기서 Local은 동일 컨텍스트를 의미함. (같은 스택을 사용함)
(참고: 이 언어에는 Coroutine이 있기 때문에 같은 Thread라도 다른 컨텍스트에 있을 수 있음)
Non-local이라고 하면 Exception이 복수의 Coroutine과 Thread 사이를 넘나들 수 있다는 이야기.
함수를 막 돌리다가 아무한테나 예외를 막 "던질수 있음" ㅡㅡ);;;;
아무거나 막 죽일수 있는 궁극오의처럼 들리지만, 이를 막기위한 장치가 이미 존재 = =)ㅋㅋㅋ
_Enable{ ... } 블럭 내부에서만 Non-local Exception을 받아들임.
4) Coroutine
Python같은 가짜 코루틴이 아니라, 따로 스택을 가진 레알 코루틴 ㅇㅇ
실질적으로는 상속이 미리 지정된 C++ 클래스로
_Coroutine typename { ... }; 식으로 선언함. (NOTE: virtual void main())
더이상의 자세한 설명은 생략한다.
5) Task
뭐, 걍 쓰레드 클래스임.
선언시 _Task를 붙이는 것 외에는 Coroutine과 완전 동일.
6) Locks
uSpinLock - Spin-lock, non-preemptive, non-yielding
uLock - Spin-lock, preemptive, yielding
uOwnerLock - Mutex-lock
uCondLock - Synchronization-lock
uBarrier - Synchronization-lock, synchronized execution points
uSemaphore - Semaphore - _-)
0) 기타
* 이 언어는 User-thread와 Kernel-thread를 모두 활용함.
* G++ 옛버전을 기반으로 제작됨.
C++이면서 함수를 중간에 선언 가능한 점이 그 증거. 최근의 G++에선 정치적 이유로 빠짐.
* std 라이브러리를 조금 확장함.
기본 클래스 중 일부는 exception을 던지도록 변경됨
* Event 타입을 제공함.
Coroutine과 Task처럼 상속이 미리 지정된 클래스.
Exception의 기본 타입임.
* Coroutine과 Task는 restart가 안된다.
단순히 교육상 전혀 도움이 안된다는 이유로 = =);
* Task는 인스턴스 생성시 쓰레드가 돌기 시작해서, 실행이 종료될 때까지 인스턴스가 소멸하지 않는다.
원래는 블럭을 이용해서 구조적으로 하기 위함인데, 현실은 너저분한 동적할당 ㅁㄴㅇㄹ
* 모든 stack frame은 lexical link를 가진다.
Lexical link는 문맥상으로 연결되는 stack frame을 가리킴.
바로 전 스택프레임과 문맥이 연결된다는 보장이 없기 때문.
nested function이라던지, resumption이라던지.
덧)
덕짤을 싸기위해 적당히 프겔이야기를 쓴다는게
존나 길어져버렸다는 [...]
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.