Changes

Main Page

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