Objective C действительно скомпилирован? Разве это больше не похоже на среду выполнения Visual Basic / .NET? Тогда что мешает ему быть переносимым на другие платформы? - PullRequest
5 голосов
/ 31 декабря 2010

Синтаксически это надмножество C. Но поскольку сообщения отправляются и обрабатываются во время выполнения, это означает, что это не может быть чисто скомпилированный язык, такой как c, но ему требуется среда выполнения, например Visual Basic или .Net.

не позволяет переносить его на другие платформы, превращая эту среду выполнения во что-то вроде .NET Framework или Java JVM?

Примечание: когда я говорю VB, это, конечно, последняя версия 6, которая компилируется в байт-код, так почему вы делаете видJava или .Net принципиально отличаются от VB6, за исключением переносимости, это тот же принцип: см. Как и в Java, Visual Basic скомпилирован в промежуточный язык, называемый «байт-код».Байт-код переводится на машинный язык x86 модулем времени выполнения Visual Basic.

Подробнее: http://www.answers.com/topic/visual-basic#ixzz19iJd3wjA

Подобно Java, Visual Basic скомпилирован в промежуточный язык, называемый "байткод «.Байт-код переводится на машинный язык x86 модулем времени выполнения Visual Basic.

Ответы [ 3 ]

15 голосов
/ 31 декабря 2010

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

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

Кроме того, ничто не мешает вам построить систему передачи сообщений поверх языка, который не поддерживает ее по сути. Поскольку это чрезвычайно распространено (особенно для программ, написанных для платформ, управляемых событиями), его интеграция в язык может рассматриваться как простой вывод некоторой подверженной ошибкам занятой работы из высокоуровневого кода, а также в язык и среду выполнения.

Наконец, и Java, и большинство языков .NET фактически скомпилированы - они просто компилируются в байт-код, который ни одна машина не реализует изначально, что требует использования Виртуальной машины для их фактического выполнения. Самые производительные виртуальные машины компилируют код снова перед его выполнением - это может быть настолько эффективным методом, что он использовался для построения быстрых и эффективных цепочек инструментов компилятора !

Visual Basic здесь - красная сельдь - некоторые версии интерпретируются, другие компилируются , а VB.NET - как и другие языки .NET - компилируется в байт-код, а затем снова JIT-компилируется во время выполнения ( хотя внешне схоже, это имеет тенденцию быть реализованным очень по-другому от более ранних виртуальных машин VB). Если ничего другого, это должно сказать вам, что язык и средства, с помощью которых программы, написанные на нем, выполняются, не так тесно связаны, как это принято считать ...

В ответ на ваш последний вопрос : Objective-C никогда не был не переносимым, по крайней мере в том смысле, что C переносим (то есть переносимость исходного кода) ). Apple использует компилятор GCC , который был перенесен на головокружительный массив платформ ... Однако, как только вы начнете использовать API-интерфейсы для платформ (вероятно, это одна из лучших причин для использования Obj-C на Платформы Apple для начала ...) вы ограничены платформами, которые реализуют эти API . Двоичная переносимость теоретически возможна, но я не знаю ни одной реализации.

13 голосов
/ 31 декабря 2010

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

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

Objective-C предоставляется в качестве внешнего интерфейса для GCC, поэтому он очень переносим. Однако только OSX и его предшественник NextSTEP и iOS имеют API OS, для которого Objective-C является предпочтительным языком (то есть языком, на котором написан API OS). Поэтому, хотя его можно использовать в любой ОС, поддерживающей GCC, его полезность на таких платформах ограничена.

4 голосов
/ 31 декабря 2010

Но поскольку сообщения отправляются и обрабатываются во время выполнения, это означает, что речь идет о чисто скомпилированном языке, таком как c

Почему бы и нет?Вы можете отправлять и обрабатывать сообщения на скомпилированном языке, скомпилированный язык может также обеспечивать рефлексию и динамически отправлять вызовы, если это потребуется.

Obj-C, реализованный в OSX / iOS, скомпилирован в nativeкод. Вот небольшое введение в среду выполнения Obj-C, вот другое

...