Un fragmento es un término de programación que designa una pequeña región de código fuente reutilizable , código de máquina o texto. Por lo general, se trata de unidades operativas definidas formalmente para incorporarlas en módulos de programación más grandes . La gestión de fragmentos es una característica de algunos editores de texto , editores de código fuente de programas , IDE y software relacionado . Permite al usuario evitar la escritura repetitiva en el curso de operaciones de edición de rutina. [1]
En la práctica de la programación, "fragmento" se refiere estrictamente a una porción de código fuente que un programa editor incluye literalmente en un archivo, y es una forma de programación de copiar y pegar . [2] Esta inclusión concreta contrasta con los métodos de abstracción, como las funciones o las macros , que son abstracciones dentro del lenguaje. Por lo tanto, los fragmentos se utilizan principalmente cuando estas abstracciones no están disponibles o no se desean, como en los lenguajes que carecen de abstracción, o por claridad y ausencia de sobrecarga.
Los fragmentos de código son similares a tener un preprocesamiento estático incluido en el editor y no requieren el soporte de un compilador. Por otro lado, esto significa que los fragmentos de código no se pueden modificar invariablemente después del hecho y, por lo tanto, son vulnerables a todos los problemas de la programación de copiar y pegar. Por este motivo, los fragmentos de código se utilizan principalmente para secciones simples de código (con poca lógica) o para texto repetitivo, como avisos de derechos de autor, prototipos de funciones, estructuras de control comunes o importaciones de bibliotecas estándar.
La gestión de fragmentos es una característica del editor de texto popular entre los desarrolladores de software u otras personas que requieren de forma rutinaria contenido de un catálogo de texto ingresado repetidamente (como código fuente o código repetitivo ). A menudo, esta característica se justifica porque el contenido varía solo levemente (o no varía en absoluto) cada vez que se ingresa.
Los editores de texto que incluyen esta característica normalmente proporcionan un mecanismo para administrar el catálogo y los fragmentos de código separados de la misma manera que el editor de texto y el sistema operativo permiten la administración de archivos separados. Estas capacidades básicas de administración incluyen operaciones como ver, agregar, editar, eliminar, ordenar, filtrar, agrupar, renombrar y almacenar fragmentos de código en un repositorio , catálogo o base de datos . Algunos editores proporcionan una capacidad macro para los fragmentos de código que permite generar prototipos de funciones y estructuras de control de variables en función de una plantilla estándar.
Algunas aplicaciones de programación como Eclipse , NetBeans y Visual Studio de Microsoft (que utiliza fragmentos inspirados en TextMate ) y otros IDE incluyen partes de estructura integradas para facilitar la codificación.
Otras aplicaciones como Macromedia Dreamweaver también utilizan estos fragmentos de código para el desarrollo web .
Los compiladores Just-in-time ( JIT ) pueden "unir" secciones de código precompiladas como segmentos de código de objeto o código de máquina más largos . Esto reduce significativamente el tiempo de interpretación y, al mismo tiempo, acelera la ejecución.
Los fragmentos de código se pueden utilizar dentro de interfaces de línea de comandos como bash, zsh ( GNU Linux /similar a Unix) o powershell ( MS Windows ). Es posible que se admitan o no funciones como la finalización y la sustitución de marcadores de posición.
Considere el proceso de intercambiar los valores de dos variables, x e y. Suponiendo que se utiliza un tipo débil y sin preocuparse por la colisión de nombres, esto se representa mediante el código:
temperatura = xx = yy = temperatura
Cuando se inserta el fragmento, se le solicita al programador los valores de los dos parámetros. Suponiendo que sean de tipo foo
y bar
, que son los nombres reales de las variables que desean intercambiar, esto generará el código:
temperatura = foofoo = barrabarra = temperatura
Si el fragmento se modifica posteriormente, por ejemplo para usar __temp
en lugar de temp
, no cambiará el código que ya se ha insertado, pero se usará en inserciones posteriores del fragmento.
Un fragmento de esto podría representarse así:
temperatura = $1$1 = $2$2 = temperatura
Además de las capacidades básicas de administración descritas anteriormente, las funciones de administración de fragmentos se pueden clasificar según el alcance de interactividad entre los fragmentos y el editor de texto o la aplicación que los aloja.
Estos grupos de funciones de fragmentos incluyen:
El tipo de soporte de scripts varía, pero puede incluir características como ejecutar comandos de shell , proporcionar un cuadro de diálogo GUI u otros métodos de interacción del usuario con el sistema operativo; otras aplicaciones; u otros subcomponentes de la propia aplicación de alojamiento.
Los marcadores de posición son elementos dentro de un fragmento de código que el usuario u otro proceso externo deben proporcionar. Los valores de los marcadores de posición no se determinan hasta que se inserta el texto del fragmento de código durante una sesión de edición.
Los marcadores de posición pueden tener una sintaxis de marcado especial que permite al editor identificar los límites de los marcadores de posición en relación con el resto del texto en el búfer de edición actual.
Otras aplicaciones emplean interfaces gráficas de usuario y cuadros de diálogo modales que permiten al usuario ingresar uno o más valores que se proporcionarán para los marcadores de posición.
Los marcadores de posición suelen indicarse mediante algún carácter especial o secuencia de caracteres para distinguirlos del resto del texto del fragmento. Algunos sistemas permiten que los marcadores de posición de fragmentos se denominen identificadores . Los identificadores pueden resultar útiles para admitir funciones como la duplicación o la transformación de marcadores de posición.
El siguiente ejemplo utiliza los identificadores first_name
, last_name
, y item
:
Hola {% first_name %} {% last_name %} , Su envío de {% item %} ya está listo para ser recogido.¡Gracias {% first_name %} !
Ejemplo de un fragmento en sintaxis TexMate :
Hola ${ 1 : nombre } ${ 2 : apellido } , Su envío de ${ 3 : item } ya está listo para ser recogido . ¡Gracias ${ 4 : first_name } !
Esto permite al usuario indicar que el valor suministrado para un marcador de posición debe replicarse en varios lugares, en relación con todo el texto del fragmento programable. En el ejemplo anterior, el marcador de posición nombrado first_name
es un ejemplo de este uso.
Esto permite al usuario indicar que uno o más valores suministrados para un marcador de posición deben replicarse y transformarse en otros lugares dentro del texto del fragmento programable. Por ejemplo, el usuario puede suministrar un título de documento en una parte del fragmento y especificar que el título del documento debe repetirse en otros lugares, con la primera instancia en mayúsculas y todas las demás instancias en minúsculas.
En el caso de las aplicaciones que admiten fragmentos de código programables , la gama de funciones de programación admitidas varía. A continuación, se enumeran algunas de las funciones que se implementan habitualmente para los fragmentos de código programables.
Aunque el texto simple es una característica fundamental incluida incluso en aplicaciones que solo admiten fragmentos "estáticos" no programables, los fragmentos programables también se utilizan para trabajar con texto simple.
Sin embargo, una complicación habitual es que los entornos que admiten fragmentos programables a menudo tienen que hacer distinciones entre lo que se considera "texto sin formato" y lo que se considera "instrucciones de programación". Para complicar aún más esta distinción, las aplicaciones que admiten fragmentos programables casi siempre incluyen compatibilidad con el reconocimiento de varios lenguajes de programación, ya sea mediante el resaltado de sintaxis básica o la ejecución de comandos integrados.
Por estas y otras razones, emitir texto simple desde fragmentos programables casi siempre implica tener cuidado para evitar problemas con la sintaxis y colisiones de delimitadores .
Los fragmentos programables suelen incluir la capacidad de establecer un enlace a un ámbito de variable o espacio de nombres existente, desde el cual el usuario puede seleccionar cualquiera de varias constantes o variables. Estas pueden incluir valores como la dirección de correo electrónico del usuario que ha iniciado sesión en una máquina determinada, la fecha y hora actuales del sistema o el valor de salida de una función.
Los fragmentos de código que se pueden programar suelen estar asociados a uno o más archivos activos en ese momento. En consecuencia, las variables también pueden incluir variables de entorno y argumentos que especifican el nombre del archivo, la posición del cursor y el directorio principal, entre otras estadísticas relacionadas con los archivos en una sesión de edición actual.
Los fragmentos de código que se pueden programar pueden permitir la ejecución de código en uno o más lenguajes de programación . Esto puede incluir uno o más lenguajes independientes o un lenguaje específico de la aplicación en la que se aloja el lenguaje.
La alternativa más básica a los fragmentos de código son las subrutinas en bibliotecas. Las subrutinas se pueden incorporar a una biblioteca de software reutilizable y compartir entre varios proyectos de programación.
Los patrones de diseño en la programación orientada a objetos y la programación funcional son técnicas que permiten a los programadores evitar o reducir la práctica de insertar repetidamente fragmentos en diferentes fragmentos de código con ligeras variaciones cada vez. En los lenguajes de la familia C , a veces se utilizan preprocesadores para este propósito.
Sin embargo, la desventaja de este enfoque es que es más difícil recordar patrones o documentación.
A partir de 2021, surgieron algunas herramientas sofisticadas de aprendizaje profundo que pueden ayudar a inferir una funcionalidad específica a partir de un texto legible por humanos y generar fragmentos de código fuente correspondientes (por ejemplo, GitHub Copilot ). [3] [4]
Para cada instancia de C&P, también notamos la relación entre un fragmento de código copiado y el código en otra parte de la base de código.