needmoreeasy EN 한국어
배우기

NME 네이티브 코어 레퍼런스

이 문서는 현재 구현된 NME 네이티브 코어를 설명합니다. 작은 정적 타입 AOT 경로이며, nme 네이티브는 허용된 부분집합을 C로 내린 뒤 시스템 C 컴파일러로 실행 파일을 만듭니다. 모든 NME나 모든 Python을 컴파일하지 않으며 CPython으로 조용히 바꾸지도 않습니다. 설계상의 선택은 네이티브 백엔드 메모를 보세요.

같은 뜻으로 들어가는 여섯 가지 방법

다음 여섯 프로그램은 모두 10을 계산해 보여 줍니다. 같은 프론트엔드와 같은 nme-native 하강 경로를 사용하고, 겉으로 쓰는 문법만 다릅니다.

문장형 영어

score = 5
while score is less than 10
    score add 1
end
show score
실행해 보기 →

문장형 한국어

점수 = 5
동안 점수가 10보다 작을 동안
    점수에 1 더해
끝
점수 말해줘
실행해 보기 →

초급 영어

score = 5
5 times:
    score add 1
show score
실행해 보기 →

초급 한국어

점수 = 5
5번:
    점수에 1 더해
점수 말해줘
실행해 보기 →

고급 영어

def twice(value):
    return value * 2

show twice(5)
실행해 보기 →

고급 한국어 사용

def 두배(값):
    return 값 * 2

말해 두배(5)
실행해 보기 →

고급 한국어에서도 def, return 같은 Python 키워드는 그대로 씁니다. 대신 한국어 식별자와 NME의 말해 출력 표기를 같은 네이티브 프로그램에서 사용할 수 있습니다. 여섯 예제는 모두 다음을 출력합니다.

값과 표현식

현재 네이티브 코어가 지원하는 값은 다음과 같습니다.

  • -2147483648부터 2147483647까지의 부호 있는 32비트 정수입니다. 정수 오버플로와 정수 0 나머지는 C의 오버플로 의미에 맡기지 않고 이중 언어 네이티브 런타임 오류로 멈춥니다.
  • C double로 표현하는 유한 실수입니다. 실수 리터럴은 유한해야 합니다. 실수에서는 +, -, *를 사용할 수 있고 %는 정수에서만 됩니다. 정수처럼 보이는 실수는 C의 %g 방식으로 출력하므로 5.05로 보일 수 있으며 -0.0의 부호는 유지됩니다. 계산 결과가 유한하지 않게 되는 산술은 이중 언어 네이티브 런타임 오류로 멈춥니다.
  • 문자열 리터럴과 문자열 변수입니다. 저장하거나 이어 붙인 값은 UTF-8 기준 8191바이트 이하여야 합니다. 이스케이프한 줄바꿈과 탭은 동작하지만, NUL 문자를 넣거나 문자열의 대소 순서를 비교하는 것은 지원하지 않습니다. len은 Unicode 글자 수를 셉니다.
  • 불리언 값입니다. True/False와 문장형 표기 /거짓은 정수와 구별되는 타입으로 이름에 저장할 수 있습니다. 불리언 이름은 참·거짓 조건에서 사용할 수 있고 showTrue 또는 False로 출력합니다. 불리언의 같음·다름 비교는 지원하지만, 불리언 산술, 더해/ 값 변경, 불리언 함수 인자·반환은 지원하지 않습니다.

산술 연산은 +, -, *, 정수 %입니다. 정수·유한 실수 비교와 문자열 같음/다름, 불리언 같음/다름 비교를 지원합니다. 정수·유한 실수·불리언은 조건에 바로 쓸 수도 있습니다. 0과 False·거짓은 거짓이고, 0이 아닌 값과 True·은 참입니다.

NME 블록 조건에서는 지원되는 조건을 andor로 묶을 수 있습니다. Python과 같이 andor보다 먼저 계산되며, 실제로 필요한 쪽만 계산하는 단락 평가를 사용합니다. 한국어 표기 그리고또는도 같은 방식으로 동작합니다. 괄호로 콜론 없는 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를 출력하고, 그 이름을 ifwhile 조건에 바로 쓸 수 있습니다. False로 다시 대입해도 같은 불리언 타입을 유지합니다.

쌍으로 제공하는 예제는 nme 네이티브 실행 examples/native-booleannme 네이티브 실행 examples/native-boolean.ko로 실행할 수 있습니다. 논리 조건 쌍은 examples/native-logicalexamples/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/whileelse if/else 분기에서 지원합니다. 본문은 say, show, 말해 중 하나여야 하며, 예를 들어 if ready then show "ready"처럼 씁니다. Python 인라인 본문과 인라인 값 변경은 이 제한된 부분집합 밖입니다.
  • 네이티브 반복문 안에서는 if done then break here, 2번: 멈춰, 또는 동안 참 그러면 여기서 멈춰, 3번 반복해서 여기서 멈춰처럼 한 줄 NME break 본문도 쓸 수 있습니다. 네이티브 반복문 밖의 breakE0102로 거부됩니다.
  • 일반 Python for 반복문은 네이티브 부분집합 밖에 있습니다. 제한 없는 Python 반복 문법에는 CPython 경로를 사용하세요.
  • 실행될 수도 있고 건너뛸 수도 있는 블록에서만 만든 바인딩은 확실히 대입되기 전에는 사용할 수 없습니다. if/else 사슬에서 블록 뒤로 계속될 수 있는 모든 경로에 대입한 이름은 블록 뒤에 사용할 수 있고, 일찍 반환하거나 감싼 반복문을 빠져나가는 분기는 그 이름을 대입할 필요가 없으며, 중첩 조건문을 포함한 종료 경로도 같은 규칙을 따릅니다. 계속되는 분기 중 한 곳에서만 대입했거나 실행되지 않을 수 있는 반복문 안에서 만든 이름은 조건부로 남습니다. 함수 안의 지역 바인딩은 함수 밖으로 새지 않습니다.

네이티브 제어 흐름에는 NME 문장형 블록을 사용하세요. while score < 10:처럼 Python 콜론을 쓰는 제어 헤더는 이 코어 밖입니다. 제한 없는 Python 제어 흐름은 CPython 경로를 사용하세요.

함수

네이티브 함수는 보통 Python처럼 def 헤더를 쓰지만, 네이티브 시그니처는 의도적으로 작습니다.

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까지 도달하는 경로에서만 결과를 대입하면 됩니다.

def 선택(값):
    만약 값
        결과 = 2
    아니면
        return 3
    끝
    return 결과
실행해 보기 →

CPython에 남는 것

입력, import, 모듈, 패키지, 클래스, 목록, 사전, 동적인 Python 값, use random/use file 어댑터는 이 네이티브 코어에 포함되지 않습니다. nme 네이티브는 그런 프로그램에 이중 언어 진단을 내고, 잘못될 수 있는 실행 파일을 만들지 않습니다. 완전한 Python 호환 언어가 필요하면 같은 .nme 파일을 nme 실행으로 실행하세요.

명령과 운영체제

결과 파일을 남기지 않고 코어 프로그램을 실행합니다.

nme 네이티브 실행 examples/native-factorial.ko

빌드로 생성된 C와 실행 파일을 남깁니다.

nme 네이티브 빌드 examples/native-factorial.ko -o factorial

macOS와 Linux에서는 cc를, Windows에서는 Visual Studio Developer PowerShell 또는 cl.exePATH에 있는 셸을 사용하세요. 생성된 C에는 운영체제에 맞는 UTF-8 옵션을 전달하므로 한국어와 영어 문자열의 의미를 유지합니다. 실행은 임시 실행 파일을 사용하고 빌드는 살펴볼 수 있도록 C 소스를 보존합니다.

결과물 이름의 전체 규칙, 진단, 백엔드 선택 근거는 네이티브 백엔드 메모를 참고하세요. 네이티브 가이드는 첫 네이티브 프로젝트 순서로 같은 작업 흐름을 안내합니다.

GitHub에서 이 문서 보기