que - Aprende C primero antes de aprender Objective-C
tutorial xcode 9 español (23)
¡Diablos, ve directamente al objetivo C!
Pasé de ActionScript 3 a Objective C y ya tengo un interno en una empresa.
Haz lo que quieras.
Siendo un aspirante a desarrollador de Apple, quiero obtener las opiniones de la comunidad si es mejor aprender C primero antes de pasar a Objective-C y finalmente al Marco de Cocoa.
Mi instinto me dice que aprenda C, que me dará una buena base.
¿Quieres ser un desarrollador de núcleo duro? Entonces aprende c primero.
Los libros que necesita dominar completamente c son algunos de los mejores escritos en tecnología. Esto es lo que necesitas:
A medida que aprendes Objective-C y Cocoa, no puedes evitar aprender bits de C. Por ejemplo, los rectángulos son comunes representados por CGRect, una estructura C.
Si tiene tiempo, aprenda C. Como otros han dicho aquí, el libro de Kochan (segunda y primera ediciones) es excelente como libro para sumergirse.
Aprendí Objective-C directamente y funcionó bien durante aproximadamente un año, tuve algunas dificultades para leer el código C cuando descargué el proyecto para ver cómo funcionan, pero ahora realmente siento la necesidad de aprender C. Puedes intentar aprender ObjC sin C, pero tarde o temprano, necesitarás C.
Aprendería C primero. Aprendí C (e hice mucho en C) antes de pasar a Obj-C. Tengo muchos colegas que nunca fueron verdaderos programadores en C, comenzaron con Obj-C y aprendieron solo la cantidad de C necesaria.
De vez en cuando veo cómo resuelven un problema completamente en Obj-C, a veces dando como resultado soluciones muy torpes. Usualmente reemplazo algún código Obj-C con código C puro (después de todo puedes mezclarlos tanto como quieras, el contenido de un método Obj-C puede ser un código C completamente puro). Sin ninguna intención de insultar a ningún programador Obj-C, hay soluciones que son muy elegantes en Obj-C, estas son soluciones que simplemente funcionan (y se ven) mucho mejor gracias a los objetos (la programación OOP puede hacer que los programas complejos sean mucho más hermosos que programación funcional, polimorfismo, por ejemplo, es una característica brillante) ... y realmente me gusta Obj-C (mucho más que C ++! Odio la sintaxis de C ++ y algunas características del lenguaje son excesivas y conducen a malos patrones de desarrollo en mi humilde opinión); sin embargo, cuando a veces vuelvo a escribir el código Obj-C de mis colegas (y realmente solo lo hago, si creo que esto es absolutamente necesario), el código resultante es usualmente un 50% más pequeño, necesita solo el 25% de la memoria utilizada antes y es aproximadamente 400% más rápido en tiempo de ejecución.
Lo que estoy tratando de decir aquí: cada idioma tiene sus pros y sus contras. C tiene pros y contras y también lo tiene Obj-C. Sin embargo, la característica realmente buena de Obj-C (es por eso que me gusta más que Java) es que puedes saltar a la C a voluntad y viceversa. ¿Por qué esta es una gran característica? Debido a que al igual que Obj-C corrige muchos de los contras de C puro, C puro puede corregir algunos de los inconvenientes de Obj-C. Si los mezclas, recibirás un equipo muy poderoso.
Si solo aprendes Obj-C y no tienes idea de C o solo sabes lo básico y nunca has probado con qué elegancia puede resolver algunos problemas comunes, en realidad solo aprendiste la mitad de Obj-C. C es una parte fundamental de Obj-C. La capacidad de usar C en cualquier momento y en todas partes es una característica fundamental de la misma.
Un ejemplo típico fue algún código que usamos para codificar datos en base64, pero no pudimos usar una biblioteca externa para eso (no OpenSSL lib). Usamos un codificador base64, escrito completamente usando clases de Cocoa. Funcionaba bien, pero cuando codificamos 200 MB de datos binarios, tomó una eternidad y la sobrecarga de la memoria era inaceptable. Lo reemplacé con un pequeño codificador base64 ultracompacto escrito enteramente como una función C (copié el cuerpo de la función en el cuerpo del método, el método tomó NSData como entrada y devolvió NSString como salida, pero dentro de la función todo era C). El codificador C era mucho más compacto, batía el codificador de Cacao puro por el factor 8 en velocidad y la sobrecarga de memoria también era mucho menor. La codificación / descodificación de datos, el juego con bits y tareas similares de bajo nivel son solo los puntos fuertes de C.
Otro ejemplo fue algún código de UI que dibujó una gran cantidad de gráficos. Para almacenar los datos necesarios para pintar los gráficos, usamos NSArray. En realidad NSMutableArray, ya que el gráfico fue animado. Resultado: animación gráfica muy lenta. Reemplazamos todos los NSArray con matrices C normales, objetos con estructuras (después de que toda la información de coordenadas del gráfico no es nada que debe tener en objetos), acceso del enumerador con bucles simples y comenzó a mover datos entre las matrices con memcopy en lugar de tomar datos de una matriz el otro, índice para índice. El resultado: una aceleración por el factor 4. El gráfico se animó suavemente, incluso en sistemas PPC más antiguos.
La debilidad de C es que cada programa más complejo se pone feo a la larga. Mantener las aplicaciones C legibles, extensibles y manejables exige mucha disciplina de un programador. Muchos proyectos fracasan porque falta esta disciplina. Obj-C le facilita estructurar su aplicación usando clases, herencia, protocolos, etc. Dicho esto, no utilizaría la funcionalidad C pura a través de los bordes de un método a menos que sea necesario. Prefiero guardar todo el código en una aplicación Objective-C dentro del método de un objeto; todo lo demás derrota el propósito de una aplicación OO. Sin embargo, dentro del método a veces uso exclusivamente C puro.
Aprendería Objective-C y aprendería tanto como lo necesite a medida que avance.
Las áreas de C de las que no dependerá mucho:
- Aritmética del puntero y matrices. No he usado C arrays en absoluto.
- C cadenas. Las cadenas de Objective-C hacen el trabajo más agradable y seguro.
- Gestión de memoria manual si usa GC en Obj-C 2.1. Recomiendo esta ruta por razones de velocidad de desarrollo y rendimiento.
C te da muy poca abstracción del ensamblaje. Algunos compiladores C incluso le permiten ensamblar en línea. Esto puede ser muy útil para pensar cómo funciona la computadora, lo cual es importante saber.
Dicho eso, si realmente estás interesado en Object-C, no te dejes atascado escribiendo algo en C solo porque es "bueno para ti". No necesitas frustrarte mientras intentas aprender un nuevo conjunto de habilidades. Es importante que te diviertas con lo que estás haciendo.
Con bastante facilidad puede aprender C y Objective-C al mismo tiempo, no hay necesidad de aprender las minucias de C (incluida la aritmética de puntero, etc.) antes de comenzar con las adiciones de Objective-C al lenguaje, y como programador novato ponerse en marcha con Objective-C rápidamente puede ayudarlo a comenzar a "pensar en objetos" más rápidamente.
En términos de recursos disponibles, la documentación de Apple generalmente asume familiaridad con C, por lo que comenzar con el lenguaje de programación Objective-C 2.0 no será de mucho beneficio para usted. Invertiría en una copia de Programming in Objective-C de Stephen Kochan (dependiendo de qué tan rápido quieras comenzar, puedes considerar esperar la segunda edición):
Programación Objective-C Desarrolladores Biblioteca Programación Objective-C 2.0 Developers Library
No asume ninguna experiencia previa, y te enseña Objective-C y tanto C como necesites.
Si te sientes un poco ambicioso, puedes comenzar con el tutorial "Learn C" de Scott Stevenson , pero tiene algunos requisitos previos ("Ya debes saber al menos un guion o lenguaje de programación, incluyendo funciones, variables y bucles. También necesitará escribir comandos en el terminal Mac OS X. ").
(Solo para el registro y para el contexto: aprendí ambos al mismo tiempo en 1991 - no pareció perjudicarme. Sin embargo, tenía antecedentes en BASIC, Pascal, Logo y LISP. )
Creo que, en su mayor parte, aprender C es una buena idea, sin importar en qué arena te encuentres, al menos para familiarizarte con el funcionamiento interno del desarrollo de software antes de usar productos preempaquetados, de esa manera si algo sale mal tienes una mejor oportunidad de entender el funcionamiento interno. Hay mucha discusión sobre esto en SO, y es una pregunta bastante subjetiva, pero en general estarás usando C en tu código Objective-C, así que supongo que depende de ti. Soy un tipo de persona fundamental, pero a veces puede ser un obstáculo y conozco a varias personas inteligentes que se abrieron paso de arriba hacia abajo. Creo que la parte importante es que entienden el funcionamiento interno como lo harán. establezca sus capacidades aparte de las que no lo hacen, así como aumentar sus capacidades.
Debe tener un conocimiento básico de C antes de comenzar Objective_C, pero no es necesario dominar cada detalle de C.
He publicado mis notas después de leer "Programación en Objective-C" en caso de que ayude a alguien más.
Dependiendo de muchos idiomas que ya conoces, puede ser una mejor idea comenzar a aprender Objective-C. La base en la mayoría de los lenguajes es básicamente la misma, la sintaxis es diferente. Aprender C primero no va a hacer mucha diferencia cuando se trata de aprender Objective-C.
El objetivo C es lo suficientemente diferente de C como para no merecer primero aprender C.
Desde una perspectiva de sintaxis / familia-lenguaje, es mejor estudiar SmallTalk (en el cual se basa el objetivo C)
Desde una perspectiva práctica, centra tus esfuerzos en aprender un idioma a la vez.
Más tarde, si desea aprender otro idioma, C ++, Java y Python son 1) fáciles de aprender como un grupo 2) popular y por lo tanto comercializable 3) poderoso.
En mi humilde opinión, primero debería aprender al menos algo de C y especialmente sobre punteros. Eso es aún más importante si uno proviene de un idioma que no tiene punteros. Mucha gente pregunta sobre el código como
NSString *string = [[NSString alloc] init];
string = @"something";
ya que no conocen la distinción entre un puntero y el objeto al que apunta.
Por supuesto, uno no tiene que aprender todo C antes de comenzar con Objective-C, pero algunas cosas fundamentales son absolutamente necesarias.
Es una buena idea aprender C antes de aprender Objective-C, que es un superconjunto estricto de C. Esto significa que Objective-C puede admitir todo el código C normal, por lo que el código común a los programas C se verá obligado a aparecer incluso en Objective- Código C
Además de ver las cosas puramente desde el punto de vista del lenguaje, descubrirá que Mac OS X es un sistema operativo Unix completo. Todas las bibliotecas de nivel de sistema están escritas en C.
Probablemente sea posible aprender ambos al mismo tiempo, pero creo que apreciará y comprenderá más Objective-C si tiene un sólido conocimiento de C.
Hay muchas cosas que no puedes hacer solo en Objective-C, por lo que aprender algunas habilidades básicas de C será bastante crítico. Al menos necesitará comprender las declaraciones de variables y las funciones básicas de la biblioteca C, o se sentirá frustrado.
Honestamente, muchos lenguajes se basan en la sintaxis C con la que es bueno estar familiarizado. Me tomaría una semana o dos para familiarizarme con C independientemente.
Dicho esto, me acabo de enseñar el objetivo C, y debo ser sincero: no creo que mi experiencia en C sea tan útil como hubiera pensado. El objetivo C fue definitivamente revelador para mí.
Me sumergiría en el Objective C, si ya tienes algunos idiomas en tu haber, no es la sintaxis la curva de aprendizaje, es Cocoa.
Mejor, no sé, incluso menos porque no estoy familiarizado con Objective-C.
Pero las bases de C no son tan difíciles de aprender, no es un lenguaje muy complejo (en términos de sintaxis, ¡no en términos de masterización!), Así que adelante, no será tiempo perdido.
Personalmente, creo que siempre es una buena idea aprender C, da una buena idea de cómo funciona la computadora. Después de todo, la mayoría de los lenguajes y sistemas todavía se escriben en C. ¡Entonces continúe! :-)
PD .: Por "seguir adelante", no quise decir "dejarlo caer", solo "aprender más, aprender diferente". Una vez que conoces C, nunca lo dejes: Java usa JNI para llamar a las rutinas C para cosas de bajo nivel, Python, Lua, etc. a menudo se extienden con código C (la referencia Lua incluso asume algo de conocimiento C para algunas funciones que son una envoltura delgada para la función C detrás), y así sucesivamente.
Pensé mucho sobre este tema antes de escribir mi libro sobre Objective-C. Primero, realmente creo que aprender el lenguaje C antes de aprender Objective-C es el camino equivocado. C es un lenguaje de procedimientos que contiene muchas características que no son necesarias para programar en Objective-C, especialmente en el nivel de principiante. De hecho, recurrir a algunas de estas características va en contra de adherirse a una buena metodología de programación orientada a objetos. Tampoco es una buena idea enseñar todos los detalles de un lenguaje de procedimientos (y atacar la solución de un problema con funciones y técnicas de programación estructuradas) antes de aprender uno orientado a objetos. Esto puede iniciar al programador en la dirección incorrecta, lo que puede conducir al desarrollo de una orientación y una mentalidad erróneas para fomentar una buena disciplina de programación orientada a objetos. El hecho de que Objective-C sea una extensión del lenguaje C no significa que tenga que aprender C primero.
Creo que enseñar Objective-C y el lenguaje C subyacente como un único lenguaje integrado es el enfoque correcto. No hay ninguna razón para saber que una declaración "para" es del lenguaje C y no de su lenguaje Objective-C superconjunto. Además, ¿por qué aprender en detalle sobre cosas como matrices en C y cadenas (y manipularlas) antes de aprender sobre array (NSArray) y objetos de cadena (NSString), por ejemplo? Muchos textos en C dedican mucho tiempo a las estructuras, apuntan a las estructuras e iteran a través de arreglos con punteros. Pero puede comenzar a escribir programas Objective-C sin conocer ninguna de estas características del lenguaje C. Y para un programador novato, eso es un gran problema. No solo acorta la curva de aprendizaje, sino que también reduce la cantidad de material que se debe aprender (y parte del mismo se filtra selectivamente) para escribir programas Objective-C.
Estoy de acuerdo en que desearás aprender la mayoría, si no todas, de las características C subyacentes, pero muchas se pueden diferir hasta tener una comprensión sólida de la definición de clases y métodos, trabajar con objetos y expresiones de mensajes y comprender los conceptos de herencia y polimorfismo son bien entendidos.
Puede saltar directamente a Objective-C, con los siguientes beneficios:
- Aprenderás "alguna" C en el camino.
- Aprenderás las partes C que son relevantes para ti.
Al menos para mí es más fácil aprender un nuevo idioma cuando estoy interesado en alguna aplicación o muestra específica, y fallo cuando tengo que aprender otra cosa que no es exactamente lo que me interesa.
Siempre puede refinar su conocimiento de C más tarde si se interesa en la programación de nivel inferior.
Sí, aprender el lenguaje C antes que cualquier otro idioma avanzado te ayudará a aprender otros lenguajes.
Según Wikipedia , Objective-C es un súper conjunto estricto de C. Siendo este el caso, sugiero aprender C primero. Luego, cuando aprendas Objective-C, quedará claro qué partes se agregan como parte de Objective-C.
Si aprende algún otro idioma anteriormente, siempre tendrá confusión al escribir la sintaxis correcta. No sé el propósito, pero Object C usa una sintaxis extraña (no común) para llamar a métodos de objetos. Lo nombra como el envío de mensajes, sí, es cierto, consecuentemente puro concepto orientado a objetos, sin embargo la mayoría de los lenguajes orientados a objetos lo llaman como método de llamada y usan la sintaxis más tradicional de los métodos de llamada. La recolección de basura también es algo muy extraño, el Objeto C se basa en el recuento de referencias de la vieja escuela. Por lo tanto, tendrá dificultades para aceptarlo si cambia de otro idioma. Estoy escribiendo un libro Guía de migración rápida de Object C para programadores de C / C ++ con la esperanza de ayudar a las personas a superar todas las diferencias más rápidamente.