Soy un programador de C #, y la mayor parte de mi desarrollo es para sitios web junto con algunas aplicaciones de Windows. En lo que respecta a C, no lo he usado en mucho tiempo, ya que no era necesario. Me sorprendió cuando una de mis amigas dijo que necesitaba aprender C para probar trabajos, mientras yo la ayudaba a aprender C #.
Pensé que alguien solo aprendería C para realizar pruebas si se realiza un desarrollo en C. Según mi conocimiento, todo el desarrollo relacionado con COM y el diseño de hardware también se realiza en C ++. Por lo tanto, aprender C no tiene sentido si necesita usar C ++. Tampoco creo en la importancia histórica, entonces ¿por qué perder tiempo y dinero en aprender C?
¿Se sigue utilizando C en algún tipo de desarrollo de software nuevo o en cualquier otra cosa?
fuente
Respuestas:
C tiene la ventaja de que es un lenguaje relativamente pequeño , lo que facilita la implementación de un compilador de C (mientras que un compilador de C ++ es un monstruo para escribir) y facilita el aprendizaje del lenguaje . También vea el índice TIOBE , según el cual C está ligeramente por delante de C ++.
En (IMO) orden decreciente de justificación, C todavía se usa mucho para
Cosas incrustadas
Es mucho más fácil portar un compilador de C a una plataforma pequeña que portar un compilador de C ++. Además, los defensores de C afirman que C ++ "hace demasiado a sus espaldas". Sin embargo, en mi opinión eso es FUD.
Programación de sistemas
Una vez más, esto generalmente se debe a las afirmaciones de que es más fácil "saber qué está haciendo el compilador". Sin embargo, muchos programas integrados se beneficiarían, por ejemplo, de plantillas y otras características clave de C ++.
Sin embargo, el software de código abierto es principalmente un problema de actitud: OSS siempre ha preferido C sobre C ++ (mientras que es lo opuesto en grandes partes de la industria). El odio irracional de Torvalds podría ser la razón más importante para esto en Linux .
fuente
std::vector
o astd::map
para un determinado fragmento de código, pero no tiene que implementarlo usted mismo, sino que puede confiar en un alto rendimiento bien probado, e implementaciones de bibliotecas confiables que ofrecen altas abstracciones.C se usa mucho en la programación de hardware embebido donde los recursos son escasos.
El kernel de Linux está escrito en C porque, según Linus Torvalds, C ++ es un lenguaje horrible .
fuente
Todos los lenguajes modernos que he visto pueden interactuar con C:
La necesidad de interactuar con C deriva de:
Significa que, dado que esos lenguajes pueden comunicarse con C, pueden:
Y apostaría a que todos ellos confían en C para sus tiempos de ejecución (a menos que fueran dudosos).
C es el Lingua Franca de los lenguajes de programación y uno de los más simples (ABI-wise) no vinculado a una arquitectura específica (como lo es el ensamblado), tomará un cambio importante deshacerse de él.
fuente
En mi opinión, esta es una pregunta miope similar a "Mis amigos y yo escuchamos Reggae. ¿Alguien realmente todavía escucha Rap?".
Cada idioma por ahí tiene su uso. Diferentes idiomas definitivamente tienen sus nichos. Pero preguntando por C! Estoy seguro de que menos personas usan C # que C a diario (desde el punto de vista totalmente sesgado de trabajar en una tienda donde nadie usa C #).
Búsqueda rápida en Google sobre la popularidad relativa de los idiomas.
Estoy seguro de que nada de esto tiene autoridad, pero podemos usarlo para ver tendencias:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/
Incluso mirando la proporción SO de preguntas en las etiquetas:
https://stackoverflow.com/tags
Entonces, C es el tema 18 más popular en SO (y hay muchos otros lenguajes allí).
Nota: El índice TIOBE anterior se ha actualizado constantemente durante más de una década (y algunos datos se remontan a 3 décadas) se supone que mide a los ingenieros que trabajan en cada idioma (aunque no tengo idea de cuán preciso es). De los 10 idiomas principales, excepto Java / Visual Basic, refleja lo que la gente en mi tienda sabe (aunque nuestras proporciones serán ligeramente diferentes ya que tenemos un tamaño de muestra mucho más pequeño).
fuente
I am sure none of this is authoritative but we can use it to see trends
Pero no estoy de acuerdo con tu segunda declaración; C ya no es el idioma principal que se enseña en los institutos de educación superior (si lo fuera, el nuevo grupo de graduados no sería tan inútil). La gente tiende a aprender Java / C # sharp hoy en día. Además, el informe Tiobe trata sobre trabajos, no consultas.Es posible que deba usar C cuando tenga pocos recursos y no necesite capacidades orientadas a objetos.
Muchos softwares en uso hoy en día todavía están escritos en C, sin mencionar los controladores de hardware.
Según el índice Tiobe , C sigue siendo el lenguaje más utilizado.
Como sugirió tcrosley, es posible que desee echar un vistazo a esta pregunta relacionada .
También debe verificar algunos artículos relacionados sobre las diferencias entre C y C ++, como este wiki o este, por ejemplo.
fuente
Parece que está tratando de convencerse de que C es inútil y, por lo tanto, puede ignorarse. Analicemos su pregunta:
"Pensé que alguien solo aprendería C para las pruebas solo si se realiza un desarrollo en C."
No, hay muchas razones para aprender C. Incluso si no supieras que aún evitaría usar declaraciones generales como esa, especialmente en conjunción con la lógica circular. Obviamente, uno necesita saber el idioma en el que está escrito el código para poder probarlo / corregirlo correctamente, pero eso supone que el idioma todavía se usa como un hecho y es cierto para cualquier idioma y no solo para C.
"En mi conocimiento, todo el desarrollo relacionado con COM y diseño de hardware también se realiza en C ++".
Eso es incorrecto.
"Por lo tanto, aprender C no tiene sentido si necesita usar C ++. Tampoco creo en el significado histórico, entonces, ¿por qué perder tiempo y dinero en aprender C?"
Esta es la lógica más cuestionable de todas. En primer lugar, la importancia histórica es algo en lo que debe creer, porque si lo supiera, sabría que C es un subconjunto de C ++ y, por eso, saber C puede ayudarlo a ser un mejor programador de C ++. Por supuesto, el C también influyó en la mayoría de los lenguajes que vinieron después, por lo que los beneficios no terminan ahí. Además, debido a que C es tan importante, no puede considerarse que solo tenga importancia histórica. Todavía se usa ampliamente y, por lo tanto, no se puede relegar a una posición secundaria como esa. Puede argumentar que no es un lenguaje que todo programador necesita usar y que tiene un conocimiento profundo y eso sería correcto, pero no construya su argumento diciendo que no cree algo sin examinar primero sus verdaderos méritos.
fuente
Además de los sistemas embebidos, la mayoría de los lenguajes más nuevos tienen alguna forma de interactuar con C. Al escribir una biblioteca que desea que sea fácil de usar en todos esos lenguajes, C es una opción obvia. C ++, aunque también puede interactuar con algunos idiomas (como Python (solo CPython)), C ++ no puede interactuar con una mayor cantidad de idiomas debido a algunas de sus características (especialmente el cambio de nombre, pero las plantillas no ayudan al problema). El C ABI es uno de los más fáciles de interactuar (sé que puedes escribir C ++ y usar "C" externa para la interfaz. No me importa).
También tiene la ventaja de que C y C ++ son realmente los mejores lenguajes para la programación de sistemas y los tiempos de compilación de C son mucho más rápidos. Los tiempos de compilación de C ++ son notablemente los peores de cualquier lenguaje que haya usado.
Ahora bien, aunque hay otros lenguajes que quieren convertirse en el lenguaje de sistemas más popular (sé sobre D en particular), una gran mayoría de software está escrito en C / C ++. Los lenguajes como D requieren que alguien cree un contenedor alrededor de la biblioteca C en lugar de usarlo directamente (como lo haría con C ++).
fuente
extern(C)
en D, mientras que en C ++ escribeextern "C"
echa un vistazo a langpop.com , especialmente los gráficos de Freshmeat y Google Code. Muestra que C todavía está muy por delante.
C sigue siendo popular en los sistemas en los que necesita estar cerca del metal (es decir, el sistema integrado) y las aplicaciones que requieren mucho rendimiento.
fuente
Lo uso casi todos los días desarrollando para iPad / iPhone. Muchas bibliotecas están escritas en C y no tienen un equivalente de Objective-C. Entonces sí, todavía se usa y es uno de los dispositivos más nuevos del mercado.
Con C, puede programar muchos sistemas embebidos, es pequeño y práctico, y probablemente seguirá existiendo durante muchos años (es decir, no perderá tiempo ni dinero aprendiéndolo)
fuente
En general, para el sistema embebido, C todavía se usa ampliamente.
Esta pregunta da otro ejemplo.
El índice Tiobe , que intenta clasificar el lenguaje por popularidad / uso , consistentemente coloca a C en primer lugar.
fuente
Portabilidad.
Haga una lista de todos los sistemas que cree que ejecutarán el código C y luego una lista similar para cada otro idioma que desee.
Si se te ocurrió la misma respuesta que yo, entonces la conclusión es sí.
fuente
Bueno, creo que C es el lenguaje más poderoso ¡Debido a las siguientes razones!
1) EN la primera C, es un lenguaje de sistemas (lo que significa que puede usarse para hacer programación de bajo nivel con un tiempo de ejecución mínimo o nulo).
2) Velocidad de la aplicación resultante. El código fuente de C se puede optimizar mucho más que los lenguajes de nivel superior porque el conjunto de idiomas es relativamente pequeño y muy eficiente. Es lo más parecido a la programación en lenguaje ensamblador, sin programar en lenguaje ensamblador. ¡e incluso puedes usar ensamblaje y C juntos!
3) C tiene cuál es su aplicación en la programación de Firmware (hardware). Esto se debe a su capacidad de usar / trabajar con ensamblaje y comunicarse directamente con controladores, procesadores y otros dispositivos.
4) C es un bloque de construcción para muchos otros lenguajes conocidos actualmente. Busque la historia de C y encontrará que ha existido por algún tiempo (ya que los lenguajes de programación funcionan de todos modos). Eche un vistazo a Python, por ejemplo, un lenguaje de programación de alto nivel totalmente orientado a objetos. Está escrito en C (quizás también en C ++). Eso te dice si alguna vez quieres saber qué está pasando bajo el capó en otros idiomas; Comprender C y cómo funciona es esencial.
Se utiliza un lenguaje de aplicaciones para la programación de alto nivel, por ejemplo, escribir un procesador de textos o un juego. Ejemplos de lenguajes de aplicaciones son Java, C #. La razón es porque contienen recolección de basura, tipeo automático, validación de tiempo de ejecución, etc., donde el foco es la productividad.
Se utiliza un lenguaje de sistemas para la programación de bajo nivel. Por ejemplo, un microcontrolador, un controlador y un núcleo del sistema operativo. Los ejemplos incluyen ensamblaje, C. Requieren poco o ningún tiempo de ejecución para ejecutar el código directamente en el hardware, y el objetivo es que el programador tenga control directo sobre el hardware.
En general, está disminuyendo como lenguaje de aplicaciones, pero sigue siendo fuerte como lenguaje de sistemas.
fuente
Oh sí, se usa. Trabajo en el campo del procesamiento de paquetes de red. He estado en dos compañías diferentes donde procesamos paquetes de red. Por lo tanto, estamos operando en el nivel de Ethernet o IP, no en el nivel por encima de TCP.
Curiosamente, en ambas compañías C fue elegido sobre C ++. En una de las compañías, uno de los dos productos se creó sobre el núcleo de Linux, mientras que el otro producto se creó en el espacio de usuario de Linux. El producto del kernel obviamente usó C ya que el kernel de Linux está programado en C, pero también eligieron usar C para el producto del espacio de usuario. Ambos productos se desarrollaron a partir del año 2000 aproximadamente (el producto del núcleo un poco antes del 2000 y el producto del espacio del usuario un poco después del 2000).
En la compañía a la que fui después de eso, el producto se creó en C, no en C ++. En realidad, es una continuación de un proyecto de mediados de la década de 1990, aunque debido a las recientes demandas de mejora del rendimiento, se decidió que esencialmente todo se reescribirá. Teníamos una opción para seleccionar C ++ debido a esta reescritura, pero no lo hicimos.
En el campo del procesamiento de paquetes de red, el rendimiento cuenta mucho. Por lo tanto, quiero implementar mi propia tabla hash que tenga un mayor rendimiento que las tablas hash existentes. Yo, no el autor de la tabla hash, soy quien selecciona qué función hash se va a utilizar. Tal vez quiero rendimiento e ir a MurMurHash3 . Quizás quiero seguridad y voy por SipHash . Los asignadores de memoria son obviamente personalizados. De hecho, todas las estructuras de datos importantes que utilizamos se han implementado a medida para obtener el mayor rendimiento posible.
Si bien no hay nada que impida el uso de C ++, generalmente es una mala idea. ¡Una sola excepción lanzada por paquete reducirá la velocidad de procesamiento de paquetes a niveles inaceptables! Por lo tanto, no podemos usar las excepciones de C ++. Demasiado lento. Ya estamos utilizando una especie de código C orientado a objetos implementando estructuras de datos como estructuras y luego implementando funciones que operan en esas estructuras. C ++ permitiría tener funciones virtuales, pero nuevamente las llamadas a funciones virtuales matarían el rendimiento si se usaran en todas partes. Por lo tanto, es mejor ser explícito y tener un puntero de función si se necesitan llamadas a funciones virtuales.
C ++ hará muchas cosas a sus espaldas: asignación de memoria, etc. Por otro lado, en C eso generalmente no sucede. Puede escribir una función que asigne memoria, pero por lo general se deduce de la interfaz de la función que está ocurriendo la asignación.
Como ejemplo del tipo de microoptimizaciones que puede hacer al programar en C, eche un vistazo a la macro container_of en el kernel de Linux. Claro, podría usar container_of en código C ++, pero ¿quién lo hace? Quiero decir, es totalmente aceptable en la mayoría de los programas de C, pero los programadores típicos de C ++ propondrán inmediatamente otra cosa, como una lista vinculada que asigna los nodos de enlace como bloques separados. No queremos eso porque cada bloque de memoria asignado es malo para el rendimiento.
Quizás lo único que nos beneficiaría en C ++ es que C ++ permite la metaprogramación de plantillas, lo que significa que a veces puede evitar las llamadas a funciones virtuales mientras todavía tiene un parámetro de función, y permitir que el compilador incorpore las funciones. Pero la metaprogramación de plantillas es complicada y hemos logrado cumplir con todos los requisitos en C, por lo que el beneficio de esta función en C ++ no es tan crítico.
En una de las compañías, en realidad teníamos un lenguaje compilado personalizado en el que se implementaron parte de las características. ¿Adivinen cuál era el idioma de destino del compilador? ¿Montaje? No, tuvimos que admitir arquitecturas de 32 bits y de 64 bits. C ++? Seguramente bromeas. Obviamente, era C con el goto calculado de GCC . Por lo tanto, el lenguaje personalizado se compiló en C (o en realidad la variante gcc de C que admitía goto calculado), y el compilador de C produjo el ensamblado.
fuente
Todavía uso C a diario y una de las razones principales es la interoperabilidad con otros lenguajes y un SDK diseñado para ser utilizado por complementos creados por todo tipo de compiladores en varios idiomas.
No puedo escribir una API de C ++ que use clases con constructores y destructores y vtables, sobrecarga de funciones, excepciones de lanzamiento, etc. que se pueden usar desde Lua, C #, Python, C, etc. y mucho menos un complemento de C ++ escrito usando diferentes compiladores y configuraciones de la nuestra.
No puedo escribir un SDK de C # que se pueda llamar desde Python, por ejemplo, o un SDK de Python que se pueda llamar desde C #.
C es el único lenguaje aquí que me permite crear una API a la que se puede llamar desde cualquiera de estos lenguajes. Dicho esto, a menudo uso C ++ para implementar estas interfaces C (aunque a veces solo las implemento en C).
Además de eso, a veces encuentro que C es el lenguaje más fácil para trabajar para cosas como estructuras de datos de bajo nivel y asignadores de memoria. Toda la seguridad de tipo adicional que obtiene en C ++ no ayuda si está escribiendo un asignador de memoria diseñado para agrupar bits y bytes alineados. Y contra el sistema de tipo rico de C ++ y el manejo de excepciones, no es fácil rodar sus propias estructuras de datos: solo mire cuánto esfuerzo se necesita para escribir una estructura de datos tan trivial como
std::vector
si desea hacerla segura para excepciones y evitar invocar ctors y dtors en elementos que no insertó en el contenedor (estoy hablando como uno que ha implementado toda la biblioteca estándar de C ++). Cuando una matriz ampliable es muy difícil de implementar bien, entonces imagine el trabajo requerido para implementar una BVH de calidad de producción.Prefiero C ++ sobre C cuando quiero usar estructuras de datos existentes o implementar las de nivel superior usando las existentes, pero si voy a implementar una estructura de datos de bajo nivel en el núcleo de un motor que no tiene uso para Con las estructuras de datos existentes, C definitivamente hace que sea mucho más fácil hacerlo con su sistema de tipo súper simplista que le permite simplemente
memcpy
cosas aquí ymemmove
cosas allá,malloc
un bloque contiguo yrealloc
allí, sin preocuparse por los constructores, destructores y excepciones.fuente