🤓 ООП. Часть 4. Objective C.



Хоть и суббота, но кто сказал, что в субботу нельзя просвящаться 😁



В прошлой части мы говорили про С++. Язык появился как исследовательский проект Бьёрна Страуструпа по добавлению в язык С классов из Simula. После нескольких лет разработки и исследований в 83 году мир увидел первый стабильный релиз языка.



С++ характерен тем, что с точки зрения дизайна он остается верным С: язык низкоуровневый и позволяет очень тонко и гибко настраивать поведение вашего кода. При этом вы не платите за те абстракции, которые не используете.



С другой стороны, в 84 мир увидел другой, концептуально похожий на С++ проект - язык Objective C. Язык разработан Брэдом Коксом и Томом Лавом как ОО расширения языка С. Значит как и в случае с С++ мы имеем язык С, в котором появилась возможность использовать новые языковые конструкции, так и писать "как раньше". Есть классы, наследование и полиморфизм. Есть примитивы и объекты. Пока кажется, что эти два языка примерно одинаковые.



Но разница кроется в реализации ООП: если в С++ мы видим абсолютное влияние Simula, то в Objective C модель ОО основана на подходе Smalltalk. В чем разница? Помните, я рассказывал, что работа с объектами в Smalltalk основана на посылке сообщений. Объект посылает любое сообщение другому объект, а тот может его обработать или переслать другому объекту. Посылка сообщения - это фактически вызов метода, но с той разницей, что мы можем обработать вызов "метода, которого нет" или динамически добавить новый, ибо все происходит в Runtime. А вот в С++ все методы строго определяются классом и полагаются на статический анализ в Compiletime.



Это что получается, в Objective C можно динамически добавлять новые методы существующим классам, обрабатывать методы которых нет и прочие радости? Да. В этом плане Objective C значительно более гибкий, нежели С++. Но это еще не все: Objective C вводит понятие интерфейсов (протоколы) и расширение существующих классов (категории).



Еще одно отличие, что все объекты в Objective C всегда размещаются в куче и передаются по указателю. Более того, для управления памятью используется автоматическая модель на основе счетчиков ссылок (Arc). С одной стороны - это очень удобно и надежно, а с другой еще и быстро.



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



И так случилось, что С++ "пошел в мир", где обрел огромную популярность, а Objective C нашел главного потребителя в лице компании NextStep, а после её покупки компанией Apple стал основным языком для разработки ПО во всех инфраструктуре Apple. С другой стороны, в 2014 году Apple презентовали свой новый ЯП Swift, который стал современным идеологическим наследником Objective C, а самое главное - имел совместимость с кодом написанным на Objective C (например, вы можете использовать классы Objective C в Swift и наоборот).



Кстати, помимо языка Objective C существует также Objective J. Это транслируемый в JS язык, который добавлял ОО модель и синтаксис из Objective C в JS. Сейчас это может показаться странным, но во времена до ES2015 пользование классами в JS было весьма неудобно, что данный проект и лечил. ЯП использовался для преобразования Apple приложений в Web приложения.



А на этом сегодня все. Всем базы! 💪