¿Cuál es la diferencia entre C, C99, ANSI C y GNU C?

122

Comencé la práctica de programación en codechef y me ha confundido la diferencia entre C y C99. ¿Qué significa C aquí? ¿Es C89? Verifique los idiomas al final de este envío . Contiene C y C99.

Encontré en Internet algo llamado GNU C. ¿Existe una C diferente para los sistemas Linux / Unix? ¿Cumplen con los estándares C de ANSI? También he leído en algunos lugares "C99 estricto". ¿Que es esto?

¿Existen otros estándares diferentes de C en uso? ¿Hay algo llamado C 4.3.2 o es la versión gcc en uso actual?

EDITAR:

Esto , esto , esto ayudó. Buscaré más y editaré las cosas que quedan sin respuesta.

No soy un novato en programación. Sé lo que es el lenguaje C. Sé que existen diferentes estándares C de ANSI como C89, C99 y C11.

Aseem Bansal
fuente
@ Will no había buscado mucho. Lo hice ahora. Haré más. y editar más la pregunta.
Aseem Bansal
@ Will no pude encontrar sobre C99 estricto y si la C en codechef es C89 o la C original no estandarizada anterior
Aseem Bansal
1
No se olvide de POSIX C :-)
pmg

Respuestas:

216
  • Todo lo que precede a la estandarización se llama generalmente "K&R C", en honor al famoso libro , con Dennis Ritchie, el inventor del lenguaje C, como uno de los autores. Este fue "el lenguaje C" de 1972 a 1989.

  • El primer estándar C fue lanzado en 1989 a nivel nacional en EE. UU., Por su instituto nacional de estándares ANSI. Esta versión se llama C89 o ANSI-C. De 1989 a 1990 este fue "el lenguaje C".

  • Al año siguiente, la norma estadounidense fue aceptada internacionalmente y publicada por ISO (ISO 9899: 1990). Esta versión se llama C90. Técnicamente, es el mismo estándar que C89 / ANSI-C. Formalmente, reemplazó a C89 / ANSI-C, haciéndolos obsoletos. De 1990 a 1999, C90 fue "el lenguaje C".

    Tenga en cuenta que desde 1989, ANSI no ha tenido nada que ver con el lenguaje C. Los programadores que todavía hablan de "ANSI C" generalmente no tienen ni idea de lo que significa. ISO "posee" el lenguaje C, a través del estándar ISO 9899.

  • En 1995 se publicó una actualización menor, a la que a veces se hace referencia como "C95". Esta no fue una revisión importante, sino más bien una enmienda técnica formalmente denominada ISO / IEC 9899: 1990 / Amd.1: 1995. El principal cambio fue la introducción de un amplio soporte de caracteres.

  • En 1999, la norma C pasó por una importante revisión (ISO 9899: 1999). Esta versión del estándar se llama C99. De 1999 a 2011, este fue "el lenguaje C".

  • En 2011, la norma C se volvió a cambiar (ISO 9899: 2011). Esta versión se llama C11. Varias nuevas características como _Generic, _Static_asserty soporte para hilos se añadieron a la lengua. La actualización se centró mucho en la secuenciación de expresiones, multiprocesamiento y de múltiples núcleos. De 2011 a 2017, este fue "el lenguaje C".

  • En 2017, se revisó C11 y se solucionaron varios informes de defectos. Este estándar se llama informalmente C17 y se publicó como ISO 9899: 2018. No contiene nuevas funciones, solo correcciones. Es la versión actual del lenguaje C.


"C99 estricto" probablemente se refiere a una configuración del compilador que obliga a un compilador a seguir el estándar al pie de la letra. Hay un término que se ajusta a la implementación en el estándar C. Esencialmente significa: "este compilador realmente implementa el lenguaje C correctamente". Los programas que implementan el lenguaje C correctamente se denominan formalmente programas estrictamente conformes .

"GNU C" puede significar dos cosas. O el compilador de C que viene como parte de la Colección de compiladores GNU (GCC). O puede significar la configuración predeterminada no estándar que usa el compilador de GCC C. Si compila con gcc program.c, no lo hace de acuerdo con el estándar C, sino con una configuración GNU no estándar, que puede denominarse "GNU C". Por ejemplo, todo el kernel de Linux está hecho en GNU C no estándar y no en C.

Si desea compilar sus programas de acuerdo con el estándar C, debe escribir gcc -std=c99 -pedantic-errors. Reemplace c99 con c11 si su versión de GCC lo admite.

Lundin
fuente
8
La configuración estricta del compilador puede significar “Desactivar extensiones; use solo el lenguaje C definido por el estándar ”así como, o más,“ compile correctamente ”. Es completamente correcto aceptar extensiones del idioma; el estándar fue definido para permitir eso.
Eric Postpischil
5
También estaba la Enmienda 1 C94 / C95 que agregó un soporte de caracteres más amplio, principalmente. Consulte también Lista de archivos de encabezado estándar en C y C ++ .
Jonathan Leffler
2
Escribe que muchas cosas cambiaron de C90 a C99. ¿Podría nombrar algunos?
Martin Thoma
3
@Lundin, vinculó el libro equivocado para K&R; esta es la segunda edición que describe el estándar C89.
Antti Haapala
5
Sí, pero el punto es que esa no es la versión que definió el lenguaje de programación C hasta el momento; no es que esté a la venta en cualquier lugar.
Antti Haapala
7

DEBO responder con respecto a ANSI C. Aunque ANSI no ha hecho nada con él, todavía se construyen compiladores. Compilador PIC XC16, por ejemplo: "El compilador es un compilador totalmente validado que cumple con el estándar ANSI C como se define en la especificación ANSI (ANSI x3.159-1989) y se describe en El lenguaje de programación C de Kernighan y Ritchie (segunda edición). ... "No toda la programación es para computadoras" grandes "como las PC. Escribir un compilador para su dispositivo cuesta y validar cuesta tiempo y $. ANSI C está vivo y sano en sus dispositivos integrados / en tiempo real.

C es mejor
fuente
4
  • ANSI C: El primer lenguaje C fue estandarizado por el organismo llamado ANSI en 1989, por eso se llama c89.

  • C99:
    con la demanda de los requisitos de los desarrolladores, en 1999-2000 se han incluido más palabras clave y características adicionales en C99 (por ejemplo: en línea, booleano. Se agregaron funciones de biblioteca arthematic de punto flotante)

  • GNU C: GNU es un sistema operativo similar a Unix (www.gnu.org) y en algún lugar el proyecto de GNU necesita un lenguaje de programación C basado en el estándar ANSI C. GNU usa el compilador GCC (GNU Compiler Collection) para compilar el código. Tiene una función de biblioteca C que define llamadas al sistema como malloc, calloc, exit ... etc.

ANSI C es un estándar que está siendo utilizado o referenciado por otros estándares.

Kapil Chittewan
fuente
Cualquier cosa sobre C99 estricta y si la C en codechef es C89 o la C original no estandarizada anterior
Aseem Bansal
Corrección: ANSI C es un estándar obsoleto, al que solo se hace referencia en documentos desactualizados. El lenguaje C se llama ISO C, o si lo desea ISO / IEC 9899: 2011.
Lundin
1

Además de la respuesta de Lundin

Esto es lo que Dennis Richie tiene que decir cuando se le pregunta

"¿Por qué K&R no esperó la norma ANSI final aprobada antes de escribir la segunda edición de K&R?"

¿Por qué K&R no esperó la norma ANSI final aprobada antes de escribir la segunda edición de K&R? Parece que este libro solo será el estándar correcto durante unos meses antes de que sea reemplazado por el estándar ANSI final. Sé que es probable que haya algunos cambios importantes en esta etapa tardía, pero ¿por qué no esperar unos meses y asegurarse de hacerlo bien al 100%, en lugar de tener que escribir casi de inmediato una tercera edición o quedar obsoleto?

Pensamos que sería bueno celebrar el décimo aniversario de la primera edición. Más en serio, comenzamos a trabajar el verano pasado porque teníamos el tiempo y las ganas de entonces, y parecía que el X3J11 se acercaba a su fin. En diciembre y enero, cuando estábamos terminando, consideramos si la posibilidad de cambios importantes justificaba posponer la entrega y (después de discutir el asunto con el editor) decidimos que no valía la pena esperar. PH lo quería, y tanto Brian como yo lo queríamos fuera de nuestras agendas.

Incluso si hay cambios en el estándar, es difícil imaginar que sean lo suficientemente extensos como para justificar una nueva edición. (Incluso estábamos preparados para hacer frente de alguna manera a los noalias, si hubiera durado.) Estamos listos para hacer los cambios necesarios en una futura edición, pero hay motivos para esperar que sean menores. Los miembros de X3J11 están muy ansiosos por terminar sin sorprender a la gente también; muchos de ellos trabajan para empresas que están preparando compiladores ANSI, después de todo.

Dennis Ritchie

Suraj Jain
fuente
1
Lástima que Dennis Ritchie no se dio cuenta de cómo se usarían las reglas de aliasing para implicar que los compiladores no deberían hacer ningún esfuerzo para reconocer formas útiles de aliasing, sino que argumentan que los programadores cuyo código es roto por compiladores obtusos deberían "agradecer" a los compiladores por mostrándoles que su código es "defectuoso"; de lo contrario, podría haberle dicho a la gente que impulsa tales reglas que dejaran en claro que la negativa a admitir el alias más allá de los requisitos mínimos del Estándar hará que los compiladores no sean adecuados para algunos propósitos, y la necesidad del código de bajo nivel de alias es no es un defecto.
supercat
@supercat En realidad, no entendí lo que significan las reglas de alias, ¿puedes ayudarme?
Suraj Jain
1
El concepto original era que un código dado como int i; int test(double *p) { i=1; *p=2.0; return i; }un compilador no debería tener que recargarse idespués de la escritura *pen caso de que ppudiera contener la dirección de i. Perfectamente razonable. El problema es que los compiladores modernos usan la misma regla para justificar las suposiciones de que la escritura en a long*no afectará a long long, incluso si ambos tipos tienen el mismo tamaño y representación , y que incluso si dos estructuras comparten una secuencia inicial común, el código nunca usará un puntero de un tipo para leer un miembro de CIS escrito a través del otro.
supercat
-2

Esta pregunta no se buscó a fondo en la red para obtener una respuesta, de todos modos puede ver esto:

  1. C es un lenguaje de programación de propósito general desarrollado inicialmente por Dennis Ritchie entre 1969 y 1973 en AT&T Bell Labs.
  2. C99 es un estándar del lenguaje C publicado por ISO y adoptado por ANSI alrededor de 1999.
  3. GNU C es solo una extensión de c89, mientras que también se agregan algunas características de c99, pero en su totalidad es diferente del estándar c99, por lo que al compilar en gcc debemos ingresar lo -std=c99que ya se menciona en las otras respuestas.
  4. ANSI C es una serie sucesiva de estándares publicados por ANSI.
0decimal0
fuente
Busqué en la red ahora. Edité la pregunta. Conocía los estándares C y ANSI antes de publicar la pregunta. Tengo confusión con respecto a cosas específicas. Intentaré ser más preciso.
Aseem Bansal
Cualquier cosa sobre C99 estricta y si la C en codechef es C89 o la C original no estandarizada anterior
Aseem Bansal
4
Esta respuesta contiene muchos errores. C99 es un estándar definido por ISO alrededor de 1999. El lenguaje C ha sido estandarizado internacionalmente durante 23 años. Por lo tanto, ANSI no tiene nada que ver con eso, no han tocado un estándar C en 24 años. Hoy en día simplemente imprimen y distribuyen la norma ISO para el mercado estadounidense.
Lundin
@Lundin ¡¡Oh !! sí, en realidad escribí "definido", que no es el caso, debería ser "adoptado" allí. Hice la corrección, ANSI lanzó el primer estándar para C en 1989, que fue adoptado por ISO. después de eso, casi todos los estándares fueron lanzados por ISO y adoptados por ANSI, y la respuesta es breve, así que solo mencioné algunas cosas para que la respuesta sea breve.
0decimal0
1
Tenga en cuenta que gccadmite -std=c89y -std=gnu89y -std=c99y -std=gnu99(y las versiones suficientemente modernas admiten -std=c11y -std=gnu11). La diferencia está en que las extensiones sobre el estándar C están disponibles automáticamente o solo cuando la fuente empuja al compilador para que les proporcione las macros apropiadas (como -D_XOPEN_SOURCE=700).
Jonathan Leffler