Итак, что сразу вспоминают, когда речь заходит про Erlang? Обычно вспоминают что это «параллельный язык программирования» и, во-вторых «у него медленная математика», а уж «числами с плавающей запятой лучше и не пользоваться ибо совсем трактор».
С «плавающей точкой» в самом деле были сложности, точнее, скорость работы не радовала, только вот с тех времен уже лет десять прошло. Точнее, с тех времен, когда это было правдой.
Когда говорят про медленную математику, то сразу хочется спросить: «по сравнению с чем»? Согласитесь, что человек по скорости вычислений уступает даже калькулятору, но из-за этого мы ведь не бьемся головой о стены с криками «о горе, горе нам». В общем, если вам нужны быстрые вычисления, CUDA вам в руки…
— Стоп! – скажет внимательный читатель. – Но я же четко помню, что этот ваш Эрланг используют в кластерах которые чего-то там считают.
И, опять, верно. Ключевое слово тут — кластер. Erlang создавался для других целей, для которых он поистине незаменим и это одна из них.
Представим себе, что есть некий поток данных, которые надо обрабатывать и, желательно, в режиме близком к реальному времени. Поток мягко говоря большой и на одном компьютере все это не провернуть, а это значит, что надо разворачивать «ферму». Но, как назло, стандартные дистрибутивы для организации «ферм» вам не подходят. А нестандартные не доступны… блокада там, финансовые сложности или еще что-нибудь, не важно.
А тут вы пишите числодробилку на Си или CUDA, делаете образ и разворачиваете потребное количество машин (Node). Ну а затем, Erlang в поте лица занимается тем что обеспечивает согласованную и безотказную работу.
И тут мы подходим к тезису, что Erlang это «параллельный язык программирования».
Тут стоит сразу заметить, что сама фраза построена неверно. Ибо параллельных и уж тем более перпендикулярных языков не бывает. Ладно-ладно, не буду придираться к словам.
Итак, считается, что Erlang разрабатывался как язык для обеспечения параллельных вычислений, но это не так, точнее совсем не так.
Язык программирования Erlang разрабатывался не для развлечения, а как вполне себе промышленный язык. И, основной фичей языка была… надежность.
Да-да, так как язык этот функциональный, то, в принципе, можно доказать что определенная программа «надежна». То есть ее поведение предсказуемо и доказуемо. А теперь вспомним, что язык разрабатывался для телекома, где надежность это краеугольный камень.
— А как же параллельность? – расстроено спросит читатель.
А параллельность это побочный эффект выбранной архитектуры языка. Эдакий бонус. Ведь, по сути, Erlang, сам по себе ничего не распараллеливает, он только предоставляет программисту необходимый набор возможностей, для удобного написания таких программ. Напомню, что во времена создания языка, а это конец 80-х, с многоядерными и многопроцессорными компьютерами было не сказать что густо. Как говорится, товар этот был, сугубо штучный.
Но, параллельность, а точнее, работа приложения на нескольких узлах – это тоже элемент увеличения надежности. Точнее это уже обеспечение надежности не кода, а надежности аппаратной.
Еще один бонус, получился уже из-за параллельности. Так как нет побочных эффектов и код распределен, то можно с чистой совестью использовать сборщик мусора, так как он не будет вешать все приложение. Таким образом, мы получаем защиту от самых распространенных ошибок связанных с утечкой памяти. А ведь это тоже элемент надежности.
Осталось помянуть еще тот факт, что приложение может быть обновлено без его полной остановки и основной принцип языка должен стать понятен – «надежность» и «предсказуемость».
За сим, разрешите откланяться… и не принимайте управленческие решения на основе мифов и домыслов.
ссылка на оригинал статьи http://habrahabr.ru/post/199464/
Добавить комментарий