Можно ли создавать параллельные масштабируемые надежные программы на C, как на Erlang? - PullRequest
6 голосов
/ 19 марта 2009

теоретический вопрос. Прочитав книгу Армстронга «Программирование на эрланге», я подумал: Это займет некоторое время, чтобы выучить Erlang. Не говоря уже о том, чтобы овладеть им. Это действительно принципиально отличается во многих отношениях.

Итак, мой вопрос: возможно ли написать «как erlang» или с некоторой «erlang like framework», которая, учитывая, что вы заботитесь о том, чтобы не создавать функции с побочными эффектами, вы можете создавать масштабируемые надежные приложения так же, как и в Erlang? Может быть, с одной и той же отправкой сообщений, множеством парадигм «мини-процессов».

Преимущество состоит в том, чтобы не бросать все свои накопленные знания C / C ++ через забор.

Любые мысли по этому поводу приветствуются

Ответы [ 6 ]

8 голосов
/ 19 марта 2009

Да , возможно, , но ...

Вероятно, лучший ответ на этот вопрос дает первое правило Роберта Вирдинга:

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

Очень хорошее правило: используйте правильный инструмент для задания . Erlang отличается параллелизмом и надежностью. C / C ++ не был разработан с учетом этих свойств.

Если вы не хотите отбрасывать свои знания C / C ++ и опыт и ваш проект допускает такое разделение, хороший подход заключается в создании смешанного решение . Напишите в Erlang код одновременной работы, связи и обработки ошибок, затем добавьте части C / C ++, которые будут выполнять операции с процессором и вводом-выводом.

4 голосов
/ 20 марта 2009

Вы можете ясно - система Erlang / OTP в основном написана на C (и Erlang). Вопрос в том, почему вы хотите?

Раньше люди писали свои собственные операционные системы, но зачем вам это нужно?

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

Система Erlang / OTP имеет 1,5 млн строк кода, что обеспечивает 99,99999999% времени безотказной работы в больших системах (телефонная система Великобритании) - это время простоя 31 мс в год.

С Erlang / OTP ваше неписанное программное обеспечение обладает высокой надежностью, оно может выполнять «горячую» замену, ваше неписанное приложение может переключаться при сбое когда физический компьютер умирает.

Почему вы хотите переписать эту функциональность?

2 голосов
/ 19 марта 2009

Я бы разбил это на 2 вопроса

Можете ли вы писать параллельные, масштабируемые приложения C ++

Да. Конечно, возможно создать низкоуровневые конструкции, необходимые для достижения этого.

Хотите писать параллельные, масштабируемые приложения на C ++

Возможно. Но если бы я собирался использовать приложение с высокой степенью параллелизма, я бы выбрал язык, который был бы либо спроектирован так, чтобы заполнить этот пробел, либо легко поддается этому (Erlang, F # и, возможно, C #).

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

1 голос
/ 19 марта 2009

Что я могу сделать на одном полном языке Тьюринга Я могу сделать на любом другом языке полного Тьюринга.

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

Ответ на этот вопрос весьма субъективен. Для меня это легче написать на C ++ по следующим причинам:

  • Я уже сделал это на C ++ (как минимум три раза).
  • Я не знаю Эрланга.
  • Я много читал о Stackless Python, который мне кажется очень параллельной системой многозадачности, основанной на сообщениях, в Python, но, конечно, python написан поверх C.

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

1 голос
/ 19 марта 2009

Да, но вы будете выполнять дополнительную работу.

Что касается побочных эффектов, подумайте, как приближается команда .net / plinq. Plinq не сможет навязать вам это без каких-либо побочных эффектов, но он будет предполагать, что вы делаете это и играете по его правилам, поэтому мы используем более простой API. Даже если у языка нет встроенной поддержки, он все равно упростит ситуацию, поскольку вы сможете легче нарушать операции.

0 голосов
/ 19 марта 2009

Основная «проблема» с C (или C ++) для написания надежных и легко расширяемых программ заключается в том, что в C вы можете делать все, что угодно . Итак, первым шагом было бы написать простую структуру, которая немного ограничивает. большинство хороших программистов так или иначе делают.

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

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

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

...