Bir dil yapı ve "yerleşik" arasındaki fark nedir

4 Cevap php

O include, isset, require, print, echo biliyorum, ve bazı diğerleri fonksiyonlar değil ama dil yapıları.

Bu dil yapılardan bazıları, diğerleri yok parantez gerekir.

require 'file.php';
isset($x);

Bazıları değil, bir geri dönüş değeri vardır.

print 'foo'; //1
echo  'foo'; //no return value

Yani bir dil yapı ve yerleşik bir fonksiyonu arasındaki internal fark nedir?

Herhangi bir tavsiye thx! :-)

4 Cevap

(Bu ben daha uzundur; lütfen bana ayı.)

Bu sözdizimi kadar inşa dil birkaç iyi tanımlanmış anahtar kelime oluşur, ve bu dilde inşa ifadelerin tam aralığı: En dilleri bir "sözdizimi" denilen bir şey oluşur.

Örneğin, yalnızca giriş olarak tek haneli tamsayıları alır ve tamamen işlemlerin sırasını (Ben basit bir dil olduğunu söylemiştim) sayar basit bir dört fonksiyonlu aritmetik "dil" var diyelim. Bu dil sözdizimi ile tanımlanabilir:

// The | means "or" and the := represents definition
$expression := $number | $expression $operator $expression
$number := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
$operator := + | - | * | /

Bu üç kural dışında, tek haneli giriş aritmetik ifadeler herhangi bir sayıda inşa edebilirsiniz. Daha sonra bileşen tipleri ($expression, $number, ya da $operator) ve sonucu ile fırsatlar içine herhangi bir geçerli girdi bozulduğu bu sözdizimi için bir ayrıştırıcı yazabilirsiniz . Örneğin aşağıdaki gibi, sentezleme 3 + 4 * 5 kırılmış olabilir:

// 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

Şimdi orijinal ifadesi için bizim tanımlanan dilde, tam çözümlü sözdizimi vardır. Biz bu var, biz geçmesi ve $number $operator $number tüm kombinasyonları sonuçlarını bulmak için bir ayrıştırıcı yazmak, ve biz sadece bir $number sol olduğunda bir sonuç tükürmek.

Bizim orijinal ifadenin son çözümlenen sürümünde sol hiç $expression yapıları olduğuna dikkat çekmek. $expression her zaman dilinde diğer şeylerin bir kombinasyonu azaltılabilir olmasıdır.

PHP çok aynıdır: dil yapıları bizim $number veya $operator eşdeğer olarak kabul edilmektedir. Bunlar, cannot be reduced into other language constructs; Bunun yerine, onlar dil inşa edildiği temel birimler sensin. Dil yapıları ile doğrudan ayrıştırıcı fiyatlar: işlevleri ve dil yapıları arasındaki önemli fark şudur. Bu dil yapılarının içine işlevlerini kolaylaştırır.

Diğerleri PHP çözümleyici uygulama özel teknik ayrıntılar tamamen bağlıdır yok ederken dil yapıları ya da parantezler ve bazı dönüş değerlerine sahip akıl gerektiren olmayabilir ki sebebi. Ben ayrıştırıcı nasıl çalıştığını iyi yetişmiş değilim, bu yüzden özellikle bu soruları, ancak bu ile başlayan ikinci bir dil için hayal bile edemiyorum:

$expression := ($expression) | ...

Etkili, bu dil bulduğu ifadeleri alır ve çevredeki parantez kurtulmak ücretsizdir. PHP (ve burada saf varsayımları istihdam ediyorum) kendi dil yapılarının benzer bir şey istihdam edilebilir: incelenir oluyor önce print("Hello") print "Hello" düşürülebilir alabilirsiniz, ya da tam tersi (dil tanımlamaları ) parantez yanı sıra onlardan kurtulmak ekleyebilirsiniz.

Bu echo veya print gibi dil yapılarını yeniden tanımlayabilirsiniz neden kök: fonksiyonları bir dil yapıları kümesi eşleştirilir oysa onlar etkili, çözümleyici içine kodlanmış konum ve ayrıştırıcı Eğer dil yapıları veya ifadelerin kendi kümesi yerine, derleme veya zamanında bu eşleştirmeyi değiştirebilirsiniz.

Günün sonunda, yapıları ve ifadeler arasındaki iç fark şudur: dil yapıları çözümleyici tarafından anlaşılamaz ve dağıtılır. Yerleşik işlevleri, dil tarafından sağlanan olurken, ayrıştırma önce eşleştirilir ve bir dil yapıları kümesi basitleştirilmiş.

Daha fazla bilgi:

  • Backus-Naur form, biçimsel dilleri tanımlamak için kullanılan sözdizimi (yacc'ait bu formu kullanır)

Edit:, diğer bazı yanıtları yoluyla okuma, insanların iyi puan yapmak. Bunlar arasında:

  • Bir dil yerleşik bir işlevi daha aramak için hızlıdır. Sadece marjinal eğer PHP yorumlayıcı ayrıştırma önce, dil yerleşik eşdeğerleri bu işlevi haritasına gerekmez, çünkü bu, doğrudur. Modern bir makine üzerinde olsa da, fark oldukça ihmal edilebilir düzeydedir.
  • Yerleşik bir dil hata denetimini atlar. Bu da her yerleşiğini için PHP iç uygulanmasına bağlı olarak, doğru olmayabilir. Bu daha sık değil, fonksiyonlar yerleşikleri değil daha gelişmiş hata denetimi ve diğer özelliğe sahip olacağı kesinlikle doğrudur.
  • Dil yapılar fonksiyonu geri aramalar olarak kullanılamaz. Bu bir kurgudur, çünkü doğrudur not a function. Bunlar ayrı varlıklar demektir. Bir yerleşiğine kod zaman, argüman alan bir fonksiyon kodlama değil - yerleşiği sözdizimi çözümleyici tarafından doğrudan ele alınır ve yerine bir işlevi daha bir yerleşiğini olarak kabul edilmektedir. (Bu, birinci sınıf fonksiyonları ile dil düşünün anlamak daha kolay olabilir:. Etkili, nesnelerin olarak etrafında fonksiyonları geçebilir Bunu yerleşikleri ile yapamazsınız.)

Dil yapıları (..., "eğer", "süre" gibi talimatlar gibi) dilin kendisi tarafından sağlanır; dolayısıyla adı.

Bunun bir sonucu da işlevlerine göre aramak için hızlı olmasıdır (or so I've heard/read several times)

Ben nasıl yapıldığını bilmiyorum, ama onlar (çünkü langage doğrudan entegre olma) yapabileceği bir şey hata işleme mekanizmasından bir tür "bypass" dir. Örneğin, isset Bildirimi neden olmadan mevcut olmayan değişkenlerle kullanılabilir:

function test($param) {}
if (test($a)) {
    // Notice: Undefined variable: a
}

if (isset($b)) {
    // No notice
}

Note it's not the case for all of the languages constructs.

Fonksiyonları ve dil yapıları arasındaki bir diğer fark, bazı kişilere bir anahtar kelime gibi, parantez olmadan denebilecek olmasıdır.

Örneğin:

echo 'test'; // language construct => OK

function my_function($param) {}
my_function 'test'; // function => Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

Here too, it's not the case for all language constructs.

Ben bir dil yapısı "devre dışı" hiçbir şekilde absolutly olduğunu varsayalım: o dilin kendisi bir parçasıdır. Öte yandan, çok '"yerleşik" PHP fonksiyonları gerçekten yerleşik değildir ve uzantıları tarafından sağlanmaktadır - ki, bazıları için, her zaman aktive (but not all of them) edilir

Bir başka fark ise dil yapıları (örneğin Yani, geri aramalar,) "işlev işaretçileri" olarak kullanılamaz olduğunu:

$a = array(10, 20);

function test($param) {echo $param . '<br />';}
array_map('test', $a);  // OK (function)

array_map('echo', $a);  // Warning: array_map() expects parameter 1 to be a valid callback, function 'echo' not found or invalid function name

Ben başka bir fikir şu anda benim aklıma gelen yok ... ve ben PHP internals hakkında çok şey bilmiyorum ... Yani ^ ^ şimdi o olacak

, Burada çok cevap alamıyorsanız, belki size mailling-list internals (bkz. http://www.php.net/mailing-lists.php), birçok PHP çekirdek geliştiricilerin var nerede bu sorabilirsiniz muhtemelen ^ ^ bu şeyler hakkında bilemez olanlar

(And I'm really interested by the other answers, btw ^^ )

Bir referans olarak: list of keywords and language constructs in PHP

Kod yoluyla sığ sonra, ben php yacc dosyasındaki bazı ifadeleri ayrıştırmak olduğunu tespit ettik. Bu yüzden özel durumlardır.

(Zend / zend_language_parser.y bakınız)

Bunun dışında ben başka farklılıklar olduğunu sanmıyorum.

You can override built-in functions. Anahtar sonsuza dek vardır.