tesis sistemas sistema recomendacion hacer como php function built-in language-construct

php - sistemas - sistema de recomendacion tesis



¿Cuál es la diferencia entre una construcción de lenguaje y una función "incorporada" en PHP? (4)

(Esto es más largo de lo que pretendía, por favor tengan paciencia conmigo).

La mayoría de los lenguajes están formados por algo llamado "sintaxis": el lenguaje se compone de varias palabras clave bien definidas, y el rango completo de expresiones que puede construir en ese idioma se crea a partir de esa sintaxis.

Por ejemplo, supongamos que tiene un "lenguaje" aritmético de cuatro funciones simple que solo toma enteros de un solo dígito como entrada e ignora por completo el orden de las operaciones (le dije que era un lenguaje simple). Ese lenguaje podría definirse por la sintaxis:

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

A partir de estas tres reglas, puede construir cualquier cantidad de expresiones aritméticas de entrada de un solo dígito. Luego puede escribir un analizador para esta sintaxis que descompone cualquier entrada válida en sus tipos de componentes ( $expression , $number u $operator ) y trata el resultado. Por ejemplo, la expresión 3 + 4 * 5 se puede desglosar de la siguiente manera:

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

Ahora tenemos una sintaxis completamente analizada, en nuestro lenguaje definido, para la expresión original. Una vez que tenemos esto, podemos ir y escribir un analizador para encontrar los resultados de todas las combinaciones de $number $operator $number , y escupir un resultado cuando solo nos queda un $number .

Tenga en cuenta que no quedan constructos de $expression en la versión analizada final de nuestra expresión original. Eso es porque la $expression siempre se puede reducir a una combinación de otras cosas en nuestro idioma.

PHP es muy similar: las construcciones de lenguaje se reconocen como el equivalente de nuestro $number o $operator . No se pueden reducir a otras construcciones idiomáticas ; en cambio, son las unidades base a partir de las cuales se construye el lenguaje. La diferencia clave entre funciones y construcciones de lenguaje es la siguiente: el analizador trata directamente con construcciones de lenguaje. Simplifica las funciones en construcciones de lenguaje.

La razón por la cual las construcciones de lenguaje pueden o no requerir paréntesis y la razón por la cual algunos tienen valores de retorno mientras que otros no dependen completamente de los detalles técnicos específicos de la implementación del analizador de PHP. No soy tan versado en cómo funciona el analizador sintáctico, así que no puedo abordar estas preguntas específicamente, pero imagino por un segundo un lenguaje que comienza con esto:

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

Efectivamente, este lenguaje es libre de tomar cualquier expresión que encuentre y deshacerse de los paréntesis que lo rodean. PHP (y aquí estoy empleando pura conjetura) puede emplear algo similar para sus constructos de lenguaje: print("Hello") podría reducirse para print "Hello" antes de ser analizado, o viceversa (las definiciones de lenguaje pueden agregar paréntesis como así como deshacerse de ellos).

Esta es la raíz de por qué no se pueden redefinir construcciones de lenguaje como echo o print : están efectivamente codificadas en el analizador, mientras que las funciones se asignan a un conjunto de construcciones de lenguaje y el analizador le permite cambiar esa asignación en compilación o tiempo de ejecución para sustituir su propio conjunto de construcciones o expresiones de lenguaje.

Al final del día, la diferencia interna entre constructos y expresiones es la siguiente: el analizador comprende y maneja los constructos del lenguaje. Las funciones incorporadas, aunque proporcionadas por el idioma, se asignan y se simplifican a un conjunto de construcciones de lenguaje antes del análisis.

Más información:

  • Forma de Backus-Naur , la sintaxis utilizada para definir los lenguajes formales (yacc utiliza este formulario)

Editar: Leyendo algunas de las otras respuestas, las personas hacen buenos puntos. Entre ellos:

  • Un lenguaje integrado es más rápido de llamar que una función. Esto es cierto, aunque sea marginalmente, porque el intérprete de PHP no necesita asignar esa función a sus equivalentes incorporados en el lenguaje antes de analizar. En una máquina moderna, sin embargo, la diferencia es bastante insignificante.
  • Un lenguaje integrado evita la comprobación de errores. Esto puede o no ser cierto, dependiendo de la implementación interna de PHP para cada uno de ellos. Ciertamente, es cierto que, en la mayoría de los casos, las funciones tendrán una comprobación de errores más avanzada y otras funciones que los integrantes no tienen.
  • Las construcciones de lenguaje no se pueden usar como devoluciones de llamada de funciones. Esto es cierto, porque una construcción no es una función . Son entidades separadas. Cuando codifica una función incorporada, no está codificando una función que toma argumentos: la sintaxis de la función incorporada la maneja directamente el analizador, y se reconoce como una función integrada, en lugar de una función. (Esto puede ser más fácil de entender si considera idiomas con funciones de primera clase: efectivamente, puede pasar funciones como objetos. No puede hacer eso con construcciones internas).

Sé que include , isset , require , print , echo y algunos otros no son funciones sino construcciones de lenguaje.

Algunos de estos constructos de lenguaje necesitan paréntesis, otros no.

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

Algunos tienen un valor de retorno, otros no.

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

Entonces, ¿cuál es la diferencia interna entre una construcción de lenguaje y una función incorporada?


Después de leer el código, descubrí que php analiza algunas de las declaraciones en un archivo yacc. Entonces son casos especiales.

(ver Zend / zend_language_parser.y)

Aparte de eso, no creo que haya otras diferencias.


Las construcciones de lenguaje son provistas por el lenguaje mismo (como instrucciones como "si", "mientras", ...); de ahí su nombre.

Una consecuencia de esto es que son más rápidos de invocar que las funciones predefinidas o definidas por el usuario (o eso he escuchado / leído varias veces)

No tengo idea de cómo se hace, pero una cosa que pueden hacer (debido a que está integrada directamente en el lenguaje) es "eludir" algún tipo de mecanismo de manejo de errores. Por ejemplo, isset () se puede usar con variables no existentes sin causar ningún aviso, advertencia o error.

function test($param) {} if (test($a)) { // Notice: Undefined variable: a } if (isset($b)) { // No notice }

* Tenga en cuenta que no es el caso para las construcciones de todos los idiomas.

Otra diferencia entre funciones y construcciones de lenguaje es que algunas de ellas se pueden llamar sin paréntesis, como una palabra clave.

Por ejemplo :

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

Aquí también, no es el caso para todos los constructos de lenguaje.

Supongo que no hay absolutamente ninguna manera de "desactivar" una construcción de lenguaje porque es parte del lenguaje en sí. Por otro lado, muchas funciones PHP "incorporadas" en realidad no están incorporadas porque las extensiones las proporcionan de modo que siempre están activas (pero no todas).

Otra diferencia es que las construcciones de lenguaje no se pueden usar como "punteros de función" (quiero decir, devoluciones de llamada, por ejemplo):

$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

No tengo ninguna otra idea que me venga a la mente en este momento ... y no sé mucho sobre los aspectos internos de PHP ... Así que será en este momento ^^

Si no obtienes muchas respuestas aquí, tal vez podrías preguntar esto a los internos de la lista de correo (ver http://www.php.net/mailing-lists.php ), donde hay muchos desarrolladores core PHP; ellos son los que probablemente sabrían sobre eso ^^

(Y estoy realmente interesado por las otras respuestas, por cierto ^^)

Como referencia: lista de palabras clave y construcciones de lenguaje en PHP