In this flexible architecture, the JavaScript interpreter can run anywhere. Typically, the interpreter runs on a thread inside the native app on the device or emulator. However, during remote debugging, the JavaScript code can run in the developer's browser (see the "Powerful tools, instant gratification" section). Time-consuming tasks such as image decoding, disk I/O, and layout can also be farmed out to other worker threads, fully taking advantage of the parallelism offered by the multicore CPUs available on modern mobile devices.