# Features ## Object-oriented programming `mp`는 객체를 사용합니다. 이는 시스템의 구조를 더욱 쉽게 파악할 수 있게 합니다. ## No Garbage Collection `mp`는 쓰레기수집기 (이하 `GC`)를 사용하지 않습니다. `GC`를 사용하지 않는 대신, 컴파일 단계에서 변수의 생명주기를 미리 계산하여, 런타임에서는 안정적인 메모리 관리를 수행토록 합니다. ## Push fault `GUI`를 통해 코드블록을 하나하나 놓을 때마다 `mp`에는 꾸준히 수정 명령 `push`이 내려집니다. 만약 어떤 코드블록을 컴파일러 오류로 인해 놓을 수 없다면, `mp`는 반영 실패 (Push fault) 하고 사용자에게 그 원인을 알립니다. 또한 `mp`는 한 프로젝트를 여럿이서 동시에 작업할 수 있도록 합니다. 만약 사용자가 어떠한 프로젝트를 수정하였을 경우, 단순히 `git`처럼 서버로 변경사항을 반영 (Push)하면 됩니다. 만일 두 프로젝트가 병합 불가능한 경우는 반영 실패로, 마찬가지로 사용자에게 그 원인을 알립니다. ## Object ownership `mp`에서는 다른 변수로 값을 전달하는 방법이 2가지 있습니다. 첫째는, 값을 이동 `move` (변수명을 변화)시키는 것입니다. 둘째는, 값을 복사 `copy` 하는 것입니다. 즉 `deepcopy`를 통해 원래 값과 똑같은 것을 만들어내는 것입니다. `mp`에서는 두 방식을 기본적으로 지원합니다. 다만, 값의 수정이 이루어지지 않는 경우, 즉 상태불변 `immutable`의 클래스에 대해선, 명시적으로 복사 `copy`를 수행하라고 했음에도 실제 수행 시에는 참조 `refer`를 통해 접근할 수도 있습니다. 또한, 사용자가 복사 메소드를 따로 정의내렸다 하더라도, `immutable`한 경우에는 참조를 이용합니다. 굳이 두 방식을 혼용하는 이유는, 데이터의 생명주기를 구하기 위함입니다. [가비지컬렉터가 없기 때문에](#no garbage collection), 언제 값을 생성하고 삭제할 지, `mp`는 예측할 수 있어야 합니다. 이를 위해, 사용자에게 참조를 맡기는 대신, `mp`가 직접 다루게 된 것입니다. 이는 [Rust](https://www.rust-lang.org/) 언어에서 많은 영감을 받았습니다. 그러나, `Rust`에서의 소유권 (빌림) 개념은 초심자가 이해하는 데에 다소 어려움이 있습니다. 그 이유는 소유권을 할당하고 관리하는 것은 여전히 사용자의 몫이기 때문입니다. 이를 덜기 위해, `mp`에서는 아예 한 메모리에 동시에 두 개 이상 참조하는 것을 금지하여 소유권을 보장합니다. 때문에 변수의 참조와 생명주기, 소유권은 전적으로 `mp`가 관리하며, 만일 모순되는 코드블록을 놓는 경우 [반영 실패](#push fault)합니다. ## Web Assembly Support `mp`는 웹어셈블리 (이하 `wasm`)를 지원합니다. 즉, `mp`의 빌드 결과물은 `wasm`이 될 수 있습니다. 이는 웹 환경에서 사용자의 프로젝트를 테스트하고 배포할 수 있도록 합니다. ## Case support `mp`에서 상태 메소드 `case`는 상태불변의 입력값이 없고 비교형의 출력값을 가지는 메소드로, 특정 클래스의 논리적 상태를 하나의 `case`로 추상화할 때 사용합니다. 비유하자면 일반 메소드는 동사, `case`는 형용사라고 볼 수 있겠습니다. ## Interface support `mp`의 클래스는 각 능력 `ability`를 통해 다양한 기능들을 강제할 수 있습니다. `ability`는 `Java`의 `interface`와 같은 개념입니다. 예를 들어, 앞의 `Move`, `Copy` 등이 클래스에 기본적으로 적용된 어빌리티의 일종입니다. 다만, 이 예제의 경우 실제 구현은 컴파일러가 처리합니다. `mp`는 `ability`의 사용을 지향합니다. 일례로, `Java`에서의 디버깅을 목적으로 한 `toString()` 메소드는 `Debug` 어빌리티를 구현하는 것으로 생각할 수 있습니다. ## Data integrity `mp`는 `push`를 통해 항상 즉시 실행가능한 상태 (즉, 무결성)를 유지합니다. 무결성을 통해