Aprenda C primero antes de aprender Objective-C [cerrado]

107

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, en última instancia, a Cocoa Framework.

Mi instinto dice que aprenda C, lo que me dará una buena base.

Alondra
fuente

Respuestas:

163

Primero aprendería C. Aprendí C (e hice mucho en C) antes de pasar a Obj-C. Tengo muchos colegas que nunca fueron programadores reales de C, comenzaron con Obj-C y aprendieron solo tanto C como era necesario.

De vez en cuando veo cómo resuelven un problema por completo en Obj-C, lo que a veces resulta en soluciones muy torpes. Por lo general, luego reemplazo algún código Obj-C con código C puro (después de todo, puede mezclarlos tanto como desee, el contenido de un método Obj-C puede ser completamente código C puro). Sin ninguna intención de insultar a ningún programador de Obj-C, hay soluciones que son muy elegantes en Obj-C, estas son soluciones que simplemente funcionan (y lucen) mucho mejor gracias a los objetos(La programación OOP puede hacer que los programas complejos sean mucho más atractivos que la programación funcional; el 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 simplemente exageradas y conducir a malos patrones de desarrollo en mi humilde opinión); sin embargo, cuando a veces reescribo el código Obj-C de mis colegas (y realmente solo lo hago, si creo que esto es absolutamente necesario), el código resultante suele ser un 50% más pequeño, necesita solo el 25% de la memoria que usó antes y es aproximadamente un 400% más rápido en tiempo de ejecución.

Lo que intento decir aquí: cada idioma tiene sus pros y sus contras. C tiene pros y contras y Obj-C también. Sin embargo, la gran característica de Obj-C (es por eso que incluso me gusta más que Java) es que puedes saltar a C simple a voluntad y viceversa. ¿Por qué esta es una característica tan grandiosa? Porque al igual que Obj-C corrige muchos de los contras de C puro, C puro puede arreglar algunos de los contras de Obj-C. Si los mezcla, recibirá un equipo muy poderoso.

Si solo aprende Obj-C y no tiene idea de C o solo conoce sus conceptos básicos y nunca probó con qué elegancia puede resolver algunos problemas comunes, en realidad solo aprendió la mitad de Obj-C. C es una parte fundamental de Obj-C. La capacidad de utilizar C en cualquier momento y en cualquier lugar es una característica fundamental de la misma.

Un ejemplo típico fue un código que usamos que tenía que codificar datos en base64, pero no pudimos usar una biblioteca externa para eso (sin OpenSSL lib). Usamos un codificador base64, completamente escrito usando clases Cocoa. Funcionaba bien, pero cuando lo hicimos codificar 200 MB de datos binarios, tomó una eternidad y la sobrecarga de memoria fue inaceptable. Lo reemplacé con un codificador base64 diminuto y ultra compacto escrito completamente 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, sin embargo, dentro de la función todo era C). El codificador C era mucho más compacto, vencía al codificador Cocoa puro por el factor 8 en velocidad y la sobrecarga de memoria también era mucho menor. Codificar / decodificar datos, jugar con bits y tareas similares de bajo nivel son solo los puntos fuertes de C.

Otro ejemplo fue un código de interfaz de usuario que dibujó muchos gráficos. Para almacenar los datos necesarios para pintar los gráficos, usamos NSArray's. En realidad, NSMutableArray's, 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 deba tener en los objetos), el acceso al enumerador con bucles for simples y comenzamos a mover datos entre las matrices con memcopy en lugar de tomar datos de una matriz a el otro, índice por índice. El resultado: una aceleración del factor 4. El gráfico se animó sin problemas, incluso en sistemas PPC más antiguos.

La debilidad de C es que cada programa más complejo se vuelve feo a largo plazo. Mantener las aplicaciones C legibles, extensibles y manejables exige mucha disciplina por parte de un programador. Muchos proyectos fracasan porque falta esta disciplina. Obj-C le facilita la estructuración de su aplicación utilizando clases, herencia, protocolos, etc. Dicho esto, no usaría la funcionalidad C pura a través de las fronteras de un método a menos que sea necesario. Prefiero mantener todo el código en una aplicación Objective-C dentro del método de un objeto; todo lo demás frustra el propósito de una aplicación orientada a objetos. Sin embargo, dentro del método, a veces uso C puro exclusivamente.

Mecki
fuente
y si ya sé c ++ y quiero aprender a desarrollar Objective-C para iPhone / iTouch, ¿es necesario aprender C lo que sea?
chester89
11
@ chester89: si ya conoce C ++, sabe lo suficiente sobre C como para comenzar con Objective-C.
Sven
Sven tiene razón, C ++ es tan complejo y ya usa mucho C puro, si conoces C ++ realmente bien, también deberías conocer C lo suficientemente bien.
Mecki
Esta es mi meditación favorita sobre el tema hasta ahora, gracias.
Mork desde el
1
@FrederikWitte Deja de lado C ++, solo te confundirá como principiante (y no es un lenguaje que necesitarías para el desarrollo móvil). Comience con Java, es un buen lenguaje de enseñanza y solo saber Java es suficiente para desarrollar para Android (tal vez a menos que desee escribir juegos o reproductores de video o algo así). Luego aprenda C y finalmente Obj-C, a menos que desee omitir todo eso y aprenda Swift en su lugar. Tu elección.
Mecki
25

Puede aprender fácilmente C y Objective-C al mismo tiempo; ciertamente no hay necesidad de aprender las minucias de C (incluida la aritmética de punteros, etc.) antes de comenzar con las adiciones de Objective-C al lenguaje, y como programador novato comenzar 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 gran beneficio para usted. Yo invertiría en una copia de Programming in Objective-C de Stephen Kochan (dependiendo de la rapidez con la que desee comenzar, puede considerar esperar la segunda edición):

Biblioteca de desarrolladores de Programming Objective-C Objective-C 2.0

No asume experiencia previa y le enseña Objective-C y tanto C como necesite.

Si se siente un poco ambicioso, puede comenzar con el tutorial "Learn C" de Scott Stevenson , pero tiene algunos requisitos previos ("Ya debería conocer al menos un lenguaje de programación o de scripting, incluidas funciones, variables y bucles. También necesitaré escribir comandos en la Terminal Mac OS X. ").

(Solo para que conste y para el contexto: aprendí ambos al mismo tiempo en 1991; no pareció hacerme ningún daño. Sin embargo, tenía experiencia en BASIC, Pascal, Logo y LISP. )

mmalc
fuente
2
absolutamente no debería resultar necesario aprender C primero. Especialmente si ya conoce un lenguaje como C # de Java. C # y Java deben mucho al objetivo C. Aunque C # le debe mucho más a la experiencia de Helsberg y a los errores con Delphi.
Daniel Honig
18

Pensé mucho en 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 procedimientolenguaje que contiene muchas características que no son necesarias para programar en Objective-C, especialmente en el nivel principiante. De hecho, recurrir a algunas de estas características va en contra de la adhesión a una buena metodología de programación orientada a objetos. Tampoco es una buena idea enseñar todos los detalles de un lenguaje procedimental (y atacar la solución de un problema con funciones y técnicas de programación estructurada) antes de aprender uno orientado a objetos. Esto puede hacer que el programador se ponga en la dirección equivocada, lo que puede llevar a desarrollar una orientación y una mentalidad equivocadas 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 primero tengas que aprender C!

Creo que enseñar Objective-C y el lenguaje C subyacente como un solo lenguaje integrado es el enfoque correcto. No hay razón para saber que una declaración "for" proviene del lenguaje C y no de su superconjunto Objective-C. Además, ¿por qué aprender en detalle sobre cosas como matrices y cadenas de C (y manipularlas) antesaprender acerca de matrices (NSArray) y objetos de cadena (NSString), por ejemplo? Muchos textos en C dedican mucho tiempo a las estructuras y los punteros a las estructuras, y a iterar a través de matrices 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. Eso no solo acorta la curva de aprendizaje, sino que también reduce la cantidad de material que debe aprenderse (y parte de él se filtra selectivamente) para escribir programas Objective-C.

Estoy de acuerdo en que querrá aprender la mayoría, si no todas, de las características subyacentes de C, pero muchas se pueden diferir hasta 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 conocidos.

skochan
fuente
Todo esto es para aquellos que quieren aprender rápido mientras evitan la lucha y la comprensión profunda. Estoy enseñando a un novato de programación completo (aunque 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 en claro). Y saber que ¡Todos estos conceptos a los que estamos acostumbrados son muy complicados y no intuitivos para un principiante! C es una excelente manera de comprender las cosas de nivel suficientemente bajo, por lo que en el futuro no será algo mágico para ellos. Dicho esto, para un mejor programador, la curva de aprendizaje es mejor con C al principio con sus reglas bárbaras =)
MANIAK_dobrii
15

Me sumergiría directamente en Objective C: si ya tiene algunos idiomas en su haber, no es la sintaxis la que es la curva de aprendizaje, es Cocoa.

Paul Dixon
fuente
1
Dicho esto, hay mucho más material disponible para aprender C. Descubrí que esa era la parte más difícil de ObjC, falta de material bien organizado, claro, con suficiente profundidad para comparar con el material de C o C ++ y realmente te ayuda a entender lo que era pasando dentro de ella.
Spanky
10

Creo que, en su mayor parte, aprender C es una buena idea sin importar a qué campo te dirijas, al menos para dominar el funcionamiento interno del desarrollo de software antes de usar productos empaquetados, 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, inherentemente usará C dentro de su código Objective-C, así que supongo que realmente depende de usted. Soy un tipo de persona de base, pero a veces puede interponerse en el camino y conozco a varias personas inteligentes que se abrieron camino de arriba hacia abajo, creo que la parte importante es que llegues a comprender el funcionamiento interno como sea. diferencie sus capacidades de las que no lo hacen y aumente sus capacidades.

El xenocidio
fuente
aprender C primero también puede distorsionar su visión de la programación OO si aún no está basado en ella. No es bueno mezclar codificación estructurada y procedimental. Pero también es cierto que OO pierde su valor en muchos lugares donde C brilla, como escribir código de nivel inferior.
Daniel Honig
1
Mi razón para sugerir que todos los desarrolladores aprendan C en algún momento se basa al menos en la idea de que incluso los lenguajes OO se compilan exactamente con las mismas instrucciones que C al final. Las variables de los objetos usan punteros, los recolectores de basura usan malloc y free, los archivos se bloquean mediante identificadores del sistema operativo; cuando algo sale mal en una aplicación Java o C #, conocer estos fundamentos puede mejorar enormemente su comprensión de lo que salió mal. Comprender la asignación de recursos que se llevará a cabo también tiende a conducir a escribir un código más informado que funcionará de manera más óptima para un contexto específico.
TheXenocide
7

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 seguramente aparecerá incluso en Objective- Código C.

Además de mirar las cosas puramente desde el punto de vista del lenguaje, encontrará 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 primero tiene un conocimiento práctico sólido de C.

Doug
fuente
5

Aprendería Objective-C y aprendería tanto C como necesite a medida que avanza.

Las áreas de C de las que no dependerá mucho:

  • Aritmética de punteros y matrices. No he usado matrices C en absoluto.
  • Cuerdas C Las cuerdas de Objective-C hacen el trabajo de forma más agradable y segura.
  • Gestión de memoria manual si utiliza GC en Obj-C 2.1. Recomiendo esta ruta por razones de velocidad de desarrollo y rendimiento.
Giao
fuente
6
Una advertencia: la recolección de basura en Objective-C no está disponible en todas las plataformas (especialmente el iPhone), lo cual es algo a tener en cuenta.
Mark Bessey
5

A medida que aprende Objective-C y Cocoa, no puede evitar aprender bits de C. Por ejemplo, los rectángulos son comúnmente representados por CGRect, una estructura de C.

Si tiene tiempo, aprenda C. Como otros han dicho aquí, el libro de Kochan (segunda y primera ediciones) es excelente como un libro para sumergirse.

mattwestbright
fuente
4

Hay muchas cosas que no puedes hacer únicamente 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 de C, o se sentirá frustrado.

Mark Bessey
fuente
3

Honestamente, muchos lenguajes se basan en la sintaxis de C, por lo que es bueno estar familiarizado. Me tomaría una semana o dos familiarizarme con C independientemente.

Dicho esto, me enseñé el Objetivo C por mí mismo, y tengo que ser honesto: no encontré mi experiencia C tan útil como hubiera pensado. El objetivo C definitivamente me abrió los ojos.

user25967
fuente
3

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

  1. 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 adelante si se interesa en la programación de nivel inferior.

OscarRyz
fuente
3

Mejor, no lo sé, mucho 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 dominio), así que adelante, no será una pérdida de 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 lenguajes y sistemas todavía están escritos en C. ¡Entonces sigue adelante! :-)

PD: Con "seguir adelante", no quise decir "dejarlo", solo "aprender más, aprender diferente". Una vez que conozca C, es posible que nunca lo deje caer: Java usa JNI para llamar a rutinas C para cosas de bajo nivel, Python, Lua, etc.a menudo se extienden con código C (la referencia de Lua incluso solo asume algunos conocimientos de C para algunas funciones que son solo una envoltura delgada a la función C detrás), y así sucesivamente.

PhiLho
fuente
3

Sí, aprender el lenguaje C antes que cualquier otro idioma avanzado te ayudará a aprender rápidamente otros idiomas.

Codificación del futuro
fuente
2

Según Wikipedia , Objective-C es un superconjunto estricto de C. Siendo este el caso, sugeriría aprender C primero. Luego, cuando aprenda Objective-C, quedará claro qué partes se agregan como parte de Objective-C.

Trento
fuente
2

C le brinda muy poca abstracción del ensamblaje. Algunos compiladores de C incluso le permitirán ensamblar en línea. Esto puede ser muy útil para pensar en cómo funciona la computadora, lo cual es importante saber.

Dicho esto, si está realmente interesado en Object-C, no se quede atascado escribiendo algo en C solo porque es "bueno para usted". No necesita frustrarse mientras intenta aprender un nuevo conjunto de habilidades. Es importante que te diviertas con lo que estás haciendo.

Steve g
fuente
2

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

Desde una perspectiva de sintaxis / familia de idiomas, es casi mejor que uno estudie SmallTalk (en el que se basa el objetivo C)

Desde una perspectiva práctica, concentre sus esfuerzos en aprender un idioma a la vez.

Más adelante, si desea aprender otro lenguaje, C ++, Java y Python son 1) fáciles de aprender en conjunto 2) populares y por lo tanto comercializables 3) poderosos.

Arroyos
fuente
1
No, Objective-C es un superconjunto muy pequeño de C. Sin C no se puede hacer nada en Objective-C. Claro, el modelo de objetos se toma de smalltalk, pero la sintaxis en la mayoría de las partes ni siquiera se acerca.
Sven
2

Debe tener un conocimiento básico de C antes de iniciar Objective_C, pero no es necesario dominar todos los detalles de C.

He publicado mis notas después de leer "Programación en Objective-C" en caso de que ayude a alguien más.

aprender el objetivo c con programación

cfischer
fuente
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, lo que es diferente es la sintaxis. Aprender C primero no va a marcar una gran diferencia cuando se trata de aprender Objective-C.

Dave
fuente
Pero solo si uno conoce al menos otro lenguaje de programación.
Sven
Además del comentario de @ Sven: "... que tiene algún concepto de punteros"
MANIAK_dobrii
1

Aprendí Objective-C de inmediato y funcionó bien durante aproximadamente un año, solo 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.

Alexandre Cassagne
fuente
1

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 códigos 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.

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

Diablos no, ¡ve directamente al objetivo C!

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

Haz lo que quieras.

Nathan
fuente
¿Por qué perdería completamente el estado mental orientado a objetos y comenzaría a aprender C primero? Es como aprender a volar una cometa y esperar ser piloto. Debe integrar la programación orientada a objetos desde el principio.
SwiftArchitect
0

Si aprende algún otro idioma antes, 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 objeto. Lo nombra como envío de mensajes, sí, es cierto, en consecuencia, concepto puro orientado a objetos, sin embargo, la mayoría de los lenguajes orientados a objetos lo nombran como método de llamada y utilizan una sintaxis más tradicional de 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 que 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 detectar todas las diferencias más rápido.

Dmitriy
fuente
Porque en Objective-C "enviar un mensaje" no es "llamar a un método", sino que, al mismo tiempo, enviar un mensaje hace que se llame a un método (función) =) Cuando envías un mensaje a un objeto, pasa por un envío de mensajes. mecanismo (puede leerlo aquí: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… o aquí: stackoverflow.com/questions/982116/… )
MANIAK_dobrii