Skip to content

Instantly share code, notes, and snippets.

@ryukzak
Created March 22, 2010 14:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryukzak/340102 to your computer and use it in GitHub Desktop.
Save ryukzak/340102 to your computer and use it in GitHub Desktop.
Erlang план лекции
Erlang
=============== Заглавие ==========
О чём будет данная лекция.
- описание области, о которой пойдёт речь.
- описание стилистики изложения (сравнение с традиционными
методами).
- причины для развития инструментария. (Дейкстра)
- почему сегоднешнее положение дел именно такое.
=============== Инструментарий, Дейкстра ==========
- да кто он собственно такой, этот Дейкстра.
- "смиренный программист".
- сложность решаемых задач.
- ограниченность человека.
- ограничения и абстракция.
- пример абстракции - ООП. Пример ограничения - структурное
программирование.
=============== История ==========
- Два подхода к описанию вычислительного процесса.
- Тьюринг (машина тьюринга). Практический подход. Развитие идеи
машины Тьюринга (лента заменена памятью, бегающая головка
заменена управляющим устройством и АЛУ). Императивный стиль
описания алгоритма. Строгое разделение программы и данных.
- Алонзо Чёрч (лямбда исчисление). Вычесление само по
себе. Аппликативный стиль описания алгоритмов. Отсутствие
строго разделения программы и данных.
- причины сегодняшнего положения дел. Детские
болезни. Привычка. Подстверждение эффективности опытом.
Желание получить всё и сейчас без продумывания наперёд.
- Erlang - пример варианта решения практической задачи с учётом
теоретических выводов. Доказанность эффективности в
промышленности.
=============== История Erlang-а ==========
- описание задачи, стоящей перед Erricson. (комутация телефонии,
отказоустойчивость, распределённость, многопоточность)
- история языка. 7 лет проект предшественник на базе Prolog и
С. 3 года проекта на Erlang-е и результат.
=============== Многопоточность в традиционных языках ==========
- принципы многопоточности в традиционных системах.
- разделяемые, общие состояния.
- принципиальный недетерминизм подобных систем. (deadlock)
- синхронизация и блокировки.
- побочные эффекты. Множественные, не синхронизированные точки
входа. (речь о том, что код может быть запущен очень много
откуда)
=============== Многопоточность в Erlang. теория ==========
- Выбор принципиально другой модели параллельных вычислений. Сети
процессов Кана.
- Клиент - серверная модель.
- Строго определены точки входа и выхода процессов, они
синхронизированы.
- Выбор функциональной парадигмы программирования. Навязывание
детерминизма. Упрощение отладки.
=============== Многопоточность в Erlang. практика ==========
- Реализация многопоточности в Erlang. Требования к памяти на
процесс (309 слов включая 233 для кучи).
- Рост производительности с ростом количества ядер. (до 20 штук
45 градусов)
- Тысячи потоков на 1-ом узле - норма. Низкая цена их содния.
- Local, Global пространства имён. Прозрачное для программиста
работа со множеством узлов.
- Пример кода, с пояснением pattern matching.
<code> -- пишется пока расказываются предыдущие пункты.
-module(counter).
-export(next/0, reset/0, start/0, stop/0).
next() ->
counter ! {next, self()},
receive
X when is_integer(X) -> {ok, X};
_ -> {error, incorrect_value}
after 10 -> {error, timeout}
end.
reset() ->
counter ! reset.
start() ->
spawn(counter, counter, []).
stop() ->
counter ! stop.
counter() ->
register(counter),
loop(0).
loop(N) ->
receive
{next, Pid} -> Pid ! N,
loop(N + 1);
reset -> loop(0);
stop -> ok
end.
</code>
- Пример на традиционном языке. Имхо, надо показать в развитие,
подчёркивая потенциально упущенные моменты. Можно спросить,
есть ли тут ещё косяки?
<code>
int next(){
int tmp;
lock(L);
tmp = count;
count++;
unlock(L);
return tmp;
}
int reset(){
lock(L);
count = 0;
unlock(L);
}
</code>
<code>
int next(){
int tmp = -1;
try{
lock(L);
tmp = count;
count++;
}final{
unlock(L);
}
return tmp;
}
int reset(){
try{
lock(L);
count = 0;
}final{
unlock(L);
}
}
</code>
=============== Функциональное программирование ==========
- Общее положение дел с функциональным программированием.
- Отсутствие переменных.
- Декларативный стиль программирования. (его элементы в случае с Erlang)
<code>
foreach x in list1
if (x < n) then list2.add(x);
List2 = [X | X <- List1, X < N].
</code>
;; Второй пример строго определён в отсутствие контекста в отличие
;; от первого. Возможные ошибки следующие из контекста. (побочный
;; эффект)
- Рекурсия, хвостовая рекурсия.
<code>
;; Решение идёт накапливанием с первых элиментов последоватлеьноти.
;; Необзодимо напомнить, что такое последовательность фибоначи.
fib(0) -> 1;
fib(1) -> 1;
fib(N) -> fib(N, 2, 1, 1).
fib(N, N, A, B) -> A + B;
fib(N, C, A, B) -> fib(N, C+1, B, B + A).
fib(N) -> fib(N-1) + fib(N-2).
</code>
- Функционалы. Замыкания.
<code>
max List = max_sub 0 List.
max_sub(Max, []) -> Max;
max_sub(Max, [Head|Tail]) when Max < Head -> max_sub(Head, Tail);
max_sub(Max, [Head|Tail]) -> max_sub(Max, Tail);
</code>
<code>
max(List) = fold(fun (Max, Next) when Max < N -> Next;
(Max, Next) -> Max
end, 0, List).
</code>
- Пример реализации транзакций.
<code>
read_from_table(TableName, Key) ->
Fun = fun() -> mnesia:read({TableName, Key}) end,
mnesia:transaction(Fun).
</code>
=============== Open Telecom Platform ==========
OTP - Open Telecom Platform
Фреймворк для реализации распределённых, отказо-устойчивых систем.
Необходимые свойства подобных систем:
- Отказоустойчивость.
- Горячая замена кода. (в том чиле и с учётом ffi и быстрых откатов на старые версии)
- Расширяемость и распределённость.
Основные модули:
- gen_server
- super_visor (вот как раз тут можно сделать пример относительно mess)
- application, distribution application
- release
=============== Ограничения ==========
Отметка относительно области применения Erlang-a, дабы не было впечатления
универсальности.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment