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


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 Cocoa?

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

Author: The Archetypal Paul, 2008-10-08

23 answers

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 fuera necesario.

De vez en cuando veo cómo resuelven un problema completamente en Obj-C, a veces resultando en soluciones muy torpes. Por lo general, luego sustituyo 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 puro codificar). 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 objects (la programación OOP puede hacer que los programas complejos sean mucho más encantadores que la programación funcional; el polimorfismo, por ejemplo, es una característica brillante)... y me gusta mucho Obj-C (mucho más que C++! Odio la sintaxis de C++ y algunas características del lenguaje son simplemente excesivas y conducen 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, solo necesita el 25% de la memoria que usó antes y es aproximadamente un 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 Obj-C. Sin embargo, la gran característica de Obj-C (es por eso que incluso me gusta más que Java) es que puede saltar a C normal a voluntad y de vuelta otra vez. ¿Por qué esta es una gran característica? Porque al igual que Obj-C arregla muchos de los contras de pure C, pure C puede arreglar algunos de los contras 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 de la misma y nunca probaste lo elegante que puede resolver algunos problemas comunes, en realidad aprendiste solo la mitad de Obj-C. C es una parte fundamental de Obj-C. La capacidad de usar C en cualquier momento y en característica fundamental de la misma.

Un ejemplo típico fue algún 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. Estaba funcionando bien, pero cuando lo hicimos codificar 200 MB de datos binarios, tomó una eternidad y la sobrecarga de memoria era inaceptable. Lo reemplazé con un pequeño codificador base64 ultra compacto escrito completamente como una función C (copié el cuerpo de la función en el cuerpo del método, method 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, venció al codificador de cacao puro por el factor 8 en velocidad y la sobrecarga de memoria también fue 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 el 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 toda la información de coordenadas gráficas no es nada que deba tener en los objetos), 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 la otra, índice para índice. El resultado: Una aceleración por el factor 4. El gráfico animado sin problemas, incluso en sistemas PPC más antiguos.

La debilidad de C es que cada programa más complejo se pone feo a largo plazo. 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 usaría la funcionalidad de C pura a través de las fronteras de un método a menos que sea necesario. Me prefiere 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 OO. Sin embargo, dentro del método a veces uso exclusivamente C pura.

 159
Author: Mecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 23:32:34

Usted puede aprender fácilmente C y Objective-C al mismo tiempo certainly ciertamente no hay necesidad de aprender las minucias de C (incluyendo aritmética de puntero y así sucesivamente) antes de comenzar con las adiciones de Objective-C al lenguaje, y como un programador novato ponerse en marcha con Objective-C rápidamente puede ayudarle 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 comenzando 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 la rapidez con la que desee ponerse en marcha, puede considerar esperar la segunda edición):

Programming Objective-C Developers Library Programming 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, puede comenzar con el tutorial "Learn C" de Scott Stevenson, pero tiene algunos prerrequisitos ("Ya debería conocer al menos un lenguaje de scripting o programación, incluyendo funciones, variables y bucles. También tendrá que escribir comandos en el terminal de Mac OS X.").

(Solo para el registro y para el contexto: aprendí ambos al mismo tiempo en 1991't no parecía hacerme ningún daño. Yo, sin embargo, tengo un fondo en BASIC, Pascal, Logo y LISP.)

 25
Author: mmalc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 06:43:00

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 procedural que contiene muchas características que no son necesarias para programar en Objective-C, especialmente a nivel de novatos. De hecho, recurrir a algunas de estas características va en contra de la idea de adherirse a una buena metodología de programación orientada a objetos. Tampoco es una buena idea enseñar a 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 iniciar al programador en la dirección equivocada, lo que puede llevar a desarrollar la orientación y la mentalidad incorrectas para fomentar una buena disciplina de programación orientada a objetos. ¡Solo porque Objective-C es una extensión del lenguaje C no significa que tengas que aprender C primero!

Creo que el Objetivo de enseñanza-C y el lenguaje C subyacente como un solo lenguaje integrado es el enfoque correcto. No hay razón para aprender que una declaración "for" es del lenguaje C y no de su superconjunto Objective-C language. Además, ¿por qué aprender en detalle sobre cosas como arrays y cadenas de C (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, y a los punteros a las estructuras, e iteran 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 se debe aprender (y parte de él se filtra selectivamente) para escribir programas de Objective-C.

Estoy de acuerdo en que querrá aprender la mayoría, si no todas, de las características C subyacentes, pero muchas se pueden diferir hasta que un sólido la comprensión de la definición de clases y métodos, el trabajo con objetos y expresiones de mensajes, y la comprensión de los conceptos de herencia y polimorfismo son bien entendidos.

 17
Author: skochan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-11 17:15:47

Me zambulliría en el Objetivo C - si ya tienes algunos idiomas en tu haber, no es la sintaxis la que es la curva de aprendizaje, es Cacao.

 15
Author: Paul Dixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:44:32

Creo que, en su mayor parte, aprender C es una buena idea, no importa en qué campo se esté yendo, al menos para aprender el funcionamiento interno del desarrollo de software antes de usar productos preenvasados, de esa manera si algo sale mal, tiene una mejor oportunidad de comprender el funcionamiento interno. Hay mucha discusión sobre esto en SO, y es una pregunta bastante subjetiva, pero en general usarás inherentemente C dentro de tu código Objective-C, así que supongo que es realmente hasta usted. Soy un tipo de persona de abajo hacia arriba, pero a veces puede interponerse y conozco a varias personas inteligentes que trabajaron su camino desde arriba hacia abajo, creo que la parte importante es que se llega a entender el funcionamiento interno, ya que establecerá sus capacidades aparte de aquellos que no lo hacen, así como aumentar sus capacidades.

 10
Author: TheXenocide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:42:52

Es una buena idea 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 C normal, por lo que el código común a los programas C está obligado a aparecer incluso en el código Objective-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ás y entenderás Objective-C más si primero tienes un sólido conocimiento práctico de C.

 7
Author: Doug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:50:41

Aprendería Objective-C y aprendería tanto C como necesites a medida que avanzas.

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

  • Aritmética de punteros y matrices. No he usado matrices C en absoluto.
  • C strings. Las cuerdas de Objective-C hacen el trabajo mejor y más seguro.
  • Gestión manual de la memoria si utiliza GC en Obj-C 2.1. Recomiendo encarecidamente esta ruta por razones de velocidad de desarrollo y rendimiento.
 5
Author: Giao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:49:06

Mientras aprendes Objective-C y Cocoa, no puedes evitar aprender bits de C. Por ejemplo, los rectángulos son comunes representados por CGRect, una estructura de C.

Si tienes tiempo, por todos los medios aprende C. Como otros han dicho aquí, el libro de Kochan (segunda y primera ediciones) es excelente como un libro para sumergirse.

 5
Author: mattwestbright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-25 16:04:33

Hay muchas cosas que no puedes hacer puramente en Objective-C, por lo que aprender algunas habilidades básicas de C será bastante crítico. Al menos tendrá que entender las declaraciones de variables y las funciones básicas de la biblioteca de C, o se sentirá frustrado.

 4
Author: Mark Bessey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:43:40

Honestamente, hay tantos lenguajes basados en la sintaxis C que es bueno estar familiarizado con ellos. Me tomaría una semana o dos para familiarizarme con C a pesar de todo.

Dicho esto, solo me enseñé a mí mismo Objetivo C, y tengo que ser honesto: No encontré que mi experiencia C fuera tan útil como hubiera pensado. El objetivo C fue definitivamente revelador para mí.

 3
Author: user25967,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:43:43

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

  1. Aprenderás "algo" de C en el camino.
  2. 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 adelante si se interesa en el nivel inferior programación.

 3
Author: OscarRyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:51:31

Mejor, no lo sé, aún 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 ve por ello, 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 están escritos en C. ¡Entonces sigue adelante! :-)

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

 3
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-08 05:27:45

Sí, aprender el idioma C antes que cualquier otra lengua avanzada te ayudará a aprender quiclky otras lenguas.

 3
Author: Coding future,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-24 15:41:04

De acuerdo con Wikipedia, Objective-C es un super-conjunto estricto de C. Siendo este el caso, sugeriría aprender C primero. Luego, cuando aprendas Objective-C, quedará claro qué partes se agregan como parte de Objective-C.

 2
Author: Trent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:44:27

C le da muy poca abstracción del ensamblado. 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 realmente estás interesado en Object-C, no te dejes atascar escribiendo algo en C solo porque sea "bueno para ti". No necesitas frustrarte mientras intentas aprender un nuevo conjunto de habilidades. Es importante que te diviertas con lo que eres hacer.

 2
Author: Steve g,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:44:55

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

Los libros que necesitas para dominar completamente c son algunos de los mejores escritos en tecnología. Esto es lo que necesitas:

Lenguaje de programación C

La Biblioteca Estándar de C

 2
Author: Freddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-24 05:52:11

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

Desde una perspectiva de familia de sintaxis / lenguaje, es casi mejor estudiar SmallTalk (en el que se basa objective C)

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

Más tarde, si desea aprender otro lenguaje, C++, Java y Python son 1) fáciles de aprender como un grupo 2) populares y por lo tanto comercializables 3) potentes.

 2
Author: Brooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-29 05:27:30

Debes tener un conocimiento básico de C antes de comenzar Objective_C, pero no hay necesidad de 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.

Aprende el objetivo c con la programación -

 2
Author: cfischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 06:40:30

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 idiomas es básicamente la misma, es la sintaxis la que es diferente. Aprender C primero realmente no va a hacer mucha diferencia cuando se trata de aprender Objective-C.

 1
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-07 21:41:03

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é project 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.

 1
Author: Alexandre Cassagne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-22 10:03:43

En mi humilde opinión uno debe primero aprender al menos algo de C y especialmente sobre punteros. Eso es aún más importante si uno viene de un idioma que no tiene indicadores. Mucha gente pregunta sobre 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 de C antes de empezar con Objective-C, pero algunas cosas fundamentales son absolutamente necesarias.

 1
Author: Sven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-09 22:56:59

Heck no, ir directamente al objetivo C!

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

Haz lo que quieras.

 0
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-08 17:13:14

Si aprendes algún otro idioma antes, entonces siempre tendrás confusión al escribir la sintaxis correcta. No conozco el propósito, pero el Objeto C usa una sintaxis extraña (no común) para llamar a métodos de objeto. Lo nombra como el envío de mensajes, sí, es cierto en consecuencia concepto orientado a Objetos puro, sin embargo la mayoría de los lenguajes orientados a objetos nombre que como método de llamada y el uso de 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 la vieja escuela recuento de referencias. Por lo tanto, tendrá dificultades para aceptarlo si cambia de otro idioma. Estoy escribiendo un libro Object C quick migration guide para programadores de C / C++ con la esperanza de ayudar a la gente a recoger todas las diferencias más rápido.

 0
Author: Dmitriy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-11 22:37:56