# Pin (programa computacional)

Pin es una plataforma para crear herramientas de análisis. Una herramienta de pin incluye rutinas de instrumentación, análisis y devolución de llamada. Las rutinas de instrumentación se llaman cuando se va a ejecutar código que aún no se ha recompilado y permiten la inserción de rutinas de análisis. Las rutinas de análisis se llaman cuando se ejecuta el código asociado a ellas. Las rutinas de devolución de llamada solo se llaman cuando se cumplen condiciones específicas o cuando se ha producido un determinado evento. Pin proporciona una amplia interfaz de programación de aplicaciones (API) para instrumentación en diferentes niveles de abstracción, desde una instrucción hasta un módulo binario completo. También admite devoluciones de llamadas para muchos eventos, como cargas de biblioteca, llamadas al sistema, señales/excepciones y eventos de creación de subprocesos.
En 2020 recibió el premio Programming Languages Software Award de ACM SIGPLAN.
Pin realiza la instrumentación tomando el control del programa justo después de que se carga en la memoria. Luego , recompila justo a tiempo (JIT) pequeñas secciones del código binario usando pin justo antes de ejecutarlo. Se agregan nuevas instrucciones para realizar análisis al código recompilado. Estas nuevas instrucciones provienen de Pintool. Se utiliza una amplia gama de técnicas de optimización para obtener el menor tiempo de ejecución y sobrecarga de uso de memoria posibles. A partir de junio de 2010, los costos operativos promedio de Pin son del 30 por ciento (sin utilizar una herramienta Pintool).

## Perspectiva general

Pin realiza instrumentación tomando el control del programa justo después de ser cargado en la memoria. Este entonces realiza recompilación Just-In-Time (JIT) en pequeñas secciones de código binario antes de que se ejecute. Nuevas instrucciones, las cuales realizan el análisis, son añadidas al código recompilado. Esas nuevas instrucciones provienen de Pintool. Un largo arreglo de técnicas de optimización son para obtener el más bajo posible consumo de tiempo y memoria en uso. Para junio del 2010, El consumo promedio de Pin es 30% (sin correr una pintool).
Pin es una plataforma para crear herramientas de análisis. Una herramienta pin incluye instrumentación, análisis y retrollamado routines. Rutinas de instrumentación son llamadas cuando el código que no ha sido recompilado esta por ser ejecutado, y habilita la inserción de rutinas de análisis. Rutinas de análisis son llamadas cuando el código al que están asociadas se está ejecutando. Rutinas de Retrollamado son llamadas cuando condiciones específicas son encontradas, o cuando cierto evento a ocurrido. Pin provee una extensa API para instrumentación en muchos niveles de abstracción, desde una instrucción a un completo módulo binario. Además soporta retrollamado para muchos eventos como carga de librerías, llamadas al sistema, eventos como señales/excepciones y creación de hilos.

## Características
### Modos de Instrumentación

Pin admite dos modos de instrumentación llamados modo JIT y modo sonda. El modo JIT admite todas las funciones de Pin, mientras que el modo Probe admite un conjunto limitado de funciones pero es mucho más rápido y prácticamente no agrega sobrecarga al tiempo de ejecución del programa. El modo JIT utiliza un compilador just-in-time para recompilar todo el código del programa e insertar la instrumentación, mientras que el modo Probe utiliza trampolines de código para la instrumentación.

### Independencia de plataformas

Pin fue diseñado para la portabilidad de herramientas, y a pesar de la compilación JIT de una ISA a la misma ISA (y no utiliza una única representación intermedia para todo el código), la mayoría de sus API son independientes de la arquitectura y del sistema operativo . También fue diseñado para ser portable, aislando cuidadosamente el código específico de la plataforma del código genérico, lo que permite la rápida adaptación de Pin a nuevas plataformas. Aproximadamente la mitad del código es genérico y el resto depende de la arquitectura o del sistema operativo.

### Optimizaciones

Pin utiliza muchas técnicas para optimizar el código de instrumentación y análisis, utilizando técnicas como inlining, análisis de vitalidad y desbordamiento de registros inteligentes. Pin realiza estas optimizaciones automáticamente siempre que sea posible, sin necesidad de que los usuarios inserten ningún código adicional para permitir la inserción en línea. Naturalmente, algunas optimizaciones aún requieren sugerencias del usuario y algunas estructuras de código son más fáciles de incorporar que otras. También se utilizan la vinculación directa de secciones de código jit, una técnica llamada vinculación de seguimiento, y la reconciliación de enlaces de registros, que minimiza el desbordamiento y la reasignación de registros.

### Facilidad de uso

La API y la implementación de Pin se centran en hacer que las herramientas de pin sean fáciles de escribir. Pin asume la total responsabilidad de garantizar que el código de instrumentación de la herramienta PIN no afecte el estado de la aplicación. Además, la API permite que el código de instrumentación solicite muchos datos de Pin. Por ejemplo, el código de instrumentación en la herramienta Pin puede usar la API Pin para obtener la dirección de memoria a la que accede una instrucción, sin tener que examinar la instrucción en detalle.

## Herramientas

Hay muchas herramientas Pintools que se utilizan para distintas tareas.
* Los componentes de Intel Parallel Studio hacen un uso intensivo de pintools para la depuración de memoria, el análisis de rendimiento, el análisis de corrección de subprocesos múltiples y la preparación de la paralelización.
* Intel Software Development Emulator es una herramienta que permite el desarrollo de aplicaciones utilizando extensiones de conjuntos de instrucciones que actualmente no están implementadas en el hardware.
* CMP$IM es un generador de perfiles de caché creado utilizando pin.
* PinPlay permite la captura y reproducción determinista de la ejecución de programas multiproceso bajo PIN. Capturar la ejecución de un programa ayuda a los desarrolladores a superar el no determinismo inherente al subprocesamiento múltiple.
* Pin en sí viene con muchas herramientas de ejemplo que hacen uso de sus capacidades. Estas herramientas están licenciadas bajo una licencia similar a BSD.