sourcetip

프로그래밍 언어에 키워드가 필요한 이유는 무엇입니까?

fileupload 2023. 10. 30. 21:11
반응형

프로그래밍 언어에 키워드가 필요한 이유는 무엇입니까?

예를 들어 (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

반응형