¿Objective-C es un desorden desactualizado de un lenguaje?

Mi opinión general sobre Objective-C es que no te da mucho, pero lo que te da es bastante bueno.

La mayoría de las características en Objective-C son extensiones bastante básicas. No hay tipos parametrizados, el modelo de herencia es único y los protocolos son siempre concretos. En general, esto es bastante bueno: las características que proporciona son ortogonales y ofrecen, a través del tiempo de ejecución, altos niveles de introspección y mutabilidad y ofrecen un grado relativamente alto de compostibilidad.

Con el tiempo, Objective-C ha ido adquiriendo más funciones. Esto es bueno y malo. Es bueno que tengamos cosas como propiedades y literales y ahora, son buenos para reducir la fricción y eliminar repeticiones. Sin embargo, estas nuevas características son menos ortogonales y pueden interactuar en casos extraños. Por ejemplo, hay ciertos casos en los que el tipo de ivar sintetizado puede especificarse de manera ambigua y luego el compilador parece elegir uno sin emitir una advertencia o un error. Más mundanamente, las reglas para la síntesis explícita frente a la sintetización automática de ivars han cambiado algunas veces.

La raíz de todo esto es que Objective-C no tiene una especificación, formal o de otro tipo. El lenguaje se define esencialmente por “¿Qué implementa Clang?” El front-end GCC no se ha mantenido por un tiempo ahora e incluso LLVM-GCC ya no es compatible. Con el tiempo, esto conducirá a más y más casos extraños en las esquinas.

Dicho esto, el lenguaje sigue siendo bastante bueno y es sobre todo agradable para trabajar y parece tener un futuro brillante. Mi predicción es que en 5 años, Objective-C probablemente será mucho más agradable para trabajar, pero también tendrá muchos más casos de esquina para conocer.

Esta es una pregunta interesante y difícil de responder sin reservas: sin importar cuál sea su opinión personal sobre el idioma, fue claramente lo suficientemente bueno como para enviar Mac OS X y su software en gran parte, así como el iPhone, iPad y Gran parte del contenido de la App Store.

El aumento meteórico en popularidad que ha disfrutado ha traído consigo muchas voces con experiencia con otras tecnologías e idiomas. Esto ha permitido una maravillosa polinización cruzada en la comunidad de desarrollo, pero también ha resaltado algunos de los defectos del lenguaje.

¿Objective-C está desactualizado?

Objective-C es en esencia un hijo de los años 80 (algo así como yo). Para su época, el mensaje inspirado en Smalltalk que pasaba y se unía tarde, por no mencionar el dinamismo salvaje y lanudo posible con el uso inteligente del tiempo de ejecución, era, si no novedoso, un contrapunto fascinante a lo que de otro modo sería conveniente en un lenguaje estático como C (y mucho menos su “hermano” C ++ con su enfoque en la unión temprana y genéricos en tiempo de compilación).

Avancemos rápidamente hasta 2000 y el lanzamiento de Mac OS X, basado en el desarrollo de NeXT en la década de 1990, y Objective-C de repente tiene una audiencia incipiente de entusiastas que siguieron a NeXT con interés o que estaban entusiasmados con este próximo capítulo en la vida de Mac. Para estos, el contraste con C ++ a veces puede parecer liberador: Objective-C puede parecer un poco extraño con sus corchetes y @s esparcidos, pero olía bien y te trajo cacao, y te mostró cómo usar su tiempo de ejecución para terribles , terribles propósitos.

En 2013, sin embargo, la imagen es un poco diferente. Haskell nos ha mostrado mucho sobre lo que puede saber sobre un programa sin ejecutarlo. El óxido también. Erlang conoce mejor el paralelismo, C # parece estar desarrollando nuevas ideas todo el tiempo e incluso C ++ tiene inferencias de tipos. Mientras tanto, Objective-C ha agregado azúcar para enumerar, construir y colocar un recolector de basura, y aprovechó su compilador para obtener ARC, y ganó bloques (cierres) … pero con advertencias: todos los demás hacen una mejor iteración, C frustra a cualquier recolector de basura debido a su sistema de tipo débil y rango libre, actitudes de memoria de todo vale, y ARC, aunque ciertamente es una herramienta excelente, aún admite ciclos de retención frustrantes, ¡especialmente con bloques!

El sistema de tipos no es lo suficientemente expresivo como para describir inequívocamente situaciones comunes como colecciones genéricas pero bien escritas. Los bloques son difíciles de usar de manera segura debido a la oportunidad de retener los ciclos, y los detalles de su vida útil cuando se crean en la pila pueden dificultar saber en qué tipo de costos incurrirán. El recuento de referencias no puede compactar objetos en la memoria, por lo que la localidad de referencia debe ser cuidadosamente organizada por el programador. Y el dinamismo tiene un precio: puede ser difícil detectar ciertos errores en tiempo de compilación cuando pasan a través de un contenedor genérico, y la falta de información de tipo específico significa que los métodos no se pueden alinear, y en su lugar siempre deben pasar. objc_msgEnviar.

¿Objective-C está desactualizado? Sí.

¿Objective-C es un desastre?

Como se diseñó originalmente, Objective-C era un conjunto estrecho de construcciones de tiempo de ejecución sentado detrás de un preprocesador que convirtió los corchetes en objc_msgEnviar llamadas y @s en estructuras y así sucesivamente.

Hoy, el tiempo de ejecución abarca características como propiedades, conteo de referencias, sincronización, manejo de excepciones, punteros etiquetados y objetos asociados.

En general, se han agregado cuidadosamente, teniendo cuidado de exponer el poder del sistema detrás de una interfaz relativamente limpia. Pero el hecho es que las cadenas “” “y otros literales, por no mencionar ARC, para (in), y probablemente más entremezclan los detalles del lenguaje con lo que tradicionalmente se consideraban detalles de los marcos.

Si bien esta es una práctica bastante estándar en todo tipo de idiomas, como Ruby, donde el lenguaje y los marcos son casi indistinguibles, es un cambio de un Objective-C más modular y claramente separado que solía existir.

Y luego tienes C. Punteros indomables, mecanografía débil y sintaxis fea y desagradable (algunos de los cuales han infectado Objective-C, como con la sintaxis de bloque).

¿Objective-C es un desastre? Bueno, C es, entonces sí. ¿Está solo? Más de lo que solía ser, al menos.

Pero eso está bien?

A pesar de ser obsoleto y probablemente un desastre, Objective-C tiene éxito no porque los desarrolladores no tengan alternativas, sino porque ocupa un nicho ecológico importante y fuertemente defendido. La interoperabilidad con casi cualquier cosa a través de C y C ++, y el grupo irracionalmente inteligente de personas responsables de cosas como ARC, sin mencionar los esfuerzos de Apple y los desarrolladores de marcos de terceros que se basan en esta base, es lo que ha hecho que este lenguaje humilde y peculiar no solo sobrevivir, pero prosperar.

Está bien ser un desastre anticuado si tienes el nicho ecológico, la suerte y, lo más importante, el trabajo duro y la inteligencia que necesitas para pasar gradualmente de un desastre obsoleto a un desastre moderno a un lenguaje moderno y limpio. Objective-C ha recorrido un largo camino, y dudo que lo veamos desaparecer pronto. El Objetivo-C de 2018, si hay uno, probablemente será un lenguaje radicalmente diferente.

Un buen efecto secundario del éxito de iOS es que el lenguaje Objective-C evolucionó bastante en los últimos años. Incluso es como si Apple estuviera mirando a algunos de los críticos (es muuuy detallado) y se dirige a algunos de ellos de manera regular. Por ejemplo, propiedades, literales, incorporación de bloques (aunque no es una cosa de Objective-C per se), ARC. Cuando comparo el código Objective-C que escribí hace 5 años y ahora, definitivamente hay una mejora y las palabras “desorden desactualizado” no parecen adecuadas (aunque las construcciones de cadenas aún podrían mejorarse)

Personalmente disfruto mucho el objetivo-C. . . A pesar de estar muy cerca del metal desnudo, y relativamente viejo, tiene la sensación de un lenguaje OO muy moderno.

Algunas características interesantes:

  • El tiempo de ejecución rico y el envío de métodos basados ​​en mensajes hacen que la implementación de cosas como el patrón de intercepción, proxies, etc. sea muy fácil.
  • El soporte para bloques (también conocidos como lamdas, funciones anónimas) es una programación invaluable o asíncrona o de múltiples núcleos.
  • “Interfaces” (protocolos) con métodos opcionales, también útiles para el código UI -> patrón de escucha, etc.
  • Presenta al pragramer conceptos poderosos como punteros, sin enredarse demasiado con ellos.

Su disertación

Además de las características muy similares que encontrarás en Java, C #, Python y otras lenguas modernas de OO.

ARC: la versión ARC del modelo de memoria de recuento de referencia es casi tan simple de entender como la recolección de basura, pero ofrece ventajas de rendimiento con respecto al uso de la CPU y la duración de la batería, que es una preocupación importante en la informática moderna, con la proliferación de dispositivos móviles dispositivos. . . (no es tan simple y ‘caja negra’ como la recolección de basura, por lo que todavía es necesario comprender el modelo de gestión de memoria, referencias fuertes frente a referencias débiles, moldes de puentes, etc., pero por otro lado, ofrece algunos ventajas poderosas).

Dentro del entorno de Objective-C: (suponiendo que lo esté usando con cosas relacionadas con Apple)

El cacao y el CocoaTouch tienen sus defectos, pero al enfrentarse a ellos con la competencia, ciertamente todavía tienen sus propios defectos.

GCD: (no es realmente obj-c per-se, pero Obj-C lo facilita) Grand Central Dispatch es una manera fantástica de trabajar con programación asincrónica, programación basada en tareas y UI, así como obtener un buen uso general de la CPU en múltiples -dispositivos de núcleo. Todo sin tener que pensar mucho en enhebrar.

Resumen: Entonces, en resumen, diría que es un lenguaje moderno y de programación de propósito general, y especialmente brilla para el desarrollo de UI, dispositivos móviles y recursos limitados. . . Puede ser una buena opción para el rendimiento, pero sin la complejidad y la curva de aprendizaje de C ++.

Mayor inconveniente: dedos doloridos y rosados

Una de las grandes fortalezas del objetivo C es que produce un código descriptivo y de fácil lectura . Esto, además de ser bastante divertido de usar, puede conducir a una gran cantidad de tipeo, lo que eventualmente conducirá a dedos meñiques doloridos y doloridos (si eres un mecanógrafo táctil y no un picoteador). . .

Sospecho que en los próximos años veremos un producto que aborda específicamente este problema. . . Puede ser un nuevo tipo de medicamento milagroso que cura el RSI de dedo meñique o algo más holístico como una secuencia de movimientos de pilates diseñados para las manos. . . demasiado pronto aún para contarlo. . . ( mientras tanto, encuentro que la canción de cuna de los niños ‘Insy Winsy Spider ‘ (con acciones) proporciona un muy buen entrenamiento manual. Solo asegúrate de comenzar despacio y aumentar la velocidad y las repeticiones lentamente).

Por el contrario, diría que es Cocoa lo que es un desastre complicado, y que el lenguaje Objective-C es muy simple y está bien diseñado. Casi todas las quejas que ves sobre “Objective-C” son en realidad sobre Cocoa, y casi nunca ves un problema con Objective-C.

El lenguaje Objective-C en sí mismo es una extensión extremadamente minimalista para C. Solo existe la sintaxis para definir clases y métodos, la sintaxis para el envío de mensajes y algunas otras adiciones sintácticas menores, y eso es todo. Nada como las enormes y extremadamente complicadas definiciones de lenguajes como C ++ o Java.

Creo que cualquiera que use Objective-C por primera vez lo encuentra horriblemente feo y un “desastre de lenguaje”. Pero a menudo esa es solo la sintaxis. Trabaje con Objective-C durante un mes y definitivamente crecerá en usted. Ahora, no encuentro Objective-C diferente de ningún otro lenguaje.

¿Un desastre? Algo así, sí. Pasamos por Retain / Release, GC y ahora ARC, lo que significa que las bases de código pueden ser un desastre de diferentes técnicas de administración de memoria. Tal vez algún código de terceros es retener / liberar, pero su aplicación principal es ARC, por lo que sí, puede terminar con una situación bastante compleja.

¿Lío? Si puede ser.

¿Anticuado? En realidad no, es viejo, sin duda, pero no lo veo como obsoleto, en el sentido de que todavía es mucho más útil, mejor diseñado que los idiomas más nuevos. es decir, JS vs Obj-C, dar be Obj-C cualquier día.

¿Anticuado? Yo no diría eso.

¿Necesitas en lugar de desear? No estoy seguro, creo que Swift es un lenguaje mejor que Obj-C, pero en realidad prefiero Obj-C a veces, no digo que Obj-C sea mejor, no lo es, pero a veces me resulta más placentero escribir, difícil de escribir. di porqué.

Obj-C es un lenguaje muy, muy agradable, es muy flexible, y generalmente se mantiene alejado, y tiene razón, Cocoa es un marco excepcional que, en mi humilde opinión, no tiene igual.

El objetivo C no es un desastre en absoluto. Es muy simple, elegante y poderoso.
Es solo una capa sintáctica delgada sobre C (o C ++) más una biblioteca central muy inteligente y logra que sea el lenguaje más OO (y posiblemente el único que merece el título) desarrollado después de Smalltalk y CLOS.

Podría decirse que los únicos idiomas que realmente son OO son Smalltalk y CLOS. CLOS agregó un sistema de objetos a Lisp que es más avanzado que el de Smalltalk, pero realmente brilla solo si tiene una implementación completa del MOP (que no es requerido por el estándar) y generalmente no viene con todo características avanzadas de un sistema Smalltalk.

La siguiente mejor opción es el Objetivo C, que se acerca mucho a ser realmente OO. De hecho, se acerca lo más posible a cualquier lenguaje que quiera mantener la compatibilidad sintáctica con C. La característica principal de OO que le falta es “todo es un objeto”, lo que no puede hacer si quiere admitir tipos C.

Mucho más allá de eso, hay lenguajes como Python (y en cierto sentido JavaScript) que intentan mantener la característica “todo es un objeto”, pero no logran separar completamente los mensajes de los métodos e implementar enlaces de método de mensaje dinámicamente cambiables, objeto- relaciones de clase, continuaciones y algunas otras cosas. Tampoco (como CLOS y, en cierta medida, el Objetivo C) no vienen con un entorno gráfico integrado dinámicamente modificable como Smalltalk.

Existen los lenguajes OO falsos, como C ++ y Java, que no tomaron nada de OO excepto el nombre (y aplicaron ese nombre a cosas como clases, objetos, herencia, subtipos, etc. que provienen de Simula y se conocían antes de que se acuñara el término OO )

No, es fantástico. Fácilmente el mejor idioma que he usado. Algunas personas no lo entienden, pero les deseo buena suerte.

Está desactualizado, ya que se actualiza continuamente y es el lenguaje utilizado para crear aplicaciones en dos de los ecosistemas de software más populares de la actualidad, diría que no.

More Interesting

¿Para qué se utiliza el programa Interface Builder en iOS?

¿Titanium es bueno para desarrollar aplicaciones para iPhone?

¿Cuáles son las mejores prácticas para sincronizar datos entre una aplicación iOS y una aplicación web?

¿Cuáles son las posibilidades de crear una aplicación exitosa para iOS y Android?

¿Qué opinas de iOS 11?

¿Cómo pasó del desarrollo de outsourcing a un desarrollador único a un equipo de desarrollo o empresa?

¿Está Apple satisfecho internamente con el lanzamiento del ticket WWDC 2012?

¿Hay alguna forma de descargar e instalar las versiones anteriores de aplicaciones de iOS en un iPad anterior que solo sea compatible con iOS 5.1.1? Alternativamente, ¿hay alguna manera de forzar la actualización de esta cosa a una versión más nueva de iOS?

Desarrollo de iOs: ¿cómo algunas aplicaciones cargan datos al instante, sin ninguna "carga"?

¿Qué pasarela de pago usarías para aplicaciones móviles y web?

¿Qué funciones realiza el lado del servidor en las aplicaciones de redes sociales?

¿La plataforma Windows Phone finalmente morirá y permitirá que los desarrolladores se centren en las plataformas Android e iOS más eficientes?

¿Cuáles son los mejores centros de capacitación para desarrolladores de iOS en Mumbai que tienen lotes los fines de semana?

¿Dónde puedo leer más sobre la arquitectura de la interfaz de usuario y cómo se representan las GUI en la pantalla?

¿Cómo se comunica el servidor de juegos móvil Netty con el cliente de juegos iOS?