(이는 내가 의도 한 것보다 더 깁니다. 참아주세요.)
대부분의 언어는 "구문"이라고하는 것으로 구성됩니다. 언어는 잘 정의 된 여러 키워드로 구성되며 해당 언어로 구성 할 수있는 전체 범위의 표현식은 해당 구문에서 구성됩니다.
예를 들어, 한 자리 정수만 입력하고 연산 순서를 완전히 무시하는 간단한 4 기능 산술 "언어"가 있다고 가정 해 보겠습니다 (단순한 언어라고 말씀 드렸습니다). 해당 언어는 다음 구문으로 정의 할 수 있습니다.
// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /
이 세 가지 규칙에서 원하는 수의 단일 숫자 입력 산술 표현식을 작성할 수 있습니다. 그런 다음이 구문 파서를 작성할 수 유효한 그 구성 유형에 입력 (고장 $expression
, $number
또는 $operator
결과에)와 거래. 예를 들어, 표현식 3 + 4 * 5
은 다음과 같이 분류 할 수 있습니다.
// Parentheses used for ease of explanation; they have no true syntactical meaning
$expression = 3 + 4 * 5
= $expression $operator (4 * 5) // Expand into $exp $op $exp
= $number $operator $expression // Rewrite: $exp -> $num
= $number $operator $expression $operator $expression // Expand again
= $number $operator $number $operator $number // Rewrite again
이제 원래 표현식에 대해 정의 된 언어로 완전히 구문 분석 된 구문이 있습니다. 이 정보가 있으면 모든 조합의 결과를 찾기 위해 구문 분석기를 작성하고 $number $operator $number
하나만 $number
남았을 때 결과를 뱉어 낼 수 있습니다 .
$expression
원래 표현식의 최종 구문 분석 버전에는 구문이 남아 있지 않습니다 . 그것은 $expression
항상 우리 언어로 다른 것들의 조합으로 축소 될 수 있기 때문 입니다.
PHP는 거의 동일합니다. 언어 구조는 우리의 $number
또는 $operator
. 그것들 은 다른 언어 구조로 축소 될 수 없습니다 . 대신 그들은 언어가 구축되는 기본 단위입니다. 함수와 언어 구조의 주요 차이점은 다음과 같습니다. 파서는 언어 구조를 직접 처리합니다. 기능을 언어 구조로 단순화합니다.
언어 구조가 괄호를 필요로 할 수도 있고 필요하지 않을 수도있는 이유와 일부는 반환 값을 갖는 이유와 나머지는 PHP 파서 구현의 특정 기술 세부 사항에 전적으로 의존하지 않습니다. 나는 파서가 어떻게 작동하는지에 대해 잘 모르기 때문에 이러한 질문을 구체적으로 다룰 수는 없지만 다음으로 시작하는 언어를 잠시 상상해보십시오.
$expression := ($expression) | ...
효과적으로,이 언어는 찾은 모든 표현을 자유롭게 사용하고 둘러싼 괄호를 제거합니다. PHP (그리고 여기에서는 순수한 추측을 사용하고 있습니다)는 언어 구조에 대해 비슷한 것을 사용할 print("Hello")
수 있습니다 . print "Hello"
파싱되기 전으로 축소 되거나 그 반대 일 수 있습니다 (언어 정의는 괄호를 추가하고 제거 할 수 있음).
이것이 echo
또는 같은 언어 구조를 재정의 할 수없는 이유의 근원입니다 print
. 이들은 파서에 효과적으로 하드 코딩되는 반면, 함수는 언어 구조 집합에 매핑되고 파서는 컴파일 또는 런타임에 해당 매핑을 다음과 같이 변경할 수 있습니다. 자신의 언어 구성 또는 표현 세트를 대체하십시오.
결국 구문과 표현식의 내부 차이점은 다음과 같습니다. 언어 구문은 파서가 이해하고 처리합니다. 내장 함수는 언어에 의해 제공되지만 구문 분석 전에 언어 구성 세트에 매핑되고 단순화됩니다.
더 많은 정보:
편집 : 다른 답변 중 일부를 읽으면 사람들이 좋은 점을 만듭니다. 그중 :
- 내장 된 언어는 함수보다 호출이 더 빠릅니다. 이것은 PHP 인터프리터가 파싱하기 전에 해당 함수를 해당 언어 내장 등가물에 매핑 할 필요가 없기 때문에 미미하지만 사실입니다. 그러나 현대 컴퓨터에서는 그 차이가 상당히 미미합니다.
- 내장 된 언어는 오류 검사를 우회합니다. 이것은 각 내장의 PHP 내부 구현에 따라 사실 일 수도 있고 그렇지 않을 수도 있습니다. 함수가 더 많은 고급 오류 검사 및 내장 기능이 제공하지 않는 기타 기능을 갖는 경우가 많을 것입니다.
- 언어 구조는 함수 콜백으로 사용할 수 없습니다. 구조가 함수 가 아니기 때문에 이것은 사실 입니다. 그들은 별개의 개체입니다. 내장을 코딩 할 때 인수를받는 함수를 코딩하는 것이 아닙니다. 내장 구문은 파서가 직접 처리하며 함수가 아닌 내장으로 인식됩니다. (일급 함수를 사용하는 언어를 고려하면 이해하기 더 쉬울 수 있습니다. 효과적으로 함수를 객체로 전달할 수 있습니다. 내장 기능으로는 수행 할 수 없습니다.)