avva: (Default)
[personal profile] avva
Прочитал книгу Джо Армстронга про Эрланг. Теперь подмывает что-нибудь на нем написать.

Очень стройный, интересный и гармоничный язык.

Если прыгать по ключевым словам, то Эрланг:

- функциональный язык, но с вполне обычной императивной семантикой исполнения
- компилируется в байткод и выполняется в виртуальной машине, с очень удобной интерактивной средой (как Лисп)
- динамические типы (с опциональной статической аннотацией)
- immutable state, переменные получают значение один раз и больше его не меняют
- pattern-matching как в Хаскеле или даже круче, list comprehension как в Питоне
- типичная программа состоит из множества очень легких "процессов", которые выполняются одновременно, не имеют между собой общей памяти, общаются путем явной передачи сообщений
- эти процессы с одинаковой легкостью могут быть внутри одной виртуальной машины или в нескольких разных или во многих на разных серверах, в их общении при этом ничего не меняется, следовательно: scaling up, fault tolerance, multicore programming - все это делать легко и приятно

Что мне особенно нравится: интерактивная среда. Удобнейший pattern-matching в заголовках функций. Подход Эрланга к обработке ошибок (подход let it crash на любую непредвиденную ошибку: пусть процесс падает, другие это заметят, запишут в лог, перезапустят). Удобный синтаксис для работы с отдельными битами в памяти.

Что мне не нравится: работа со строками, кажется, утомительна и многословна. Циклы на коленке через хвостовую рекурсию уже не вставляют. Отсутствие настоящих статических типов играет, вероятно, свою роль в достаточно объемных проектах.

Книга отлично написана, очень рекомендую. Для знакомства с языком достаточно прочитать первую половину (первые три части), а также главы 24 и 26, где описаны важные принципы построения программ из процессов. Остальные 50% - подробное знакомство с некоторыми стандартными библиотеками, и несколько обширных примеров кода - можно пропустить или быстро пролистать.

(мне понравилось, как Армстронг развивает метафору множества процессов, как комнаты, наполненной людьми. Они все между собой разговаривают - передают сообщения. Дальше он говорит, предположим, я один из них, тут у меня инфаркт, я падаю и умираю - наверное, кто-нибудь заметит, уберет мой труп, перепоручит мою работу другому - вот так же и процессы...)
Page 1 of 5 << [1] [2] [3] [4] [5] >>

Date: 2014-04-16 05:44 pm (UTC)
From: [identity profile] raydac.livejournal.com
эрланг - пролог из которого выбросили много вкусного и оптимизировали для работы с сообщениями, многозадачностью и бинарными данными

Date: 2014-04-16 05:48 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет. От пролога в Эрланге осталось только кое-что из синтаксиса. Семантика языка совершенно другая, нет поиска и бэктрэкинга - а это самая сердцевина Пролога, без этого вообще нет смысла считать это тем же *или даже похожим* языком.
Edited Date: 2014-04-16 05:48 pm (UTC)

Date: 2014-04-16 05:50 pm (UTC)
From: [identity profile] raydac.livejournal.com
дак я и говорю, вкусное вырезали, но после пролога осваивается очень легко, что мне нравится в эрланге пожалуй то что у него своя VM заточенная под него, семантический разрыв с ней минимален, было бы на какой то другой, грош цена была бы имхо

Date: 2014-04-16 05:53 pm (UTC)
From: [identity profile] zelych.livejournal.com
А можно немножко подробнее про "pattern-matching как в Хаскеле или даже круче"?
Edit: т.е. чем он круче?
Edited Date: 2014-04-16 05:53 pm (UTC)

Date: 2014-04-16 05:55 pm (UTC)
From: [identity profile] palmas1.livejournal.com
А зачем он вообще нужен, подо что заточен? Что на нём удобно делать?

Date: 2014-04-16 05:58 pm (UTC)
From: [identity profile] zelych.livejournal.com
например, легко масштабируемый сервер, обрабатывающий запросы от миллиона клиентов.

Date: 2014-04-16 06:00 pm (UTC)
From: [identity profile] francis-drake.livejournal.com
а это ведь ты говорил, ссылаясь на [livejournal.com profile] thesz, что зелёные нити в Хаскелле таки дешевле, чем в эрланге?

Date: 2014-04-16 06:03 pm (UTC)
From: [identity profile] amigofriend.livejournal.com
Даже от четырёхсот пятидесяти миллионов (см. WhatsApp).

Date: 2014-04-16 06:04 pm (UTC)
develop7: (dero)
From: [personal profile] develop7
добро пожаловать в клуб!

Date: 2014-04-16 06:09 pm (UTC)
From: [identity profile] avva.livejournal.com
Наверное, про "даже круче" я несколько преувеличил (перечитал сейчас, что есть в Хаскеле). Мне понравилось, во-первых, что в Эрланге можно весь паттерн или часть его присвоить переменной. Я вижу, что это есть в Хаскеле в виде "as pattern", но кажется, только для всего паттерна, а не его части. Т.е. что-то вроде

f ( {First, Second, Pair={Third, Fourth}} ) ->

в Хаскеле так легко не делается?

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

Date: 2014-04-16 06:10 pm (UTC)
From: [identity profile] zelych.livejournal.com
Не помню.
Ссылаться мог, сам утверждать не мог (как они в GHC устроены -- знаю, про эрланг совсем ничего не знаю).
У thesz, похоже, немножко confirmation bias в сторону хаскеля, так что я бы лучше перепроверил прежде чем ссылаться на него.

Date: 2014-04-16 06:19 pm (UTC)
From: [identity profile] zelych.livejournal.com
Часть паттерна можно присвоить переменной:
    > let f all@(first@(x:xs), second@(y:ys)) = print (all, first, second)
    > f ([1],[2])
    (([1],[2]),[1],[2])
Что в последнем абзаце написано я не понимаю, поэтому хаскельного аналога предложить не могу.

Btw, спасибо за рецензию, я почему-то сразу же купил книжку.
Edited Date: 2014-04-16 06:20 pm (UTC)

Date: 2014-04-16 06:25 pm (UTC)
From: [identity profile] avva.livejournal.com
ага, понял, спасибо.

Последний абзац:

f(X,Y,Z) when X > 0, Y < Z ; X < -5, Y+Z > X -> ...

эквивалентно, если я правильно помню синтаксис Хаскеля

f x y z
| (x>0 && y<z) || (x<-5 && y=z>x) = ...

В общем, это мелочь и я даже и не знаю, назвать ли это преимуществом.


Edited Date: 2014-04-16 06:25 pm (UTC)

Date: 2014-04-16 06:29 pm (UTC)
From: [identity profile] zelych.livejournal.com
Ясно.
Действительно, в эрланге более читаемо получается.
Синтаксис верный.

Date: 2014-04-16 06:36 pm (UTC)
From: [identity profile] amarao-san.livejournal.com
У эрланга хорошие идеи и отвратительная реализация во взаимодействии с другими приложениями. Я ни разу не видел полностью адекватной системы старта приложения на сервере. Даже rmq, который считается чуть ли не гербом всего эрланга, может делать вот такое: http://amarao-san.livejournal.com/tag/erlang (первый пост снизу).

Date: 2014-04-16 06:40 pm (UTC)
From: [identity profile] palmas1.livejournal.com
Спасибо. А для параллельных вычислений он хорош?

Date: 2014-04-16 06:51 pm (UTC)
From: [identity profile] zelych.livejournal.com
Смотря что вы имеете в виду под параллельными.
Если parallel (http://en.wikipedia.org/wiki/Parallel_computing) тогда -- нет.
Если concurrent (http://en.wikipedia.org/wiki/Concurrent_computing) тогда -- да.

(Но вам лучше ещё у кого-нибудь уточнить, я сам книжку только пять минут назад купил.)

Date: 2014-04-16 07:24 pm (UTC)
From: [identity profile] migmit.livejournal.com
Пишу сейчас на эрланге профессионально.

- Это объектно-ориентированный язык с некоторыми функциональными возможностями (а где их сейчас нет?)

- С нерасширяемой системой типов (новые типы определять можно, но это будут синонимы уже существующих), нифига не проверяемой до выполнения

- С огромным количеством mutable state

- С откровенно слабеньким паттерн-матчингом, семантика которого к тому же сильно зависит от контекста

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

Date: 2014-04-16 07:27 pm (UTC)
From: [identity profile] avnik.livejournal.com
Я копался в потрохах у кролика -- у меня всю дорогу было ощущение, что его авторы клали с прибором и на OTP design принципы, в на всякие common practice тоже.

Date: 2014-04-16 07:33 pm (UTC)
From: [identity profile] avva.livejournal.com
В каком смысле он объектно-ориентированный?

Date: 2014-04-16 07:33 pm (UTC)
From: [identity profile] migmit.livejournal.com
В Хаскеле, как уже написали, это делается легче.

А в гардах нельзя использовать собственные функции:
is_result({ok, A}) -> is_atom(A);
is_result({ok, A, B}) -> is_string(A) andalso is_number(B);
is_result(_) -> false.
...
case ... of
  Result when is_result(Result) -> ...

Поэтому приходится извращаться с препроцессором
-define(is_result(R),
 (is_tuple(R),
  (size(R) =:= 2, is_atom(element(2, R));
   size(R) =:= 3, is_string(element(2, R)), is_number(element(3, R))),
  element(1, R) =:= ok))
...
case ... of
  Result when ?is_result(Result) -> ...

Как обычно, препроцессор помогает героически преодолеть слабость языка.
Edited Date: 2014-04-16 07:34 pm (UTC)

Date: 2014-04-16 07:36 pm (UTC)
From: [identity profile] amarao-san.livejournal.com
Два момента:
1) Я не видел well-behaved серверных приложений на эрланге. Ни одного. Если есть - покажите.
2) Я подозреваю теоретическую проблему работы с стандартными init-системами в условиях запуска beam.smp/epam.

Причина проста: кто должен запускать epam? А останавливать? А как узнать, что приложение уже запустилось? И как понять, что оно завершилось? pid от beam.smp не показатель, можно иметь полумёртвое приложение, которое одним интерфейсом даже будет отвечать на пинги.

Эрланг - это не язык программирования, это такая ОС, которой не дали вырасти. Наверное, в системах, где erlang будет ОС, всё будет просто потрясающе. Но как только над мимими с эрланговскими объектами появляется суровый мужыцкий мир ld *.so и юниксов, начинаются конфликты мировоззрений и локальные боевые действия, требующие введения миротворцев в форме "накалякано на баше".

Date: 2014-04-16 07:36 pm (UTC)
From: [identity profile] migmit.livejournal.com
В прямом. Определение ООП от Кея какое? Программа состоит из объектов, объекты хранят собственное состояние, объекты работают посредством посылки сообщений друг другу. Что в Эрланге? Программа состоит из процессов, процессы хранят собственное состояние, процессы работают посредством посылки сообщений друг другу.

Date: 2014-04-16 07:36 pm (UTC)
vinsent_ru: (вомбат)
From: [personal profile] vinsent_ru
там как раз самое важное в главах про OTP, ну и лучше про это дело отдельную книжку почитать. Потому что вот так чтобы была готовая платформа для разработки надежных масштабируемых приложений от авторов самого языка - я что-то затрудняюсь аналог назвать.
со строками да, есть некоторая засада, вместо циклов рекурсия или lists:foreach.

Date: 2014-04-16 07:37 pm (UTC)
From: [identity profile] migmit.livejournal.com
Опять-таки, в защиту Эрланга: это лучший в мире объекно-ориентированный язык. Совершенно точно.
Page 1 of 5 << [1] [2] [3] [4] [5] >>

January 2026

S M T W T F S
    1 2 3
4 5 6 7 8 910
11 12 1314 15 1617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 17th, 2026 03:49 pm
Powered by Dreamwidth Studios