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% - подробное знакомство с некоторыми стандартными библиотеками, и несколько обширных примеров кода - можно пропустить или быстро пролистать.

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

Date: 2014-04-16 07:57 pm (UTC)
From: [identity profile] migmit.livejournal.com
То есть, Javascript выпадает? И Lua?

Date: 2014-04-16 08:23 pm (UTC)
From: [identity profile] leroy-ru.livejournal.com
Почему-то так и думал, что вы вспомните Javascript:) Конечно, если из языка убрать какие-то конкретные фичи он не перестает быть ООП. Дело не в конкретных фичах, а подходе к понятиям: объект - данные + методы, для изменения этих данных.

Хранение состояние и способность обмена сообщениями еще не делают язык ООП (много-поточную программу можно и на Си написать). Разница в типизации, которая, так сказать, диктует взгляд на вещи. ООП - это наследование (через подклассы, прототипы - неважно), композиция, GoF паттерны, вот это все. Языковые фичи эрланга диктуют совершенно другой подход: множество слабосвязанных процессов с независимым поведением. Вообще, не очень понимаю, где вы в эрланге увидели ООП. Под ваше определение, как я уже говорил, подходит очень много языков, которые ООП не являются.

Date: 2014-04-16 08:39 pm (UTC)
From: [identity profile] migmit.livejournal.com
Так в Эрланге тот же подход. Данные и методы. Просто "методы" называются "сообщениями".

А определение не моё, а человека, создавшего понятие "ООП". Кстати, он же говорил, что ни в коем случае не имел в виду C++.

Date: 2014-04-16 08:50 pm (UTC)
From: [identity profile] leroy-ru.livejournal.com
Ну я же с того и начал, что сейчас под ООП понимают не то, что под ним понимали изначально. Я с классическим определением не спорю, и С++ к нему отношения действительно не имеет.

Вы написали, что эрланг - лучший ООП язык. Значит у вас есть свой критерий, какой язык ООП а какой нет. Что это за критерии? Почему, на ваш взгляд, он вообще ООП, и почему лучше, чем другие. Вот Си - это ООП язык? Там тоже можно создавать процессы и передавать сообщения.
Edited Date: 2014-04-16 08:51 pm (UTC)

Date: 2014-04-16 08:55 pm (UTC)
From: [identity profile] migmit.livejournal.com
> сейчас под ООП понимают не то, что под ним понимали изначально

Не спорю. Но сформулировать это понимание вряд ли удастся, так что лучше уж пользоваться тем, что есть.

> Что это за критерии?

Определение Кея.

> Почему, на ваш взгляд, он вообще ООП

Написал выше.

> и почему лучше, чем другие.

Так получилось.

> Вот Си - это ООП язык? Там тоже можно создавать процессы и передавать сообщения.

Нет. Есть разница между "мы можем сделать объекты в нашей программе" и "наша программа состоит из объектов".

Date: 2014-04-16 09:23 pm (UTC)
From: [identity profile] leroy-ru.livejournal.com
>> Не спорю. Но сформулировать это понимание вряд ли удастся, так что лучше уж пользоваться тем, что есть.

Лучше пользоваться тем, что всем понятно. Когда один программист говорит другому программисту "ООП", второй себе представляет именно "классы-наследование-полиморфизм", а не сообщения.

Smalltalk, кстати, вовсю оперировал понятиями классов и инстансов. Поэтому, если брать классическое ООП, как его понимал Кей, тоже не получается эрланга. Вообще, то определение ООП, которое вы привели - это собственно определение модели акторов. И почему нужно называть ее ООП - не ясно

>> Так получилось.

Я спрашивал о том, какие фичи делают его лучше. И мне кажется, вы меня поняли.

>> Нет. Есть разница между "мы можем сделать объекты в нашей программе" и "наша программа состоит из объектов".

Любая си программа состоит из процессов ("объектов"), и мы может передавать сообщения между ними.

Ну или наоборот: Есть разница между "мы можем сделать объекты в нашей программе" и "мы можем порождать процессы и рассматривать их как объекты".
Edited Date: 2014-04-16 09:26 pm (UTC)

Date: 2014-04-16 09:33 pm (UTC)
From: [identity profile] migmit.livejournal.com
> Когда один программист говорит другому программисту "ООП", второй себе представляет именно "классы-наследование-полиморфизм", а не сообщения.

Ну дык надо разговаривать с теми, у кого развитое мышление.

> Поэтому, если брать классическое ООП, как его понимал Кей, тоже не получается эрланга.

Не надо путать то, что Кей говорил, с тем, что он сделал. Сделал так себе, насколько получилось.

> Я спрашивал о том, какие фичи делают его лучше.

Э-э-э... Вот понятия не имею.

> И мне кажется, вы меня поняли.

Нет. В смысле, до последнего вашего коммента.

> Любая си программа состоит из процессов ("объектов"), и мы может передавать сообщения между ними.

Нет. Программа на Си состоит из циклов и указателей, из структур и управления памятью. По сравнению с этим то, что там есть ещё какие-то процессы — совершеннейшая мелочь. Кстати, я не помню, стандарт C содержит поддержку многопоточности?

> Есть разница между "мы можем сделать объекты в нашей программе" и "мы можем порождать процессы и рассматривать их как объекты".

А вот тут не проходит. Потому что для этой разницы нужно определённое представление, что такое "объект". И почему "процесс" под это понятие не подходит (хинт: он подходит).

Date: 2014-04-16 09:50 pm (UTC)
From: [identity profile] leroy-ru.livejournal.com
> Ну дык надо разговаривать с теми, у кого развитое мышление.

Не вижу связи между развитостью мышления и пониманием ООП.

> Нет. Программа на Си состоит из циклов и указателей, из структур и управления памятью. По сравнению с этим то, что там есть ещё какие-то процессы — совершеннейшая мелочь.

А программа на эрланге состоит из акторов и обменом сообщениями между ними, а не из объектов.

> Э-э-э... Вот понятия не имею.

То-есть утверждение о том, что это лучший ООП язык, было голословным?

> А вот тут не проходит. Потому что для этой разницы нужно определённое представление, что такое "объект". И почему "процесс" под это понятие не подходит (хинт: он подходит).

Лично у меня есть совершенно четкое понимание что такое процесс, а что такое объект. Объект - данные + методы. Процесс - абстракция для обозначения хода выполнения программы (грубо говоря). Вам может показаться, что я не могу думать о процессе как об объекте из за узости мышления. Только в моей терминологии, я могу сказать "ООП" а могу сказать "слабосвязанные процессы с обменом сообщениями", и собеседник сразу меня поймет. У меня (и не только у меня) терминология как-то функциональней получается.



Edited Date: 2014-04-16 09:50 pm (UTC)

Date: 2014-04-17 04:50 am (UTC)
From: [identity profile] migmit.livejournal.com
> Не вижу связи

Это такой намёк, что мне надо прекратить разговаривать с вами?

Если мозг у собеседника загажен шаблонами, то с ним действительно разговаривать не очень интересно.

> а не из объектов.

Вы пока не объяснили, почему "процессы", по-вашему, не "объекты".

> утверждение о том, что это лучший ООП язык, было голословным?

Что значит "голословным"? Во-первых, утверждение "A — лучшее B" всегда субъективно. Во-вторых, есть такая штука как личный опыт.

> Объект - данные + методы.

Прямо как процесс. Только "методы" переименовываются в "принимаемые сообщения".

> терминология как-то функциональней получается.

Функциональная терминология не предполагает называния близких вещей совершенно разными способами.

Date: 2014-04-17 08:23 am (UTC)
From: [identity profile] leroy-ru.livejournal.com
Мне кажется, разговор пошел по кругу. К тому же, вы начали хамить. Поэтому, я пожалуй, пойду, всего хорошего.

Date: 2014-04-17 09:01 am (UTC)
From: [identity profile] migmit.livejournal.com
Как угодно.

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 06:05 pm
Powered by Dreamwidth Studios