Текущий выбор: lua-jit. Впечатляющие тесты, я привык к синтаксису. Написание высокопроизводительного ABI потребует тщательного рассмотрения того, как я буду структурировать свой С++.
Другие интересующие вопросы
- Gambit-C и Guile как встраиваемые языки
- Советы по оптимизации Lua (есть возможность запуска с отключенным сборщиком и вызов коллектора в конце прогона обработки ) всегда является опцией).
Фон
Я работаю над системой обработки событий большого объема (сложной) в реальном времени. У меня есть DSL, который представляет схему структуры событий в источнике, формат хранения, определенные специфические для конкретного домена конструкции, запуск внутренних событий (для структурирования и обработки общего назначения диска) и кодирование определенных шагов обработки, которые всегда происходят.
DSL выглядит довольно похоже на SQL, infact Я использую berkeley db (через интерфейс sqlite3) для долгосрочного хранения событий. Важная часть здесь заключается в том, что обработка событий выполняется на основе набора, например SQL. Я пришел к выводу, что я не должен добавлять логику обработки общего назначения в DSL, а скорее внедрять lua или lisp, чтобы позаботиться об этом.
В ядре обработки встроен arround boost:: asio, он многопоточен, rpc выполняется через буферы протоколов, события закодированы с использованием библиотеки протокола IO протокола --ie, события не структурированы с использованием объекта буфера протокола, который они используют одна и та же библиотека кодирования/декодирования. Я создам объект набора данных, который содержит строки, очень похожие на то, как хранит механизм базы данных в наборах памяти. этапы обработки в DSL будут рассмотрены сначала, а затем представлены логике обработки общего назначения.
Независимо от того, какая среда встраиваемых скриптов я использую, каждый поток в моем ядре обработки, вероятно, нуждается в его собственной среде embedded-language-среды (так как lua требует, чтобы это было, по крайней мере, если вы выполняете многопоточную работу).
Вопрос (ы)
Выбор в данный момент находится между lisp ECL и lua. Помня о том, что производительность и пропускная способность являются сильным требованием, это означает, что минимальное выделение памяти очень желательно:
-
Если бы вы были в моем положении, какой язык вы бы выбрали?
-
Существуют ли какие-либо альтернативы, которые я должен рассмотреть (не предлагайте языки, которые не имеют внедряемой реализации). Возможно, Javascript v8?
-
Помогает ли lisp соответствовать домену? Я не думаю, что lua и lisp отличаются друг от друга тем, что они предоставляют. Вызовите меня: D
-
Есть ли какие-либо другие свойства (например, ниже), о которых я должен думать?
-
Я утверждаю, что любая форма встроенной базы данных IO (см. пример DSL ниже для контекста) затмевает вызов языка сценариев на порядки, и что выбор или не приведет к увеличению накладных расходов на общую пропускную способность. Я на правильном пути?: D
Желаемые свойства
-
Я хотел бы сопоставить свой набор данных в списке lisp или lua, и я хотел бы свести к минимуму избыточные копии данных. Например, добавление строки из одного набора данных в другой должно пытаться использовать ссылочную семантику, если обе таблицы имеют одинаковую форму.
-
Я могу гарантировать, что набор данных, который передается как вход, не изменится, пока я сделал вызов lua/ lisp. Я хочу, чтобы lua и lisp принудительно не изменяли набор данных, если это было возможно.
-
После завершения встроенного вызова наборы данных должны быть уничтожены, любые созданные ссылки должны быть заменены копиями (я думаю).
Пример DSL
Я присоединяю DSL для удовольствия от просмотра, чтобы вы могли понять, чего я пытаюсь достичь. Примечание. DSL не показывает обработку общего назначения.
// Derived Events : NewSession EndSession
NAMESPACE WebEvents
{
SYMBOLTABLE DomainName(TEXT) AS INT4;
SYMBOLTABLE STPageHitId(GUID) AS INT8;
SYMBOLTABLE UrlPair(TEXT hostname ,TEXT scriptname) AS INT4;
SYMBOLTABLE UserAgent(TEXT UserAgent) AS INT4;
EVENT 3:PageInput
{
//------------------------------------------------------------//
REQUIRED 1:PagehitId GUID
REQUIRED 2:Attribute TEXT;
REQUIRED 3:Value TEXT;
FABRRICATED 4:PagehitIdSymbol INT8;
//------------------------------------------------------------//
PagehitIdSymbol AS PROVIDED(INT8 ph_symbol)
OR Symbolise(PagehitId) USING STPagehitId;
}
// Derived Event : Pagehit
EVENT 2:PageHit
{
//------------------------------------------------------------//
REQUIRED 1:PageHitId GUID;
REQUIRED 2:SessionId GUID;
REQUIRED 3:DateHit DATETIME;
REQUIRED 4:Hostname TEXT;
REQUIRED 5:ScriptName TEXT;
REQUIRED 6:HttpRefererDomain TEXT;
REQUIRED 7:HttpRefererPath TEXT;
REQUIRED 8:HttpRefererQuery TEXT;
REQUIRED 9:RequestMethod TEXT; // or int4
REQUIRED 10:Https BOOL;
REQUIRED 11:Ipv4Client IPV4;
OPTIONAL 12:PageInput EVENT(PageInput)[];
FABRRICATED 13:PagehitIdSymbol INT8;
//------------------------------------------------------------//
PagehitIdSymbol AS PROVIDED(INT8 ph_symbol)
OR Symbolise(PagehitId) USING STPagehitId;
FIRE INTERNAL EVENT PageInput PROVIDE(PageHitIdSymbol);
}
EVENT 1:SessionGeneration
{
//------------------------------------------------------------//
REQUIRED 1:BinarySessionId GUID;
REQUIRED 2:Domain STRING;
REQUIRED 3:MachineId GUID;
REQUIRED 4:DateCreated DATETIME;
REQUIRED 5:Ipv4Client IPV4;
REQUIRED 6:UserAgent STRING;
REQUIRED 7:Pagehit EVENT(pagehit);
FABRICATED 8:DomainId INT4;
FABRICATED 9:PagehitId INT8;
//-------------------------------------------------------------//
DomainId AS SYMBOLISE(domain) USING DomainName;
PagehitId AS SYMBOLISE(pagehit:PagehitId) USING STPagehitId;
FIRE INTERNAL EVENT pagehit PROVIDE (PagehitId);
}
}
Этот проект является компонентом исследовательского проекта Ph.D и является/будет свободным программным обеспечением. Если вы заинтересованы в работе со мной (или вносите вклад) в этот проект, оставьте комментарий: D