¿Todavía se usa el lenguaje de programación C?

92

Soy 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 había necesidad de hacerlo. Me sorprendió cuando una de mis amigas me dijo que necesitaba aprender C para evaluar los trabajos, mientras que yo la ayudaba a aprender C #.

Me di cuenta de que alguien solo aprendería C para realizar pruebas si el desarrollo se está realizando 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 necesitas usar C ++. Tampoco creo en la importancia histórica, así que, ¿por qué perder tiempo y dinero aprendiendo C?

¿Se sigue utilizando C en cualquier tipo de desarrollo de software nuevo o cualquier otra cosa?

    
pregunta Monomeeth 15.09.2016 - 14:07
fuente

14 respuestas

211

C tiene la ventaja de que es relativamente lenguaje pequeño , lo que hace que sea fácil de implementar un compilador de C (mientras que un compilador de C ++ es un monstruo para escribir), y hace que sea más fácil de aprender el idioma . También vea el índice TIOBE , según el cual C está ligeramente por delante de C ++.

En orden de justificación decreciente (IMO), C todavía se usa mucho para

  • Material incrustado
    Es mucho más fácil portar un compilador de C a una pequeña plataforma que portar un compilador de C ++. Además, los defensores de C afirman que C ++ "hace demasiado a sus espaldas". Sin embargo, IMO eso es FUD.

  • Programación de sistemas
    Nuevamente, esto se debe generalmente 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 ++.

  • Software de código abierto
    Sin embargo, eso es principalmente un problema de actitud: OSS siempre ha preferido C sobre C ++ (mientras que es lo contrario en gran parte de la industria). El odio irracional de Torvalds podría ser la razón más importante para esto en Linux .

respondido por el sbi 26.07.2017 - 11:15
fuente
116

C se usa mucho en la programación de hardware integrado donde los recursos son escasos.

El kernel de Linux está escrito en C porque, según Linus Torvalds, C ++ es un lenguaje horrible .

    
respondido por el Joonas Pulakka 08.11.2017 - 10:44
fuente
92

Todos de los idiomas modernos que he visto pueden interactuar con C:

  • C ++
  • Java
  • Golang
  • C #
  • Python
  • Haskell
  • Objetivo C

La necesidad de interactuar con C deriva de:

  • C tiene un ABI simple
  • C está alrededor por mucho tiempo

Significa que, dado que esos idiomas pueden comunicarse con C, pueden:

  • aprovechar sus bibliotecas
  • se comunican entre sí a través de C (por ejemplo, Clang está escrito en C ++ pero ofrece enlaces de Python enganchados en su interfaz C).

Y apostaría a que todos ellos dependen de C para sus tiempos de ejecución (a menos que se hayan ensuciado completamente? dudoso).

C es el Lingua Franca de los lenguajes de programación y uno de los más simples (en lo que se refiere a ABI) no está vinculado a una arquitectura específica (como es el ensamblaje), se necesitará un cambio importante para obtener deshacerse de él.

    
respondido por el Matthieu M. 16.06.2016 - 09:53
fuente
43

En mi opinión, esta es una pregunta miope muy similar a "Mis amigos y yo escuchamos Reggae. ¿Alguien realmente escucha a 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 de google sobre la relativa popularidad de los idiomas.
Estoy seguro de que nada de esto es autoritario, pero podemos usarlo para ver las tendencias:

enlace
enlace

Incluso mirando la proporción de preguntas de SO en las etiquetas:
enlace

  • C #: 209845
  • 16 otras etiquetas
  • C: 38790

Así que C es el tema más popular de los 18 (así que hay muchos otros idiomas).

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 lo preciso que 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).

    
respondido por el Loki Astari 23.05.2017 - 14:40
fuente
23

Es posible que tenga que usar C cuando tiene pocos recursos y no necesita 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 idioma más utilizado.

Como sugirió tcrosley, puede que desee echar un vistazo a este pregunta relacionada .

También debes buscar algunos artículos relacionados sobre las diferencias entre C y C ++, como este wiki o this por ejemplo.

    
respondido por el Jose Faeti 12.04.2017 - 09:31
fuente
20

Parece que estás intentando convencerte de que C es inútil y, por lo tanto, puede ignorarse. Vamos a desglosar tu pregunta:

"Pensé que alguien solo aprendería C para las pruebas solo si el desarrollo se realiza en C."

No, hay muchas razones para aprender C. Incluso si no supieras que todavía evitaría usar declaraciones generales como esa, especialmente en relación con la lógica circular. Obviamente, uno necesita saber el idioma en el que está escrito el código para poder probarlo / arreglarlo correctamente, pero eso supone que el idioma aún 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 el diseño de hardware también se realiza en C ++".

Eso es incorrecto.

"Por lo tanto, aprender C no tiene sentido si necesitas usar C ++. Tampoco creo en un significado histórico, así que, ¿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 deberías creer, porque si lo hicieras, sabrías que C es un subconjunto de C ++ y, debido a eso, saber que C puede ayudarte a ser un mejor C ++ programador. Por supuesto, C también influyó en la mayoría de los idiomas que lo siguieron, por lo que los beneficios no se detienen allí. Además, como C es tan importante, no se puede considerar que tenga solo un significado histórico. Todavía se usa ampliamente y, por lo tanto, no puede ser relegado a una posición secundaria como esa. Puede argumentar que no es un lenguaje que todos los programadores necesiten usar y con un conocimiento profundo y que sería correcto, pero por favor no exponga su argumento diciendo que no cree en algo sin examinar primero sus verdaderos méritos. / p>     

respondido por el GonzoKnight 26.08.2011 - 22:51
fuente
16

Además de los sistemas integrados, la mayoría de los lenguajes más nuevos tienen alguna forma de interactuar con C. Al escribir una biblioteca que quiera usar fácilmente en todos esos idiomas, C es una opción obvia. C ++, aunque también puede interactuar con algunos idiomas (como Python (solo CPython)), C ++ no puede interactuar con un mayor número de idiomas debido a algunas de sus características (especialmente la manipulación de nombres, pero las plantillas no ayudan a solucionar el problema). El C ABI es uno de los más fáciles de interactuar (sé que puedes escribir C ++ y usar la "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, mientras hay otros idiomas que quieren convertirse en el lenguaje popular de sistemas (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 de C en lugar de usarlo directamente (como lo haría en C ++).

    
respondido por el jsternberg 26.08.2011 - 15:05
fuente
11

consulte langpop.com , especialmente los gráficos de Freshmeat y Google Code. Muestra que C aún está muy por delante.

C todavía es popular en los sistemas en los que necesita estar cerca del metal (es decir, el sistema integrado) y las aplicaciones que requieren rendimiento.

    
respondido por el tehnyit 26.08.2011 - 14:40
fuente
11

Lo uso casi todos los días para iPad / iPhone. Muchas bibliotecas están escritas en C y no tienen un equivalente de Objective-C. Así que sí, todavía se usa, y es uno de los dispositivos más nuevos en el mercado.

Con C, puedes programar muchos sistemas embebidos, es pequeño y práctico, y probablemente estará disponible durante muchos años (es decir, no estás perdiendo tiempo ni dinero aprendiéndolo)

    
respondido por el Valentin Radu 08.03.2017 - 10:00
fuente
7

En general, para el sistema incorporado C todavía se usa ampliamente.

Esta pregunta proporciona otro ejemplo.

El índice Tiobe , que intenta clasificar el idioma por popularidad / uso , coloca constantemente C en los primeros lugares.

    
respondido por el Xavier T. 12.04.2017 - 09:31
fuente
7

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, la conclusión es sí.

    
respondido por el tidbeck 27.08.2011 - 12:21
fuente
5

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 se puede utilizar para realizar 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 idiomas de nivel superior porque el conjunto de idiomas es relativamente pequeño y muy eficiente. Es lo más cercano a la programación en lenguaje ensamblador, sin programación en lenguaje ensamblador. e incluso puedes usar ensamblaje y C juntos.

3) C tiene su aplicación en la programación de Firmware (hardware). Esto se debe a su capacidad para usar / trabajar con el ensamblaje y comunicarse directamente con los controladores, procesadores y otros dispositivos.

4) C es un componente básico para muchos otros idiomas conocidos actualmente. Busque la historia de C y encontrará que ha existido por algún tiempo (como los lenguajes de programación van de todos modos). Eche un vistazo a Python, por ejemplo, un lenguaje de programación de alto nivel completamente orientado a objetos. Está escrito en C (quizás C ++ también). Eso le dice a usted si alguna vez quiere saber qué está pasando debajo del capó en otros idiomas; entender C y cómo funciona es esencial.

Se utiliza un lenguaje de aplicaciones para la programación de alto nivel, por ejemplo, escribiendo un procesador de textos o juego. Ejemplos de lenguajes de aplicaciones son Java, C #. La razón es porque contienen recolección de basura, escritura automática, validación en tiempo de ejecución, etc., donde el enfoque es la productividad.

Se utiliza un lenguaje de sistemas para la programación de bajo nivel. p.ej. Un microcontrolador, un controlador y un núcleo de 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 foco es que el programador tenga control directo sobre el hardware.

En general, está disminuyendo como un lenguaje de aplicaciones, pero se mantiene fuerte como un lenguaje de sistemas.

    
respondido por el niko 28.08.2011 - 09:09
fuente
1

Oh sí, se usa. Yo 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 a nivel Ethernet o IP, no al nivel por encima de TCP.

Curiosamente, en ambas compañías se eligió C sobre C ++. En una de las compañías, uno de los dos productos se construyó sobre el kernel de Linux, mientras que el otro se construyó en el espacio de usuario de Linux. El producto del kernel obviamente usó C como el kernel de Linux está programado en C, pero eligieron usar C para el producto del espacio de usuario también. Ambos productos se desarrollaron a partir del año 2000 (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 empresa 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 desde mediados de la década de 1990, aunque debido a las recientes demandas de mejora del rendimiento, se decidió que básicamente todo se reescribirá. Tuvimos la opción de 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 con 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 quiera rendimiento e ir a MurMurHash3 . Tal vez quiera seguridad y vaya a SipHash . Los asignadores de memoria son obviamente personalizados. De hecho, todas las estructuras de datos importantes que utilizamos se han implementado de forma personalizada 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 tasa de procesamiento de paquetes a niveles inaceptables! Por lo tanto, no podemos usar las excepciones de C ++. Demasiado lento Ya estamos utilizando un tipo 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 anularían el rendimiento si se usan en todas partes. Por lo tanto, es mejor ser explícito y tener un puntero a la función si se necesitan llamadas a funciones virtuales.

C ++ hará muchas cosas detrás de tu espalda: asignación de memoria, etc. Por otro lado, en C eso no suele ocurrir. Puede escribir una función que asigna memoria, pero generalmente es evidente desde 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ías usar container_of en el código C ++, pero ¿quién hace eso? Quiero decir, es totalmente aceptable en la mayoría de los programas de C, pero los programadores de C ++ típicos propondrían de inmediato algo más, como una lista enlazada 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 la plantilla, lo que significa que a veces se pueden evitar las llamadas a funciones virtuales sin dejar de tener un parámetro de función, y permitir que el compilador integre las funciones. Pero la metaprogramación de plantillas es complicada, y hemos logrado cumplir todos los requisitos en C, por lo que el beneficio de esta característica en C ++ no es tan importante.

En una de las compañías, en realidad teníamos un lenguaje compilado personalizado donde se implementaron parte de las características. ¿Adivina cuál era el idioma de destino del compilador? ¿Montaje? No, tuvimos que admitir arquitecturas de 32 y 64 bits. C ++? Seguramente usted bromea. Obviamente, era C con goto computarizado de GCC . Por lo tanto, el lenguaje personalizado se compiló en C (o en realidad la variante gcc de C que admite goto computado), y el compilador C produjo el ensamblado.

    
respondido por el juhist 26.07.2017 - 19:41
fuente
0

Sigo usando C a diario y uno de los motivos principales se debe a la interoperabilidad con otros idiomas y un SDK diseñado para ser utilizado por complementos creados por compiladores de todo tipo en varios idiomas.

No puedo escribir una API de C ++ que use clases con constructores y destructores y vtables, sobrecargas de funciones, excepciones de excepciones, etc. que se pueden usar desde Lua, C #, Python, C, etc., por no hablar de un complemento de C ++ escrito usando diferentes compiladores y configuraciones de los nuestros.

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 idioma aquí que me permite crear una API a la que se puede llamar desde cualquiera de estos idiomas. Dicho esto, a menudo uso C ++ para implementar estas interfaces en C (aunque a veces simplemente las implemento en C).

Además, a veces encuentro que C es el lenguaje más fácil para trabajar con cosas como estructuras de datos de bajo nivel y asignadores de memoria. Todo el tipo de seguridad 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 rico sistema de tipos y el manejo de excepciones de C ++, no es fácil rodar sus propias estructuras de datos. Solo mire cuánto esfuerzo requiere escribir una estructura de datos tan trivial como std::vector si quiere que sea excepcional. y evite invocar ctors y dtors en elementos que no haya insertado en el contenedor (me refiero a uno que ha implementado toda la biblioteca estándar de C ++). Cuando solo es muy difícil implementar bien un arreglo que se pueda cultivar, entonces imagine el trabajo requerido para implementar un BVH de calidad de producción.

Prefiero C ++ en lugar de C cuando quiero utilizar estructuras de datos existentes o implementar estructuras de mayor nivel utilizando 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 las estructuras de datos existentes, C hace que sea mucho más fácil de hacer con su sistema de tipo simplista que le permite simplemente memcpy things aquí y memmove things allí, malloc a contiguo bloquee y realloc allí, sin preocuparse por los constructores, los destructores y las excepciones que se lanzan.

    
respondido por el 2 revsuser204677 17.01.2018 - 17:55
fuente

Lea otras preguntas en las etiquetas