En un diseño de lenguaje de programación determinado , un ciudadano de primera clase [a] es una entidad que admite todas las operaciones que generalmente están disponibles para otras entidades. Estas operaciones suelen incluir ser pasadas como argumento , devueltas desde una función y asignadas a una variable . [1]
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, pero 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 ser asignado a una variable, y cualquiera de ellos puede aparecer como un parámetro real en una llamada a un procedimiento. Un procedimiento, por otra parte, sólo puede aparecer en otra llamada a un 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 tienen que aparecer en persona y nunca pueden ser representados por una variable o expresión (excepto en el caso de un parámetro formal)... [4]
Robin Popplestone dio la siguiente definición: Todos los artículos tienen ciertos derechos fundamentales.
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] [ se necesita una mejor fuente ]
Los tipos de datos escalares más simples , como los números enteros y de punto flotante, casi siempre son de primera clase.
En muchos lenguajes antiguos, las matrices 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 matrices y, cuando se pasan como parámetros, solo se pasa realmente la posición de su primer elemento (se pierde su tamaño). C parece admitir la asignación de punteros de matriz , pero, de hecho, estos son simplemente punteros al primer elemento de la matriz y, nuevamente, no llevan el tamaño de la matriz. [ cita requerida ]
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 son objetos de primera clase y son instancias de metaclases . Los lenguajes de la familia de programación funcional a menudo también presentan tipos de primera clase, en forma de, por ejemplo, tipos de datos algebraicos generalizados u otras comodidades de 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.
Muchos lenguajes de programación admiten el paso y la devolución de valores de funciones, que se pueden aplicar a los argumentos. No se sabe si esto es suficiente para llamar a los valores de funciones de primera clase.
Algunos autores exigen que sea posible crear nuevas funciones en tiempo de ejecución para llamarlas "de primera clase". [ cita requerida ] Según esta definición, las funciones en C no son objetos de primera clase; en cambio, a veces se las llama objetos de segunda clase , porque aún se pueden manipular en la mayoría de las formas anteriores (a través de punteros de función ).
En Smalltalk , las funciones (métodos) son objetos de primera clase, al igual que las clases de Smalltalk. Como los operadores (+, -, etc.) de Smalltalk son métodos, también son objetos de primera clase.
Algunos lenguajes, como Java y PHP , tienen un subsistema de reflexión explícito que permite el acceso a 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 adopta la forma de un conjunto de las siguientes características:
Estos 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 y son totalmente indistinguibles de ellos. Por este motivo, su uso suele ir acompañado de algunas estipulaciones y consejos (culturales), ya que las modificaciones no probadas del sistema de programación central por parte de los usuarios pueden socavar fácilmente las optimizaciones de rendimiento realizadas por los implementadores del lenguaje.