Мне просто любопытно, компилируется ли Objective-C в код C или среда выполнения Objective-C работает как слой абстракции над программой? Заранее извините, если не знаю о чем говорю!
Как компилируется Objective-C?
Ответы (3)
Компиляция Objective-C в C не имеет смысла, потому что тогда потребуется разобрать код C и скомпилировать его.
Objective-C компилируется в машинный код. Помните, что язык (Objective-C, C, C++) только определяет правила для правильного написания кода. Компилятор проверяет правильность вашего кода и компилирует его, т. е. переводит в исполняемый код.
Кроме того, не путайте язык Objective-C и среду выполнения Objective-C. Язык определяет синтаксис, среда выполнения позволяет запускать скомпилированный код (как вы говорите, это слой, но он не компилируется каждый раз с вашей программой).
РЕДАКТИРОВАТЬ:
Среда выполнения реализует основное поведение компьютерного языка. Среда выполнения содержит скомпилированный код функций подобно библиотеке. В C, например, когда вы вызываете printf()
, ваш код компилируется в машинный код и связывается с библиотекой, содержащей реализацию этой функции; что делает этот машинный код, так это передает параметры в исполняемый код в библиотеке.
Небольшой урок истории:
И C++, и Objective C изначально начинались как препроцессоры для C. Таким образом, вы набирали свой код ObjC, и он эффективно выполнял поиск и замену по коду и переводил команды Objective-C в прямой код C, который использовал немного вспомогательная библиотека (вещи в objc/runtime.h и подобных файлах).
По мере того, как язык становился все более сложным, он был преобразован в полноценный синтаксический анализатор, который заменял/расширял синтаксический анализатор в компиляторе C на один, специфичный для Objective-C. Таким образом, хотя было бы вполне возможно скомпилировать Objective-C в чистый C, современные компиляторы ObjC больше не делают этого.
objc_msgSend()
реализован как вызов функции, как это происходит в наши дни, то да, действительно нет способа перенаправить параметры функции с использованием прямого C. Тем не менее, по-прежнему вполне возможно написать генератор кода, который по существу вставляет содержимое of objc_msgSend()
в месте, где находится вызов вашего метода, а затем просто вызывает IMP напрямую с правильными параметрами и подписью.
- person uliwitness; 22.07.2015
Если говорить строго из Xcode, код компилируется компилятором LLVM. Здесь приведена дополнительная информация о компиляторе LLVM. Вы сможете найти дополнительную информацию о том, как работает компилятор LLVM, в Интернете с помощью простого поиска в Google.