Optimizador de solidez vs optimizador LLVM

Al observar el código evmjit , noté que el optimizador LLVM en realidad se usa justo antes de la ejecución de un contrato por parte de la máquina virtual. También noté que el compilador de Solidity tiene su propio optimizador que optimiza el código de bytes.

Por lo tanto, me preguntaba... ¿cuál es el beneficio de tener un optimizador de código de bytes en el compilador de Solidity frente a confiar completamente en el optimizador LLVM en la máquina virtual?

Respuestas (2)

Independientemente de cómo se ejecute un contrato, lo que importa es la contabilidad de la EVM.

El protocolo no sabe si está ejecutando un contrato en x86, ARM7, 6502 o lápiz y papel. Lo que sí sabe es cuánto cuesta cada paso en el EVM, que es lo mismo independientemente. La optimización de Solidity, al optimizar el código de nivel EVM, abarata los contratos en gas . Cualquier optimizador del lado del cliente abarata los contratos en recursos informáticos físicos .

Eso es lo que pensé inicialmente. Sin embargo, entiendo que el gas se calcula realmente en tiempo de ejecución (a medida que se ejecuta el contrato) y el EVM inyecta funciones de gas en el llvm-ir. Entonces, esencialmente, y corríjame si me equivoco, una optimización de llvm podría tener un impacto directo en el gas al igual que una optimización de bytecode en el compilador de Solidity. Sin embargo, veo que dicha optimización en llvm podría ser más compleja de implementar, ya que las operaciones ahora son mucho más detalladas... así que mi hipótesis en este momento es que es por eso que hay dos optimizadores. Tiene sentido ?
No estoy seguro de cómo funciona el JIT en este caso particular, pero no obstante: cualquier optimización del lado del cliente aún no puede afectar el gas utilizado, porque el EVM es el mismo para todos, independientemente de cómo lo implementen. Piénselo de esta manera: un cliente optimizado y uno sin optimizador (o uno diferente) deben obtener el mismo resultado para la ejecución de una transacción, o la cadena de bloques se bifurcaría entre ellos.
Versión simple: Solidity Optimizer reduce el uso de gas, mientras que el optimizador LLVM reduce el costo de ejecutar un nodo

Mi conclusión sobre esto es que definitivamente es posible realizar la misma optimización en LLVM durante la ejecución y reducir Gas en teoría . Sin embargo, este es probablemente un problema intratable en la práctica debido a la naturaleza del LLVM IR, es decir, es un nivel demasiado bajo para este trabajo. Se necesita una abstracción del compilador diferente para que dichas optimizaciones sean más fáciles de implementar y más sólidas, y el compilador de Solidity hace exactamente eso. Sin embargo, el IR del optimizador Solidity no me parece bien definido y más bien ad-hoc. Me preguntaba si hay un plan para mejorar eso en el futuro y crear un optimizador que permita módulos de optimización de terceros (similares a LLVM).