2008-10-07 13 views
105

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?Aprende C primero antes de aprender Objective-C

Mi intuición dice learn C, que me dará una buena base.

Respuesta

159

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 objetos (la programación OOP puede hacer que los programas complejos sean mucho más encantadora que la 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 obvias 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 conoces los conceptos básicos 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. Los datos de codificación/decodificación, jugando con bits y tareas de bajo nivel similares 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 animó sin problemas, incluso en sistemas PPC 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.

+0

y si ya conozco C++ y quiero aprender Objective-C para iPhone/iTouch deveopment, ¿es necesario aprender C? – chester89

+11

@ chester89: si ya conoce C++, sabe lo suficiente sobre C para comenzar con Objective-C. – Sven

+0

Sven tiene razón, C++ es tan complejo y ya usa mucha C pura, si conoces C++ realmente bien, también deberías conocer C lo suficientemente bien. – Mecki

3

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 apúrate, no se perderá tiempo.
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 "soltarlo", 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.

1

Dependiendo de muchos idiomas que ya conozca, 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.

+0

Pero solo si uno conoce al menos otro lenguaje de programación. – Sven

+0

Además del comentario de @ Sven: "... que tiene algún concepto de punteros" –

10

Creo que, en su mayor parte, aprender C es una buena idea sin importar en qué arena se encuentre, al menos para familiarizarse con el desarrollo del software antes de usar productos preenvasados, de esa manera si algo sale mal, tienes más posibilidades de comprender 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.

+0

aprender C primero también puede distorsionar su visión de la programación OO si aún no está conectado a tierra. Mezclar la codificación estructurada y de procedimiento no es buena. Pero también es cierto que OO pierde su valor en muchos lugares donde C brilla, como escribir código de nivel inferior. –

+1

Mi razón para sugerir que cada desarrollador aprenda C en algún momento se basa al menos en la idea de que incluso los lenguajes OO se compilan siguiendo las mismas instrucciones exactas que C al final.Las variables para objetos usan punteros, Garbage Collectors usan malloc y free, los archivos se bloquean usando los controladores OS; cuando algo sale mal en una aplicación Java o C# sabiendo que estos fundamentos pueden mejorar enormemente tu comprensión de lo que salió mal. Comprender la asignación de recursos que se realizará también tiende a llevar a escribir un código más informado que funcionará de manera más óptima para un contexto específico. – TheXenocide

4

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.

3

Honestamente, muchos idiomas 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 tengo que ser honesto: no encontré que mi experiencia en C fuera tan útil como hubiera pensado. El objetivo C fue definitivamente revelador para mí.

2

De acuerdo con Wikipedia, Objective-C es un estricto superconjunto 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.

15

Me sumergiría directamente con Objective C - si ya tienes algunos idiomas en tu haber, no es la sintaxis la curva de aprendizaje, es Cocoa.

+1

Ahora bien, hay mucho más material disponible para aprender C. Encontré que era la parte más difícil de ObjC, la falta de material que estaba bien organizado, claro, tenía suficiente profundidad para comparar con el material C o C++ y realmente te ayuda a entender estaba pasando dentro de ella. – Spanky

2

C le da muy poca abstracción desde el 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 esto, si está realmente interesado en Object-C, no se deje atrapar escribiendo algo en C simplemente porque es "bueno para usted". No necesitas frustrarte mientras intentas aprender un nuevo conjunto de habilidades. Es importante que te diviertas con lo que estás haciendo.

5

Aprendería Objective-C y aprendería todo lo que necesita sobre la marcha.

Las áreas de C que no dependerá tanto:

  • aritmética de punteros y arrays. No he usado C arrays en absoluto.
  • C strings. Las cadenas de Objective-C hacen el trabajo más agradable y seguro.
  • Gestión manual de memoria si utiliza GC en Obj-C 2.1. Recomiendo esta ruta por razones de velocidad de desarrollo y rendimiento.
+6

Una advertencia: la recolección de elementos no utilizados en Objective-C no está disponible en todas las plataformas (especialmente en el iPhone), que es algo a tener en cuenta. –

7

Es una buena idea para aprender C antes de aprender Objective-C, que es un superconjunto estricto de C. Esto significa que Objective-C puede soportar todo el código normal de C, por lo que el código común a los programas de C está obligado a aparecer incluso en el código Objective-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 ambas al mismo tiempo, pero creo que apreciará y comprenderá más Objective-C si tiene un sólido conocimiento de C.

3

Puede saltar directamente en Objective-C, con los siguientes beneficios:

  1. que va a aprender "algo" de C en el camino.
  2. Aprenderá las partes C que son relevantes para usted.

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.

25

Puede aprender fácilmente 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 que se pone 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 The Objective-C 2.0 Programming Language no será de mucho beneficio para usted. Me gustaría invertir en una copia de la programación en Objective-C por Stephen Kochan (dependiendo de la rapidez con que quiere ponerse en marcha, puede considerar la espera de la segunda edición):

Programming Objective-C Developers Library Programming Objective-C 2.0 Developers Library

no asume experiencia previa, y te enseña Objective-C y tanto C como necesites.

Si se siente un poco ambicioso, puede comenzar con Scott Stevenson's "Learn C" Tutorial, pero tiene algunos requisitos previos ("Ya debe saber al menos un script o lenguaje de programación, incluyendo funciones, variables y bucles. necesidad de 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ó hacerme ningún daño. Lo hice, sin embargo, tengo un fondo en BASIC, Pascal , Logo y LISP.)

+2

absolutamente no deberías encontrarlo necesario para aprender C primero. Especialmente si ya conoce un idioma como C# de Java. C# y Java le deben mucho al objetivo C. Aunque C# debe mucho más a la experiencia y los errores de Helsbergs con Delphi. –

2

¿Quieres ser un desarrollador hard-core? Entonces aprende c primero.

Los libros que necesita para dominar completamente c son algunas de las mejores escrituras en tecnología. Esto es lo que necesita:

C Programming Language

The Standard C Library

5

A medida que aprenda de Objective-C y Cocoa, no se puede evitar bits de C, por ejemplo el aprendizaje, rectángulos son comunes representado 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.

1

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. Puede intentar aprender ObjC sin C, pero tarde o temprano, necesitará C.

2

El objetivo C es lo suficientemente diferente de C como para no merecer primero aprender C.

Desde una perspectiva de sintaxis/idioma familiar uno es casi mejor estudio de Smalltalk (sobre la que se basa objetivo C)

Desde una perspectiva práctica, se centran sus esfuerzos en el aprendizaje de 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) potente.

+1

No, Objective-C es un superconjunto ** muy pequeño ** de C. Sin C no puede hacer nada en Objective-C. Claro, el modelo de objetos está tomado de smalltalk, pero la sintaxis es para la mayoría de las partes ni siquiera cerca. – Sven

17

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 procedimiento de lenguaje que contiene muchas características que no son necesarias para la programación 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 la enseñanza de 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 querrás aprender la mayoría de las características C subyacentes, si no todas, pero se pueden diferir hasta obtener una comprensión sólida de la definición de clases y métodos, trabajar con objetos y expresiones de mensajes y comprender la conceptos de herencia y polimorfismo son bien entendidos.

+0

Todo esto es para aquellos que quieren aprender rápido, evitando dificultades y una profunda comprensión. Estoy enseñando un novato de programación completo (mientras tengo más de 11 años de experiencia en programación) para programar y solía enseñar a otros antes (pero no soy un maestro para dejarlo claro). ¿Y sabes qué? ¡Todos estos conceptos a los que todos estamos acostumbrados son tan complicados y no intuitivos para un principiante completo! C es una gran manera de entender lo suficiente bajo nivel, por lo que en el futuro no será algo mágico para ellos. Dicho esto, para una mejor curva de aprendizaje del programador es mejor con C al principio con sus reglas bárbaras =) –

0

¡No, vaya directamente al objetivo C!

Pasé de ActionScript 3 a Objective C, ¡y ya tengo un interno en una empresa!

Haz lo que quieras.

+0

¿Por qué perderías por completo el estado de ánimo orientado a objetos y comenzar a aprender C primero? Es como aprender a volar una cometa y esperar ser piloto. Debe integrar el OOP desde el principio. – SwiftArchitect

1

en mi humilde opinión, primero debe aprender al menos algunos C y especialmente sobre los punteros. Eso es aún más importante si uno proviene de un idioma que no tiene punteros. Mucha gente se pregunta sobre el código como

NSString *string = [[NSString alloc] init]; 
string = @"something"; 

ya que no saben acerca de la distinción entre un puntero y el objeto al que apunta.

Por supuesto uno no tiene que aprender todo de C antes de que uno pueda comenzar con Objective-C, pero algunas cosas fundamentales son absolutamente necesarias.

+0

Ojalá pudiera votar +10. Una vez en una entrevista obj-c dev me preguntaron si es posible crear un puntero a NSInteger ... Me sorprendió, porque eso era tan esencial para mí, pero, parece que no es para todos. Entonces, esto es importante y fácil de olvidar que esto también debe entenderse. –

2

usted debe tener un conocimiento básico de C antes de comenzar Objective_C, pero no hay necesidad maestro todos los detalles de C.

he publicado mis notas después de leer "programación en Objective-C" en caso de que ayuda a alguien más.

learn objective c with programming-

0

Si se entera de algún otro idioma antes, entonces siempre tienen confusión en 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.

+0

Porque en Objective-C "enviar un mensaje" no es "llamar a un método", sino que, al mismo tiempo, enviar un mensaje provoca que se llame a un método (función) =) Cuando envías un mensaje a un objeto pasa por un mensaje mecanismo de envío (puede leerlo aquí: https: //developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtHowMessagingWorks.html o aquí: http: //stackoverflow.com/questions/ 982116/objective-c-message-dispatch-mechanism) –

3

Sí, aprender el lenguaje C antes que cualquier otro idioma avanzado le ayudará a aprender otros lenguajes.

Cuestiones relacionadas