<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Raquelm</id>
	<title>Física Computacional - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Raquelm"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Raquelm"/>
	<updated>2026-06-12T20:52:53Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2518</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2518"/>
		<updated>2020-01-07T15:07:17Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ambiente de programação&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto (salvo como .jl) e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N [...]&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um for&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2517</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2517"/>
		<updated>2020-01-07T15:06:33Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ambiente de programação&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto (salvo como .jl) e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N [...]&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um for&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2516</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2516"/>
		<updated>2020-01-07T15:03:33Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ambiente de programação&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto (salvo como .jl) e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N [...]&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um for&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2515</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2515"/>
		<updated>2020-01-07T15:00:56Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ambiente de programação&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto (salvo como .jl) e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2514</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2514"/>
		<updated>2020-01-07T14:59:23Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ambiente de programação&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto (salvo como .jl) e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2513</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2513"/>
		<updated>2020-01-07T14:58:34Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto (salvo como .jl) e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2512</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2512"/>
		<updated>2020-01-07T14:42:28Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar: &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2511</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2511"/>
		<updated>2020-01-07T14:42:09Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no seu terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$julia&amp;lt;/pre&amp;gt; para entrar em seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2510</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2510"/>
		<updated>2020-01-07T14:39:56Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Performance de Julia: na prática */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single dispatch (métodos únicos)&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch (multi-métodos)&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2509</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2509"/>
		<updated>2020-01-07T14:38:59Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Performance de Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
# Dependendo do tipo da minha variável x na chamada da função, será chamada uma função ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2508</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2508"/>
		<updated>2020-01-07T14:37:58Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Performance de Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; Métodos Únicos (single dispatch)&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2507</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2507"/>
		<updated>2020-01-07T14:36:41Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Performance de Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python as variáveis são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2506</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2506"/>
		<updated>2020-01-07T14:02:39Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Testes de Velocidade */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2479</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2479"/>
		<updated>2020-01-07T00:21:26Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2478</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2478"/>
		<updated>2020-01-07T00:16:17Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Impressão na tela&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
9for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2477</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2477"/>
		<updated>2020-01-07T00:15:26Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aprendendo Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Print&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
println(&amp;quot;Hello World&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Hello World&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variáveis&lt;br /&gt;
&lt;br /&gt;
Variáveis são atribuídas dinamicamente e podem mudar.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = 1&lt;br /&gt;
s = &amp;quot;Oi&amp;quot;&lt;br /&gt;
println(s)&lt;br /&gt;
println(typeof(s))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Oi&lt;br /&gt;
String&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s::String&lt;br /&gt;
s = 1&lt;br /&gt;
println(s)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
TypeError: in typeassert, expected String, got Int32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Condicionais&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cats = 12&lt;br /&gt;
if cats &amp;lt; 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 1 &amp;amp;&amp;amp; cats &amp;lt;=6&lt;br /&gt;
println(&amp;quot;Not enough cats.&amp;quot;)&lt;br /&gt;
elseif cats &amp;gt;= 7 &amp;amp;&amp;amp; cats &amp;lt;= 12&lt;br /&gt;
println(&amp;quot;Still not enough cats.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;Gato have more cats.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Still not enough cats.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i = 0&lt;br /&gt;
while (i &amp;lt; 10)&lt;br /&gt;
global i += 1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i = 1:10&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
5&lt;br /&gt;
6&lt;br /&gt;
7&lt;br /&gt;
8&lt;br /&gt;
9&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for i in [1,2,3]&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrays&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array de zeros&lt;br /&gt;
a1 = zeros()&lt;br /&gt;
println(a1)&lt;br /&gt;
# Posso definir o tipo e o tamanho do Array (linhas, colunas) também&lt;br /&gt;
a1 = zeros(Int32, 1, 4)&lt;br /&gt;
println(a1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
[0 0 0 0]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array do tipo inteiro&lt;br /&gt;
a2 = Array{Int32}&lt;br /&gt;
println(a2)&lt;br /&gt;
# Criando um array (de outra maneira) do tipo float&lt;br /&gt;
a3 = Float64[]&lt;br /&gt;
println(a3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array{Int32,N} where N&lt;br /&gt;
Float64[]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Criando um array e definindo valores&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
#Imprimindo a4&lt;br /&gt;
println(&amp;quot;Array: &amp;quot;, a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Array: [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Imprimindo valor de um indíce específico&lt;br /&gt;
println(&amp;quot;Imprimindo primeiro elemento: &amp;quot;, a4[1])&lt;br /&gt;
# Imprimindo último valor do array&lt;br /&gt;
println(&amp;quot;Imprimindo último elemento: &amp;quot;,a4[end])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo primeiro elemento: 1&lt;br /&gt;
Imprimindo último elemento: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4[2])&lt;br /&gt;
# Valores podem mudar (diferente de Tuplas, que veremos adiante)&lt;br /&gt;
a4[2] = 4&lt;br /&gt;
println(a4[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
println(a4)&lt;br /&gt;
# Número de elementos&lt;br /&gt;
println(&amp;quot;Imprimindo número de elementos: &amp;quot;,length(a4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3]&lt;br /&gt;
Imprimindo número de elementos: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Soma os valores do array&lt;br /&gt;
println(&amp;quot;Imprimindo soma dos elementos: &amp;quot;,sum(a4))&lt;br /&gt;
# Põe os valores começando no índice 2&lt;br /&gt;
splice!(a4, 2:1, [8,9])&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): &amp;quot;,a4)&lt;br /&gt;
# Remove os itens do índice 2 ao 3&lt;br /&gt;
4splice!(a4, 2:3)&lt;br /&gt;
println(&amp;quot;Imprimindo Array tendo feito splice!(a4, 2:3): &amp;quot;,a4)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo soma dos elementos: 6&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:1, [8,9]): [1, 8, 9, 2, 3]&lt;br /&gt;
Imprimindo Array tendo feito splice!(a4, 2:3): [1, 2, 3]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a4 = [1,2,3]&lt;br /&gt;
# Pegar valor máximo e valor mínimo&lt;br /&gt;
println(&amp;quot;Imprimindo valor máximo: &amp;quot;,maximum(a4))&lt;br /&gt;
println(&amp;quot;Imprimindo Array valor mínimo: &amp;quot;,minimum(a4))&lt;br /&gt;
# Multiplicando todos os elementos do array por outro número sem precisar de um␣&lt;br /&gt;
println(&amp;quot;Imprimindo multiplicação dos elementos por 2: &amp;quot;,a4 * 2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Imprimindo valor máximo: 3&lt;br /&gt;
Imprimindo Array valor mínimo: 1&lt;br /&gt;
Imprimindo multiplicação dos elementos por 2: [2, 4, 6]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Arrays podem conter funções&lt;br /&gt;
a5 = [sin, cos, tan]&lt;br /&gt;
for n in a5&lt;br /&gt;
println(n(0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
0.0&lt;br /&gt;
1.0&lt;br /&gt;
0.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Para os acostumados com range&lt;br /&gt;
a6 = collect(1:5)&lt;br /&gt;
println(a6)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 2, 3, 4, 5]&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tuplas&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A maioria das funções de array funciona com tuplas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Valores não podem mudar&lt;br /&gt;
t1 = (1,2,3,4)&lt;br /&gt;
println(t1[2])&lt;br /&gt;
t1[2] = 5&lt;br /&gt;
println(t1[2])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
2&lt;br /&gt;
MethodError: no method matching setindex!(::NTuple{4,Int32}, ::Int32, ::Int32)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
println(t1)&lt;br /&gt;
# Imprimindo a tupla inteira&lt;br /&gt;
for i in t1&lt;br /&gt;
println(i)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(1, 2, 3, 4)&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dicionários&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A palavra-chave deve ser única.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimir um valor&lt;br /&gt;
println(d1[&amp;quot;pi&amp;quot;])&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
# Adicionar uma palavra-chave&lt;br /&gt;
d1[&amp;quot;golden&amp;quot;] = 1.618&lt;br /&gt;
# Deleter uma palavra-chave&lt;br /&gt;
delete!(d1, &amp;quot;pi&amp;quot;)&lt;br /&gt;
# Imprimindo todas as palavras-chaves&lt;br /&gt;
println(keys(d1))&lt;br /&gt;
# Imprimindo todos os valores&lt;br /&gt;
println(values(d1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[&amp;quot;pi&amp;quot;, &amp;quot;e&amp;quot;]&lt;br /&gt;
[3.14, 2.718]&lt;br /&gt;
[&amp;quot;e&amp;quot;, &amp;quot;golden&amp;quot;]&lt;br /&gt;
[2.718, 1.618]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
d1 = Dict(&amp;quot;pi&amp;quot;=&amp;gt;3.14, &amp;quot;e&amp;quot;=&amp;gt;2.718)&lt;br /&gt;
# Ver se a palavra-chave existe&lt;br /&gt;
println(haskey(d1, &amp;quot;pi&amp;quot;))&lt;br /&gt;
# Imprimindo palavras-chaves E valores&lt;br /&gt;
for kv in d1&lt;br /&gt;
println(kv)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
true&lt;br /&gt;
&amp;quot;pi&amp;quot; =&amp;gt; 3.14&lt;br /&gt;
&amp;quot;e&amp;quot; =&amp;gt; 2.718&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sets são arrays com elementos únicos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Ele não pega os elementos repetidos&lt;br /&gt;
println(st1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
# Adicionando um elemento&lt;br /&gt;
push!(st1, &amp;quot;Michael&amp;quot;)&lt;br /&gt;
println(st1)&lt;br /&gt;
# Ver se um elemento está no Set&lt;br /&gt;
println(in(&amp;quot;Dwight&amp;quot;, st1))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Michael&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
st1 = Set([&amp;quot;Jim&amp;quot;, &amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
st2 = Set([&amp;quot;Stanley&amp;quot;, &amp;quot;Meredith&amp;quot;])&lt;br /&gt;
# Combinando Sets&lt;br /&gt;
println(union(st1, st2))&lt;br /&gt;
# Imprimindo todo o elemento que os dois Sets tem em comum&lt;br /&gt;
println(intersect(st1, st2))&lt;br /&gt;
# Imprimindo elementos que estão no primeiro Set, mas não no segundo&lt;br /&gt;
println(setdiff(st1, st2))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Set([&amp;quot;Jim&amp;quot;, &amp;quot;Meredith&amp;quot;, &amp;quot;Stanley&amp;quot;, &amp;quot;Pam&amp;quot;])&lt;br /&gt;
Set(String[])&lt;br /&gt;
Set([&amp;quot;Pam&amp;quot;, &amp;quot;Jim&amp;quot;])&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Funções&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using Printf&lt;br /&gt;
# Função de expressão única&lt;br /&gt;
soma(x,y) = x + y&lt;br /&gt;
x, y = 1, 2&lt;br /&gt;
@printf(&amp;quot;%d + %d = %d\n&amp;quot;, x, y, x+y)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
1 + 2 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Função de múltiplas expressões&lt;br /&gt;
function adoptACat(cats)&lt;br /&gt;
if cats &amp;lt;= 1&lt;br /&gt;
println(&amp;quot;You should adopt a cat.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
println(&amp;quot;You should adopt a cat. They&#039;re cute.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
adoptACat(2)&lt;br /&gt;
You should adopt a cat. They&#039;re cute.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV1(v1)&lt;br /&gt;
v1 = 10&lt;br /&gt;
return v1&lt;br /&gt;
end&lt;br /&gt;
changeV1(v1)&lt;br /&gt;
println(v1)&lt;br /&gt;
v2 = changeV1(v1)&lt;br /&gt;
println(v2)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Usando variáveis globais dentro da função&lt;br /&gt;
v1 = 5&lt;br /&gt;
function changeV12()&lt;br /&gt;
global v1 = 10&lt;br /&gt;
end&lt;br /&gt;
changeV12()&lt;br /&gt;
println(v1)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
10&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Quando não sei quantos argumentos vou passar&lt;br /&gt;
function soma(args...)&lt;br /&gt;
sum = 0&lt;br /&gt;
9for i in args&lt;br /&gt;
sum += i&lt;br /&gt;
end&lt;br /&gt;
println(sum)&lt;br /&gt;
end&lt;br /&gt;
soma(1,2,3)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Retornando mais de um valor&lt;br /&gt;
function retorna2(valor)&lt;br /&gt;
return (valor + 1, valor + 2)&lt;br /&gt;
end&lt;br /&gt;
println(retorna2(4))&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
(5, 6)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Map é uma função anônima que aplica uma função para cada elemento&lt;br /&gt;
v = map(x -&amp;gt; x * x, [1,2,3])&lt;br /&gt;
println(v)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
[1, 4, 9]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Structs&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct Estudante&lt;br /&gt;
name::String&lt;br /&gt;
saldoTRI::Float32&lt;br /&gt;
cartaoUFRGS::Int&lt;br /&gt;
end&lt;br /&gt;
# Criando um objeto&lt;br /&gt;
estudante1 = Estudante(&amp;quot;Raquel&amp;quot;, 10.50, 244449)&lt;br /&gt;
println(estudante1.name, &amp;quot;\n&amp;quot;, estudante1.saldoTRI, &amp;quot;\n&amp;quot;, estudante1.cartaoUFRGS)&lt;br /&gt;
&lt;br /&gt;
Saída:&lt;br /&gt;
Raquel&lt;br /&gt;
10.5&lt;br /&gt;
244449&lt;br /&gt;
9&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tipos Abstratos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tipos abstratos não podem ser instanciados como as Structs (instanciar =&amp;gt; fazer estudante1 =&lt;br /&gt;
Estudante(“Raquel”, 10.50, 244449) =&amp;gt; criar um objeto) MAS podem ter subTipos e isso é muito&lt;br /&gt;
útil!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type animal end&lt;br /&gt;
struct cachorro &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
latido::String&lt;br /&gt;
end&lt;br /&gt;
struct gato &amp;lt;: animal&lt;br /&gt;
nome::String&lt;br /&gt;
miado::String&lt;br /&gt;
end&lt;br /&gt;
cachorro1 = cachorro(&amp;quot;Urso&amp;quot;, &amp;quot;Au Au&amp;quot;)&lt;br /&gt;
gato1 = gato(&amp;quot;Lucia Irene&amp;quot;, &amp;quot;Miau&amp;quot;)&lt;br /&gt;
# Criando funções pros subTipos&lt;br /&gt;
function fazerSom(animal::cachorro)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.latido)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
function fazerSom(animal::gato)&lt;br /&gt;
println(&amp;quot;$(animal.nome) diz $(animal.miado)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
fazerSom(cachorro1)&lt;br /&gt;
fazerSom(gato1)&lt;br /&gt;
&lt;br /&gt;
Saída: &lt;br /&gt;
Urso diz Au Au&lt;br /&gt;
Lucia Irene diz Miau&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2476</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2476"/>
		<updated>2020-01-06T23:53:17Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Aprendendo Julia ==&lt;br /&gt;
&lt;br /&gt;
Após feita a instalação de Julia, para abri-la no terminal de comando é preciso apenas digitar &amp;lt;pre&amp;gt;$Julia&amp;lt;/pre&amp;gt; para entrar no seu ambiente de programação.&lt;br /&gt;
&lt;br /&gt;
É possível, também, programar em um arquivo de texto e executar o programa pelo terminal, fazendo simplesmente:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$julia programa.jl &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2475</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2475"/>
		<updated>2020-01-06T23:47:31Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia: na prática ==&lt;br /&gt;
Para resumir, temos: &lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; dynamic (variáveis dinâmicas) single&lt;br /&gt;
dispatch&lt;br /&gt;
&lt;br /&gt;
C++ =&amp;gt; static (variáveis estáticas) multiple dispatch&lt;br /&gt;
&lt;br /&gt;
Julia =&amp;gt; dynamic multiple dispatch (&#039;&#039;o melhor dos dois mundos!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Na prática, é mostrado abaixo um exemplo da performance de Julia como linguagem de programação em dynamic multiple dispatch. &lt;br /&gt;
&lt;br /&gt;
O mesmo programa foi escrito em Julia e em C++. &lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abstract type Animal end&lt;br /&gt;
&lt;br /&gt;
struct Cachorro &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
struct Gato &amp;lt;: Animal&lt;br /&gt;
    nome::String&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
function encontroDeAnimais(a::Animal, b::Animal)&lt;br /&gt;
    acao = encontro(a,b)&lt;br /&gt;
    println(&amp;quot;$(a.nome) encontra $(b.nome) e $acao&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
encontro(a::Cachorro, b::Cachorro) = &amp;quot;cheira&amp;quot; &lt;br /&gt;
encontro(a::Cachorro, b::Gato) = &amp;quot;persegue&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Gato) = &amp;quot;lambe&amp;quot;&lt;br /&gt;
encontro(a::Gato, b::Cachorro) = &amp;quot;ignora&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Instanciando os bichinhos&lt;br /&gt;
gato1 = Gato(&amp;quot;Luciene Maria&amp;quot;)&lt;br /&gt;
gato2 = Gato(&amp;quot;Mel&amp;quot;)&lt;br /&gt;
cachorro1 = Cachorro(&amp;quot;Batata&amp;quot;)&lt;br /&gt;
cachorro2 = Cachorro(&amp;quot;Snoopy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2)&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2)&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;C++&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Animal { &lt;br /&gt;
    public:&lt;br /&gt;
    string nome;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
string encontro(Animal a, Animal b) {}&lt;br /&gt;
&lt;br /&gt;
// Função de encontro que recebe tipo genérico de animal&lt;br /&gt;
void encontroDeAnimais(Animal a, Animal b) {&lt;br /&gt;
    string acao = encontro(a,b);&lt;br /&gt;
    cout &amp;lt;&amp;lt; a.nome &amp;lt;&amp;lt; &amp;quot; encontra &amp;quot; &amp;lt;&amp;lt; b.nome &amp;lt;&amp;lt; &amp;quot; e &amp;quot; &amp;lt;&amp;lt; acao &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Cachorro:public Animal {};&lt;br /&gt;
class Gato:public Animal {};&lt;br /&gt;
&lt;br /&gt;
// Funções de expressão única que recebem diferentes tipos de animais&lt;br /&gt;
string encontro(Cachorro a, Cachorro b) { return &amp;quot;cheira&amp;quot;; }&lt;br /&gt;
string encontro(Cachorro a, Gato b) { return &amp;quot;persegue&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Gato b) { return &amp;quot;lambe&amp;quot;; }&lt;br /&gt;
string encontro(Gato a, Cachorro b) { return &amp;quot;ignora&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
// Instanciando os bichinhos&lt;br /&gt;
Gato gato1;	gato1.nome = &amp;quot;Luciene Maria&amp;quot;;&lt;br /&gt;
Gato gato2;	gato2.nome = &amp;quot;Mel&amp;quot;;&lt;br /&gt;
Cachorro cachorro1;	cachorro1.nome = &amp;quot;Batata&amp;quot;;&lt;br /&gt;
Cachorro cachorro2;	cachorro2.nome = &amp;quot;Snoopy&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
// Chamando função encontroDeAnimais&lt;br /&gt;
encontroDeAnimais(gato1, gato2);&lt;br /&gt;
encontroDeAnimais(gato1, cachorro2);&lt;br /&gt;
encontroDeAnimais(cachorro1, cachorro2);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Julia&#039;&#039;&#039; nós obtemos o seguinte &#039;&#039;&#039;resultado&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e lambe&lt;br /&gt;
Luciene Maria encontra Snoopy e ignora&lt;br /&gt;
Batata encontra Snoopy e cheira&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;C++&#039;&#039;&#039; o &#039;&#039;&#039;resultado&#039;&#039;&#039; é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luciene Maria encontra Mel e&lt;br /&gt;
Falha de Segmentação&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isso acontece porque C++ não aceita que uma função utilize-se de uma variável sem antes saber qual o tipo dessa variável! Por isso, poder utilizar-se de variáveis dinâmicas quando há multi-métodos é um diferencial que acaba por incrementar a performance de Julia como linguagem de programação visada para o Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; é importante ressaltar que os testes feitos não são conclusivos para debater a performance de Julia, em termos estatísticos, e além disso, ser uma linguagem de programação que utiliza de variáveis dinâmicas e multi-métodos não é o único motivo pelo qual Julia poderia trazer tal performance em Cálculo Numérico. Podemos ainda contar com a sua capacidade de &#039;&#039;&#039;metaprogramação&#039;&#039;&#039;, ou seja, Julia pode usar macros e eles são aplicados em tempo de interpretação. Há ainda outros fatores da construção da linguagem que contribuem para sua performance que aqui não foram citados.&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2474</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2474"/>
		<updated>2020-01-06T23:33:27Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Performance de Julia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime, ou seja, &#039;&#039;&#039;tempo de execução&#039;&#039;&#039; =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é em &#039;&#039;&#039;tempo de compilação&#039;&#039;&#039; =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;br /&gt;
&lt;br /&gt;
Em Julia isso é basicamente opcional, não é preciso definir as variáveis, mas é possível, e elas podem mudar dinamicamente, em tempo de execução. E ainda, Julia se utiliza de multi-métodos para não ter que lidar com a constante checagem dos tipos das variáveis, como Python faz!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos Únicos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Python =&amp;gt; single dispatch =&amp;gt; Métodos Únicos&lt;br /&gt;
- Não tenho sobrecarga de funções, eu simplesmente chamo uma função que já está escrita&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Multi-métodos&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sobrecarga de funções (C++) =&amp;gt; Multi-métodos (multiple dispatch)&lt;br /&gt;
- Tenho uma função e dependendo dos parâmetros que eu coloco ao chamá-la, eu chamo uma função ou outra&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplo de sobrecarga de funções em Julia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
//dependendo do tipo da minha variavel x na chamada da funcao, sera chamado uma funcao ou outra, mesmo que tenham o mesmo nome&lt;br /&gt;
&lt;br /&gt;
function printx(x::Float64)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function printx(x::String)&lt;br /&gt;
println(x)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x=&amp;quot;Oi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
printx(x)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2473</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2473"/>
		<updated>2020-01-06T23:21:08Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;br /&gt;
&lt;br /&gt;
Tentando entender o que traria tal performance em Cálculo Numérico para Julia, foi chegado à conclusão de que ser uma linguagem que se utilizada de &#039;&#039;variáveis dinâmicas&#039;&#039; e &#039;&#039;multi-métodos&#039;&#039; seria uma das grandes contribuições da linguagem.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Variáveis dinâmicas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em Python elas são interpretadas em runtime =&amp;gt; o programa checa toda hora se a variável mudou e isso torna ele mais lento&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Variáveis estáticas:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Em C as variáveis são fixas, e isso é visto é emtempo de compilação =&amp;gt; precisa pensar nas variáveis e isso torna o tempo de programação mais lento&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2472</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2472"/>
		<updated>2020-01-06T23:12:09Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Testes de Velocidade */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2471</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2471"/>
		<updated>2020-01-06T23:03:50Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Performance de Julia ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2470</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2470"/>
		<updated>2020-01-06T22:59:23Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Potencial de performance de Julia: origem ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2469</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2469"/>
		<updated>2020-01-06T22:57:55Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Foi testado o tempo de execução da parte principal dos dois programas (isto é, sem fazer o gráfico dos resultados), através do timer do terminal, como mostra na próxima figura:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:Ftcs_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o método de FTCS aplicado à Equação de Difusão&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber, através da figura acima, que o tempo de execução de Python para o FTCS aplicado à Equação de Difusão é menor do que o de Julia. Em razão disso, foi testado um programa simples, como mostra abaixo, que incrementa uma variável 10 vezes, sendo o seu valor inicial 0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Programa para incrementar o valor de uma variável, nesse caso &#039;&#039;i&#039;&#039;, 10 vezes, escrito em Julia e em Python&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E posteriormente, novamente, foi testado o tempo de execução da parte principal dos programas através do terminal:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:For_time.png|border]]&lt;br /&gt;
&#039;&#039;&#039;Legenda:&#039;&#039;&#039; Tempo de execução dos dois programas, em Julia e em Python, para o programa que incrementa o valor da variável 10 vezes&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
É possível perceber que para esse simples programa de incrementação, Python ainda obtém melhor performance do que Julia.&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:For_time.png&amp;diff=2468</id>
		<title>Arquivo:For time.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:For_time.png&amp;diff=2468"/>
		<updated>2020-01-06T22:40:33Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:For.png&amp;diff=2467</id>
		<title>Arquivo:For.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:For.png&amp;diff=2467"/>
		<updated>2020-01-06T22:40:20Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Ftcs_time.png&amp;diff=2466</id>
		<title>Arquivo:Ftcs time.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Ftcs_time.png&amp;diff=2466"/>
		<updated>2020-01-06T22:39:58Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2465</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2465"/>
		<updated>2020-01-06T22:32:12Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Testes de Velocidade */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dessa forma, foi escrito um programa para integrar a Equação de Difusão através do método de FTCS nas linguagens Python e Julia.&lt;br /&gt;
&lt;br /&gt;
Para &#039;&#039;&#039;Python&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: PYTHON&lt;br /&gt;
&lt;br /&gt;
import copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def init():&lt;br /&gt;
	L=50;D=1.;dt=0.05;dx=1.;t=0;tmax=100.&lt;br /&gt;
	k=D*dt/(dx*dx)    &lt;br /&gt;
	return L,k,dt,t,tmax&lt;br /&gt;
&lt;br /&gt;
L,k,dt,t,tmax = init()&lt;br /&gt;
&lt;br /&gt;
x = np.arange(0,L,1)	&lt;br /&gt;
f = np.zeros(x.shape)&lt;br /&gt;
&lt;br /&gt;
a = int(L/3)&lt;br /&gt;
b = int(2*L/3)&lt;br /&gt;
f[a:b]=1.&lt;br /&gt;
f1 = copy.deepcopy(f)	&lt;br /&gt;
f2 = copy.deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax:&lt;br /&gt;
    t+=dt&lt;br /&gt;
    f1[1:L-1]=f[1:L-1]+k*(f[0:L-2]+f[2:L]-2*f[1:L-1])&lt;br /&gt;
    f1[L-1]=f[L-1]+k*(f[L-2]+f[0]-2*f[L-1])	&lt;br /&gt;
    f1[0]=f[0]+k*(f[1]+f[L-1]-2*f[0])		&lt;br /&gt;
    f=copy.deepcopy(f1)		&lt;br /&gt;
&lt;br /&gt;
sum0=sum(f1)&lt;br /&gt;
sum1=sum(f2)	&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Integral em t=0: %7.4f&amp;quot; % sum0)&lt;br /&gt;
print(&amp;quot;Integral em tmax: %7.4f&amp;quot; % sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Em &#039;&#039;&#039;Julia&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//FTCS aplicado na equacao da difusao. Linguagem: JULIA&lt;br /&gt;
&lt;br /&gt;
using PyPlot&lt;br /&gt;
&lt;br /&gt;
L=50&lt;br /&gt;
D=1.&lt;br /&gt;
dt=0.05&lt;br /&gt;
dx=1.&lt;br /&gt;
t=0&lt;br /&gt;
tmax=100.&lt;br /&gt;
k=D*dt/(dx*dx)  &lt;br /&gt;
&lt;br /&gt;
x = collect(0:1:L-1)&lt;br /&gt;
f = zeros(L)&lt;br /&gt;
f1 = zeros(L)&lt;br /&gt;
&lt;br /&gt;
a = trunc(Int, L/3) &lt;br /&gt;
b = trunc(Int, 2*L/3)&lt;br /&gt;
&lt;br /&gt;
f[a+1:b] .= 1.&lt;br /&gt;
f2 = deepcopy(f)&lt;br /&gt;
&lt;br /&gt;
while t&amp;lt;tmax&lt;br /&gt;
	global t+=dt	&lt;br /&gt;
	f1[2:L-1] = f[2:L-1] + k*(f[1:L-2] + f[3:L] - 2*f[2:L-1])		&lt;br /&gt;
	f1[L] = f[L] + k*(f[L-1] + f[1] - 2*f[L])&lt;br /&gt;
	f1[1] = f[1] + k*(f[2] + f[L] - 2*f[1])	&lt;br /&gt;
	global f = deepcopy(f1)		&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
sum0 = sum(f1)&lt;br /&gt;
sum1 = sum(f2)&lt;br /&gt;
&lt;br /&gt;
println(&amp;quot;Integral em t=0: &amp;quot;, sum0)&lt;br /&gt;
println(&amp;quot;Integral em tmax: &amp;quot;, sum1)&lt;br /&gt;
&lt;br /&gt;
plt.plot(x,f,x,f2)&lt;br /&gt;
plt.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2464</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2464"/>
		<updated>2020-01-06T22:13:35Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Testes de Velocidade */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;br /&gt;
&lt;br /&gt;
A fim de pessoalmente testar a velocidade da linguagem de programação, foi escrito um programa em Julia de maneira similar ao programa de Python para o FTCS aplicado na Equação de Difusão (também conhecida como Equação do Calor). &lt;br /&gt;
&lt;br /&gt;
A Equação da Difusão em uma dimensão pode ser escrita da forma:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt}=\frac{d^{2}f}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No método de FTCS (Forward-Time Central-Space) definimos a derivada em t na forma não simetrizada (forward) e as derivadas em x na forma simetrizada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{df}{dt} = \frac{f(x, t+dt) - f(x,t)}{dt}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\frac{d^{2}f}{dx^{2}} = \frac{f(x+dx, t) + f(x-dx, t) - 2f(x,t)}{dx^{2}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E substuindo na equação da difusão, em notação discreta temos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;f_{j}^{n+1} = f_{j}^{n} + D\frac{dt}{(dx)^{2}}[f_{j+1}^{n} + f_{j-1}^{n} - 2 f_{j}^{n}]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observação:&#039;&#039;&#039; esse procedimento funciona bem se &amp;lt;math&amp;gt;k=D\frac{dt}{(dx)^{2}} &amp;lt;= 1/2&amp;lt;/math&amp;gt;, segundo análise de estabilidade do método.&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2463</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2463"/>
		<updated>2020-01-06T20:41:45Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Aspectos Gerais */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2462</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2462"/>
		<updated>2020-01-06T20:40:56Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização de Julia para Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre JUlia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2461</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2461"/>
		<updated>2020-01-06T20:39:31Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, e Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização em Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre JUlia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2460</id>
		<title>Julia</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Julia&amp;diff=2460"/>
		<updated>2020-01-06T20:38:54Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: Criou página com &amp;#039;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and Alan Edelman, um gru...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Julia é uma linguagem relativamente nova de programação que começou a ser desenvolvida em 2009 por Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and Alan Edelman, um grupo do MIT. Ela foi oficialmente lançada para o mundo em 2012.&lt;br /&gt;
&lt;br /&gt;
Em uma entrevista, quando perguntaram a Alan o por quê do nome Julia, ele disse que numa conversa anos atrás alguém sugeriu que Julia seria um bom nome para uma linguagem de programação.&lt;br /&gt;
&lt;br /&gt;
Julia pode ser usada para propósitos gerais de programação, assim como Python, mas em sua criação foi visada a utilização em Cálculo Numérico.&lt;br /&gt;
&lt;br /&gt;
== Aspectos Gerais ==&lt;br /&gt;
&lt;br /&gt;
Julia é uma linguagem de alto nível, isso significa, de maneira sucinta, que ela não é executada utilizando somente o processador, assim como acontece com linguagens de baixo nível, como Assembly, por exemplo.&lt;br /&gt;
&lt;br /&gt;
É escrita em C, C++, e Scheme, usando a estrutura do compilador LLVM (para melhor entendimento, o compilador de C é o GCC, por exemplo), enquanto a maior parte da biblioteca padrão de Julia é implementada na própria Julia.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre Julia para os programadores de Python é que todas as bibliotecas de Python são usáveis através de um comando simples: PyCall.&lt;br /&gt;
&lt;br /&gt;
Um fato importante sobre JUlia para os programadores de C é que Julia possui APIs (Interfaces de Programação de Aplicativos) especiais para chamada de funções em C diretamente.&lt;br /&gt;
&lt;br /&gt;
== Velocidade ==&lt;br /&gt;
&lt;br /&gt;
De acordo com testes feitos pelos próprios criadores de Julia, sua velocidade é similar com a de C.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[[Arquivo:juliasvelocity.png|border]]&lt;br /&gt;
Fonte: [https://julialang.org/benchmarks/]&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Testes de Velocidade ==&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Juliasvelocity.png&amp;diff=2459</id>
		<title>Arquivo:Juliasvelocity.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Juliasvelocity.png&amp;diff=2459"/>
		<updated>2020-01-06T20:18:49Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=M%C3%A9todos_computacionais&amp;diff=2403</id>
		<title>Métodos computacionais</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=M%C3%A9todos_computacionais&amp;diff=2403"/>
		<updated>2020-01-04T20:49:13Z</updated>

		<summary type="html">&lt;p&gt;Raquelm: /* Ferramentas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Física computacional é uma abordagem da &#039;&#039;&#039;física teórica&#039;&#039;&#039; com o auxílio do computador essencialmente&lt;br /&gt;
quando a complexidade do problema impossibilita o avanço pela via analítica e/ou porque os cálculos&lt;br /&gt;
numéricos são longos demais para serem feitos sem automação.&lt;br /&gt;
Alguns consideram a &#039;&#039;&#039;física computacional&#039;&#039;&#039; um terceiro (e mais recente) vértice do triângulo da maneira de se fazer física, onde os outros dois vértices são a &#039;&#039;&#039;física teórica&#039;&#039;&#039; e a &#039;&#039;&#039;física experimental&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Métodos computacionais&#039;&#039;&#039; é a disciplina onde estudamos ferramentas, métodos e algoritmos numéricos para a resolução de problemas de física onde uma abordagem analítica é extremamente complexa ou impossível.&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos de aplicação são: a solução numérica de equações diferenciais ordinárias, integração numérica via métodos de aproximação ou estatísticos como método de Monte Carlo, equações diferencias parciais como as equações de Maxwell e de Schroedinger, métodos matriciais para a solução de problemas de autovalor e autovetor como os encontrados na Mecânica Quântica.&lt;br /&gt;
&lt;br /&gt;
==Breve Historia da Computação==&lt;br /&gt;
&lt;br /&gt;
De Conrad Zuse (1941) ao IBM Blue/Gene (2006)&lt;br /&gt;
&lt;br /&gt;
==Arquitectura==&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Image:Personal_computer%2C_exploded_5.svg Diagrama de PC]&lt;br /&gt;
&lt;br /&gt;
== Ferramentas ==&lt;br /&gt;
===== [[Comandos Unix/Linux]]  =====&lt;br /&gt;
===== [[Gnuplot]] e [[xmgrace]] =====&lt;br /&gt;
===== [[LaTex]] =====&lt;br /&gt;
===== [[FORTRAN]] =====&lt;br /&gt;
===== [[C]] =====&lt;br /&gt;
===== [[Julia]] =====&lt;br /&gt;
&lt;br /&gt;
== Métodos Computacionais A ==&lt;br /&gt;
===== [[Derivada Numérica]] =====&lt;br /&gt;
===== [[Integração Numérica]] =====&lt;br /&gt;
===== [[Interpolação e extrapolação]] =====&lt;br /&gt;
====== [[Fórmula de Lagrange]]======&lt;br /&gt;
====== [[Spline cúbico]]======&lt;br /&gt;
&amp;lt;!--- ===== [[Eliminação gaussiana e retro-substituição]] ===== ---&amp;gt;&lt;br /&gt;
===== [[Zeros de Funções]]=====&lt;br /&gt;
===== [[Mínimos Quadrados]] =====&lt;br /&gt;
===== [[Listas de exercícios]] =====&lt;br /&gt;
====== [[Área 1]] ======&lt;br /&gt;
====== [[Área 2]] ======&lt;br /&gt;
====== [[Área 3]] ======&lt;br /&gt;
&lt;br /&gt;
== Métodos Computacionais B ==&lt;br /&gt;
&lt;br /&gt;
===== [[Integração numérica de equações diferenciais ordinárias]] =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== [[Métodos multipassos]]=====&lt;br /&gt;
&lt;br /&gt;
===== [[Métodos de passo variável]]=====&lt;br /&gt;
&lt;br /&gt;
===== [[Aplicações (Mapas)]]=====&lt;br /&gt;
&lt;br /&gt;
===== [[Números Aleatórios]]=====&lt;br /&gt;
&lt;br /&gt;
===== [[Histogramas e Densidade de Probabilidade ]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[Método de Monte Carlo (integração numérica)]]=====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Métodos Computacionais C ==&lt;br /&gt;
&lt;br /&gt;
===== [[Equações Diferenciais Parciais]] =====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo1 - Dif em 2D]] =====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo2 - Ondas1]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo3 - Ondas2]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo4 - FFT]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo5 - Eq. Schroedinger]]=====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Ising 2D]]=====&lt;br /&gt;
&lt;br /&gt;
===== [[Monte Carlo]] =====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Lennard Jones]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - BOIDS]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Tráfego]]=====&lt;br /&gt;
&lt;br /&gt;
===== [[Teste_conv]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[Teste2]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[Grupo - Dilema Do Prisioneiro]] =====&lt;br /&gt;
&lt;br /&gt;
===== [[Grupo - Modelo Sznajd]] =====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Modelo de Potts]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Conservação do Parâmetro de Ordem]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[ Movimento Coletivo ]] =====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Modelo de Szabó]]=====&lt;br /&gt;
&lt;br /&gt;
=====[[ Ressonância Estocástica ]] =====&lt;br /&gt;
&lt;br /&gt;
=====[[Grupo - Eqs. de Schrödinger não-lineares acopladas]]=====&lt;/div&gt;</summary>
		<author><name>Raquelm</name></author>
	</entry>
</feed>