Guía de portabilidad¶
Archivo de configuración¶
El archivo de encabezado de configuración del intérprete de Berry es berry_conf.h. Este archivo incluye un lote de macros para la configuración y define algunos contenidos relacionados con la plataforma.
berry_conf.h Archivo¶
Interruptor de macro de configuración¶
Las macros de configuración presentadas en esta sección generalmente se
usan para compilar conmutadores de algunos códigos fuente. Para
facilitar la descripción, llamamos a esta macro “cambio de macro”. Para
el interruptor de macro, “on” se refiere a establecer el interruptor de
macro en un valor distinto de cero, y “off” se refiere a establecer el
valor del interruptor de macro en 0
.
Algunos interruptores macro tienen varios estados, no solo “encendido” o “apagado”. Estos interruptores macro se usan generalmente para configuraciones con múltiples opciones. También hay algunas macros de configuración que no son conmutadores de macro. No importa cuál sea el valor de estas macros, no habrá código y, por lo tanto, no participará en la compilación. Estas macros se utilizan generalmente para configurar el valor de la cantidad.
[sección::BE_DEBUG]
Este conmutador de macro se utiliza para activar o desactivar la función
de depuración del propio intérprete. Cuando el valor de BE_DEBUG
es
0
, la depuración se desactiva; de lo contrario, se activará. La
función de depuración mencionada aquí se refiere a la depuración del
intérprete, no a la función de depuración del programa Berry. El valor
predeterminado de BE_DEBUG
es 0
. Si usa Makefile que viene con
el proyecto del intérprete para compilar, este interruptor de macro se
activará automáticamente cuando use el comando make debug
.
Cuando se abre esta macro, se activarán algunas aserciones y se generará
un mensaje de error cuando el intérprete encuentre un error que la
aserción pueda detectar. Puede abrir BE_DEBUG
al depurar el
intérprete y cerrarlo al compilar la versión.
Este conmutador de macro configura el tipo de punto flotante utilizado
por el tipo breal
. Cuando el valor de la macro es 0
, se usará el
tipo doble
para implementar breal
, de lo contrario, se usará el
tipo float
para implementar breal
. Este interruptor de macro se
puede activar en algunos entornos con bajo rendimiento o configuración
de memoria. En la implementación predeterminada, este interruptor de
macro está desactivado.
Esta macro configura la implementación del tipo bint
. Cuando el
valor de la macro es 0
, se usará el tipo int
para implementar
bint
, cuando el valor sea 1
, se usará el tipo long
para
implementar bint
, y cuando el el valor es 2
, se usará 64 ] Tipo
de entero con signo de bit (__int64
en Windows, long long
en
otras plataformas) implementa bint
. El valor predeterminado de esta
macro es 2
. Si desea reducir el uso de la memoria, puede establecer
esta macro en 0
o 1
para habilitar el tipo de entero de 32 bits.
Esta macro se usa para configurar la información de depuración en tiempo
de ejecución del código Berry. Tiene 3 valores disponibles: establecer
en 0
para desactivar la salida del nombre de archivo y el número de
línea de la información de depuración en tiempo de ejecución, y
establecer en 1
para mostrar el nombre de archivo y el número de
línea en la información de depuración en tiempo de ejecución, establecer
a 2
Al usar uint16_t
(entero de 16 bits) escriba para almacenar
la información del número de fila. Su valor por defecto es 1
.
Establecer esta macro en 0
no almacenará el nombre del archivo ni la
información del número de línea, por lo que el consumo de memoria es
mínimo. Cuando se establece en 2
, consume menos memoria, pero si el
programa es demasiado largo, uint16_t
se desbordará.
Este modificador de macro configura la función de construir objetos en tiempo de compilación. Activar esta macro significa que la construcción de objetos en tiempo de compilación está habilitada. Esta macro está activada de forma predeterminada. Cuando esta macro está activada, los objetos nativos de la biblioteca estándar se generarán en tiempo de compilación y cuando esta macro está desactivada, los objetos de la biblioteca estándar se generarán en tiempo de ejecución.
Las funciones be_regfunc
y be_regclass
se verán afectadas por
esta macro. La tabla de objetos integrada no se puede modificar cuando
se utiliza la construcción de objetos en tiempo de compilación. En este
momento, estas dos funciones no pueden registrar objetos en el ámbito
integrado, pero registran objetos en el ámbito global.
Los objetos construidos durante el tiempo de compilación se almacenan junto con el código y no ocuparán recursos de RAM (o el área de lectura y escritura en la memoria). La tecnología de construcción durante el tiempo de compilación también puede reducir el tiempo de inicio del intérprete, por lo que se recomienda abrir esta macro. Consulte la sección [section::precompiled_build] para obtener más detalles sobre las técnicas de construcción en tiempo de compilación.
Esta macro define la capacidad máxima de pila de Berry, que se refiere a
la cantidad de objetos de Berry. Cuando el código Berry usa más de esta
cantidad de pila, dejará de ejecutar el programa y devolverá un mensaje
de error. El valor predeterminado de esta macro es 2000
, que puede
modificarse según la capacidad de memoria del sistema.
Este valor no afecta el uso de memoria de la pila Berry, porque la capacidad de la pila Berry se ajusta dinámicamente, por lo que no importa cuánto se establezca, no puede ayudar a reducir el uso de memoria. Su función principal es terminar la ejecución cuando el programa Berry consume demasiada pila. Es muy probable que estos programas sean incorrectos, por ejemplo, las llamadas a funciones recursivas sin condiciones de devolución seguirán consumiendo la pila.
Esta macro define el espacio mínimo disponible en la pila de Berry y su
valor predeterminado es 10
. La función nativa puede insertar un
valor en la pila de Berry. En este momento, la pila no crecerá
automáticamente, así que asegúrese de que haya suficiente espacio en la
pila para que la use la función nativa. No se recomienda modificar este
valor, sino usar la función be_stack_require
donde realmente se
necesita más espacio de pila.
Para detectar errores de desbordamiento de pila al depurar el
intérprete, puede abrir la macro BE_DEBUG
(sección
[sección::BE_DEBUG] ).
Cuando se abre esta macro, el objeto de cadena corta guardará el valor hash de la cadena para mejorar la velocidad de ejecución, pero el tamaño de cada objeto de cadena aumentará en 4 bytes. Esta macro está desactivada de forma predeterminada y las pruebas actuales no han encontrado que abrir esta macro traiga una mejora significativa.
Este conmutador de macro se utiliza para activar o desactivar el módulo
string
, que está activado de forma predeterminada.
Este interruptor de macro se usa para habilitar o deshabilitar el módulo
json
, que está activado de forma predeterminada.
Este conmutador de macro se utiliza para habilitar o deshabilitar el módulo “matemático”, que está activado de forma predeterminada.
Este interruptor de macro se usa para habilitar o deshabilitar el módulo
time
, que está activado de forma predeterminada.
Este conmutador de macro se utiliza para activar o desactivar el módulo
os
, que está activado de forma predeterminada.
Esta macro determina la función abortar
utilizada internamente por
el intérprete de Berry. Por defecto o cuando la macro no está definida,
se utilizará la función abortar
en la biblioteca estándar de C. Esta
macro se define como abortar
por defecto. Si el usuario necesita
especificar explícitamente la función abortar
utilizada por el
intérprete, reemplace la definición de macro con la función requerida
por el usuario. Esta función debe tener la misma forma que la
declaración de la función abortar
en la biblioteca estándar.
Esta macro determina la función exit
utilizada internamente por el
intérprete de Berry. Por defecto o cuando la macro no está definida, se
utilizará la función exit
en la biblioteca estándar de C. Esta macro
se define como salir
por defecto. Si el usuario necesita especificar
explícitamente la función salir
utilizada por el intérprete,
reemplace la definición de macro con la función requerida por el
usuario. Esta función debe tener la misma forma que la declaración de la
función exit
en la biblioteca estándar.
Esta macro determina la función malloc
utilizada internamente por el
intérprete de Berry. Por defecto o cuando la macro no está definida, se
utilizará la función malloc
en la biblioteca estándar de C. Esta
macro se define como malloc
por defecto. Si el usuario necesita
especificar explícitamente la función malloc
utilizada por el
intérprete, reemplace la definición de macro con la función requerida
por el usuario. Esta función debe tener la misma forma que la
declaración de la función malloc
en la biblioteca estándar.
Esta macro determina la función libre
utilizada internamente por el
intérprete de Berry. Por defecto o cuando la macro no está definida, se
utilizará la función free
en la biblioteca estándar de C. Esta macro
se define como “gratis” por defecto. Si el usuario necesita especificar
explícitamente la función “libre” utilizada por el intérprete, reemplace
la definición de macro con la función requerida por el usuario. Esta
función debe tener la misma forma que la declaración de la función
“libre” en la biblioteca estándar.
Esta macro determina la función realloc
utilizada internamente por
el intérprete de Berry. Por defecto o cuando la macro no está definida,
se utilizará la función realloc
en la biblioteca estándar de C. Esta
macro se define como realloc
por defecto. Si el usuario necesita
especificar explícitamente la función realloc
utilizada por el
intérprete, reemplace la definición de macro con la función requerida
por el usuario. Esta función debe tener la misma forma que la
declaración de la función realloc
en la biblioteca estándar.
Esta macro se utiliza para definir la implementación de la función de
aserción. De forma predeterminada, la función assert
en la
biblioteca estándar de C se usa para implementar la afirmación. Si el
sistema de destino tiene inconvenientes para usar la función
assert()
en la biblioteca estándar para hacer una afirmación, puede
modificar la definición de la macro be_assert
. Una función de
aserción correcta debe usar la siguiente declaración:
void assert(int condition);
Entre ellos, condición
es la condición de afirmación. Si no se
cumple la condición, se emitirá un mensaje de error y el programa
finalizará. Por supuesto, la función “afirmar” generalmente se
implementa mediante una macro.
Archivo berry_port.c¶
Este archivo implementa las funciones de E/S de bajo nivel del intérprete de Berry, incluida la entrada y salida estándar y la compatibilidad con el sistema de archivos. El archivo berry_port.c en el directorio predeterminado contiene un conjunto de soporte de E/S portátil. Las operaciones de archivo y la entrada y salida estándar se implementan mediante API en la biblioteca estándar de C. Las operaciones de ruta y carpeta son compatibles con las API estándar de Windows y POSIX. Este archivo también implementa un conjunto de funciones de operación de E/S basadas en FatFs para que los usuarios las usen directamente. Si necesita usar el intérprete de Berry en otros entornos, estas funciones deben implementarse por separado (es posible que solo deban implementarse parcialmente).
Esta sección presentará las funciones de las funciones implementadas en el archivo berry_port.c y guiará a los usuarios para implementar su propia versión.
void be_writebuffer(const char *buffer, size_t length);
Envíe un dato al dispositivo de salida estándar, el parámetro “búfer” es
la primera dirección del bloque de datos de salida y “longitud” es la
longitud del bloque de datos de salida. Esta función genera el archivo
stdout
de forma predeterminada. Dentro del intérprete, esta función
generalmente se usa como una salida de flujo de caracteres, no como un
flujo binario.
Las funciones be_writebuffer
son muy versátiles y deben
implementarse.
char* be_readstring(char *buffer, size_t size);
Ingrese un dato del dispositivo de entrada estándar y lea como máximo
una fila de datos cada vez que se llame a esta función. El parámetro
buffer
es el búfer de datos pasado por la persona que llama, y la
capacidad del búfer es tamaño
. Esta función dejará de leer y
regresará cuando se agote la capacidad del búfer; de lo contrario,
regresará cuando se lea un carácter de nueva línea o un carácter de fin
de archivo. Si la función se ejecuta con éxito, usará directamente el
parámetro buffer
como valor de retorno, de lo contrario devolverá
NULL
.
Esta función agregará los saltos de línea de lectura a los datos leídos,
y cada vez que se llame a la función be_readstring
, continuará
leyendo desde la posición actual. Esta función solo se llama en la
implementación de la función nativa input
, y es posible que la
función be_readstring
no se implemente cuando no sea necesaria.
void* be_fopen(const char *filename, const char *modes);
Para abrir un archivo, filename
es el nombre del archivo que se
abrirá y modos
es el método de apertura. La función devolverá un
identificador de archivo o un puntero a la estructura de operación del
archivo. El uso de esta función es similar a la función fopen
en la
biblioteca estándar de C. El nombre del archivo es una cadena de estilo
C (que termina con un carácter \0
), y el patrón debe admitir al
menos las siguientes condiciones:
r
,rt
: Para abrir un archivo de texto en modo de solo lectura, el archivo debe existir.r+
,rt+
: Abre un archivo de texto en modo lectura-escritura y crea un nuevo archivo si el archivo no existe.rb
: abre un archivo binario en modo de solo lectura, el archivo debe existir.rb+
: abre un archivo binario en modo de lectura y escritura y crea un nuevo archivo si el archivo no existe.w
,wt
: Crear y abrir un archivo de texto en modo de solo escritura, y el el archivo existente será eliminado.w+
,wt+
: Crea y abre un archivo de texto en modo lectura-escritura, y el el archivo existente será eliminado.wb
: crea y abre un archivo binario en modo de solo escritura, y el el archivo existente será eliminado.wb+
: Crea y abre un archivo binario en modo lectura-escritura, y el el archivo existente será eliminado.
De forma predeterminada, la función fopen
en la biblioteca estándar
de C se usa para implementar be_fopen
. Si utiliza otros métodos para
lograrlo, debe asegurarse de que se puedan lograr los modos de
funcionamiento anteriores. Si no se requieren operaciones de archivo,
esta función se puede dejar en blanco. Las operaciones de archivos aquí
incluyen todos los escenarios, como usar la función abrir
en el
script, cargar el script desde un archivo (usando la función
be_loadfile
), etc.
int be_fclose(void *hfile);
Cierra un archivo, hfile
es el identificador de archivo cerrado. La
función de esta función es similar a la función fclose
en la
biblioteca estándar de C.
size_t be_fwrite(void *hfile, const void *buffer, size_t length);
Escribe un dato en el archivo especificado. El parámetro hfile
es el
identificador del archivo que se escribirá, buffer
es el puntero de
los datos que se escribirán, length
es el número de datos que se
escribirán (en bytes).
size_t be_fread(void *hfile, void *buffer, size_t length);
Leer un fragmento de datos del archivo especificado. El parámetro
hfile
es el identificador del archivo que se leerá, buffer
es el
puntero al búfer de lectura y length
es el número de bytes que se
leerán.
char* be_fgets(void *hfile, void *buffer, int size);
Lea una línea del archivo, similar a la función fgets
en la
biblioteca estándar de C. El parámetro hfile
es el identificador del
archivo que se va a leer, buffer
es el puntero del búfer de lectura
y size
es la capacidad del búfer de lectura. Esta función regresará
cuando se lean los bytes size - 1
, los caracteres de nueva línea y
los caracteres de fin de archivo, y el valor de retorno sea buffer
.
int be_fseek(void *hfile, long offset);
Establezca la posición del puntero de lectura y escritura del archivo.
El parámetro hfile
es el identificador de archivo que se va a
utilizar y offset
es el valor que se va a establecer.
long int be_ftell(void *hfile);
Obtenga el puntero de lectura y escritura actual del archivo, el
parámetro hfile
es el identificador del archivo que se va a operar,
y el valor de retorno de esta función es el puntero de lectura y
escritura del archivo.
long int be_fflush(void *hfile);
Escriba los datos del búfer de archivo en el archivo. El parámetro
hfile
es el archivo a operar.
size_t be_fsize(void *hfile);
Obtenga el tamaño del archivo. El parámetro hfile
es el archivo a
operar.