Сокращается ли Solidity до LLL в процессе его компиляции в байт-код EVM?
Глядя на репозиторий Github компилятора Solidity, я вижу, что в проект также интегрирован LLL-компилятор.
Это заставило меня задуматься, не уменьшается ли Solidity до LLL в процессе компиляции в байт-код EVM?
Я читал, что LLL служит оболочкой для EVM ASM, так что было бы разумно скомпилировать Solidity в LLL?
Или компилятор LLL просто включен как часть проекта Solidity, потому что он слишком мал, чтобы служить проектом сам по себе?
2 ответа
Вопреки предыдущему ответу, правильный ответ - нет. Компилятор солидности компилирует код солидности непосредственно в EVM. Существует промежуточный язык для солидности, который называется Юлия, и это то, что на самом деле принято assembly{}
блоки, но это еще не разработано до такой степени, что код Джулии генерируется из кода солидности. Компилятор LLL включен в хранилище солидности в основном по историческим причинам.
На самом деле у меня такой же вопрос, но я думаю, что ответ - да! В Солидности вы можете использовать сборочный сегмент
assembly {
// LLL OR OPCODES HERE
}
Где вы можете написать код, как вы делаете в LLL, с тем же синтаксисом и довольно дешевой стоимостью GAS, по крайней мере, 30% в моем опыте.
pragma solidity ^0.4.24;
/*
Autor: Javier Guajardo J.
Website: https://ethereumchile.cl
Twitter: @EthereumChile
*/
contract Assembly {
function returnSum1(uint a, uint b) public pure returns (uint sum) {
// We ADD a and b in a new variable called doSum
assembly {
let doSum := add(a, b)
sum := doSum
}
}
function returnSum2(uint a, uint b) public pure returns (uint sum) {
// OR you can ADD a and b directly
assembly {
sum := add(a, b)
}
}
function returnSum3(uint a, uint b) public pure returns (uint) {
// OR you can ADD a and b into 0x40 memory address
assembly {
let sum := mload(0x40) // loading 0x40 address memory
mstore(sum, add(a, b)) // We store the add(a, b) in 0x40 address memory
return(sum, 32) // We return result.
}
}
}
Результат в Remix IDE