Америка не унывает
Заразили меня американские партнеры своей энергией. Вот ведь неунывающие люди! Работают по 60-75 часов в неделю и не боятся, что может и вообще ничего не выйти. За быструю разработку программ в американских коммпаниях начисляется бонус. Определенно, я его заслуживаю, поскольку предлагаю новую программную связку
Delphi + Erlang
Я долго писал серверные программы на Object Pascal. Есть определенная методика, как все сделать быстро, качественно, чтобы не было утечек и прочее. Простой сервер на TCP изготовляю, скажем, за пару часов – все чин-чинарем, сервис Windows, каждому подключению – свой поток, встроенный маршаллинг и прочее. Но все эти высокие скоростные показатели – ничто, если Вы пишете на Эрланг! Там реализация сервера – вопрос единиц минут!
Delphi очень хороша для написания визуальных интерфейсов. Я не говорю, что C# или Java плохи. Да и в Erlang есть визуальные средства, начиная с последней версии – даже очень неплохие. Ладно. Главное, что я хочу сказать – вы можете разработать визуальное приложение тоже за несколько минут. Дык чуваки!!!
Если надо написать и клиента и сложный сервер со встроенной кластеризацией и прочими вкуснятиной, связка Delphi + Erlang = реальный шанс сделать все быстро!
Интероперабельность
Ах да, форматы. Я подумал за Вас и написал КОНВЕРТЕР Delphi <-> Erlang. (Напишите мне на killy@newmail.ru и я Вам его пришлю). Этот же конвертер пригодиться Вам, если Вы будете писать, скажем, драйвер для Erlang на Паскале. Я вовсе не говорю, что C++ – плохой язык. В тех местах, где требуется особенно высокое быстродействие, я всегда драйвера пишу на C. Как выглядит код взаимодействия <<Вставить ссылочку на код>>.
Все тонкие моменты маршаллинга я учел :
- оптимизация передачи списков целых <=255 (принимаются как строка)
- новый и старый форматы float
- передача хвоста списка
Что Вам надо сделать, чтобы передать данные ИЗ Паскаля:
MarshalledData := Marshall(..данные тупла тут...); cbNetLen := RevertCardinal(Length(MarshalledData); Socket.Write(cbNetLen, SizeOf(Cardinal)); Socket.Write(Pointer(MarshalledData)^, Length(MarshalledData));
Т.е. маршаллим данные, берем длину буфера, переворачиваем ее в сетевой формат (RevertCardinal = htonl), посылаем. Вдогонку – буфер.
Если мы укажем в проге на Эрланг режим сокета [active, {packet,4}],
каждой нашей посылке будет соответстовать одно сообщение в Erlang – нам не надо самим собирать пакет! Все, что нам нужно, это сделать так:
handle_info({tcp, Socket, Data}, State)->;
MyTerm=binary_to_term(Data),
some_processing(MyTerm),
{noreply, State}.
УСЕ!
Мне вштырило. Раньше я писал проги за часы, теперь – за минуты. Качественный клиент с профессиональными компонентами (dx, скажем), и качественный сервер – OTP-compliant. Мне премия!