En programación informática , una directiva o pragma (del latín "pragmático") es una construcción del lenguaje que especifica cómo un compilador (u otro traductor ) debe procesar la entrada. Dependiendo del lenguaje de programación , las directivas pueden formar parte o no de la gramática del lenguaje y pueden variar de un compilador a otro. Pueden ser procesadas por un preprocesador para especificar el comportamiento del compilador o funcionar como una forma de parametrización en banda.
En algunos casos, las directivas especifican un comportamiento global, mientras que en otros solo afectan a una sección local, como un bloque de código. En ciertos casos, como en algunos programas en C, las directivas son sugerencias opcionales del compilador y pueden ignorarse, pero normalmente son prescriptivas y deben seguirse. Sin embargo, una directiva no realiza ninguna acción en el lenguaje en sí, sino que solo modifica el comportamiento del compilador.
Este término podría usarse para referirse a etiquetas y comandos (o marcado) propietarios de terceros integrados en el código que dan como resultado un procesamiento ejecutable adicional que extiende las construcciones existentes del compilador, ensamblador y lenguaje presentes en el entorno de desarrollo. El término "directiva" también se aplica de diversas maneras similares al término " comando" .
El preprocesador de C
En C y C++ , el lenguaje admite un preprocesador de macros simple . Las líneas de código fuente que deben ser manejadas por el preprocesador, como y , se denominan directivas de preprocesador .#define#include
Las construcciones sintácticas similares a las directivas del preprocesador de C, como las de C##if , también se denominan típicamente "directivas", aunque en estos casos puede que no haya ninguna fase de preprocesamiento real involucrada.
Todos los comandos del preprocesador, excepto defined(cuando siguen a una directiva condicional), comienzan con un símbolo de almohadilla (#). Hasta C++26 , las palabras clave export, importy moduleeran manejadas parcialmente por el preprocesador. [ 1 ]
Historia
Las directivas datan de JOVIAL . [ 2 ]
COBOL tiene una directiva COPY.
En ALGOL 68 , las directivas se conocen como pragmats (de "pragmático") y se denotan como pragmat o pr ; en lenguajes más nuevos, especialmente C, esto se ha abreviado a "pragma" (sin 't').
Un uso común de las directivas pragmat en ALGOL 68 es especificar un régimen de stropping , es decir, "cómo se indican las palabras clave". A continuación, se incluyen varias directivas que especifican los regímenes POINT, UPPER, RES (reservado) o quote. Nótese el uso de stropping para la propia palabra clave pragmat (abreviada pr ), ya sea en el régimen POINT o quote:
. PUNTO PR .PR . PR SUPERIOR .PR . PR RES .PR 'pr' cita 'pr' Actualmente, las directivas son más conocidas en el lenguaje C, de principios de la década de 1970, y se siguen utilizando en el estándar C99 actual , donde son instrucciones para el preprocesador de C o, en forma de #pragmadirectivas, para el propio compilador. También se utilizan en cierta medida en lenguajes más modernos; véase más abajo.
Otros idiomas
- En Ada , las directivas del compilador se denominan pragmas (abreviatura de "información pragmática").
- En Common Lisp , las directivas se llaman declaraciones y se especifican usando la
declareconstrucción (tambiénproclaimodeclaim). [ 3 ] Con una excepción, las declaraciones son opcionales y no afectan la semántica del programa. La única excepción esspecial, que debe especificarse cuando corresponda. - En Turbo Pascal , las directivas se llaman comentarios significativos , porque en la gramática del lenguaje siguen la misma sintaxis que los comentarios . En Turbo Pascal, un comentario significativo es un comentario cuyo primer carácter es un signo de dólar y cuyo segundo carácter es una letra; por ejemplo, el equivalente de
#include "file"la directiva de C es el comentario significativo{$I "file"}. - En Perl , la palabra clave "
use", que importa módulos, también se puede utilizar para especificar directivas, comouse strict;ouse utf8;. - Las pragmas de Haskell se especifican utilizando una sintaxis de comentarios especializada, por ejemplo , [ 4 ]
{-# INLINE foo #-}. También es posible utilizar el preprocesador de C en Haskell, escribiendo .{-# LANGUAGE CPP #-} - PHP utiliza la directiva
declare(strict_types=1). - En PL/I , las directivas comienzan con un signo de porcentaje (
%) y terminan con un punto y coma (;), por ejemplo, , , , , , lo mismo que con las instrucciones del preprocesador.%INCLUDE foo;%NOPRINT;%PAGE;%POP;%SKIP; - Python tiene dos directivas: una
from __future__ import feature(definida en PEP 236 -- Back to the __future__ ), que modifica las características del lenguaje (y utiliza la sintaxis de importación de módulos existente, como en Perl), ycodingotra (en un comentario) para especificar la codificación de un archivo de código fuente (definida en PEP 263 -- Defining Python Source Code Encodings ). En PEP 244 -- The `directive' statement se propuso y rechazó una declaración de directiva más general ; todas datan de 2001. - ECMAScript también adopta la
usesintaxis para directivas, con la diferencia de que las pragmas se declaran como literales de cadena (por ejemplo"use strict";, o"use asm";), en lugar de una llamada a función. - En Visual Basic , la palabra clave "
Option" se utiliza para directivas:Option Explicit On|Off- Cuando está activado, no permite la declaración implícita de variables en el primer uso, requiriendo una declaración explícita previa.Option Compare Binary- Da como resultado comparaciones de cadenas basadas en un orden de clasificación derivado de las representaciones binarias internas de los caracteres, por ejemplo, para la página de códigos inglés/europeo (ANSI 1252): A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø. Afecta a los operadores intrínsecos (por ejemplo, =, <>, <, >), al bloque Select Case y a las funciones de cadena de la biblioteca de tiempo de ejecución de VB (por ejemplo, InStr).Option Compare Text- Da como resultado comparaciones de cadenas basadas en un orden de clasificación de texto que no distingue entre mayúsculas y minúsculas, determinado por la configuración regional del sistema; por ejemplo, para la página de códigos inglés/europeo (ANSI 1252): (A=a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø). Afecta a los operadores intrínsecos (por ejemplo, =, <>, <, >), al bloque Select Case y a las funciones de cadena de la biblioteca de tiempo de ejecución de VB (por ejemplo, InStr).Option Strict On|Off- Cuando está activado, no permite:- Programación sin tipos: donde las declaraciones que carecen de un tipo explícito se tipifican implícitamente como Object.
- Enlace tardío (es decir, despacho dinámico a objetos CLR, DLR y COM) en valores tipados estáticamente como Object.
- Conversiones de estrechamiento implícitas: requieren que todas las conversiones a tipos más estrechos (por ejemplo, de Long a Integer, de Object a String, de Control a TextBox) sean explícitas en el código usando operadores de conversión (por ejemplo, CInt, DirectCast, CType).
Option Infer On|Off- Cuando está activada, permite que el compilador infiera el tipo de variables locales a partir de sus inicializadores.
- En Ruby , las directivas del intérprete se denominan pragmas y se especifican mediante comentarios al principio del archivo que siguen a una
key: valuenotación. Por ejemplo,coding: UTF-8indica que el archivo está codificado mediante la codificación de caracteres UTF-8 . - En C# , las directivas del compilador se denominan directivas de preprocesamiento. Técnicamente, C# no las gestiona mediante un preprocesador, sino directamente en el código. Existen varias directivas de compilador diferentes, que en su mayoría se alinean con las de C y C++, incluyendo
#pragma, que se utiliza específicamente para controlar las advertencias del compilador y las sumas de comprobación del depurador. [ 5 ] [ 6 ] C# también incluye algunas directivas que no se utilizan en C o C++, como#nullabley#region. C# tampoco permite macros de tipo función, pero sí permite macros regulares, para fines como la compilación condicional. - El sistema de gestión de bases de datos SQLite incluye una directiva PRAGMA que se utiliza para introducir comandos que no son compatibles con otros sistemas de gestión de bases de datos. [ 7 ]
- En Solidity , las directivas del compilador se llaman pragmas y se especifican usando la palabra clave `pragma`. [ 8 ]
lenguaje ensamblador
- En lenguaje ensamblador , las directivas, también conocidas como pseudooperaciones, generalmente especifican información como la máquina de destino, marcan separaciones entre secciones de código, definen y modifican variables de tiempo de ensamblaje, definen macros, designan código condicional y repetido, definen áreas de memoria reservadas, etc. Algunos ensambladores, pero no todos, utilizan una sintaxis específica para diferenciar las pseudooperaciones de los mnemónicos de instrucciones, como anteponer un punto a la pseudooperación, por ejemplo, la pseudooperación
.END, que puede indicar al ensamblador que detenga el ensamblaje del código.
PL/SQL
- El lenguaje procedimental PL/SQL de Oracle Corporation incluye un conjunto de directivas del compilador, conocidas como "pragmas". [ 9 ]
Véase también
- #pragma once – Directiva de C/C++ para bloquear la inclusión repetida de archivos de cabecera
Notas a pie de página
- ↑ "P1857R1 - Detección de dependencias de módulos" .
- ↑ «Capítulo 17 - Directivas» (PDF) . Manual de programación informática para el lenguaje JOVIAL (J73) (PDF) (Informe técnico). Junio de 1981. págs. 243–263 . RADC-TR-81-143 . Consultado el 28 de mayo de 2023 .
- ↑ Steele 1990 , Capítulo 9: Declaraciones , págs. 215–237.
- ↑ "7.20. Pragmas" . Documentación de GHC 7.8.3 . Consultado el 18 de julio de 2014 .
- ↑ dotnet-bot. "Estructura léxica - Especificación del lenguaje C#" . docs.microsoft.com . Consultado el 1 de noviembre de 2019 .
- ↑ BillWagner. "#pragma - Referencia de C#" . docs.microsoft.com . Consultado el 1 de noviembre de 2019 .
- ↑ "Sentencias pragma compatibles con SQLite" . www.sqlite.org .
- ↑ "Diseño de un archivo fuente de Solidity — Documentación de Solidity 0.8.27" . docs.soliditylang.org . Consultado el 3 de junio de 2024 .
- ↑ Feuerstein, Steven ; Pribyl, Bill (23 de enero de 2014). Oracle PL/SQL Programming (6.ª ed.). O'Reilly Media, Inc. (publicado en 2014). ISBN 9781449324414. Consultado el 16/06/2016 .
PL/SQL tiene una palabra clave PRAGMA con la siguiente sintaxis: PRAGMA instrucción_al_compilador ; [...] PL/SQL ofrece varias pragmas [...]
Referencias
- Steele, Guy L. (1990). Common Lisp: El lenguaje . Digital Press. pp. 215–237 . ISBN 1-55558-041-6.
Enlaces externos
- Sitio web de OpenMP
- Sitio web de OpenACC
- Sitio web de OpenHMPP
- Programación informática