La charla en tiempo de ejecución de un viejo codificador

Escribir programas es inseparable del tiempo de ejecución, pero muchos socios no entienden qué es el tiempo de ejecución. La razón por la que el concepto de tiempo de ejecución se confunde fácilmente es porque tiempo de ejecución tiene dos significados diferentes: tiempo de ejecución y tiempo de ejecución. Es posible que los sabios hayan ignorado el espacio en el medio al traducir, lo que hace que la palabra tiempo de ejecución represente dos significados: tiempo de ejecución y entorno de ejecución/ sistema.

El tiempo de ejecución (tiempo de ejecución) en informática representa el período de operación de un programa desde el principio hasta el final de la ejecución, en contraste, otros períodos incluyen: tiempo de diseño, tiempo de compilación y tiempo de enlace) y tiempo de carga.

Tiempo de ejecución es un término abstracto general que se refiere a todas las bibliotecas de códigos, marcos, plataformas, etc. necesarios para que se ejecute un programa de computadora. Incluye el entorno de ejecución y el estado de ejecución del programa, así como varios datos y resultados generados por el programa cuando se está ejecutando. El tiempo de ejecución sirve principalmente para implementar el modelo de ejecución del lenguaje de programación y tiene diferentes implementaciones en cada lenguaje. El concepto de tiempo de ejecución es muy importante en programación, está relacionado con la corrección, estabilidad y rendimiento del programa.

El tiempo de ejecución y el tiempo de ejecución son diferentes y están relacionados, y ambos son la base del diseño de software. El tiempo de ejecución se ve desde la perspectiva del programa en sí, mientras que el tiempo de ejecución se ve desde la perspectiva del entorno de ejecución y las dependencias del programa. Por lo tanto, cuando hablamos de tiempo de ejecución, debemos aclarar el contexto para comprender el verdadero significado de tiempo de ejecución y hacer que nuestros sistemas de software sean más flexibles y confiables a través de tecnologías relacionadas con el tiempo de ejecución.

ebba44c396e1664117a4786f2ebb811a.jpeg

Tiempo de ejecución: tiempo de ejecución - tiempo de ejecución

El tiempo de ejecución es una etapa del ciclo de vida del programa y es el comportamiento del código cuando se ejecuta. El tiempo de compilación se refiere al comportamiento del compilador al compilar el código fuente en programación, incluido el análisis de sintaxis, análisis semántico, verificación de tipos, creación de instancias de plantillas, generación de código, etc. Los lenguajes de programación suelen especificar requisitos en tiempo de compilación que debe cumplir el programa fuente. Algunos lenguajes de programación realizan parte de la compilación durante el tiempo de enlace o de ejecución, como la compilación justo a tiempo.

Algunos problemas en la ejecución del programa sólo se pueden detectar en tiempo de ejecución, como errores lógicos o comprobaciones de límites de matriz. Por lo tanto, los usuarios también encuentran mensajes como errores de tiempo de ejecución.

Verificación en tiempo de ejecución

La verificación en tiempo de ejecución es una tecnología de verificación liviana. Es una tecnología de verificación tradicional y un complemento eficaz para la detección y prueba de modelos. Una de sus características más importantes es que su objeto de verificación es el funcionamiento real del sistema monitoreado, de modo que cuando se detecta un error, se pueden tomar las acciones de ajuste correspondientes a tiempo para lograr el propósito de evitar fallas de software o evitar una mayor propagación del software. fracasos.

La verificación del tiempo de ejecución se centra en detectar si la trayectoria de ejecución del programa cumple o viola las propiedades monitoreadas. Cuando la operación del programa cumple o viola las propiedades de monitoreo, la tecnología de verificación en tiempo de ejecución generalmente no realiza ajustes al sistema monitoreado. En otras palabras, la tecnología de verificación del tiempo de ejecución es una tecnología de juicio sobre si la trayectoria de ejecución del programa cumple con las propiedades de monitoreo. Los monitores basados ​​en AOP son eficientes (no es necesario cambiar de entorno), fáciles de implementar (no implican modificaciones en las máquinas virtuales y sistemas operativos) y precisos (los monitores basados ​​en AOP pueden obtener más información sobre el estado del programa monitoreado).

Diferentes manifestaciones del programa en tiempo de compilación y tiempo de ejecución.

Aquí tomamos el polimorfismo como ejemplo para describir las diferentes manifestaciones de las características del programa en tiempo de compilación y tiempo de ejecución.

Primero aclaremos brevemente el polimorfismo. El polimorfismo se refiere a que la misma entidad tiene múltiples formas al mismo tiempo, lo cual es una característica importante de la programación orientada a objetos (POO). En otras palabras, la misma operación puede tener diferentes interpretaciones y producir diferentes resultados de ejecución cuando se aplica a diferentes objetos. En tiempo de ejecución, puede llamar a métodos en una clase derivada mediante un puntero a la clase base. Si un lenguaje solo admite clases pero no polimorfismo, solo significa que está basado en objetos y no orientado a objetos.

El polimorfismo se divide en dos situaciones: polimorfismo en tiempo de compilación y polimorfismo en tiempo de ejecución. El polimorfismo en tiempo de compilación significa que puede determinar qué método llamar en tiempo de compilación. Por el contrario, el polimorfismo en tiempo de ejecución solo puede determinar qué método llamar en tiempo de ejecución. Cuando los métodos están sobrecargados, se trata de polimorfismo en tiempo de compilación. El método de llamada se puede determinar en tiempo de compilación según el tipo de datos, el número y el orden de los parámetros. Cuando un objeto de subclase se refiere a un método de instancia de su propia clase, también es polimórfico en tiempo de compilación. Pero cuando el objeto de la clase principal se refiere al método de instancia de la subclase, se trata de polimorfismo en tiempo de ejecución, porque el método correspondiente solo puede coincidir y llamarse en tiempo de ejecución.

Configuración del software en tiempo de ejecución

La configuración del software en tiempo de ejecución es una forma de configuración de software que aumenta la flexibilidad y adaptabilidad del sistema de software.

La configuración del software se puede dividir en configuración en tiempo de ejecución y configuración en tiempo de compilación. La configuración en tiempo de ejecución es una interfaz importante para el software, que puede personalizar diferentes funciones, administrar la asignación de recursos, adaptarse a los cambios en el entorno y satisfacer diferentes requisitos. Las necesidades de los usuarios Son principalmente para administradores y usuarios de software. Los ajustes de software se pueden realizar sin recompilar ni implementar. La configuración del tiempo de compilación también se denomina configuración de línea de productos de software (configuración SPL), que se utiliza principalmente para tomar decisiones durante la construcción e implementación del software. Si los módulos funcionales específicos son agregado al programa ejecutable determina la forma final del software.Es principalmente para el personal de desarrollo e implementación de software y debe recompilarse antes de poder usarse.

Optimización de la compilación en tiempo de ejecución

Generalmente, las técnicas de optimización de software se dividen en dos categorías: optimización estática y optimización dinámica. Entre ellos, la optimización dinámica actualmente se centra en optimizar programas de lenguajes dinámicos como Java, Ruby, Python, etc. La optimización del software durante el tiempo de ejecución se logra principalmente mediante tecnología de compilación dinámica.

La tecnología de compilación dinámica se puede dividir en dos categorías principales: ① compilación selectiva: se centra principalmente en cuándo seleccionar qué parte del código del programa compilar y optimizar dinámicamente; ② optimización basada en retroalimentación: utilizar información de perfiles para guiar al compilador dinámico a qué nivel para hacer la optimización de la compilación. Los compiladores dinámicos generalmente admiten dos métodos de ejecución: uno es la ejecución interpretada o la ejecución de la compilación del compilador sin optimización; el otro es la compilación optimizada, que se centra en optimizar las rutas de los puntos calientes. El trabajo de optimización de la compilación en el compilador dinámico se realiza durante el tiempo de ejecución del programa y la sobrecarga de compilación se incluye en la sobrecarga de ejecución del programa.

El compilador dinámico no solo puede elegir qué código compilar u optimizar la compilación, sino también recopilar la información de ejecución del programa durante la ejecución del programa, incluida principalmente la profundidad del bucle del programa, la entrada del programa y el entorno de ejecución (sistema operativo, arquitectura), etc. Utilizando esta información de tiempo de ejecución, el compilador dinámico puede decidir mejor qué estrategia de optimización de compilación utilizar para compilar y optimizar el programa. La tecnología de creación de perfiles dinámicos hace posible la compilación de optimización de varios niveles. Cada nivel adopta una estrategia de optimización específica y
el rendimiento es más fácil de mejorar (esta es una tecnología de optimización dinámica basada en retroalimentación).

La tecnología de optimización dinámica basada en comentarios recopila principalmente la información requerida del programa instrumentando el programa, utilizando el código insertado y luego los organiza de acuerdo con un determinado formato para el análisis, guiando así al optimizador a recompilar.

dfe13ae214e47363274570270427a249.jpeg

Tiempo de ejecución: tiempo de ejecución - entorno de ejecución/sistema de ejecución

El tiempo de ejecución o tiempo de ejecución se refiere al entorno de ejecución, también conocido como "sistema de ejecución", o "tiempo de ejecución" para abreviar, que es el entorno en el que se ejecuta el código ejecutable en la máquina de destino. Puede ser proporcionado por el sistema operativo o por el programa principal que ejecuta este programa. El sistema operativo suele ser responsable de manejar la carga del programa: utiliza el cargador para leer el código de ejecución del programa, realizar la configuración básica de la memoria y vincular todas las bibliotecas de enlaces dinámicos especificadas por el programa según sea necesario. Algunos lenguajes de programación también manejarán el trabajo anterior en el entorno de ejecución proporcionado por este lenguaje.

El entorno de ejecución puede resolver muchos problemas, incluida la gestión de la memoria de las aplicaciones, cómo los programas acceden a las variables, el mecanismo para pasar parámetros entre programas y la interfaz con el sistema operativo. El compilador hace suposiciones basadas en el sistema de ejecución específico para generar el código correcto. Normalmente, el sistema de ejecución asumirá cierta responsabilidad para configurar y administrar la pila y puede incluir cosas como recolección de basura, subprocesos u otras características dinámicas integradas en el lenguaje.

Para muchos lenguajes tradicionales de alto nivel, especialmente los lenguajes dinámicos, el sistema de ejecución es básicamente el puente entre el programa y el hardware. Generalmente, el sistema de tiempo de ejecución en realidad proporciona una computadora virtual unificada donde se pueden ejecutar lenguajes dinámicos. Dicha máquina virtual protege completamente las características específicas del hardware y mejora en gran medida la eficiencia del desarrollo de software. Pero precisamente porque esta máquina virtual protege completamente a los programadores de la posibilidad de acceder a las funciones del hardware, la propia máquina virtual debe asumir la responsabilidad de hacer pleno uso de las funciones del hardware para ejecutar eficientemente programas en lenguaje dinámico.

Modelo de tiempo de ejecución y arquitectura de tiempo de ejecución.

Cada lenguaje tiene un modelo de ejecución específico (Modelo de ejecución), y este modelo de ejecución requiere el soporte del sistema de ejecución. Además de proporcionar un mecanismo de ejecución de programas, el sistema de ejecución generalmente también proporciona un mecanismo de administración de memoria y un mecanismo de concurrencia.

Un modelo de tiempo de ejecución es un autoinforme de la relación causal de un sistema asociado. Enfatiza la estructura, el comportamiento o los objetivos del sistema desde la perspectiva del espacio del problema. El modelo de tiempo de ejecución proporciona una abstracción de los fenómenos de tiempo de ejecución. El modelo de tiempo de ejecución puede Se puede utilizar para reparar errores de diseño o tomar nuevas decisiones de diseño. Plegar en el sistema en ejecución para admitir el diseño controlado en línea. Al mismo tiempo, el modelo de tiempo de ejecución sirve como base para la evolución del software y el comportamiento adaptativo, y también es la clave para resolver problemas de gestión del tiempo de ejecución en sistemas complejos. 

Los modelos de ejecución se dividen en modelos estructurales de ejecución y modelos de comportamiento de ejecución. Entre ellos, el modelo estructural en tiempo de ejecución se centra en describir la composición y configuración del sistema, es decir, enfatizar el método de construcción del software. Por ejemplo, para el modelo orientado a objetos, el modelo estructural describe las relaciones de herencia y llama a rutas, componentes y sus conexiones, etc.; el modelo de comportamiento en tiempo de ejecución se centra en Se utiliza para describir la información de interacción dinámica entre componentes, enfatizando la ejecución del sistema en función de eventos o procesos de seguimiento, o la ocurrencia de eventos y sus rutas de ejecución. Por ejemplo, el modelo de comportamiento Describe la llegada, colas, selección, programación y otra información de eventos. 

La arquitectura del software en tiempo de ejecución es una forma eficaz de controlar la complejidad de los sistemas en tiempo de ejecución y ayudar a la gestión del tiempo de ejecución del sistema. Como descripción dinámica del tiempo de ejecución del sistema, la arquitectura en tiempo de ejecución representa los elementos constitutivos del sistema en el momento actual, los atributos internos de cada elemento, y la La relación entre. Existe una "relación causal" entre la arquitectura en tiempo de ejecución y el sistema de destino, es decir, cuando el sistema cambia, la estructura del sistema cambia en consecuencia, y después de que se modifica la arquitectura, el sistema también cambiará en consecuencia. Esta relación causal dinámica garantiza que Los administradores del sistema pueden monitorear y ajustar el sistema de destino leyendo y escribiendo los elementos, atributos y relaciones de conexión en la arquitectura. La arquitectura de tiempo de ejecución abstrae los datos de tiempo de ejecución del sistema y los organiza de manera consistente con la perspectiva de administración, al tiempo que proporciona un método de operación simple y consistente para el mundo exterior.

La mayor diferencia entre la arquitectura en tiempo de ejecución y la arquitectura en fase de diseño es que existe una conexión causal entre la arquitectura en tiempo de ejecución y el sistema en tiempo de ejecución, mientras que la arquitectura en fase de diseño no tiene este atributo. El modelo de arquitectura en tiempo de ejecución se centra en cómo describir la estructura y configuración del sistema en tiempo de ejecución en el momento actual a través del modelo.

Implementación y clasificación en tiempo de ejecución.

En los lenguajes de programación, el tiempo de ejecución generalmente se implementa mediante un compilador y una biblioteca de tiempo de ejecución. El compilador es responsable de compilar el código fuente en código ejecutable, mientras que la biblioteca en tiempo de ejecución es responsable de proporcionar diversos servicios y soporte en tiempo de ejecución cuando el programa se está ejecutando. Las bibliotecas en tiempo de ejecución suelen incluir varias bibliotecas del sistema y bibliotecas estándar, así como algunas bibliotecas y marcos específicos del lenguaje de programación.

En lenguaje C, la implementación del tiempo de ejecución generalmente la proporcionan tanto la biblioteca C como el sistema operativo. La biblioteca C proporciona varias funciones y tipos de datos de uso común, mientras que el sistema operativo proporciona algunas llamadas y servicios del sistema de bajo nivel. En el lenguaje Java, la implementación del tiempo de ejecución la proporcionan la máquina virtual Java (JVM) y la biblioteca de clases Java. La JVM es responsable de compilar el código de bytes de Java en código ejecutable y proporcionar diversos servicios y soporte de tiempo de ejecución, mientras que la biblioteca de clases de Java proporciona una variedad de clases y funciones de uso común.

Dependiendo de la implementación del sistema de ejecución, el sistema de ejecución se puede dividir inicialmente en tres categorías:

El primero es el tiempo de ejecución nativo, como C / C ++ / Rust. Los sistemas de tiempo de ejecución de estos lenguajes dependen del sistema operativo, y el sistema operativo también puede considerarse un "entorno de ejecución".

El segundo tipo es el tiempo de ejecución ligero, como Golang, cuyo tiempo de ejecución está empaquetado con el código y es relativamente liviano.

El tercer tipo es el tiempo de ejecución pesado, como Java (JVM), Python (CPython) y C# (.NET Runtime). Su entorno de ejecución debe instalarse por separado y, por lo general, no es pequeño; lo normal es de decenas a cientos de megabytes.

Entre ellos, en C/C++ no es necesario hacer referencia a ninguna biblioteca. Hay una característica especial en Rust llamada no_std. Al estar separada de la biblioteca estándar proporciona una capacidad muy poderosa, que es interactuar directamente con el hardware. En otras palabras, C/C++/Rust se puede utilizar para escribir el kernel del sistema operativo.

Biblioteca de ejecución

La biblioteca de tiempo de ejecución (biblioteca de tiempo de ejecución), en el campo de la programación de computadoras, se refiere a una biblioteca de programas de computadora especial requerida cuando se ejecuta (ejecuta) un programa de lenguaje de programación. El compilador llamará a la biblioteca de tiempo de ejecución al binario ejecutable compilado en el código. Este tipo de biblioteca generalmente incluye entrada y salida básica o administración de memoria, etc. Generalmente es un grupo de funciones que respaldan el programa en ejecución y coopera con el sistema operativo para proporcionar funciones como operaciones matemáticas, entrada y salida, etc. para que los desarrolladores no tengan que "reinventar la rueda" y utilizar las funciones que proporciona el sistema operativo.

La biblioteca en tiempo de ejecución proporciona las necesidades más básicas para la ejecución del programa. Por ejemplo, Visual Basic requiere soporte de biblioteca de tiempo de ejecución complejo, mientras que la biblioteca de tiempo de ejecución de C es relativamente simple. Las funciones de la biblioteca en tiempo de ejecución pueden ser transparentes o no para el programador, lo que lo determina el fabricante del compilador en función de las necesidades del entorno de ejecución del lenguaje.

Muchos lenguajes modernos han diseñado entornos de ejecución más potentes y han agregado más funciones. Muchos lenguajes orientados a objetos también incluyen despachadores y lectores de clases. La máquina virtual Java (JVM) es un entorno de ejecución típico de este tipo y la arquitectura .NET es otro ejemplo de una biblioteca en tiempo de ejecución. El manejo de excepciones es un mecanismo de lenguaje que maneja específicamente los errores en tiempo de ejecución, lo que permite a los desarrolladores detectar por completo errores inesperados o resultados de errores que no se manejan adecuadamente.

El ángulo de clasificación de la biblioteca de enlaces dinámicos o la biblioteca de enlaces estáticos es diferente del de la biblioteca en tiempo de ejecución. La biblioteca en tiempo de ejecución es el archivo de biblioteca del que el programa debe depender cuando se ejecuta.

Bibliotecas de tiempo de ejecución C y C++

Para mejorar la eficiencia del desarrollo del lenguaje C, el estándar C define una serie de funciones de uso común, llamadas funciones de biblioteca C. El estándar C solo define prototipos de funciones y no proporciona implementaciones. Por lo tanto, esta tarea se deja a cada compilador que admita el estándar del lenguaje C. Cada compilador generalmente implementa un superconjunto de C estándar, llamado C Run Time Library (C Run Time Library), o CRT para abreviar. La biblioteca estándar de C es la biblioteca básica del lenguaje C que se puede utilizar en cualquier plataforma. Además de agregar la biblioteca estándar C a su alcance, CRT también amplía la biblioteca de interfaces relacionadas con la plataforma, que implementan llamadas API del sistema operativo de diferentes plataformas según las diferentes plataformas. 

Al igual que el lenguaje C, C++ también define sus propios estándares y proporciona bibliotecas de soporte relacionadas, llamadas bibliotecas de tiempo de ejecución de C++ o bibliotecas estándar de C++. Debido a la compatibilidad de C++ con C, la biblioteca estándar de C++ incluye la biblioteca estándar de C, además del flujo IO y la biblioteca de plantillas estándar STL.

196d943271ca053a68c54f805309de7f.jpeg

VC+ implementa la biblioteca de tiempo de ejecución anterior de acuerdo con los prototipos de funciones definidos por los estándares C y C++. Para facilitar el uso de clientes con diferentes necesidades, VC++ implementa la versión DLL de la biblioteca de enlaces dinámicos y la versión LIB de la biblioteca de enlaces estáticos, respectivamente. Al mismo tiempo, para admitir la depuración del programa sin afectar el rendimiento del programa, se proporcionan las versiones de depuración correspondientes. Utilizando la versión DLL de las bibliotecas de tiempo de ejecución C y C++, el programa carga dinámicamente la DLL correspondiente durante el tiempo de ejecución. El tamaño del programa se vuelve más pequeño, pero un gran problema es que una vez que no se puede encontrar la DLL correspondiente, el programa no podrá ejecutarse.

Al desarrollar programas multiproceso en Windows, debe elegir uno entre MT, MTd, MD y MDd. Para MT/MTd, dado que la biblioteca de tiempo de ejecución de conexión es LIBCMT.lib/LIBCMTD.lib, estas dos bibliotecas son bibliotecas estáticas, por lo que el programa compilado de esta manera puede ejecutarse normalmente cuando se mueve a otra máquina, por lo que con este método no se generará ningún error. reportado por bibliotecas dinámicas faltantes. Pero para MD/MDd, la biblioteca dinámica está conectada, por lo que si no hay MSVCRT.dll/MSVCRTD.dll en otra máquina, se mostrará un error como falta una biblioteca dinámica. Para las bibliotecas escritas por usuarios u otras bibliotecas de terceros, el método de conexión depende del código (que se muestra para conectar la biblioteca dinámica Loadlibrary) o del archivo lib proporcionado. Al mover el programa a otra máquina, aún necesita traer la dinámica requerida biblioteca. de. Al desarrollar varios proyectos, es mejor que todos los proyectos utilicen la misma biblioteca de ejecución.

Seguridad en tiempo de ejecución

La autoprotección de aplicaciones en tiempo de ejecución (RASP), que ha surgido en los últimos años, es un método para resolver el problema de las vulnerabilidades de las aplicaciones y agregar una capa adicional de seguridad a la infraestructura de TI. Según Gartner, la autoprotección de aplicaciones en tiempo de ejecución es "una tecnología de seguridad integrada o vinculada al entorno de ejecución de una aplicación que controla la ejecución de la aplicación y detecta y bloquea ataques en tiempo real".

La autoprotección de la aplicación en tiempo de ejecución es preventiva y toma una variedad de medidas para evitar que los piratas informáticos comprometan el sistema y tomen el control de la aplicación si algo sale mal. Además de detectar código malicioso, RASP puede:

  • Finalizar sesión de usuario abruptamente

  • Cerrar una aplicación o sistema

  • Administradores y personal de seguridad que avisan de eventos inusuales.

  • Enviar advertencia a los usuarios del sistema.

RASP generalmente se integra con aplicaciones y protege contra ataques en tiempo de ejecución al monitorear y analizar el tráfico y el comportamiento del usuario, lo que les permite ver el código de nivel funcional en las aplicaciones. Esta visibilidad le permite identificar ataques con mayor precisión, reducir los falsos positivos e informar o bloquear aquellas acciones que plantean amenazas legítimas.

Entornos de ejecución comunes

Aquí, aprenderemos sobre los entornos de ejecución de diferentes lenguajes de programación, incluido el mecanismo de ejecución del sistema operativo del lenguaje C, Apache Portable Runtime, Common Language Runtime, Java Runtime Environment, Android Runtime, iOS Runtime, motor JavaScript y entorno de ejecución, y pequeños programas Entorno de ejecución. Además, piense en las características, ventajas y desventajas de cada entorno de ejecución y cómo funcionan en diferentes plataformas.

Tiempo de ejecución C/C++

El principal tiempo de ejecución del lenguaje C es en realidad el sistema operativo. Se puede decir que el lenguaje C y varios sistemas operativos modernos tienen una relación de compañerismo, al igual que Java y JVM tienen una relación de compañerismo.

En términos del mecanismo de ejecución del programa, los programas compilados en lenguaje C se ejecutan completamente de acuerdo con el mecanismo operativo del sistema operativo. En términos de administración de memoria, el lenguaje C utiliza la pila de subprocesos proporcionada por el sistema operativo, y el sistema operativo puede ayudar automáticamente al programa a administrar la memoria. Los programas también pueden solicitar memoria del montón, pero deben ser responsables de liberarla ellos mismos. No existe un mecanismo automático de administración de memoria. En términos de mecanismo de concurrencia, por supuesto, se utiliza directamente el mecanismo de subprocesos proporcionado por el sistema operativo. Si el sistema operativo no proporciona corrutinas y mecanismos de actor, el lenguaje C no proporciona este mecanismo de concurrencia.

ABR

Apache Portable Runtime (APR para abreviar) es una biblioteca de soporte para el servidor HTTP Apache y proporciona un conjunto de API asignadas al sistema operativo subyacente. Si el sistema operativo no admite una característica específica, APR proporcionará una implementación simulada. De esta manera, los programadores utilizan APR para escribir programas que sean verdaderamente portátiles en diferentes plataformas.

APR permite bajar el procesamiento de los detalles de la plataforma. Para las aplicaciones, no es necesario considerar la plataforma específica en absoluto, ya sea Unix, Linux o Windows, la interfaz ejecutada por la aplicación está básicamente unificada. Por lo tanto, para APR, la portabilidad y la interfaz unificada de capa superior son una consideración clave. Originalmente, APR existía como parte del servidor HTTP Apache, pero Apache Software Foundation lo amplió a un proyecto separado y otras aplicaciones pueden usar APR para lograr la independencia de la plataforma. El objetivo de APR es fusionar de forma segura todo el código que se pueda fusionar sin sacrificar el rendimiento.

CLR

Common Language Runtime (CLR) es el nombre que Microsoft eligió para su máquina virtual .NET. Es la implementación de Microsoft de Common Language Infrastructure (CLI), que define un entorno en el que se ejecuta el código. El CLR ejecuta un tipo de código de bytes llamado Universal Intermediate Language, que se ejecuta en el sistema operativo Windows.

El tiempo de ejecución .NET se instala en la computadora y lo utilizan las aplicaciones que dependen del marco. El tiempo de ejecución tiene un amplio conjunto de bibliotecas de clases estándar denominada biblioteca del marco de ejecución o biblioteca de clases base (BCL). Además, existen extensiones para las bibliotecas en tiempo de ejecución que proporcionan implementaciones para muchos tipos, algoritmos y funciones de utilidad comunes y específicos de aplicaciones.

JRE

JRE es el entorno de ejecución de programas Java, que incluye una máquina virtual JAVA y algunas bibliotecas de funciones estándar. En otras palabras, JRE (Java Runtime Environment) es una máquina virtual que puede ejecutar código de bytes de Java y está implementada en una estructura de pila. JVM tiene su propia arquitectura de hardware completa, como procesador, pila, registros, etc., y también tiene el sistema de instrucciones correspondiente. JRE protege la información relacionada con plataformas de sistemas operativos específicas, de modo que los programas Java solo necesitan generar código de bytes para ejecutarse en la máquina virtual Java y pueden ejecutarse en múltiples plataformas sin modificaciones.

Como máquina virtual para un lenguaje de programación, la JVM en realidad no está dedicada solo al lenguaje Java. Siempre que el archivo compilado generado cumpla con los requisitos de la JVM para cargar el formato del archivo compilado, cualquier lenguaje puede ejecutarse en el JRE.

ARTE

Android Runtime (abreviado como ART) es un entorno de ejecución en el sistema operativo Android, desarrollado por Google y lanzado oficialmente como función de prueba en el sistema Android 4.4 en 2013. En Android 5.0 y versiones posteriores de Android Como biblioteca de tiempo de ejecución oficial, Reemplaza la máquina virtual Dalvik anterior. ART puede convertir el código de bytes de una aplicación en código de máquina y es una nueva máquina virtual utilizada por Android.

23784466fba786d01e5881054ce42ad3.png

A diferencia de la máquina virtual Dalvik, ART introduce AOT, una tecnología de precompilación. Durante el proceso de instalación de la aplicación, ART ha recompilado todos los códigos de bytes en código de máquina. No es necesario realizar trabajos de compilación en tiempo real durante la ejecución de la aplicación, solo se requieren llamadas directas. Por lo tanto, ART mejora en gran medida la eficiencia operativa de las aplicaciones, al mismo tiempo que reduce el consumo de energía de los teléfonos móviles, mejora la duración de la batería de los dispositivos móviles y también mejora en gran medida mecanismos como la recolección de basura. Para garantizar la compatibilidad con versiones anteriores, ART utiliza el mismo archivo de código de bytes (dex) de Dalvik, es decir, el archivo dex se conserva en el directorio de la aplicación para que lo llamen los programas antiguos, pero el archivo .odex se reemplaza con un formato ejecutable y vinculable ( ELF) archivo ejecutable. Una vez que se compila un programa con el comando dex2oat de ART, el programa solo se ejecutará a través del ejecutable ELF. Por lo tanto, en comparación con el modo de máquina virtual Dalvik, la instalación de aplicaciones de Android en modo ART lleva más tiempo y también ocupa más espacio de almacenamiento interno para almacenar el código compilado, pero ahorra mucho tiempo de la máquina virtual Dalvik utilizado para la compilación justo a tiempo. .

Tiempo de ejecución de iOS

En iOS, Runtime generalmente se entiende como una API que implementa la dinámica del lenguaje Obj-C. La naturaleza dinámica de Obj-C es el mecanismo de ejecución, el más importante de los cuales es el mecanismo de mensajes.

Con el soporte de iOS Runtime, la escritura dinámica y el enlace dinámico permiten seleccionar qué receptor y qué método llamar se puede decidir en tiempo de ejecución; la aplicación puede cargar código ejecutable y recursos según sea necesario en lugar de cargar todos los recursos al inicio; al compilar, iOS genere una ID única para distinguir este método según el nombre del método (incluida la secuencia de parámetros). Esta ID es de tipo SEL. Siempre que los nombres de los métodos (incluida la secuencia de parámetros) sean los mismos, sus ID serán todos iguales. . Cargue el archivo de la biblioteca dinámica en la aplicación en ejecución a través de dlopen. A continuación, dlsym obtendrá la dirección del símbolo de la biblioteca dinámica y luego podrá manejar el trabajo de reemplazo de clases. Todo el proceso no requiere recompilar ni recargar la aplicación, y se logra el propósito de una depuración extremadamente rápida utilizando bibliotecas dinámicas.

Motor JS y tiempo de ejecución

Un motor JavaScript es un programa que interpreta el código JavaScript y es responsable de ejecutar el código. Cualquier motor de JavaScript suele contener una pila de llamadas y un montón. La pila de llamadas es donde se ejecuta el código y el montón es un grupo de memoria no estructurado que almacena todos los objetos que necesita la aplicación. Cuando un fragmento de código ingresa al entorno de ejecución, el código primero se lee y luego se analiza en una estructura de datos llamada árbol de sintaxis abstracta (AST). El árbol generado se utiliza para crear código de máquina.

El entorno de ejecución de JavaScript contiene todos los componentes necesarios para ejecutar JavaScript, incluido el motor de JavaScript, la API web y la cola de devolución de llamadas.

48789a69dd726252cf7548b7c0eeaf8b.jpeg

Los tiempos de ejecución del navegador y Node.js son ejemplos específicos de entornos de ejecución JS. Cuando JavaScript se ejecuta en un navegador web, se ejecuta dentro del entorno de ejecución del navegador. El entorno de ejecución del navegador proporciona acceso al DOM, lo que permite la interacción con los elementos de la página web, el procesamiento de eventos y la manipulación de la estructura de la página. Node.js proporciona un entorno de ejecución del lado del servidor que ejecuta JavaScript fuera del navegador, por lo que no puede acceder a las API web. El tiempo de ejecución de Node.js reemplaza esto con algo llamado enlaces de C++ y grupos de subprocesos. Todos los navegadores principales tienen un motor JavaScript que puede ejecutar código JavaScript. El más popular es el motor V8 de Google Chrome, que brinda soporte tanto para Chrome como para Node.js.

Mini tiempo de ejecución del programa

El entorno de ejecución de un programa pequeño puede considerarse como un caso especial del entorno de ejecución JS. En diferentes plataformas operativas, el entorno de ejecución del miniprograma es diferente y el rendimiento también es diferente:

  • En iOS, iPadOS y Mac OS, el código JavaScript del subprograma se ejecuta en JavaScriptCore;

  • En Android, el código JavaScript del subprograma se ejecuta en V8;

  • En Windows, el subprograma JavaScript utiliza el kernel Chromium;

  • En las herramientas de desarrollo, los códigos JavaScript de programas pequeños generalmente se ejecutan en NW.js.

Entre ellos, JavaScriptCore no puede habilitar la compilación JIT y su rendimiento de ejecución en las mismas condiciones es significativamente menor que el de otras plataformas.

Aunque los entornos de ejecución son muy similares, todavía existen algunas diferencias, es decir, existen inconsistencias en la sintaxis de JavaScript y el soporte de API, que los desarrolladores pueden evitar activando la función de ES6 a ES5.

a0eae83928453af2ef352b0d00510553.jpeg

Aplicaciones en la nube en tiempo de ejecución

El tiempo de ejecución del contenedor es responsable de ejecutar el contenedor y configurar el espacio de nombres y el grupo de control, como Docker, containerd, rkt, Kata Container, CRI-O, etc.; el tiempo de ejecución de FaaS admite múltiples idiomas y cada versión principal del lenguaje de programación. tiene un tiempo de ejecución separado, puede usar el tiempo de ejecución proporcionado por Lambda o crear el suyo propio, o puede personalizar el tiempo de ejecución para que sea un script de shell o un archivo binario ejecutable en Linux.

Tiempo de ejecución del contenedor

El tiempo de ejecución del contenedor se centra más en ejecutar contenedores y configurar espacios de nombres y grupos de control (cgroups) para contenedores, también conocido como tiempo de ejecución del contenedor subyacente. El motor de contenedor o tiempo de ejecución de contenedor de alto nivel se centra en formatear, descomprimir, administrar y compartir imágenes. También proporcionan API para desarrolladores. En este caso, el tiempo de ejecución del contenedor es equivalente a un módulo ejecutable de forma independiente, que se puede utilizar como una biblioteca de clases nativa funcional.

Docker es actualmente la tecnología de motor de contenedores más extendida. Por supuesto, con la creciente prosperidad del ecosistema de contenedores, lentamente han surgido en la industria otras herramientas de tiempo de ejecución, como containerd, rkt, Kata Container, CRI-O, etc. Las funciones proporcionadas por estas herramientas son diferentes: algunas solo tienen la función de ejecutar contenedores y otras también brindan funciones de administración de imágenes de contenedores además de ejecutar contenedores.

194f849db1ee0848555470342393c6da.png

El tiempo de ejecución de bajo nivel es el principal responsable de manejar el sistema operativo del host, ejecutar el proceso del contenedor en el host de acuerdo con la imagen del contenedor especificada y administrar todo el ciclo de vida del contenedor. Los tipos comunes de sistemas de ejecución de bajo nivel incluyen:

  • runc: entorno de ejecución tradicional, basado en la tecnología Linux Namespace y Cgroups, que representa la implementación de Docker

  • runv: un entorno de ejecución basado en un hipervisor que aísla contenedores y hosts virtualizando el kernel invitado, aclarando sus límites. Las implementaciones representativas son Kata Container y Firecracker.

  • runsc: runc + safety, que proporciona un entorno de pruebas de tiempo de ejecución de contenedor liviano con aislamiento seguro al interceptar todas las llamadas del sistema de la aplicación. La implementación representativa es gVisor de Google.

Kubernetes aprovecha Docker como herramienta de administración del tiempo de ejecución de contenedores y luego agregó soporte para rkt. Sin embargo, con el vigoroso desarrollo de la tecnología de contenedores, están surgiendo cada vez más herramientas de tiempo de ejecución. Proporcionar soporte para todas las herramientas de tiempo de ejecución es obviamente un proyecto enorme. Si la integración del tiempo de ejecución está integrada directamente en Kubernetes, también será una carga para el código de Kubernetes en sí. Cada actualización debe considerar la compatibilidad y adaptación de todos los tiempos de ejecución del contenedor. Por lo tanto, Kubernetes abstrae el funcionamiento del contenedor en una interfaz y utiliza esta interfaz como puente entre kubelet y las herramientas de tiempo de ejecución. Kubelet inicia y administra el contenedor enviando solicitudes de interfaz, y cada herramienta del contenedor puede acceder implementando esta interfaz. Kubernetes. Esta interfaz de operación de contenedor unificada es la interfaz de ejecución de contenedor (CRI).

Tiempo de ejecución de FaaS

Lambda admite múltiples idiomas mediante el uso de tiempos de ejecución. El sistema de ejecución proporciona un entorno específico del lenguaje para transmitir eventos de invocación, información contextual y respuestas entre Lambdas y funciones. Podemos utilizar el tiempo de ejecución proporcionado por Lambda o crear el suyo propio.

Hay un tiempo de ejecución independiente para cada versión principal del lenguaje de programación, con un identificador de tiempo de ejecución único, como python3.10 o nodejs18.x. Para configurar Function Compute en una nube para usar una nueva versión de idioma principal, debe cambiar el identificador del sistema de tiempo de ejecución. Para funciones definidas como imágenes de contenedor, puede seleccionar el sistema de ejecución y la distribución de Linux al crear la imagen de contenedor. Para cambiar el tiempo de ejecución, debe crear una nueva imagen de contenedor.

Al archivar un archivo .zip como paquete de implementación, debe seleccionar el tiempo de ejecución al crear la función. Para cambiar el tiempo de ejecución, debe actualizar la configuración de Cloud Function Compute. El entorno de ejecución subyacente del servicio en la nube proporciona bibliotecas y variables de entorno adicionales a las que se puede acceder a través del código de función.

El tiempo de ejecución personalizado puede ser un script de shell o un archivo binario ejecutable en Linux.

resumen

Este artículo primero aclara los conceptos centrales del tiempo de ejecución y luego presenta diferentes tipos de entornos de ejecución, incluidas las máquinas virtuales ART y Dalvik de Android, el tiempo de ejecución de iOS, el motor y el entorno de ejecución de JavaScript, el entorno de ejecución de programas pequeños y el tiempo de ejecución de contenedores y el tiempo de ejecución de FaaS de aplicaciones en la nube. Para los tiempos de ejecución de contenedores, aprendimos sobre los tipos comunes de tiempos de ejecución de bajo nivel y cómo Kubernetes admite todos los tiempos de ejecución de contenedores a través de Container Runtime Interface (CRI). Para el tiempo de ejecución de FaaS, describe cómo Lambda admite múltiples idiomas mediante el uso del tiempo de ejecución y proporciona un entorno específico del idioma para transmitir eventos de invocación, información contextual y respuestas entre Lambda y las funciones.

[Lectura relacionada]

Supongo que te gusta

Origin blog.csdn.net/wireless_com/article/details/132398641
Recomendado
Clasificación