Necesitaban un lenguaje con las siguientes características:
1) Tiene que ser un lenguaje compilado , no un lenguaje interpretado o un lenguaje que dependa de un motor de ejecución de código de tiempo de ejecución.
Esto descartó MUCHOS idiomas. Ruby, Python, Java, Javascript, etc., se interpretan o se basan en pcode.
- ¿Debería reducir mis pérdidas o usar todo en mi aplicación iOS?
- ¿Cómo restauro las compras en la aplicación usando Game Center o iCloud?
- ¿Swift reemplazará a Objective-C?
- ¿Cuál es la mejor manera de aprender cómo hacer una aplicación iOS similar a una red social?
- ¿Cuáles son las herramientas de prueba para probar aplicaciones iOS?
2) Querían un lenguaje funcional , o al menos un lenguaje que nativamente guiñe a la programación funcional.
Esta es una de las principales razones para alejarse del Objetivo C. En los últimos años, Apple desarrolló el Objetivo C hacia un mejor soporte de la programación funcional. De hecho, otros lenguajes están haciendo lo mismo (C, C ++, Java, Python, etc., todos están agregando un mejor soporte para cierres y funciones anónimas, por ejemplo). Pero eso es solo parte de la historia. Querían mucho más que eso.
3) Querían un lenguaje con una sintaxis ligera y fácil de aprender y usar que se adapte tanto a la codificación imperativa como a la funcional y que apoye directamente conceptos orientados a objetos como el subtipo nominal.
Esto descarta la mayoría de los lenguajes funcionales existentes. Los lenguajes similares a Lisp no tienen una sintaxis ligera y agradable para programadores con amplia experiencia en lenguajes imperativos u orientados a objetos. Los idiomas basados en un sistema de tipo Hindley-Milner pueden o no tener una sintaxis excelente (se puede decir que Haskell tiene la sintaxis más elegante de todos los idiomas) pero no admiten el subtipo nominal.
4) Tenía que estar fuertemente tipado estáticamente para soportar la optimización y la captura de errores. Sin embargo, tiene soluciones que le permiten interactuar con el Objective C de tipo dinámico.
Hay dos filosofías. Los defensores fuertes de la escritura subrayan las ventajas de descartar por completo una o más clases de errores y el potencial de optimización por parte del compilador. Los defensores de la tipificación de patos enfatizan el potencial para un desarrollo más rápido y una mayor simplicidad. (sí, lo sé, es mucho más complejo que esto, pero este es un gran debate y este no es el lugar adecuado para discutirlo).
El objetivo C es de hecho dinámico y sin tipo PERO con un compilador de verificación de tipo que te ayuda a atrapar la mayoría de los problemas. Puede callarlo fácilmente, pero en general no es necesario.
Con esta interacción, la posición de Apple ahora es clara: la dinámica es agradable, pero un tipeo fuerte, menos potencial de errores y más potencial de optimizaciones es mucho mejor.
Lo que desea es escribir con firmeza, excepto en muy pocos casos especiales, e incluso en aquellos en los que probablemente debería encontrar una mejor manera y / o agregar verificaciones de tipo explícitas.
5) Tenía que ser fácilmente redefinible por Apple .
No podría ser un lenguaje definido por un comité con un lento proceso de decisión. O bien es un lenguaje que Apple controla completamente o es un lenguaje de código abierto en su definición (no en su implementación, eso es irrelevante, es la definición del lenguaje que necesitan para “parchear”).
Necesitan esto porque necesitan poder desarrollar el idioma de la misma manera que lo hicieron en los últimos años. Necesitan poder cambiar el idioma en sí.
Esto es algo que otras compañías también quieren. Fue una de las razones detrás de C # para Microsoft, por ejemplo. La diferencia es que Microsoft cree en la “compatibilidad con versiones anteriores”, es decir, las cosas nuevas deben ser totalmente compatibles con lo que ya existe. Apple, por el contrario, cree en la evolución: cosas nuevas pueden desaprobar el pasado y romperlo / matarlo. Cualquier cosa existente puede necesitar ser adaptada a lo nuevo si quiere sobrevivir.
6) Tiene que ser dinámico y, lo que es más importante, admitir de forma nativa los paradigmas e interfaces del objetivo C.
El objetivo C es extremadamente dinámico. Está orientado a objetos, pero es posible crear nuevas clases en tiempo de ejecución. Es posible agregar nuevos métodos (y en los últimos tiempos también nuevos miembros de datos) a las clases existentes, incluso si no tiene acceso al código fuente de la clase. De hecho, incluso sin modificar el código binario (compilado) existente que define la clase o que lo utiliza. Incluso se puede hacer en tiempo de ejecución. Y, por supuesto, puede introspectar el código y aprender qué clases hay y qué métodos tienen. En tiempo de ejecución y sin tener acceso al código fuente.
Este tipo de extensión dinámica también es posible en algunos otros lenguajes (especialmente Ruby, pero también Python en una extensión limitada). De hecho, Ruby On Rails se basa en gran medida en este tipo de paradigma. Pero no se ve por ningún lado en los lenguajes orientados a objetos que se compilan en código nativo, excepto Objective C.
Ha habido proyectos para integrar otros lenguajes con el Objetivo C. En particular, Python y Ruby. Apple más o menos bendijo ambos intentos en cierto punto. También intentaron brevemente integrar Java, por un período muy corto (pero se dieron por vencidos bastante rápido). Pero estos idiomas no satisfacen los otros requisitos.
No había lenguaje que se ajustara completamente a la ley .
Su única opción era hacer una nueva .
Ruby es el lenguaje existente más cercano al Objetivo C. Tiene muchas facilidades funcionales, y se podrían agregar más. Casi se ajusta a la factura. Pero no es un lenguaje compilado y no está fuertemente tipado. De hecho, es el lenguaje campeón de la escritura dinámica (pato). Ningún compilador y difícil de optimizar por falta de información de tipo estático no es lo que Apple necesita para un lenguaje de nivel de sistema.
Haskell es interesante. Podría decirse que es el idioma más cercano a ser de código abierto en su definición (excepto que no lo es, simplemente sucede que ningún compilador ampliamente utilizado implementa el lenguaje tal como está definido. La mayoría del código está dirigido a un lenguaje extendido. Es este lenguaje extendido el que es de código abierto por definición, porque está definido por implementaciones, y esas son de código abierto). Haskell tiene muchas cosas interesantes, incluida una gran sintaxis, pero carece de algunas áreas importantes (para Apple): subtipo nominal, dinamismo (en el sentido de poder evitar el sistema de tipos).
Swift es su respuesta.
Swift aún no está completamente definido. Espere que cambie en muchos detalles en los próximos meses. También espere que cambie aún más en los próximos años. Hay muchas cosas que faltan, en Swift. Especialmente en términos de soporte para cosas que realmente no fueron compatibles con el Objetivo C en absoluto. Por ejemplo, soporte adecuado para la recursividad y para las continuaciones. Espero que cosas como la optimización garantizada de llamadas de cola y quizás tipos recursivos estén a la vuelta de la esquina. Personalmente, me encantaría un mejor soporte para la evaluación diferida (opcional) (solo hay una semilla, pero debes hacer muchas cosas manualmente).
Swift es un lenguaje interesante y moderno. Es imprescindible pero con muchos ganchos para la programación funcional y una preferencia codificada para el pensamiento funcional. No es realmente funcional (carece demasiado de recursividad, por ejemplo). Pero no es solo imperativo. Y tampoco solo orientado a objetos.
Estoy tentado a llamarlo un lenguaje aplicativo.