Origen de estructuras y clases.

8

¿Qué problemas de diseño e implementación tuvieron que resolver los programadores cuando decidieron primero usar estructuras y clases?

¿Cuándo sucedió esto y quiénes fueron los pioneros detrás de estas ideas?

Tenga en cuenta que esta es una pregunta doble, porque las estructuras y las clases están relacionadas. Me doy cuenta de que las estructuras son bastante más antiguas que las clases. Sería genial si la respuesta hablara por separado sobre ambos y citara algunas fuentes.

xralf
fuente
No están tan relacionados como se piensa a menudo, y el problema se enturbia por el hecho de que C ++ implementó clases colocando azúcar sintáctico sobre estructuras que contienen punteros de función. Para enturbiar aún más las aguas, C ++ expandió las estructuras para incluir definiciones de métodos reales y luego hizo que la structpalabra clave fuera opcional cuando se usa la estructura.
Gort the Robot
1
El concurso de historia no es por otros dos días. :)
chrisaycock
Gracias a todos por las respuestas. Las respuestas que mencionan IBM 1620, COBOL, Simula 67 y la explicación pedagógica de principios de Giorgio crean todo el núcleo de lo que acepto como respuesta.
xralf

Respuestas:

5

La idea de una estructura es agrupar una colección de variables en un solo contenedor. Por ejemplo, si tienes tres coordenadas

int x;
int y;
int z;

es posible que desee verlos como una unidad de datos y agruparlos:

struct point
{
    int x;
    int y;
    int z;
};

Puede ver esto como una forma de modularizar sus datos. Ahora puede definir variables que contengan los tres valores en una unidad:

struct point p1, p2;

En la programación de procedimientos, tiene procedimientos o funciones que manipulan datos y, en particular, estructuras, p. Ej.

void shiftX(struct point *p, int offset);

Puede llamar a la función en una estructura pasándola como argumento:

shiftX(&p1, -10);

El paso de las estructuras a las clases es decir que los procedimientos / funciones deben agruparse junto con los datos en unidades: como las estructuras clasifican las entidades que tienen la misma estructura, las clases clasifican las entidades que tienen la misma estructura y operaciones.

Entonces ahora puedes escribir:

class Point
{
  public:
    void shiftX(int offset);

    int x;
    int y;
    int z;
 };

y entonces:

 Point p;

 ...

 p.shiftX(-10);

De esta forma, es más fácil agrupar operaciones que funcionan en el mismo tipo de datos. Por ejemplo, puede agrupar todas las operaciones que actúan sobre puntos en la definición de clase, en lugar de dispersarlas sobre su código como funciones que tienen uno o más parámetros de tipo punto.

Además, puede refinar tanto la estructura como el comportamiento mediante el uso de la herencia.

Resumiendo: las estructuras son un concepto que permite organizar / modularizar datos. Las clases permiten organizar / modularizar datos y operaciones.

Giorgio
fuente
Me gusta el enfoque pedagógico de esta su respuesta. Entonces, si lo entiendo bien, puedo aprender más sobre esta idea al leer algo sobre lo Simula 67que escribe WorldEngineer y tal vez en algún lugar se escriba por qué esta idea se hizo popular entre otros lenguajes de programación.
xralf
La idea se hizo popular porque es una excelente manera de organizar el código. Las aplicaciones se han vuelto progresivamente más grandes y más complejas. Algunos sistemas operativos tienen más de 100 millones de líneas de código. Si bien una medida bastante pobre de la complejidad real, requiere esfuerzos organizativos masivos.
Ingeniero mundial
1
La alternativa es usar módulos (Modula-2), o paquetes (Ada, Java, Scala, etc.), o unidades (algunos dialectos de Pascal). De esta forma, puede agrupar tipos y operaciones. Sin embargo, las clases ofrecen una integración más estrecha entre datos y operaciones, y características adicionales como la herencia.
Giorgio
@xralf: Tal vez leyendo sobre Simula 67, puede obtener más información sobre las motivaciones para OOP. Por cierto, hasta donde puedo recordar, Simula 67 ya tiene métodos virtuales. Entonces, los métodos virtuales son un invento muy antiguo.
Giorgio
@WorldEngineer Pensé que los sistemas operativos están escritos en lenguaje ensamblador y C y que hay bibliotecas para la organización del código.
xralf
5

Las estructuras son grupos de datos, típicamente escritos. COBOL vio el primer uso generalizado de ellos. Aunque análogos a eso existieron de antemano. El problema del diseño aquí es agrupar varios conjuntos de datos como un nombre, una ocupación y un número de teléfono. La idea de un "registro" es algo mucho más antiguo que la informática y aparece en las matemáticas y en otras muchas disciplinas.

La programación orientada a objetos se diseñó originalmente para manejar la simulación en la que tendrías un montón de objetos ejecutándose para simular un sistema. Simula 67 fue la primera en implementar ese estilo de programación. Smalltalk fue el primer lenguaje totalmente orientado a objetos donde todo es un objeto, incluidas las primitivas. El problema original que se resolvió fue la simulación de sistemas complejos. Simula 67 fue diseñada por Ole-Johan Dahl y Kristen Nygaard. Alan Kay (que una vez respondió una pregunta sobre Stack Overflow ) diseñó Smalltalk, que todavía se usa.

Las estructuras y las clases se relacionan bastante estrechamente con los tipos, ya que ambas definen ciertos parámetros para un conjunto de datos. Las clases van más allá definiendo los permisos de acceso y las operaciones, lo que permite tipos de datos abstractos completamente implementados. Las estructuras pueden pensarse en un subconjunto de clases en un lenguaje orientado a objetos. Serían una clase de contenedor que tiene todos los campos establecidos en público y ningún método fuera de getters y setters para esos campos.

Ingeniero mundial
fuente
4

Puede encontrar información sobre estructuras en este artículo de Wikipedia . En resumen, parecen estar tan profundamente anclados en la informática que fueron respaldados primero por hardware (instrucciones especiales en IBM 1620, tarjetas perforadas básicamente como una instancia de registro, y el motor analítico de Babbage (al menos según Wikipedia). primer lenguaje ampliamente utilizado para apoyar la construcción.

Scarfridge
fuente
Me gusta esta explicación para las estructuras.
xralf
3

Las "estructuras" son en realidad completamente diferentes de las "clases". Piense en el viejo estilo "struct" como un registro. En QBASIC incluso se les llamó así. La necesidad de esto es bastante obvia y aunque no puedo decir quién la inventó ... Me imagino que surgió casi de inmediato. OOP "clases" parece haber comenzado bastante bien con Simula: http://en.wikipedia.org/wiki/Object-oriented_programming#History

Edward extraño
fuente
En términos de intención, sí, pero si está hablando de C ++, la única diferencia entre a structy a classes el valor classpredeterminado privatemientras que el valor structpredeterminado es public.
Gort the Robot
Los registros se remontan al menos al siglo XIX, que es ligeramente anterior a C ++. No creo que C ++ sea relevante aquí.
Jörg W Mittag
@ JörgWMittag: Te creo, pero ¿tienes alguna fuente o ejemplo para eso?
FrustratedWithFormsDesigner