программистское
Sep. 29th, 2009 06:51 pmОчень интересная беседа-интервью Джо Армстронга (Erlang) и Саймона Пейтона Джонса (Haskell). Формат транскрипта на этом сайте мерзостный, но нормальный транскрипт можно прочитать здесь.
Цитата:
Давно хочу изучить Эрланг, кстати. Кажется, эта беседа убедила меня заняться этим в ближайшие месяц-два.
Цитата:
JA: I didn't really know what thread safety was in Java, so I wrote a little Java Swing thing and of a Java friend I asked: I wrote this Java process and it worked fine. I could create one window, and then I created 2 windows in a graphical program and I drew a rectangle in one and I drew a rectancle in the other and it crashed. And I said "Why did it crash?" And he said "Well the Swing library's not threadsafe". Now, what does that mean? It means if you got one thing that works, you do 2 of them in parallel, they interact in strange ways. I thought "How can you program like that? It's impossible to program!"
Давно хочу изучить Эрланг, кстати. Кажется, эта беседа убедила меня заняться этим в ближайшие месяц-два.
no subject
Date: 2009-09-29 04:59 pm (UTC)no subject
Date: 2009-09-29 05:03 pm (UTC)no subject
Date: 2009-09-29 05:04 pm (UTC)no subject
Date: 2009-09-29 05:06 pm (UTC)no subject
Date: 2009-09-29 05:07 pm (UTC)no subject
Date: 2009-09-29 05:38 pm (UTC)Я его планирую поковырять уже лет 6...
no subject
Date: 2009-09-29 05:46 pm (UTC)no subject
Date: 2009-09-29 05:46 pm (UTC)no subject
Date: 2009-09-29 05:48 pm (UTC)есть куски кода, которые на любом другом языке программирования представляли бы для себя ошибку безопасности. на эрланг - тупо приводят просто к crash данного процесса, что совершенно штатная ситуация. упал? молодетц. запись в лог - пользователю стандартную ошибку, процесс - либо перезапустить, либо просто забить.
манера программирования - let it crash - она очень сильно спасает ;) даже в "грязно" написаном коде.
no subject
Date: 2009-09-29 05:52 pm (UTC)no subject
Date: 2009-09-29 06:03 pm (UTC)no subject
Date: 2009-09-29 06:05 pm (UTC)Скажи, а на J ты смотрел? Я тут развлекаюсь на eulerproject.net, там многие им балуются, выглядит страшновато, но любопытно, что за зверь.
no subject
Date: 2009-09-29 06:17 pm (UTC)че то лажа какая то, свинг - однопоточная штука что бы как раз траблов и не было
no subject
Date: 2009-09-29 06:44 pm (UTC)Но ооочень красиво, и полезно прочитать его vocabulary с примерами, чтобы просто проникнуться тем, "как еще можно писать программы" и "в терминах чего еще их можно выражать" - это может пригодиться и за пределами J.
no subject
Date: 2009-09-29 07:04 pm (UTC)no subject
Date: 2009-09-29 07:09 pm (UTC)Если прикинуться дурачком и начать делать свои глаголы, то с каждым новым производительность будет падать, особенно если это переименованный примитив. Поэтому разработчики очень гордятся своим tacit programming, то есть превращением подпрограммы, а то и всей программы, в одну длинную функцию. Формула Герона выглядит вот так: [:%:[:*/-:@:(+/)-0,]
Поэтому я изучаю вместо J Q.
no subject
Date: 2009-09-29 07:11 pm (UTC)no subject
Date: 2009-09-29 07:12 pm (UTC)workers
supervisors
так вот - основная идеология в worker - при помощи clause matching, единичного присваивания мы программируем только валидные пути выполнения. во всех оставшихся случаях позволяет данному процессу завершиться с badmatch или подобной ошибкой и прекратить выполнение.
задача супервизора - отловить падение worker-а (что-то пошло не так) и обработать по стандартному сценарию - т.е. либо restart (в частоности и всех зависящих процессов по иерархии), либо просто забить на данного отдельного worker-а. Рассматривайте аналогию с АТС - в принципе не важно, что один из 10000 звонков разорвался из-за того, что оба пациента орали Янку Дудль друг другу в телефон на полную мощность. Важно, чтоб все осташиеся звонки стабильно обслуживались :)
no subject
Date: 2009-09-29 07:15 pm (UTC)no subject
Date: 2009-09-29 07:19 pm (UTC)т.е.
A=3, что-то там, A=2 - все, упал. переменным нельзя присваивать новые значения. Это наже не переменные, а просто привязаные к значениям символические метки-имена.
{A,B} = {1,2,3} - падаем нафиг, arity не совпадает (количество элекентов) - это так же срабатывает при matching более сложных вложенных структур
case A of
1 -> ok;
2 -> ok
end
догадываетесь при значении A=3 что произойдет? праавильно, упадет нафиг. ибо этот случай разработчик не предполагал. нужно обрабатывать default ветку - пишите ее в явном виде.
ну и так далее. эта идеология во всем. дико удобно, после того как привыкаете.
{ok, Socket} = sockets:connect(blah-blah) - это я гипотетический код пишу, но блико к реальному
если в ответ пришло {err, Error} - то все, процесс упадет нафиг. Именно потому что я НЕ Хочу вообще обрабатывать error case. Если соединение не установилось - дальше делать вообще ничего не надо. Почему не соединилось - меня не интересует.
если бы интересовало - был бы код
case sockets:connect() of
{ok, Socket} -> ....;
{err, ErrMsg} -> ....
end
no subject
Date: 2009-09-29 07:19 pm (UTC)no subject
Date: 2009-09-29 07:23 pm (UTC)самое большое преимущество - в основном пишется только OК ветка.
с точки зрения безопасности - это тоже очень хорошая идея.
1. любой шаг вправо или влево - попытка к бегству - падает, логгим
2. прыжки на месте - провокация. когда в этом куске кода вы _планируете_ обработку ошибок - легче всего их вылавливать через try catch и не _задумываться_ что это за была ошибка - а выдавать стандартное сообщение об ошибке. в результате disclosure информации в ошибках - минимальный. потому что они тупо пишут - internal error и все ;)
2.1 да, программить чуть сложнее :))) но при наличии отличного механизма trace и правильной практике написания кода без side effects - локализация ошибки происходит очень быстро
no subject
Date: 2009-09-29 07:29 pm (UTC)еще один подход, который прививает эрланг - это следующее:
у вас есть программа, которая состоит из перемежающихся кусков -
1. трансформация данных
2. коммуникация с другими процессами
1. если программировать правильно - т.е. передавать все внутренее состояние через параметры функции и получать его обратно на выходе и писать функции без side effects (без взаимодействия с другими процессами и без хранения данных в process dictionary/etc table и т.д.) - тогда эта функция идеально отлаживается при помощи тестов.
потому что она ВСЕГДА при одном наборе входных данных должна давать один и тот же ответ. в результате - очень легко писать такие функции и их тесты :) хотя модули могут выглядеть монструозно :)))
2. тут самое интересное - потому что вы начинаете отлаживать _протокол_ взаимодействия с другими процессами. т.е. создаете enironment из заглушек-процессов, которые реагируют нужным вам образом и проверяете тестируемый код на то, что он _взаимодействует_ с другими согласно протоколу.
no subject
Date: 2009-09-29 07:32 pm (UTC)no subject
Date: 2009-09-29 07:33 pm (UTC)в одной из систем, ща посмотрел, wc -l показывает 33KLOC
;)