En un diseño de lenguaje de programación dado , un ciudadano de primera clase [ a ] es una entidad que admite todas las operaciones generalmente disponibles para otras entidades. Estas operaciones suelen incluir ser pasadas como argumento , ser devueltas por una función y ser asignadas a una variable . [ 1 ]
Historia
El concepto de objetos de primera y segunda clase fue introducido por Christopher Strachey en la década de 1960. [ 2 ] [ 3 ] En realidad no definió el término estrictamente, sino que contrastó los números reales y los procedimientos en ALGOL :
Objetos de primera y segunda clase. En ALGOL, un número real puede aparecer en una expresión o asignarse a una variable, y cualquiera de ellos puede aparecer como parámetro real en una llamada a procedimiento. Un procedimiento, por otro lado, solo puede aparecer en otra llamada a procedimiento como operador (el caso más común) o como uno de los parámetros reales. No existen otras expresiones que involucren procedimientos o cuyos resultados sean procedimientos. Por lo tanto, en cierto sentido, los procedimientos en ALGOL son ciudadanos de segunda clase: siempre deben aparecer en persona y nunca pueden representarse mediante una variable o expresión (excepto en el caso de un parámetro formal)... [ 4 ]
Robin Popplestone dio la siguiente definición: Todos los objetos tienen ciertos derechos fundamentales.
- Todos los elementos pueden ser los parámetros reales de las funciones.
- Todos los elementos pueden devolverse como resultado de las funciones.
- Todos los elementos pueden ser objeto de enunciados de asignación.
- Todos los elementos pueden someterse a pruebas de igualdad. [ 5 ]
Durante la década de 1990, Raphael Finkel [ 6 ] propuso definiciones de valores de segunda y tercera clase, pero estas definiciones no han sido ampliamente adoptadas. [ 7 ]
Ejemplos
Los tipos de datos escalares más simples , como los números enteros y de punto flotante, son casi siempre de primera clase.
En muchos lenguajes antiguos, los arreglos y las cadenas no son de primera clase: no se pueden asignar como objetos ni pasar como parámetros a una subrutina. Por ejemplo, ni Fortran IV ni C admiten la asignación de arreglos, y cuando se pasan como parámetros, solo se transmite la posición de su primer elemento; su tamaño se pierde. C parece admitir la asignación de punteros a arreglos , pero en realidad estos son simplemente punteros al primer elemento del arreglo y, de nuevo, no contienen el tamaño del arreglo.
En la mayoría de los lenguajes, los tipos de datos no son objetos de primera clase, aunque en algunos lenguajes orientados a objetos, las clases sí lo son y son instancias de metaclases . Los lenguajes de la familia de la programación funcional también suelen incluir tipos de primera clase, como por ejemplo, tipos de datos algebraicos generalizados u otras herramientas del metalenguaje que permiten a los programas implementar extensiones a su propio lenguaje de implementación.
Pocos lenguajes admiten continuaciones y etiquetas GOTO como objetos, y mucho menos como objetos de primera clase.
Funciones
Muchos lenguajes de programación permiten pasar y devolver valores de función, que pueden aplicarse a los argumentos. Sin embargo, se debate si esto es suficiente para considerar los valores de función como de primera clase.
Algunos autores exigen que sea posible crear nuevas funciones en tiempo de ejecución para considerarlas de "primera clase". Según esta definición, las funciones en C no son objetos de primera clase; en cambio, a veces se las denomina objetos de segunda clase , porque aún pueden manipularse de la mayoría de las maneras mencionadas anteriormente (mediante punteros a funciones ).
En Smalltalk , las funciones (métodos) son objetos de primera clase, al igual que las clases de Smalltalk. Dado que los operadores de Smalltalk (+, -, etc.) son métodos, también son objetos de primera clase.
Reflexión
Algunos lenguajes, como Java y PHP , tienen un subsistema de reflexión explícito que permite acceder a las estructuras de implementación internas, aunque no sean accesibles ni manipulables de la misma manera que los objetos ordinarios.
En otros lenguajes, como los de la familia Lisp , la reflexión es una característica central del lenguaje, en lugar de un subsistema especial. Normalmente, esto se manifiesta mediante un conjunto de las siguientes características:
- macros sintácticas o fexprs , que permiten al usuario escribir código que maneja el código como datos y lo evalúa a su discreción, lo que permite, por ejemplo, que los programas escriban programas (o se reescriban a sí mismos) dentro del compilador, el intérprete o incluso el analizador sintáctico ( macros de lectura );
- un evaluador metacircular , que proporciona una definición del evaluador del lenguaje como una tautologización compilada de sí mismo, lo que facilita la modificación directa del lenguaje sin requerir un metalenguaje diferente de sí mismo;
- un protocolo de metaobjetos : una forma especial de evaluador metacircular para la programación orientada a objetos , en la que el sistema de objetos se implementa recursivamente a través de un sistema de metaclases y metaobjetos, que a su vez son clases y objetos.
Estas herramientas permiten diversas formas de acceso de primera clase a la implementación del lenguaje y, en general, se pueden manipular de la misma manera que los objetos del lenguaje ordinario, siendo completamente indistinguibles de ellos. Por ello, su uso suele ir acompañado de ciertas estipulaciones y recomendaciones (culturales), ya que la modificación no probada del sistema de programación central por parte de los usuarios puede fácilmente socavar las optimizaciones de rendimiento realizadas por los desarrolladores del lenguaje.
Véase también
Notas
- ↑ También conocido como tipo de primera clase , entidad de primera clase , objeto de primera clase o valor de primera clase .
Referencias
- ↑ Scott, Michael (2006). Pragmática del lenguaje de programación . San Francisco, CA: Morgan Kaufmann Publishers. pág . 140. ISBN 9780126339512.
- ↑ Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13 :52 (2000)
- ↑ Harold Abelson y Gerald Jay Sussman, Estructura e interpretación de programas informáticos , 2.ª edición, sección 1.3.4, nota al pie 64. Archivado el 9 de marzo de 2015 en Wayback Machine.
- ↑ Christopher Strachey, " Conceptos fundamentales en lenguajes de programación " en Higher-Order and Symbolic Computation 13:11 (2000); aunque se publicó en 2000, estas son notas de las conferencias que Strachey impartió en agosto de 1967.
- ↑ RJ Popplestone: La filosofía de diseño de POP-2 . En: D. Michie: Machine Intelligence 3, Edimburgo, University Press, 1968.
- ↑ Finkel, R. Diseño avanzado de lenguajes de programación , pág. 73
- ↑ Norman Ramsey. "Sobre el valor de primera, segunda y tercera clase" . stackoverflow.com . Consultado el 14 de septiembre de 2013 .
- ↑ Ivan Čukić (2018). Programación funcional en C++ . Simón y Schuster. ISBN 9781638355663.
- 1 2 Paritosh Shroff, Scott F. Smith. Inferencia de tipos para mensajes de primera clase con funciones de coincidencia.
- ↑ Bove, Ana; Dybjer, Peter (2009). "Tipos dependientes en acción" (PDF) . Ingeniería de lenguajes y desarrollo riguroso de software . Notas de clase en informática. Vol. 5520. págs. 57–99 . doi : 10.1007/978-3-642-03153-3_2 . ISBN 978-3-642-03152-6. Archivado (PDF) del original el 2 de abril de 2014. Recuperado el 8 de junio de 2015 . (también archivado )
- Estructuras de programación
- Diseño de lenguajes de programación
- Objeto (informática)