"Solo necesita generar cuidadosamente el LLVM IR". Egor Bogatov sobre Mono y .NET Core

Egor Bogatov es un desarrollador de Microsoft del equipo de Mono que trabaja en Mono y lo integra con .NET Core. Hablamos con él sobre cómo trabajar dentro de Xamarin y Microsoft, sobre el amor de los desarrolladores de juegos. Discutimos por qué los SSD son los mejores amigos de los desarrolladores, y la utilidad de las presentaciones de conferencias no siempre se correlaciona con su complejidad. Como siempre, la entrevista es realizada por Oleg Chirukhin ( olegchir ) del Grupo JUG.ru.


Presentación: acerca de las demostraciones cifradas y cómo ingresar a Xamarin


- Vamos a decirle a Habr quién eres, qué haces.

- Soy desarrollador, he estado trabajando en la pila .NET durante unos diez años, trabajé un poco en Java y escribí un poco con Android.

Trabajó en diferentes compañías: comenzando con la subcontratación, luego cambió a la tienda de comestibles, como Viber y Playtika. Luego trabajé un poco, incluso en Java, y me fui a trabajar a Xamarin.

- ¿Cómo llegaste allí?

- He sido adicto a .NET y Mono durante mucho tiempo. Me gustó C #, pero no me gustó la política de Microsoft, que la vinculaba fuertemente a Windows. Por lo tanto, he estado siguiendo la implementación multiplataforma desde su inicio.

Supervisé activamente a Mono, Xamarin, tan pronto como apareció: me gustó el concepto en sí. Participó en sus concursos y varias veces ocupó el segundo lugar. Fui notado y me ofrecieron trabajar como contratista, y Miguel de Icas se escribió a sí mismo, lo que fue una completa sorpresa para mí, porque para mí era una leyenda.

- ¿Dónde empezaste?

- Miguel me invitó a escribir una demostración, que incluía chat con cifrado de extremo a extremo para plataformas móviles. Tenía experiencia trabajando con aplicaciones de chat y me gustaba el tema del cifrado, por lo que inicialmente me llevaron al backend, pero dije que también puedo desarrollar para Android. Después de eso, participé en varios proyectos de terceros de Xamarin; tampoco se me permitió ingresar a los componentes de tiempo de ejecución.

Miguel tiene muchos proyectos interesantes. A veces me parece que este es un grupo de personas con el mismo nombre. Bueno, una persona no puede hurgar en todo, responder a todos, ser consciente de todo.

Varias veces hice una demostración para él para grandes conferencias como Xamarin Evolve y MS Build: esta es la conferencia de desarrolladores más grande de Microsoft.

¿Y cuál era su significado comercial de estas demostraciones, por qué son necesarias?

Solo tecnología publicitaria entre clientes potenciales. Por ejemplo, una de las demostraciones mostró un ejemplo de cómo puede integrar fácilmente la visualización 3D en una aplicación normal en cualquier plataforma, y ​​varias compañías serias estaban interesadas en esta característica.

Sobre el trabajo: tareas y la eterna disputa "remota u oficina"


"¿Ahora qué estás haciendo?"

- Fui transferido al equipo de tiempo de ejecución, es decir, directamente a Mono. Mi responsabilidad principal es fusionar Mono y .NET Core, es decir, estar en algún lugar entre dos tiempos de ejecución. Esto me permite comprender mejor .NET, porque soy de todos estos tipos, comenzando con el más básico y terminando con el complejo, la investigación y la consideración exhaustiva. En dos años, logramos construir una buena base de experiencia y conocer a todos los desarrolladores clave.

"¿Trabajas desde casa?"

- Tenemos una pequeña oficina de Microsoft en Minsk. Periódicamente visito allí, pero principalmente desde casa trabajo.

- ¿Y qué es mejor: trabajar en la oficina o en casa?

- Para trabajar en casa necesitas mucha autodisciplina. Periódicamente trato de combinar esto con los viajes, pero no funciona de manera muy efectiva. Por ejemplo, necesito una computadora de escritorio saludable con tres monitores. En una computadora portátil, no puedo trabajar cómodamente.

- ¿Necesita esto para los monitores o es importante la potencia de la computadora?

- Y para monitores, y para poder. Periódicamente necesito compilar diferentes tiempos de ejecución: mono, coreclr, corert, ajustar máquinas virtuales, etc. Para hacer esto, necesito un procesador de gama alta completo, y no un corte de malentendido por TPD, y, por supuesto, un SSD rápido.

- Es decir, si quieres trabajar en el código Mono, ¿necesitas una computadora normal?

- Mono incluye el código fuente para .NET y .NET Core en forma de submódulos, por lo que al final hay una gran cantidad de archivos que necesita navegar rápidamente de alguna manera, por lo que lo más importante es un SSD rápido. Necesitamos tomar algo del Samsung 960 Pro y superior. El cuello de botella siempre está en IO.

- Describe tu día de trabajo

- Trabajo remotamente desde Minsk. La mayor parte de mi equipo está en los Estados Unidos, aunque hay varias personas en Europa, hay personas en Japón, Australia, incluso en África. Tal equipo distribuido. Nos comunicamos principalmente en Slack, realizamos manifestaciones un par de veces a la semana. Nos reunimos periódicamente en Boston o Redmond.

Las tareas son en su mayoría bastante abstractas. Por ejemplo, tipos de puertos de un espacio de nombres específico. Puedo tomar algo en paralelo, ir a GitHub y corregir algunos errores. Periódicamente hago algo para .NET Core: trato de optimizar o limpiar algo.

- ¿Y de dónde vienen las tareas, cómo está organizado? ¿Alguna acumulación sin fin?

- Las tareas son iniciadas por usuarios y líderes de equipo, una vez al mes tenemos una semana de corrección de errores: pasamos solo una semana arreglando la corrección de errores, descarta otras cosas.

El resto del tiempo también es recomendable no olvidarse de los errores, pero debe cumplir con los objetivos principales, por ejemplo, mi objetivo es portar los tipos principales de mscorlib y hacer que Mono / Xamarin se ajuste al estándar NET 2.1. La transferencia de tipos generalmente parece descartar la implementación anterior y reemplazarla con un enlace al código en el submódulo .NET Core con adaptación.

Sobre Microsoft, Axes y Betrayal


- Bueno, sí, la licencia lo permite. Y de hecho estás en la misma compañía.

- Sí lo hace. Hemos hecho esto antes. Mono era parte de algunas distribuciones, creo que Ubuntu y GNOME incluso tenían Mono. A Miguel le dijeron que decepcionaría a todos al monasterio.

"Sí, lo recuerdo, Stallman lo llamó traidor".

“Temían que los abogados de Microsoft pudieran venir en cualquier momento y demandar a todos, lo que, afortunadamente, Microsoft no hizo.

- Bueno, sí, Microsoft hizo exactamente lo contrario: comenzó a usar Linux en casa.

- Microsoft ahora es completamente diferente con el nuevo CEO, el enfoque en las tecnologías en la nube nos ha llevado al mundo del código abierto y en todo lo que antes no podíamos pensar. Ahora es posible descargar Ubuntu WSL desde Marketplace con un solo clic, implementar MS SQL Server en Linux y desarrollar bajo .NET desde macOS.

- Es decir, ¿puede escribir código de forma segura con licencias abiertas y nadie dirá nada?

"Sí, por supuesto". Naturalmente, antes de poner cualquier proyecto interno en código abierto, necesitamos un poco de burocracia, pero en general, no he cumplido ninguna prohibición de usar nada.

- ¿Tienes tareas que requieren tres plataformas a la vez?

- Tengo un conjunto completo: una computadora con Windows, MacBook con macOS y una computadora portátil con Fedora. También un montón de máquinas virtuales, incluido WSL. Con mayor frecuencia, los errores se dividen en dos tipos: Windows y no Windows, que se ejecutan tanto en macOS como en Linux.

Comprender .NET Core y Mono


- ¿Cuáles son las instrucciones que le gustan y pueden desarrollarse en .NET Core y en Mono?

- Personalmente, me gusta mucho el énfasis en el rendimiento y multiplataforma. Mejora constantemente el rendimiento en condiciones de combate desde Bing hasta puntos de referencia públicos como TechEmpower, en el que .NET Core funciona muy bien junto con las soluciones Go, Java y C ++. Muchas personas todavía tienen un estereotipo sobre .NET como tecnologías exclusivas de Windows con una máquina virtual de frenado: estamos luchando con éxito contra este estereotipo.
Nuestro equipo presta gran atención a los escenarios AOT y al uso de LLVM como back-end para generar código de máquina. LLVM es una herramienta muy poderosa con una gran cantidad de optimizaciones. Solo es necesario generar cuidadosamente LLVM IR con un número mínimo de puntos seguros, para no interferir con estas optimizaciones. Personalmente, recientemente escribí mi simple pase de transformación LLVM.

También es alentador que C # y .NET sean mainstream junto con C ++ en el desarrollo de juegos, gracias a Unity y algunos otros motores que tienen secuencias de comandos C #.
Hay una dirección potencialmente interesante: compilar C # en Web Assembly para el navegador.

- No sé cómo hacerlo en .NET, pero a veces tengo que arrastrar un montón de bibliotecas estándar para la compilación. En Java, ejecutas Hello World y tienes 2.000 clases cargadas. Se cargará una gran cantidad de megabytes en el navegador. ¿Qué opinas sobre esto?

- El tamaño mínimo de un tiempo de ejecución Mono con una biblioteca base es de aproximadamente dos megabytes. Pero incluso Apple tiene este problema: las aplicaciones escritas en Swift arrastran cada uno de sus tiempos de ejecución. Si bien la tecnología Mono-wasm es sin procesar y se basa en el tiempo de ejecución, que fue compilada por AOT en el intérprete WASM + para el código de usuario. Por cierto, ahora reescribimos el tiempo de ejecución de C a C ++, espero que esto no afecte el tamaño al final.

- ¿Has intentado reescribir Mono en C # en lugar de más o C?

- La idea suena bien, pero requeriría recursos poco realistas y tenemos algunos avances en esto. El equipo .NET Core ha alcanzado tal nivel de C # y .NET que el código positivo se reemplaza por C # para no tomar un baño de vapor con rendimiento multiplataforma y al mismo tiempo no perderá rendimiento. Un ejemplo reciente es la traducción de la implementación de análisis y conversión de tipos numéricos y todo el Decimal se ha reescrito en C #. Esto me hace muy feliz y simplifica enormemente el trabajo de migración de código.

Sobre recolector de basura


- ¡Vi el .NET Core GC que asusta a los niños, porque es un megabyte y medio de fuente en C ++! ¡Un mega y medio megabytes, Karl! ¿Cuántos libros hay?

- Sí, sí, mientras que 47 colaboradores fueron anotados en este archivo de acuerdo con el github. No soy un experto en Garbage Collector, pero en general GC tiene una teoría bastante general, como el algoritmo Mark-n-Sweep, que se complica por generaciones e intenta evitar las paradas completas del mundo y hacer todo en paralelo al hilo principal de ejecución.

- ¿Tiene complementos o la capacidad de cambiar el recolector de basura o es uno?

- En Mono, hay varias implementaciones, y en .NET Core recientemente creamos una API pública que le permite tomar un par de encabezados, escribir su propio HZ y conectarlo a cualquier aplicación de una variable de entorno. Como ejemplo, hay un artículo sobre cómo escribir ZeroGC para .NET Core. En el mundo de los contenedores, donde no es necesario eliminar la basura, puede ser relevante. En general, esto permite a alguien, por ejemplo, tomar la implementación actual y optimizarla tanto como sea posible para, por ejemplo, un desarrollador de juegos, de modo que detener el mundo y atravesar todos los objetos no cause fiebre por FPS, por ejemplo, u optimizar el consumo de memoria, en mi opinión, los chicos de Samsung hicieron esto para Tizen un par de modificaciones a la GC.

- El hecho de que Microsoft haya dejado ir el control total sobre todo es bueno, porque el GC y JIT son una muy buena herramienta de control.

- si. Mire la .NET Foundation: no se trata solo de Microsoft. Hay Google, Red Hat, Samsung, Intel, en general, todas las compañías que antes, al parecer, no estarían al lado de Microsoft. A menos que Apple se haya perdido.

Sobre IDE Support


- Acerca del IDE: ¿qué tan bueno es en el ajuste, en el compilador y en el soporte del IDE? Ahora hay todo tipo de cosas como Swift, donde el compilador ofrece muy pocas oportunidades para inspeccionar la estructura interna, el caché, algo más. Y este es un dolor interminable, porque cuando haces tu propia sintonización, necesitas reinventar el mundo entero. ¿Qué tan bueno es esto con Mono? ¿Tienes tu propio IDE?

- El compilador de C # Roslyn se escribió originalmente no solo como un compilador de C # en IL, sino también como un backend y analizador IDE, incluso puede digerir el código incorrecto. Simplemente puede mostrar algunas vistas y hacer algo en función de su salida, y él dirá directamente: "Muéstrame el menú allí", "refactorización de ofertas", "aquí tienes una vista previa de los cambios", etc. .. "resaltar, ofrecer refactorización al usuario ". Es decir, este compilador le permite directamente hacer su IDE rápidamente.

De hecho, solo implementa un conjunto de interfaces para su GUI, y ya tiene un IDE que admite un gran conjunto de refactorización y similares.

En general, muchos lenguajes modernos proporcionan AST, un árbol abstracto de expresiones de código. Por ejemplo, Clang hace posible obtener un árbol abstracto del código más, por cierto, usamos esta función para generar enlaces C # para código C ++ y Objective-C.

- ¿Has intentado usar Visual Studio Code para algo?

- Bueno, diría que esta es mi herramienta más básica.

- Digamos que el tipo quiere abrir el repositorio Mono y colgarlo. ¿Qué necesita él para esto?

- En Windows, simplemente abra la solución del tiempo de ejecución y la solución del btsl y compile ambos. Gracias a la paralelización eficiente, msbuild debería hacerlo en unos 5 minutos. En macOS y Linux, se utiliza el enfoque habitual a través de Makefiles.

Sobre la preparación de informes y algunos spoilers


- Vienes a DotNext con el informe, pero ¿de qué se trata?

- Mi informe consistirá en un conjunto de ejemplos interesantes de microoptimizaciones aplicadas en .NET Core por desarrolladores y colaboradores externos, que, creo, también pueden ser útiles para programadores aplicados. También prestaré atención a los ejemplos fallidos para optimizar algo, por ejemplo, cuando los contribuyentes quieren optimizar un caso en particular, pero resulta en forma de regresión en otros. Por separado, habrá una docena de diapositivas en la nueva API SIMD.

Los muchachos de Intel junto con los muchachos de Microsoft sacaron en C # una API de bajo nivel para SIMD, que le permite escribir algoritmos ultrarrápidos sin depender del compilador, que, como muchas personas piensan, podrá optimizar y vectorizar todo por sí mismo, no es así.

- En el caso general, esto es teóricamente imposible.

- Sí, ningún lugar para escapar de la inserción independiente de intrínsecos. Dudo que en cualquier idioma se pueda describir la multiplicación o transposición de matrices en tipos simples y esperar las instrucciones SSE / AVX más efectivas del compilador a la salida. Por cierto, ya apliqué estas intrínsecas C # dentro de .NET Core para optimizar System.Numerics.Matrix usando SSE y optimicé la función GetHexDigits usando Lzcnt. Puede usarlo como un ejemplo de uso de la API en sus proyectos.

- Cuando vienen personas que están desarrollando algo básico, también vienen personas interesadas en participar en esto. ¿Hay alguna forma de novato?
Cualquier colaborador por primera vez recibe mucha atención y ayuda, muchas tareas simples o errores que no requieren un conocimiento extenso y altas prioridades pueden marcarse con una etiqueta especial en GitHub: "en juego" o "buen primer número".

- Puede ir al repositorio, buscar problemas con estas etiquetas y elegir una persona que tenga un espíritu cercano. Por ejemplo, bastantes tareas consisten en cubrir algunos fragmentos de código con pruebas. Aumentar la cobertura con pruebas es la primera tarea perfecta. También una buena manera es comparar algo, compararlo con otros tiempos de ejecución e intentar descubrir por qué este o aquel código funciona más lentamente que en .NET 4.x, por ejemplo, string.GetHashCode. Sobre la evaluación comparativa, hay una gran cantidad de discursos y publicaciones de blog de Andrei Akinshin y Adam Sitnik sobre una herramienta muy conveniente: BenchmarkDotNet, que con un simple movimiento de la mano le mostrará la velocidad de ejecución del código con un atributo, compárelo con otros tiempos de ejecución, cuente sobre la memoria y muestre el código del ensamblador.

Es decir El conjunto mínimo de acciones es navegar a través de todas las solicitudes y tareas de extracción, suscribirse a personas como Matt Waren y Ben Adams en Twitter, ir a los canales corefx y coreclr en Twitter y leer la documentación de BenchmarkDotNet.

- si. Ahora he filtrado la etiqueta "en juego", hay alrededor de 600 problemas aquí, algunos sin comentarios y puedes tomarlos.

- Sí, eso es correcto. Más recientemente, realizaron un hackathon para el equipo .NET Core. Asignaron un par de docenas de problemas, y en un día tuvieron que ser reparados y obtener un premio por ello.

Eso es genial. Dijo muchas cosas interesantes, ahora quiero tratar de resolver un problema yo mismo. Es cierto, no sé C #, ese es el problema.

- C #, como quiero creer, un lenguaje bastante predecible a pesar de la cantidad de azúcar y tener experiencia en Java o C ++, creo que incluso puedes comenzar a optimizar algo bastante rápido en tiempo de ejecución, la experiencia en otros idiomas incluso te ayudará en cosas del otro lado.

- Estoy mirando el repositorio de .NET Core y se ve muy decente. Y la gente realmente se comunica en los comentarios, las discusiones se llevan a cabo directamente.

- Sí, bastante activo. Hay 100 y 200 comentarios. Y puede aprender de la biblioteca base de clases, hay muchas tareas interesantes que cualquiera puede tomar.

- Muchas gracias por las respuestas! Nos vemos en DotNext.

Esta vez, un minuto de publicidad será inusual, porque mientras estábamos preparando la entrevista, se agotaron las entradas para la conferencia. ¿Quiere ver los informes y no tuvo tiempo de comprar un boleto? La transmisión en vivo todavía está disponible en el sitio .

Si tiene preguntas o un deseo increíble de visitar DotNext 2018 Moscú en persona, escríbanos a tickets@dotnext.ru (tal vez alguien devolverá el boleto y podemos ayudarlo).

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


All Articles