c++ objective-c c

¿Qué significa "Objective-C es un superconjunto de C más estrictamente que C++" exactamente?



(5)

  1. ¿Qué quieren decir con superconjunto?

    Se refieren a superconjunto estricto. Cualquier programa C válido compilará con un compilador Objective-C. Algunos programas C válidos no se compilarán con un compilador C ++.

  2. ¿De qué manera el objetivo C sería más cercano // retrocompatible con C?

    Aquí hay un ejemplo simple:

    int *foo = malloc(12);

    Compila en C y Objective-C, pero no en C ++. Hay, por supuesto, otros ejemplos también.

  3. ¿De qué manera el objetivo C sigue la filosofía C más de cerca que C ++?

    Todos - Objective-C es un superconjunto estricto de C.

  4. ¿Se puede compilar cualquier programa en C sin modificación mediante un compilador de Object-C (100% de compatibilidad)?

    Sí.

Según lo que leí allí: ¿por qué Objective-C no es muy popular fuera de la comunidad de Apple?

Objective-C es un superconjunto de C (mucho más estricto que C ++, de hecho) por lo que no se plantea el problema de la compatibilidad con versiones anteriores. Cualquier cosa que puedas hacer en C puedes hacerlo en Objective-C.

Ser un superconjunto es binario, como estar embarazada. Obj-C es un superconjunto de C, y C ++ no lo es.

¿Qué quieren decir con superconjunto? ¿De qué manera el objetivo C sería más cercano // retrocompatible con C? ¿De qué manera el objetivo C sigue la filosofía C más de cerca que C ++?

¿Se puede compilar cualquier programa en C sin modificación mediante un compilador de Object-C (100% de compatibilidad)?

Esta es más una pregunta sobre el diseño del lenguaje de programación y la compatibilidad que una guerra sobre cuál es mejor.


"Objective-C es un superconjunto de C" significa que cada programa C válido es un programa Objective-C válido (con el mismo significado).

A veces se dice, aunque no por expertos en C ++, que C ++ es un superconjunto de C. Esto no es exacto, por lo que su cita está haciendo una gran comparación entre ambos.


Desde cero, C ++ se ha diseñado como una "C mejor", solucionando las omisiones de diseño, tanto reales como percibidas, a medida que los autores de C ++ pasaban por el lenguaje. El resultado de esta decisión de diseño ha sido que el hecho de que X sea ​​un programa C válido no garantizaba que X compilara, y mucho menos ejecutaría, cuando fuera procesado por el compilador C ++. Los cambios tocaron constructos básicos como literales de cadena (se convirtieron en const char* ), asignación de punteros void , conversiones entre enum y tipos integrales, semántica de operadores de asignación compuesta , y así sucesivamente.

Además, una vez que llegó el C99, las características que lo convertían en el estándar C actualizado quedaron fuera del estándar actualizado de C ++. Una vez más, se omitieron características muy importantes del lenguaje, en particular, los inicializadores designados y las matrices de tamaño variable.

Por el contrario, Objective C se ha posicionado como un superconjunto de C, que requiere que todos los programas C válidos sean compilables con un compilador de Objective C.


Objective C es un conjunto de extensiones compatibles hacia atrás para C. Esto es posible porque las características del Objective C están delimitadas de dos maneras muy simples:

  • uso del personaje @ . Este personaje no se usa actualmente en el lenguaje C.
  • una extensión sintáctica simple para invocar métodos, [obj method:argument] . En C, los corchetes se usan de forma muy específica para la creación de suscripciones de matriz, por lo que esta es una sintaxis C no válida. Las extensiones que se basan en la sintaxis no válida no cambian el significado de nada que sea válido en el lenguaje de host.

Es tan fácil ver que ningún programa que use extensiones de Objective C puede ser un programa ISO C estrictamente conforme, sin importar cuán simple sea. Además, cada programa ISO C puede declararse, por definición, como un programa válido de Objective C. Objective C puede seguir fácilmente desarrollos como C99 y C11.

Por otro lado, C ++ no es simplemente extensiones de C; es un lenguaje diferente que cambia el significado de parte de la sintaxis de C. C ++ y C se mantienen por separado, por lo que su relación cambia con el tiempo. Por ejemplo, C ha adquirido nuevas características que están completamente ausentes en C ++, y muy probablemente no entren en C ++, como las matrices de longitud variable C99. C ++ no puede recoger fácilmente nuevas características C.

Si escribe un programa C portátil, debe ser al mismo tiempo un programa Objective C. Pero se necesitará cuidado adicional para que también sea un programa C ++ con el mismo significado. (Esta práctica no es desconocida, y el dialecto que requiere se conoce informalmente como "Clean C").

Un ejemplo trivial de un programa C que se rompe cuando se lo trata como C ++ es cualquier programa C que utilice una palabra clave C ++ como identificador, como class o virtual . El objetivo C no introduce palabras clave reservadas. Tiene nuevas palabras clave introducidas por el carácter @ , como @interface .


Preparé un diagrama simple; no es muy bonito, pero con optimismo explica el punto:

  • Rojo: el conjunto de todos los programas válidos en C, C ++ y Objective-C (relativamente pequeño)
  • Verde: el conjunto de todos los programas válidos en C y Objective-C, pero no válido en C ++ (incluso más pequeño)
  • Gray: el conjunto de todos los programas válidos en Objective C y C ++, pero no válido en C (vacío, hasta donde yo sé)
  • Azul: el conjunto de todos los programas válidos solo en el Objetivo C (relativamente grande)
  • Amarillo: el conjunto de todos los programas válidos solo en C ++ (más grande)

El conjunto de programas C válidos (en rojo y verde) es un subconjunto estricto del conjunto de programas válidos de Objective C (azul)