sexta segunda quinta que programación programacion primera los lenguajes lenguaje las generación generaciones generacion cuarta consisten computadoras .net

.net - quinta - segunda generación de lenguaje de programación



¿Qué es una construcción de programación de primera clase? (6)

¿Qué es exactamente una construcción de programación de primera clase?

Algo es un constructo de primera clase si el lenguaje lo admite de manera análoga a otros tipos de objetos .

Por ejemplo, en C ++, las funciones no se considerarían construcciones de primera clase: puede crear otros tipos de objetos en tiempo de ejecución, pero no puede instanciar nuevas funciones. Por el contrario, en C # 3 y posteriores, las funciones probablemente se considerarían construcciones de primera clase con la introducción de las funciones lambdas / anónimas.

Al igual que con muchas otras cosas, esto es naturalmente una definición subjetiva. Wikipedia tiene un buen resumen para ejemplos más concretos, al igual que C2 .

Cuando se intenta hacer algo bastante avanzado en C # (como algún tipo de pirateo), se plantea el concepto de "primera clase".

Por ejemplo, un método es una construcción de programación de primera clase porque puedes hacer xyz con él (xyz no es lo que hace el método, sino lo que te da un método en general, no puedo recordar qué era xyz ahora), sino en. Los delegados de NET 1.1 no pudieron ser pasados ​​a métodos porque no eran construcciones de programación de primera clase (leí algo en este sentido).

¿Qué es exactamente una construcción de programación de primera clase?

Gracias


La idea de "ciudadano de primera clase" o "elemento de primera clase" en un lenguaje de programación fue presentada por el científico británico de computación Christopher Strachey en la década de 1960 en el contexto de funciones de primera clase. La formulación más famosa de este principio es probablemente en Estructura e interpretación de programas de computadora de Gerald Jay Sussman y Harry Abelson:

  • Pueden ser nombrados por variables.
  • Pueden ser pasados ​​como argumentos a procedimientos.
  • Pueden ser devueltos como resultado de los procedimientos.
  • Pueden ser incluidos en las estructuras de datos.

Básicamente, significa que puedes hacer con este elemento del lenguaje de programación todo lo que puedes hacer con todos los demás elementos del lenguaje de programación.


Mi entendimiento de una construcción de programación de primera clase es que significa que puedes hacer lo que sea, de la mejor manera posible sin tener que hacer dos o tres cosas más, o combinar dos o tres conceptos más.

Entonces, Java no tiene soporte de cierre de primera clase. Sin embargo, podemos simularlo de alguna manera construyendo una clase (usando otro concepto) que admita casi todas las cosas para las que usas cierres y luego creando instancias de esa clase ( otro concepto) o extendiendo anónimamente esa clase ( otro concepto).

Lo mismo con ''funciones''. En Java no puedes tener funciones, pero puedes tener métodos estáticos, que son un concepto similar pero aún diferente.

Uno (no yo) también podría argumentar que el soporte genérico de Java no es de primera clase, porque es un hack de biblioteca y en realidad no está "en" el idioma. Esto significa que algunas de las cosas que puede hacer en C # con los genéricos que no puede hacer en Java.


C2 Básicamente, es algo que no tienes que fingir dentro de un idioma.


¿Qué es exactamente una construcción de programación de primera clase?

Respuesta simple: es algo que soporta todas las operaciones estándar que proporciona el lenguaje. En un lenguaje orientado a objetos, las construcciones de primera clase son, como cabría esperar, los objetos. Resulta que en tales idiomas, a menudo, por razones de eficiencia o legado, los ciudadanos de segunda clase, generalmente los tipos de datos primitivos, no son objetos adecuados y con los que no puede hacer ciertas cosas.

Por ejemplo, en Java un Punto es un objeto de pleno derecho. Puedes declarar un

List<Point> plist;

y luego poner puntos en ella. Un int no es un objeto de pleno derecho. Hay ciertas cosas que no puede hacer con una subclase int de ella, por ejemplo, o invocar métodos en ella aparte de algunos operadores predefinidos. Tampoco puedes guardarlo en un

List<int> intlist;

Java tiene una salida para este problema ya que hay un tipo "encuadrado", Integer, que es un objeto de pleno derecho. Puede declarar una List<Integer> , por ejemplo. Sin embargo, usar un Integer es mucho menos eficiente que con un "int". Java proporciona boxeo automático y unboxing (es decir, conversión) del tipo Integer a int y back en contextos donde se requiere uno u otro, para ayudar al programador a combinar lo mejor de ambos mundos.

Tener dos tipos, Integer e int, para un número entero es confuso, y algo así como un hack. Una versión anterior de Java, según me han dicho, no tenía primitivas y todos sus tipos eran objetos de pleno derecho. Resultó ser demasiado lento para su uso previsto (¡de todas formas el Java inicial resultó ser lento, por lo tanto!) Por lo que se agregaron algunas primitivas que no admitían la semántica de objetos adecuada.

en .NET 1.1, los delegados no podían pasar a métodos porque no eran construcciones de programación de primera clase (leí algo en este sentido).

No sé nada de .NET, pero parece que tienes la idea. Tienes razón: si los delegados no se pueden pasar a métodos como cualquier otro objeto estándar, no son construcciones de programación de primera clase.


Sospecho que no encontrarás una definición formal Al parecer, Jörg W Mittag encontró una :)

Dada esa definición formal, el resto de mi respuesta es simplemente mi comprensión de ella en ese momento. Por supuesto, si todo el que usa el término "construcción de primera clase" significa exactamente lo mismo es un asunto diferente.

La manera de determinar si algo es una construcción de "primera clase" o no es preguntarse algo como esto:

¿La función es compatible y está completamente integrada con el resto del idioma, o existen muchas restricciones innecesarias que dan la impresión de que simplemente se ha "implementado" posiblemente para abordar solo un caso de uso particular sin tener en cuenta otras áreas donde se construye? ¿Podría ser realmente útil si hubiera sido más plenamente "parte del lenguaje"?

Como puedes ver, es un área gris definida :)

Los delegados en C # son un buen ejemplo, en realidad. En C # 1, se podían pasar los delegados a los métodos, y había muchas formas en las que estaban bien integrados en el idioma (cosas como conversiones disponibles, manejo de eventos, + = y - = traducción a Delegate.Combine / Remove). Yo diría que eran construcciones de primera clase. Sin embargo, eso no contradice el hecho de que los delegados han ganado enormemente de C # 2 y 3, con métodos anónimos, conversiones de grupos de métodos implícitos, expresiones lambda y covarianza. Se podría decir que ahora son más de una construcción de primera clase ... y aunque diría que eran "de primera clase" en C # 1, pude ver por qué alguien podría estar en desacuerdo.

Un caso similar podría hacerse para IEnumerable . En C # 1.0, fue soportado por foreach pero el bucle foreach no eliminaría el IEnumerator al final. Esta parte se corrigió en C # 1.2, pero todavía había solo soporte de idioma para consumir IEnumerable s, no para crearlos. C # 2.0 proporcionó bloques de iteradores, lo que hace que sea trivial implementar IEnumerable (y su equivalente genérico). ¿Significa eso que el concepto de una secuencia iterable no era una construcción de "primera clase" en C # 1.0? Debatable, básicamente ...