Интерпретировать скрипты Objective C во время выполнения на iPhone? - PullRequest
6 голосов
/ 27 апреля 2010

Есть ли способ загрузить целевой скрипт c во время выполнения и запустить его для классов / методов / объектов / функций в текущем приложении для iPhone?

ОСНОВНОЕ ПРИМЕЧАНИЕ: Основная причина, по которой я хотел бы это сделать, - позволить мне быстро создать прототип приложения, а затем, после того как я закончу основную фазу прототипирования, взять скрипты, которые я писал, и компилировали их во время сборки. Я никогда не планирую поставлять приложение с объективным интерпретатором c.

Причина, по которой я спрашиваю, заключается в том, что я играл с iPhone wax , интерпретатором lua, который можно встроить в приложение для iPhone, и он работает очень хорошо, в том смысле, что любой объект / метод / функция, которые публично доступны в вашем коде Objective C, автоматически соединяются и доступны в lua.

Это позволяет вам быстро создавать прототипы приложений, просто превращая ядро ​​вашего приложения в файлы lua, которые находятся в каталоге документов пользователя. Просто перезагрузите приложение, и вы сможете проверить изменения в ваших файлах lua без необходимости перестраивать приложение в XCode - это значительно сэкономит время!

Но, учитывая недавние SDK от Apple, 3.1.3, я подумал, что самый безопасный подход для выполнения этого типа быстрого прототипирования был бы, если бы вы могли использовать Objective C в качестве интерпретируемого кода ... Таким образом, сценарий наихудшего случая вместо этого вы можете просто скомпилировать его в свое приложение перед выпуском. Я слышал, что исходный код lua можно скомпилировать в байт-код и связать во время сборки, но я думаю, что в конечном итоге безопаснее всего было бы, если бы исходный текст был в цели c, а не в lua. Таким образом, ваш источник всегда находится в цели c, независимо от того.

Это заставляет меня задуматься (я искал, но ничего не нашел), есть ли примеры того, как встроить Objective C Interpreter в приложение для iPhone? Это позволило бы вам быстро создать прототип вашего приложения в соответствии с текущими классами, встроенными в ваш двоичный файл, и, когда вы собираетесь развернуть приложение, вместо того, чтобы запускать классы через интерпретатор in app, вы вместо этого скомпилируете их.

С iPad и OS 4 bluetooth и виртуальные клавиатуры могут работать с iPhone и iPad ... Это сделает быстрое создание прототипов гораздо более полезным, по крайней мере, для разработки. Если у вас есть встроенный в ваше приложение переводчик, например, на вашем iPad, вы можете кодировать его, находясь в дороге, без XCode. И для меня самый полезный способ вернуть исходный код в «одобренное яблоком» состояние было бы, если бы сценарии были Objective C.

Ответы [ 8 ]

3 голосов
/ 27 апреля 2010

Это не совсем невозможно, но это не будет достаточно легко, чтобы того стоить. Objective-C обычно не интерпретируемый язык. Это не является непреодолимым - интерпретация и компиляция - это просто выбор реализации в большинстве случаев. Например, Ruby традиционно считается интерпретируемым языком сценариев, но MacRuby компилирует его в код точно так же, как и в Objective-C. Так что можно было бы написать интерпретатор для Objective-C, но никто этого не сделал. Вы должны написать это сами.

Кроме того, правила запрещают переводчиков, кроме Apple Javascript. До сих пор это никому не применялось, но если вы пытаетесь быть очень прямой стрелкой, интерпретируемый код, к сожалению, тоже отсутствует.

3 голосов
/ 27 апреля 2010

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

Xcode раньше имел функцию под названием ZeroLink для ускорения времени компиляции, но удалил ее в Xcode 3, потому что это вызвало слишком много ошибок.

2 голосов
/ 27 апреля 2010

Ну, есть пара полезных моментов, которые стоит затронуть:

  1. Почему интерпретирует код Objective-C, когда вы можете скомпилировать это? Я понимаю идею «быстрого прототипирования», но отчасти это объясняется, например, в Lua, потому что Lua гораздо более краткий язык, чем Objective-C. Я не знаю, будет ли у интерпретации Objective-C такой же бонус.
  2. Если вы хотите, чтобы в вашем приложении были плагины или динамически загружаемые модули, вы всегда можете скомпилировать их как отдельный пакет и загрузить их, используя NSBundle или аналогичный механизм.
  3. Все, что сказано, я не знаю ни одного переводчика Objective-C. Вы, вероятно, должны написать свой собственный. Я не уверен, нарушит ли это правила Apple или нет: это все равно будет код Objective-C, но я думал, что у них есть правила против интерпретируемого кода. (Я предполагаю, что они никогда не предполагали гипотетический сценарий, в котором интерпретируется Objective-C .)
1 голос
/ 30 апреля 2013

Вы должны взглянуть на cycript . Вы можете подключиться к приложениям, заменить методы на лету, изменить переменные, вы-имя-это. Это гибридный язык между Objective-C и JavaScript. Вам потребуется джейлбрейк вашего iDevice, чтобы установить его.

1 голос
/ 07 декабря 2012

Существует базовый интерпретатор Objective-C:

Проверьте объявление:

Существует ли интерпретатор Objective-C для Mac?

Также:

http://forrst.com/posts/Beginnings_of_a_Objective_C_Interpreter-Tdl

1 голос
/ 05 декабря 2012

Не на IPhone, а на симуляторе, вы можете сделать это с
Инструмент для динамического ввода кода
http://dyci.github.com/

Существует также другой инструмент, который работает немного по-другому, но поддерживает те же функции
http://injectionforxcode.com/

1 голос
/ 14 апреля 2011

Ch - коммерческий интерпретатор C / C ++.Это сделано компанией под названием SoftIntegration.

0 голосов
/ 27 апреля 2010

Ознакомьтесь с документацией для objc_msgSend() и другими частями Objective-C Runtime Reference . Вы можете по существу разобрать текст и отправить его во время выполнения.

...