Implementando loops Brainfuck em um intérprete

Eu quero construir um intérprete Brainfuck (Droga, esse nome) na minha linguagem de programação recém-criada para provar que ela é completa.

Agora, tudo está claro até agora (<>+-,.) - exceto uma coisa: os loops ([]) Presumo que você conheça a sintaxe BF (extremamente difícil) daqui em diante:

Como implemento os loops BF no meu intérprete?

Como seria o pseudocódigo? O que devo fazer quando o intérprete atingir um início de loop ([) ou um final de loop (])?

Verificar se o loop deve continuar ou parar não é o problema (current cell==0), mas:

Quando e onde devo verificar?Como saber onde está localizado o início do loop?Como lidar com loops aninhados?

Como os loops podem ser aninhados, suponho que não posso apenas usar uma variável que contém a posição inicial do loop atual.

Eu já vi intérpretes de BF muito pequenos implementados em vários idiomas. Gostaria de saber como eles conseguiram fazer os loops funcionarem, mas não conseguiram descobrir.