Erlang

Материал из Неолурк, народный Lurkmore
Перейти к навигации Перейти к поиску
* komar поехал на конференцию по erlang
<kran_> На конференцию по erlang можно ехать одновременно разными видами транспорта.

Э́рланг (пинд. Error Language, также Enlarg, Телебейсик) — небыдлокодерский язык программирования, придуманный расовой шведской компанией Ericsson (без Sony) с целью захватить мир. Выгодно отличается от Хаскелла тем, что на нём реально можно писать полезные программы (и даже зарабатывать кровавые доллары). Язык лексически еурсивен, на 13.7% более компактен, функционален, многопоточен и необычайно полон матана. На нем можно делать динамические опердени, не приседая со штангой! Официально заявлено, что он назван в честь математика Агнера Краупа Эрланга, но всем понятно, что это аббревиатура от Ericsson Language.

Кратко →[править]

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

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

Сам эрланг ничего не делает, а только даёт указания.

Кошерен, ибо не хранит данные вместе с кодом.

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

Кошерности →[править]

  • Может менять куски кода один на другой прямо в продакшне, что невозбранно создаёт возможности для кровавого патчинга. До этого подобная фича применялась разве что в Лиспе. Ну и в PHP используется чуть менее, чем везде.
  • Может с лёгкостью создавать тысячи тредов. Треды в эрланге — вовсе и не треды даже, а акторы (Actors), общающиеся между собой записочками.
  • Может одинаково легко взаимодействовать с процессами как на своем, так и на других хостах.
  • В аццкий набор стандартных библиотек входит написанная на нем же распределенная no-sql СУБД — mnesia (плюс плюшки вроде ETS таблиц для хранения данных в ОЗУ и DETS — для хранения того же, но на диске).
  • Будучи практически Ъ-функциональным языком, основательно (не как Haskell, но заметно) препятствует использованию изменяемых данных. Это вызывает баттхёрт, но почти исключает взаимную блокировку потоков исполнения во время записи данных (кто пытался отлаживать такое в распределённых средах, тот оценит).
  • Уникальный подход к обработке ошибок: ты не епошишь весь код в try/catch как последний школий, а строишь так называемые деревья наблюдения (supervision tree), правда, если ты не крайнее днище и всё-таки используешь OTP.
  • Содержит развитый до фанатичной ебанутости фреймворк для работы с SNMP.

Некошерности →[править]

  • Динамическая типизация. Большую часть времени настоящий Эрланг-программист проводит за размышлениями на тему «откуда прилетела эта НЁХ, обрушившая мой уютненький gen_server».
  • Records. Нормальных записей в Эрланг не завезли, приходится обходиться костыльной надстройкой над кортежами.
  • Guards. В отличие от того же Haskell, где в guard-expression можно запихнуть хоть Аллаха, в Эрланге есть только унылые match-expressions.
  • Отсутствие чистоты. Что ни говори, а Эрланг всё-таки не чисто-функциональный язык.
  • Сложность анализа кода и отладки. По возможности устроить спагетти из кучи процессов, ожидающих невесть что, невесть откуда…
  • Нельзя перегружать инфиксные операторы и, как следствие, нет возможности управлять control flow с помощью продолжений, iteratees и прочих монад. Отчасти пофикшено в Elixir.
  • Мелкие ошибки в коде, помноженные на косяки в виртуальной машине могут с течением времени приводить к поистине термоядерным проблемам. Утечки атомов, переполненные мейлбоксы — всё это медленно, но неизбежно отправляет VM в Адъ.

«Hello, Joe! Hello, Mike!» →[править]

Вот что случается, если программистам дать видеокамеру

— Hello, Joe.
— Hello, Mike.
— Hello, Mike.
— Hello, Robert.
— Hello, Joe.

— разработчики эрланга об основах языка

Интернет-общественности язык известен прежде всего как буквы на экране компьютера в знаменитом видео, где инженеры Эрикссон показывали в камеру свои бледные лица и названивали друг другу по телефону с непонятными целями. Для непосвящённого человека естественна единственная реакция: «what?»

Пример кода на эрланге →[править]

Первая функция сработает, если передать сортировке пустой список ;
Вторая функция разделит список на заголовок «Pivot» и хвост «Rest», после чего
дважды войдёт в рекурсию, выполняя операторы ++ и [ перемешивая || элементы списков ] .

%% quicksort:qsort(List)
%% Sort a list of items
-module(quicksort).
-export([qsort/1]).

qsort([]) -> [];
qsort([Pivot|Rest]) ->
qsort([ X || X <- Rest, X < Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y >= Pivot]).

Что характерно, этот недо-QuickSort будет практически одинаково выглядеть на 95% функциональных языков, исключая, разве что, LISP.

Алсо, это чуть ли не единственная на планете реализация быстрой сортировки, требующая О(n²) дополнительной памяти в худшем случае из-за врождённой ущербности языка (на любом нормальном языке дополнительной памяти не требуется вовсе). Про скорость работы лучше просто промолчать. Но любителей эрланга не останавливают такие мелочи, как реальность, практическая применимость и здравый смысл. Какая разница, что quicksort перестал быть quick (и существенный пласт алгоритмов в принципе не реализуем на эрланге с сохранением асимптотической сложности)? Зато строчек мало, и можно прикинуться умным перед коллегами!

Что за _ →[править]

IRL, это был пример взлетевшего велосипеда, когда компании потребовалось написать один-единственный продукт на тему телефонии.

Огромное количество нужных программистам вещей в язык не вошли просто потому, что они не понадобились в том единственном проекте в самом начале. Массивы? Не надо. Циклы? Не знаем. Строки? Не, не слышали. Когда петух клюнул их в задницу, строки пришлось приматывать изолентой как односвязный список чисел. Отличать список чисел от строк язык не может до сих пор и перед выводом строки на экран просто пробегается по всем числам. Все маленькие? Кажется, это буквы. 100500? Наверное, это не буквы…

Перерабатывать язык никто не стал, потому что на сыром прототипе уже был запущен проект Эрикссона — и весь код у них оказался write only. Разумеется, пришлось городить дополнительные костыли для структурирования кода. Разумеется, они плохо вписались в базовый язык.

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

Но →[править]

Почему взлетел?…

Лучше всех это знает Джо Армстронг, автор языка. Вот что он пишет в своей книге «Programming Erlang»:

В начальной школе учительница объясняла нам: «Если в разных частях выражения стоит переменная X, то все они имеют одно и то же значение». И мы решали уравнения: так как мы знали, что X+Y=10 и что X-Y=2, то мы делали вывод, что X=6 и что Y=4 в обоих выражениях.



Затем мы перешли к изучению программирования и нам показали строку: X = X + 1

Мы были против и нам казалось, что так делать нельзя. Но учитель объяснил нам, что мы не правы и что нам надо разучиться и забыть то, что мы знали раньше. «Икс», объяснил он, это такая коробочка, где лежат данные, и её содержимое можно менять.


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

А раз нет изменяемого состояния, то программу можно разделить надвое в любой точке — и она будет выполняться на двух ядрах или на двух процессорах, без семафоров и блокировок. Встречные блокировки (когда один поток захватывает семафоры A,B,C,D, а другой захватывает D,C,A и они останавливаются и ждут друг друга до бесконечности) тоже не возникают. Так всё ли ясно?

Подводный кот — такой он один.

Конкурентов в занимаемой нише у него не было и нет.

Алсо →[править]

  • Джо Армстронг — байкер.
  • На Erlangе написан православный джаббер-сервер ejabberd, который используют на самых высоконагруженных джаббер-серверах в мире. Автор сего винрара, выходец из Севастополя в забугорье через Дефолт-сити, Алекс Щепин[1], не иначе как за это самое был удостоен звания лучшего программера на эрланге в 2006 году [1].
  • Первая версия Эрланга была написана на Prolog.
  • Эрланг — единица измерения загрузки телефонных линий.
  • На Эрланге написан RabbitMQ. Вики: [2]
  • Эрлангер — персонаж инфернального опуса нашего всего «Замок».
  • Эрлан (Erlang) — китайский бог с третьим глазом во лбу.

Примечания →[править]

  1. Он же соавтор джаббер-клиента Tkabber, но уже на тикле

См. также →[править]

Ссылки →[править]

Movax1010h.png Глубокий смысл скрыт в этих неестественных языках
Языки программированияПромышленные: BATC#CC++JavaJavaScript (AJAX) • PascalPerlPHPPythonRubyABAPАссемблерВасикФортран
Эзотерические: BrainFuckHQ9++ErlangForthHaskellLISP (My other car) • PrologTclΤΕΧOracleMySQLGolangВ++
ПрофессииБыдлокодерПрограммистТестировщикХакерХеллоуворлдщикIT-звёзды
Методы и стилиReverse EngineeringАнти-паттернВыстрелить себе в ногуГрязный хакКод (индусский) • КостыльМетод научного тыкаПомолясьСвистелки и перделкиОчередьСпортивное программированиеОбфускацияБета-тестАльфа-тестШаблоныRegReplace
Средства разработкиSublime TextПодсветка синтаксиса кодаUnstable DiffusionAPIPythonTutorCodeWarsDataCamp
ЛюдиИлья КанторЮрий КлючевскийЭдуард Лаас
Прочее++i + ++iDeadline%s640 килобайтCMSDummy modeЕГГОГFoobarGod is real, unless explicitly declared as integerGOTOIfconfigKISSRegExpSICPsql.ruXyzzyДискетаИнжалид дежицеКОИ-8ЛогМанРекурсияСУБДТест ТьюрингаУмение разбираться в чужом кодеФаза ЛуныФатальный недостатокПроблема 2000ТаймстампКэшЗапись в файл без кэша (Perl)Танцы с бубномКодач