Что делает вложение языка в другой?

Это может быть довольно просто, но … здесь.

Если я решу встроить какой-нибудь язык сценариев, такой как Lua или Ruby, в программу на C ++, связав его интерпретатор, что тогда я могу делать в C ++?

Смогу ли я написать код Ruby или Lua прямо в файл cpp или просто вызвать сценарии из программы?

Если последнее верно, как бы я это сделал?

3

Решение

Поскольку они являются языками сценариев, код всегда будет «интерпретироваться». В действительности, вы не «вызываете» код скрипта внутри вашей программы, а, скорее, когда вы достигаете этой точки, вы выполняете интерпретатор в контексте этого потока (потока, который достигает части сценариев), которая затем читает язык сценариев и выполняет соответствующий машинный код после его интерпретации (JIT-компиляция вроде, но на самом деле компиляция не требуется).

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

Изменить: ответ:

Вы должны написать это сами. Подумайте об этом так: если вы хотите использовать ассемблер в c ++, используйте ключевое слово asm. Затем в компиляторе c ++ необходимо проанализировать исходный файл, получить ключевое слово asm, а затем переключиться на компилятор сборки. Затем компилятор ассемблера должен пройти до конечной скобки области asm и скомпилировать этот код.

Если вы хотите сделать это, это будет немного по-другому, так как сборка компилируется, а не интерпретируется (что вы и хотите делать). Что вам нужно сделать, это изменить используемый вами компилятор (скажем, c ++), чтобы он распознавал ваше собственное пользовательское ключевое слово. Допустим, это ключевое слово scriptX {}. Вам нужно изменить синтаксический анализатор c ++, чтобы, когда он видит scriptX {}, он сохранял все в скобках в разделе данных только для чтения вашей скомпилированной программы. Затем вам нужно добавить хук в файл скомпилированной сборки, чтобы переключить контекст потока на ваш интерпретатор сценариев, и запустить счетчик программы в начале раздела вашего сценария (который вы помещаете в раздел данных только для чтения объектного файла). ,

Удачи с этим…

2

Другие решения

Распространенная причина встраивания языка сценариев в программу — предоставить возможность управления программой с помощью сценариев, предоставляемых конечным пользователем.

Вероятно, самый простой пример такого скрипта — это файл конфигурации. Предположим, что ваша программа имеет параметры и должна запоминать параметры от запуска к запуску. Вы можете записать их в файл в виде двоичного изображения вашей структуры опций, но это будет хрупким, непростым для проверки или редактирования и, вероятно, не переносимым между системами. Написание опций в виде простого текста с какими-то ярлыками, для которых и рассматривается большинство этих жалоб, но теперь вам нужно проанализировать этот текст и восстановить параметры. Затем некоторые пользователи хотят разные варианты по вторникам, хотят сделать простую арифметику для вычисления одного варианта из другого или написать один файл конфигурации, который они могут использовать как в Windows, так и в Linux, и довольно скоро вы обнаружите, что придумываете небольшой язык для выражения всех из этих идей и механизмов с. На данный момент есть лучший способ.

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

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

Lua особенно легко интегрируется. Чтение простого файла конфигурации и извлечение настроек из состояния Lua можно выполнить с помощью небольшого подмножества его C API. Если у вас есть Lua, его можно использовать в других целях. Во многих случаях вы обнаружите, что более продуктивно писать только самые внутренние циклы в C и использовать Lua для склеивания этих функций и предоставления всей «бизнес-логики» приложения. Так реализован Adobe Lightroom, а также много игры на платформах, начиная от простых приставок и заканчивая устройствами на iOS и даже ПК.

1

По вопросам рекламы [email protected]