Прочитал книгу Джо Армстронга про Эрланг. Теперь подмывает что-нибудь на нем написать.
Очень стройный, интересный и гармоничный язык.
Если прыгать по ключевым словам, то Эрланг:
- функциональный язык, но с вполне обычной императивной семантикой исполнения
- компилируется в байткод и выполняется в виртуальной машине, с очень удобной интерактивной средой (как Лисп)
- динамические типы (с опциональной статической аннотацией)
- immutable state, переменные получают значение один раз и больше его не меняют
- pattern-matching как в Хаскеле или даже круче, list comprehension как в Питоне
- типичная программа состоит из множества очень легких "процессов", которые выполняются одновременно, не имеют между собой общей памяти, общаются путем явной передачи сообщений
- эти процессы с одинаковой легкостью могут быть внутри одной виртуальной машины или в нескольких разных или во многих на разных серверах, в их общении при этом ничего не меняется, следовательно: scaling up, fault tolerance, multicore programming - все это делать легко и приятно
Что мне особенно нравится: интерактивная среда. Удобнейший pattern-matching в заголовках функций. Подход Эрланга к обработке ошибок (подход let it crash на любую непредвиденную ошибку: пусть процесс падает, другие это заметят, запишут в лог, перезапустят). Удобный синтаксис для работы с отдельными битами в памяти.
Что мне не нравится: работа со строками, кажется, утомительна и многословна. Циклы на коленке через хвостовую рекурсию уже не вставляют. Отсутствие настоящих статических типов играет, вероятно, свою роль в достаточно объемных проектах.
Книга отлично написана, очень рекомендую. Для знакомства с языком достаточно прочитать первую половину (первые три части), а также главы 24 и 26, где описаны важные принципы построения программ из процессов. Остальные 50% - подробное знакомство с некоторыми стандартными библиотеками, и несколько обширных примеров кода - можно пропустить или быстро пролистать.
(мне понравилось, как Армстронг развивает метафору множества процессов, как комнаты, наполненной людьми. Они все между собой разговаривают - передают сообщения. Дальше он говорит, предположим, я один из них, тут у меня инфаркт, я падаю и умираю - наверное, кто-нибудь заметит, уберет мой труп, перепоручит мою работу другому - вот так же и процессы...)
Очень стройный, интересный и гармоничный язык.
Если прыгать по ключевым словам, то Эрланг:
- функциональный язык, но с вполне обычной императивной семантикой исполнения
- компилируется в байткод и выполняется в виртуальной машине, с очень удобной интерактивной средой (как Лисп)
- динамические типы (с опциональной статической аннотацией)
- immutable state, переменные получают значение один раз и больше его не меняют
- pattern-matching как в Хаскеле или даже круче, list comprehension как в Питоне
- типичная программа состоит из множества очень легких "процессов", которые выполняются одновременно, не имеют между собой общей памяти, общаются путем явной передачи сообщений
- эти процессы с одинаковой легкостью могут быть внутри одной виртуальной машины или в нескольких разных или во многих на разных серверах, в их общении при этом ничего не меняется, следовательно: scaling up, fault tolerance, multicore programming - все это делать легко и приятно
Что мне особенно нравится: интерактивная среда. Удобнейший pattern-matching в заголовках функций. Подход Эрланга к обработке ошибок (подход let it crash на любую непредвиденную ошибку: пусть процесс падает, другие это заметят, запишут в лог, перезапустят). Удобный синтаксис для работы с отдельными битами в памяти.
Что мне не нравится: работа со строками, кажется, утомительна и многословна. Циклы на коленке через хвостовую рекурсию уже не вставляют. Отсутствие настоящих статических типов играет, вероятно, свою роль в достаточно объемных проектах.
Книга отлично написана, очень рекомендую. Для знакомства с языком достаточно прочитать первую половину (первые три части), а также главы 24 и 26, где описаны важные принципы построения программ из процессов. Остальные 50% - подробное знакомство с некоторыми стандартными библиотеками, и несколько обширных примеров кода - можно пропустить или быстро пролистать.
(мне понравилось, как Армстронг развивает метафору множества процессов, как комнаты, наполненной людьми. Они все между собой разговаривают - передают сообщения. Дальше он говорит, предположим, я один из них, тут у меня инфаркт, я падаю и умираю - наверное, кто-нибудь заметит, уберет мой труп, перепоручит мою работу другому - вот так же и процессы...)
no subject
Date: 2014-04-16 07:57 pm (UTC)no subject
Date: 2014-04-16 08:23 pm (UTC)Хранение состояние и способность обмена сообщениями еще не делают язык ООП (много-поточную программу можно и на Си написать). Разница в типизации, которая, так сказать, диктует взгляд на вещи. ООП - это наследование (через подклассы, прототипы - неважно), композиция, GoF паттерны, вот это все. Языковые фичи эрланга диктуют совершенно другой подход: множество слабосвязанных процессов с независимым поведением. Вообще, не очень понимаю, где вы в эрланге увидели ООП. Под ваше определение, как я уже говорил, подходит очень много языков, которые ООП не являются.
no subject
Date: 2014-04-16 08:39 pm (UTC)А определение не моё, а человека, создавшего понятие "ООП". Кстати, он же говорил, что ни в коем случае не имел в виду C++.
no subject
Date: 2014-04-16 08:50 pm (UTC)Вы написали, что эрланг - лучший ООП язык. Значит у вас есть свой критерий, какой язык ООП а какой нет. Что это за критерии? Почему, на ваш взгляд, он вообще ООП, и почему лучше, чем другие. Вот Си - это ООП язык? Там тоже можно создавать процессы и передавать сообщения.
no subject
Date: 2014-04-16 08:55 pm (UTC)Не спорю. Но сформулировать это понимание вряд ли удастся, так что лучше уж пользоваться тем, что есть.
> Что это за критерии?
Определение Кея.
> Почему, на ваш взгляд, он вообще ООП
Написал выше.
> и почему лучше, чем другие.
Так получилось.
> Вот Си - это ООП язык? Там тоже можно создавать процессы и передавать сообщения.
Нет. Есть разница между "мы можем сделать объекты в нашей программе" и "наша программа состоит из объектов".
no subject
Date: 2014-04-16 09:23 pm (UTC)Лучше пользоваться тем, что всем понятно. Когда один программист говорит другому программисту "ООП", второй себе представляет именно "классы-наследование-полиморфизм", а не сообщения.
Smalltalk, кстати, вовсю оперировал понятиями классов и инстансов. Поэтому, если брать классическое ООП, как его понимал Кей, тоже не получается эрланга. Вообще, то определение ООП, которое вы привели - это собственно определение модели акторов. И почему нужно называть ее ООП - не ясно
>> Так получилось.
Я спрашивал о том, какие фичи делают его лучше. И мне кажется, вы меня поняли.
>> Нет. Есть разница между "мы можем сделать объекты в нашей программе" и "наша программа состоит из объектов".
Любая си программа состоит из процессов ("объектов"), и мы может передавать сообщения между ними.
Ну или наоборот: Есть разница между "мы можем сделать объекты в нашей программе" и "мы можем порождать процессы и рассматривать их как объекты".
no subject
Date: 2014-04-16 09:33 pm (UTC)Ну дык надо разговаривать с теми, у кого развитое мышление.
> Поэтому, если брать классическое ООП, как его понимал Кей, тоже не получается эрланга.
Не надо путать то, что Кей говорил, с тем, что он сделал. Сделал так себе, насколько получилось.
> Я спрашивал о том, какие фичи делают его лучше.
Э-э-э... Вот понятия не имею.
> И мне кажется, вы меня поняли.
Нет. В смысле, до последнего вашего коммента.
> Любая си программа состоит из процессов ("объектов"), и мы может передавать сообщения между ними.
Нет. Программа на Си состоит из циклов и указателей, из структур и управления памятью. По сравнению с этим то, что там есть ещё какие-то процессы — совершеннейшая мелочь. Кстати, я не помню, стандарт C содержит поддержку многопоточности?
> Есть разница между "мы можем сделать объекты в нашей программе" и "мы можем порождать процессы и рассматривать их как объекты".
А вот тут не проходит. Потому что для этой разницы нужно определённое представление, что такое "объект". И почему "процесс" под это понятие не подходит (хинт: он подходит).
no subject
Date: 2014-04-16 09:50 pm (UTC)Не вижу связи между развитостью мышления и пониманием ООП.
> Нет. Программа на Си состоит из циклов и указателей, из структур и управления памятью. По сравнению с этим то, что там есть ещё какие-то процессы — совершеннейшая мелочь.
А программа на эрланге состоит из акторов и обменом сообщениями между ними, а не из объектов.
> Э-э-э... Вот понятия не имею.
То-есть утверждение о том, что это лучший ООП язык, было голословным?
> А вот тут не проходит. Потому что для этой разницы нужно определённое представление, что такое "объект". И почему "процесс" под это понятие не подходит (хинт: он подходит).
Лично у меня есть совершенно четкое понимание что такое процесс, а что такое объект. Объект - данные + методы. Процесс - абстракция для обозначения хода выполнения программы (грубо говоря). Вам может показаться, что я не могу думать о процессе как об объекте из за узости мышления. Только в моей терминологии, я могу сказать "ООП" а могу сказать "слабосвязанные процессы с обменом сообщениями", и собеседник сразу меня поймет. У меня (и не только у меня) терминология как-то функциональней получается.
no subject
Date: 2014-04-17 04:50 am (UTC)Это такой намёк, что мне надо прекратить разговаривать с вами?
Если мозг у собеседника загажен шаблонами, то с ним действительно разговаривать не очень интересно.
> а не из объектов.
Вы пока не объяснили, почему "процессы", по-вашему, не "объекты".
> утверждение о том, что это лучший ООП язык, было голословным?
Что значит "голословным"? Во-первых, утверждение "A — лучшее B" всегда субъективно. Во-вторых, есть такая штука как личный опыт.
> Объект - данные + методы.
Прямо как процесс. Только "методы" переименовываются в "принимаемые сообщения".
> терминология как-то функциональней получается.
Функциональная терминология не предполагает называния близких вещей совершенно разными способами.
no subject
Date: 2014-04-17 08:23 am (UTC)no subject
Date: 2014-04-17 09:01 am (UTC)