LINUX.ORG.RU

D, Go и Rust, взлетит ли что-нибудь?

 , , , ,


4

8

Привет, LOR. На данный момент в окружающее пространство уже некоторое время накатывает следующая мысль: «Разработчикам прикладного ПО, использующим в своей практике Си и C++, крайне необходимо облегчить жизнь, избавив от ошибок с памятью и предоставив удобные механизмы для параллельного программирования». Одни адепты, этакие Базаровы от программирования, предлагают воплощать задумку с помощью новых языков: D, Go и Rust. Другие же, коих пока явно больше, всячески не желают выходить из своей зоны комфорта, предлагая включать необходимое в новые стандарты уже используемых инструментов.

Как думаешь, садиться ли уже сейчас за изучение одного из убийц Си/C++, чтобы через 5 лет не оказаться на обочине индустрии, или же все продолжит идти в старом русле с незначительными вливаниями новшеств?

Ответ на: комментарий от eao197

Это у вас None будет информировать об ошибке-то?

а почему нет? если у вас operator| принимает сущность IPipe с функцией bool valid() const то что ему мешает проверять аргументы на валидность? если же он у вас всеяден, то да только эксепшены.

anonymous
()
Ответ на: комментарий от anonymous

В плюсах вообще не обязательно иметь IPipe с функцией bool valid(). Это может быть объект типа L с R operator()(M&), где L — это анонимный тип, сгенерированный самим компилятором.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

В плюсах вообще не обязательно иметь IPipe с функцией bool valid(). Это может быть объект типа L с R operator()(M&), где L — это анонимный тип, сгенерированный самим компилятором.

тем не менее суть моего предложения, надеюсь, понятна.

anonymous
()
Ответ на: комментарий от anonymous

тем не менее суть моего предложения, надеюсь, понятна.

Понятна. Это ничем не отличается от того, что я сказал выше: «Это всего лишь будет означать перемещение всех if(r.error) из одного места конструирования конвейера в разные места.» Просто «разные места» вы объединили в один оператор|.

Однако, после того, как этот operator| отработает, его возвращаемое значение ведь все равно нужно будет обработать. Так что в случае, если ошибок не было, то проход по всем if-ам состоится в обязательном порядке.

И это не говоря уже о том, что если в месте конструирования pipeline мы не можем обработать ошибку, то нам нужно будет экземпляр Maybe/Either отдавать наверх. Т.е. писать что-то вроде:

either<ok, error> process_input(input_stream input)
{
  auto r = input.get_message_stream() | filter(...) | ...;
  match(r) {
    case pipeline :
      return pipeline.run();
  }
  return r;
}
Вместо:
void process_input(input_stream input)
{
  auto pipeline = input.get_message_stream() | filter(...) | ...;
  pipeline.run();
}

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Это у вас None будет информировать об ошибке-то?

Кто мешает вместо None использовать объект (структуру) любой сложности?

ovk48 ★★★
()
Ответ на: комментарий от ovk48

Кто мешает вместо None использовать объект (структуру) любой сложности?

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

eao197 ★★★★★
()
Ответ на: комментарий от eao197

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

вот только в том же окамловском Async'e ловить исключения нужно специальным костылем. в других языках думаю ситуация похожая.

anonymous
()
Ответ на: комментарий от anonymous

вот только в том же окамловском Async'e ловить исключения нужно специальным костылем. в других языках думаю ситуация похожая.

А можно раскрыть подробнее?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

И не нужно протаскивать эти структуры через сигнатуры функций.

Дык это не просто протаскивание структур. Either, как и все монады, обладает семантикой «последовательных вычислений с контекстом». Т.е.:

- все вычисления, связанные друг с другом в «конвейер», гарантированно выполнятся, нет нарушений или прерываний control flow;

- если вместо тупого None / Left <error> чуть усложнить контекст, то появляется возможность неявно накапливать информацию с каждого шага «конвейера». Например, если ошибки возможны на каждом этапе некоторого вычисления, то есть возможность собрать их все в одну коллекцию без того, чтобы городить вложенные try/catch и т.д.

ovk48 ★★★
()
Ответ на: комментарий от eao197

А можно раскрыть подробнее?

функции в Async'e шедулятся, а не напрямую вызываются. например:

g >>= f >>= h

запланирует g, когда результат ее вычисления будет доступен то будет запланирована f с аргументом равному возвращенному значению из g и т.д. так вот, try g >>= f >>= h with _ -> ... тут не отработает, т.к. экспешен бросится внутри шедулера. поэтому в async'e есть костыль в виде try_with который протащит эксепшн из шедулера.

anonymous
()
Ответ на: комментарий от ovk48

все вычисления, связанные друг с другом в «конвейер», гарантированно выполнятся, нет нарушений или прерываний control flow;

Кем это гарантируется? Вот, например, фрагмент только что написанного кода:

while( m_active_requests.size() < requests )
{
	auto id = ++m_last_id;
	m_active_requests[ id ] = request_smart_ptr_t(
		new request( so_direct_mbox(), id, random( 10, 500 ) );
}
В run-time здесь только по bad_alloc можно вылететь, как минимум, в двух местах. А если еще и тип m_last_id будет посложнее или за random-ом будет скрываться какая-то хитрая механика, то и другие исключения в run-time возможны.

Так кто сможет гарантировать отсутствие хотя бы bad_alloc-а в run-time?

- если вместо тупого None / Left <error> чуть усложнить контекст, то появляется возможность неявно накапливать информацию с каждого шага «конвейера».

Какой-то хитрый конвейер. С предыдущего шага нормальное значение должно приходить, а не ошибка.

Если же предыдущий шаг может вернуть значение + еще что-то, то незачем это что-то оформлять исключением. Пусть значение + что-то возвращается в виде тупла.

eao197 ★★★★★
()
Ответ на: комментарий от ovk48

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

eao197 ★★★★★
()
Ответ на: комментарий от ovk48

полмонады

Звучит как грязное ругательство.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.