"Você só precisa gerar cuidadosamente o IR LLVM." Egor Bogatov sobre Mono e .NET Core

Egor Bogatov é um desenvolvedor da Microsoft da equipe Mono que trabalha no Mono e o integra ao .NET Core. Conversamos com ele sobre como trabalhar no Xamarin e na Microsoft, sobre o amor pelo desenvolvedor de jogos. Discutimos por que os SSDs são os melhores amigos dos desenvolvedores e a utilidade das apresentações em conferências nem sempre se correlaciona com sua complexidade. Como sempre, a entrevista é conduzida por Oleg Chirukhin ( olegchir ) do Grupo JUG.ru.


Apresentando: Sobre demonstrações criptografadas e como entrar no Xamarin


- Vamos dizer a Habr quem você é, o que você faz.

- Sou desenvolvedor, trabalho na pilha .NET há cerca de dez anos, trabalhei um pouco em Java e escrevi um pouco no Android.

Ele trabalhou em diferentes empresas: começando pela terceirização, depois passou para o mercado, como Viber e Playtika. Depois, trabalhei como freelancer, inclusive em Java, e fui trabalhar no Xamarin.

- Como você chegou lá?

- Sou viciado em .NET e Mono há muito tempo. Gostei de C #, mas não gostei da política da Microsoft, que a vinculava fortemente ao Windows. Portanto, acompanho a implementação de plataforma cruzada desde o início.

Monitorei ativamente o Mono, Xamarin, assim que apareceu: gostei do próprio conceito. Participaram de suas competições e várias vezes conquistaram o segundo lugar. Fui notado e me ofereci para trabalhar como contratado, e Miguel de Icas se escreveu, o que me surpreendeu completamente, porque para mim ele era uma lenda.

- por onde você começou?

- Miguel me convidou para escrever uma demonstração, que incluía bate-papo com criptografia de ponta a ponta para plataformas móveis. Eu tinha experiência em trabalhar com aplicativos de bate-papo e gostava do tópico de criptografia. Inicialmente, eles me levaram ao back-end, mas eu disse que também posso desenvolver para o Android. Depois disso, participei de vários projetos Xamarin de terceiros - também não fui permitido nos componentes de tempo de execução.

Miguel tem muitos projetos interessantes. Às vezes me parece que este é um grupo de pessoas com o mesmo nome. Bem, uma pessoa não pode se atrapalhar em tudo, responder a todos, estar ciente de tudo.

Várias vezes fiz uma demonstração para ele em grandes conferências como o Xamarin Evolve e o MS Build - esta é a maior conferência de desenvolvedores da Microsoft.

E qual foi o significado comercial dessas demos, por que elas são necessárias?

Apenas tecnologia de publicidade entre clientes em potencial. Por exemplo, uma das demos mostrou um exemplo de como você pode integrar facilmente a visualização 3D em um aplicativo regular em qualquer plataforma, e várias empresas sérias se interessaram por esse recurso.

Sobre o trabalho: tarefas e a eterna disputa "remoto ou escritório"


"Agora o que você está fazendo?"

- Fui transferido para a equipe de execução, ou seja, diretamente para o Mono. Minha principal responsabilidade é mesclar o Mono e o .NET Core, ou seja, estar entre dois tempos de execução. Isso me permite entender melhor o .NET, porque sou todos esses tipos, começando pelo mais básico e terminando pelo complexo, pesquisando e analisando minuciosamente. Em dois anos, conseguimos construir uma boa base de experiência e conhecer todos os principais desenvolvedores.

"Você trabalha em casa?"

- Temos um pequeno escritório da Microsoft em Minsk. Eu visito periodicamente lá, mas principalmente de casa eu trabalho.

- E o que é melhor: trabalhar no escritório ou em casa?

- Para trabalhar em casa, você precisa de muita autodisciplina. Periodicamente, tento combinar isso com viagens, mas não funciona de maneira muito eficaz. Por exemplo, preciso de um computador de mesa saudável e completo com três monitores. Em um laptop, não posso trabalhar confortavelmente.

- Você precisa disso para monitores ou a energia do computador é importante?

- E para monitores, e para poder. Periodicamente, preciso compilar diferentes tempos de execução: máquinas virtuais mono, coreclr, corert, tweak, etc. Para fazer isso, preciso de um processador top de linha completo e não um corte de mal-entendido pelo TPD e, é claro, um SSD rápido.

- Ou seja, se você deseja trabalhar no código Mono, precisa de um computador normal?

- O Mono inclui o código-fonte do .NET e .NET Core na forma de submódulos. Portanto, no final, há um grande número de arquivos que você precisa para navegar rapidamente de alguma forma; portanto, o mais importante é um SSD rápido. Precisamos pegar algo do Samsung 960 Pro e superior. O gargalo está sempre em IO.

- Descreva seu dia de trabalho

- Trabalho remotamente em Minsk. A maior parte da minha equipe está nos EUA, embora haja várias pessoas na Europa, no Japão, na Austrália e até na África. Uma equipe tão distribuída. Nós nos comunicamos principalmente no Slack, realizamos comícios algumas vezes por semana. Nos encontramos periodicamente em Boston ou Redmond.

As tarefas são principalmente bastante abstratas. Por exemplo, tipos de porta de um espaço para nome específico. Eu posso pegar algo em paralelo, acessar o GitHub e corrigir alguns bugs. Periodicamente, faço algo no .NET Core - tento otimizar ou limpar alguma coisa.

- E de onde vêm as tarefas, como isso é organizado? Qualquer lista interminável?

- As tarefas são iniciadas pelos usuários e líderes de equipe. Uma vez por mês, temos uma semana de correção de bugs: passamos apenas uma semana corrigindo correções de bugs, você joga fora outras coisas.

No restante do tempo, também é aconselhável não esquecer os bugs, mas você precisa seguir os principais objetivos, por exemplo, meu objetivo é portar os principais tipos do mscorlib e fazer o Mono / Xamarin estar em conformidade com o NET Standard 2.1. A portabilidade de tipo geralmente parece jogar fora a implementação antiga e substituí-la por um link para o código no sub-módulo .NET Core pela adaptação.

Sobre a Microsoft, Axes e Traição


- Bem, sim, a licença permite. E de fato você está na mesma empresa.

Sim, sim. Já fizemos isso antes. O Mono fazia parte de algumas distribuições, acho que o Ubuntu e o GNOME até tinham o Mono. Miguel foi informado de que deixaria todo mundo no mosteiro.

"Sim, eu lembro, Stallman o chamou de traidor."

“Eles temiam que os advogados da Microsoft pudessem comparecer a qualquer momento e processar todos, o que, felizmente, a Microsoft não fez.

- Bem, sim, a Microsoft fez exatamente o contrário - começou a usar o Linux em casa.

- A Microsoft agora é completamente diferente com o novo CEO, o foco nas tecnologias em nuvem nos levou ao mundo do código aberto e tudo o que não podíamos pensar antes. Agora é possível baixar o Ubuntu WSL do Marketplace com um clique, implantar o MS SQL Server no Linux e desenvolver no .NET no macOS.

- Ou seja, você pode escrever código com segurança sob licenças abertas e ninguém dirá nada?

"Sim, claro." Naturalmente, antes de colocar algum projeto interno em código aberto, precisamos de um pouco de burocracia, mas, em geral, não cumpri nenhuma proibição de usar nada.

- Você tem tarefas que exigem três plataformas ao mesmo tempo?

- Eu tenho um conjunto inteiro: um computador Windows, MacBook com macOS e um laptop com Fedora. Também um monte de máquinas virtuais, incluindo WSL. Na maioria das vezes, os bugs são divididos em dois tipos - Windows e não Windows, que são executados no macOS e no Linux.

Noções básicas sobre .NET Core e Mono


- Quais são as instruções que você gosta e elas podem ser desenvolvidas no .NET Core e no Mono?

- Pessoalmente, gosto de muita ênfase no desempenho e na plataforma cruzada. Ele melhora constantemente o desempenho em condições de combate, do Bing, para benchmarks públicos como o TechEmpower, em que o .NET Core tem um desempenho muito bom junto com as soluções Go, Java e C ++. Muitas pessoas ainda têm um estereótipo sobre o .NET como tecnologias somente para Windows com uma máquina virtual de frenagem - estamos combatendo com sucesso esse estereótipo.
Nossa equipe presta muita atenção aos cenários da AOT e ao uso do LLVM como back-end para gerar código de máquina. O LLVM é uma ferramenta muito poderosa com um grande número de otimizações. Só é necessário gerar cuidadosamente o LLVM IR com um número mínimo de pontos de segurança, para não interferir nessas otimizações. Pessoalmente, escrevi recentemente meu passe de transformação LLVM simples.

Também é encorajador que C # e .NET sejam mainstream em pé de igualdade com C ++ no desenvolvimento de jogos, graças ao Unity e a alguns outros mecanismos que possuem scripts em C #.
Existe uma direção potencialmente interessante - compilar C # no Web Assembly para o navegador.

- Não sei como é o .NET, mas às vezes tenho que arrastar várias bibliotecas padrão para compilação. Em Java, você executa o Hello World e tem 2.000 classes carregadas. Um grande número de megabytes será carregado no navegador. O que você acha disso?

- O tamanho mínimo de um tempo de execução Mono com uma biblioteca base é de cerca de dois megabytes. Mas mesmo a Apple tem esse problema: aplicativos escritos em Swift arrastam cada um de seus tempos de execução. Enquanto a tecnologia Mono-wasm é bruta e baseada no tempo de execução, que foi compilado pela AOT no interpretador WASM + para código do usuário. A propósito, agora reescrevemos o tempo de execução de C para C ++, espero que isso não afete o tamanho no final.

- Você tentou reescrever o Mono em C # em vez de vantagens ou C?

- A ideia parece boa, mas exigiria recursos irrealistas e temos algum progresso nisso. A equipe do .NET Core atingiu um nível tão alto de C # e .NET que o código positivo é substituído por C # para não tomar banho de vapor com desempenho entre plataformas e, ao mesmo tempo, não perde desempenho. Um exemplo recente é a tradução da implementação de analisar e converter tipos numéricos e todo o decimal foi reescrito em C #. Isso me deixa muito feliz e simplifica bastante o trabalho de migração de código.

Sobre o coletor de lixo


- Eu vi o .NET Core GC que assusta crianças, porque é um megabytes e meio de origem em C ++! Um megabyte e meio, Karl! Isso é quantos livros ?!

- Sim, sim, enquanto 47 colaboradores foram anotados neste arquivo de acordo com o github. Não sou especialista em Garbage Collector, mas em geral o GC tem uma teoria bastante geral, como o algoritmo Mark-n-Sweep, que é complicado por gerações e tenta evitar as paradas completas do mundo e fazer tudo paralelo ao principal segmento de execução.

- Você tem plug-ins ou a capacidade de alterar o Garbage Collector ou é um?

- No Mono, existem várias implementações e, no .NET Core, criamos recentemente uma API pública que permite pegar alguns cabeçalhos, escrever seu próprio HZ e conectá-lo a qualquer aplicativo de uma variável de ambiente. Como exemplo, há um artigo sobre como escrever o ZeroGC for .NET Core. No mundo dos contêineres, onde não é necessário remover o lixo, isso pode ser relevante. Em geral, isso permite que alguém, por exemplo, pegue a implementação atual e a otimize o máximo possível para, digamos, um desenvolvedor de jogos, para que parar o mundo e percorrer todos os objetos não cause febre de FPS, por exemplo, ou otimize o consumo de memória, na minha opinião, os caras da Samsung fizeram isso para Tizen algumas modificações no GC.

- O fato de a Microsoft deixar o controle total sobre tudo é bom, porque o GC e o JIT são uma ferramenta de controle muito boa.

Sim. Veja o .NET Foundation - não é apenas a Microsoft. Lá Google, Red Hat, Samsung, Intel, em geral, todas as empresas que antes, ao que parece, não ficariam ao lado da Microsoft. A menos que a Apple esteja faltando.

Sobre o suporte ao IDE


- Sobre o IDE: quão bom é o ajuste, o compilador e o suporte ao IDE? Agora, existem todos os tipos de coisas como Swift, onde o compilador oferece poucas oportunidades para inspecionar a estrutura interna, o cache e outras coisas. E isso é uma dor sem fim, porque quando você faz o seu próprio ajuste, precisa reinventar o mundo inteiro. Quão bom é isso com o Mono? Você tem seu próprio IDE?

- O compilador de C # Roslyn foi originalmente escrito como não apenas um compilador de C # na IL, mas também como analisador e back-end IDE, podendo até digerir códigos incorretos. Você pode simplesmente mostrar algumas visualizações e fazer algo com base em sua saída, e ele dirá diretamente: "Mostre-me o menu lá", "refatoração de oferta", "aqui você tem uma prévia das alterações", etc. oferecer refatoração ao usuário ". Ou seja, esse compilador permite diretamente que você faça seu IDE rapidamente.

De fato, você acabou de implementar um conjunto de interfaces para sua GUI e já possui um IDE que suporta um grande conjunto de refatoração e similares.

Em geral, muitas linguagens modernas fornecem o AST, uma árvore abstrata de expressões de código. Por exemplo, Clang torna possível obter uma árvore abstrata do código positivo, a propósito, usamos esse recurso para gerar ligações C # para código C ++ e Objective-C.

- Você já tentou usar o Visual Studio Code para alguma coisa?

- Bem, eu diria que esta é a minha ferramenta mais básica.

- Digamos que o cara queira abrir o repositório Mono e pendurá-lo. O que ele precisa para isso?

- No Windows, basta abrir a solução do tempo de execução e a solução do btsl e criar os dois. Graças à paralelização eficiente, o msbuild deve fazê-lo em cerca de 5 minutos.No macOS e Linux, a abordagem usual através do Makefiles é usada.

Na preparação de relatórios e alguns spoilers


- Você vem ao DotNext com o relatório, mas sobre o que será?

- Meu relatório consistirá em um conjunto de exemplos interessantes de microoptimizações aplicadas no .NET Core por desenvolvedores e colaboradores de terceiros, que, eu acho, também podem ser úteis para programadores aplicados. Também prestarei atenção a exemplos malsucedidos para otimizar algo, por exemplo, quando colaboradores contribuem para otimizar um caso em particular, mas isso acontece de lado na forma de regressão em outros. Separadamente, haverá uma dúzia de slides na nova API SIMD.

Os caras da Intel e os da Microsoft criaram em C # uma API de baixo nível para SIMD, que permite escrever algoritmos ultra-rápidos sem depender do compilador, que, como muitas pessoas pensam, será capaz de otimizar e vetorizar tudo sozinho - isso não acontece.

- No caso geral, isso é teoricamente impossível.

- Sim, nenhum lugar para fugir da inserção independente de intrínsecos. Duvido que em qualquer idioma seja possível descrever a multiplicação ou transposição de matrizes em tipos simples e esperar as instruções SSE / AVX mais eficazes do compilador para a saída. A propósito, eu já apliquei essas intrínsecas C # dentro do .NET Core para otimizar System.Numerics.Matrix usando SSE e otimizei a função GetHexDigits usando Lzcnt. Você pode usá-lo como um exemplo de uso da API em seus projetos.

- Quando chegam pessoas que estão desenvolvendo algo central, também estão interessadas em participar. Existe alguma maneira de novato?
Qualquer colaborador que receba pela primeira vez muita atenção e ajuda, muitas tarefas simples ou bugs que não exigem conhecimento extensivo e altas prioridades podem ser marcadas com um rótulo especial no GitHub - "up-for-grabs" ou "good first issue".

- Você pode ir ao repositório, encontrar problemas com essas tags e escolher uma pessoa que esteja próxima do espírito. Por exemplo, algumas tarefas são sobre cobrir alguns trechos de código com testes. Aumentar a cobertura com testes é apenas a primeira tarefa perfeita. Também é uma boa maneira de comparar algo, compará-lo com outros tempos de execução e tentar descobrir por que esse ou aquele código funciona mais lentamente que no .NET 4.x, por exemplo, string.GetHashCode. No benchmarking, há um grande número de discursos e posts de Andrei Akinshin e Adam Sitnik sobre uma ferramenta muito conveniente - o BenchmarkDotNet, que com um simples movimento da mão mostrará a velocidade da execução do código com um atributo, compare-o com outros tempos de execução, informe sobre memória e mostre o código do assembler.

I.e. o conjunto mínimo de ações é navegar por todas as solicitações e tarefas pull, assinar pessoas como Matt Waren e Ben Adams no Twitter, acessar os canais corefx e coreclr no twitter e ler a documentação do BenchmarkDotNet.

Sim. Agora filtramos a tag de oferta imediata, existem cerca de 600 problemas aqui, alguns sem comentários e você pode aceitá-los.

Sim, está certo. Mais recentemente, eles realizaram um hackathon para a equipe do .NET Core. Eles alocaram uma dúzia de questões e, em um dia, tiveram que ser consertadas e receber um prêmio por isso.

Isso é ótimo. Ele contou muitas coisas interessantes, agora eu quero tentar resolver algum problema pessoalmente. É verdade que eu não sei C #, esse é o problema.

- C #, como eu quero acreditar, uma linguagem bastante previsível, apesar da quantidade de açúcar e com experiência em Java ou C ++, acho que você pode até começar a otimizar algo rapidamente em tempo de execução, a experiência em outras linguagens o ajudará nas coisas do outro lado.

- Estou olhando para o repositório .NET Core e parece muito decente. E as pessoas realmente se comunicam nos comentários, as discussões estão ocorrendo diretamente.

- Sim, bastante ativo. Existem 100 e 200 comentários. E você pode aprender com a biblioteca de classes básica, há muitas tarefas interessantes que qualquer um pode executar.

- Muito obrigado pelas respostas! Encontre-me no DotNext.

Desta vez, um minuto de publicidade será incomum, porque enquanto estávamos preparando a entrevista, os ingressos para a conferência acabaram. Deseja ver os relatórios e não teve tempo para comprar um ingresso? A transmissão ao vivo ainda está disponível no site .

Se você tiver dúvidas ou um desejo incrível de visitar o DotNext 2018 em Moscou pessoalmente, escreva-nos para tickets@dotnext.ru (talvez alguém devolva o bilhete e possamos ajudá-lo).

Source: https://habr.com/ru/post/pt430048/


All Articles