¿Por qué no sale un lenguaje "mejor" más rápido que C? [cerrado]

147

Con todos los nuevos lenguajes "modernos" de hoy, ¿cómo es que C sigue siendo anunciado como el más rápido y "más cercano a la máquina"? Realmente no creo que haya una sola forma correcta de hacer las cosas, y C ha existido durante mucho tiempo (¡desde los años 60!). ¿Realmente no se nos ocurrió nada mejor que algo escrito hace casi 50 años?

Soy consciente de que los lenguajes modernos son de nivel superior y se encargan de ciertas tareas, como la recolección de basura y la asignación de memoria, y utilizan bibliotecas y demás. Solo pregunto por qué nunca ha habido una verdadera segunda opción para C.

¿Puede ser que C sea tan perfecto que no sea posible otra forma de operar una computadora (aparte de la adopción del desarrollador)?

EDITAR Mira, no estoy tratando de tocar C o cualquiera que sea tu idioma favorito. Me pregunto por qué C se ha convertido en el estándar y por qué nunca surgieron otras alternativas y C simplemente fue "aceptado".

Jason
fuente
44
C ++ es igual de rápido y mucho más productivo para escribir. <3
GManNickG
66
¿No te estás olvidando de C ++?
23
Yo diría que el ensamblaje es el más rápido y "más cercano" a la máquina.
27
¿Por qué todas las mociones para cerrar? Tengo mucha curiosidad ... No estoy tratando de iniciar guerras de llamas ni nada
Jason
15
cerrado de nuevo? después de ser reabierto por el propio Jeff Atwood? ¿por qué querrías cerrar esto?
Jason

Respuestas:

164

C es un lenguaje muy simple, y es por esto, junto con su longevidad, que es rápido y optimizado. También es extraordinariamente compatible, en lo que respecta a entornos integrados, microprocesadores, etc.

Es difícil superar un lenguaje realmente simple y rápido. Lo único que se puede mejorar en un lenguaje como ese es la usabilidad: disminuya el tiempo que lleva crear un código genérico similar y hacer que sea más fácil modelar con abstracciones.

Aquí es donde entra C ++. C ++ puede ser tan rápido como C. La cuestión es que C ++ es un lenguaje mucho más complejo, lo que significa que definitivamente aumenta la productividad; siempre y cuando la gente sepa cómo usarlo. C ++ y C ya no son casi el mismo lenguaje.

Ahora, D fue un paso más. Misma capacidad para código rápido, recolección de basura opcional, etc., pero nunca se puso de moda. Esperemos que eso cambie, porque deja caer lo que afecta a C ++: compatibilidad hacia atrás con C.

Entonces, para responder a su pregunta, "mejor" es algo difícil de juzgar. En términos de simplicidad y velocidad, C probablemente sea lo mejor que podamos hacer. En términos de productividad versus simplicidad, C ++ es probablemente el mejor que podríamos hacer, aunque esa opinión varía mucho más. Por último, en términos de lenguaje desarrollado y limpio, con la velocidad y simplicidad de C, D gana este contexto.

GManNickG
fuente
31
Por "Simple" te refieres a "simple desde un POV de compiladores, no desde el POV de los programadores". C es simple porque es básicamente un ensamblaje con declaraciones y expresiones. No es simple como Python es simple.
Marius
15
Pero para aclarar, simple para el compilador qué quiere decir fácil de aprender. Quizás no sea sencillo implementar ideas complicadas.
GManNickG
16
Por lo que vale, OCaml produce código nativo altamente optimizado casi tan rápido como C y C ++, y el código en sí es tan breve como Python. Con un poco de pulido, creo que OCaml podría igualar o vencer a C como el idioma de elección cuando necesita escribir código para obtener la máxima velocidad y la mínima huella de memoria. Objective-C también hace un trabajo bastante bueno, aunque no siempre es tan rápido como C, hace que todo lo de "C con objetos" sea correcto de una manera que C ++ nunca podría y nunca lo hará.
Julieta
2
De acuerdo con @ Thorbjørn, la compatibilidad con C es la razón por la cual C ++ se puso de moda y D no. Si estamos dispuestos a renunciar a eso, no hay razón para conformarse con la mejora incremental que es D. Podríamos optar por lenguajes mucho mejores que están completamente fuera de la familia C. Como dice @Juliet, OCaml podría ser un competidor viable en cuanto al rendimiento. Pero también podrían hacerlo otros lenguajes, si los escritores de compiladores hubieran dedicado tanto tiempo a ellos como a C o C ++. De todos modos, buena respuesta, y +1 de mi parte.
jalf
55
@Ferruccio: Sí, pero todos los lenguajes pueden vincularse a bibliotecas C. Entonces, si estamos dispuestos a conformarnos con eso, en lugar de la compatibilidad del código fuente real, como ofrece C ++ (más o menos), entonces también podríamos elegir un lenguaje completamente diferente, por ejemplo, Haskell o Python. La razón por la que C ++ se dio cuenta no fue porque podría vincularse a las bibliotecas de C. Era que podía compilar el código C.
jalf
64

Hay más rápido que los lenguajes C.

Hay idiomas más rápidos que C. Por ejemplo, a Fortran, como ya se mencionó, le está yendo muy bien porque tiene reglas de lenguaje de alias mucho más restringidas.

También hay ensamblados experimentales como lenguajes que están atacando a C en el frente donde se usa como lenguaje ensamblador de alto nivel, por ejemplo, la creación de compiladores. ¿Alguna vez escuchaste sobre C-- o Janus? Pero esos dos fueron asesinados por el proyecto LLVM.

Apuesto a que APL u otros lenguajes matemáticos eliminarán C del agua en sus dominios de aplicaciones especiales, ya que tienen soporte para unidades de procesamiento de vectores. Esto es algo que no es posible para C (y chicos: ¡NO! Las bibliotecas especiales optimizadas con enlace C no tienen nada que ver con C como lenguaje).

También los productores de CPU eliminaron todo lo que ayudó a los escritores de compiladores en otros idiomas: ¿recuerdan los códigos de ensamblador aritmético etiquetados para hacer que la implementación de LISP en SPARC sea rápida? Lo que el viento se llevó.

Y si te alejas de los micro puntos de referencia para el desarrollo de aplicaciones, entonces hay lenguajes más rápidos para el desarrollo de aplicaciones. Mi ejemplo personal aquí siempre es SmartEiffel. Apunta a C pero está utilizando la optimización del sistema global que lo hace más rápido que C en el desarrollo de aplicaciones del mundo real.

En este dominio, incluso una simple abstracción incorrecta o de bajo nivel puede matar todo el rendimiento del lenguaje. Debido a que C no ofrece grandes abstracciones, la mayoría de la gente dice que es un problema de programación, pero no lo es. Por ejemplo, mire la falta de genéricos. En C, terminará con implementaciones lentas como la función de biblioteca "qsort", que se puede escribir una magnitud más rápida con genéricos (donde se elimina la llamada de la función para comparaciones de teclas).

Simplemente compare una llamada qsort en una matriz de entradas de megabytes con una buena implementación escrita a mano que utiliza el acceso a la matriz y el operador incorporado '<'.

Lothar
fuente
99
Muy buen comentario. Es importante darse cuenta de que algunos aspectos de las especificaciones del lenguaje C (como las reglas de alias de puntero) hacen que sea imposible generar un código de máquina realmente óptimo. Al ser un ensamblador de alto nivel, C no es "el más rápido", sino simplemente "bastante rápido".
1
Gracias, olvidé mencionar la imposibilidad de devolver múltiples valores de resultados. Otro aspecto de bajo nivel que me falta mucho cuando lo uso como ensamblador de alto nivel.
55
El C moderno, correctamente escrito, puede codificar los mismos supuestos de alias que cualquier otro lenguaje, permitiendo que el compilador realice las mismas optimizaciones. Es una característica importante del lenguaje que también le permite al programador no asumir esos requisitos cuando no son aplicables. Tus otros puntos son acertados, entonces +1.
Stephen Canon
1
@Rascher: Eso es correcto y allí se ve la influencia de C en los diseñadores de CPU que siempre especifican un ABI de CPU. Y múltiples valores de retorno es algo que simplemente no viene a la mente existe incluso si el número de registros no sería un problema (SPARC, PowerPC, Itanium)
13
El alias de puntero en C ha sido tratado restricten C99 (¡hace 10 años!).
35

Buena pregunta. Creo que los idiomas tienen éxito al encontrar un nicho. Es importante tener en cuenta que hay muchos lenguajes más nuevos que son mejores que C en sus nichos.

  • C alguna vez fue ampliamente utilizado como un lenguaje de aplicación, y en ese dominio ha perdido terreno constantemente para C ++, Java y recientemente todo tipo de otros lenguajes (especialmente los lenguajes dinámicos).

  • C solía ser un lenguaje para escribir código de servidor. La Web introdujo una increíble variedad de lenguajes en ese espacio: Perl, Java, Python, VBScript, VB.NET, Ruby, C #, y los casos en que C tiene algún tipo de sentido para el código del servidor ahora son pocos y distantes.

  • C se ha utilizado para la informática científica, pero se enfrenta a la competencia de lenguajes específicos de dominio como Matlab y Mathematica, así como bibliotecas como SciPy . Muchas personas que escriben código en este nicho no son codificadores por comercio y C no es una gran opción para ellos.

Pero el nicho de C es el código del sistema. Kernels del sistema operativo. Conductores Bibliotecas en tiempo de ejecución. Está tan establecido en ese espacio que incluso C ++ lo está desplazando bastante lentamente.

C volvió a ganar en la década de 1970 debido a UNIX, porque los lenguajes de la competencia eran demasiado restrictivos o demasiado lentos, y porque el código C se consideraba razonablemente portátil (mentiras, incluso entonces). Pero sus mayores ventajas hoy no están relacionadas, y provienen principalmente de décadas de dominar su nicho. Existen buenas herramientas para C: optimización de compiladores, depuradores del núcleo, análisis estático efectivo para encontrar errores en el código del controlador, etc. Casi todas las plataformas principales definen un C ABI, y a menudo es la lengua franca para las bibliotecas. Hay un grupo de programadores que saben cómo codificar C, y que saben cuáles son los problemas y las dificultades de C.

A largo plazo, este nicho no va a desaparecer; y C tiene algunos problemas. Pero aún sería extremadamente difícil para cualquier recién llegado competir.

Jason Orendorff
fuente
99
C todavía se usa ampliamente para el código del servidor. No sólo existe la web, la mayoría de DNS, correo electrónico, etc servidores están escritos en C. Incluso para la Web, Apache está en C
@bortzmeyer: Apache es bastante viejo. No digo que no sea útil o haya sido reemplazado, solo se creó cuando era C y no había muchas buenas alternativas.
Macke
1
Tengo curiosidad por saber por qué consideras que C "no es una gran opción" para la informática científica. Sin duda, es más agradable trabajar con Python, pero he encontrado que C es una alternativa sólida cuando se necesita un código más rápido y muchas de las posibles alternativas (C ++) no aportan una cantidad mucho mayor a la mesa, a diferencia de otros aspectos de la programación .
Fomite
1
Más allá de eso, la cantidad de cosas en SciPy / NumPy, etc. que está escrito en C ya hace que sea útil saberlo.
Fomite
1
@EpiGrad Quizás C es una alternativa sólida para ti. Pero C tiene una curva de aprendizaje super empinada, especialmente para las personas que no tienen experiencia en codificación. En particular, a veces se bloquea, y si no eres un programador, tienes pocas esperanzas de resolverlo. Mathematica hace que una gran cantidad de cosas sea más fácil de escribir y terminas con menos código por factor de cientos. Y no se estrella.
Jason Orendorff
25

Parafraseando un muy buen comentario: no hay muchas maneras diferentes de hacer que un lenguaje sea rápido y "cercano a la máquina" : C lo hizo bien y casi no hay espacio para mejorarlo.

Respuesta original:

¿Rápido para ejecutar o rápido para escribir cosas?

Los idiomas no son rápidos ni lentos de ejecutar, las implementaciones específicas sí lo son. Un lenguaje solo puede considerarse más rápido que otros cuando de alguna manera hace que sea más fácil tener implementaciones rápidas . Invariablemente, eso significa "cerca de la máquina". Pero con las máquinas cada vez más rápido exponencialmente, eso se ha vuelto progresivamente menos interesante con el tiempo. En cambio, la facilidad y la velocidad de desarrollo y la portabilidad se han vuelto mucho más importantes, por lo que "mejor" se ha convertido en "lejos de la máquina" . Casi todos los esfuerzos en el diseño del lenguaje han ido en esa dirección durante las últimas 5 décadas.

Así que ahí estás: más cerca de la máquina y existen lenguajes más rápidos que C; son los que vinieron antes de C : ensamblador, Fortran. Probablemente algunos olvidados.

Michael Borgwardt
fuente
@michael, pero todavía hay un mercado para la programación superrápida y súper rápida, especialmente con el ataque de todos estos dispositivos móviles ... ¿por qué C sigue siendo la mejor opción para algunos de estos dispositivos, es decir, por qué no hay otro? lenguaje en ese nivel, como .NET-vs-Python-esque?
Jason
55
Ceceo. Dormido pero no olvidado! :)
2
@ Jason: La pregunta es, ¿cuántos ensambladores portátiles necesita? C es bien conocido y es muy difícil escribir un lenguaje con una implementación más rápida, entonces, ¿por qué molestarse? En suit-speak, no hay requisito, no hay mercado, no hay motivación.
44
@ Michael, disculpas por comentar tu respuesta. La razón por la que hay más en el terreno de python / ruby ​​/ java, etc. es que una vez que dejas de buscar el lenguaje más eficiente posible, obtienes muchas más opciones sobre qué características priorizar, y cada enfoque puede generar un nuevo lenguaje. Hay muchas menos formas de escribir el idioma más rápido posible.
1
-1 para "y casi no hay espacio para mejorar sobre eso" - hay mucho espacio para mejorar en C / C ++ sin afectar el rendimiento.
BlueRaja - Danny Pflughoeft
21

Fortran es más rápido que C para tareas numéricas debido a la forma en que maneja las referencias de memoria (los punteros en C son más difíciles de optimizar). Las pesadas bibliotecas numéricas en la base de cosas como Matlab y Numpy todavía están escritas en Fortran.

Por otro lado, C ++ puede ser tan rápido como C, pero tiene muchas características de programación más avanzadas. Es un lenguaje mucho más nuevo, de mediados de los 80.

zaharpopov
fuente
1
Y C ++ todavía se está actualizando.
GManNickG
55
@GMan: también C.
3
Corrígeme si me equivoco, pero ¿no tendría un restrictpuntero C99 la misma semántica de alias que Fortran? ¿Y qué más hay que haga alguna diferencia?
99
Creo que la idea de que Fortran es más rápido que C es algo mito, dependiendo de lo que se codifica y quién lo está haciendo. La razón por la que las bibliotecas numéricas pesadas están en Fortran no es porque Fortran sea más rápido, sino porque las rutinas se codificaron originalmente en Fortran y pocas personas tienen el descaro o la necesidad de volver a escribirlo. El pequeño número de gurús matemáticos que escriben y examinan estos algoritmos están contentos en Fortran y no ven la necesidad de cambiar, especialmente porque imaginan que Fortran es más rápido.
Mike Dunlavey el
16

Qué diablos, voy a intervenir con mis $ 0.02.

En muchos casos, existe una diferencia real o percibida entre los idiomas de "sistemas" y los idiomas de nivel superior. Ignoraré la mayoría de los lenguajes de "nivel superior", ya que nadie (al menos no muchos) argumentará que para muchas tareas, lenguajes como Python, Ruby, etc. son más fáciles de trabajar.

C fue diseñado para ser un lenguaje de sistemas, lo que significa que fue diseñado como el lenguaje en el que se escribió el sistema operativo Unix. Como tal, fue diseñado para ser simple, potente y rápido. Un lenguaje simple gana poder por medio de que los programadores que no son sistemas a menudo consideran peligroso: punteros, administración manual de memoria, etc. Como ya se mencionó, C es bastante simple. K&R es, con mucho, el libro más pequeño en mi plataforma de programación (sin contar las referencias de O'Reilly Pocket) y es marginalmente "más grande" que mi Ruby Pocket Reference. C es bastante poderoso. Si necesita hablar con el hardware, verifique manualmente y gire con memoria, etc. C tiene la capacidad.

Desde la perspectiva de un programador, sin embargo, C no es tan simple. La velocidad y la potencia tienen el precio de la administración de memoria manual y no hay mucho soporte de OOP integrado en el lenguaje. C ++ (no es mi lenguaje favorito) es mucho más simple desde la perspectiva de un programador, pero mucho menos simple desde la perspectiva de un compilador. Objective-C (posiblemente mi lenguaje favorito) tiene la misma compensación, con una ligera inclinación en la dirección de mantener el lenguaje simple (la recolección de basura es un recién llegado a Objective-C, por ejemplo). Pero dado que el mundo de la computación, como muchos de nosotros sabemos, está escrito en C, es difícil para los lenguajes más nuevos, más complicados pero "más fáciles" obtener una adopción generalizada.

En algunos casos, especialmente cuando el "estándar" actual es tan "suficientemente bueno" como lo es C, simplemente no hay muchos incentivos para que algo "mejor" (C ++, Objective-C, D, etc.) gane tracción, cuando hay Es incluso un incentivo suficiente para crear algo "mejor".

alesplin
fuente