Opciones de compilación

Estas opciones modifican la forma en la que DIV interpreta un programa y el código que genera para él. Normalmente no será necesario especificar ninguna opción.

Para añadir una o varias de estas opciones a un programa se debe especificar como la primera sentencia del mismo (comentarios al margen) la palabra COMPILER_OPTIONS seguida de los nombres de las opciones incluidas.

Si se incluyen varias opciones, deben aparecer separadas por comas, añadiendo siempre un punto y coma al final (tras la ultima opción).


Opciones de compilación disponibles:

_max_process=x

Donde x es un número entero positivo. Define el número de procesos simultáneos máximo permitidos en ejecución. Esto puede hacerse una vez completado un programa (cuando se sepa cuantos procesos puede llegar a tener a la vez), para ahorrar memoria en ejecución. En caso de no definirse este valor, se reservará un mínimo de 1 Mb (y un máximo de 2 Mb) para la memoria del programa.

_extended_conditions

Permite utilizar asignaciones dentro de una condición (como: IF(id2=get_id(...))...); esto estaba permitido por defecto en la primera versión. Esta opción puede ser necesaria para que muchos programas de la primera versión funcionen en la segunda.

_simple_conditions

Interpreta el símbolo = como una comparación, cuando aparece dentro de una condición. Este es un caso opuesto al anterior (e incompatible con él), al incluir esta opción se permitirá hacer comparaciones como IF(x=0)..., en lugar de interpretarlo como una asignación del valor 0 a la variable x.

_case_sensitive

Diferencia en todos los nombres entre mayúsculas y minúsculas. En caso de activarse esta opción Abc y abc serán dos nombres diferentes. Es importante saber que, en este caso, todas las palabras reservadas del lenguaje (program, loop, frame, if, ...) deberán ponerse en letras minúsculas.

_ignore_errors

Prohibe la aparición de mensajes de error durante la ejecución del programa. La mayoría de errores serán ignorados (como errores de memoria, si no se encuentra un fichero, divisiones por cero, etc.) , se desaconseja el uso de esta opción pero, en caso de querer incluirse, debe hacerse únicamente en los programas ya finalizados, suficientemente probados, y sin errores conocidos, antes de realizar una instalación (ver las consideraciones finales).

_free_sintax

Permite usar una sintaxis libre. Con esta opción no serán necesarios los símbolos ; (punto y coma) del final de las sentencias y se podrán obviar los paréntesis de las condiciones en las sentencias como IF, WHILE o UNTIL. Por ejemplo, en este modo se darán por válidas sentencias como: IF a<0 a=0 END (ver antes las consideraciones finales).

_no_strfix

No terminar automáticamente las cadenas de texto. Cuando se mete un carácter en un dato de tipo STRING se genera código para, cuando este se inserte más alla del final de la cadena, añadir espacios en blanco hasta el mismo y el carácter NUL (ascii 0) al final de la cadena. Esta opción deshabilita esta característica.

_no_optimization

No optimizar el código generado. Por defecto se optimizan los programas, tanto en velocidad como en tamaño. Esta opción puede incluirse para deshabilitar estas optimizaciones. Es decir, si se especifica esta opción, los programas irán más lentos y ocuparán más memoria.

_no_range_check

No comprobar accesos fuera de rango en tablas y estructuras. El compilador genera código para comprobar en tiempo de ejecución que las expresiones utilizadas como índices de una tabla o estructura están dentro de los límites permitidos, para emitir un error cuando se acceda fuera de rango. Esta opción prohibe que se genere dicho código.

_no_id_check

No comprobar la validez de un código identificador. El compilador también genera código para comprobar la validez de un identificador cuando se utiliza este para acceder a la variable local de otro proceso (como en id2.graph). Si se especifica esta opción al comienzo del programa, no se realizarán estas comprobaciones.

_no_null_check

No comprobar los accesos a punteros nulos (NULL POINTER). Deshabilitar las comprobaciones de accesos a memoria con punteros nulos o no definidos. Incluyendo esta opción no se generará código para proteger estos accesos de lectura o escritura a memoria.

_no_check

No realizar ninguna de las comprobaciones de seguridad. Esta opción engloba a las tres anteriores, y prohibe al compilador generar código para comprobar cualquier tipo de operación anómala en tiempo de ejecución. Los programas pueden ganar velocidad, pero no se recomienda utilizar estas opciones a no ser que se trate de programas ya finalizados y sin errores.


Para utilizar estas opciones, por ejemplo, se podría comenzar un programa con la siguiente sentencia:

COMPILER_OPTIONS _max_process=64,_no_id_check;

En este caso se indicaría al compilador que reservara memoria para que, en la ejecución del programa pudieran haber 64 procesos simultáneamente, y no se comprobaría la validez de los identificadores en los accesos a variables locales de otros procesos (lo que puede ser útil en programas que utilicen mucho estos accesos, siempre que el programador tenga la suficiente experiencia como para estar seguro de lo que hace).


Importante: Consideraciones sobre algunas opciones.

1. Los usuarios nuevos en DIV o no muy experimentados en la programación pueden simplificar un poco las condiciones con la opción _simple_conditions, de forma se puedan comparar dos valores con el símbolo = (además de con el símbolo ==). En cambio, los usuarios que ya hubieran programado con la primera versión y con más experiencia, probablemente preferirán activar la opción _extended_conditions de forma que se puedan crear condiciones complejas, con asignaciones dentro de las mismas.

2. Las opciones _ignore_error y todas las variantes de _no_check deben utilizarse únicamente por programadores con mucha experiencia, y solo en la versión final del programa. Si no se recomienda su uso, es porque pueden producirse errores graves de ejecución, siendo además muy difícil averiguar cual ha sido la causa determinante.

3. Los programas ya están optimizados en general (el código generado es un 60% más rápido que en la primera versión), y no se conseguirán grandes variaciones en la velocidad de ejecución con ninguna de estas opciones. Se pueden utilizar los perfiles de tiempo del trazador para ver la repercusión de cada una.

4. La opción _ignore_errors suele ser poco conveniente, siempre será mejor utilizar la función ignore_error() para ignorar, en todo caso, algunos errores determinados de forma selectiva.

5. El uso de una sintaxis libre (con _free_sintax) también tiene sus peligros. Ya que que los saltos de línea y espacios en blanco carecen de significado, y pueden producirse interpretaciones indebidas en algunos casos. Por ejemplo, en la sentencia: IF derecha ++x END, el compilador interpretará que el símbolo ++ es el postincremento de derecha, en lugar del preincremento de x (aunque el símbolo este unido a esta última variable). Otro caso similar podría pasar al utilizar punteros al estilo C, con estas dos asignaciones consecutivas: a=1 *ptr=2, el compilador las interpretaría como: a=(1*ptr)=2 (aunque estuvieran en lineas diferentes). Aunque en general, si no se utilizan preincrementos o punteros al estilo C, no habrán problemas con la sintaxis libre (y también se pueden utilizar paréntensis o puntos y coma en puntos concretos, para solucionar estos pequeños problemas).

6. En cambio la opción _max_process (que es la única que debe aparecer seguida de un símbolo = y un número) se recomienda sin ningún tipo de reservas. Si se conoce el número de procesos que pueden llegar a haber a la vez en un programa, se podrá reservar menos memoria para ellos (quedando esta libre para gráficos, sonidos, etc.).