Разработка программ в среде операционной платформы Inferno


Dis, ассемблер


Виртуальная машина Dis представляет собой среду выполнения для программ, запущенных в Inferno. В общем, Dis - это программный процессор CISC-подобного типа, трехоперандная машина с архитектурой "память-в-память". Limbо-программы компилируются в байт-код (промежуточное представление) Dis. Когда программа загружается в память для выполнения, байт-коды транслируются в более эффективный формат для выполнения. Формат этот - поток команд ассемблера Dis. Код Dis может либо интерпретироваться посредством C библиотеки в системные вызовы ОС-хозяина, либо компилироваться опциональным on-the-fly (just-in-time, JIT) компилятором в "родной" машинный код используемого аппаратного обеспечения. Архитектура "память-в-память" по существу бесконечная регистровая машина, со множеством регистров равным количеству "слов" в памяти, что упрощает on-the-fly компиляцию на большинство современных целевых процессоров. Команды Dis великолепно соответствуют архитектурному набору процессорных команд, вследствие чего результирующий код по скоростным характеристикам не уступает скомпилированному C.

Несмотря на то что изучение нового языка, к тому же такого не тривиального как Dis, является весьма полезным занятием, именно этот язык осваивать нет особой необходимости. Есть удобный Limbo с поразительными скоростными характеристиками и прочими свойствами, которые буквально заставляют побрезговать ассемблером. Кроме того, (в основном из-за вышеуказанной причины) в системе отсутствует Limbo версия ассемблера, наличествует лишь гостевая команда, которая заставляет желать лучшего.

Все же хотя бы проиллюстрировать язык виртуальной машины мы можем (представленный далее код получен в результате дизассемблирования программы Targ1):

lea 8(mp), 56(fp) load 0(mp), 56(fp), 36(mp) lenl 36(fp), 48(fp) newcw 44(fp) frame $1, 56(fp) movp 44(fp), 32(56(fp)) spawn 56(fp), $20 movw $0, 40(fp) bgew 40(fp), 48(fp), $19 frame $2, 52(fp) movp 4(mp), 32(52(fp)) movw 40(fp), 36(52(fp)) headp 36(fp), 40(52(fp)) lea 56(fp), 16(52(fp)) mcall 52(fp), $0, 36(mp) tail 36(fp), 36(fp) recv 44(fp), 52(fp) addw $1, 40(fp) jmp $8 ret mframe 36(mp), $1, 36(fp) movw $1000, 32(36(fp)) lea 40(fp), 16(36(fp)) mcall 36(fp), $1, 36(mp) send $1, 32(fp) jmp $20



Содержание раздела