간단히 말해서
프로그래밍 언어는 프로그램을 문자열로 나타내는 구문과 프로그램의 의도 된 의미 인 의미로 구성됩니다.
공식 언어는 의미없는 구문입니다. 일반적으로 문자열에 의미를 부여하지 않고 공식적으로 정의 된 문자열 세트의 구조를 연구하기위한 것입니다.
정규 표현 및 기타 형식 (예 : 문맥없는 문법)은 공식 언어를 정의하는 데 사용되며 프로그래밍의 구문 구성 요소 및 자연 언어로 사용됩니다. 즉 문장을 구조화 된 방식으로 표현합니다. 이 구조를 프로그래밍 언어의 의미와 관련시키기 위해 다른 메커니즘이 사용됩니다.
특히 자연 언어와 관련하여 많은 부분이 단순화되었습니다.
훨씬 더 자세한 내용
귀하의 질문에 대답하기 위해 처음부터 시작해야합니다. 일반적인 의미의 언어는 비공식적으로 정보 나 아이디어를 전달하는 수단입니다. 언어에서는 일반적으로 구문과 의미를 구별합니다. 의미론은 당신이 말하고 쓰고 싶은 것입니다. 전달하려는 정보. 구문은 전달하기 위해 사용하는 수단, 즉 사람간에, 그리고 이제 사람과 장치간에 또는 장치 (컴퓨터)간에 교환 될 수있는 일반적인 표현입니다.
일반적으로, 당신은 개의 dog
아이디어를 전달 하기 위해 단어 를 사용합니다 . 이 단어 dog
는 세 글자 또는 동등한 소리로 만들어졌으며 어떤 종류의 동물을 나타 내기위한 것입니다. 핵심 아이디어는 의사 소통이 의사 소통 대상을 표현함으로써 이루어집니다. 표현 구조는 일반적으로 구문이라고하며 표현되는 것을 의미론이라고합니다. 프로그래밍 언어뿐만 아니라 자연어에도 다소 차이가 있습니다.
단어는 다소 기본적인 의미 론적 개념을 나타내는 구문 적 실체입니다. 그러나 이러한 기본 개념은보다 복잡한 의미를 부여하기 위해 다양한 방식으로 결합되어야합니다. 우리 the dog
는 특정 개를 의미 the dog bites the cat
하고 더 복잡한 아이디어를 전달하기 위해 글 을 씁니다
. 그러나 단어가 구성되는 방식은 규칙에 따라 수정되어야하므로 개와 고양이 중 어느 것이 실제로 다른 것을 물고 있는지 알 수 있습니다.
그래서 우리는 sentence -> subject verb complement
문장과 일치하는 규칙을 가지고 있으며 각 부분과 관련된 아이디어가 어떻게 표현되는지 알려줍니다. 이러한 규칙은 구문 표현 규칙으로, 메시지 표현 방식을 알려줍니다. 는 subject
자체 규칙에 의해 정의 할 수 있습니다 subject -> article noun
등등합니다.
2 x + 1 = 23엑스123
equation -> expression "=" expression
expression -> expression "+" expression
expression -> number
프로그래밍 언어의 구조는 동일합니다. 프로그래밍 언어는 해결해야 할 문제, 이론 증명 또는 동물 간의 우호적 인 관계를 표현하는 것보다 수행 할 계산을 표현하는 데 의미 적으로 특화되어 있습니다. 그러나 이것이 주요 차이점입니다.
구문에 사용되는 표현은 일반적으로 문자열 또는 음성 언어의 소리입니다. 시맨틱은 일반적으로 추상 영역 또는 현실에 속하지만 여전히 우리의 사고 과정이나 장치의 행동 영역에서 추상화됩니다. 통신은 정보 / 아이디어를 신택스로 인코딩하는 것을 수반하며, 이는 수신기에 의해 전송 및 디코딩된다. 그러면 결과는 수신자에 의해 어떤 방식 으로든 해석됩니다.
언어에 대해 우리가 보는 것은 주로 구문과 구조입니다. 위의 예는 구문 문자열과 구조적 구조를 정의하는 가장 일반적인 방법 중 하나 일뿐입니다. 다른 것도 있습니다. 주어진 언어의 경우, 일부 문자열에는 구조가 할당 될 수 있으며 언어에 속한다고 말하지만 다른 문자열에는 그렇지 않습니다.
단어도 마찬가지입니다. 문자 (또는 소리)의 일부 순서는 합법적 인 단어이지만 다른 문자는 그렇지 않습니다.
공식 언어는 의미가없는 구문 일뿐입니다. 알파벳의 기본 요소를 사용하여 시퀀스를 구성 할 수있는 일련의 규칙을 정의합니다. 규칙은 매우 다양하고 때로는 복잡 할 수 있습니다. 그러나 공식 언어는 자연어 프로그래밍 언어에 관계없이 언어 적 의사 소통을 넘어 많은 수학적 목적으로 사용됩니다. 언어로 문자열을 정의하는 규칙 세트를 문법이라고합니다. 그러나 언어를 정의하는 다른 많은 방법이 있습니다.
실제로 언어는 두 가지 수준으로 구성됩니다. 어휘 수준은 알파벳 문자로 구성된 단어를 정의합니다. 구문 수준은 문장 또는 단어의 알파벳 (또는 더 정확하게는 단어 패밀리로 구성되어 유한 알파벳으로 유지됨)으로 구성된 프로그램을 정의합니다. 이것은 반드시 다소 단순화됩니다.
단어의 구조는 대부분의 언어 (프로그래밍 또는 자연어)에서 상당히 단순하므로 일반적으로 가장 간단한 형식 언어 인 일반 언어로 간주되는 언어로 정의됩니다. 정규식 (regexp)으로 정의 할 수 있으며 유한 상태 오토마타라고하는 프로그래밍 된 장치로 쉽게 식별 할 수 있습니다. 프로그래밍 언어의 경우, 단어의 예는 식별자, 정수, 문자열, 실수, 예약어 등이다 if
또는 repeat
, 구두점 기호 나 열린 괄호. 단어 패밀리의 예는 식별자, 문자열, 정수입니다.
구문 수준은 일반적으로 단어를 알파벳으로 사용하여 문맥이없는 언어 인 좀 더 복잡한 형식의 언어로 정의됩니다. 위에서 본 규칙은 자연어에 대한 컨텍스트없는 규칙입니다. 프로그래밍 언어의 경우 규칙은 다음과 같습니다.
statement -> assignment
statement -> loop
loop -> "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression
이러한 규칙을 사용하면 다음을 작성할 수 있습니다.
while aaa /= bbb do aaa = aaa + bbb / 6
이것은 진술입니다.
그리고 그것이 만들어지는 방식은 구문 분석 트리 또는 구문 트리 (여기서는 완료되지 않음)라는 트리 구조로 표현 될 수 있습니다.
statement
|
_______________ loop _______________
/ / \ \
"while" expression "do" statement
__________|_________ |
/ | \ assignment
expression "operator" expression _______|_______
| | | / | \
"identifier" "/=" "identifier" "identifier" "=" expression
| | | |
aaa bbb aaa ... ...
규칙 왼쪽에 표시되는 이름은 비 터미널이라고하며 단어는 언어의 알파벳 (어휘 수준 이상)이므로 터미널이라고도합니다. 비 터미널은 프로그램을 구성하는 데 사용할 수있는 다른 구문 구조를 나타냅니다.
이러한 규칙은 컨텍스트가없는 것으로 불립니다. 비 터미널은 표시되는 컨텍스트와 상관없이 해당 규칙을 사용하여 임의로 대체 할 수 있기 때문입니다. 언어를 정의하는 규칙 세트를 문맥없는 문법이라고합니다.
실제로 식별자를 처음 선언해야하거나식이 형식 제한을 충족해야하는 경우에는 제한이 있습니다. 그러나 이러한 제한은 구문 적이 라기보다는 의미 론적이라고 간주 될 수 있습니다. 실제로 일부 전문가들은 정적 의미론 (static semantics) 에 배치합니다
.
어떤 문장, 어떤 프로그램이 주어지면, 그 문장의 의미는이 문장에 대한 구문 분석 트리에 의해 주어진 구조를 분석함으로써 추출됩니다. 따라서 프로그램이 제공 될 때 프로그램에 해당하는 트리 구조를 복구 할 수있는 파서 (parsers)라는 알고리즘을 개발하는 것이 매우 중요합니다.
구문 분석기 앞에는 단어를 인식하고 해당 단어의 계열을 결정하는 어휘 분석기가 있습니다. 그런 다음 기본 트리 구조를 검색하는 구문 분석기에 단어 시퀀스 또는 어휘 요소가 제공됩니다. 이 구조에서 컴파일러는 코드를 생성하는 방법을 결정할 수 있으며, 이는 프로그램의 의미 부분이 컴파일러 측에서 처리됩니다.
컴파일러의 구문 분석기는 실제로 구문 분석 트리에 해당하는 데이터 구조를 빌드하고 컴파일 프로세스의 후반 단계로 전달할 수 있지만 반드시 그럴 필요는 없습니다. 구문 분석 알고리즘을 실행하면 프로그램 텍스트에 내재 된 구문 트리를 탐색하기위한 계산 전략을 개발할 수 있습니다. 이 구문 / 구문 분석 트리는 컴파일 전략 (단계 수)에 따라 프로세스에서 명시되거나 명시되지 않을 수 있습니다. 그러나 계산 구조에 명시 적이든 암묵적이든 관계없이 궁극적으로 파스 트리의 상향식 탐색이 적어도 하나는 필요하다.
그 이유는, 직관적으로, 구문 트리 구조와 관련된 의미론을 정의하는 표준 형식적인 방법은 동종 성 (homomorphism)에 의한 것이기 때문입니다. 큰 말을 두려워하지 마십시오. 아이디어는 단지 전체의 의미를 부품을 연결하는 연산자를 기준으로 부품의 의미에서 구성한다는 것을 고려하는 것입니다.
예를 들어, 문장 the dog bites the cat
을 규칙으로 분석 할 수 있습니다 sentence -> subject verb complement
. 아는 3 개 하위 트리의 의미 subject
, verb
그리고 complement
그들을 피사체가 행동을하고 있는지, 그리고 고양이가 물린 사람이다라고 우리에게 이야기 구성하는 것이 규칙.
이것은 직관적 인 설명 일 뿐이지 만 공식화 할 수 있습니다. 시맨틱은 구성 요소에서 위쪽으로 구성됩니다. 그러나 이것은 많은 복잡성을 숨 깁니다.
컴파일러의 내부 작업은 여러 단계로 분해 될 수 있습니다. 실제 컴파일러는 중간 표현을 사용하여 단계별로 작동 할 수 있습니다. 일부 단계를 병합 할 수도 있습니다. 이것은 사용되는 기술과 현재 컴파일 언어의 복잡성에 달려 있습니다.