Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
C5, vb11, f3
1.
2. Quem sou eu?
Rodrigo Vidal
Twitter: @rodrigovidal
www.rodrigovidal.net
Foco em Arquitetura de Software
Evangelista da Linguagem F#
Professional Scrum Developer
Microsoft Student Partner
3. Evolução do C# e VB
C# 4.0 + VB 10.0
Dinamismo + paridade nas
linguagens
C# 3.0 + VB 9.0
Language Integrated Query
C# 2.0 + VB 8.0
Generics
C# 1.0 + VB 7.0
Código gerenciado
5. Tendências
Aplicações cada vez mais conectadas
Mais latência
Mais problemas de responsividade da interface gráfica
(IG)
Mais problemas de escalabilidade
Programação assíncrona
Está se tornando a norma em aplicações escaladas e
responsivas
APIs que são somente assíncronas, como JavaScript e
Silverlight
7. O que há de novo?
Programação assíncrona Programação assíncrona
Atributos de informação de Atributos de informação de
chamada chamada
Iterators
Type Providers
Query Expressions
8. Assincronia em poucas palavras
Síncrono Espero o resultado antes de retonar
string DownloadString(...);
Assíncrono Retorne agora, chame de volta com
o resultado
void DownloadStringAsync(..., Action<string> callback);
Benefícios da assincronia
Responsividade da interface gráfica: libera as threads de
IG para interação com o usuário
Escalabilidade do servidor: A thread pode ser reutilizada
para outras requisições
9. Síncrono versus Assíncrono
var data = DownloadData(...);
ProcessData(data);
DownloadDataAsync(... , data => {
ProcessData(data);
});
10. Síncrono versus Assíncrono
var data = DownloadData(...);
ProcessData(data);
DownloadDataAsync(... , data => {
ProcessData(data);
});
11. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
12. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
13. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
14. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
15. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
16. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
17. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
18. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
19. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
20. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
21. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
22. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
23. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
24. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
25. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
26. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
27. Fluxo de controle assíncrono
async void DoWorkAsync() {
var t1 = ProcessFeedAsync("www.acme.com/rss");
var t2 = ProcessFeedAsync("www.xyznews.com/rss");
await Task.WhenAll(t1, t2);
DisplayMessage("Done");
} async Task ProcessFeedAsync(string url) {
var text = await DownloadFeedAsync(url);
var doc = ParseFeedIntoDoc(text);
await SaveDocAsync(doc);
ProcessLog.WriteEntry(url);
}
28. Como funciona?
async Task<XElement> GetRssAsync(string url) {
var client = new WebClient();
var task = client.DownloadStringTaskAsync(url);
var text = await task;
var xml = XElement.Parse(text);
return xml;
}
29. Como funciona?
async Task<XElement> GetRssAsync(string url) {
var client = new WebClient();
var task = client.DownloadStringTaskAsync(url);
var text = await task;
var xml = XElement.Parse(text);
return xml;
} Task<XElement> GetRssAsync(string url) {
var client = new WebClient();
var task = client.DownloadStringTaskAsync(url);
return task.ContinueWith(delegate
{
var text = task.Result;
var xml = XElement.Parse(text);
return xml;
});
}
30.
31. Como funciona?
Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create();
async Task<XElement> $state = 0;
var
TaskAwaiter<string> $a1;
GetRssAsync(string url) {
Action $resume = delegate {
var client = new try {
WebClient();
var task = if ($state == 1) goto L1;
client.DownloadStringTaskAsync(url);new WebClient();
var client =
var text = await task; task = client.DownloadStringTaskAsync(url);
var
$a1 = task.GetAwaiter();
var xml = XElement.Parse(text);
return xml; if ($a1.IsCompleted) goto L1;
} $state = 1;
$a1.OnCompleted($resume);
return;
L1: var text = $a1.GetResult();
var xml = XElement.Parse(text);
$builder.SetResult(xml);
}
catch (Exception $ex) { $builder.SetException($ex); }
};
$resume();
return $builder.Task;
}
32. Como funciona?
Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create();
async Task<XElement> $state = 0;
var
TaskAwaiter<string> $a1;
GetRssAsync(string url) {
Action $resume = delegate {
var client = new try {
WebClient();
var task = if ($state == 1) goto L1;
client.DownloadStringTaskAsync(url);new WebClient();
var client =
var text = await task; task = client.DownloadStringTaskAsync(url);
var
$a1 = task.GetAwaiter();
var xml = XElement.Parse(text);
return xml; if ($a1.IsCompleted) goto L1;
} $state = 1;
$a1.OnCompleted($resume);
return;
L1: var text = $a1.GetResult();
var xml = XElement.Parse(text);
$builder.SetResult(xml);
}
catch (Exception $ex) { $builder.SetException($ex); }
};
$resume();
return $builder.Task;
}
33. Como funciona?
Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create();
async Task<XElement> $state = 0;
var
TaskAwaiter<string> $a1;
GetRssAsync(string url) {
Action $resume = delegate {
var client = new try {
WebClient();
var task = if ($state == 1) goto L1;
client.DownloadStringTaskAsync(url);new WebClient();
var client =
var text = await task; task = client.DownloadStringTaskAsync(url);
var
$a1 = task.GetAwaiter();
var xml = XElement.Parse(text);
return xml; if ($a1.IsCompleted) goto L1;
} $state = 1;
$a1.OnCompleted($resume);
return;
L1: var text = $a1.GetResult();
var xml = XElement.Parse(text);
$builder.SetResult(xml);
}
catch (Exception $ex) { $builder.SetException($ex); }
};
$resume();
return $builder.Task;
}
34. Como funciona?
Task<XElement> GetRssAsync(string url) {
var $builder = AsyncTaskMethodBuilder<XElement>.Create();
async Task<XElement> $state = 0;
var
TaskAwaiter<string> $a1;
GetRssAsync(string url) {
Action $resume = delegate {
var client = new try {
WebClient();
var task = if ($state == 1) goto L1;
client.DownloadStringTaskAsync(url);new WebClient();
var client =
var text = await task; task = client.DownloadStringTaskAsync(url);
var
$a1 = task.GetAwaiter();
var xml = XElement.Parse(text);
return xml; if ($a1.IsCompleted) goto L1;
} $state = 1;
$a1.OnCompleted($resume);
return;
L1: var text = $a1.GetResult();
var xml = XElement.Parse(text);
$builder.SetResult(xml);
}
catch (Exception $ex) { $builder.SetException($ex); }
};
$resume();
return $builder.Task;
}
38. Compiler as a Service
Clas
Meta-programação s
Read-Eval-Print Loop (REPL)
public Foo
Fiel
Modelo de objetos d
Incorporação de DSLs
da linguagem
private X
string
Código Assembly
Source
Fonte Source
.NET
Source
code Compilador Source
code
code code
39. Roslyn APIs
Language
Service
Compiler
APIs
Compiler
Pipeline Metadata
Import