¿Cuáles son las diferencias entre C # y Objective-C y cuál vale más la pena aprender?

Una diferencia es el entorno de tiempo de ejecución. El código Objective-C se compila en código máquina nativo. El código C # se compila en el bytecode CLR, que es JITED por la máquina virtual CLR.

Una segunda diferencia obvia es su herencia. Objective-C se creó como un superconjunto estricto de C (cada programa C también es un programa Objective-C), agregando elementos OO de Smalltalk (lenguaje de programación) en la parte superior. C # es más como un Java mejorado. Java, por supuesto, tomó mucho de la sintaxis de C y C ++, pero no tanto (al menos sintácticamente) de Smalltalk.

Hay mucho más, pero esas son dos diferencias para ti.

En cuanto a cuál vale la pena aprender, eso depende completamente de lo que intentes hacer. Personalmente, la única razón por la que aprendería Objective-C es si quisiera hacer el desarrollo de iOS o Mac. C # es sobre todo interesante si desea desarrollar para la plataforma Microsoft (aunque también existe la implementación Mono de código abierto de la pila .NET.

Las diferencias clave entre C # y Objective-C son que C # se usa para desarrollar software para Windows (web, escritorio, móvil) mientras que Objective-C se usa para desarrollar software para Mac OS X e iOS. Al igual que Java, C # se compila en bytecode llamado CIL (Common Intermediate Language). El CIL es compilado a código nativo por el CLR (Common Language Runtime). Objective-C se compila directamente en el código de máquina nativo para el procesador en el que se ejecutará.
Algunas diferencias notables entre estos idiomas son:

  1. En Objective-C, envía mensajes a los objetos, mientras que en C # llama métodos a los objetos.
  2. C # siempre tiene un recolector de basura, Objective-C en iOS no.
  3. C # es un estándar ECMA, Objective-C se basa en el estándar OpenStep, aunque no cumple con él.
  4. Si bien ambos están orientados a objetos, Objective-C le permite hacer programación de estilo C sin objetos. En C #, todo debe ser una clase o existir como parte de una clase.

También hay muchas más diferencias y muchas similitudes, pero ambas abordan necesidades muy diferentes. Si está apuntando a plataformas Microsoft Windows (web, de escritorio o móvil), vale la pena aprender C #. Si está escribiendo aplicaciones para Mac OS X e iOS, Objective-C es lo que necesita.

El objetivo C es C estricto (o C ++ con archivos .mm), compilado directamente al lenguaje de máquina junto con un sistema de objetos dinámicos. El sistema de objetos dinámicos está integrado en la sintaxis, pero se expresa esencialmente como código adicional. Sería posible hacer casi todo en el Objetivo C sin la sintaxis tipo Smalltalk por medio de interfaces funcionales a una biblioteca de objetos dinámicos.

Por el contrario, C # se compila en el sistema de tiempo de ejecución .NET, que también maneja todos los objetos dinámicos. El tiempo de ejecución de .NET parece específicamente diseñado para C # (he inhalado la especificación) y contiene cosas como niveles de accesibilidad, que generalmente no se manejan a un nivel tan bajo (cf Java).

La sintaxis del objeto C # se basa en una base bastante obvia de estructuras C (similar pero diferente de C ++). La sintaxis del objetivo C se basa en Smalltalk. Lo que es preferible es cuestión de gustos.

C # es útil si quieres hacer Microsoft. El objetivo C es útil si quieres hacer Mac o iOS. iOS último es bastante caliente en este momento.

El objetivo C, al ser C, puede interactuar fácilmente con las bibliotecas C o C ++, que están por todas partes. C # requiere código inseguro y tipos de conversión con potencial para muchos errores invisibles.

C # es bastante inteligente en que las clases particulares funcionan con la sintaxis, como para los iteradores. El objetivo C es mucho más que un lenguaje antiguo con enlaces clásicos.

C # tiene una enorme biblioteca de clases, que es bastante descuidada. El objetivo C tiene una biblioteca de clases pequeña pero muy bien diseñada y potente.

C # tiene sobrecarga del operador. En el objetivo C, todos los mensajes son explícitos.

Bits difíciles:

C # y Objective C, junto con sus bibliotecas, fomentan diferentes tipos de programación. Yo llamo a estos programas “orientados a clases” y “orientados a objetos”. La taxonomía es mía, ya que no estoy seguro de que nadie más lo note (si alguien tiene una mejor, soy todo oídos).

La programación orientada a clases es lo que verá en los textos orientados a objetos, especialmente los de empresa. En esta programación, las clases representan solo una mejora incremental sobre los módulos. Usted programa en esto, típicamente, escribiendo clases, que tienden a ser grandes con muchas funciones / métodos miembros. Las clases “saben” mucho sobre sí mismas. Relativamente pocos (como StringBuilder) conocen otras clases. La “inteligencia” se encuentra principalmente en el código estándar para un propósito particular escrito por un programador que comprende la clase. La herencia tiende a ser poco profunda.

En la programación orientada a objetos, la “inteligencia” es más en interacciones entre objetos. Una clase es típicamente pequeña y “sabe” sobre varias o muchas otras clases. La herencia tiende a ser profunda. Patrones como el visitante están de acuerdo con esta filosofía. Irónicamente, a pesar de que generalmente hay más objetos más pequeños, es necesario usar menos objetos en un código.

Un simple ejemplo:

En la implementación basada en clases de una cuenta bancaria, una clase de cuenta bancaria puede tener un método de Retiro, que devuelve un número de punto flotante. (Lo he visto en muchos textos, así que no lo estoy inventando). Depende del programador asegurarse de que el dinero no se pierda en el sistema y no hacer cosas como multiplicar cantidades de dos dólares.

En la programación orientada a objetos, los objetos de dinero representarán cantidades en dólares o libras o lo que sea. Una cuenta bancaria se retirará dividiendo el dinero en la cuenta en dos objetos de dinero, uno de los cuales devolverá. Esto se hará utilizando objetos auxiliares de fábrica / administrador que asegurarán que el dinero no desaparezca o se cree de la nada. Un objeto Money “sabe” cuánto, qué moneda (dólares o libras o lo que sea), ya sea real o proyectada, etc.

La programación orientada a objetos no se enseña muy a menudo, y la programación orientada a clases se enseña como programación orientada a objetos. La diferencia puede parecer sutil al principio. Sin embargo, en mi experiencia, OO escala mejor y es mucho más seguro, aunque es computacionalmente más costoso. (Por lo general, se puede hacer mucho OO de forma gratuita en C ++). Es interesante notar que los 125 millones de Mars Climate Orbiter se perdieron debido a una falla en la conversión entre mediciones métricas y avoirdupois. Hubo muchas recriminaciones machistas, juegos sociales que muchas personas parecen disfrutar y que en mi opinión causan mucho software malo. Esto podría haberse obviado fácilmente con una programación OO adecuada.

Aunque es posible hacerlo en cualquier lenguaje, C # (así como C ++ y Java) tiende a fomentar la programación orientada a la clase, y Objective C (así como Smalltalk) tiende a fomentar la programación orientada a objetos. Estrictamente hablando, esto no se debe al idioma en sí, sino a la cultura del idioma, que las personas absorben del idioma y de las bibliotecas cuando trabajan con ellos.