¿Por qué C no tiene competidores en el nivel bajo? [duplicar]

14

Por lo que sé, C es, con mucho, el lenguaje más utilizado para cosas de bajo nivel, como la programación de sistemas e incrustado. A veces se usa el ensamblaje, pero ahí es cuando realmente necesita estar cerca del hardware.

Mi pregunta es ¿por qué C no tiene competidores en desarrollo de bajo nivel? Puede ser mi ignorancia, pero estoy bastante seguro de que C es la opción obvia (o posiblemente única) para la programación de bajo nivel.

Esto es a diferencia del desarrollo de alto nivel, donde hay muchos lenguajes de programación de la competencia para elegir.

¿Cómo puedes explicar esto?

    
pregunta Aviv Cohn 17.07.2014 - 23:34
fuente

8 respuestas

21

Curiosamente, he estado haciendo programación integrada durante 13 años: 6 en Ada y 7 en C ++.

De todos modos, hay varios factores que hacen que C sea adecuada para este tipo de programación:

  • La biblioteca de tiempo de ejecución / estándar requerida es muy pequeña.
  • La administración de memoria manual es muy útil cuando la memoria es limitada.
  • Es fácil hacer deterministas / en tiempo real porque no tiene que preocuparse por cuándo se ejecutará un recolector de basura o cuando se lanzará una excepción.
  • Es fácil asignar una variable a una dirección de memoria específica, lo cual es crucial para escribir controladores.
  • Hay muchos códigos existentes disponibles.
respondido por el Karl Bielefeldt 17.07.2014 - 23:50
fuente
9

De la misma manera, hoy podría pensar en la portabilidad / compatibilidad del navegador (¿se ejecutará este código en Opera !?) personas en el día preocupadas por la portabilidad de la CPU / arquitectura (¿se ejecutará este código en VAX !?).

Entonces, todos los proveedores de CPU terminaron enviando sus sistemas con un compilador de C. Fue relativamente sencillo de implementar, mucha gente sabía que C, tenía un buen rendimiento y no tenía que obligar a los desarrolladores de su plataforma a profundizar en el ensamblaje subyacente.

Sin embargo, a diferencia de Javascript, este impulso no fue "incorporado" a la arquitectura. C terminó ganando impulso debido a su relación con Unix y los esfuerzos realizados para hacer que Unix y C sean portátiles en todas las CPU. Puedes leer mucho sobre esto en página de wikipedia de C . En resumen: Unix fue uno de los primeros sistemas operativos escritos no en ensamblaje, sino en un lenguaje de nivel superior, C. Además, C se desarrolló explícitamente a partir de intentos de portar Unix a otras arquitecturas. Así que esas lecciones aprendidas ayudaron a hacer de C un sistema de lenguaje portátil. Bell Labs creó el Compilador C portátil o pcc que hizo mucho más fácil admitir muchas arquitecturas de CPU.

Debido a los esfuerzos explícitos de portar Unix a todas partes, C se trasladó a todas partes. Así que el lenguaje fue uno de los primeros en tener la portabilidad de bajo nivel incorporada en sus huesos y la popularidad y el impulso crecieron a partir de ahí.

    
respondido por el Doug T. 18.07.2014 - 14:27
fuente
5

Porque C es el idioma portátil de nivel más bajo que existe y es ampliamente compatible.

Recuerdo que hace años, en una demostración, había un comentario:

  

C es simplemente asm con más macros.

Y es cierto. C es lo suficientemente alto como para permitir la escritura de código portátil, pero lo suficientemente bajo como para que pueda ver qué sucede exactamente al nivel de bytes en la memoria cuando lo necesita y, por lo tanto, puede conectarlo fácilmente a los pocos bits de ensamblaje que son absolutamente necesarios. Para ser plataforma específica. Y no pasa absolutamente nada de manera implícita, de modo que cuando no escribe nada, no tomará ciclos, lo cual es importante cuando escribe cosas de rendimiento crítico en los aspectos internos del sistema operativo, la biblioteca de subprocesos y demás.

Todos los demás lenguajes de programación, excepto el ensamblaje, son de nivel superior. Lo que es genial para escribir aplicaciones, pero para el código del sistema es más importante juzgar cómo se ve el código compilado.

C es también el mínimo denominador común. Puedes llamar a la biblioteca C desde cualquier otro idioma. Otros idiomas tienen varios requisitos que dificultan su mezcla.

    
respondido por el Jan Hudec 18.07.2014 - 15:03
fuente
4

Para complementar otras respuestas, no olvide que C fue escrito por Bell Labs, en gran parte para el proyecto Unix. Unix se reescribió en C el año en que se publicó el lenguaje. Las bibliotecas y las herramientas del sistema Unix estaban basadas en C y seguían las convenciones de C. En resumen, C es el idioma oficial de los sistemas Unix, y hoy en día todos estamos usando derivados de Unix (con la excepción de la gente de Windows).

Además de eso, cualquier nivel más alto que C comienza a sacrificar la eficiencia y la libertad del programador por el objetivo a menudo encomiable de la seguridad. Por ejemplo, intente asignar un bloque de tamaño dinámico de memoria de almacenamiento en Go. Si bien Go se considera un lenguaje de sistemas, es difícil realizar manipulaciones de bajo nivel en él; A menudo no se puede hacer sin grandes trucos o gastos generales. Los buenos programadores de C confían en su capacidad para usar el lenguaje correctamente y no quieren renunciar a un poder tan completo y un control preciso.

    
respondido por el Mike 18.07.2014 - 17:44
fuente
3

1) ..C es, con mucho, el lenguaje más utilizado para nivel bajo ... ¿por qué?

Es muy utilizado debido a su edad. Según Wikipedia - C (lenguaje de programación) tiene 42 años . Significa 42 * number_of_programmers man-years del trabajo realizado. Como la C está incluida en los cursos de programación básica en cualquier escuela de programación seria, la cantidad de programadores que pueden hablar C en todo el mundo es muy grande y la cantidad de código C disponible en la actualidad es muy, muy grande.

2) ..why no tiene C ningún competidor en desarrollo de bajo nivel? ..

su reclamación "no tiene competidores" no es cierta, por lo que no tiene ninguna respuesta disponible por qué.

VHDL (comience en enlace ) es un lenguaje de bajo nivel mucho más eficiente para un bajo nivel cosas. p.ej. para expresar el paralelismo que se puede compilar directamente en el diseño del circuito de hardware o flashear y "interpretar" con una velocidad y eficiencia muy altas en el campo - chips de hardware de matriz de puerta programable (FPGA) .

Este lenguaje no está tan extendido, ya que no es tan antiguo, no se suele enseñar en los cursos de programación de propósito general, requiere procesadores especiales (aunque baratos) para ejecutarse. Es más exigente para la disciplina del programador y no es un lenguaje para escribir aplicaciones de "hola mundo" que simplemente parpadea con pocos LEDs conectados al puerto COM o para imprimir algunas tablas artísticas ASCII de lujo.

VHDL es un competidor C muy fuerte y serio para el desarrollo de bajo nivel. No es "sólo otro ensamblador". Es un cambio de paradigma

3)

En la categoría de "mínimo denominador común", los lenguajes que podrían reemplazar a C podrían ser capaces de expresar / compilar de manera eficiente en MMIX ( pronunciado em-mix) es una arquitectura RISC de 64 bits diseñada por Donald Knuth que podría convertirse en un competidor.

Pero!

¿Quién invierte hoy en día el tiempo y el esfuerzo en inventar un nuevo lenguaje eficiente con herramientas, etc. escribiendo un compilador para él, etc. ¿Quién necesita un esfuerzo tan tremendo hoy? ¿Qué problemas resolvería ? Incluso los programadores quieren criar hijos, quieren tener vidas. Para hacer que este nuevo lenguaje se extienda, ya no se puede resolver como un proyecto de pasatiempo de un solo hombre, tiempo libre. Simplemente compare las bases de código de varios compiladores / IDE con algo que sepa, algo que escriba usted mismo, y verá otra respuesta al por qué

    
respondido por el xmojmr 18.07.2014 - 21:47
fuente
2

Hay idiomas que compiten con C (para programación de bajo nivel o sistema): Rust, Cyclone, ... y quizás Go (que probablemente sea un nivel un poco más alto).

Y hay más idiomas académicos compitiendo con C.

    
respondido por el Basile Starynkevitch 18.07.2014 - 17:58
fuente
0

Bueno, la pregunta es qué define como incrustado ...

¿Es una Raspberry Pi todavía un sistema integrado? Si es así, entonces hay competencia ... Puede instalar Node.JS en él y ejecutar JavaScript en él, ¿es eficaz? ¿Un poco? ¿Te importa cada círculo? (Para 10 usuarios (no realmente) (

Digamos que solo tenemos 33Mhz ¿Te importan los círculos? Sí Probablemente podrías escribir un Rust - o un Go -Code. Pero le daría algunos ciclos de compensación ... (controles de seguridad, recolección de basura (etc.))

¿Deberíamos preocuparnos por los ciclos de GHz o MHz todo el tiempo? Sí y no :)

    
respondido por el user1447255 19.07.2014 - 00:00
fuente
0

(Fuente: desarrollador incrustado.)

En primer lugar, necesita un lenguaje que compile las instrucciones de la máquina, no algunas instrucciones intermedias (por ejemplo, Python, Java). Si su compilador se basa en códigos de bytes de Java, ¿qué ejecuta los códigos de bytes?

El requisito de código compilado a máquina elimina muchos, muchos lenguajes de alto nivel.

Segundo, su lenguaje necesita compilar a las instrucciones de la máquina de múltiples plataformas. OK, entonces Haskell puede compilar x86 y ARM. ¿Qué hay de la otra docena de CPU por ahí?

El enlazador de

C me da una gran cantidad de poder. Puedo poner el código en una ubicación específica. Digamos que mi CPU se inicia en 0x08000. Puedo decirle al vinculador que almacene el código en esa ubicación. Puedo decirle al enlazador que almacene cierto código en ciertos segmentos. El cargador colocará esos segmentos en una ubicación específica. Eso es útil si tengo un código que quiero quedarme sin flash vs código para quedarme sin RAM. El kernel de Linux coloca el código de inicio en un trozo de memoria que luego se libera, recuperando así la memoria del código que solo se ejecuta una vez.

Puedo llamar al ensamblado desde C y C desde el ensamblaje. El arranque de la CPU está todo en ensamblaje. El proceso de nivel bajo-bajo se realiza en ensamblaje porque es posible que el entorno C aún no se haya inicializado. (Algo tiene que llamarse main ().) Las construcciones de sincronización de CPU múltiple de muy bajo nivel (semáforos, mutexes, etc.) generalmente están en ensamblaje porque requieren instrucciones específicas de la CPU. Los cachés, MMUs, etc., se configuran generalmente en bits de montaje incómodos. (ARM se carga con instrucciones específicas para configurar el caché, MMU).

C es una capa delgada sobre el ensamblaje. C es más rápido que el montaje. Así que C gana para cosas de bajo nivel. C gana porque nadie más ha creado un competidor.

    
respondido por el David Poole 21.07.2014 - 21:46
fuente

Lea otras preguntas en las etiquetas