SlideShare ist ein Scribd-Unternehmen logo
1 von 15
Основы функциональных языков 
программирования на примере Erlang 
Виктор TyVik Тыщенко
Парадигмы программирования 
Императивная 
CDC* pDC = this->GetDC(); 
CBrush* brush = new CBrush; 
brush->CreateSolidBrush(RGB(0xFF,0xFF,0)); 
pDC->FillRect(&rect, &brush); 
delete brush; //!!!!!!!!!!!!!!!! 
Basic, C++, C#, Pascal, assembler, Java, Perl, Python, Ruby, 
JavaScript, PHP, Go, Rust...
Парадигмы программирования 
Декларативная 
div { color: red; } 
HTML, CSS, SQL, XSLT
Парадигмы программирования 
Функциональная 
picture = color red (circle 100) 
Lisp, Clojure, Erlang, Scala, Haskell
Сравнение 
Erlang 
sort([Pivot|T]) → 
sort([ X || X <- T, X < Pivot]) ++ [Pivot] ++ sort([ X || X <- T, X >= Pivot]); 
sort([]) -> []. 
Java 
public class QuickSort { 
public static List<Integer> sort(List<Integer> list) { 
if (list.isEmpty()) { 
return list; 
} 
Integer pivot = list.get(0); 
List<Integer> listWithoutPivot = list.subList(1, list.size()); 
List<Integer> leftSide = new LinkedList<>(); 
for (Integer elem : listWithoutPivot) { 
if (elem <= pivot) { 
leftSide.add(elem); 
} 
} 
List<Integer> rightSide = new LinkedList<>(); 
for (Integer elem : listWithoutPivot) { 
if (elem > pivot) { 
rightSide.add(elem); 
} 
} 
List<Integer> result = new ArrayList<>(); 
result.addAll(sort(leftSide)); 
result.add(pivot); 
result.addAll(sort(rightSide)); 
return result; 
} 
}
В чём весь смысл?! 
● Нет состояния 
● Нет переменных 
● Нет побочных 
эффектов 
● Нет общего адресного 
пространства 
● Нет блокировок
Стоп, как это нет переменных?! 
Eshell V5.10.4 (abort with ^G) 
1> A = 5. 
5 
2> A = 3. 
** exception error: no match of right hand side value 3
Многопоточность 
public class Example { 
private int value = 0; 
public int getNextValue() { 
return value++; 
} 
}
Многопоточность 
public class Example { 
private int value = 0; 
private final Semaphore mutex = new Semaphore(1) 
public int getNextValue() throws InterruptedException { 
try { 
mutex.acquire(); 
return value++; 
} finally { 
mutex.release(); 
} 
} 
}
Многопоточность 
-module(counter). 
-export([start/0, counter/1]). 
counter(C) -> 
receive 
{get, Pid} -> Pid ! C 
end, 
counter(C + 1). 
start() -> 
NextNum = spawn(counter, counter, [0]), 
NextNum ! {get, self()}, 
receive 
X -> X 
end.
Многопоточность
Многопоточность 
erl 
counter(C) -> 
receive 
{get, Pid} -> Pid ! C 
end, 
counter(C + 1). 
start() -> 
NextNum = 
spawn(counter, counter, [0]), 
NextNum ! {get, self()}, 
receive 
X -> X 
end. 
spawn 
pid 
{get, self()} 
C
Почему Erlang? 
● Телеком (биллинг) 
● Веб-сервер: YAWS, Cowboy/N2O 
● Стриминг видео: erlyvideo 
● API: WhatsApp, Facebook Chat, ejabberd 
● БД: Riak, CouchDB 
● Сайты: Github Pages, Zotonic CMS
Куда двигаться дальше? 
● "Haskell по-человечески" (http://dshevchenko.biz/hs.html) 
● Видеокурс по Erlang от Ю. Жлобы (https://www.youtube.com/user/yzh44yzh/videos) 
● Статья на RSDN про Erlang (http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml) 
● Книга Дж. Армстронга (https://github.com/dyp2000/Russian-Armstrong-Erlang) 
● Книги от Р. Душкина (http://roman-dushkin.narod.ru/) 
● Подкаст от функциональщиков (http://eax.me/tag/podcast/) 
● Статья про N2O (http://habrahabr.ru/post/220841/)
Спасибо за внимание! 
Вопросы?

Weitere ähnliche Inhalte

Was ist angesagt?

Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
CEE-SEC(R)
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Mikhail Kurnosov
 
вывод алфавитно цифровой информации
вывод алфавитно цифровой информациивывод алфавитно цифровой информации
вывод алфавитно цифровой информации
Lungu
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
student_kai
 

Was ist angesagt? (20)

Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
вывод алфавитно цифровой информации
вывод алфавитно цифровой информациивывод алфавитно цифровой информации
вывод алфавитно цифровой информации
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмов
 
Rust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатноRust: абстракции и безопасность, совершенно бесплатно
Rust: абстракции и безопасность, совершенно бесплатно
 

Andere mochten auch

Rust All Hands Winter 2011
Rust All Hands Winter 2011Rust All Hands Winter 2011
Rust All Hands Winter 2011
Patrick Walton
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
Alexander Shcherbinin
 

Andere mochten auch (9)

Rust: история языка и контекст применения
Rust: история языка и контекст примененияRust: история языка и контекст применения
Rust: история языка и контекст применения
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Rust All Hands Winter 2011
Rust All Hands Winter 2011Rust All Hands Winter 2011
Rust All Hands Winter 2011
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на ruby
 
Вторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ruВторая лекция по основам ruby для студентов itc73.ru
Вторая лекция по основам ruby для студентов itc73.ru
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Ruby basics
Ruby basicsRuby basics
Ruby basics
 
Rust Workshop - NITC FOSSMEET 2017
Rust Workshop - NITC FOSSMEET 2017 Rust Workshop - NITC FOSSMEET 2017
Rust Workshop - NITC FOSSMEET 2017
 

Ähnlich wie Erlang

Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
Andrey Karpov
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Mikhail Kurnosov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
Andrey Karpov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
Andrey Karpov
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
etyumentcev
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
Eugeniy Tyumentcev
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
yaevents
 

Ähnlich wie Erlang (20)

Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур  Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
Кодогенерация на службе оптимизации, Игорь Чевдарь, СКБ Контур
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Распространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложенийРаспространённые ошибки оценки производительности .NET-приложений
Распространённые ошибки оценки производительности .NET-приложений
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
AlgoCollections (RUS)
AlgoCollections (RUS)AlgoCollections (RUS)
AlgoCollections (RUS)
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3разработка серверов и серверных приложений лекция №3
разработка серверов и серверных приложений лекция №3
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 

Erlang

  • 1. Основы функциональных языков программирования на примере Erlang Виктор TyVik Тыщенко
  • 2. Парадигмы программирования Императивная CDC* pDC = this->GetDC(); CBrush* brush = new CBrush; brush->CreateSolidBrush(RGB(0xFF,0xFF,0)); pDC->FillRect(&rect, &brush); delete brush; //!!!!!!!!!!!!!!!! Basic, C++, C#, Pascal, assembler, Java, Perl, Python, Ruby, JavaScript, PHP, Go, Rust...
  • 4. Парадигмы программирования Функциональная picture = color red (circle 100) Lisp, Clojure, Erlang, Scala, Haskell
  • 5. Сравнение Erlang sort([Pivot|T]) → sort([ X || X <- T, X < Pivot]) ++ [Pivot] ++ sort([ X || X <- T, X >= Pivot]); sort([]) -> []. Java public class QuickSort { public static List<Integer> sort(List<Integer> list) { if (list.isEmpty()) { return list; } Integer pivot = list.get(0); List<Integer> listWithoutPivot = list.subList(1, list.size()); List<Integer> leftSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem <= pivot) { leftSide.add(elem); } } List<Integer> rightSide = new LinkedList<>(); for (Integer elem : listWithoutPivot) { if (elem > pivot) { rightSide.add(elem); } } List<Integer> result = new ArrayList<>(); result.addAll(sort(leftSide)); result.add(pivot); result.addAll(sort(rightSide)); return result; } }
  • 6. В чём весь смысл?! ● Нет состояния ● Нет переменных ● Нет побочных эффектов ● Нет общего адресного пространства ● Нет блокировок
  • 7. Стоп, как это нет переменных?! Eshell V5.10.4 (abort with ^G) 1> A = 5. 5 2> A = 3. ** exception error: no match of right hand side value 3
  • 8. Многопоточность public class Example { private int value = 0; public int getNextValue() { return value++; } }
  • 9. Многопоточность public class Example { private int value = 0; private final Semaphore mutex = new Semaphore(1) public int getNextValue() throws InterruptedException { try { mutex.acquire(); return value++; } finally { mutex.release(); } } }
  • 10. Многопоточность -module(counter). -export([start/0, counter/1]). counter(C) -> receive {get, Pid} -> Pid ! C end, counter(C + 1). start() -> NextNum = spawn(counter, counter, [0]), NextNum ! {get, self()}, receive X -> X end.
  • 12. Многопоточность erl counter(C) -> receive {get, Pid} -> Pid ! C end, counter(C + 1). start() -> NextNum = spawn(counter, counter, [0]), NextNum ! {get, self()}, receive X -> X end. spawn pid {get, self()} C
  • 13. Почему Erlang? ● Телеком (биллинг) ● Веб-сервер: YAWS, Cowboy/N2O ● Стриминг видео: erlyvideo ● API: WhatsApp, Facebook Chat, ejabberd ● БД: Riak, CouchDB ● Сайты: Github Pages, Zotonic CMS
  • 14. Куда двигаться дальше? ● "Haskell по-человечески" (http://dshevchenko.biz/hs.html) ● Видеокурс по Erlang от Ю. Жлобы (https://www.youtube.com/user/yzh44yzh/videos) ● Статья на RSDN про Erlang (http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml) ● Книга Дж. Армстронга (https://github.com/dyp2000/Russian-Armstrong-Erlang) ● Книги от Р. Душкина (http://roman-dushkin.narod.ru/) ● Подкаст от функциональщиков (http://eax.me/tag/podcast/) ● Статья про N2O (http://habrahabr.ru/post/220841/)