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".
Respuestas:
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.
fuente
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 '<'.
fuente
restrict
en C99 (¡hace 10 años!).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.
fuente
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.
fuente
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.
fuente
restrict
puntero C99 la misma semántica de alias que Fortran? ¿Y qué más hay que haga alguna diferencia?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".
fuente