forked from elixir-lang/elixir-lang.github.com
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
177 lines (132 loc) · 7.43 KB
/
index.html
File metadata and controls
177 lines (132 loc) · 7.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
---
section: home
layout: default
---
<div class="hfeed">
<div class="hentry post no-border">
<img src="/images/contents/home-code.png" alt="Elixir Sample" class="archive-thumbnail" />
<div class="entry-summary">
<p>Elixir é uma linguagem dinâmica e functional contruida para contruir aplicações escaláveis e manuteníveis.</p>
<p>Elixir aproveita a VM do Erlang, conhecida por executar sistemas de baixa lantência, distribuídos e tolerante a falhas, enquanto também sendo sendo utilizado com sucesso no desenvolvimento web e incorporado no software domain.</p>
<p>Para aprender mais sobre Elixir, verifique o <a href="/getting-started/introduction.html">guia de início rápido</a>. ou continue vendo a visão geral da plataforma, linguagem e suas ferramentas.</p>
</div>
</div>
<div class="hentry post">
<h3>Destaques da plataforma</h3>
</div>
<div class="hentry post">
<h4>Escalabilidade</h4>
<div class="entry-summary">
<p>Todo código Elixir roda dentro de pequenas threads (chamadas processos) que são isolados e trocam informações entre si.</p>
{% highlight elixir %}
current_process = self()
# Spawns an Elixir process (not an operating system one!)
spawn_link(fn ->
send current_process, {:msg, "hello world"}
end)
# Block until the message is received
receive do
{:msg, contents} -> IO.puts contents
end
{% endhighlight %}
<p>Devido a sua natureza pequena, não é incomum ter centenas de milhares de processos executando <i>simultaneamente</i> na mesma maquina. O isolamento permite que os processos sejam coletados de forma independente, reduzindo as pausas do sistema e usando todos os recursos da máquina da maneira mais eficiente possível (escalonamento vertical).</p>
<p>Processos são também capazes de se comunicar com outros processos rodando em maquinas diferentes na mesma rede. Isto provê a base para a distribuição, permitindo os desenvolvedores trabalhar entre diferentes nôs (escalonamento horizontal).</p>
</div>
</div>
<div class="hentry post">
<h4>Tolerante a falhas</h4>
<div class="entry-summary">
<p>The unavoidable truth about software running in production is that <i>things will go wrong</i>. Even more when we take network, file systems, and other third-party resources into account.</p>
<p>To cope with failures, Elixir provides supervisors which describe how to restart parts of your system when things go awry, going back to a known initial state that is guaranteed to work:</p>
{% highlight elixir %}
import Supervisor.Spec
children = [
supervisor(TCP.Pool, []),
worker(TCP.Acceptor, [4040])
]
Supervisor.start_link(children, strategy: :one_for_one)
{% endhighlight %}
</div>
</div>
<div class="hentry post">
<h3>Features da linguagem</h3>
</div>
<div class="hentry post">
<h4>Programação funcional</h4>
<div class="entry-summary">
<p>Programação funcional promove um estilo de código que ajuda os desenvolvedores escrever um código menor, rápido, e mantenível. Por exemplo, pattern matching permite desenvolvedores a facilmente desestruturar informações e acessar seu conteúdo:</p>
{% highlight elixir %}
%User{name: name, age: age} = User.get("John Doe")
name #=> "John Doe"
{% endhighlight %}
<p>Quando misturado com guards, o pattern matching nos permite combinar e afirmar com elegância condições específicas para que algum código seja executado:</p>
{% highlight elixir %}
def serve_drinks(%User{age: age}) when age >= 21 do
# Code that serves drinks!
end
serve_drinks User.get("John Doe")
#=> Fails if the user is under 21
{% endhighlight %}
<p>Elixir depende muito desses recursos para garantir que seu software esteja funcionando sob as restrições esperadas. E quando não é, não se preocupe, os supervisores têm a sua volta!</p>
</div>
</div>
<div class="hentry post">
<h4>Extensibilidades e DSLs</h4>
<div class="entry-summary">
<p>Elixir has been designed to be extensible, letting developers naturally extend the language to particular domains, in order to increase their productivity.</p>
<p>Como por exemplo, vamos escrever um simples caso usando <a href="https://hexdocs.pm/ex_unit/">um framework de teste para Elixir chamado ExUnit</a>:</p>
{% highlight elixir %}
defmodule MathTest do
use ExUnit.Case, async: true
test "can add two numbers" do
assert 1 + 1 == 2
end
end
{% endhighlight %}
<p>A opção <code>async: true</code> permite <code>test</code>s rodar em pararelo, usando tantos núcleos de CPU quanto possível, enquanto o <code>assert</code> funcionadade pode introspeccionar seu código, provendo ótimos reportes em caso de falhas. Essas falhas são construidas usando Elixir macros, fazendo isso possível para adicionar novas construções como se elas fossem parte da própria linguagem.</p>
</div>
</div>
<div class="hentry post">
<h3>Features das ferramentas</h3>
</div>
<div class="hentry post">
<h4>Um ecossistema crescente</h4>
<div class="entry-summary">
<p>Elixir vem com um grande conjunto de ferramentas para facilitar o desenvolvimento. <a href="https://hexdocs.pm/mix/">Mix é uma ferramenta de build</a> que permite você criar facilmente projetos, manusear tarefas, rodar testes e mais:</p>
{% highlight text %}
$ mix new my_app
$ cd my_app
$ mix test
.
Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures
{% endhighlight %}
<p>Mix é também capaz de manusear dependências e integra-las muito bem com o <a href="https://hex.pm/">Hex package manager</a>, o qual prove uma resolução de dependências e a habilidade de fazer fetch nos pacotes remotamente.</p>
</div>
</div>
<div class="hentry post">
<h4>Desenvolvimento interativo</h4>
<div class="entry-summary">
<p>Ferramentas como <a href="https://hexdocs.pm/iex/">IEx (Shell iterativo do Elixir)</a> são capazes de alavancar muitos aspectos da linguagem e da plataforma e proveem auto-complete. ferramentas para debug, recarremento de códgio, bem como documentação bem formatada:</p>
{% highlight text %}
$ iex
Interactive Elixir - press Ctrl+C to exit (type h() ENTER for help)
iex> c "my_file.ex" # Compiles a file
iex> t Enum # Prints types defined in the module Enum
iex> h IEx.pry # Prints the documentation for IEx pry functionality
iex> i "Hello, World" # Prints information about the given data type
{% endhighlight %}
</div>
</div>
<div class="hentry post">
<h4>Compatibilidade com Erlang</h4>
<div class="entry-summary">
<p>Elixir roda na VM do Erlang dando aos desenvolvedores um acesso completo ao ecossistema Erlang, usado por empresas como <a href="https://www.heroku.com">Heroku</a>, <a href="https://www.whatsapp.com">WhatsApp</a>, <a href="https://klarna.com">Klarna</a>, <a href="http://basho.com">Basho</a> e muitas mais para construir aplicações tolerante a falhas e distribuidas. Um programador elixir pode invocar qualquer função sem custo de tempo de execução:</p>
{% highlight iex %}
iex> :crypto.hash(:md5, "Using crypto from Erlang OTP")
<<192, 223, 75, 115, ...>>
{% endhighlight %}
<p>Para aprender mais sobre Elixir, verifique nosso <a href="/getting-started/introduction.html">guia de início rápido</a>. Nós também temos uma<a href="/docs.html">documentação online disponível</a> e um <a href="/crash-course.html">Crash Course para desenvolvedores Erlang</a>.</p>
</div>
</div>
</div>