Informe de viaje:CPPP 2021

Informe de viaje:CPPP 2021

Diciembre comenzó con otra fascinante conferencia de C++ que probablemente fue la última del año:CPPP 2021. La tercera P en el nombre representa el toque francés en esta conferencia, significa Paris . Lamentablemente, este año, fue completamente en línea debido a razones bien conocidas, por lo que si una conferencia era estadounidense, italiana, inglesa, alemana o francesa (a las que asistí) no hizo mucha diferencia en términos de catering;)

Sin embargo, esto no elimina nada de los valores de las conferencias, y vi cada vez más esfuerzos para tratar de recuperar los chats de conferencias, la creación de redes entre charlas, más sobre eso más adelante.

Si buscamos otro significado para las 3 P s en CPPP , son las 3 pistas de la conferencia:

  • El progreso pista dedicada a aprender y reforzar el conocimiento y la comprensión básicos de C ++, que a veces fue bastante profundo.
  • Los productos track dedicado a compartir soluciones para producir y mantener software confiable usando C++.
  • El empuje hacia adelante pista dedicada a compartir nuevos patrones y funcionalidades de C++.

Sobre mi rendimiento

El ser humano es una bestia egoísta y yo soy bastante humano. Permítanme compartir algunos pensamientos sobre mi participación en CPPP.

El primer CPPP en 2019 fue mi primera conferencia de C++ a la que asistí. Fui allí y vi algunas presentaciones muy atractivas. Estaba soñando con participar una vez como orador.

¡Dos años después, se hizo realidad! Incluso pude compartir lo que sé en 2 charlas y además me inscribí en una charla relámpago.

Entonces, ¿cómo te fue?

Mi presentación sobre Los conceptos de los conceptos fue muy bien. No era la primera vez que presentaba algo similar, aunque la presentación sigue evolucionando en función de mi experiencia y mis conocimientos.

Probablemente por primera vez, estaba realmente satisfecho al final cuando apagué la transmisión. Compartí todo lo que quería y no sentí que a veces las palabras no llegaban.

No puedo sentir lo mismo con respecto a las pruebas parametrizadas con Gtest. Me enfrentaba a dos problemas. El primero fue mi estado de ánimo. Recibí noticias preocupantes sobre un familiar que fue hospitalizado. Mi hijo tampoco durmió muy bien, así que obviamente nosotros tampoco.

El otro problema fue la forma en que me preparé para esta presentación. No puedo decir que fui flojo, claramente no lo fui. Actualicé el artículo sobre este tema, reescribí el repositorio que contiene los ejemplos y dediqué mucho tiempo a pulir las diapositivas.

Estoy bastante cómodo con este tema, se lo he explicado a mis colegas varias veces. No sentí la necesidad de hacer sesiones de práctica.

Pero las sesiones de práctica no son para aprender sobre el tema. Se trata de memorizar las diapositivas, cómo construiste una idea sobre la otra. Así que debería haber hecho sesiones de práctica para que la presentación fuera más fluida. Y agregué algunas diapositivas adicionales 2 días antes de la presentación donde cometí un error en el orden...

En cualquier caso, espero que a los asistentes les haya resultado útil y yo haya aprendido algo una vez más.

Las 3 charlas que mas me gustaron

Ahora déjame mencionarte 3 charlas que me gustaron especialmente.

Superpotencia de C++ por Matt Godbolt

CPPP 2021 abrió de una manera muy fuerte, todo comenzó con el discurso de apertura de Matt “sometimes verb” Rayo de Dios. Su charla tuvo 2 partes principales. En el primero, iteró sobre lo que podría considerarse el superpoder de C++, lo que es en su opinión y luego lo mostró.

Así que lo primero es lo primero. ¿Cuál es el superpoder de C++?

Puede pensar en la ubicuidad, lo que significa que C++ está en todas partes. En móviles, coches, en lo que sea crítico, ahora incluso en la web con la difusión de wasm.

Podrías pensar que el superpoder es el rendimiento y, dadas algunas charlas posteriores sobre el efecto de C++ en las emisiones de CO2, creo que esto podría ser un verdadero superpoder, pero no es lo que Matt quiso decir en este momento.

El enfoque multiparadigma hace que C++ sea muy versátil y podemos escribir código de muchas maneras diferentes, pero aún así, no es lo que Matt tenía en mente.

Ni siquiera una vida útil clara del objeto, pero eso también es genial.

No, para él es el soporte heredado. Tomas una base de código muy antigua y lo más probable es que aún funcione con compiladores modernos con algunas cosas para arreglar tal vez.

Entonces, en la segunda parte, explicó cómo tomó una base de código de sus años de estudiante y la actualizó paso a paso para seguir las prácticas modernas de C++ y usar las funciones disponibles en C++17.

Creo que todas las técnicas y enfoques que detalló serán útiles para todos los que trabajen en código heredado.

El precio por rendimiento de las funciones virtuales por Ivica Bogosavljevic

Ivica dio una charla muy práctica sobre algo sobre lo que escuchamos tantos mitos. Los costos de las funciones virtuales, ¡algo que muchos tememos!

De ninguna manera estoy en condiciones de reiterar todo lo que dijo sobre el almacenamiento en caché de destino de salto o el desalojo de caché de instrucciones.

Preferiría solo mencionar un par de puntos importantes y dejar que vean el video.

Ivica compartió que, a menudo, el rendimiento de las funciones virtuales no se prueba de manera relevante, no cómo se usan en la vida real. Según sus mediciones, las grandes funciones virtuales no tienen gastos generales relevantes en comparación con sus versiones no virtuales. Las funciones cortas tienen una penalización de alrededor del 20% y se debe principalmente a que las funciones virtuales no se pueden alinear, no se pueden optimizar de esa manera. De todos modos, las funciones largas no estarían en línea, por lo que no hay problema.

Por otro lado, los vectores de punteros funcionan mucho peor que los vectores de objetos debido a todas las asignaciones de montón que conducen a errores de caché durante la iteración.

Eso en realidad puede hacer que su procesamiento sea incluso 7 veces más lento, lo cual es bastante significativo. Propuso diferentes soluciones para evitar este problema, en particular usando una variante combinada con un visitante o teniendo diferentes vectores para los diferentes tipos (¡sin punteros!) y haciendo lo que se llama procesamiento basado en tipos.

En cualquier caso, uno de sus mensajes clave fue que si tienes que optimizar el código en términos de rendimiento, siempre piensa en el código caliente, el código que se ejecuta con frecuencia, de lo contrario, no obtendrás resultados relevantes.

¡Las discusiones!

Estaba dudando si detallar Cómo aprendí a dejar de preocuparme y amar a MISRA de Loïc Joly o las discusiones que tuvimos. Como puede ver, seguí la discusión, pero le recomiendo que vea la charla sobre MISRA, una vez que esté disponible.

Al principio no quedó claro en la agenda qué significaba el color rosa oscuro.

Entonces alguien preguntó en el chat de Discord y quedó claro. Eran intervalos de tiempo para discusiones sobre temas específicos.

Creo que en Covid, las conferencias están luchando por brindar una experiencia que justifique comprar los boletos y no simplemente esperar un par de semanas y ver las charlas en Youtube. Charlas que suelen ser las mismas entre las distintas conferencias.

Una forma, quizás la única, de lograr esto es a través de las discusiones. Lo que más me gustó de la solución de CPPP es que los temas se establecieron de antemano.

Probablemente porque soy introvertido, apenas me uno a "salones", "salas de discusión" sin temas. Pero cuando vea que hay una sala dedicada al código heredado y tengo preguntas que quiero hacer a otros, definitivamente me uniré.

Si bien no siempre me unía a las salas durante la hora del almuerzo, siempre me unía a los demás y participaba activamente en las discusiones. Esa fue una experiencia de conferencia completamente nueva para mí, por lo que llegó a esta lista.

Tres ideas pegadizas

Ahora permítanme resaltar 3 ideas de varias presentaciones.

Use C++ para un planeta más verde

A veces una imagen vale más que 1000 palabras.

¡C++ es mucho más eficaz que la mayoría de los otros lenguajes! El software escrito en C++ consume mucho menos que el software escrito en PHP, Python, TS o Ruby.

No solo C++, C y Rust funcionarían de manera similar. Ese no es el punto.

El punto es que escribir software en estos lenguajes de alto nivel por "pereza intelectual" (gracias Marek! ) está dañando el planeta.

Encuentro este tema realmente interesante y no quiero que ocupe todo el informe del viaje, lo explicaré más adelante.

Iteraciones push-vs pull-based

Barry Revzin pronunció un discurso de apertura muy interesante sobre iteradores y rangos. Comparó el diseño detrás de estos conceptos en diferentes idiomas. Se centró principalmente en C++, D y Rust, pero también cubrió un poco Python y Java.

Me gustaría resaltar un tema, un concepto que era completamente nuevo para mí. La notación y las diferencias entre las iteraciones basadas en push y pull.

No quiero entrar en detalles, así que en resumen:

Cuando tiene un iterador que le envía elementos y tiene que implementar una función que le pasa a este iterador, hablamos de iteración basada en envío. La función básicamente consume estos valores y no salen.

Por otro lado, cuando tiene que extraer elementos de este iterador que están expuestos, hablamos de iteración basada en extracción.

Las cosas no son en blanco y negro, ya que el ejemplo de Barry muestra que una iteración basada en push a menudo se implementa con una iteración basada en pull. Permítanme tomar prestado y compartir su ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <intput_iterator I, sentinel_for<I> S>
class cpp_stream {
  I first;
  S last;
public:
  using reference = iter_reference_t<I>;

  template<invocable<referece> F>
  void for_each(F f) {
    for(; first != last; ++first) { // pull based iteration
      invoke(f, *first); // item pulled from the iterator
    }
  }
};


template<Stream S>
void print_all(S stream) {
  stream.for_each([](auto&&){  // push based iteration, elements are kept inside
    fmt::print("{}\n", elem); 
  });
}

YCombinator para lambdas recursivas

Las lambdas no son recursivas. No pueden llamarse a sí mismos. Tiene sentido después de todo. Una lambda es una función anónima y no tiene nombre. Puede guardarlo como una variable, pero aún no es algo que se conozca a sí mismo.

Y aunque probablemente no encuentre ninguna buena razón para tener una lambda llamándose a sí misma, aún es posible lograrlo.

En On the Aesthetics of Code, Sy Brand compartió una historia sobre cómo pensaron en mostrarle al entrevistador su inteligencia, pero como pueden imaginar, no fue así como se percibió. En cualquier caso, tomo prestado su código para compartir con ustedes cómo convertir una lambda en recursiva:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <functional>

template<class Fun>
class y_combinator_result {
  Fun fun_;
public:
  template<class T>
  explicit y_combinator_result(T&& fun):
    fun_(std::forward<T>(fun)) {}

  template<class ...Args>
  decltype(auto) operator()(Args &&...args) {
    return fun_(std::ref(*this),
                std::forward<Args>(args)...);
  }
};

template<class Fun>
decltype(auto) y_combinator(Fun &&fun) {
  return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}

¿Y cómo usarlo?

He aquí un ejemplo sencillo:

1
2
3
4
auto gcd = y_combinator([](auto gcd, int a, int b) -> int {
  return b == 0 ? a : gcd(b, a % b);
});
std::cout << gcd(20, 30) << std::endl;

Entrar en detalles sobre cómo y por qué funciona el combinador Y va más allá del alcance de un informe de viaje. Si quieres saber más al respecto (también encontrarás más referencias) haz clic aquí.

¿espacios para mejorar?

Mencioné en mi informe de viaje anterior sobre Meeting C++ que no creo que los informes que mencionan las partes que no brillan del todo sean realistas. Sé que podría lastimar a las personas, aunque claramente ese no es mi punto y no creo que comparta estas ideas de una manera hiriente.

En este caso, mencionaría dos cosas. Uno es específico de CPPP, el otro es un problema más común que veo.

Creo que la página de programación podría mejorarse. Al menos algunas notas a pie de página sobre los códigos de color facilitarían la comprensión de lo que significan amarillo y rosa sin tener que pensar en ello. Creo que no sería un gran trabajo.

Idealmente, no solo tendría un botón para ver todo el calendario en el calendario de Google, sino que tendría un botón para agregar una charla específica a su calendario de elección (no solo Google Calendar) y, si es factible, con un enlace. a la transmisión en vivo en él.

La otra cosa no es específica de CPPP. Fui a 5 conferencias de C++ este año y siento cada vez más lo difícil que es el trabajo de los organizadores con la pandemia.

Antes, era más fácil vender su conferencia diciendo que bueno, apuntamos principalmente a desarrolladores franceses, italianos, alemanes, ingleses, etc. por la razón obvia de la localidad física.

Esto es casi imposible ahora. Lo único que hace que algo sea local es la zona horaria. El número de personas dispuestas a presentar parece muy limitado y, seamos sinceros, las charlas suelen ser muy similares. Veo personas compartiendo la misma charla (incluyéndome a mí) 3 o 4 veces. Y aunque no hay dos charlas iguales (las charlas evolucionan y los presentadores ganan más y más experiencia), creo que es difícil vender entradas así.

No veo solución para esto, porque

  • el número de personas dispuestas a hacer una presentación no crece solo con desearlo
  • los presentadores suelen preparar las charlas en su tiempo libre, no tienen tiempo para crear 2-3 o más charlas nuevas cada año.

Con suerte, Covid terminará pronto y los organizadores estarán en una mejor posición para dirigirse a su audiencia local.

Conclusión

Con ir y presentar en CPPP un sueño se hizo realidad, terminé un viaje que comencé en 2019. Pude devolver algo, pude contribuir y me probé a mí mismo que puedo entender algo de una manera más profunda para poder presentar a mis compañeros. Sé que esto es solo el comienzo.

Como asistente, ¡realmente disfruté de CPPP! En ese momento aprendí a disfrutar de las conferencias en línea. Fue suave y de alta calidad en todos los sentidos, estaría feliz de volver el próximo año. Ojalá a París.

Hasta entonces, te animo a ver los videos. Actualizaré el artículo con los enlaces, una vez que estén disponibles.

¡Muchas gracias, Fred, Joël y todos los organizadores por hacer posible esta conferencia!

Conectar más profundamente

Si te ha gustado este artículo, por favor

  • pulsa el botón Me gusta,
  • suscríbete a mi boletín
  • ¡y conectémonos en Twitter!