O que “Objective-C é um superconjunto de C mais estritamente do que C ++” significa exatamente?

87

Pelo que li lá: Por que Objective-C não é muito popular fora da comunidade Apple?

Objective-C é um superconjunto de C (muito mais estritamente do que C ++, na verdade), portanto, o problema de compatibilidade com versões anteriores não surge. Tudo o que você pode fazer em C, você pode fazer em Objective-C.

Ser um superconjunto é binário, como estar grávida. Obj-C é um superconjunto de C, e C ++ não é.

O que eles querem dizer com superconjunto? De que maneira o objetivo-C seria mais próximo // compatível com as versões anteriores de C? De que forma o objetivo-C segue a filosofia C mais de perto do que o C ++?

Qualquer programa C pode ser compilado sem modificação por um compilador objetivo-C (100% de compatibilidade)?

Esta é mais uma questão sobre o design e compatibilidade da linguagem de programação do que uma guerra sobre qual é a melhor.

user1115057
fonte

Respostas:

134

Eu preparei um diagrama simples; não é muito bonito, mas espero que transmita o ponto:

  • Vermelho: o conjunto de todos os programas válidos em C, C ++ e Objective-C (relativamente pequeno)
  • Verde: o conjunto de todos os programas válidos em C e Objective-C, mas inválidos em C ++ (ainda menor)
  • Cinza: o conjunto de todos os programas válidos em Objective C e C ++, mas inválido em C (vazio, pelo que eu sei)
  • Azul: o conjunto de todos os programas válidos apenas no Objetivo C (relativamente grande)
  • Amarelo: o conjunto de todos os programas válidos apenas em C ++ (maior)

O conjunto de programas C válidos (em vermelho e verde) é um subconjunto estrito do conjunto de programas Objective C válidos (azul)

insira a descrição da imagem aqui

Escualo
fonte
14
E quanto ao c ++ objetivo?
user1115057
14
Estranha semelhança ...: justindomke.files.wordpress.com/2008/11/scalaimage11.png
user1115057
19
Em que medida você afirma que o amarelo é "maior" do que o azul aqui? A intuição me diz que ambos os conjuntos seriam contavelmente infinitos.
wim
4
@wim: E ambos são representados como subconjuntos incontáveis ​​de R ^ 2;) Este é o mesmo truque que você verá N dentro do Q, apesar de serem do mesmo tamanho (e N sendo um subconjunto estrito de Q).
Maciej Piechotka de
3
Eu estava pensando um pouco mais sobre isso e percebi que o conjunto ObjC ++ não envolveria realmente tudo isso. É um superconjunto de C ++, mas não um superconjunto estrito de ObjC. Os mesmos programas que são C legal, mas C ++ ilegal (a área verde) são ObjC ++ ilegal.
Rob Napier de
62
  1. O que eles querem dizer com superconjunto?

    Eles significam superconjunto estrito. Qualquer programa C válido será compilado com um compilador Objective-C. Alguns programas C válidos não compilarão com um compilador C ++.

  2. De que maneira o objetivo-C seria mais próximo // compatível com as versões anteriores de C?

    Aqui está um exemplo simples:

    int *foo = malloc(12);

    Compila em C e Objective-C, mas não em C ++. Existem, é claro, outros exemplos também.

  3. De que forma o objetivo-C segue a filosofia C mais de perto do que o C ++?

    All - Objective-C é um superconjunto estrito de C.

  4. Qualquer programa C pode ser compilado sem modificação por um compilador objetivo-C (100% de compatibilidade)?

    Sim.

Carl Norum
fonte
2
Sim, isso seria bom. Indiscutivelmente, você também não precisa do Objective-C para a GUI, se estiver disposto a descobrir as funções de tempo de execução de baixo nível a serem usadas.
Carl Norum
3
Principalmente filosófico.
Carl Norum
2
+1 Ótima explicação. Eu sugeriria que a questão da "filosofia C" é um pouco vaga, mas a maioria dos observadores provavelmente concordaria que os "objetivos" de C e os "objetivos" de ObjC diferem. A intenção do C é estar muito perto do hardware, enquanto fornece algumas abstrações de portabilidade úteis, enquanto o objetivo do ObjC é trazer uma abordagem SmallTalk para C. Como o Cocoa se tornou parte integrante do ObjC nos últimos anos, essa divergência é ainda mais forte. A "filosofia" (abordagem de design) de um C-array e um NSArray são certamente muito diferentes.
Rob Napier
2
Isso depende inteiramente do programa. Provavelmente você não faria muitas coisas no estilo C em um programa Objective-C. Por que você usaria Objective-C então?
Carl Norum,
1
@ user1115057: você não deve se preocupar muito sobre como as coisas são consideradas. Existem dois problemas em escrever código C ++ que compila como (ou pelo menos se parece com) C. Um é que você não está obtendo nenhum dos benefícios do C ++, mas essa é sua decisão. O importante é que você está escrevendo em um dialeto quebrado de C que não é realmente C. Em vez disso, você deve compilar seu código C com um compilador C e vinculá-lo ao seu código C ++. Essa última preocupação não se aplica a Objective-C, pois o subconjunto de Objective-C que compila como C é C.
Steve Jessop
31

Desde o início, C ++ foi projetado como um "C melhor", corrigindo omissões de design, tanto reais quanto percebidas, à medida que os autores de C ++ examinavam a linguagem. O resultado dessa decisão de design foi que Xser um programa C válido não garantia que Xseria compilado, muito menos executado, quando processado pelo compilador C ++. As mudanças afetaram construções básicas como literais de string (eles se tornaram const char*), atribuição de voidponteiros, conversões entre enums e tipos integrais, semântica de operadores de atribuição compostos e assim por diante.

Além disso, quando o C99 apareceu, os recursos que o integraram ao padrão C atualizado foram deixados de fora do padrão C ++ atualizado. Novamente, recursos muito importantes da linguagem foram deixados de fora - mais notavelmente, inicializadores designados e arrays de tamanho variável.

Em contraste, Objective C foi posicionado como um superconjunto de C, exigindo que todos os programas C válidos sejam compilados com um compilador Objective C.

dasblinkenlight
fonte
4
Respondi a essa pergunta porque sei o que é um "superconjunto", mas não sei nada sobre Objective-C. Eu vi uma afirmação em outra questão SO, que o trecho de código C válido int nil = 0; nil++;não compila como Objective-C. Qual é o problema aí, é óbvio que Objective-C disponibiliza cabeçalhos que, uma vez incluídos, podem quebrar seu código exatamente como os cabeçalhos C podem? E, portanto, o autor desse trecho não deveria tê-los incluído.
Steve Jessop
2
"nil" é na verdade um #define em vez de uma palavra-chave. Você está tendo problemas porque objc / objc.h está incluído. Isso é semelhante aos problemas que você veria se tentasse criar uma variável chamada SIM. (O Xcode os destaca como se fossem realmente palavras-chave, porque é muito mais fácil pensar nisso dessa forma; mas eles são implementados como um código C simples.)
Rob Napier
4
BTW, vale a pena dar uma olhada em objc.ha pouco se você estiver interessado em como ObjC vive em cima de C. Coisas que você pensaria que seriam palavras-chave (id, BOOL, Class, nil, etc.) são apenas tipos e estruturas simples , e define. Você pode até implementar a passagem de mensagem manualmente em pure-C. Nunca, jamais faça isso. : D Mas você pode. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier
2
@DanNeely: Rob Napier disse "nunca, nunca faça isso" como um comentário sobre o arquivo vinculado. O arquivo vinculado não é o tempo de execução do Objective-C, é apenas um hack rápido que mostra como as mensagens realmente funcionam.
Dietrich Epp
1
O arquivo vinculado não estava demonstrando o quão complicado é a passagem de mensagens ObjC. Isso demonstra que o runtime está disponível em C e que você pode, a princípio, converter o código ObjC em C. puro. MAS ... isso é tão lento quanto você poderia construí-lo. Ele dependia do meu conhecimento do tipo de retorno dos métodos (e, para alguns tipos de retorno, provavelmente precisaria saber o tipo de processador) e escolhi cuidadosamente métodos que não usam parâmetros. A solução completa tem muitos truques sutis (as peças precisam estar no montador porque trapaceiam com os frames da pilha). Você nunca deve tentar reconstruí-lo.
Rob Napier,
12

"Objective-C é um superconjunto de C" significa que todo programa C válido é um programa Objective-C válido (com o mesmo significado).

Às vezes é dito, embora não por especialistas em C ++, que C ++ é um superconjunto de C. Isso não é preciso, e é por isso que sua citação está dando tanta importância à comparação entre os dois.

Steve Jessop
fonte
9

Objective C é um conjunto de extensões compatíveis com versões anteriores para C. Isso é possível porque os recursos do Objective C são delimitados de duas maneiras muito simples:

  • uso do personagem @. Este caractere não é usado atualmente na linguagem C.
  • uma extensão sintática simples para invocar métodos [obj method:argument],. Em C, colchetes são usados ​​de uma maneira muito específica para subscrito de array e, portanto, esta é a sintaxe C inválida. As extensões baseadas em sintaxe inválida não alteram o significado de nada que seja válido na linguagem do host.

Tão fácil de ver que nenhum programa que usa extensões Objective C pode ser um programa ISO C estritamente em conformidade, não importa o quão simples seja. Além disso, todo programa ISO C pode ser declarado, por definição, um programa Objective C válido. Objective C pode facilmente seguir desenvolvimentos como C99 e C11.

Por outro lado, C ++ não é simplesmente extensões para C; é uma linguagem diferente que muda o significado de algumas das sintaxes de C. C ++ e C são mantidos separadamente e, portanto, seu relacionamento muda com o tempo. Por exemplo, C adquiriu novos recursos que estão completamente ausentes em C ++ e muito provavelmente não irão para C ++, como os arrays de comprimento variável C99. C ++ não pode pegar facilmente novos recursos C.

Se você escreve um programa C portátil, ele deve ser ao mesmo tempo um programa Objective C. Mas será necessário cuidado adicional para que também seja um programa C ++ com o mesmo significado. (Essa prática não é inédita e o dialeto que ela requer é informalmente conhecido como "C limpo").

Um exemplo trivial de um programa C que falha quando tratado como C ++ é qualquer programa C que usa uma palavra-chave C ++ como um identificador, como classou virtual. Objective C não introduz nenhuma palavra-chave reservada. Possui novas palavras-chave que são introduzidas pelo @personagem, como @interface.

Kaz
fonte