2011-01-01 12 views
10

C y C++ son idiomas diferentes, blababla lo sabemos.¿Por qué C++ es compatible con C? ¿Por qué no hay algún lenguaje C++ "puro"?

Pero si esos idiomas son diferentes, ¿por qué todavía es posible utilizar la función como malloc o gratis? Estoy seguro de que hay todo tipo de cosas polvorientas que C++ tiene debido a C, pero dado que C++ es otro idioma, ¿por qué no eliminar esas cosas para hacerlo un poco menos hinchado y más limpio y claro?

¿Es porque permite a los programadores trabajar sin el modelo OO o porque algunos compiladores no admiten características abstractas de alto nivel de C++?

+5

Un poco de historia C++: http://www.hitmill.com/programming/cpp/cppHistory.html – miku

Respuesta

15

Acerca de "Por qué no hay un lenguaje" puro "de C++ ... Bueno, hay al menos uno. El más popular se llama D, es genial, bien diseñado, rico en funciones, agradable de codificar, y puede utilizar bibliotecas de C con él.

Ah, y casi nadie lo utiliza. :)

La razón directa es que C++ no es lo suficientemente fuerte para darle a la gente una buena razón para millones de puertos de líneas de su legado código a más moderno, y como usted describió, lenguajes "puros" como D.

+6

Esto no responde la pregunta sobre la relación entre C y C++ y en su lugar conecta otro idioma. –

+4

Bueno, está la segunda parte de la pregunta con la que me he relacionado directamente. – Kos

+3

D es interesante, pero no lo llamaría un "C++ puro" ... es un idioma diferente con muchos de los mismos objetivos y sin el equipaje C heredado. – dajames

22

Porque C++ estaría fuera de combate si no fuera compatible con C como está ahora. A nadie, excepto a los fanbois, le gustaría C++ si no fuera compatible con C. (Sé que probablemente voy a ser votado negativamente por esto. ¡Sea así!).

+6

Hace C++ tiene ningún fanboys en el primer lugar? – Kos

+3

@Kos: No. Ninguna ... –

+3

@Johannes: Tengo que estar en desacuerdo. Los lenguajes como Java y C# despegaron sin ninguna compatibilidad directa con C como C++. – Puppy

7

Está diseñado para que pueda portar el código C y compilarlo como código C++ directamente, y ws para la actualización incremental del código existente. Si C++ no tenía malloc/free, no podía compilar el código C existente como C++, porque tendría que pagar un poco de shmuck para buscar y encontrar todas las llamadas malloc y reemplazarlas, lo cual es costoso.

+1

Nit escogido: C++ no * tiene * 'malloc' y' free', * los admite, porque son parte de la biblioteca estándar c no de las palabras clave del lenguaje. Pero de cualquier manera un punto importante. – dmckee

3

Las primeras versiones de C++ se construyeron sobre C y, de hecho, el compilador tradujo el código C++ a C, que a su vez fue compilado por el compilador local de C. Bjarne Stroustrup cree firmemente en la compatibilidad con versiones anteriores y, estoy seguro, resistirá cualquier intento de eliminar la funcionalidad.

Puedes leer todo sobre en el libro de Bjarne The Design and Evolution of C++.

4

Sugiero que eche un vistazo a The Design & Evolution of C++ para obtener una mejor idea de la razón por la que el idioma resultó ser la forma en que es. Hay razones históricas por las que C++ creció fuera de C y se hizo compatible con versiones anteriores.

5

C++ fue diseñado para ser compatible con C, de hecho fue originalmente un superconjunto de C, pero el lenguaje C ha cambiado desde entonces para romper eso.

Esto significa que las bibliotecas de C, incluida la biblioteca de tiempo de ejecución de C, se pueden llamar desde el código de C++. Lo hace no significa que es una buena idea hacerlo!

Si desea un C++ "puro", puede usar C++ sin llamar a ninguna biblioteca de C.

[Como otros han dicho desde que empecé a escribir esto:. El diseño & Evolución de C++ es un buen lugar para empezar a leer por el fondo en esta]

+1

Tenga en cuenta que nunca fue un superconjunto puro de C, hay algunas diferencias menores debido a las palabras clave, el tamaño de un carácter literal, etc. – me22

+0

Oh ... ¿tamaño de un carácter literal? ¿Qué ha cambiado con eso? – Kos

+0

char es int en c. 'sizeof (char)' es 4 en c, pero 1 en C++. – Tim

7

mayoría de los sistemas operativos exponer una API de C, por lo que si Si desea utilizar C++ para la programación de sistemas, necesita algún nivel de interoperabilidad de C.

que la biblioteca estándar de C se incorporó en la biblioteca estándar de C++ tiene razones históricas y prácticas: C++ comenzó su vida como una extensión de C, y la biblioteca estándar de C estaba listo para usar. Sería tonto para excluir parte de la biblioteca (como malloc y free) sólo porque existen más alternativas idiomáticas C++: si quieres hacer cosas estúpidas, C++ le da el poder para hacerlo.

Para la semántica del lenguaje reales, lo mismo se aplica - pero en menor grado - y debido a la compatibilidad con versiones anteriores, C++ nunca puede estar completamente libre de su patrimonio C.

1

Había muchos lenguajes más puros. Sin embargo, no se usaron mucho porque estaban demasiado lejos del rango de comodidad de la mayoría de los programadores. C++, por otro lado, permitió a los programadores aumentar lentamente aumentando los estilos C.

Lo que estás haciendo es mirar lenguajes como C# o Python y preguntarte por qué C++ no se parece a ellos, pero olvidando que llegar allí requiere pasos como C++ y Java, o Awk y Perl.

Para adaptar una cita que escuché antes: C# es la versión de Microsoft de la versión de Sun para-idiotas de la versión de Bell de C-mejorada por Simula.

1

Todos tienen razón. En resumen: el motivo es politics. Si quieres que algo sea popular, mejora algo que ya es popular y tienes un mercado listo. Diseña algo nuevo y nadie se interesará a menos que seas Sun, diseña alguna basura, pero tira miles de millones de dólares al desarrollo y comercialización de la biblioteca.

1

malloc() y free() son necesarios para que pueda llamar a bibliotecas de lenguaje C desde código C++. La biblioteca de lenguaje C puede devolver un puntero a la memoria asignada con malloc() que debe ser liberada por la persona que llama con free(); o, con menos frecuencia, puede requerir un puntero a la memoria asignada con malloc() que puede reasignar internamente con realloc() o gratis con free().

Cuestiones relacionadas