|
|
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Моё приложение имеет API, написанный на C++. Реализована возможность использования произвольно загружаемых расширений (C++), написанных с использованием этого API. Однако я хочу, чтобы присутствовала возможность создавать расширения не только на C++, но и на JavaScript, .Net, Lisp и Haskell. На данный момент реализация этого видится мне так: для достижения обозначенной цели потребуется вручную писать wrappers (обёртки) для базового API, написанного на C++ под каждый из этих языков (ну, или почти под каждый, если не удастся воспользоваться чем-то вроде SWIG . Это достаточно трудоёмкий процесс... Однако мне хотелось бы, чтобы оболочки получались как можно более общими и абстрактными, дабы сводить к минимуму необходимость их редактирования после каждого изменения базового API. Т.е. чтобы из оболочек можно было бы вызывать любую функция базового API по её имени. В этом случае при добавлении новый функций в базовый API они автоматически становились бы доступны и обёрткам. Например, программа AutoCAD имеет базовый API, написанный на C++, но расширения для этого приложения можно писать и на др. языках (LISP, VBA, .NET, JavaScript), т.к. под них присутствуют дополнительные API, реализованные (как я понимаю) в виде обёрток над базовым API). Меня интересуют ссылки на материал о том, как обозначенную задачу решать наиболее рационально (т.е. интересует описание архитектуры решения посредством использования тех или иных паттернов) с обозначениями плюсов и минусов того или иного варианта решения. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2015, 16:37 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
Compositum, можно скачать исходники blender - и посмотреть как там сделана увязка с python ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2015, 19:16 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
Есть два метода это сделать. - Многие реализации скриптовых языков уже умеют встраиваться. Надо брать документацию на транслятор желаемого языка и читать как это делать. http://perldoc.perl.org/perlembed.html https://docs.python.org/2/extending/embedding.html https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine и тд. Искать по словам <language> embed В плюсах: это очень легко делается и ты получаешь полную, правильную реализацию этого языка. В минусах это отдельная реализация которую ты можешь только частично контролировать (читай макро-вирусы). И тебе придется таскать за собой весь транслятор этого языка. Последнее не важно если ты используешь wscript на винде или перл/питон на никсах, но.... - Сделать свою собственную версию языка. Читай Драконью Книгу. И если у тебя хост на С++, то изучай bison. Это намного более трудный путь, но в итоге он дает более лучший результат. Больший контроль над пользовательским кодом, возможность слегка (или не слегка) отступить от стандартного синтаксиса если он идет в разрез с нуждами основного приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2015, 04:58 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
Благодарю за ответы! Буду читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2015, 11:18 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
На прошедшей FPCONF был доклад о том, как на Haskell свой EDSL замутить. И упоминалось, что на Hackage можно поискать реализации для JavaScript и прочего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 09:09 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
CompositumНа данный момент реализация этого видится мне так: для достижения обозначенной цели потребуется вручную писать wrappers (обёртки) для базового API, написанного на C++ под каждый из этих языков (ну, или почти под каждый, если не удастся воспользоваться чем-то вроде SWIG . Это достаточно трудоёмкий процесс... Однако мне хотелось бы, чтобы оболочки получались как можно более общими и абстрактными, дабы сводить к минимуму необходимость их редактирования после каждого изменения базового API. Т.е. чтобы из оболочек можно было бы вызывать любую функция базового API по её имени. В этом случае при добавлении новый функций в базовый API они автоматически становились бы доступны и обёрткам. Я-бы рассмотрел такой вариант. Wrappers API описывается на собственном DSL(типа JSON). Далее для каждого языка или платформера или протокола формируются свои "переходники" в зависимости от контента DSL. Я не знаю как работает SWIG. Нечитал. Возможно он это реализует. Но вобщем в задаче могут быть нюансы (тысячи их) способные похоронить заживо любой DSL или SWIG просто в силу специфики процесса сборки. Или в силу того что команда или разработчик не в состоянии (или не мотивированы) поддерживать многочисленные DSL-плагины. Вобщем всё это ситуативно и тут и треда не хватит чтобы обговорить и обгрызть все нюансы. Надо смотреть на макете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 13:13 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
maytonЯ-бы рассмотрел такой вариант. Wrappers API описывается на собственном DSL(типа JSON).ээээ? Единственная расшифровка DSL (EDSL) которая подходит в тему топика это (Embedded) Domain Specific Language. Это просто определение семейства языков. Что у него общего с JSON (который есть формат хранения данных)? maytonИли в силу того что команда или разработчик не в состоянии (или не мотивированы) поддерживать многочисленные DSL-плагины.А зачем разработчикам их поддерживать??? Это юзера делают себе плагины и сами их поддерживают. Разработчики то тут зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 15:44 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
White Owl, я не буду спорить. Тут нет спора. Есть просто более широкое или более узкое толкование DSL или JSON. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 16:01 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
maytonWhite Owl, я не буду спорить. Тут нет спора. Есть просто более широкое или более узкое толкование DSL или JSON.Так я разве прошу спорить? Я прошу объяснить. Я довольно много работал со встраиваемыми языками. И использовал их и себе встраивал. Но я ни разу не использовал JSON для этой задачи. И вообще я не очень хорошо понял твой пост. Может я пропустил какой-то пласт этой проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 17:26 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
Скорее я пропустил какой-то идейный аспект. Ты пишешь авторЧто у него общего с JSON (который есть формат хранения данных)? Да я не против того что JSON - это формат хранения данных. Теперь по поводу DSL. Давай дадим определение DSL и проведём границу. Отметим где заканчивается DSL и начинается хранилище данных. Для меня это затруднительно. Я не могу провести такую границу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 17:41 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
maytonТеперь по поводу DSL. Давай дадим определение DSL и проведём границу. Отметим где заканчивается DSL и начинается хранилище данных. Для меня это затруднительно. Я не могу провести такую границу. ааааа.... понял.... почти.... я не знаю о каком DSL ты думал, но: DSL - Domain Specific Language - язык рассчитанных на какую-то узкую задачу. По существу это не отдельный язык, это группа языков. Вот есть языки общего назначения, а есть специализированные языки. Вот эти специализированные и обозначают иногда как "DSL". Причем почти все узкоспециализированные языки первоначально изобретенные для обработки какого-то конкретного типа данных или алгоритмов в последствии расширялись и становились языками общего назначения. Классический пример - Perl, придуман для обработки текстов, стал применяться везде. Есть и обратные тенденции: Lua - придуман как язык общего назначения, но используется почти исключительно как макро-язык. Но в общем случае DSL это просто краткое обозначение специализированных языков. Это не грамматика и не формат, и уж тем более это не конкретный метод создания языка. Слегка возвращаясь к теме топика: У Compositum уже есть некая программа которая решает какую-то конкретную задачу при этом манипулируя какими-то конкретными объектами. Он хочет дать конечным пользователям возможность управлять этими объектами не только по алгоритмам которые он уже как разработчик придумал, а по алгоритмам придуманных самими пользователями. Самое простое и удобное в этом случае - встроить в главную программу средства управлять объектами программы посредством какого-либо внешнего языка, не требующего полной пересборки главной программы. Вывод: Compositum либо встроит в свою программу один из языков общего назначения, либо придумает на их основе свой собственный язык. Целью и единственными возможностями этого языка будет оперирование объектами основной программы. В этом случае, язык который Compositum придумает можно будет считать за DSL, с доменом - эта самая основная программа. Хотя если быть совсем точным, то в этом случае язык который придумает Compositum надо будет называть EDSL (Embeded - встроенный). Можно ли хранить программу на DSL в JSON? Конечно можно. Можно ли хранить ее виде простого текстового файла? Да кончено. Можно ли написать пару компилятор-линкер конкретно для этого специализированного языка и загружать в основную программу бинарные файлы? Да запросто! Вот это и есть граница между DSL и JSON - это совершенно разные, независимые и непересекающиеся вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 18:25 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
White Owlлибо встроит в свою программу один из языков общего назначения Это был бы самый предпочтительный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 18:29 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
SQL мы все применяем. Так што... все понемногу DSL-щики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 19:11 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
maytonSQL мы все применяем. Так што... все понемногу DSL-щики.Да. Практически все языки или были когда-то или есть узко специализированные. Си был языком для разработки одной конкретной операционной системы. С++ был языком призванным заменить Си. Паскаль - для обучения студентов. Дельфи для разработки клиентов к базе данных на Оракле.... И так далее и так далее... По существу каждый новый язык разрабатывается для какой-то конкретной ниши. Существующие языки в данной конкретной нише показались человеку неудобными - он берет и придумывает новый ЯП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 19:24 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
White OwlДельфи для разработки клиентов к базе данных на Оракле.... Знатоки говорят-де был Oracle Forms непревзойденным. Я видел его в эксплуатации. Но сам не кодил. Поэтому не могу особо ничего добавить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 19:41 |
|
||
|
встраиваемый язык для программного доступа к объектам приложений
|
|||
|---|---|---|---|
|
#18+
CompositumWhite Owlлибо встроит в свою программу один из языков общего назначения Это был бы самый предпочтительный вариант. ну так выбирай наиболее подходящий и встраивай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 20:09 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39034804&tid=1340947]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
157ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 477ms |

| 0 / 0 |
