예약어
Reserved word컴퓨터 언어에서 예약된 단어(예약 식별자라고도 함)는 변수, 함수 또는 라벨의 이름과 같이 식별자로 사용할 수 없는 단어이며 "사용을 보류"됩니다.이것은 통사적 정의이며 예약된 단어는 사용자 정의 의미가 없을 수 있습니다.
밀접하게 관련되어 있고 종종 결합된 개념은 키워드로, 특정 맥락에서 특별한 의미를 지닌 단어입니다.이것은 의미론적 정의입니다.반면, 표준 라이브러리에 있지만 언어에 포함되어 있지 않은 이름은 예약된 단어나 키워드로 간주되지 않습니다."예약어"와 "키워드"라는 용어는 종종 서로 바꿔서 사용됩니다.예약어는 "키워드로 사용하기 위해 예약되어 있습니다"라고 말할 수 있습니다.또, 이 문서에서는, 언어 마다 정식 용어가 다릅니다.
일반적으로 예약어와 키워드가 일치할 필요는 없지만 대부분의 현대 언어에서 키워드는 예약어의 서브셋입니다.키워드를 식별자와 혼동할 수 없기 때문에 해석하기 쉬워집니다.C 또는 Python과 같은 일부 언어에서는 예약된 단어와 키워드가 일치하는 반면 Java와 같은 다른 언어에서는 모든 키워드가 예약된 단어이지만 일부 예약된 단어는 키워드가 아닌 "향후 사용을 위해 예약"됩니다.그러나 ALGOL, FORTRAN 및 PL/I와 같은 다른 언어에서는 키워드는 있지만 예약된 단어는 없으며 키워드는 다른 수단으로 식별자와 구별됩니다.따라서 미리 보기 파서를 사용할 경우 구문 분석이 더 어려워집니다.
구별
언어에서 예약된 단어와 키워드의 집합은 종종 일치하거나 거의 동일하며, 구별이 미묘하기 때문에 용어들이 종종 서로 바꿔서 사용됩니다.그러나 주의 깊게 사용하면 구별됩니다.
키워드를 예약 워드로 하면 문맥에 의존하지 않고 문자열이 키워드 또는 식별자가 되기 때문에 어휘 검색이 쉬워집니다.따라서 키워드는 보통 예약 워드의 서브셋입니다.단, 예약어가 키워드일 필요는 없습니다.예를 들어 Java에서는goto
는 예약어이지만 의미가 없고 문법의 어떤 생산 규칙에도 표시되지 않습니다.이는 보통 순방향 호환성을 위해 수행되므로 예약된 단어가 기존 프로그램을 중단하지 않고 향후 버전에서 키워드가 될 수 있습니다.
반대로 키워드는 문맥에서 그 역할을 이해하는 예약어일 필요는 없습니다.또, 스트로핑등의 다른 방법으로 구별되는 경우도 있습니다.예를 들어 다음과 같은 문구가 있습니다.if = 1
if 절의 제어문이 다음 문장으로 시작할 수 없기 때문에 대부분의 문법에서 모호하지 않다.=
FORTRAN 등 일부 언어에서는 사용할 수 있습니다.또한 ALGOL 68에서는 키워드를 엄밀한 언어로 스트로핑하여 구분해야 합니다.따라서 키워드는 굵은 글씨로 표시되므로 예약어가 아닙니다.따라서 다음 표현은 일반 식별자와 충돌하지 않을 경우 굵은 글씨 키워드로 사용할 수 있습니다.if
:
- eq 0이면 1 fi
그러나 ALGOL 68에서는 키워드가 예비어인 스트로핑 시스템도 있습니다.이것은, 이러한 별개의 개념이 어떻게 일치하고 있는지를 나타내는 예입니다.이것은 많은 현대 언어에서 행해지고 있습니다.
구문
예약어는 일반 단어처럼 보이지만 일반 단어로 사용할 수 없는 단어입니다.형식적으로 이것은 식별자의 일반적인 어휘 구문(단어 구문)을 충족하지만, 식별자가 사용되는 곳에서는 사용할 수 없다는 것을 의미합니다.예를 들어, 이 단어는if
는 보통 예약어입니다만,x
일반적으로 그렇지 않기 때문에x = 1
유효한 할당입니다만,if = 1
그렇지 않습니다.
키워드는 용도는 다양하지만 주로 몇 가지 클래스로 분류됩니다.문법의 일부(특히 터미널 이외의 기호를 가진 생산 규칙)는 다양한 의미를 가지며, 종종 단어와 같은 제어 흐름에 사용됩니다.if
대부분의 프로시저 언어에서, 이것은 조건어를 나타내며 절(비말단 기호)을 취한다; 다음과 같은 타입 시스템을 지원하는 언어의 원시 타입의 이름int
; 다음과 같은 원시 문자 값true
Boolean true 또는 경우에 따라서는 다음과 같은 특수 명령어일 수 있습니다.exit
문구에서 키워드의 다른 용도는 다음과 같은 입력/출력을 위한 것입니다.print
.
어휘자와 파서의 조합에 의해 언어가 해석되고, 단어의 어휘 문법과 문맥이 없는 문법에 의해 언어의 구문이 생성될 때 구별되는 정의는 명확해진다.이는 현대 언어 분석에서 흔히 볼 수 있는 것으로, 이 경우 키워드는 단어 수준에서 식별자(따라서 예약된 단어)와 구별되어야 하며, 구문 수준(키워드로서)에서 다르게 분석되어야 합니다.
이 경우 예약어는 어휘 문법의 일부로 정의되며 각각 식별자와 구별되는 개별 유형으로 토큰화됩니다.전통적인 표기법에서, 예약어는if
그리고.then
예를 들어 유형으로 토큰화됩니다.IF
그리고.THEN
각각,x
그리고.y
둘 다 유형으로 토큰화됩니다.Identifier
.
반면 키워드는 구문적으로 문법에 종단 기호로 표시됩니다.예를 들어 조건식에 대한 생성 규칙은 다음과 같습니다.IF Expression THEN Expression
이 경우IF
그리고.THEN
터미널 기호로, "유형의 토큰"을 의미합니다.IF
또는THEN
, 각각" – 그리고 어휘 문법에 의해 이것은 문자열을 의미합니다.if
또는then
원본 원본에서.원시 상수 값의 예로서true
부울 값 "true"를 나타내는 키워드일 수 있으며, 이 경우 생산의 가능한 확장으로 문법에 표시되어야 합니다.BinaryExpression
,예를 들어.
예약 범위
특정 단어 목록을 예약하는 것 외에, 일부 언어들은 미래의 언어 버전, 다른 방언, 컴파일러 벤더 고유 확장자를 위한 개인 공간으로 사용하거나 컴파일러에 의한 내부 사용(특히 이름 망글링)을 위해 전체 범위의 단어를 예약합니다.
이것은 대부분 하나 이상의 밑줄과 같은 접두사를 사용하여 수행됩니다.C와 C++이 점에 주목할 만한C99 매장량 식별자는 시작하고 있는 두 여실히 보여또는에 밑줄에 따르면 대문자가며, 더 이상 매장량 식별자는 시작하여 단 한번의 밑줄(그, 평범한 공간에)에 사용 중 파일 능력,[1]과 C++03 추가 매장량 식별자를 함유하는 이중 밑줄을 긋다.where[2]: 예를 들어 이중 언더스코어를 구분자로 사용할 수 있습니다(사용자 ID 연결).
Python의 내부 식별자에 이중 밑줄을 자주 사용하면서 약어 던더가 생겨났습니다.이것은 Mark[3] Jackson에 의해 만들어졌고 Tim Hochberg에 [4]의해 서로 독립적으로 만들어졌으며,[5][6] 2002년에 같은 질문에 대한 답변으로 만들어졌습니다.
사양
언어의 예약된 단어와 키워드 목록은 언어가 개발될 때 정의되며, 둘 다 언어의 공식 사양의 일부를 구성합니다.일반적으로 유효한 식별자 이름을 제한하지 않기 위해 예약된 단어 수를 최소화하는 것이 좋습니다.또, 새로운 예약어를 도입하면, 그 단어를 사용하는 기존의 프로그램이 망가져 버리기 때문에(역호환성이 없다) 회피할 수 있습니다.이를 방지하고 순방향 호환성을 제공하기 위해 현재 사용(키워드가 아닌 예약어) 없이 단어가 예약되는 경우가 있습니다.이것에 의해, 장래에 기존의 프로그램을 망가뜨리지 않고 단어를 사용할 수 있게 됩니다.또는 새로운 언어 기능을 미리 정의된 기능으로 구현할 수 있으며, 이를 재정의할 수 있으므로 기존 프로그램이 중단되지 않습니다.
유연성이 뛰어난 이유로는 컴파일러 벤더가 표준이 아닌 기능을 포함함으로써 사양을 확장할 수 있도록 하거나 확장하기 위한 언어의 다른 표준 사투리 또는 추가 기능을 포함하기 위한 향후 버전의 언어를 사용할 수 있도록 하는 것을 들 수 있습니다.예를 들어 절차 언어는 미래의 버전 또는 일부 방언에서 객체 지향 기능을 추가할 것으로 예상할 수 있으며, 이때 다음과 같은 키워드를 추가할 수 있습니다.class
또는object
이 가능성에 대응하기 위해서, 현재의 사양에서는, 현재 사용되고 있지 않은 경우에도, 이러한 예약어를 작성할 수 있습니다.
주목할 만한 예는 Java입니다.const
그리고.goto
예약된 단어입니다. Java에서는 의미가 없지만 식별자로 사용할 수도 없습니다.용어를 예약하면 원하는 경우 이전 Java 소스 코드를 손상시키지 않고 향후 버전의 Java에서 구현할 수 있습니다.예를 들어, 1999년에 C++-like를 추가하는 제안이 있었습니다.const
그 언어를 사용하는 것이 가능했습니다.const
word는 예약되어 있지만 현재 사용되지 않고 있기 때문에 이 제안은 거부되었습니다.특히 이 기능을 추가하면 기존 프로그램이 중단되지 않더라도 표준 라이브러리(컬렉션에 포함)에서 이 기능을 사용하면 호환성이 [7]깨집니다.JavaScript에는 특별한 기능이 없는 다수의 예약된 단어도 포함되어 있습니다.정확한 목록은 버전 및 [8]모드에 따라 다릅니다.
언어에 따라 새로운 예약어 또는 키워드를 도입하는 빈도와 명명 방법이 크게 다릅니다.일부 언어는 기존 프로그램의 파손을 피하기 위해 매우 보수적이고 새로운 키워드를 도입하는 경우는 거의 없습니다.또, 다른 언어에서는, 새로운 키워드를 보다 자유롭게 도입하기 때문에, 기존의 프로그램이 기존의 키워드를 변경할 필요가 있습니다.경합하는 식별자.사례 연구는 2011년부터 C++11과 비교하여 C11에서 새로운 키워드를 사용하여 제공되고 있습니다.C 및 C++에서는 밑줄과 대문자로 시작하는 식별자가 [9]예약되어 있습니다.
C 위원회는 사용자 이름 공간에 새로운 키워드를 작성하지 않는 것을 선호합니다.이는 일반적으로 C의 리비전이 오래된 C 프로그램의 파손을 회피할 것으로 예상되기 때문입니다.이에 비해 C++ 위원회(WG21)는 새로운 키워드를 오래된 키워드와 같이 통상적인 것으로 하는 것을 선호합니다.예를 들어, C++11은 새로운 C++11을 정의합니다.
thread_local
1개의 스레드에 로컬한 스태틱스토리지를 지정합니다.C11은 새로운 키워드를 다음과 같이 정의합니다._Thread_local.
새로운 C11 헤더 <스레드>.h > 에는, 통상의 [10]이름을 지정하는 매크로 정의가 있습니다.
#define thread_local _Thread_local
즉, C11은 다음 키워드를 도입했습니다._Thread_local
C++11이 키워드를 도입하는 동안 C++11이 키워드를 도입하는 동안 기존의 예약된 단어 세트(특정 프레픽스를 가진 단어) 내에서 다른 기능(매크로 처리)을 사용하여 프레픽스 없이 새로운 키워드인 것처럼 사용할 수 있도록 합니다.thread_local
기존 예약어가 아님에도 불구하고 이를 사용하는 프로그램을 모두 삭제하지만 매크로 프로세싱은 필요하지 않습니다.
미리 정의된 이름
예약된 단어와 관련된 개념은 미리 정의된 함수, 메서드, 서브루틴 또는 변수, 특히 표준 라이브러리의 라이브러리 루틴입니다.이들은 기본 언어의 일부라는 점에서 유사하며 유사한 목적으로 사용될 수 있습니다.단, 이들은 미리 정의된 함수, 메서드 또는 서브루틴의 이름이 일반적으로 예약된 단어가 아닌 식별자로 분류되며 구문 분석에서 특별히 처리되지 않는다는 점에서 다릅니다.또한 예약 워드는 프로그래머에 의해 재정의되지 않아도 되지만 사전 정의된 워드는 종종 일부 용량에서 재정의될 수 있다.
키워드로 제공되는 것과 미리 정의된 것에 따라 언어가 달라집니다.예를 들어 일부 언어에서는 입출력 조작 키워드를 제공하는 반면 다른 언어에서는 라이브러리 루틴을 제공합니다.Python(3.0 이전 버전) 및 많은 BASIC 방언에서는print
는 키워드입니다.반면 C, Lisp 및 Python 3.0은printf
,format
,그리고.print
는 표준 라이브러리의 기능입니다.마찬가지로 Python 3.0 이전 버전에서도None
,True
,그리고.False
미리 정의된 변수였지만 예약된 단어는 아니었지만 Python 3.0에서는 예약된 [11]단어로 만들어졌습니다.
정의.
![]() |
어떤 사람들은 "키워드"와 "예약어"라는 용어를 서로 바꾸어 사용하는 반면, 다른 사람들은 "키워드"를 특정 컨텍스트에서만 특별한 단어로 사용하지만 "예약어"는 사용자 정의 이름으로 사용할 수 없는 특별한 단어로 사용한다고 말한다.키워드의 의미, 그리고 키워드 개념의 의미는 언어마다 크게 다릅니다.구체적으로는, ALGOL68에서는, 키워드를 스트로핑(엄격한 언어로 굵은 글씨로 쓴다)해, 예약어가 아니고, 스트로핑 되지 않은 단어를 통상의 식별자로 사용할 수 있다.
"자바 언어 사양"에서는 "키워드"[12]라는 용어를 사용합니다.C 프로그래밍 언어의 ISO 9899 표준은 "키워드"[13]라는 용어를 사용합니다.
C와 같은 많은 언어 및 C++와 같은 유사한 환경에서 키워드는 구문 형식을 식별하는 예약된 단어입니다.제어 흐름 구조에 사용되는 단어(예:if
,then
,그리고.else
키워드입니다.이러한 언어에서 키워드는 변수 또는 함수의 이름으로도 사용할 수 없습니다.
ALGOL 나 Algol 68 등의 일부 언어에서는 키워드를 문자 그대로 쓸 수 없지만 스트로핑해야 합니다.즉, 키워드는 어떻게든 마킹해야 합니다.예를 들어, 따옴표를 사용하거나 특수 문자로 접두사를 붙입니다.그 결과 키워드는 예약어가 아니기 때문에 통상적인 식별자로서 같은 단어를 사용할 수 있다.그러나 하나의 스트로핑 방식은 키워드를 가로채지 않고 단순히 말을 아끼는 것이었다.
PostScript와 같은 일부 언어는 이 접근법에 매우 자유롭기 때문에 핵심 키워드를 특정 목적에 맞게 재정의할 수 있습니다.
공통 리스프(Common Lisp)에서 "키워드"(또는 "키워드 기호")라는 용어는 특별한 종류의 기호 또는 식별자를 위해 사용됩니다.보통 변수 또는 함수를 나타내는 다른 기호와 달리 키워드는 자체 인용 및 자가[14]:98 평가되며, 이 기호에 삽입되어 있습니다.KEYWORD
패키지.[15]키워드는 보통 명명된 인수에 함수에 라벨을 붙이고 심볼 값을 나타내기 위해 사용됩니다.COMMON-LISP라는 이름의 패키지 내의 함수, 변수, 특수 형식 및 매크로를 명명하는 기호는 기본적으로 예약어입니다.ANSI Common [16]Lisp에서는 재정의의 효과는 정의되어 있지 않습니다.그것들을 묶는 것은 가능합니다.예를 들어 다음과 같은 표현입니다.(if if case or)
가능한 경우if
는 로컬 변수입니다.맨 왼쪽if
를 참조합니다.if
연산자. 나머지 기호는 변수 이름으로 해석됩니다.함수 및 변수에는 별도의 네임스페이스가 있기 때문에if
로컬 변수일 수 있습니다.단, Common Lisp에는 키워드 패키지에 포함되지 않은2개의 특별한 기호가 있습니다.그것은 기호입니다.t
그리고.nil
표현으로 평가하면 스스로 평가합니다.함수 또는 변수의 이름으로 사용할 수 없으므로 사실상 예약되어 있습니다. (let ((t 42)))
적절한 표현이지만let
오퍼레이터가 사용을 허용하지 않습니다.
일반적으로 프로그래머가 변수 또는 함수 이름에 키워드를 사용하려고 하면 컴파일 오류가 발생합니다.대부분의 현대 에디터에서 키워드는 프로그래머에게 키워드임을 상기시키거나 알리기 위해 특정 텍스트 색상을 가지도록 자동으로 설정됩니다.
매크로 또는 느린 평가를 사용하는 언어에서는 다음과 같은 흐름 구조를 제어합니다.if
매크로 또는 함수로 구현할 수 있습니다.이러한 표현 기능이 없는 언어에서는 일반적으로 키워드가 됩니다.
언어별 비교
모든 언어가 동일한 수의 예약된 단어를 가지는 것은 아닙니다.예를 들어, Java (및 다른 C 파생어)는 약 50개의 예약어(약 400개)를 가지고 있는 반면, 코볼은 약 400개의 예약어를 가지고 있다.스펙트럼의 다른 쪽 끝에는 순수 프롤로그와 PL/I는 전혀 없습니다.
한 언어의 예약된 단어의 수는 한 언어가 얼마나 강력한지와는 거의 관련이 없습니다.COBOL은 1950년대에 비즈니스 언어로 설계되었으며 동사, 절, 문장, 섹션, 나눗셈과 같은 영어와 유사한 구조 요소를 사용하여 자체 문서화되도록 만들어졌다.반면 C는 매우 간결하고 화면에 더 많은 텍스트를 표시하도록 작성되었다.예를 들어, C와 COBOL의 동등한 코드 블록을 비교하여 주간 수익을 계산합니다.
// C에서의 계산: 한다면 (월급쟁이) 양 = 40 * 급료; 또 다른 양 = 몇시간. * 급료;
*> COBOL에서의 계산: 한다면 월급쟁이 그리고나서 증배 급여율 타고 40 부여 양 또 다른 증배 급여율 타고 몇시간. 부여 양 엔드 IF.
*> COBOL 계산의 다른 예: 한다면 월급쟁이 컴퓨팅 양 = 급여율 * 40 또 다른 컴퓨팅 양 = 몇시간. * 급료 엔드 IF.
순수 프롤로그 로직은 관계의 관점에서 표현되며 이러한 관계에 대한 쿼리를 실행함으로써 실행이 트리거됩니다.루프와 같은 구조는 재귀 관계를 사용하여 구현됩니다.
이 세 언어 모두 예약어 수는 다르지만 동일한 유형의 문제를 해결할 수 있습니다.이 "힘"은 튜링-완전 언어 집합에 속하는 것과 관련이 있습니다.
단점들
언어에서 예약어의 정의는 문제를 일으킨다.이 언어는 식별자로 사용할 수 없는 암기해야 할 예약된 단어들의 긴 목록 때문에 새로운 사용자들이 배우는 것이 어려울 수 있다.새로운 기능을 위해 예약된 단어를 추가하면 기존 프로그램이 비활성화되거나 반대로 새로운 의미를 가진 기존 예약된 단어를 "오버로드"하면 혼란스러울 수 있기 때문에 언어를 확장하기가 어려울 수 있습니다.어떤 시스템/컴파일러에 의해 예약되지 않은 단어가 다른 시스템에 의해 예약될 수 있기 때문에 프로그램 포팅에 문제가 있을 수 있습니다.
예약된 단어를 식별자로 사용할 수 없기 때문에 사용자는 다음과 같이 예약된 단어의 의도적인 철자 오류를 식별자로 선택할 수 있습니다.clazz
Java 변수 유형의 경우Class
를 클릭합니다.[17]
예약어 및 언어 독립성
Microsoft의NET Common Language Infrastructure(CLI) 사양에서는 40개 이상의 다른 프로그래밍 언어로 작성된 코드를 최종 제품으로 조합할 수 있습니다.따라서 식별자/예약어 충돌은 한 언어로 구현된 코드가 다른 언어로 작성된 코드를 실행하려고 할 때 발생할 수 있습니다.예를 들어 Visual Basic입니다.NET 라이브러리는 다음과 같은 클래스 정의를 포함할 수 있습니다.
Visual Basic에서의 클래스 정의.네트워크: 일반의 학급 이것. '이 수업은 뭔가를 한다... ' 끝. 학급
이것이 툴박스의 일부로 컴파일되어 배포되는 경우, C# 프로그래머는 타입의 변수를 정의하기를 희망합니다.this
" 에 문제가 발생합니다.'this'
는 C#의 예약어입니다.따라서 다음 항목은 C#에서 컴파일되지 않습니다.
// C#에서 이 클래스 사용: 이것. x = 신규 이것.(); // 컴파일되지 않습니다!
멤버에 액세스하거나 가상 메서드를 재정의하거나 네임스페이스를 식별할 때도 유사한 문제가 발생합니다.
이 문제는 스트로핑으로 해결됩니다.이 문제를 회피하기 위해 이 사양에서는 프로그래머가 (C#에서) 식별자 앞에 앳부호를 배치할 수 있습니다.이 식별자는 컴파일러에 의해 예약된 단어가 아닌 식별자로 간주됩니다.
// C#에서 이 클래스 사용: @이것 x = 신규 @이것(); // 컴파일합니다!
일관성을 위해 로컬 변수, 매개 변수 이름 및 개인 구성원 등 공개되지 않은 설정에서도 이 사용이 허용됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ C99 사양, 7.1.3 예약된 식별자
- ^ C++03 사양, 17.4.3.2.1 글로벌네임 [lib.global.names]
- ^ Jackson, Mark (Sep 26, 2002). "How do you pronounce "__" (double underscore)?". python-list (Mailing list). Retrieved November 9, 2014.
- ^ Hochberg, Tim (Sep 26, 2002). "How do you pronounce "__" (double underscore)?". python-list (Mailing list). Retrieved November 9, 2014.
- ^ "DunderAlias - Python Wiki". wiki.python.org.
- ^ Notz, Pat (Sep 26, 2002). "How do you pronounce "__" (double underscore)?". python-list (Mailing list). Retrieved November 9, 2014.
- ^ "Bug ID: JDK-4211070 Java should support const parameters (like C++) for code maintainence [sic]". Bugs.sun.com. Retrieved 2014-11-04.
- ^ "Lexical grammar - JavaScript MDN". developer.mozilla.org.
- ^ C99 사양, 7.1.3 예약 식별자: "밑줄로 시작하는 모든 식별자, 대문자 또는 다른 밑줄은 항상 모든 사용을 위해 예약되어 있습니다."
- ^ C11: The New C Standard, Thomas Plum, "키워드에 관한 메모"
- ^ The History of Python, 2013년 11월 10일 Guido van Rossum, "None, True and False (및 삽입된 리터럴, 키워드 및 삽입물에 대한 설명)"
- ^ "The Java Language Specification, 3rd Edition, Section 3.9: Keywords". Sun Microsystems. 2000. Retrieved 2009-06-17.
The following character sequences, formed from ASCII letters, are reserved for use as keywords and cannot be used as identifiers[...]
- ^ "ISO/IEC 9899:TC3, Section 6.4.1: Keywords" (PDF). International Organization for Standardization JTC1/SC22/WG14. 2007-09-07.
The above tokens (case sensitive) are reserved (in translation phases 7 and 8) for use as keywords, and shall not be used otherwise.
- ^ Peter Norvig: 인공지능 프로그래밍의 패러다임: 공통 리스프에서의 사례 연구, Morgan Kaufmann, 1991, ISBN 1-55860-191-0, Web
- ^ 공통 Lisp HyperSpec에서 KEWORD를 입력합니다.
- ^ "CLHS: Section 11.1.2.1.2". www.lispworks.com.
- ^ Zammetti, Frank (2007). Practical JavaScript, DOM Scripting and Ajax Projects. Apress. ISBN 9781430201977.