FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Revertir números mágicos matemáticamente
Buenas, he visto que los compiladores pueden optimizar las divisiones con constantes, por ejemplo, si divides entre 9 al optimizar se vería algo así:
Código PHP:
He encontrado informacion en inglés y con un nivel de matemáticas que no comprendo y que el inglés no me ayuda porque no sé mucho. Hasta ahora hago algo como: (2^(32+s))/M=D D es divisor s es el valor de desplazamiento lógico M es el número mágico . Esto funciona pero no para todos, por ejemplo con el 62, 63, 70... Dónde esa formula no sirve y el compilador no hace lo mismo y hace algo así por ejemplo para el 63: Código PHP:
¿Alguien que entienda y pueda ayudarme? Última edición por aguml fecha: 04-01-2021 a las 22:34:15. |
#2
|
||||
|
||||
Esto tiene 2 niveles: Como hace un compilador para optimizar el codigo, y como se optimiza una formula matematica.
Con las matematicas soy un asco, asi que la segunda parte la dejo para otro, pero la primera si se. Empezemos con la forma mas "simple" de hacer esto: Compila a Pascal/C/Rust/webAssembly y deja que su compilador se encarge del asunto. Un compilador/interprete se construye como una secuencia de "passes/pasos". La mas simple es "lexing -> AST formation -> code/assembler generation". Pero entre cada pasos(pass) puedes meter otros pasos. Entre ellos se introducen los pasos de optimizacion, los mas comunes: https://www.geeksforgeeks.org/code-o...mpiler-design/ Estos "pasos" son simplemente REESCRITURAS AL AST, osea, transformar un arbol a otro. Hay 2 pasos en especial que son utiles: Constant folding y Compile Time Evaluation (y desugaring, que no es un paso concreto, mas bien una tecnica general). Te pongo un ejemplo concreto usando Rust que es donde mas he trabajado esto. Nuestro lenguaje: Sabe sumar y usar variables predefinidas Puedes ejecutarlo sin instalar Rust aqui (con codigo completo): https://play.rust-lang.org/?version=...1586db6affd7fa Código PHP:
Ahora el lio: Código PHP:
Al ejecutar, veras la traza de operacion de como se toca todos los nodos del AST y se evalua en runtime a + b. Asi que hacemos: Constant folding Buscar que vbles son realmente constantes + Compile time evaluation Ejecutar al compilar el AST + Desugaring Transformar una operacion en otra, en este caso: convertir un paso a + b -> 1 + 2 -> 3, osea desugaring es el termino generico de todo esto. Esto en este caso es tan simple como: Código PHP:
Al ejecutar, veraz que en "println!("{:?} = {:?}", &ast, eval(&variables, ast.clone()));" ast se ha transformado en 3.
__________________
El malabarista. Última edición por mamcx fecha: 05-01-2021 a las 15:58:32. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Suma de números pares que hay entre dos números | Daniel2622 | Lazarus, FreePascal, Kylix, etc. | 21 | 26-04-2017 22:47:29 |
Tablas de multiplicar para todos los números entre dos números | Daniel2622 | Lazarus, FreePascal, Kylix, etc. | 3 | 22-04-2017 00:47:59 |
Comparar 2 numeros | jzginez | OOP | 6 | 18-02-2010 01:41:11 |
Revertir numeros | Jose Meneses | Varios | 4 | 23-04-2009 00:01:25 |
¿Cómo pintar un círculo matemáticamente? | aeff | Varios | 11 | 12-01-2009 01:06:05 |
|