Как компилируется Objective-C?

Мне просто любопытно, компилируется ли Objective-C в код C или среда выполнения Objective-C работает как слой абстракции над программой? Заранее извините, если не знаю о чем говорю!


person user3318845    schedule 06.03.2014    source источник
comment
Да. И нет. Может быть. Я никогда не разбирал его на части, но концептуально это препроцессор C в сочетании с огромным количеством поддержки во время выполнения. Я думаю, что на практике они интегрировали некоторые функции в компилятор C.   -  person Hot Licks    schedule 06.03.2014


Ответы (3)


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

Objective-C компилируется в машинный код. Помните, что язык (Objective-C, C, C++) только определяет правила для правильного написания кода. Компилятор проверяет правильность вашего кода и компилирует его, т. е. переводит в исполняемый код.

Кроме того, не путайте язык Objective-C и среду выполнения Objective-C. Язык определяет синтаксис, среда выполнения позволяет запускать скомпилированный код (как вы говорите, это слой, но он не компилируется каждый раз с вашей программой).

РЕДАКТИРОВАТЬ:
Среда выполнения реализует основное поведение компьютерного языка. Среда выполнения содержит скомпилированный код функций подобно библиотеке. В C, например, когда вы вызываете printf(), ваш код компилируется в машинный код и связывается с библиотекой, содержащей реализацию этой функции; что делает этот машинный код, так это передает параметры в исполняемый код в библиотеке.

person Merlevede    schedule 06.03.2014
comment
Если Objective-C компилируется в машинный код, зачем ему среда выполнения? Не может ли он запускаться напрямую от процессора? - person user3318845; 07.03.2014
comment
user3318845, среда выполнения не является виртуальной машиной. Objective-C действительно работает непосредственно на процессоре. Среда выполнения больше похожа на стандартную библиотеку, которая реализует такие вещи, как быстрый код для поиска метода. Так что это больше похоже на стандартную библиотеку C, просто она занимается только реализацией шаблонов проектирования, обычно необходимых для объектно-ориентированного программного обеспечения. Эта статья может помочь прояснить ситуацию: orangejuiceliberationfront.com/runtime-time - person uliwitness; 07.03.2014
comment
Objective-C, как и любой другой язык, компилируется в машинный код. И во что компилируется Java? - person JohnK; 26.07.2017
comment
@JohnK Ты прав!!!! Я отредактирую свой ответ. Спасибо что подметил это. - person Merlevede; 27.07.2017
comment
@Merlevede Привет, ты говоришь, что компилятор просто компилирует OC в машинный код напрямую, но в ответ меня смущает. stackoverflow.com /вопросы/44561285/ - person merito; 01.08.2017

Небольшой урок истории:

И C++, и Objective C изначально начинались как препроцессоры для C. Таким образом, вы набирали свой код ObjC, и он эффективно выполнял поиск и замену по коду и переводил команды Objective-C в прямой код C, который использовал немного вспомогательная библиотека (вещи в objc/runtime.h и подобных файлах).

По мере того, как язык становился все более сложным, он был преобразован в полноценный синтаксический анализатор, который заменял/расширял синтаксический анализатор в компиляторе C на один, специфичный для Objective-C. Таким образом, хотя было бы вполне возможно скомпилировать Objective-C в чистый C, современные компиляторы ObjC больше не делают этого.

person uliwitness    schedule 06.03.2014
comment
Если вы когда-нибудь читали оригинальную книгу Брэда Кокса, вы бы знали, что это не совсем так. Диспетчер не может быть написан на C и требует особого приема. - person david.pfx; 08.03.2014
comment
Какой аспект не будет хорошо компилироваться в C? Я написал несколько сред выполнения OO и реализовал свои собственные языки программирования, некоторые из них очень похожи на Smalltalk/ObjC, и я не могу навскидку придумать что-то невозможное. Конечно, я могу придумать множество оптимизаций, которые вы могли бы добавить, но которые нельзя было бы сделать в C, и текущие ABI раскрывают некоторые из этих деталей, поэтому вы не можете быть совместимы с ними, но что касается создания чего-либо. который берет текущие исходные файлы ObjC и выводит исходные файлы C, которые делают то же самое, я не понимаю, почему это было бы невозможно. - person uliwitness; 08.03.2014
comment
Да, я тоже, и хотя я читал книгу давно, я помню, что она звучала правдоподобно. Диспетчер сообщений IIRC не преобразуется в какую-либо стандартную конструкцию C, а различные варианты (переключатель, указатели fn, varargs и т. д.) просто не соответствуют действительности. В любом случае компилятор был намного больше, чем просто «поиск и замена», но это была вспомогательная библиотека, которая нуждалась в этом особом волшебстве. - person david.pfx; 08.03.2014
comment
Я предполагаю, что если objc_msgSend() реализован как вызов функции, как это происходит в наши дни, то да, действительно нет способа перенаправить параметры функции с использованием прямого C. Тем не менее, по-прежнему вполне возможно написать генератор кода, который по существу вставляет содержимое of objc_msgSend() в месте, где находится вызов вашего метода, а затем просто вызывает IMP напрямую с правильными параметрами и подписью. - person uliwitness; 22.07.2015

Если говорить строго из Xcode, код компилируется компилятором LLVM. Здесь приведена дополнительная информация о компиляторе LLVM. Вы сможете найти дополнительную информацию о том, как работает компилятор LLVM, в Интернете с помощью простого поиска в Google.

person James Harnett    schedule 06.03.2014