Сокращается ли 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

Screencapture.png Сборка в солидности Хавьера Гуахардо

Другие вопросы по тегам