Objective-C для программистов C++

 

Objective-C для программистов C++



Перевод серии статей David Chisnall «Objective-C for C++ Programmers»: Часть первая, часть вторая, часть третья



Автор перевода: n0xi0uzz

Источник: <a href=«netsago.org/ru/docs/1/15/» mce_href=«netsago.org/ru/docs/1/15/»>netsago.org



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





В отличие от C++, Objective-C — это расширенный набор C. Каждая программа, написанная на C, является корректной программой Objective-C. Все новые ключевые слова в Objective-C начинаются с символа @, который не является корректным идентификатором C.



Система рантайма



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



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



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

 


  • Вызовет функцию C для поиска функции,