Интерпретировать скрипты Objective C во время выполнения на iPhone?
Есть ли способ загрузить целевой скрипт c во время выполнения и запустить его для классов / методов / объектов / функций в текущем приложении для iPhone?
ОСНОВНОЕ ПРИМЕЧАНИЕ: Основная причина, по которой я хотел бы сделать это, - позволить мне быстро создать прототип приложения, а затем, после того, как я закончу основную фазу прототипирования, взять сценарии, которые я писал, и скомпилировать их во время сборки. Я никогда не планирую поставлять приложение с объективным интерпретатором c.
Причина, по которой я спрашиваю, заключается в том, что я играл с iPhone wax, интерпретатором lua, который можно встроить в приложение для iPhone, и он работает очень хорошо, в том смысле, что любой объект / метод / функция, который публично доступен в вашей Задаче Код C автоматически соединяется и доступен в lua.
Это позволяет вам быстро создавать прототипы приложений, просто превращая ядро вашего приложения в файлы lua, которые находятся в каталоге документов пользователя. Просто перезагрузите приложение, и вы сможете проверить изменения в ваших файлах lua без необходимости перестраивать приложение в XCode - это экономит много времени!
Но из-за недавнего выпуска SDK 3.1.3 от Apple я подумал, что самым безопасным подходом для быстрого прототипирования такого типа было бы использование Objective C в качестве интерпретируемого кода... Таким образом, в худшем случае вы могли бы просто скомпилируйте его в свое приложение перед выпуском. Я слышал, что исходный код lua можно скомпилировать в байт-код и связать во время сборки, но я думаю, что в конечном итоге безопаснее всего было бы, если исходный код был в цели c, а не в lua. Таким образом, ваш источник всегда в цели c, независимо.
Это заставляет меня задуматься (я искал, но ничего не нашел), есть ли примеры того, как встроить интерпретатор Objective C в приложение для iPhone? Это позволило бы вам быстро создать прототип вашего приложения в соответствии с текущими классами, встроенными в ваш двоичный файл, и, когда вы собираетесь развернуть приложение, вместо того, чтобы запускать классы через интерпретатор приложения, вы вместо этого скомпилируете их.
С iPad и OS 4 bluetooth и виртуальные клавиатуры могут работать с iPhone и iPad... Это сделает быстрое создание прототипов гораздо более полезным, по крайней мере, на время разработки. Если у вас есть встроенный в ваше приложение переводчик, например, на вашем iPad, вы можете кодировать его, находясь в дороге, без XCode. И для меня самый полезный способ вернуть исходный код в "одобренное яблоком" состояние было бы, если бы сценарии были Objective C.
8 ответов
Существует базовый интерпретатор Objective-C:
Проверьте сообщение:
Существует ли интерпретатор Objective-C для Mac?
Также:
http://forrst.com/posts/Beginnings_of_a_Objective_C_Interpreter-Tdl
Objective-C - это на самом деле просто C со средой выполнения и некоторым синтаксическим сахаром. Это изначально скомпилированный язык (я не думаю, что есть готовые к использованию интерпретаторы для C, хотя я могу ошибаться).
В XCode раньше была функция ZeroLink для ускорения времени компиляции, но она была удалена в XCode 3, потому что она вызывала слишком много ошибок.
Это не совсем невозможно, но это будет недостаточно просто, чтобы того стоить. Objective-C обычно не интерпретируемый язык. Это не является непреодолимым - интерпретация и компиляция - это просто выбор реализации в большинстве случаев. Например, Ruby традиционно считается интерпретируемым языком сценариев, но MacRuby компилирует его в код, аналогичный тому, который производит Objective-C. Так что можно было бы написать интерпретатор для Objective-C, но никто этого не сделал. Вы должны написать это сами.
Кроме того, правила запрещают переводчиков, кроме Apple Javascript. До сих пор это никому не было навязано, но если вы пытаетесь быть очень прямой стрелкой, интерпретируемый код, к сожалению, тоже отсутствует.
Ну, есть пара полезных моментов, которые нужно затронуть:
- Зачем интерпретировать код Objective-C, когда вы можете его скомпилировать? Я понимаю идею "быстрого прототипирования", но отчасти это объясняется, например, в Lua, потому что Lua гораздо более краткий язык, чем Objective-C. Я не знаю, будет ли толкование Objective-C таким же бонусом.
- Если вы хотите иметь плагины или динамически загружаемые модули в своем приложении, вы всегда можете скомпилировать их как отдельный пакет и загрузить их, используя
NSBundle
или аналогичный механизм. - Несмотря на все сказанное, я не знаю ни одного переводчика Objective-C. Вы, вероятно, должны написать свой собственный. Я не уверен, будет ли это нарушать правила Apple или нет: это все равно будет код Objective-C, но я подумал, что у них тоже есть правила против интерпретируемого кода. (Я предполагаю, что они никогда не предполагали гипотетический сценарий, в котором интерпретируется Objective-C.)
Вы должны взглянуть на Cycript. Вы можете подключиться к приложениям, заменить методы на лету, изменить переменные, вы-имя-это. Это гибридный язык между Objective-C и JavaScript. Вам нужно сделать джейлбрейк вашего iDevice, чтобы установить его.
Ch - коммерческий интерпретатор C/C++. Это сделано компанией под названием SoftIntegration.
Не на IPhone, а на симуляторе, вы можете сделать это с
Инструмент динамического ввода кода
http://dyci.github.com/
Есть также еще один инструмент, который работает немного по-другому, но допускает ту же функциональность
http://injectionforxcode.com/
Посмотрите на документацию для objc_msgSend()
и другие части Objective-C Runtime Reference. Вы можете по существу разобрать текст и отправить его во время выполнения.