# NME 네이티브 코어 레퍼런스 [English](native-reference.md) | 한국어 [README](../README.ko.md) | [설치](install.ko.md) | [시작하기](getting-started.ko.md) | [학습 과정](tutorial.ko.md) | [문법 안내](language.ko.md) | [가이드](guides/index.ko.md) 이 문서는 현재 구현된 NME 네이티브 코어를 설명합니다. 작은 정적 타입 AOT 경로이며, `nme 네이티브`는 허용된 부분집합을 C로 내린 뒤 시스템 C 컴파일러로 실행 파일을 만듭니다. 모든 NME나 모든 Python을 컴파일하지 않으며 CPython으로 조용히 바꾸지도 않습니다. 설계상의 선택은 [네이티브 백엔드 메모](native-backend.ko.md)를 보세요. ## 같은 뜻으로 들어가는 여섯 가지 방법 다음 여섯 프로그램은 모두 `10`을 계산해 보여 줍니다. 같은 프론트엔드와 같은 `nme-native` 하강 경로를 사용하고, 겉으로 쓰는 문법만 다릅니다. ### 문장형 영어 ```text score = 5 while score is less than 10 score add 1 end show score ``` ### 문장형 한국어 ```text 점수 = 5 동안 점수가 10보다 작을 동안 점수에 1 더해 끝 점수 말해줘 ``` ### 초급 영어 ```text score = 5 5 times: score add 1 show score ``` ### 초급 한국어 ```text 점수 = 5 5번: 점수에 1 더해 점수 말해줘 ``` ### 고급 영어 ```text def twice(value): return value * 2 show twice(5) ``` ### 고급 한국어 사용 ```text def 두배(값): return 값 * 2 말해 두배(5) ``` 고급 한국어에서도 `def`, `return` 같은 Python 키워드는 그대로 씁니다. 대신 한국어 식별자와 NME의 `말해` 출력 표기를 같은 네이티브 프로그램에서 사용할 수 있습니다. 여섯 예제는 모두 다음을 출력합니다. ```text 10 ``` ## 값과 표현식 현재 네이티브 코어가 지원하는 값은 다음과 같습니다. - `-2147483648`부터 `2147483647`까지의 부호 있는 32비트 정수입니다. 정수 오버플로와 정수 0 나머지는 C의 오버플로 의미에 맡기지 않고 이중 언어 네이티브 런타임 오류로 멈춥니다. - C `double`로 표현하는 유한 실수입니다. 실수 리터럴은 유한해야 합니다. 실수에서는 `+`, `-`, `*`를 사용할 수 있고 `%`는 정수에서만 됩니다. 정수처럼 보이는 실수는 C의 `%g` 방식으로 출력하므로 `5.0`이 `5`로 보일 수 있으며 `-0.0`의 부호는 유지됩니다. 계산 결과가 유한하지 않게 되는 산술은 이중 언어 네이티브 런타임 오류로 멈춥니다. - 문자열 리터럴과 문자열 변수입니다. 저장하거나 이어 붙인 값은 UTF-8 기준 8191바이트 이하여야 합니다. 이스케이프한 줄바꿈과 탭은 동작하지만, NUL 문자를 넣거나 문자열의 대소 순서를 비교하는 것은 지원하지 않습니다. `len`은 Unicode 글자 수를 셉니다. - 불리언 값입니다. `True`/`False`와 문장형 표기 `참`/`거짓`은 정수와 구별되는 타입으로 이름에 저장할 수 있습니다. 불리언 이름은 참·거짓 조건에서 사용할 수 있고 `show`는 `True` 또는 `False`로 출력합니다. 불리언의 같음·다름 비교는 지원하지만, 불리언 산술, `더해`/`빼` 값 변경, 불리언 함수 인자·반환은 지원하지 않습니다. 산술 연산은 `+`, `-`, `*`, 정수 `%`입니다. 정수·유한 실수 비교와 문자열 같음/다름, 불리언 같음/다름 비교를 지원합니다. 정수·유한 실수·불리언은 조건에 바로 쓸 수도 있습니다. 0과 `False`·`거짓`은 거짓이고, 0이 아닌 값과 `True`·`참`은 참입니다. NME 블록 조건에서는 지원되는 조건을 `and`와 `or`로 묶을 수 있습니다. Python과 같이 `and`가 `or`보다 먼저 계산되며, 실제로 필요한 쪽만 계산하는 단락 평가를 사용합니다. 한국어 표기 `그리고`와 `또는`도 같은 방식으로 동작합니다. 괄호로 콜론 없는 NME 조건 전체를 `만약`이나 `동안` 헤더에서 감쌀 수도 있지만, Python 콜론 조건은 이 네이티브 부분집합 밖에 있습니다. 한국어 문장형 비교 끝말도 괄호 안에 그대로 둘 수 있습니다. 괄호 안에서 논리 연결어 앞에 조건 끝말을 두는 `만약 (점수가 2보다 크면 그리고 준비)` 같은 표기도 동작합니다. 연결어 표기는 섞어도 되므로 `만약 (점수가 2보다 크면 and 준비)`처럼 영어 `and`/`or`를 한국어 조건 끝말과 함께 사용할 수도 있습니다. 한국어 `while` 끝말도 같은 네이티브 경로에서 `동안 (횟수가 2보다 작을 동안 그리고 준비)`처럼 쓸 수 있습니다. 한국어 NME 동작어는 올바른 Python 식별자이기도 합니다. `만약`이 바인딩되어 있다면 `만약 (준비)`는 올바른 Python 호출 형태이므로 Python으로 남습니다. 네이티브 NME 블록을 뜻한다면 `만약 준비라면`처럼 문장형 끝말을 쓰거나 `만약 ((준비 그리고 참))`처럼 NME 연결어를 넣으세요. 정수·실수·불리언·문자열 또는 지원되는 표현식을 `say`, `show`, `말해`로 출력합니다. 네이티브 표현식에서는 리터럴, 앞에서 대입한 이름, 지원되는 비교, 선언된 네이티브 함수 호출을 사용할 수 있습니다. 다음은 NME의 세 단계와 두 사용자 언어에서 같은 불리언 바인딩을 만드는 표기입니다. | 단계 | 영어 | 한국어 | | --- | --- | --- | | 문장형 | `ready save true` | `준비는 참` | | 초급 | `set ready to True` | `저장 준비 True` | | 고급 | `ready = True` | `준비 = True` | 어느 줄 뒤에도 `show ready`/`말해 준비`는 `True`를 출력하고, 그 이름을 `if`나 `while` 조건에 바로 쓸 수 있습니다. `False`로 다시 대입해도 같은 불리언 타입을 유지합니다. 쌍으로 제공하는 예제는 `nme 네이티브 실행 examples/native-boolean`과 `nme 네이티브 실행 examples/native-boolean.ko`로 실행할 수 있습니다. 논리 조건 쌍은 `examples/native-logical`과 `examples/native-logical.ko`입니다. ## 문장과 블록 - `name = expression`은 타입이 정해진 바인딩을 만듭니다. 나중의 대입은 같은 타입이어야 하며, `score add 1`과 `점수에 1 더해` 같은 문장형 변경은 이미 존재하는 정수·실수 바인딩에만 사용할 수 있고 불리언은 바꿀 수 없습니다. - 문장형 `while`, `if`, `else`, `else if` 블록은 `end` 또는 `끝`으로 닫습니다. 기호 연산자나 문서에 있는 자연어 연결사를 비교에 사용할 수 있고, 지원되는 조건을 논리 `and`/`or`로 묶을 수 있습니다. 초급 `times:`와 `번:` 반복도 지원하며, `2번 반복해서 안녕 말해줘` 같은 문장형 반복의 한 줄 NME 출력 본문도 지원합니다. - `break`는 네이티브 반복문 안에서 동작하며, 그 반복문 안에 중첩한 `if`에서도 사용할 수 있습니다. 반복문 밖의 `break`는 C를 만들기 전에 거부됩니다. - `then`/`그러면` 뒤의 한 줄 NME 출력 본문도 네이티브 `if`/`while`과 `else if`/`else` 분기에서 지원합니다. 본문은 `say`, `show`, `말해` 중 하나여야 하며, 예를 들어 `if ready then show "ready"`처럼 씁니다. Python 인라인 본문과 인라인 값 변경은 이 제한된 부분집합 밖입니다. - 네이티브 반복문 안에서는 `if done then break here`, `2번: 멈춰`, 또는 `동안 참 그러면 여기서 멈춰`, `3번 반복해서 여기서 멈춰`처럼 한 줄 NME `break` 본문도 쓸 수 있습니다. 네이티브 반복문 밖의 `break`는 `E0102`로 거부됩니다. - 일반 Python `for` 반복문은 네이티브 부분집합 밖에 있습니다. 제한 없는 Python 반복 문법에는 CPython 경로를 사용하세요. - 실행될 수도 있고 건너뛸 수도 있는 블록에서만 만든 바인딩은 확실히 대입되기 전에는 사용할 수 없습니다. `if`/`else` 사슬에서 블록 뒤로 계속될 수 있는 모든 경로에 대입한 이름은 블록 뒤에 사용할 수 있고, 일찍 반환하거나 감싼 반복문을 빠져나가는 분기는 그 이름을 대입할 필요가 없으며, 중첩 조건문을 포함한 종료 경로도 같은 규칙을 따릅니다. 계속되는 분기 중 한 곳에서만 대입했거나 실행되지 않을 수 있는 반복문 안에서 만든 이름은 조건부로 남습니다. 함수 안의 지역 바인딩은 함수 밖으로 새지 않습니다. 네이티브 제어 흐름에는 NME 문장형 블록을 사용하세요. `while score < 10:`처럼 Python 콜론을 쓰는 제어 헤더는 이 코어 밖입니다. 제한 없는 Python 제어 흐름은 CPython 경로를 사용하세요. ## 함수 네이티브 함수는 보통 Python처럼 `def` 헤더를 쓰지만, 네이티브 시그니처는 의도적으로 작습니다. ```text def fact(n): if n is less than 2 return 1 end return n * fact(n - 1) show fact(5) ``` 함수에는 간단한 위치 정수 매개변수를 0개 이상 둘 수 있으며, 최상위 정수 `return`이 있어야 합니다. 이른 `return`으로 한 분기를 끝낼 수 있지만, 제어 블록 뒤로 계속되는 모든 경로는 최상위 `return`에 도달해야 합니다. 파일 뒤쪽에 정의한 함수도 호출할 수 있고 재귀도 가능하지만, 선언한 개수의 위치 인자를 사용해야 합니다. 기본값, 가변 인자, 키워드 인자, 중첩 함수 정의, 실수·문자열 함수 값, 분기에서만 반환하는 함수, 최상위 `return`은 네이티브 코어 밖입니다. 다음 예제에서는 `else` 경로가 블록 끝 전에 반환하므로, 마지막 `return`까지 도달하는 경로에서만 `결과`를 대입하면 됩니다. ```text def 선택(값): 만약 값 결과 = 2 아니면 return 3 끝 return 결과 ``` ## CPython에 남는 것 입력, import, 모듈, 패키지, 클래스, 목록, 사전, 동적인 Python 값, `use random`/`use file` 어댑터는 이 네이티브 코어에 포함되지 않습니다. `nme 네이티브`는 그런 프로그램에 이중 언어 진단을 내고, 잘못될 수 있는 실행 파일을 만들지 않습니다. 완전한 Python 호환 언어가 필요하면 같은 `.nme` 파일을 `nme 실행`으로 실행하세요. ## 명령과 운영체제 결과 파일을 남기지 않고 코어 프로그램을 실행합니다. ```sh nme 네이티브 실행 examples/native-factorial.ko ``` `빌드`로 생성된 C와 실행 파일을 남깁니다. ```sh nme 네이티브 빌드 examples/native-factorial.ko -o factorial ``` macOS와 Linux에서는 `cc`를, Windows에서는 Visual Studio Developer PowerShell 또는 `cl.exe`가 `PATH`에 있는 셸을 사용하세요. 생성된 C에는 운영체제에 맞는 UTF-8 옵션을 전달하므로 한국어와 영어 문자열의 의미를 유지합니다. `실행`은 임시 실행 파일을 사용하고 `빌드`는 살펴볼 수 있도록 C 소스를 보존합니다. 결과물 이름의 전체 규칙, 진단, 백엔드 선택 근거는 [네이티브 백엔드 메모](native-backend.ko.md)를 참고하세요. [네이티브 가이드](guides/25-native.ko.md)는 첫 네이티브 프로젝트 순서로 같은 작업 흐름을 안내합니다.