Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.06.07 13:50
Оценка: 86 (6)
На erlang-questions запостили новое сравнение с участием Эрланга, кроме него там участвует C++/CORBA и Glasgow distributed Haskell. Область применения — традиционный телеком. Исследование проводилось в течение 3.5 лет Motorola Software, Systems Engineering Research Group и Heriot-Watt University. По содержанию обе бумаги вроде одинаковы: 1-я, 2-я
Re: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 08.06.07 14:27
Оценка:
Здравствуйте, Курилка, Вы писали:

К>На erlang-questions запостили новое сравнение с участием Эрланга, кроме него там участвует C++/CORBA и Glasgow distributed Haskell. Область применения — традиционный телеком. Исследование проводилось в течение 3.5 лет Motorola Software, Systems Engineering Research Group и Heriot-Watt University. По содержанию обе бумаги вроде одинаковы: 1-я, 2-я


Нафига? Влад же все и так сказал
Re[2]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.06.07 14:31
Оценка: :))) :))) :))) :)
Здравствуйте, Константин Л., Вы писали:

КЛ>Нафига? Влад же все и так сказал


Учитывая объём появляющихся от него сообщений ежедневно есть предположение, что не всё.
Re: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 08.06.07 14:41
Оценка:
Здравствуйте, Курилка, Вы писали:

К>На erlang-questions запостили новое сравнение с участием Эрланга, кроме него там участвует C++/CORBA и Glasgow distributed Haskell. Область применения — традиционный телеком. Исследование проводилось в течение 3.5 лет Motorola Software, Systems Engineering Research Group и Heriot-Watt University. По содержанию обе бумаги вроде одинаковы: 1-я, 2-я


Суперская бумаженция.

Can productivity and maintainability be improved?
Yes, using source lines of code (SLOC) as a metric, both the Erlang
DM and DCC are less than a third of the size of the C++ counterpart
(Table 2). Moreover, much of the Erlang DCC is a reusable generic
server (Table 3). The reasons for the reduced programming effort are that
coding for the successful case saves 27%, high-level communications save
22%, and automatic memory management saves a further 11% (Tables 4
and 5). These productivity results are consistent with other measure-
ments [30], and with developer folklore.


Ну вот, и ответ на вопрос в соседней ветке — чем же именно Эрланг помогает в телекоме.
The reasons for the reduced programming effort are

1) coding for the successful case saves 27%,
Это Эрланговский подход к обработке ошибок — принцип let it crash.

2) high-level communications save 22%,
Это Эрланговская распределенка.

3) and automatic memory management saves a further 11%
А это GC.

Три основных фактора, сокращающий объем кода, и существенно влияющих на сроки разработки. Познавателно поглядеть на раскладку в процентах, сколько занимает defensive code (код обнаружения и корректной обработки ошибок в Эрланге и С++)
Code Type C++ Code RCS C libraries
Application 19.2% 12.1%
Defensive 25.3% 24.2%
Communication 22.1% 5.6%
Memory management 11.3% 7.1%
Type declarations 11.2% 11.6%
Defines 1.1% 23.6%
Includes 8.1% 8.6%
Process management 1.9% 7.1%

Эрланг:
Application 62.2%
Defensive 0.5%
Communication 15.1%
Memory management 0.0%
Type declarations 4.9%
Defines 5.4%
Includes 2.4%
Process management 9.5%

Можно ввести понятие "КПД Языка". Смотрите — у Эрланга прикладная логика 62% кода. У С++ — 19%. Такая вот ерунда, старички.

У языка 1С, правда, этот коэффициент будет около 95% . Как и у любого DSL. Отсюда мораль — DSL, это, в принципе, очень даже хорошо.
Re[3]: Ещё одно сравнение с участием Эрланга
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.06.07 23:41
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Учитывая объём появляющихся от него сообщений ежедневно есть предположение, что не всё.


Да, лучше немного помучиться (с)
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Ещё одно сравнение с участием Эрланга
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.06.07 23:41
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>У языка 1С, правда, этот коэффициент будет около 95% . Как и у любого DSL. Отсюда мораль — DSL, это, в принципе, очень даже хорошо.


Небольшая поправка. 1С — это Жлабэйсик с русифицированным синтаксисом. ДСЛ-я там не ма. Они просто преоставляют готовую библоитеку доступа к предметно-ориентированному хранилищу данных. В общем, Эксес переросток.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.06.07 09:40
Оценка: +3 -2
Здравствуйте, Курилка, Вы писали:

К>На erlang-questions запостили новое сравнение с участием Эрланга, кроме него там участвует C++/CORBA и Glasgow distributed Haskell. Область применения — традиционный телеком. Исследование проводилось в течение 3.5 лет Motorola Software, Systems Engineering Research Group и Heriot-Watt University. По содержанию обе бумаги вроде одинаковы: 1-я, 2-я


Ахринеть. Код:
void DataMobilityRxProcessor::processUnsupVer(void)
{
  MSG_PTR msg_buf_ptr;
  MM_DEVICE_INFO_MSG *msg_ptr;
  RETURN_STATUS ret_status;
  UINT16 msg_size;

  // Determine size of ici message
  msg_size = sizeof( MM_DEVICE_INFO_MSG);

  // Create ICI message object to send to DMTX so it sends a Device Info
  // message to Q1 and Q2 clients
  IciMsg ici_msg_object( MM_DEVICE_INFO_OPC, ICI_DMTX_TASK_ID, msg_size);
 
  // Retrieve ICI message buffer pointer
  msg_buf_ptr = ici_msg_object.getIciMsgBufPtr();
 
  // Typecast pointer from (void *) to (MM_DEVICE_INFO_MSG *)
  msg_ptr = (MM_DEVICE_INFO_MSG *)msg_buf_ptr;
 
  // Populate message buffer
  SET_MM_DEVICE_INFO_DEVICE_TYPE( msg_ptr, SERVER);
  SET_MM_DEVICE_INFO_NUM_VER_SUPPORTED( msg_ptr, NUM_VER_SUPPORTED);
  SET_MM_DEVICE_INFO_FIRST_SUP_PROTO_VERS( msg_ptr, PROTO_VERSION_ONE);
 
  // Send message to the DMTX task
  ret_status = m_ici_io_ptr->send(&ici_msg_object);
 
  // Check that message was sent successfully
  if (ret_status != SUCCESS)
  {
    // Report problem when sending ICI message
    sz_err_msg( MAJOR, SZ_ERR_MSG_ERR_OPCODE, __FILE__, __LINE__,
      "DataMobilityRxProcessor processUnsupVer: failure sending "
      " device info message to DMTX");
  }
}

легко сократить до:
void DataMobilityRxProcessor::processUnsupVer(void)
{
  // Create ICI message object to send to DMTX so it sends a Device Info
  // message to Q1 and Q2 clients
  IciMsg ici_msg_object( MM_DEVICE_INFO_OPC, ICI_DMTX_TASK_ID, sizeof( MM_DEVICE_INFO_MSG));
 
  // Retrieve ICI message buffer pointer
  MM_DEVICE_INFO_MSG * msg_ptr = (MM_DEVICE_INFO_MSG *)ici_msg_object.getIciMsgBufPtr();
 
  // Populate message buffer
  SET_MM_DEVICE_INFO_DEVICE_TYPE( msg_ptr, SERVER);
  SET_MM_DEVICE_INFO_NUM_VER_SUPPORTED( msg_ptr, NUM_VER_SUPPORTED);
  SET_MM_DEVICE_INFO_FIRST_SUP_PROTO_VERS( msg_ptr, PROTO_VERSION_ONE);
 
  // Send message to the DMTX task
  RETURN_STATUS ret_status = m_ici_io_ptr->send(&ici_msg_object);
 
  // Check that message was sent successfully
  if (ret_status != SUCCESS)
  {
    // Report problem when sending ICI message
    sz_err_msg( MAJOR, SZ_ERR_MSG_ERR_OPCODE, __FILE__, __LINE__,
      "DataMobilityRxProcessor processUnsupVer: failure sending "
      " device info message to DMTX");
  }
}

т.е. 26 строк против 37. А затем преобразовать его к той же парадигме let it crash (а использование исключений уже давно рекомендовано Страуструпом и поддерживается в C++ основными компиляторами уже лет пятнадцать):
  // Send message to the DMTX task
  RETURN_STATUS ret_status = m_ici_io_ptr->send(&ici_msg_object);
 
  // Check that message was sent successfully
  if (ret_status != SUCCESS)
    // Report problem when sending ICI message
    throw IciMessageSendError(
      MAJOR, SZ_ERR_MSG_ERR_OPCODE, __FILE__, __LINE__,
      "DataMobilityRxProcessor processUnsupVer: failure sending "
      " device info message to DMTX");

а еще лучше -- заставить порождать это исключение в методе m_ici_io_ptr->send. Тогда код станет еще компактнее:
void DataMobilityRxProcessor::processUnsupVer(void)
{
  // Create ICI message object to send to DMTX so it sends a Device Info
  // message to Q1 and Q2 clients
  IciMsg ici_msg_object( MM_DEVICE_INFO_OPC, ICI_DMTX_TASK_ID, sizeof( MM_DEVICE_INFO_MSG));
 
  // Retrieve ICI message buffer pointer
  MM_DEVICE_INFO_MSG * msg_ptr = (MM_DEVICE_INFO_MSG *)ici_msg_object.getIciMsgBufPtr();
 
  // Populate message buffer
  SET_MM_DEVICE_INFO_DEVICE_TYPE( msg_ptr, SERVER);
  SET_MM_DEVICE_INFO_NUM_VER_SUPPORTED( msg_ptr, NUM_VER_SUPPORTED);
  SET_MM_DEVICE_INFO_FIRST_SUP_PROTO_VERS( msg_ptr, PROTO_VERSION_ONE);
 
  // Send message to the DMTX task
  m_ici_io_ptr->send(&ici_msg_object);
}


Что мешало разработчикам C++ проектов сразу писать в таком стиле? C++ или человеческий фактор?

Подобные сравнения лучше отложить до момента, когда на Erlang-е начнут программировать столько же ламеров, сколько на C++.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[2]: Ещё одно сравнение с участием Эрланга
От: WolfHound  
Дата: 10.06.07 12:20
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>а еще лучше -- заставить порождать это исключение в методе m_ici_io_ptr->send. Тогда код станет еще компактнее:

E>
E>void DataMobilityRxProcessor::processUnsupVer(void)
E>{
E>  // Create ICI message object to send to DMTX so it sends a Device Info
E>  // message to Q1 and Q2 clients
E>  IciMsg ici_msg_object( MM_DEVICE_INFO_OPC, ICI_DMTX_TASK_ID, sizeof( MM_DEVICE_INFO_MSG));
 
E>  // Retrieve ICI message buffer pointer
E>  MM_DEVICE_INFO_MSG * msg_ptr = (MM_DEVICE_INFO_MSG *)ici_msg_object.getIciMsgBufPtr();
 
E>  // Populate message buffer
E>  SET_MM_DEVICE_INFO_DEVICE_TYPE( msg_ptr, SERVER);
E>  SET_MM_DEVICE_INFO_NUM_VER_SUPPORTED( msg_ptr, NUM_VER_SUPPORTED);
E>  SET_MM_DEVICE_INFO_FIRST_SUP_PROTO_VERS( msg_ptr, PROTO_VERSION_ONE);
 
E>  // Send message to the DMTX task
E>  m_ici_io_ptr->send(&ici_msg_object);
E>}
E>

Кю.
Это разве хороший С++ный код?
Плюс ты еще потерял человекочитаемое сообщение об ошибке.
Надо так:
void DataMobilityRxProcessor::processUnsupVer(void)
{
  // Create ICI message object to send to DMTX so it sends a Device Info
  // message to Q1 and Q2 clients
  IciMsg<MM_DEVICE_INFO_MSG> msg(ICI_DMTX_TASK_ID);//MM_DEVICE_INFO_OPC скорей всего можно так или иначе получить из MM_DEVICE_INFO_MSG
 
  msg->deviceType(SERVER);
  msg->numVerSupported(NUM_VER_SUPPORTED);
  msg->firstSupProtoVers(PROTO_VERSION_ONE);
 
  // Send message to the DMTX task
  IO_CHECK(m_ici_io_ptr->send(&msg), MAJOR, "failure sending device info message to DMTX");
}


ЗЫ А вобще спорить с тем что С++ мягко говоря не самый удачный язык для распределенки и прочей паралельности глупою.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 10.06.07 19:58
Оценка:
Здравствуйте, WolfHound, Вы писали:

[]

Код eao197 и твой не равноценны, хотя бы потому, что твой нерабочий
Re[4]: Ещё одно сравнение с участием Эрланга
От: WolfHound  
Дата: 10.06.07 20:21
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Код eao197 и твой не равноценны, хотя бы потому, что твой нерабочий

И что же ты в нем такого не рабочего то нашол?
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 10.06.07 20:57
Оценка:
Здравствуйте, eao197, Вы писали:

E>Подобные сравнения лучше отложить до момента, когда на Erlang-е начнут программировать столько же ламеров, сколько на C++.


Поясню свою мысль: даже при идеальном кодировании, C++ не догонит Erlang по компактности и, вероятно, корректности, распределенных приложений (особенно в телекоме). DSL (коим мне представляется Erlang на данных задачах) -- он и в Африке DSL. Но вот разрывы в показателях между нормальными C++ программами и аналогичными Erlang-овскими уже не будут составлять 7-8 раз, а раза эдак 2-3.

Собственно, на место C++ можно подставить любой мейнстримовый (и не только) императивный язык: Java, C#, ObjectPascal, Eiffel, Modula, Ada... -- слишком они универсальные для того чтобы играть с Erlang-ом на его поле.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Ещё одно сравнение с участием Эрланга
От: Mamut Швеция http://dmitriid.com
Дата: 11.06.07 06:20
Оценка:
E>Собственно, на место C++ можно подставить любой мейнстримовый (и не только) императивный язык: Java, C#, ObjectPascal, Eiffel, Modula, Ada... -- слишком они универсальные для того чтобы играть с Erlang-ом на его поле.

Это, в принципе, и есть результат второй работы — high level concurrency abstracts. Единственная причина, по которой они выбрали Эрланг для дальнейших разработок — это наличие таких абстракций в языке, его промышленное качество и наличие развитых библиотек. Если бы такие же абстракции были легкодоступны в С++, они бы выбрали С++. Если бы Glasgow Distributed Haskell был бы промышленного качества, они бы выбрали его


dmitriid.comGitHubLinkedIn
Re[4]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.06.07 12:12
Оценка: 27 (5)
Здравствуйте, Mamut, Вы писали:

E>>Собственно, на место C++ можно подставить любой мейнстримовый (и не только) императивный язык: Java, C#, ObjectPascal, Eiffel, Modula, Ada... -- слишком они универсальные для того чтобы играть с Erlang-ом на его поле.


M>Это, в принципе, и есть результат второй работы — high level concurrency abstracts. Единственная причина, по которой они выбрали Эрланг для дальнейших разработок — это наличие таких абстракций в языке, его промышленное качество и наличие развитых библиотек. Если бы такие же абстракции были легкодоступны в С++, они бы выбрали С++. Если бы Glasgow Distributed Haskell был бы промышленного качества, они бы выбрали его


Сегодня читая одну книжицу, наткнулся на фрагмент, который, как мне кажется, показывает, почему подобные сравнения всегда будут в пользу "немейнстримовых" подходов:

"...Исследование попыток внести изменения в принципы работы организации показывает, что пилотные проекты, адаптированные к конкретным условиям, практически всегда оказываются успешными, тогда как навязанные третьими лицами универсальные модели, основанные на обобщенном опыте, всегда проваливаются. Причина заключается в том, что проявление лидерских качеств, раскрытие творческого потенциала, обострение мотивации и рост ответственности всегда возрастают с появлением новых вызовов и сходит на нет при многократном повторении. Если что-то принято делать определенным образом и это никак нельзя усовершенствовать, задача становится менее захватывающей и менее интригующей, чем открытие совершенно новых, неизвестных ранее путей..."


К.Клок, Дж.Голдсмит, Конец менеджмента и становление организационной демократии стр.147.

Интересно будет глянуть, с чем будут сравнивать Erlang, когда он станет мейнстримом


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 11.06.07 13:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Константин Л., Вы писали:


КЛ>>Код eao197 и твой не равноценны, хотя бы потому, что твой нерабочий

WH>И что же ты в нем такого не рабочего то нашол?

ну не компилицца он . eao197 поменял его так, чтобы он оставался компилябельным. Твой — нет. А вообще, наверное твой лучше .
Re[6]: Ещё одно сравнение с участием Эрланга
От: WolfHound  
Дата: 11.06.07 13:29
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>ну не компилицца он . eao197 поменял его так, чтобы он оставался компилябельным. Твой — нет. А вообще, наверное твой лучше .

Если уж придиратся то у eao197 не обрабатываются ошибки send.
А перевод системы с кодов возврата на исключения всеравно потребует переделки всего кода.
Так что если уж редизайнить то редизайнить как следует.
Хотя тот код что у меня тоже не идеал но для того чтобы сделать его лучше нужно знать о системе все.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 20.06.07 12:46
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Курилка, Вы писали:


E>Ахринеть. Код:

E>void DataMobilityRxProcessor::processUnsupVer(void)
хъ
E>Что мешало разработчикам C++ проектов сразу писать в таком стиле? C++ или человеческий фактор?

processUnsupVer — конечно, очень типовой код, я понимаю. Вот такой код — кусочек разбора IP-датаграммы — это, наверно, реже в телеком-приложениях встречается:

-define(IP_VERSION, 4).
-define(IP_MIN_HDR_LEN, 5).

DgramSize = size(Dgram),
case Dgram of 
    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
      ID:16, Flgs:3, FragOff:13,
      TTL:8, Proto:8, HdrChkSum:16,
      SrcIP:32,
      DestIP:32, RestDgram/binary>> when HLen >= 5, 4 * HLen =< DgramSize ->
            OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
            <<Opts:OptsLen/binary, Data/binary>> = RestDgram,
    ...
end.


Повторим на плюсах?

Кстати, эксцепшены, которые ты бросаешь в С++, тебе придется бросать ручками. И ручками постоянно паковать туда символическую информацию. Также крайне любопытно, что ты будешь делать при вылете эксцепшна в потоке. Ну поймал ты его наверху в тред-функции — типа классно, let it crash и все такое. Что будем делать с потоком? А что будешь делать с его примитивами синхронизации, на котором стоят в блокировке другие потоки?

E>Подобные сравнения лучше отложить до момента, когда на Erlang-е начнут программировать столько же ламеров, сколько на C++.

В этом сравнении на Эрланге писали самые что ни на есть ламеры, дружище. Они язык и платформу изучали в процессе самого сравнения.
Re[3]: Ещё одно сравнение с участием Эрланга
От: Cyberax Марс  
Дата: 20.06.07 13:53
Оценка: +1
Gaperton wrote:
> Ну поймал ты его наверху в тред-функции — типа классно, let it
> crash и все такое. Что будем делать с потоком? А что будешь делать с его
> примитивами синхронизации, на котором стоят в блокировке другие потоки?
Я в таких случаях ВСЕГДА использую scoped-блокировки, которые сами
автоматически отмотаются при обработке исключения.
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[4]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 20.06.07 14:16
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Gaperton wrote:

>> Ну поймал ты его наверху в тред-функции — типа классно, let it
>> crash и все такое. Что будем делать с потоком? А что будешь делать с его
>> примитивами синхронизации, на котором стоят в блокировке другие потоки?
C>Я в таких случаях ВСЕГДА использую scoped-блокировки, которые сами
C>автоматически отмотаются при обработке исключения.

а я во всех случаях использую scoped lock'и.
Re[3]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.06.07 17:03
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>processUnsupVer — конечно, очень типовой код, я понимаю. Вот такой код — кусочек разбора IP-датаграммы — это, наверно, реже в телеком-приложениях встречается:


G>-define(IP_VERSION, 4).

G>-define(IP_MIN_HDR_LEN, 5).

G>
G>DgramSize = size(Dgram),
G>case Dgram of 
G>    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
G>      ID:16, Flgs:3, FragOff:13,
G>      TTL:8, Proto:8, HdrChkSum:16,
G>      SrcIP:32,
G>      DestIP:32, RestDgram/binary>> when HLen >= 5, 4 * HLen =< DgramSize ->
G>            OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
G>            <<Opts:OptsLen/binary, Data/binary>> = RestDgram,
G>    ...
G>end.
G>


G>Повторим на плюсах?


Горазд ты примеры из документации дергать.
А покажи-ка, дружище, код чтения ASCIIZ значений из входного потока. Когда байтовое значение прекращается первым нулевым байтом, а следом идет либо другое ASCIIZ-значение, либо поле с фиксированным размером. Как это будет на Erlang-е? А на плюсах что-то вроде:

void
submit_deliver_base_t::load(
    oess_1::io::istream_t & in )
{
    // Считываем обязательные параметры.
    in >> m_service_type
        >> m_source_addr_ton
        >> m_source_addr_npi
        >> m_source_addr
        >> m_dest_addr_ton
        >> m_dest_addr_npi
        >> m_dest_addr
        >> m_esm_class
        >> m_protocol_id
        >> m_priority_flag
        >> m_schedule_delivery_time
        >> m_validity_period
        >> m_registered_delivery
        >> m_replace_if_present_flag
        >> m_data_coding
        >> m_sm_default_msg_id
        >> m_short_message
        // Считываем необязательные параметры.
        >> opt_params();
}

тоже, кстати, код из области телекома.

G>Кстати, эксцепшены, которые ты бросаешь в С++, тебе придется бросать ручками. И ручками постоянно паковать туда символическую информацию. Также крайне любопытно, что ты будешь делать при вылете эксцепшна в потоке. Ну поймал ты его наверху в тред-функции — типа классно, let it crash и все такое. Что будем делать с потоком? А что будешь делать с его примитивами синхронизации, на котором стоят в блокировке другие потоки?


А про понятие exception safety за пределами C++ никто не знает, надо полагать?

E>>Подобные сравнения лучше отложить до момента, когда на Erlang-е начнут программировать столько же ламеров, сколько на C++.

G>В этом сравнении на Эрланге писали самые что ни на есть ламеры, дружище. Они язык и платформу изучали в процессе самого сравнения.

Тогда, я полагаю, их Erlang-овский код можно ужать в той же степени, как и их C++ный код.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 20.06.07 17:35
Оценка:
Здравствуйте, eao197, Вы писали:

G>>
G>>DgramSize = size(Dgram),
G>>case Dgram of 
G>>    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
G>>      ID:16, Flgs:3, FragOff:13,
G>>      TTL:8, Proto:8, HdrChkSum:16,
G>>      SrcIP:32,
G>>      DestIP:32, RestDgram/binary>> when HLen >= 5, 4 * HLen =< DgramSize ->
G>>            OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
G>>            <<Opts:OptsLen/binary, Data/binary>> = RestDgram,
G>>    ...
G>>end.
G>>


G>>Повторим на плюсах?


E>Горазд ты примеры из документации дергать.


Я так понял, тебе понятно, насколько этот код на плюсах возрастет в объеме. Или нет?

E>А покажи-ка, дружище, код чтения ASCIIZ значений из входного потока. Когда байтовое значение прекращается первым нулевым байтом, а следом идет либо другое ASCIIZ-значение, либо поле с фиксированным размером. Как это будет на Erlang-е? А на плюсах что-то вроде:


E>
E>void
E>submit_deliver_base_t::load(
E>    oess_1::io::istream_t & in )
E>{
E>    // Считываем обязательные параметры.
E>    in >> m_service_type
        >>> m_source_addr_ton
        >>> m_source_addr_npi
        >>> m_source_addr
        >>> m_dest_addr_ton
        >>> m_dest_addr_npi
        >>> m_dest_addr
        >>> m_esm_class
        >>> m_protocol_id
        >>> m_priority_flag
        >>> m_schedule_delivery_time
        >>> m_validity_period
        >>> m_registered_delivery
        >>> m_replace_if_present_flag
        >>> m_data_coding
        >>> m_sm_default_msg_id
        >>> m_short_message
E>        // Считываем необязательные параметры.
        >>> opt_params();
E>}
E>

E>тоже, кстати, код из области телекома.

{ Stream1, ServiceType, SourceAddrTon, SourceAddr, ... ] = parse( Stream, [ string, 2, 4, ... ] ),
здесь я задаю параметрами partition как мне выделять из потока (поток это бинари) — строку или число (размер в байтах). Функция parse пишется один раз. Написать?

Чтение я могу разбить на несколько строк — на столько, сколько захочу. Если у меня будут разные опции форматов с числовыми аргументами, я определю манипуляторы, например:

unsigned-int( N ) -> { unsigned-int, N }.

{ Stream1, X, Y } = parse( Stream, [ unsigned-int( 4 ), string ] )

А еще я могу задавать жутко хитрые манипуляторы, например такие
{ Stream1, X, { Y, Z } } = parse( Stream, [ string, fun( << A:3, B:5, ?MY_CONSTANT, _/binary >> ) -> { A, B } end ] ).

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

OptParms = parse( StreamN, opt_parms() );

Вот так, дружище. Не слишком страшно получается? И заметь, никакого ООП и перегруженных операторов.

G>>Кстати, эксцепшены, которые ты бросаешь в С++, тебе придется бросать ручками. И ручками постоянно паковать туда символическую информацию. Также крайне любопытно, что ты будешь делать при вылете эксцепшна в потоке. Ну поймал ты его наверху в тред-функции — типа классно, let it crash и все такое. Что будем делать с потоком? А что будешь делать с его примитивами синхронизации, на котором стоят в блокировке другие потоки?


E>А про понятие exception safety за пределами C++ никто не знает, надо полагать?


Угу, а как насчет разделяемых данных, которые остались в нецелостном состоянии? И все-таки, что именно ты предлагаешь делать с потоком?

E>>>Подобные сравнения лучше отложить до момента, когда на Erlang-е начнут программировать столько же ламеров, сколько на C++.

G>>В этом сравнении на Эрланге писали самые что ни на есть ламеры, дружище. Они язык и платформу изучали в процессе самого сравнения.

E>Тогда, я полагаю, их Erlang-овский код можно ужать в той же степени, как и их C++ный код.


Не исключено. Но врят ли — Эрланг все таки проще С++ на пару порядков, там сложнее налажать.
Re[5]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.06.07 18:18
Оценка:
Здравствуйте, Gaperton, Вы писали:

E>>Горазд ты примеры из документации дергать.


G>Я так понял, тебе понятно, насколько этот код на плюсах возрастет в объеме. Или нет?


Если бы мне потребовалось делать такой парсинг раз или два, или даже три, то объем был бы существенно больше.
А вот если бы мне нужно было это делать гораздо больше раз, то написал бы библиотеку, которая делала бы приблизительно следующее:
void
packet_header_t::load( oess_1::io::istream_t & in )
  {
    in >> bits( IP_VERSION, 4 )
       >> bits( HLen, 4 )
       >> bits( SrvcType, 8 )
       >> bits( TotLen, 16 )
       >> bits( ID, 16 )
       >> bits( Flgs, 3 )
       >> bits( FragOff, 13 )
       ... и так далее...
  }

или бы вообще сделал генератор, который бы парсинг подобных пакетов генерировал по DSL-описаниям.

G> { Stream1, ServiceType, SourceAddrTon, SourceAddr, ... ] = parse( Stream, [ string, 2, 4, ... ] ),

G>здесь я задаю параметрами partition как мне выделять из потока (поток это бинари) — строку или число (размер в байтах). Функция parse пишется один раз. Написать?

Зачем же.

G>Чтение я могу разбить на несколько строк — на столько, сколько захочу. Если у меня будут разные опции форматов с числовыми аргументами, я определю манипуляторы, например:


G>unsigned-int( N ) -> { unsigned-int, N }.


G>{ Stream1, X, Y } = parse( Stream, [ unsigned-int( 4 ), string ] )


G>А еще я могу задавать жутко хитрые манипуляторы, например такие

G>{ Stream1, X, { Y, Z } } = parse( Stream, [ string, fun( << A:3, B:5, ?MY_CONSTANT, _/binary >> ) -> { A, B } end ] ).

G>При этом, я сохраняю возможность применять паттерн-матчинг на бинарных данных когда захочу. Ну и естественно, никаких проблем с опциональными параметрами у меня не будет — я сделаю просто


G>OptParms = parse( StreamN, opt_parms() );


G>Вот так, дружище. Не слишком страшно получается? И заметь, никакого ООП и перегруженных операторов.


Та же самая херня, мягко говоря. Смена шила на мыло. Тем более, что ООП и наследование часто помогает повторно использовать уже готовые куски кода.

G>>>Кстати, эксцепшены, которые ты бросаешь в С++, тебе придется бросать ручками. И ручками постоянно паковать туда символическую информацию. Также крайне любопытно, что ты будешь делать при вылете эксцепшна в потоке. Ну поймал ты его наверху в тред-функции — типа классно, let it crash и все такое. Что будем делать с потоком? А что будешь делать с его примитивами синхронизации, на котором стоят в блокировке другие потоки?


E>>А про понятие exception safety за пределами C++ никто не знает, надо полагать?


G>Угу, а как насчет разделяемых данных, которые остались в нецелостном состоянии? И все-таки, что именно ты предлагаешь делать с потоком?


Какие данные в нецелостном состоянии, если обеспечивается exception safety?

А с потоком -- по необходимости. Или поток тихо и мирно завершается. Либо в потоке есть бесконечный цикл, который поймав исключение рестартует операции потока.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 20.06.07 21:19
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Gaperton, Вы писали:


E>>>Горазд ты примеры из документации дергать.


G>>Я так понял, тебе понятно, насколько этот код на плюсах возрастет в объеме. Или нет?


E>Если бы мне потребовалось делать такой парсинг раз или два, или даже три, то объем был бы существенно больше.

E>А вот если бы мне нужно было это делать гораздо больше раз, то написал бы библиотеку, которая делала бы приблизительно следующее:
E>
E>void
E>packet_header_t::load( oess_1::io::istream_t & in )
E>  {
E>    in >> bits( IP_VERSION, 4 )
       >>> bits( HLen, 4 )
       >>> bits( SrvcType, 8 )
       >>> bits( TotLen, 16 )
       >>> bits( ID, 16 )
       >>> bits( Flgs, 3 )
       >>> bits( FragOff, 13 )
E>       ... и так далее...
E>  }
E>


Выглядит неплохо. Только маленький вопрос. Как этот код поведет себя, если IP_VERSION не совпадет? В Эрланговском примере работает pattern-matching и проверится следующий паттерн. А у тебя? Эксцепшн? IP_VERSION — это ведь константа. Это чрезвычайно существенный момент.

E>или бы вообще сделал генератор, который бы парсинг подобных пакетов генерировал по DSL-описаниям.

Это не фокус в любом языке. DSL на каждый писк — не выход. Кстати, можно просто воспользоваться генератором ASN.1.

G>>Вот так, дружище. Не слишком страшно получается? И заметь, никакого ООП и перегруженных операторов.


E>Та же самая херня, мягко говоря. Смена шила на мыло. Тем более, что ООП и наследование часто помогает повторно использовать уже готовые куски кода.


Похоже, конечно. Но далеко не тоже самое. Кстати, мне тут пришла идея получше. Смотри:

{ RestOfStream, [
   String1,
   << Number:7, Num2:9 >>,      здесь разбирается бинарис длиной в два байта
   String2,
   CompoundType ] } = parse( Stream, [ string, 2, string, my_module:my_parse_fun/1 ] ),


функция разбора потока имеет сигнатуру { RestOfStream, Data } = parse( Stream ), и я их могу каскадировать. Повторно использую уже готовые куски кода, и читабельность повыше — сразу виден формат пакета, в отличии от случая перекрытых >>> — затрахаешься по коду структуру пакета восстанавливать.

G>>>>Кстати, эксцепшены, которые ты бросаешь в С++, тебе придется бросать ручками. И ручками постоянно паковать туда символическую информацию. Также крайне любопытно, что ты будешь делать при вылете эксцепшна в потоке. Ну поймал ты его наверху в тред-функции — типа классно, let it crash и все такое. Что будем делать с потоком? А что будешь делать с его примитивами синхронизации, на котором стоят в блокировке другие потоки?


E>>>А про понятие exception safety за пределами C++ никто не знает, надо полагать?


G>>Угу, а как насчет разделяемых данных, которые остались в нецелостном состоянии? И все-таки, что именно ты предлагаешь делать с потоком?


E>Какие данные в нецелостном состоянии, если обеспечивается exception safety?


Разделяемые между тредами данные — которые должны меняться транзакционно. Знаешь, зачем в базе данных транзакции есть? Вот тут почти то же самое. А эксцепшн может вылететь в любой момент. Работа с нецелостными данными приведет к падению других потоков, которые с ними работают. И приплыли.

E>А с потоком -- по необходимости. Или поток тихо и мирно завершается. Либо в потоке есть бесконечный цикл, который поймав исключение рестартует операции потока.

Полных гарантий безопасности ты при таком подходе дать не можешь. Поэтому, не можешь и применять до конца подход лет ит крэш.
Re[7]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 05:44
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

E>>
E>>void
E>>packet_header_t::load( oess_1::io::istream_t & in )
E>>  {
E>>    in >> bits( IP_VERSION, 4 )
       >>>> bits( HLen, 4 )
       >>>> bits( SrvcType, 8 )
       >>>> bits( TotLen, 16 )
       >>>> bits( ID, 16 )
       >>>> bits( Flgs, 3 )
       >>>> bits( FragOff, 13 )
E>>       ... и так далее...
E>>  }
E>>


G>Выглядит неплохо. Только маленький вопрос. Как этот код поведет себя, если IP_VERSION не совпадет? В Эрланговском примере работает pattern-matching и проверится следующий паттерн. А у тебя? Эксцепшн? IP_VERSION — это ведь константа. Это чрезвычайно существенный момент.


Поскольку в плюсах нет ПМ, то там подход к распознаванию чего-нибудь совсем другой. В плюсах сначала нужно будет вытащить из потока весь объект packet_header_t (или какой-нибудь другой), или часть объекта, а затем с помощью switch-ей или if-ов определять, что это за оно.

G>Похоже, конечно. Но далеко не тоже самое. Кстати, мне тут пришла идея получше. Смотри:


G>
G>{ RestOfStream, [
G>   String1,
G>   << Number:7, Num2:9 >>,      здесь разбирается бинарис длиной в два байта
G>   String2,
G>   CompoundType ] } = parse( Stream, [ string, 2, string, my_module:my_parse_fun/1 ] ),
G>


G>функция разбора потока имеет сигнатуру { RestOfStream, Data } = parse( Stream ), и я их могу каскадировать. Повторно использую уже готовые куски кода, и читабельность повыше — сразу виден формат пакета, в отличии от случая перекрытых >>> — затрахаешься по коду структуру пакета восстанавливать.


Вот что мне не нравится в подобных декларативных вещах, что при наличии большого количества полей в PDU нужно писать большие туплы прямо в коде для того, чтобы принять результат работы parse. Можешь показать, как от этого дублирования описаний избавиться в Erlang-е

E>>Какие данные в нецелостном состоянии, если обеспечивается exception safety?


G>Разделяемые между тредами данные — которые должны меняться транзакционно. Знаешь, зачем в базе данных транзакции есть? Вот тут почти то же самое. А эксцепшн может вылететь в любой момент. Работа с нецелостными данными приведет к падению других потоков, которые с ними работают. И приплыли.


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

А того, чтобы от исключения портились разделяемые данные -- такого я не помню. Хотя, может это потому, что у меня взаимодействие между потоками на обмене сообщениями строится.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Ещё одно сравнение с участием Эрланга
От: Cyberax Марс  
Дата: 21.06.07 05:48
Оценка:
Gaperton wrote:
> Разделяемые между тредами данные — которые должны меняться
> транзакционно. Знаешь, зачем в базе данных транзакции есть? Вот тут
> почти то же самое. А эксцепшн может вылететь в любой момент. Работа с
> нецелостными данными приведет к падению других потоков, которые с ними
> работают. И приплыли.
Именно для работы с такими данными и придумали exception safety в С++.
Выделяется несколько гарантий по безопасности: no-throw (исключения
никогда не будут бросаться), weak exception guarantee (после броска
исключения объект нельзя дальше использовать, но его можно корректно
удалить), strong exception guarantee (после броска исключений операция
будет откачена).

Можно писать так, что будет соблюдаться сильная гарантия. Это совсем не
сложно, кстати.
Posted via RSDN NNTP Server 2.1 beta
Sapienti sat!
Re[8]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 21.06.07 06:22
Оценка:
Здравствуйте, eao197, Вы писали:

G>>Похоже, конечно. Но далеко не тоже самое. Кстати, мне тут пришла идея получше. Смотри:


G>>
G>>{ RestOfStream, [
G>>   String1,
G>>   << Number:7, Num2:9 >>,      здесь разбирается бинарис длиной в два байта
G>>   String2,
G>>   CompoundType ] } = parse( Stream, [ string, 2, string, my_module:my_parse_fun/1 ] ),
G>>


G>>функция разбора потока имеет сигнатуру { RestOfStream, Data } = parse( Stream ), и я их могу каскадировать. Повторно использую уже готовые куски кода, и читабельность повыше — сразу виден формат пакета, в отличии от случая перекрытых >>> — затрахаешься по коду структуру пакета восстанавливать.


E>Вот что мне не нравится в подобных декларативных вещах, что при наличии большого количества полей в PDU нужно писать большие туплы прямо в коде для того, чтобы принять результат работы parse. Можешь показать, как от этого дублирования описаний избавиться в Erlang-е


Принять можно без тупла. Можно просто — Result = parse( Stream ), а разобрать его потом. Далее — не обязательно большой разбирать тупо сразу целиком.

{_,_,_,Res1,_,Res2} = ...

{_,Res1,Res2,_,_,_} = ...

Можно и так. Третье — в моем примере тупл состоит из двух элементов, а далее идет список. Так что все еще лучше. Ты можешь разобрать ровно столько, сколько тебе надо.
{ ResStream, [ String1, << Number:16 >> | Tail ] } = parse( Stream, Format ),
А Tail — потом.

E>>>Какие данные в нецелостном состоянии, если обеспечивается exception safety?


G>>Разделяемые между тредами данные — которые должны меняться транзакционно. Знаешь, зачем в базе данных транзакции есть? Вот тут почти то же самое. А эксцепшн может вылететь в любой момент. Работа с нецелостными данными приведет к падению других потоков, которые с ними работают. И приплыли.


E>Вообще-то практика показывает, что приклывают чаще всего когда поток выпускает наружу непойманное исключение. Тогда приложение может либо упасть со странной диагностикой, либо продолжить еще какое-то время выполнение без одного из своих потоков.


E>А того, чтобы от исключения портились разделяемые данные -- такого я не помню. Хотя, может это потому, что у меня взаимодействие между потоками на обмене сообщениями строится.
Re[8]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 07:12
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Можно писать так, что будет соблюдаться сильная гарантия. Это совсем не

C>сложно, кстати.

Временами сложно. И дорого.
Хотя это проблема не только в C++, она есть и в языках со сборкой мусора.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[9]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 21.06.07 08:34
Оценка:
Здравствуйте, Gaperton, Вы писали:

[]

E>>Вот что мне не нравится в подобных декларативных вещах, что при наличии большого количества полей в PDU нужно писать большие туплы прямо в коде для того, чтобы принять результат работы parse. Можешь показать, как от этого дублирования описаний избавиться в Erlang-е


G>Принять можно без тупла. Можно просто — Result = parse( Stream ), а разобрать его потом. Далее — не обязательно большой разбирать тупо сразу целиком.


Ну так какая разница, сейчас или потом. Тебе говорят о том, что, фактически, при каждом разборе ты снова будешь писать "декларацию" тупла.

[]
Re[9]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 10:22
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Cyberax, Вы писали:


C>>Можно писать так, что будет соблюдаться сильная гарантия. Это совсем не

C>>сложно, кстати.
E>Временами сложно. И дорого.
E>Хотя это проблема не только в C++, она есть и в языках со сборкой мусора.

Ммм, в Эрланге?
Re[10]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 10:31
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Gaperton, Вы писали:


G>>Принять можно без тупла. Можно просто — Result = parse( Stream ), а разобрать его потом. Далее — не обязательно большой разбирать тупо сразу целиком.


КЛ>Ну так какая разница, сейчас или потом. Тебе говорят о том, что, фактически, при каждом разборе ты снова будешь писать "декларацию" тупла.


И?
Сравним:
1. "псевдокод" явы
class X{
public int x;
public int y
}
//...
 X x = func();
 System.out.println(x.y);
 System.out.println(x.x);


2. "псеводкод" эрланга
{X, Y} = func(),
io:format("~p~n", X),
io:format("~p~n", Y).


В первом случае тебе нужно знать и хранить в голове структуру класса, какие там поля и т.п.
В эрланге ты можешь сделать то же самое, если поставить Tuple = func(), но если ты "запаттернматчишь", то дальше по коду тебе не нужны подробности структуры тупла, ты работаешь с конкретными данными, которые тебя интересуют в конкретный момент.
Т.е. таким образом ты локализуешь объём сложности данных, участвующих в логике приложения.
Всё, конечно, есть только лишь сугубо моё мнение
Re[10]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 10:32
Оценка:
Здравствуйте, Курилка, Вы писали:

E>>Временами сложно. И дорого.

E>>Хотя это проблема не только в C++, она есть и в языках со сборкой мусора.

К>Ммм, в Эрланге?


Теоритически, думается, и в Эрланге возможно. Например, процесс A должен отослать процессу B два сообщения, только при получении второго сообщения у процесса B будет о процессе A целостная информации. После отсылки первого сообщения процесс A умирает по исключению. Если не предпринимать специальных действий в процессе B, то он, не дождавшись второго сообщения от A, будет владеть некорректной информацией.

Кстати, хочу поинтересоваться у Эрланговедов -- как в Эрланге обстоит дело с освобождением ресурсов при исключениях. Скажем, в C++ и D есть RAII, деструктор может завершить начатые операции. А в Эрланге как? Начинаем транзакцию в БД, к примеру, затем процесс падает. Кто будет транзакцию откатывать? В какой момент?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Ещё одно сравнение с участием Эрланга
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.06.07 10:39
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Небольшая поправка. 1С — это Жлабэйсик с русифицированным синтаксисом. ДСЛ-я там не ма. Они просто преоставляют готовую библоитеку доступа к предметно-ориентированному хранилищу данных. В общем, Эксес переросток.

Все же предметно — объектно ориентированному. Пусть и с поздним связыванием (хотя легко статически типизацировать). Резко увеличивающему скорость разработки. Нужно учитывать и встроенные средства аля объектных запросов (сложные выборки бух запросов) и вывод отчетов ввиде таблиц где указываются переменные функции итд. Это намного больше чем Эксес иначе сам Эксес легко перерос бы 1С .
и солнце б утром не вставало, когда бы не было меня
Re[11]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 10:42
Оценка:
Здравствуйте, eao197, Вы писали:


E>Теоритически, думается, и в Эрланге возможно. Например, процесс A должен отослать процессу B два сообщения, только при получении второго сообщения у процесса B будет о процессе A целостная информации. После отсылки первого сообщения процесс A умирает по исключению. Если не предпринимать специальных действий в процессе B, то он, не дождавшись второго сообщения от A, будет владеть некорректной информацией.


Ну и пусть себе владеет, делов-то
Задача может решаться след. образом: есть некий диспетчер приложения B, который ловит сообщения, на каждое полученное Первое создаёт процесс, ведёт список процессов, Второе сообщение пересылает уже созданному процессу, плюс периодически список чекать на "таймаут".
Или другой вариант А посылает сообщение, диспетчер создаёт процесс, этот процесс посылает ответ с подтверждением и своим pid, и сам "садится" в receive (с таймаутом), и ждёт там, никому не мешая, пока не сдохнет.

Про транзакции не готов ответить, кроме мнезии там их нигде не видел.
Re[11]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 10:43
Оценка: +1
Здравствуйте, Курилка, Вы писали:

К>1. "псевдокод" явы

К>
К>class X{
К>public int x;
К>public int y
К>}
К>//...
К> X x = func();
К> System.out.println(x.y);
К> System.out.println(x.x);
К>


К>2. "псеводкод" эрланга

К>
К>{X, Y} = func(),
К>io:format("~p~n", X),
К>io:format("~p~n", Y).
К>


К>В первом случае тебе нужно знать и хранить в голове структуру класса, какие там поля и т.п.

К>В эрланге ты можешь сделать то же самое, если поставить Tuple = func(), но если ты "запаттернматчишь", то дальше по коду тебе не нужны подробности структуры тупла, ты работаешь с конкретными данными, которые тебя интересуют в конкретный момент.
К>Т.е. таким образом ты локализуешь объём сложности данных, участвующих в логике приложения.
К>Всё, конечно, есть только лишь сугубо моё мнение

В случае {X,Y} = func() тебе нужно знать, что func() возвращает именно тупл из двух элементов. И знать, какой элемент тупла что обозначает и чем является. Что соответствует знанию структуры класса X в Java. Только в статичести типизированных языках это знание декларируется описанием класса X, а вот в динамически-типизированных языках одной декларации:
func() -> {X, Y}

мало, если X и Y не атомарные значения, а какие-нибудь агрегаты (списки или туплы, а еще хуже -- списки туплов со списками внутри).

А если увеличить количество полей в X с двух до двадцати (обычное дело для телекома). И сделать половину из них необязательными.

А если в конкретный момент меня интересует поле X, а затем, спустя какое-то время мне потребуется еще и поле Z, то в ООП языках я могу сделать что-то вроде:
PDU pdu = parsePdu();
if( pdu.fieldOne == SOMETHING )
  // Здесь не известно, что потребуется process()-у из pdu.
  process( pdu );
...
void process( PDU pdu )
  {
    pdu.fieldThree() ...
  }

В Erlang-е для этого придется делать что?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Ещё одно сравнение с участием Эрланга
От: aka50 Россия  
Дата: 21.06.07 10:46
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Курилка, Вы писали:


E>>>Временами сложно. И дорого.

E>>>Хотя это проблема не только в C++, она есть и в языках со сборкой мусора.

К>>Ммм, в Эрланге?


E>Теоритически, думается, и в Эрланге возможно. Например, процесс A должен отослать процессу B два сообщения, только при получении второго сообщения у процесса B будет о процессе A целостная информации. После отсылки первого сообщения процесс A умирает по исключению. Если не предпринимать специальных действий в процессе B, то он, не дождавшись второго сообщения от A, будет владеть некорректной информацией.


Перед посылкой можно залинковать себя на таргет процесс и получить уведомление, что процесс сдох. Т.к. нет состояния, то и откатывать ничего не надо (у нас есть начальный объект и есть незавершенный, т.е. мы просто выбросим незавершенный). На актерах да без состояния, Жень, реально делается все достаточно легко. Особенно если учесть что они очень дешевые. А в С++/Java/... нужно прилагать усилия, чтобы гарантировать транзакционность (фактически руками или костылями создавать копии объектов, а в erlang это встроенно в язык, ибо он функционален).

E>Кто будет транзакцию откатывать? В какой момент?

Я не эрланговед , только учусь, но мне пока видиться — один актер — одна транзакция. Т.е. есть некий transaction manager, он собственно стартует эти актеры-транзакции, он же за ними и следит. И самое замечаетельное, что этот manager может быть удаленным.
Re[12]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 10:46
Оценка:
Здравствуйте, Курилка, Вы писали:

E>>Теоритически, думается, и в Эрланге возможно. Например, процесс A должен отослать процессу B два сообщения, только при получении второго сообщения у процесса B будет о процессе A целостная информации. После отсылки первого сообщения процесс A умирает по исключению. Если не предпринимать специальных действий в процессе B, то он, не дождавшись второго сообщения от A, будет владеть некорректной информацией.


К>Ну и пусть себе владеет, делов-то

К>Задача может решаться след. образом: есть некий диспетчер приложения B, который ловит сообщения, на каждое полученное Первое создаёт процесс, ведёт список процессов, Второе сообщение пересылает уже созданному процессу, плюс периодически список чекать на "таймаут".
К>Или другой вариант А посылает сообщение, диспетчер создаёт процесс, этот процесс посылает ответ с подтверждением и своим pid, и сам "садится" в receive (с таймаутом), и ждёт там, никому не мешая, пока не сдохнет.



Ага, а после этого говорят, что обеспечение целостности данных в C++ при исключениях -- сложное дело!

Шутка


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 10:53
Оценка:
Здравствуйте, aka50, Вы писали:

E>>Теоритически, думается, и в Эрланге возможно. Например, процесс A должен отослать процессу B два сообщения, только при получении второго сообщения у процесса B будет о процессе A целостная информации. После отсылки первого сообщения процесс A умирает по исключению. Если не предпринимать специальных действий в процессе B, то он, не дождавшись второго сообщения от A, будет владеть некорректной информацией.


A>Перед посылкой можно залинковать себя на таргет процесс и получить уведомление, что процесс сдох. Т.к. нет состояния, то и откатывать ничего не надо (у нас есть начальный объект и есть незавершенный, т.е. мы просто выбросим незавершенный). На актерах да без состояния, Жень, реально делается все достаточно легко. Особенно если учесть что они очень дешевые. А в С++/Java/... нужно прилагать усилия, чтобы гарантировать транзакционность (фактически руками или костылями создавать копии объектов, а в erlang это встроенно в язык, ибо он функционален).


Так я же специально оговорку сделал: если не предпринимать специальных действий. А установить линк на процесс A -- это есть специальное действие.

E>>Кто будет транзакцию откатывать? В какой момент?

A>Я не эрланговед , только учусь, но мне пока видиться — один актер — одна транзакция. Т.е. есть некий transaction manager, он собственно стартует эти актеры-транзакции, он же за ними и следит. И самое замечаетельное, что этот manager может быть удаленным.

Я о другом: например, мне нужно зафиксировать в БД две записи, скажем, снятие денег с одного счета и внесение на другой счет. Пусть транзакцию начинает менеджер, который стартует актера-исполнителя и завершает транзакцию после окончания работы актера исполнителя. Т.е. менеджер условно говоря, владеет туплом {TRX_ID, Pid}, где TRX_ID -- это идентификатор транзакции, а Pid -- актер-исполнитель. Если падает исполнитель, то понятно, что менеджер откатит транзакцию. А если падает сам менеджер?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[13]: Ещё одно сравнение с участием Эрланга
От: Cyberax Марс  
Дата: 21.06.07 10:58
Оценка:
Здравствуйте, eao197, Вы писали:

E>Я о другом: например, мне нужно зафиксировать в БД две записи, скажем, снятие денег с одного счета и внесение на другой счет. Пусть транзакцию начинает менеджер, который стартует актера-исполнителя и завершает транзакцию после окончания работы актера исполнителя. Т.е. менеджер условно говоря, владеет туплом {TRX_ID, Pid}, где TRX_ID -- это идентификатор транзакции, а Pid -- актер-исполнитель. Если падает исполнитель, то понятно, что менеджер откатит транзакцию. А если падает сам менеджер?

Если оно делается в пределах одной базы — то целостность состояния гарантируется железом (т.е. для последней стадии коммита будут использованы гарантировано атомарные операции).

Если же тут участвуют две базы — то требуется протокол двухфазного коммита. Так чтобы в случае чего можно было перезапустить менеджер транзакций и возобновить все.
Sapienti sat!
Re[12]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 11:14
Оценка:
Здравствуйте, eao197, Вы писали:

[cut]
E>В Erlang-е для этого придется делать что?

Ну как вариант — использовать рекорды (читай сишные структуры).
Re[13]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 11:23
Оценка:
Здравствуйте, eao197, Вы писали:

[cut]

E>Ага, а после этого говорят, что обеспечение целостности данных в C++ при исключениях -- сложное дело!


E>Шутка


А если чуть серьёзней? Моделирование на процессах тебе кажется сильно сложным?
И ещё мысль — в случае такого моделирования ты разделяешь именно участки алгоритма, которые могут "отвалиться", т.е. уделяешь внимание участкам кода.
Тогда как для обеспечения целостности на плюсах, тебе надо рассуждать уже не только об участках кода, но и о самих, данных, как там что клинится и т.п.
Т.е. область в рамках которой надо "ковыряться" однозначно увеличивается.
Хотя, наверное, это итак понятно.
Re[13]: Ещё одно сравнение с участием Эрланга
От: aka50 Россия  
Дата: 21.06.07 11:23
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, aka50, Вы писали:


E>Так я же специально оговорку сделал: если не предпринимать специальных действий. А установить линк на процесс A -- это есть специальное действие.

Это может входить в API менеджера транзакций или процессов.

E>Если падает исполнитель, то понятно, что менеджер откатит транзакцию. А если падает сам менеджер?

Ну в данном случае можно так же спросить: а если упадет серверная ось?
Если серьезно, то варианта 2:
1. Писать этого менеджера очень аккуратно в exception safe стиле (т.е. отказаться для этого модуля от let it crash)
2. Заиметь мета-менеджера, который пасет любые другие менеджеры и выполянется специальные rollback и рестартует упавших (его правда тоже придется писать как в пп1)
Re[11]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 11:24
Оценка:
Здравствуйте, Курилка, Вы писали:
[cut]

2 Константин Л. — можно узнать конструктивные претензии к написанному мной?
Re[11]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 21.06.07 12:43
Оценка:
Здравствуйте, Курилка, Вы писали:


Почему поставил -1? Ну так просто моё мнение считает твоё мнение неправильным

[]

К>И?

К>Сравним:

[]

К>В первом случае тебе нужно знать и хранить в голове структуру класса, какие там поля и т.п.


Зачем? Есть же определение. Это вот в эрланге нужно хранить, тк эти определения могут отличаться от использования к использованию. Это нечеткая типизация со всеми вытекающими

К>В эрланге ты можешь сделать то же самое, если поставить Tuple = func(), но если ты "запаттернматчишь", то дальше по коду тебе не нужны подробности структуры тупла, ты работаешь с конкретными данными, которые тебя интересуют в конкретный момент.


а как с ними работать, если мне не нужна структура тупла? Тупл, поправь меня, если я говорю что-то нето, динамическая структура данных, без строгой структурированности (сорри за каламбур).

К>Т.е. таким образом ты локализуешь объём сложности данных, участвующих в логике приложения.

К>Всё, конечно, есть только лишь сугубо моё мнение
Re[12]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 13:06
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Курилка, Вы писали:


К>>В первом случае тебе нужно знать и хранить в голове структуру класса, какие там поля и т.п.


КЛ>Зачем? Есть же определение. Это вот в эрланге нужно хранить, тк эти определения могут отличаться от использования к использованию. Это нечеткая

типизация со всеми вытекающими

Давай не надо придумывать интересных новых оригинальных терминов.
Типизация есть, строгая, но динамическая, если ты против неё — так и скажи, но тут уже "просто вы не умеете их готовить"
Хотя статика мне тоже очень даже нравится.
А по поводу сказанного мной поясню: если функция у тебя возвращает класс, то у тебя будет использоваться этот самый класс, со всеми его внутренностями, тогда как если я "паттернматчу" результат функции в тупл, то в результате получаю (возможно) атомарные значения, которые нужны мне в текущей функции, причём я могу на подробности, не интересные мне в данном месте (но нужные в другом случае), просто "забить", поставив там _
Например функция возвращает точку как тупл 2 координат, а мне нужна только X, я сделаю {X, _} = func(), и дальше по тексту у меня есть только переменная X, и нет объекта point с лишними подробностями.
Не ахти важный пункт, но всёж...

К>>В эрланге ты можешь сделать то же самое, если поставить Tuple = func(), но если ты "запаттернматчишь", то дальше по коду тебе не нужны подробности структуры тупла, ты работаешь с конкретными данными, которые тебя интересуют в конкретный момент.


КЛ>а как с ними работать, если мне не нужна структура тупла? Тупл, поправь меня, если я говорю что-то нето, динамическая структура данных, без строгой структурированности (сорри за каламбур).


эээ, что значит "не нужна структура тупла"? В голове только рисуется вариант диспетчерезации сообщений, когда процесс их посылает нужным получателям, тогда, что там в каких туплах — пофиг, что получили, то и переслали (если, конечно, адрес не содержится в теле сообщения).
Ни разу тупл не динамическая структура, она может быть как в динамических так и в статических языках, не надо, пожалуйста, путать. Другое дело, что поля там неименованные и адресуются порядковым номером в тупле, а для именованного доступа в эрланге есть рекорды.
Re[13]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 21.06.07 13:14
Оценка:
Здравствуйте, Курилка, Вы писали:

[]

К>Давай не надо придумывать интересных новых оригинальных терминов.


давай

К>Типизация есть, строгая, но динамическая, если ты против неё — так и скажи, но тут уже "просто вы не умеете их готовить"


ну ты с этого начал. Вообще, из этого спора вряд-ли кто-то вйдет победителями, на то и имхо.

К>Хотя статика мне тоже очень даже нравится.


[]

К>Не ахти важный пункт, но всёж...


Ты отклонился от темы. Ну да ладно.

К>>>В эрланге ты можешь сделать то же самое, если поставить Tuple = func(), но если ты "запаттернматчишь", то дальше по коду тебе не нужны подробности структуры тупла, ты работаешь с конкретными данными, которые тебя интересуют в конкретный момент.


КЛ>>а как с ними работать, если мне не нужна структура тупла? Тупл, поправь меня, если я говорю что-то нето, динамическая структура данных, без строгой структурированности (сорри за каламбур).


К>эээ, что значит "не нужна структура тупла"? В голове только рисуется вариант диспетчерезации сообщений (1), когда процесс их посылает нужным получателям, тогда, что там в каких туплах — пофиг, что получили, то и переслали (если, конечно, адрес не содержится в теле сообщения).

К>Ни разу тупл не динамическая структура, она может быть как в динамических так и в статических языках, не надо, пожалуйста, путать.(2) Другое дело, что поля там неименованные и адресуются порядковым номером в тупле, а для именованного доступа в эрланге есть рекорды.

(1) Стоп, до этого вроде рисовался вариант разбора? В том то и пробелма, что только в голове.
(2) Что ты путаешь где она может быть и кем она является? В том то и дело, что типа у тупла нет, имени нет, имен полей нет. Так что что и сколько ты туда положил, то там и будет.

В вообще, думаю проще ту мою оценку удалить, чтобы тебя не раздражать. Тема флеймовая.

Re[10]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 21.06.07 13:43
Оценка: +2 :)))
Здравствуйте, Константин Л., Вы писали:

E>>>Вот что мне не нравится в подобных декларативных вещах, что при наличии большого количества полей в PDU нужно писать большие туплы прямо в коде для того, чтобы принять результат работы parse. Можешь показать, как от этого дублирования описаний избавиться в Erlang-е


G>>Принять можно без тупла. Можно просто — Result = parse( Stream ), а разобрать его потом. Далее — не обязательно большой разбирать тупо сразу целиком.


КЛ>Ну так какая разница, сейчас или потом.


Офигенная разница, сейчас или потом. Это "потом" я могу в функцию завернуть, так, что ты его не увидишь.

КЛ>Тебе говорят о том, что, фактически, при каждом разборе ты снова будешь писать "декларацию" тупла.


У туплов нет никакой декларации, это не рекорд, поэтому я ее писать не буду вообще ни разу — ни при первом разборе, ни при последнем. Надо называть вещи своими именами. Вообще — эта претензия настолько же абсурдна и дика, как придирка к функции с несколькими аргументами — что же это их много а не один — их же блин при каждом вызове снова все 12 штук писать придется, да еще помнить, в каком порядке что идет, да еще (боже упаси) какие из них input а какие — output! Ужас то какой! Это же считай заново декларацию функции писать. Как от того избавиться — скажите же мне? А если часть аргументов функции я передавать не хочу?! Что тогда? А?! Все, в помойку ваш С++ за это — на простом вызове функции шею можно свернуть .

Во-вторых — тебе говорят о том, что вовсе не при каждом вызове надо разбирать тупл на составляющие. Фактически, при каждом разборе ты можешь делать так:

Result = parse( Stream ),
DoSomethingWithResult( Result ).

И в третьих, с чего то ты взял, что у меня один и тот же пакет будет в нескольких местах разбираться? Это уж как я программу свою организую, так и будет. И уверяю тебя, я постараюсь такой код из разных мест не вызывать. Я его аккуратно в функции запакую, а потом вызову.

И в четвертых, у меня в Эрланге есть полноценные рекорды (структуры с именованными полями), для тех случаев, когда они действительно нужны. Вы не переживайте за Эрланг, (сразу вспоминается, как английские лорды рекомендовали сделать колеса паравоза зубчатыми — чтоб не проскальзывали) — на нем уже достаточно много телеком-софта написано (эффективность разработки по метрикам реальных проектов Эриксона — вчетверо быстрее С++ при большей отказоустойчивости — т.е. паровоз давно уже ездит, и сцепление у колес офигенное, спокойно, уважаемые лорды), и ничего, туплы как-то не помешали.
Re[14]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.06.07 13:46
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Курилка, Вы писали:


[cut]

К>>Не ахти важный пункт, но всёж...


КЛ>Ты отклонился от темы. Ну да ладно.

Ни разу, я просто подробнее расписал свою мысль, или тебе видней, что я имел в виду?

К>>>>В эрланге ты можешь сделать то же самое, если поставить Tuple = func(), но если ты "запаттернматчишь", то дальше по коду тебе не нужны подробности структуры тупла, ты работаешь с конкретными данными, которые тебя интересуют в конкретный момент.


КЛ>>>а как с ними работать, если мне не нужна структура тупла? Тупл, поправь меня, если я говорю что-то нето, динамическая структура данных, без строгой структурированности (сорри за каламбур).


К>>эээ, что значит "не нужна структура тупла"? В голове только рисуется вариант диспетчерезации сообщений (1), когда процесс их посылает нужным получателям, тогда, что там в каких туплах — пофиг, что получили, то и переслали (если, конечно, адрес не содержится в теле сообщения).

К>>Ни разу тупл не динамическая структура, она может быть как в динамических так и в статических языках, не надо, пожалуйста, путать.(2) Другое дело, что поля там неименованные и адресуются порядковым номером в тупле, а для именованного доступа в эрланге есть рекорды.

КЛ>(1) Стоп, до этого вроде рисовался вариант разбора? В том то и пробелма, что только в голове.

Да почему, совсем нет, сейчас пишу одну штуку, там как раз есть подобная схемка, т.е. не только в голове, но и в коде
КЛ>(2) Что ты путаешь где она может быть и кем она является? В том то и дело, что типа у тупла нет, имени нет, имен полей нет. Так что что и сколько ты туда положил, то там и будет.
Вот тут скорей путаешь ты — по поводу того "что" положили, есть туплы статически-типизированные, так что строку туда, где число должно быть ты не положишь, ну и там же с длиной тупла ты тож не поиграешься. В динамических же языках то же самое, только вот проверка будет в рантайме и в том же Эрланге вылезет ошибка времени исполения, какой нибудь бад_матч или функцшн_клоз (в зависимости от того где у нас паттерн-матчинг).
Я же утверждал, что туплы не есть прерогатива динамических языков.
Туплы есть лишь одна из возможных структур данных со своими плюсами и минусами, а что удобней использовать — на вкус и цвет...

КЛ>В вообще, думаю проще ту мою оценку удалить, чтобы тебя не раздражать. Тема флеймовая.

Да я не раздражаюсь — нервы вещь ценная
Просто хотелось понять другую точку зрения.
Re[14]: Ещё одно сравнение с участием Эрланга
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.06.07 17:10
Оценка:
Здравствуйте, Курилка, Вы писали:

E>>Ага, а после этого говорят, что обеспечение целостности данных в C++ при исключениях -- сложное дело!


E>>Шутка


К>А если чуть серьёзней? Моделирование на процессах тебе кажется сильно сложным?


По моему субъективному мнению программирование на обмене сообщений не проще, чем программирование на непосредственных вызовах. Везде есть свои заморочки. В каких-то случаях на сообщении проще, в каких-то сложнее. Все зависит от конкретной задачи.

К>И ещё мысль — в случае такого моделирования ты разделяешь именно участки алгоритма, которые могут "отвалиться", т.е. уделяешь внимание участкам кода.

К>Тогда как для обеспечения целостности на плюсах, тебе надо рассуждать уже не только об участках кода, но и о самих, данных, как там что клинится и т.п.

Если я еще хоть что-то понимаю, заботится о данных нужно всегда. Имхо, сформировать ошибочный тупл в Erlang-е при организации очередного вызова в хвостовой рекурсии не сложнее, чем напортачить в каком-нибудь императивном языке, будь то C++, D, Java или C#.

Но, в чем Erlang существенно выигрывает у более сложных и универсальных императивных конкурентов, так это в том, что возникшее исключение не оставляет локальных данных процесса в разсогласованном состоянии. В тех же плюсах этого достичь гораздо сложнее (хотя, имхо, и проще, чем в Java или Ruby). Например, в C++ если у объекта есть два атрибута-списка в которые нужно засунуть значения в некотором методе и после изменения первого списка вылетает исключение, то нужно использовать дополнительные механизмы по восстановлению объекта в первоначальном состоянии. Чего не нужно делать в Erlang-е. В этом смысле чистая функциональность рулит, адназначна.

Однако, если речь идет о взаимодействии параллельных сущностей (нитей в C++/D/Java и процессов в Erlang), то пока не буду распространяться на эту тему. Ибо Erlang еще не в курил, а в C++ с этим у меня проблем не было.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 23.06.07 15:31
Оценка:
Здравствуйте, Курилка, Вы писали:

[]

К>Я же утверждал, что туплы не есть прерогатива динамических языков.


так это понятно, мы первоначально начали спорить о том, что удобнее

К>Туплы есть лишь одна из возможных структур данных со своими плюсами и минусами, а что удобней использовать — на вкус и цвет...


КЛ>>В вообще, думаю проще ту мою оценку удалить, чтобы тебя не раздражать. Тема флеймовая.

К>Да я не раздражаюсь — нервы вещь ценная
К>Просто хотелось понять другую точку зрения.

точка зрения -> не известно что удобнее, туплы или рекорды
Re[11]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 23.06.07 15:36
Оценка:
Здравствуйте, Gaperton, Вы писали:

[]

G>Офигенная разница, сейчас или потом. Это "потом" я могу в функцию завернуть, так, что ты его не увидишь.


Когда-то все-таки придется

КЛ>>Тебе говорят о том, что, фактически, при каждом разборе ты снова будешь писать "декларацию" тупла.


G>У туплов нет никакой декларации, это не рекорд, поэтому я ее писать не буду вообще ни разу — ни при первом разборе, ни при последнем. Надо называть вещи своими именами.


ну че ты какой придирчивый, под декларацией понималось la-la-la(field1,field2,field3) = func(...)

G>Вообще — эта претензия настолько же абсурдна и дика, как придирка к функции с несколькими аргументами — что же это их много а не один — их же блин при каждом вызове снова все 12 штук писать придется, да еще помнить, в каком порядке что идет, да еще (боже упаси) какие из них input а какие — output!


для тебя дика, для меня нет. Ты кое-что путаешь. Сигнатура функции сама все подскажет.

G>Ужас то какой! Это же считай заново декларацию функции писать. Как от того избавиться — скажите же мне? А если часть аргументов функции я передавать не хочу?! Что тогда? А?! Все, в помойку ваш С++ за это — на простом вызове функции шею можно свернуть .


G>Во-вторых — тебе говорят о том, что вовсе не при каждом вызове надо разбирать тупл на составляющие. Фактически, при каждом разборе ты можешь делать так:


ладно, не доходит, так не доходит.

[]

G>И в четвертых, у меня в Эрланге есть полноценные рекорды (структуры с именованными полями), для тех случаев, когда они действительно нужны. Вы не переживайте за Эрланг,


[]

да кто за него переживает то?
Re[16]: Ещё одно сравнение с участием Эрланга
От: deniok Россия  
Дата: 23.06.07 17:44
Оценка: +3
Здравствуйте, Константин Л., Вы писали:

КЛ>точка зрения -> не известно что удобнее, туплы или рекорды


другая точка зрения -> удобнее всего, когда и туплы, и рекорды
Re[12]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 23.06.07 18:17
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Gaperton, Вы писали:


G>>Вообще — эта претензия настолько же абсурдна и дика, как придирка к функции с несколькими аргументами — что же это их много а не один — их же блин при каждом вызове снова все 12 штук писать придется, да еще помнить, в каком порядке что идет, да еще (боже упаси) какие из них input а какие — output!


КЛ>для тебя дика, для меня нет. Ты кое-что путаешь. Сигнатура функции сама все подскажет.


Да ничего не подскажет, скажем у меня есть класс, туда передаются, скажем 1 целый аргумент и 3 строковых, не посмотрев в сигнатуру ты сходу скажешь какой параметр под каким номером идёт?
Скажем, вот местами в вебсферовских либах есть сигнатуры а-ля (string1, sring2, string3) — без жавадоков очень забавно было бы програмить
Re[13]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 23.06.07 21:45
Оценка:
Здравствуйте, Курилка, Вы писали:

[]

а как же имена параметров?
Re[14]: Ещё одно сравнение с участием Эрланга
От: Курилка Россия http://kirya.narod.ru/
Дата: 24.06.07 07:55
Оценка: :)
Здравствуйте, Константин Л., Вы писали:

КЛ>а как же имена параметров?


Ну так вот string1, sring2 и string3 и есть имена параметров, которые эклипс выдаёт.
Или имена параметров уже стали обязательной частью сигнатуры?
Есть ощущение, что нет

Пример:
interface X{
    void log(String className, String methodName);
}
    
static class A implements X{
    public void log(String methodName, String className){
        
    }
}
Re[12]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 25.06.07 07:13
Оценка:
Здравствуйте, Константин Л., Вы писали:

G>>У туплов нет никакой декларации, это не рекорд, поэтому я ее писать не буду вообще ни разу — ни при первом разборе, ни при последнем. Надо называть вещи своими именами.


КЛ>ну че ты какой придирчивый, под декларацией понималось la-la-la(field1,field2,field3) = func(...)


Не "ну че". Потрудись свои мысли формулировать по человечески, без ну че и ла-ла-ла. Смотрим:

{ out_parm1, out_parm2, out_parm3 } = func( in_parm1, in_parm2, in_parm3 ).

Никаких "ла-ла-ла" я тут не вижу. Деклараций тоже. Без туплов ты то же самое напишешь так:

out_parm3 = func( in_parm1, in_parm2, in_parm3, out_parm1, out_parm2 ).

или будешь структуры заводить. Ну ладно, не доходит, так не доходит.
Re[13]: Ещё одно сравнение с участием Эрланга
От: Константин Л. Франция  
Дата: 25.06.07 08:58
Оценка:
Здравствуйте, Gaperton, Вы писали:

[]

G>Не "ну че". Потрудись свои мысли формулировать по человечески, без ну че и ла-ла-ла. Смотрим:


может мне самому можно разобраться, как выражать свои мысли?

G>{ out_parm1, out_parm2, out_parm3 } = func( in_parm1, in_parm2, in_parm3 ).


Под декларацией тупла подразумевалось выделенное. Пардон, месье, если оскорбил твои чувства оп поводу этого.

[]
Re[14]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 25.06.07 09:42
Оценка: :)
Здравствуйте, Константин Л., Вы писали:

G>>Не "ну че". Потрудись свои мысли формулировать по человечески, без ну че и ла-ла-ла. Смотрим:


КЛ>может мне самому можно разобраться, как выражать свои мысли?


Если ты их выражаешь сам для себя, "тихо сам с собой ведешь беседу", то можешь разобраться и сам. Когда ведешь беседу с другим человеком — здесь надо заботится о том, чтобы ему, а не тебе, было понятно, что ты говоришь. И твоя манера беседу вести мне тоже не нравится. Общий тон напоминает гопоту подъездную.

G>>{ out_parm1, out_parm2, out_parm3 } = func( in_parm1, in_parm2, in_parm3 ).


КЛ>Под декларацией тупла подразумевалось выделенное. Пардон, месье, если оскорбил твои чувства оп поводу этого.


Я думал, под ней подразумевалось "ла-ла-ла", но теперь все встало на свои места. Ура, мне все понятно! Только вопрос — а нужда писать декларацию функции тебя не пугает? Под ней, очевидно, подразумевается выделенное:

G>>{ out_parm1, out_parm2, out_parm3 } = func( in_parm1, in_parm2, in_parm3 ).


Ты эта, тоже не обижайся.
Re[7]: Ещё одно сравнение с участием Эрланга
От: binarin Россия  
Дата: 27.06.07 19:21
Оценка:
E>>или бы вообще сделал генератор, который бы парсинг подобных пакетов
G> генерировал по DSL-описаниям. Это не фокус в любом языке. DSL на
G> каждый писк — не выход. Кстати, можно просто воспользоваться
G> генератором ASN.1.

Для приведенных случаев как раз только DSL и подойдёт реально. Потому как
нужно и парсить, и генерировать пакеты. И типы этих пакетов могуть быть
схожими между собой (разные PDU, или различные протоколы над IP),
т.е. общего у них много может быть.

И в таком случае одним паттерном матчить целый пакет конечно эффектно, но
не эффективно с точки зрения продуктивности программиста.

В том же oserl'е (SMPP для Erlang) самый длинный бинарный паттерн — 4
значения по 4 байта — извлекается всего один раз. Остальные места — это
откусывание от начала пакета, довольно часто — даже по одному байту, так
как — null terminated strings.

А написание DSL займёт я думаю примерно одинаковое время на любом языке
высокого уровня. Да, код на Erlang'е для работы с бинарными данными, я
думаю будет покороче и разработан быстрее. Но это не будет отличие на
порядок.
Posted via RSDN NNTP Server 2.1 beta
Re[8]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 28.06.07 09:42
Оценка:
Здравствуйте, binarin, Вы писали:

B>А написание DSL займёт я думаю примерно одинаковое время на любом языке

B>высокого уровня. Да, код на Erlang'е для работы с бинарными данными, я
B>думаю будет покороче и разработан быстрее. Но это не будет отличие на
B>порядок.

Мы проводили эксперименты с бит-синтаксисом (одному сотруднику нашего отдела надо было защищать кандидатскую, решили сделать что-то полезное). Суть эксперимента — в язык С добавляется бит-синтаксис, скопированный из Эрланга, а также множественный оператор switch, в котором можно применять соспоставление с образцом для бит-синтаксиса. Цель исследования — понять, насколько этот модифицированный С будет удобнее для программирования встраиваемых систем, в которых большая часть кода — обработка и преобразование различых бинарных протоколов.

В рамках этих работ было проведено сравнение фрагментов реализаций на С и на "С с бинарисами" для нескольких разных протоколов, в частности, был взят стек протокола ZiBee. Так вот, предварительные результаты следующие (парень будет защищаться осенью, можно будет дисер выложить наверное). Реализация протокола с бинарисами на порядок выигрывает в читабельности. Применение бинарисов предполагает другое структурирование кода, и при правильном программировании (техника другая совершенно — надо привыкнуть) код получается в разы компактнее и неизмеримо проще в понимании и поддержке (я говорю о фрагменте системы — реализации протокола, а не о всей системе, конечно). И это тот же самый язык — С. Эрланг будет еще компактнее и выразительнее — там помимо бинарисов много чего есть.

Отличия на порядок (это в десять раз, так, про между прочим) — мало какой язык даст вообще, разве что K или J — но это экзотика. Рассчитывать надо на сокращение кода с коэффициентом 2-4, что вобще-то очень даже ничего. Представьте — вы делаете проект год, или полгода. Разница есть?

Что касательно бинарисов в Эрланге — они появились не так давно. Значительная часть OTP разаботана раньше, до того, как стали доступны бинарисы. Например, AXD301 был сделан без бинарисов вообще. Поэтому не так много и примеров их использования в стандартной либе.

Что касательно DSL — его не нужно разрабатывать, есть стандартные языки для описания протоколов — ASN.1 и TTCN, и есть компиляторы из них во все популярые языки.
Re[8]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 28.06.07 09:49
Оценка:
Здравствуйте, binarin, Вы писали:

B>В том же oserl'е (SMPP для Erlang) самый длинный бинарный паттерн — 4

B>значения по 4 байта — извлекается всего один раз. Остальные места — это
B>откусывание от начала пакета, довольно часто — даже по одному байту, так
B>как — null terminated strings.

null-terminated string, кстати, проблемой не является. Еще раз.

{ RestOfStream, [
   String1,
   << Number:7, Num2:9 >>,      здесь разбирается бинарис длиной в два байта
   String2,
   CompoundType ] } = parse( Stream, [ string, 2, string, my_module:my_parse_fun/1 ] ),


И все. В предыдущем посте я объяснил в двух словах, как это рабтает.
Re[9]: Ещё одно сравнение с участием Эрланга
От: geniepro http://geniepro.livejournal.com/
Дата: 28.06.07 17:29
Оценка:
Здравствуйте, Gaperton, Вы писали:

g> Суть эксперимента — в язык С добавляется бит-синтаксис, скопированный из Эрланга, а также множественный оператор switch, в котором можно применять соспоставление с образцом для бит-синтаксиса.


А можно поглядеть на пример такого кода? Похоже на паттерн-матчинг списков в Хаскелле?
Re[9]: Ещё одно сравнение с участием Эрланга
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 29.06.07 06:37
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>В рамках этих работ было проведено сравнение фрагментов реализаций на С и на "С с бинарисами" для нескольких разных протоколов, в частности, был взят стек протокола ZiBee.


Извиняюсь за вопрос не совсем в тему. Вы покупали реализацию ZigBee или писали с нуля по спеку? Если покупали, то у кого?
Спасибо.
bloß it hudla
Re[10]: Ещё одно сравнение с участием Эрланга
От: Аноним  
Дата: 29.06.07 07:27
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Здравствуйте, Gaperton, Вы писали:


G>>В рамках этих работ было проведено сравнение фрагментов реализаций на С и на "С с бинарисами" для нескольких разных протоколов, в частности, был взят стек протокола ZiBee.


AL>Извиняюсь за вопрос не совсем в тему. Вы покупали реализацию ZigBee или писали с нуля по спеку? Если покупали, то у кого?

Не, у нас есть отдел сенсорных сетей есть, и они сделали собственную реализацию протокола, похожего на ЗигБи. Я говорю "похожего", потому что на совместимость со стандартом его никто не тестировал, но парни вроде как собирались сделать ЗигБи — я думаю, вы понимаете, что я имею в виду . Вы, кстати, не в мешнетиксе случайно работаете?

AL>Спасибо.


Да нивапрос, обращаейтесь . Могу познакомить с руководителем направления сенсорных сетей, если интересно. В гости приезжайте если что — это можно устроить.
Re[11]: Ещё одно сравнение с участием Эрланга
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 29.06.07 07:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не, у нас есть отдел сенсорных сетей есть, и они сделали собственную реализацию протокола, похожего на ЗигБи. Я говорю "похожего", потому что на совместимость со стандартом его никто не тестировал, но парни вроде как собирались сделать ЗигБи — я думаю, вы понимаете, что я имею в виду . Вы, кстати, не в мешнетиксе случайно работаете?


Спасибо по-любому. Я здесь работаю.
bloß it hudla
Re[12]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 29.06.07 07:39
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

А>>Не, у нас есть отдел сенсорных сетей есть, и они сделали собственную реализацию протокола, похожего на ЗигБи. Я говорю "похожего", потому что на совместимость со стандартом его никто не тестировал, но парни вроде как собирались сделать ЗигБи — я думаю, вы понимаете, что я имею в виду . Вы, кстати, не в мешнетиксе случайно работаете?


AL>Спасибо по-любому. Я здесь работаю.


Интересная компания. Спасибо за ссылку? Вы производите или собираетесь производить зиг-би модули? Или делаете решения для пром-автоматизации на базе беспроводных технологий? Наши парни могут продать вам свой стек по сходной цене — он хоть и не вполне совместим с зиг би, но по ряду параметров превосходит стандартные реализации (несовместимость сделана отчасти специально). Ну, и обойдется вам дешевле.
Re[13]: Ещё одно сравнение с участием Эрланга
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 29.06.07 07:55
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Интересная компания. Спасибо за ссылку? Вы производите или собираетесь производить зиг-би модули?


Пока у нас все "на проводах" Однако давно хотим иметь wireless-решения среди нашей продукции. Но сейчас наблюдается полный бардак со стандартизацией в этой области. На базе физики 802.15.4, помимо ZigBee (все еще неустаканенный стандарт), активно проталкиваются инициативы от ISA's SP-100 Committee и от HART Communications Foundation (HCF). Ну и PI (Profibus International, ведомая Сименс) разродилась профилем PROFIsafe для беспроводных сетей. Таким образом, сейчас бессмысленно ставить на какую-то одну спецификацию (тем более нет ни одной утвержденной). Видимо, если решимся, придется городить какого-то мультипротокольного дикобраза поверх 802.15.4.
bloß it hudla
Re[14]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 29.06.07 08:10
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Здравствуйте, Gaperton, Вы писали:


G>>Интересная компания. Спасибо за ссылку? Вы производите или собираетесь производить зиг-би модули?


AL>Пока у нас все "на проводах" Однако давно хотим иметь wireless-решения среди нашей продукции. Но сейчас наблюдается полный бардак со стандартизацией в этой области. На базе физики 802.15.4, помимо ZigBee (все еще неустаканенный стандарт), активно проталкиваются инициативы от ISA's SP-100 Committee и от HART Communications Foundation (HCF). Ну и PI (Profibus International, ведомая Сименс) разродилась профилем PROFIsafe для беспроводных сетей. Таким образом, сейчас бессмысленно ставить на какую-то одну спецификацию (тем более нет ни одной утвержденной). Видимо, если решимся, придется городить какого-то мультипротокольного дикобраза поверх 802.15.4.


Насчет зигби — парни говорят, вышла вторая версия спецификации. Есть масса зигби решений — одним из лучших, вероятно, будет решение от Мешнетикса (российская компания, кстати). Мешнетикс совместно с атмелом разработал микросхему-контроллер, и сам производит компактные зигби модули с софтом, рассчитывая на рынок промавтоматизации. Однако, в зигби во-первых, много граблей — в частности, по времени отклика на событие, во-вторых (и этим многое обусловлено) — эта технология презнаначена в первую очередь для самоорганизующихся распределенных сетей передачи информации с автономным питанием, в основном — для интеллектуальных зданий. Элемент сети обслуживается простым 16-битным микроконтроллером, должен жрать мало энергии экономя батареи, и единственное что делает — передает по сети информацию от простых подсоединенных к нему датчиков + организует транзитную передачу данных через себя. Не знаю, эти ли вам нужно, здесь все сильно зависит от приложения.
Re[10]: Раз уж пошел оффтопик
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.06.07 08:14
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

G>>В рамках этих работ было проведено сравнение фрагментов реализаций на С и на "С с бинарисами" для нескольких разных протоколов, в частности, был взят стек протокола ZiBee.


AL>Извиняюсь за вопрос не совсем в тему. Вы покупали реализацию ZigBee или писали с нуля по спеку? Если покупали, то у кого?


Коллеги, раз уж вы здесь разговор о встраиваемых системах завели, может поделитесь информацией: на чем пишете, какая специфика и пр.

Просто интересно, можно сказать, ностальгия по давно забытым временам.



SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[11]: Раз уж пошел оффтопик
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 29.06.07 08:46
Оценка:
Здравствуйте, eao197, Вы писали:

E>Коллеги, раз уж вы здесь разговор о встраиваемых системах завели, может поделитесь информацией: на чем пишете, какая специфика и пр.


В каком смысле "на чем пишете"? На чем придется, на том и пишем . Низ -- C/asm, верх -- Java. Внизу специфика обычная: мало памяти, мало процессора, мало времени, много событий из окружения (ввод-вывод, сетки и пр.) и много чего надо поделать со всей этой радостью. Из мелочей: тормозные флэшки, кривые чипы и т.д. Вверху специфики нет.
bloß it hudla
Re[12]: Раз уж пошел оффтопик
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.06.07 09:03
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

E>>Коллеги, раз уж вы здесь разговор о встраиваемых системах завели, может поделитесь информацией: на чем пишете, какая специфика и пр.


AL>В каком смысле "на чем пишете"? На чем придется, на том и пишем . Низ -- C/asm, верх -- Java.


Это и интересовало
Я уж думал, что низ нонче на Erlang-е пишут

AL>Внизу специфика обычная: мало памяти, мало процессора, мало времени, много событий из окружения (ввод-вывод, сетки и пр.) и много чего надо поделать со всей этой радостью. Из мелочей: тормозные флэшки, кривые чипы и т.д.


Угу, ничего не меняется


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[13]: Раз уж пошел оффтопик
От: Gaperton http://gaperton.livejournal.com
Дата: 29.06.07 09:42
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, A.Lokotkov, Вы писали:


E>>>Коллеги, раз уж вы здесь разговор о встраиваемых системах завели, может поделитесь информацией: на чем пишете, какая специфика и пр.


AL>>В каком смысле "на чем пишете"? На чем придется, на том и пишем . Низ -- C/asm, верх -- Java.


E>Это и интересовало

E>Я уж думал, что низ нонче на Erlang-е пишут

Ага, щаз . Со вставками на клиппере — для скорости .
Re[14]: Раз уж пошел оффтопик
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 29.06.07 09:51
Оценка:
Здравствуйте, Gaperton, Вы писали:

AL>>>В каком смысле "на чем пишете"? На чем придется, на том и пишем . Низ -- C/asm, верх -- Java.


E>>Это и интересовало

E>>Я уж думал, что низ нонче на Erlang-е пишут

G>Ага, щаз . Со вставками на клиппере — для скорости .


Ну ктож знает, до чего прогресс дошел?
Вот, например, HP успешно Eiffel для софта принтеров использовали: http://archive.eiffel.com/eiffel/projects/hp/creel.html


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Ещё одно сравнение с участием Эрланга
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 29.06.07 12:01
Оценка:
Здравствуйте, Gaperton, Вы писали:


Не дискуссии ради

G>Насчет зигби — парни говорят, вышла вторая версия спецификации. Есть масса зигби решений — одним из лучших, вероятно, будет решение от Мешнетикса (российская компания, кстати).


Текущий релиз спецификации пока не принят альянсом, народ делает поделки на свой страх и риск. А кончиться это может для большинства очень плохо, если какой-нибудь гигант типа ханивела или сименса протолкнет свое решение. Т.е. кого-то самого успешного купят большие дяди, а остальные пойдут по миру.

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


Исходная мотивация, насколько я помню первый buzzz о zigbee, в первую очередь относилась к Industrial Automation, i.e. хотелось выбросить тысячи километров кабельной разводки к датчикам и низовым контроллерам, а также иметь широковещательную сеть с короткими сообщениями для обмена realtime-данными. С home/building automation все гораздо сложнее с политической точки зрения, ибо там рулят Lon, BACnet и EIB, первые двое из которых уже давно закладываются в большинство проектов умных домов.
bloß it hudla
Re[16]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 29.06.07 12:14
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Здравствуйте, Gaperton, Вы писали:



AL>Не дискуссии ради


G>>Насчет зигби — парни говорят, вышла вторая версия спецификации. Есть масса зигби решений — одним из лучших, вероятно, будет решение от Мешнетикса (российская компания, кстати).


AL>Текущий релиз спецификации пока не принят альянсом, народ делает поделки на свой страх и риск. А кончиться это может для большинства очень плохо, если какой-нибудь гигант типа ханивела или сименса протолкнет свое решение. Т.е. кого-то самого успешного купят большие дяди, а остальные пойдут по миру.


Да, это вполне возможно. Хотя если не требовать совместимости интеллектуальных датчиков от разных производителей между собой — то это не так и важно. Главное — чтобы наши датчики дружили друг с другом и имели хорошие характеристики.

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


AL>Исходная мотивация, насколько я помню первый buzzz о zigbee, в первую очередь относилась к Industrial Automation, i.e. хотелось выбросить тысячи километров кабельной разводки к датчикам и низовым контроллерам, а также иметь широковещательную сеть с короткими сообщениями для обмена realtime-данными. С home/building automation все гораздо сложнее с политической точки зрения, ибо там рулят Lon, BACnet и EIB, первые двое из которых уже давно закладываются в большинство проектов умных домов.


Может быть и так. Собственно, зигби — это не моя тема, я понаслышке тока знаю . Парни говорят, данные там не очень рилтайм получаются. Узлы с автономным питанием, выходят на связь по расписанию. Соответственно, время замены элементов питания в узлах тем больше, чем в меньшей степени рилтайм мы имеем. 1-10 секунд — это рилтайм? При передаче постоянного траффика, например — голоса, время жизни элементов сети составляет вообще порядка нескольких часов. Хотя — может быть это проблемы нашего зигби и наших датчиков.

Насчет широковещательности — парни говорили что сеть логически не является широковещательной — она с пакетной маршрутизацией. Стандартом предусмотрено два типа топологии — дерево и mesh. Сообщения ходят по узлам с маршрутизацией соответствующей устаканившейся на сетке топологии.
Re[17]: Ещё одно сравнение с участием Эрланга
От: A.Lokotkov Россия http://www.linkedin.com/pub/alexander-lokotkov/a/701/625
Дата: 29.06.07 12:30
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Может быть и так. Собственно, зигби — это не моя тема, я понаслышке тока знаю . Парни говорят, данные там не очень рилтайм получаются. Узлы с автономным питанием, выходят на связь по расписанию. Соответственно, время замены элементов питания в узлах тем больше, чем в меньшей степени рилтайм мы имеем. 1-10 секунд — это рилтайм? При передаче постоянного траффика, например — голоса, время жизни элементов сети составляет вообще порядка нескольких часов. Хотя — может быть это проблемы нашего зигби и наших датчиков.


1-10 секунд для некоторых видов датчиков (термопары, газоанализаторы и т.п.) является самым что ни на есть реалтаймом. В промышленной автоматизации автономность питания не есть обязательное требование, поскольку многим датчикам по любому надо чем-то питать первичный (и вторичный) преобразователи, так что не вижу проблем использовать меньшие периоды обмена.

G>Насчет широковещательности — парни говорили что сеть логически не является широковещательной — она с пакетной маршрутизацией. Стандартом предусмотрено два типа топологии — дерево и mesh. Сообщения ходят по узлам с маршрутизацией соответствующей устаканившейся на сетке топологии.


Если смотреть на этот вопрос строго, то да, -- каждый кадр zigbee содержит source и target id, т.е. идентифицируется не само сообщение, как в CAN, а узел-источник и узел-получатель. Однако групповые (multicast) кадры также конечно же предусмотрены.

Основная проблема кмк на самом деле состоит в совместимости (вернее несовместимости) прикладного уровня у разных вендоров.
bloß it hudla
Re[13]: Раз уж пошел оффтопик
От: geniepro http://geniepro.livejournal.com/
Дата: 29.06.07 17:06
Оценка:
Здравствуйте, eao197, Вы писали:

e> Я уж думал, что низ нонче на Erlang-е пишут


Скоро, видимо, низ будут на С# писать, или других .NET языках.
Майкрософт делает .NET Micro Framework, уже есть версия для одного DSP-микроконтроллера...
Re[11]: Ещё одно сравнение с участием Эрланга
От: Изя Рнет Беларусь  
Дата: 29.06.07 20:07
Оценка:
Здравствуйте, eao197, Вы писали:

E>Кстати, хочу поинтересоваться у Эрланговедов -- как в Эрланге обстоит дело с освобождением ресурсов при исключениях. Скажем, в C++ и D есть RAII, деструктор может завершить начатые операции. А в Эрланге как? Начинаем транзакцию в БД, к примеру, затем процесс падает. Кто будет транзакцию откатывать? В какой момент?


Давайте рассмотрим такую ситуацию. Пусть есть обычный сервер баз данных и есть программа, которая говорит с ним по самому обычному TCP-соединению. Вдруг посередине транзакции программа падает — так бывает. Кто будет транзакцию откатывать? В какой момент?

Я думаю, Вы прекрасно знаете ответ на эти вопросы.

Так вот, у бабочек^W^W в Эрланге практически то же самое. Процесс A начинает транзакцию с процессом B, состоящую из двух сообщений и, если A подохнет после первого, состояние B будет неконсистентым. В этом случае B должен поставить монитор на A (см. erlang:monitor), а по приходу сообщения 'DOWN' сделать сами знаете что. Ну или покрашиться, а там дальше разберутся, если кому-то это интересно.
Re[3]: Ещё одно сравнение с участием Эрланга
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.07 00:45
Оценка: -1
Здравствуйте, eao197, Вы писали:

E>Поясню свою мысль: даже при идеальном кодировании, C++ не догонит Erlang по компактности и, вероятно, корректности, распределенных приложений (особенно в телекоме). DSL (коим мне представляется Erlang на данных задачах) -- он и в Африке DSL. Но вот разрывы в показателях между нормальными C++ программами и аналогичными Erlang-овскими уже не будут составлять 7-8 раз, а раза эдак 2-3.


Эрланг в целом обычный ФЯ. В нем конечно есть маленький DSEL, но подобный можно и на макросах залудить.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Ещё одно сравнение с участием Эрланга
От: Gaperton http://gaperton.livejournal.com
Дата: 14.08.07 12:55
Оценка:
Здравствуйте, geniepro, Вы писали:

g>> Суть эксперимента — в язык С добавляется бит-синтаксис, скопированный из Эрланга, а также множественный оператор switch, в котором можно применять соспоставление с образцом для бит-синтаксиса.


G>А можно поглядеть на пример такого кода? Похоже на паттерн-матчинг списков в Хаскелле?


Нет, имеет мало общего с Хаскелем. В С нет сборщика мусора, так что выбрали характерную для С семантику операций — чтение из памяти и запись в память. Например, так (синтаксис по памяти привожу — он примерный):

pAfter = mem_write<< x : 4, y : 3, z : 1, binary buffer : size >>( pStart );

pAfter = mem_read<< x : 4, unsigned int y : 3, z : 1, binary buffer : size >>( pStart );
if( pAfter == pStart )
return MATCH_FAILED;

switch( pBinary, parameter )
{
case( << x : 4, SOME_CONSTANT : 3, z : 1, binary buffer : size >>, VALUE ) :
...
break;
...
}

Что-то в этом духе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.