프로그래밍 언어에 키워드가 필요한 이유는 무엇입니까?
예를 들어 (C):
int break = 1;
int for = 2;
왜 컴파일러는 그것을 추론하는데 전혀 문제가 없을까요?break
그리고.for
변수가 여기에 있습니까?
그래서 키워드가 필요한데요.
- 우리는 그 프로그램들이 읽을 수 있기를 원합니다.
- 이미 복잡한 오늘날의 컴파일러 작업을 지나치게 complic하고 싶지 않습니다.
- 하지만 가장 중요한 것은, 만약 어떤 '핵심' 단어들이 어떤 특별한 행동을 위해 남겨져 있다면, 언어는 훨씬 더 강력하다는 것입니다.그러면, 이 언어는 명확한 방식으로 for loop을 구현하려고 시도하다가 죽는 것보다 더 높은 수준에서 유용하다고 생각할 수 있습니다.
그럴 필요는 없어요 -- 포트란은 어떤 단어도 예약하지 않았으니까요, 다음과 같은 것들이 있습니다.
if if .eq. then then if = else else then = if endif
완전한 합법입니다.이것은 컴파일러가 언어를 구문 분석하기 어렵게 만들 뿐만 아니라 사람이 오류를 읽거나 발견하는 것을 거의 불가능하게 만듭니다.예를 들어, 고전적인 Fortran을 생각해 보십시오. 예를 들어, Fortran 77을 통해 -- 최근에 사용한 적은 없지만, 적어도 최근 표준에서는 이와 같은 것을 몇 가지 수정했기를 바랍니다.포트란 DO 루프는 다음과 같습니다.
DO 10 I = 1,10
이들이 나란히 있지 않고서는 이것이 어떻게 달랐는지 알 수 있을 것입니다.
DO 10 I = 1.10
아닙니다. 는 DO 의 가치를 단순하게 할당하는 것입니다.1.10
이름이 붙은 변수에DO 10 I
(예, 이름에 공백도 허용합니다.)포트란은 암시적인(언클리어되지 않은) 변수도 지원하므로 이는 모두 완벽하게 합법적인 것이며 일부 컴파일러는 경고 없이 이를 수락할 수도 있습니다!
그러면 다음과 같은 문구가 나오면 컴퓨터는 무엇을 하게 될까요?
while(1) {
...
if (condition)
break;
}
진짜 깨질까요?아니면 그것을 그것으로 취급해야 할까요?1;
?
특정한 경우에 언어가 모호해지거나, 아주 똑똑한 파서를 만들어야 하고, 미묘한 구문을 추론할 수 있습니다. 그것은 불필요한 추가 작업일 뿐입니다.
없어요.PL/1에는 키워드가 없는 것으로 유명하며, 모든 "키워드"(BEGIN, DO, ...)도 변수 이름으로 사용할 수 있습니다.그러나 이를 허용하면 정말 모호한 코드를 작성할 수 있습니다. IF DO > BEGINTHEN PRINT:=CALL-GOTO; 이름 집합이 보통(PL/1:-를 제외하고 지금까지 본 모든 언어에서 그러하듯이) 언어로 "문 키워드"를 예약하는 것은 일반적으로 손실이 되지 않습니다.
APL에도 키워드가 없는 것으로 유명합니다.하지만 복잡한 연산자를 쓸 수 있는 200여개의 놀라운 상징들이 있습니다.("domino" 연산자 [묻지마!]는 가운데에 계산기 구분 기호가 있는 네모난 상자입니다.) 이 경우, 랭귀지 설계자들은 키워드 대신 아이콘만을 사용했습니다.결과적으로 APL은 "쓰기 전용" 언어로 명성을 얻고 있습니다.
결론: 필수 사항은 아니지만, 키워드가 프로그래머들에게 알려진 작은 집합에서 예약된 식별자일 경우 프로그램을 훨씬 더 쉽게 읽을 수 있게 만드는 경향이 있습니다. (일부 언어학자들은 "키워드"가 "."와 같은 특별한 구두점 문자로 시작하여 모든 가능한 식별자를 사용할 수 있도록 해야 한다고 주장합니다.그러나 이는 별도로 입력할 필요가 없거나 페이지에 혼란을 줄 필요가 없습니다. 키워드 세트가 작을 때 키워드와 일치하는 "식별자"를 멀리하기가 매우 쉽습니다.
태그가 C이므로 원래 C 언어는 기본적으로 모든 변수가 유형으로 정의되도록 했습니다.int
.
라는 뜻입니다.foo;
유형의 변수를 선언할 것입니다.int
.
그렇다고 치자.break;
. 그렇다면 컴파일러는 당신이 다음과 같은 이름의 변수를 선언할지 여부를 어떻게 알 수 있습니까?break
또는 키워드를 사용합니다.break
?
몇 가지 이유:
표본에서 키워드가 모호하지 않은 것처럼 보일 수 있습니다.그러나 변수 'break' 또는 변수 'for'를 사용하는 곳은 이뿐만이 아닙니다.
파서를 쓰는 것은 훨씬 더 어렵고 실수하기 쉽습니다.
라이브러리에서 함수 또는 절차 이름으로 키워드를 사용하는 것은 원하지 않거나 보안과 관련된 부작용을 가질 수 있습니다.
다른 사람들이 말했듯이, 이것은 컴파일러가 당신의 소스 코드를 파싱하는 것을 더 쉽게 해줍니다.그러나 소스 코드를 보다 쉽게 읽을 수 있도록 해준다는 점에서 좀 더 말씀드리고 싶습니다. 다음 예를 들어 보겠습니다.
만약 (만약 > 0이라면) = 10 end if
두 번째 "if"와 두 번째 "then"은 변수이고 다른 변수들은 변수가 아닙니다.이런 종류의 코드는 읽을 수 없는 것 같습니다.:)
우리가 C++를 말하는 것이라면, C++는 이미 매우 복잡한 문법을 가지고 있습니다.예를 들어 키워드를 변수 이름으로 사용할 수 있도록 허용하면 문제가 더욱 복잡해집니다.
다음과 같은 내용을 작성하면 컴파일러에 문제가 발생합니다.
while(*s++);
return(5);
루프인가요 아니면 이름이 붙은 함수에 대한 호출인가요?while
? 현재 함수에서 값 5를 반환하시겠습니까, 아니면 이름이 붙은 함수를 호출하시겠습니까?return
?
특별한 의미를 가진 구성요소가 단순히 특별한 이름을 가지고 있다면, 그것은 종종 그것들을 명확하게 지칭하는 데 사용될 수 있는 특별한 이름을 가지고 있다면, 그것은 종종 그것들을 단순화시킵니다.
우리는 약간의 제정신 상태를 유지하고 싶기 때문입니다.
void myfunction(bool) { .. };
funcp while = &myfunction;
while(true);
파서를 쓰는 것이 불가능하지는 않더라도 매우 이상하게 보이는 것 같습니다.예
int break = 1;
while (true) {
// code to change break
if (!break) break; // not very readable code.
}
언어 정의에 따라 컴파일러는 키워드가 필요할 수도 있고 필요하지 않을 수도 있습니다.무엇을 해야 할지 모르는 경우 우선 순위 규칙을 적용하거나 실패할 수 있습니다.
예:
void return(int i){printf("%d",i);}
public int foo(int a)
{
if(a > 2)return (a+1)*2;
return a + 3;
}
a가 2보다 크면 어떻게 됩니까?
- 언어 사양에 따라 컴파일러에 오류가 발생할 수 있습니다.
- 언어 사양에 따라 컴파일러가 반환 함수를 사용해야 할 수 있습니다.
- 언어 사양에 따라 컴파일러가 반환해야 할 수 있습니다.
키워드를 사용하지 않는 언어를 정의할 수 있습니다.모든 기호를 바꿀 수 있는 언어를 정의할 수도 있습니다(단, 매우 짧은 키워드만 해당).
문제는 컴파일러가 아닙니다. 사양이 완벽하고 오류가 없으면 작동합니다.문제는 PEBCAD인데, 기호 정의를 추적해야 하기 때문에 언어의 이 기능을 사용하는 프로그램은 읽기 어려울 것입니다.
FWIW, Tcl에 예약어가 없습니다."if", "break" 등의 변수와 함수를 가질 수 있습니다.토큰의 해석은 상황에 따라 전적으로 좌우됩니다.동일한 토큰은 한 컨텍스트의 명령어, 다른 컨텍스트의 변수 또는 다른 컨텍스트의 리터럴 문자열을 나타낼 수 있습니다.
많은 경우 컴파일러는 예제와 같이 키워드를 일반 식별자로 해석할 수 있습니다.
int break = 1;
int for = 2;
사실, 나는 이것을 하는 간단한 조립 같은 장난감 언어를 위한 컴파일러를 만들었을 뿐이지만, 그런 경우에는 사용자에게 경고를 합니다.
그러나 때때로 구문은 키워드와 식별자가 모호한 방식으로 정의됩니다.
int break;
while(...)
{
break; // <-- treat this as expression or statement?
}
그리고 가장 분명한 이유는 편집자들이 키워드를 강조해서 코드를 사람들이 읽을 수 있도록 할 것이기 때문입니다.키워드를 식별자로 취급할 수 있도록 허용하면 코드 강조 표시가 어려워지고 코드의 가독성이 떨어지게 됩니다.
언급URL : https://stackoverflow.com/questions/2452365/why-does-a-programming-language-need-keywords
'sourcetip' 카테고리의 다른 글
C 내장 소프트웨어에서 룩업 테이블 대 스위치 (0) | 2023.10.30 |
---|---|
도커 컨테이너 실행 시 자동으로 서비스를 시작하는 방법은? (0) | 2023.10.30 |
SonarQuebe가 AngularJS로 멋지게 플레이하게 하는 방법은? (0) | 2023.10.30 |
디버그는 어디에 있습니까?안드로이드 스튜디오의 키스토어 (0) | 2023.10.25 |
AngularJS에서 구성 단계를 테스트하는 장치 (0) | 2023.10.25 |