Changes

Main Page

13,536 bytes removed, 5 years ago
Undo revision 8570 by Egor Zorin (talk)
{{ Язык программирования | name <html><div class= Erlang"carousel-container"> | semantics <div class= мультипарадигмальный"carousel" id="carousel" style="left: параллельное, функциональное программирование-0.0387803px;"> |year <div class= 1987 |designer "carousel-panel hero-panel introducing-tablets-with-google-play-for-education active" style= Ericsson Computer Science Laboratory"left: 0px;"> |extension <div class= .erl"carousel-text centered"> |typing <div class= строгая, динамическая |influenced_by = ML, Миранда, Ада, Модула"carousel-2, CHILL, Прологtext-h1">Your turn to change the world to better way</div> </div> </div> </div>}}</div>
'''Erlang (Эрла́нг)''' — функциональный язык программирования, позволяющий писать программы для разного рода распределённых систем. Разработан и поддерживается компанией Ericsson. Язык включает в себя средства порождения параллельных процессов и их коммуникации с помощью посылки асинхронных сообщений. Программа транслируется в байт<div id="cloud-код, исполняемый виртуальной машиной, что обеспечивает переносимость.site" class="grid-fluid l-fixed-width"><section class="l-content text-platinum"> <div class="l-showcase is-large is-split-left l-space-bottom-14"> <div class= История =="l-showcase-content l-pad-right-60">В середине 1980 <h2 class="text-х в компьютерной лаборатории компании Ericsson исследовали применимость существующих на тот момент языков программирования для программного обеспечения телекоммуникационных систем. Джо Армстронг (Joe Armstrong), Роберт Вирдинг (Robert Virding) и Майк Вильямс (Mike Williams) под руководством Бьярне Деккера (Bjarne Däcker), написав прототипы программ на различных языках, пришли к выводу, что ни один из этих языков не имел полного набора возможностей, необходимых в области телекоммуникационных систем. В результате был создан новый язык программирования — Erlang. Своё название язык, вероятно, получил в честь датского математика и инженера Агнера Эрланга, основателя научного направления по изучению сетевого трафика в телекоммуникационных системах. По другой версии, название языка изначально было сокращением от «ericsson language».display-1 l-pad-top-1">Large Scale Data Analytics</h2> <p class== Особенности =="text-body">Язык динамический. Синтаксис наследован от Prolog — компактный BigQuery is Google's <strong>fully managed, содержит минимум конструкцийNoOps, лёгкий для освоения, но не примитивныйlow cost analytics database</strong>К услугам программиста — модули With BigQuery you have no infrastructure to manage and don't need a database administrator, полиморфные функции, сопоставление с образцом, анонимные функции, условные конструкции, структуры, обработка исключений, оптимизация хвостовой рекурсии. В общем базовый арсенал современных функциональных языков. Функциональная парадигма (отсутствие присваиваний) позволяет Erlang избежать таких традиционных для императивных языков проблем распределенных приложений, как необходимость синхронизации, опасность возникновения тупиков и гонок <strong>use familiar SQL</strong> and can take advantage of <strong>pay-as-you-go model</strong>Главное в Erlang — его модель легковесных процессов This collection of features allows you to focus on analyzing data to find meaningful insights. Перефразируя для Erlang слоган текущего дня “Everything is an object” («Всё является объектом»), можно сказать “Everything BigQuery is a process” («Всё является процессом»). Процессы дёшевыpowerful Big Data analytics platform used by all types of organizations, создание процесса занимает не больше ресурсов, чем вызов функции. Единственным способом взаимодействия процессов является асинхронный обмен сообщениями. Процесс имеет свой «почтовый ящик», откуда может выборочно читать сообщения, в чем очень помогает сопоставление по шаблону, код проверки «ящика» чем-то похож на программу на awk, нужное выгребается и обрабатывается, остальное остаётся или выбрасывается from startups to Fortune 500 companies. </p>На разработку программ накладывают сильный отпечаток два момента^ </div> <figure class="l-showcase-image">язык стимулирует к созданию большого количества конкурентных процессовпроцессы жёстко изолированы и не имеют общего состоянияПроцесс проектирования заключается в итеративном разбиении системы на иерархии конкурентно взаимодействующих подсистем, пока составляющие не станут достаточно просты для реализации <img src="https://cloudМощность связки «Процессы+сообщения» не меньше, чем «Объекты+Интерфейсы+Наследование», но зачастую приводит к более компактным и понятным решениямgoogle. Устранение конкуренции также просто как и создание. Отсутствие необходимости блокировки доступа к состоянию процесса для синхронизации их взаимодействия сильно облегчает жизнь. Для конкурентного ресурса обычно просто создаётся процессcom/images/products/artwork/big-монитор, через который осуществляется взаимодействие с ресурсомdata.png" alt="Fully Managed Data Warehouse"> </figure>Второй момент выражается в формуле «let it crash» («пусть процесс упадет»). Вместо перехвата ошибок и попытки продолжения работы часть программы, содержащая рискованный код, выделяется в отдельный процесс </div> <div class="l-камикадзе, этот процесс делает все возможное, чтобы система убила его в случае возникновения ошибки, а процессshowcase is-родитель только получает сообщения о смерти таких незадачливых потомков и делает выводы. Учитывая, что обычно в 90 % подобных ситуаций ничего более путного, чем вывести сообщение об ошибке и попытаться жить с этой болью дальше, не представляется возможным, отсутствие в коде многочисленных проверок не так уж непривлекательно.large l-space-bottom-10 l-space-top-10 l-clearfix"> <div class="c4"> <a href="/storage/docs/standard-storage" md-button= Высокоуровневые конструкции "md-button" class="hover-card is-button" track-type="keepReading" track-name="docs">Erlang является декларативным языком программирования, который скорее используется для описания того, что должно быть вычислено нежели как. Например, определение функции, которое использует сопоставление с образцом для выбора одного из вариантов вычисления или извлечения элемента данных из составной структуры, напоминает уравнение. Сопоставление с образцом распространено даже на битовые строки, что упрощает реализацию телекоммуникационных протоколов. Функции являются объектами первого класса в Erlang. В языке также широко применяются характерные для функциональной парадигмы программирования списковые включения (генераторы списков). <h3 class="text-headline text-uppercase">STANDARD</h3> <p class==Параллельные вычисления == Обмен сообщениями между процессами в ErlangОтличительной особенностью языка является применение легковесных процессов в соответствии с моделью акторов. Такой подход позволяет выполнять одновременно сотни тысяч и даже миллионы таких процессов, каждый из которых может иметь скромные требования по памяти. Процессы изолированы друг от друга и не имеют общего состояния, но между ними можно установить связь и получать сообщения об их состоянии. Для взаимодействия процессов используется асинхронный обмен сообщениями. Каждый процесс имеет свою очередь сообщений, обработка которой использует сопоставление с образцом. Процесс, отправивший сообщение, не получает уведомления о доставке, даже если идентификатор процесса"hover-получателя недействителен или получатель игнорирует сообщение. Таким образом, ответственность за правильно организованное взаимодействие между процессами лежит на разработчике.card-description is-standard"> The highest level ofНапример durability, при реализация на Erlang сетевого чата структура программы может напрямую отражать одновременность действий пользователей по обмену сообщениями путём запуска новых процессов. Эффективность передачи сообщений сохраняется и при увеличении числа процессов, а требования к памяти минимизируются за счёт того, что легковесными процессами управляет виртуальная машина, а не средства нижележащей операционной системыavailability and performance. </p>== Распределённые вычисления == <p>Explore Standard Storage</p>Erlang с самого начала проектировался для распределённых вычислений и масштабируемости. Распределение вычислений встроено в синтаксис и семантику языка, поэтому построение системы можно вести, абстрагируясь от конкретного места вычислений. В стандартной поставке Erlang может наладить связь процессов по протоколу TCP </IP независимо от поддерживаемых им нижележащих платформ (операционных систем).a> </div>Работающий экземпляр среды выполнения Erlang (англ. Erlang runtime system) называется узлом (англ. node). Программы, написанные на Erlang, способны работать на нескольких узлах. Узлами могут быть процессоры, многие ядра одного процессора, и даже целый кластер машин. Узел имеет имя и «знает» о существовании других узлов на данной машине или в сети. Создание и взаимодействие процессов разных узлов не отличается от организации взаимодействия процессов внутри узла. Для создания процесса на другом узле процессу достаточно знать его имя и, без особых на то оснований, он может не интересоваться физическим расположением взаимодействующего с ним процесса. Синтаксис отправки сообщения процессу на своём узле и удалённом один и тот же. Благодаря встроенным в язык возможностям распределённых вычислений объединение в кластер, балансировка нагрузки, добавление узлов и серверов, повышение надёжности вызывают лишь небольшие затраты на дополнительный код. По умолчанию узлы спроектированы для работы внутри обособленного сегмента сети (DMZ), но, если необходимо, коммуникация между узлами может происходить с применением защищённого криптографическими методами протокола SSL. <div class="c4"> <a href="/storage/docs/durable-reduced-availability" md-button= Мягкое реальное время "md-button" class="hover-card is-button" track-type="keepReading" track-name="webinar">Программы на высокоуровневом языке Erlang могут быть использованы в системах мягкого реального времени (которое иногда переводят как «псевдореальное» или «квазиреальное»). Автоматизированное управление памятью и сборка мусора действуют в рамках одного процесса, что даёт возможность создавать системы с миллисекундным временем отклика (даже несмотря на необходимость сборки мусора), не испытывающие ухудшения пропускной способности при высокой нагрузке. <h3 class="text-headline">DRA</h3> <p class==Горячая замена кода =="hover-card-description is-standard"> Same level ofДля систем, которые не могут быть остановлены для обновления кода, Erlang предлагает горячую замену кода (англ durability and performance. hot code upgrade). При этом в приложении могут одновременно работать старая и новая версии кода. Таким способом программное обеспечение на Erlang может быть модернизировано без простоев, а выявленные ошибки исправленыLower cost due to lower availability. </p>==Типы данных == <p>Explore DRA Storage</p>Типизация в Erlang является строгой и динамической. Динамическая типизация была выбрана для языка Erlang по причине того, что первые разработчики были больше с ней знакомы. По мнению Джо Армстронга, статическая типизация потребовала бы очень больших трудозатрат, в частности, реализовать систему горячей дозагрузки кода было бы крайне затруднительно. Такая типизация, при которой возможные ошибки типов выявляются только во время выполнения, тем не менее, не помешала создавать системы с очень высоким уровнем доступности. Данные в Erlang являются неизменяемыми: операции не переписывают старые значения, находящиеся в памяти. Если необходимо, модули на Erlang можно снабдить описаниями и определениями новых типов (не влияющими на компиляцию программы) для автоматической проверки типов с помощью утилиты Dialyzer. </a> </div> <div class="c4"> <a href= Элементы синтаксиса "/storage-nearline/" md-button=={| "md-button" class="wikitablehover-card is-button"|track-| Комментарий до конца строки || %|type="keepReading" track-name="blog">| Регистрозависимость || да| <h3 class="text-headline">NEARLINE</h3>| Присваивание значения переменной || <p class=|"hover-| Определение функции || fun(a, b) card-description is-standard"> ... end| Low-cost, highly durable storage for| Вызов функции || f(a archiving,bbackup,and disaster recovery...)|- </p>| Вызов функции без параметров || f() <p>Explore Nearline Storage</p>|} </a> </div>''Арифметические операции'' </div> </section>{| <section class="wikitablebackground-mist text-platinum l-content l-clearfix">| <span class="sticker l-divider">|Обозначение || Выполняемая операция || Пример || Результат примера| <img src="https://cloud.google.com/images/products/logos/sql-|bnot || Побитовое отрицание bnot || (2#1000) || symbol.png" class="sticker-9|top is-small">|band || Побитовое И || 2 band 3 || 2| <span class="sticker-|bor || Побитовое ИЛИ || 1 bor 2 || 3|bottom is-circle"></span>|bxor || Побитовое исключающее ИЛИ || 5 bxor 3 || 6 </span>| <div class="l-max-width-standard l-clearfix">|bsr || Побитовый сдвиг вправо || 32 bsr 2 || 8| <header class="text-header c12">|bsl || Побитовый сдвиг влево || <h1 class="text-display-1 bsl 5 || 32l-space-bottom-0">Cloud SQL Features</h1>|} <h2 class="text-title">Google Cloud SQL is a fully-managed MySQL database service.</h2> </header> <dl class== Примеры =="c5 a1">''Hello, World!'' <dt>Improved Scalability <sup>BETA</sup></dt> <dd>Пример для версий erl 5 Easily scale up to 16 processor cores and more than 100GB of RAM.7 Quickly scale out with read replicas.3Первая строка задает имя модуля и указывает на то, что он должен находиться в файле prog.erl. Вторая строка экспортирует 0-арную (не имеющую параметров) функцию main. Третья описывает саму функцию, которая выводит “Hello, World!”. </dd> <dt>Integrated</dt> <sourcedd>-module(prog) Cloud SQL instances are accessible from just about any application, anywhere. Easily connect-export([main from <a href="https:/0])/cloud. main() google.com/appengine/" track-type="keepReading" track-name="appEngine"> ioApp Engine</a>, <a href="https:format(//cloud.google.com/compute/"Hello, World!~ntrack-type=")keepReading" track-name="computeEngine">Compute Engine</a>, and your workstation. </sourcedd> <dt>Security</dt> <dd> Cloud SQL customer's data is encrypted when on Google'Факториал'' Пример для версий erl 5.7.3Используется рекурсивное определение факториала. В Erlang нет встроенных цикловs internal networks and when stored in database tables, поэтому цикл приходится симулировать рекурсивной функциейtemporary files, которая начинает с больших значений N, но делает рекурсивный вызов для N-1 до того, как выводит N!and backups. loop(_) — ветвь, которая задает поведение функции Every Cloud SQL instance includes a network firewall, если ее аргумент — не целое число или отрицателен (необходима для корректного определения функции)allowing you to control network access to your database instance by granting access. </dd> <sourcedt>Partnerships &amp; Integrations</dt>-module(prog). <dd> -export([main Take advantage of our growing <a href="https:/0, loop/1])cloud. fact(0) google.com/sql/docs/partners" track-> 1;fact(N) type="keepReading" track-name="partners"> N * fact(N-1)partner ecosystem</a> and tools to make working with Cloud SQL even easier. loop(N) when is_integer(N)Our partners help you streamline the process of loading your data, Ncreate rich visualizations for meaningful insights, and monitor and manage your databases. </dd>=0 - </dl> loop(N-1), io:format("~B! <dl class= ~B~n",[N,fact(N)]);c5">loop(_) - <dt>Higher Performance <sup>BETA</sup></dt> ok. <dd>main() Designed for performance-> loop(16)intensive workloads and significantly faster than first generation. </sourcedd> <dt>Fully Managed</dt> <dd> Replicated, managed and backed-up, so you don''Числа Фибоначчи''t need a Пример для версий erl 5 database administrator.7.3<sup>1</sup>Используется итеративное определение чисел Фибоначчи, выраженное в форме хвостовой рекурсии. </dd> <dt>Standard APIs</dt> <sourcedd>-module(prog) Build and deploy for the cloud faster because Cloud SQL offers standard MySQL databases. Use standard connection drivers and built-export([main/0])in migration tools to get started quickly. fib(1,_,Res) - </dd> io:format("~B, ",[Res]);fib(N,Prev,Res) when N <dt> 1 -Automatic Failover</dt> io:format("~B, ",[Res]), <dd> fib(N-1, Res, Res+Prev) Automatic failover ensures your database will be available when you need it. </dd>main() - <dt>More Convenient Maintenance </dt> fib(16,0,1), <dd> io:format("...~n") Cloud SQL Second Generation<sup>BETA</sup> offers configurable maintenance windows and less frequent maintenance so your databases have less downtime. </sourcedd> </dl>''Числа Фибоначчи'' Пример для версий erl 5.7.3Используется формула Бине. Числа с плавающей точкой обязаны выводиться с как минимум одним знаком после запятой, поэтому результат работы выглядит так: <div class="c12"> <small> 1.0Point in time recovery and instant backups are not yet available in Cloud SQL Second Generation BETA, 1.0, 2.0, 3.0, 5.0, 8.0, 13.0, 21.0, 34.0, 55.0, 89.0, 144.0, 233.0, 377.0, 610.0, 987.0, ..but will be implemented for GA. </small> <source/div>-module(prog). </div> </section> <section class="l-export([main/0]).content text-platinum"> fib(0) <div class="l-showcase is-split-right l-space-bottom-9"> ok;fib(N) <div class="l-showcase-content l-pad-left-26"> fib(N <h2 class="text-headline l-pad-top-1),">Speed &amp; Performance</h2> SQ5 <p class= math:sqrt(5),"text-body"> T1 = math:pow(0.5*(1 + SQ5),N) Load your data from Google Cloud Storage or Google Cloud Datastore, T2 = math:pow(0 or stream it into BigQuery to enable real-time analysis of your data.5*(1 - SQ5),N), io:format("~.1f, ", [(T1 With BigQuery you can easily <strong>deploy Petabyte-T2)scale Databases</SQ5])strong>. </p>main() </div> <figure class="l-showcase-image"> fib(16), io:format( <img src="https://cloud.google.com/images/products/artwork/speed-guage.~npng").alt="Speed and Performance"> </sourcefigure''Квадратное уравнение'' Пример для версий erl 5.7.3  <source/div> <div class="l-module(prog). showcase is-export([main/0]). solve(A, B, C) split-left l-space-bottom-7"> D <div class= B*B "l- 4*A*C,showcase-content l-pad-right-33"> if (D <h2 class== 0) "text-> io:format(headline"x >Incredible Pricing</h2> <p class= ~f~n", [text-B*0body"> BigQuery separates concepts of Big Data storage and compute, allowing you to scale and pay for each independently.5/A]);In addition, true - the <strong> if first terabyte (D > 01 TB) -of data processed each month is free</strong> . Please consult SQ the <a href= math"https:sqrt(D), io:format(//cloud.google.com/bigquery/pricing"x1 md-button= ~f~nx2 = ~f", [(md-B+SQ)/2/A, (button" track-Btype="keepReading" track-SQ)name="pricing">pricing page</2a> for more information. </A]);p> true -</div> SQ <figure class= math:sqrt("l-showcase-D),image l-pad-top-1"> io:format("x1 <img src= (~f,~f)~nx2 = (~f,~f)", [-0.5*Bhttps:/A, 0.5*SQ/A, -0cloud.5*Bgoogle.com/A, images/products/artwork/tb-0free-cloud.5*SQ/A])png" alt="first 1 TB of data process each month is free"> end end.</figure> main() - </div> case io:fread("A <div class= ", "~d") of eof l-> true; {ok, X} showcase is-split-right l-space-bottom-10"> [A] <div class= X,"l-showcase-content l-pad-left-28"> if (A <h2 class== 0) "text-headline l-pad-top-4"> io:format("Not a quadratic equation.")Security &amp; true -Reliability</h2> case io: fread("B <p class= ", text-body"~d") of> eof -BigQuery is built with a <strong> true;replicated storage strategy</strong>. {ok, Y} You can protect your data with strong role-based ACLs that you configure and control. </p> [B] </div> <figure class= Y,"l-showcase-image"> case io <img src="https: fread(//cloud.google.com/images/products/artwork/security-shield.png"C alt= ", Security and Reliability"~d") of> eof - </figure> true; {ok, Z} - </div> [C] = Z, solve(A, B, C) end end end end.</section></sourcediv></html>[[ru:Заглавная страница]]
20,323
edits