Изучите C, прежде чем изучать Objective-C [закрыто]


107

Как начинающий разработчик Apple, я хочу узнать мнение сообщества, лучше ли сначала изучить C, прежде чем переходить к Objective-C и, в конечном итоге, к Cocoa Framework?

Моя интуиция говорит, что выучите C, и это даст мне хорошую основу.

Ответы:


163

Сначала я выучу C. Я выучил C (и многое сделал на C) перед тем, как перейти на Obj-C. У меня много коллег, которые никогда не были настоящими программистами на C, они начали с Obj-C и выучили C ровно столько, сколько необходимо.

Время от времени я вижу, как они решают проблему полностью в Obj-C, что иногда приводит к очень неуклюжим решениям. Обычно я затем заменяю некоторый код Obj-C чистым кодом C (в конце концов, вы можете смешивать их сколько угодно, содержание метода Obj-C может быть полностью чистым кодом C). Без какого-либо намерения оскорбить любого программиста Obj-C, есть решения, которые очень элегантны в Obj-C, это решения, которые просто работают (и выглядят) намного лучше благодаря объектам(ООП-программирование может сделать сложные программы намного красивее, чем функциональное программирование; полиморфизм, например, блестящая особенность) ... и мне очень нравится Obj-C (гораздо больше, чем C ++! Я ненавижу синтаксис C ++, а некоторые языковые функции просто излишни) и приводят к плохим шаблонам разработки ИМХО); однако, когда я иногда переписываю код Obj-C своих коллег (а я действительно делаю это только, если считаю, что это абсолютно необходимо), полученный код обычно на 50% меньше, ему требуется только 25% используемой памяти. раньше и примерно на 400% быстрее во время выполнения.

Что я пытаюсь здесь сказать: у каждого языка есть свои плюсы и минусы. У C есть плюсы и минусы, как и Obj-C. Однако действительно замечательная особенность Obj-C (поэтому мне она даже нравится больше, чем Java) заключается в том, что вы можете по желанию переходить на простой C и обратно. Почему это такая замечательная функция? Потому что так же, как Obj-C устраняет многие недостатки чистого C, чистый C может исправить некоторые недостатки Obj-C. Если смешать их вместе, получится очень сильная команда.

Если вы изучаете только Obj-C и не имеете представления о C или знаете только его основы и никогда не пробовали, насколько элегантно он может решить некоторые общие проблемы, вы фактически изучили только половину Obj-C. C является фундаментальной частью Obj-C. Возможность использовать C в любое время и везде является его фундаментальной особенностью.

Типичным примером был некоторый код, который мы использовали, который должен был кодировать данные в base64, но мы не могли использовать для этого внешнюю библиотеку (без OpenSSL lib). Мы использовали кодировщик base64, полностью написанный с использованием классов Какао. Он работал нормально, но когда мы заставили его кодировать 200 МБ двоичных данных, это заняло целую вечность, а накладные расходы на память были недопустимыми. Я заменил его крошечным ультракомпактным кодировщиком base64, полностью написанным как одна функция C (я скопировал тело функции в тело метода, метод принял NSData в качестве входных данных и вернул NSString в качестве выходных данных, однако внутри функции все было на языке C). Кодировщик C был намного компактнее, он превосходил кодировщик чистого Cocoa в 8 раз по скорости, а накладные расходы на память были намного меньше. Кодирование / декодирование данных, игра с битами и аналогичные задачи низкого уровня - это лишь сильные стороны C.

Другим примером был код пользовательского интерфейса, который рисовал много графиков. Для хранения данных, необходимых для рисования графиков, мы использовали NSArray. На самом деле NSMutableArray's, поскольку график был анимированным. Результат: очень медленная анимация графика. Мы заменили все NSArray на обычные массивы C, объекты со структурами (в конце концов, информация о координатах графа - это то, что вам нужно в объектах), доступ к перечислителю с простыми циклами for и начали перемещать данные между массивами с помощью memcopy вместо того, чтобы брать данные из одного массива в другой - index для index. Результат: Ускорение в 4 раза. График плавно анимировался даже на старых системах контекстной рекламы.

Слабость C в том, что каждая более сложная программа в конечном итоге становится уродливой. Обеспечение читабельности, расширяемости и управляемости приложений C требует от программиста большой дисциплины. Многие проекты терпят неудачу из-за отсутствия этой дисциплины. Obj-C упрощает структурирование приложения с использованием классов, наследования, протоколов и так далее. Тем не менее, я бы не стал использовать чистую функциональность C в рамках метода без необходимости. Я предпочитаю хранить весь код в приложении Objective-C в методе объекта; все остальное противоречит цели объектно-ориентированного приложения. Однако в рамках метода я иногда использую исключительно чистый C.


и если я уже знаю C ++ и хочу изучить Objective-C для разработки iPhone / iTouch, обязательно ли изучать C?
chester89

11
@ chester89: если вы уже знаете C ++, вы знаете о C достаточно, чтобы начать работу с Objective-C.
Sven

Свен прав, C ++ настолько сложен и уже использует так много чистого C, что если вы действительно хорошо знаете C ++, вы также должны знать C.
Mecki

Это моя любимая мысль на эту тему, спасибо.
Morkrom 03

1
@FrederikWitte Опустите C ++, он только запутает вас как новичка (и это не тот язык, который вам нужен для мобильной разработки). Начните с Java, это хороший язык обучения, и просто знания Java достаточно для разработки для Android (возможно, если вы не хотите писать игры или видеоплееры или что-то в этом роде). Затем выучите C и, наконец, Obj-C, если вы не хотите пропустить все это вместо изучения Swift. Твой выбор.
Mecki

25

Вы можете достаточно легко изучить C и Objective-C одновременно - конечно, нет необходимости изучать детали C (включая арифметику указателей и т. Д.), Прежде чем начинать с дополнений Objective-C к языку, и как начинающий программист Быстрое освоение Objective-C может помочь вам быстрее начать «мыслить объектами».

Что касается доступных ресурсов, документация Apple обычно предполагает знакомство с C, поэтому использование языка программирования Objective-C 2.0 не принесет вам большой пользы. Я бы вложил деньги в копию книги «Программирование в Objective-C» Стивена Кочана (в зависимости от того, как быстро вы хотите начать, вы можете подумать о том, чтобы дождаться второго издания):

Библиотека разработчиков для программирования Objective-C Библиотека для разработчиков для Objective-C 2.0

Он не предполагает никакого предыдущего опыта и учит вас Objective-C и столько C, сколько вам нужно.

Если вы чувствуете себя немного амбициозным, вы можете начать с учебника Скотта Стивенсона "Learn C". , но для него есть некоторые предварительные условия («Вы уже должны знать хотя бы один язык сценариев или программирования, включая функции, переменные и циклы. Вы». Мне также нужно будет вводить команды в Терминале Mac OS X. ").

(Для протокола и для контекста: в 1991 году я изучил и то, и другое одновременно - похоже, это не причинило мне никакого вреда. Тем не менее, у меня был опыт работы с BASIC, Pascal, Logo и LISP. )


2
вам совершенно не обязательно сначала выучить C. Особенно, если вы уже знаете такой язык, как C # Java. C # и Java многим обязаны цели C. Хотя C # многим обязан опыту Хельсберга и ошибкам с Delphi.
Дэниел Хониг

18

Я много думал об этом, прежде чем писать книгу по Objective-C. Во-первых, я действительно считаю, что изучение языка C перед изучением Objective-C - неправильный путь. C - процедурныйязык, содержащий множество функций, которые не нужны для программирования на Objective-C, особенно на уровне новичка. Фактически, использование некоторых из этих возможностей противоречит принципу соблюдения хорошей методологии объектно-ориентированного программирования. Также не рекомендуется изучать все детали процедурного языка (и атаковать решение проблемы с помощью функций и методов структурированного программирования) перед изучением объектно-ориентированного языка. Это может запустить программиста в неверном направлении, что потенциально может привести к развитию неправильной ориентации и мышления для развития хорошей дисциплины объектно-ориентированного программирования. Тот факт, что Objective-C является расширением языка C, не означает, что вам нужно сначала изучить C!

Я считаю, что обучение Objective-C и базового языка C как единого интегрированного языка - это правильный подход. Нет причин узнавать, что выражение «for» взято из языка C, а не из его надмножества языка Objective-C. Кроме того, зачем подробно изучать такие вещи, как массивы и строки C (и манипулировать ими) прежде чемузнать, например, о массиве (NSArray) и строковых объектах (NSString)? Во многих текстах на C много времени уделяется структурам и указателям на структуры, а также итерации по массивам с указателями. Но вы можете начать писать программы на Objective-C, даже не зная ни об одной из этих функций языка C. А для начинающего программиста это большое дело. Это не только сокращает кривую обучения, но также сокращает количество материала, который необходимо изучить (и частично отфильтровать) для написания программ Objective-C.

Я согласен с тем, что вы захотите изучить большую часть, если не все, базовые функции C, но многие из них можно отложить до твердого понимания определения классов и методов, работы с объектами и выражениями сообщений и понимания концепций наследования и полиморфизм хорошо изучен.


Все это для тех, кто хочет быстро учиться, избегая при этом борьбы и глубокого понимания. Я обучаю законченного программиста-новичка (хотя у меня более 11 лет опыта программирования) программировать и раньше учил других (но я не учитель, чтобы разъяснять это). И знаете что? Все эти концепции, к которым мы все привыкли, слишком сложны и не интуитивно понятны для начинающих! C - отличный способ понять вещи достаточно низкого уровня, так что в будущем это не будет для них какой-то магией. Тем не менее, для лучшего обучения программисту лучше сначала использовать C с его варварскими правилами =)
MANIAK_dobrii

15

Я бы сразу погрузился в Objective C - если у вас уже есть несколько языков, кривая обучения - это не синтаксис, а Cocoa.


1
Теперь, с учетом сказанного, существует гораздо больше материала для изучения C.Обнаружено, что самая сложная часть ObjC - отсутствие материала, который был хорошо организован, ясен, имел достаточную глубину для сравнения с материалами C или C ++ и действительно помогал вам понять, что было происходит внутри него.
Spanky

10

Я думаю, что по большей части изучение C - хорошая идея, независимо от того, на какую арену вы собираетесь, по крайней мере, чтобы получить представление о внутренней работе разработки программного обеспечения, прежде чем использовать предварительно упакованные товары, таким образом, если что-то пойдет не так у вас больше шансов понять внутреннюю работу. На SO есть много дискуссий по этому поводу, и это довольно субъективный вопрос, но в целом вы по своей сути будете использовать C в своем коде Objective-C, поэтому я думаю, что это действительно зависит от вас. Я человек опытный, но иногда это может мешать, и я знаю нескольких умных людей, которые работали сверху вниз, я думаю, что важная часть состоит в том, чтобы вы понимали внутреннюю работу, как это будет отделите свои возможности от тех, кто этого не делает, а также увеличьте свои возможности.


изучение C в первую очередь может также исказить ваш взгляд на объектно-ориентированное программирование, если вы еще не освоили его. Смешивать структурированное и процедурное кодирование нельзя. Но также верно и то, что объектно-ориентированный подход теряет свою ценность во многих местах, где C выделяется, например, при написании кода нижнего уровня.
Дэниел Хониг

1
Моя причина предложить каждому разработчику изучить C в какой-то момент, по крайней мере, основана на идее, что даже OO-языки компилируются до тех же точных инструкций, которые C делает в конце. Переменные для объектов используют указатели, сборщики мусора используют malloc и free, файлы блокируются с помощью дескрипторов ОС; когда что-то идет не так в приложении Java или C #, знание этих основ может значительно улучшить ваше понимание того, что пошло не так. Понимание того, какие ресурсы будут выполняться, также ведет к написанию более информированного кода, который будет работать более оптимально для конкретного контекста.
TheXenocide

7

Перед изучением Objective-C, который является строгим надмножеством C, рекомендуется изучить C. Это означает, что Objective-C может поддерживать весь нормальный код C, поэтому код, общий для программ C, обязательно появится даже в Objective- Код C.

Помимо того, что вы посмотрите на вещи исключительно с точки зрения языка, вы обнаружите, что Mac OS X - это полноценная операционная система Unix. Все библиотеки системного уровня написаны на C.

Вероятно, можно изучить и то, и другое одновременно, но я думаю, что вы оцените и поймете Objective-C больше, если сначала у вас будет твердое рабочее знание C.


5

Я бы изучил Objective-C и выучил столько C, сколько вам нужно, по ходу дела.

Области C, от которых вы не будете сильно зависеть:

  • Арифметика указателей и массивы. Я вообще не использовал массивы C.
  • Струны C. Строки Objective-C делают работу лучше и безопаснее.
  • Ручное управление памятью, если вы используете GC в Obj-C 2.1. Я настоятельно рекомендую этот маршрут из соображений скорости разработки и производительности.

6
Одно предостережение: сборка мусора в Objective-C доступна не на всех платформах (особенно на iPhone), о чем следует знать.
Марк Бесси,

5

Изучая Objective-C и Какао, вы не можете избежать изучения частей C. Например, прямоугольники обычно представлены CGRect, структурой C.

Если у вас есть время, непременно выучите C. Как говорили здесь другие, книга Кочана (второе и первое издания) превосходна как книга, в которую можно погрузиться.


4

Есть много вещей, которые вы не можете сделать только в Objective-C, поэтому изучение некоторых базовых навыков C будет очень важным. По крайней мере, вам нужно понимать объявления переменных и основные функции библиотеки C, иначе вы будете разочарованы.


3

Честно говоря, так много языков основано на синтаксисе C, что полезно знать его. Я бы потратил неделю или две, чтобы ознакомиться с C, в любом случае.

Тем не менее, я только что обучил себя Objective C, и я должен быть честным: я не нашел свой опыт C таким полезным, как я мог подумать. Цель C определенно открыла мне глаза.


3

Вы можете сразу перейти к Objective-C со следующими преимуществами:

  1. По пути вы выучите "немного" C.
  2. Вы выучите части языка C, которые вам нужны.

По крайней мере, мне легче выучить новый язык, когда меня интересует какое-то конкретное приложение или образец, и я терплю неудачу, когда мне приходится изучать что-то другое, что не совсем то, что меня интересует.

Вы всегда сможете уточнить свои знания C позже, если заинтересуетесь программированием более низкого уровня.


3

Лучше, не знаю, тем более, потому что я не знаком с Objective-C.
Но основы C не так сложно изучить, это не очень сложный язык (с точки зрения синтаксиса, а не с точки зрения освоения!), Так что дерзайте, это не будет потрачено зря.
Лично я считаю, что изучать C - это всегда хорошая идея, это дает хорошее представление о том, как работает компьютер. В конце концов, большинство языков и систем по-прежнему написаны на C. Тогда вперед! :-)

PS: Под «двигаться дальше» я не имел в виду «бросить», просто «узнать больше, узнать другое». Зная C, вы никогда не откажетесь от него: Java использует JNI для вызова подпрограмм C для низкоуровневых вещей, Python, Lua и т. Д. Часто расширяются с помощью кода C (ссылка Lua даже предполагает некоторые знания C для некоторых функций, которые просто тонкая оболочка для функции C позади) и так далее.



2

Согласно Википедии , Objective-C - это строгий надмножество C. В таком случае я бы предложил сначала изучить C. Тогда, когда вы изучите Objective-C, будет ясно, какие части добавлены как часть Objective-C.


2

C дает очень небольшую абстракцию от сборки. Некоторые компиляторы C даже позволяют встроенную сборку. Это может быть очень полезно для размышлений о том, как работает компьютер, что важно знать.

При этом, если вы действительно заинтересованы в Object-C, не позволяйте себе зацикливаться на написании чего-либо на C только потому, что это «хорошо для вас». Вам не нужно расстраиваться, когда вы пытаетесь освоить новый набор навыков. Важно, чтобы вы получали удовольствие от того, что делаете.



2

Цель C настолько отличается от C, что не заслуживает изучения C.

С точки зрения синтаксиса / языковой семьи почти лучше изучать SmallTalk (на котором основана цель C)

С практической точки зрения сосредоточьтесь на изучении одного языка за раз.

Позже, если вы захотите выучить другой язык, C ++, Java и Python 1) просты для изучения в совокупности 2) популярны и, следовательно, востребованы 3) мощны.


1
Нет, Objective-C - это очень маленькая надмножество C. Без C вы ничего не сможете сделать в Objective-C. Конечно, объектная модель взята из smalltalk, но синтаксис по большей части даже не близок.
Sven

2

Перед запуском Objective_C вы должны иметь базовые знания C, но нет необходимости осваивать каждую деталь C.

Я опубликовал свои заметки после прочтения "Programming in Objective-C" на случай, если это поможет кому-то другому.

изучить цель c с программированием-


1

В зависимости от многих языков, которые вы уже знаете, может быть лучше просто начать изучать Objective-C. Основа в большинстве языков в основном одинакова, отличается синтаксис. Изучение C в первую очередь не имеет большого значения, когда дело доходит до изучения Objective-C.


Но только если вы знаете хотя бы еще один язык программирования.
Sven

В дополнение к комментарию
@Sven

1

Я сразу выучил Objective-C, и он работал нормально около года, мне просто было трудно читать код C, когда я загружал проект, чтобы посмотреть, как они работают, но теперь я действительно чувствую необходимость изучить C. ObjC без C, но рано или поздно вам понадобится C.


1

ИМХО нужно сначала изучить хоть немного C, особенно указатели. Это даже более важно, если кто-то исходит из языка, в котором нет указателей. Многие люди спрашивают о таком коде, как

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

поскольку они не знают различия между указателем и объектом, на который он указывает.

Конечно, не обязательно изучать весь C, прежде чем можно будет начать с Objective-C, но некоторые фундаментальные вещи абсолютно необходимы.


Хотел бы я проголосовать +10. Однажды на собеседовании разработчиков obj-c меня спросили, можно ли создать указатель на NSInteger ... Я был шокирован, потому что это было так важно для меня, но, похоже, не для всех. Так что это важно и легко забыть, что это тоже нужно понимать.
MANIAK_dobrii

0

Черт возьми, идите прямо к цели C!

Я перешел с ActionScript 3 на Objective C, и у меня уже есть стажер в компании!

Делай что хочешь.


Почему бы вам полностью упустить объектно-ориентированное состояние ума и начать сначала изучать C. Это как научиться управлять воздушным змеем и надеяться стать пилотом. Вы должны интегрировать ООП с самого начала.
SwiftArchitect

0

Если вы выучили какой-то другой язык раньше, у вас всегда будет путаница при написании правильного синтаксиса. Я не знаю цели, но объект C использует странный (необычный) синтаксис для вызова методов объекта. Он называет это отправкой сообщений, да, это верно в соответствии с чистой объектно-ориентированной концепцией, однако большинство объектно-ориентированных языков называют это методом вызова и используют более традиционный синтаксис методов вызова. Сборка мусора - тоже что-то очень странное, объект C основан на подсчете ссылок старой школы. Поэтому вам будет трудно принять его, если вы перейдете с другого языка. Я пишу книгу «Руководство по быстрой миграции на объект C» для программистов на C / C ++, надеясь помочь людям быстрее уловить все различия.


Потому что в Objective-C «отправка сообщения» - это не «вызов метода», но в то же время отправка сообщения вызывает вызов метода (функции) =) Когда вы отправляете сообщение объекту, оно проходит через отправку сообщения механизм (вы можете прочитать об этом здесь: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… или здесь: stackoverflow.com/questions/982116/… )
MANIAK_dobrii
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.