Top.Mail.Ru
? ?

Entries by tag: vm

Чуть менее, чем все виртуальные машины, которые я встречал и делал, были стековыми или регистровыми. В первом случае у нас есть некий стек значений, в него можно складывать всякие константы, а разные операции берут из него значения, проводят над ними какие-то действия, и результат кладут вместо взятых. При этом большинство команд в байткоде не имеют аргументов, т.к. их аргументы уже лежат на стеке, будучи положены туда другими командами. Соответственно, даже простые действия представляются целой серией операций (положить в стек один аргумент, положить другой, совершить действие...), и все время туда-сюда изменяется stack pointer, в простейшем случае - индекс в массиве. В случае регистровых ВМ у нас есть массив регистров, а у команд есть аргументы, указывающие из каких регистров брать исходные значения и куда сохранять результат операции. Количество операций, необходимых для совершения тех же действий, у регистровой ВМ меньше, но если мы хотим иметь вызовы функций, особенно рекурсивных, то возникают отдельные сложности - нужно или сохранять нужные регистры на стеке, или иметь целый стек регистровых массивов.

Виртуальная машина, которая использовалась у меня до этого момента, и в код которой компилился тот DSEL на Руби, была регистровой, причем вообще без стека. Все функции там инлайнились, а рекурсивные функции не поддерживались. Выделением памяти она тоже не занималась - все необходимые буферы должны были быть выделены вызывающей программой и переданы через регистры. Такие ограничения создавали ряд неудобств, поэтому было решено, что в LeoVM нужен какой-то стек и какое-то управление памятью. Read more...Collapse )

Tags:

В предыдущем посте изначально проигрывавший сиплюсплюсу Окамл после одной оптимизации интерпретатора стал С++ немного обгонять, а после второй - еще сильнее. Как справедливо заметили читатели, те же оптимизации можно сделать и в С++. Вторая делается элементарно, а вот первая требует наличия замыканий и оптимизации хвостовой рекурсии. Только что попробовал сделать закат солнца вручную - первый прием с замыканиями реализовал на С++ в лоб, представив замыкания объектами.

Update: это НЕ попытка предложить оптимальный способ интерпретации. Это только попытка напрямую перенести на С++ прием из предыдущего поста.

Кода получилось намного больше:
Read more...Collapse )
Зато скорость возросла в 1,3 раза. Результат быстрее, чем аналогичный вариант на Окамле после первой оптимизации. Что и понятно - т.к. С++ есть кроссплатформенный ассемблер с рюшками, на нем можно повторить почти все, просто нередко, как в данном случае, это потребует кропотливого мартышкиного труда, который в случае более высокоуровневых языков берет на себя компилятор. А т.к. оптимизатор в Окамле почти никакой, аналог на С++ получается быстрее.
Несколько дней назад закончилось соревнование ICFP Contest 2009, мой небольшой отчет об участии в котором можно почитать здесь. Там в задании была описана несложная виртуальная машина, на которой запускались данные организаторами программы для моделирования орбитальной механики. Тут я расскажу, как, используя возможности функционального языка программирования, можно заметно ускорить интерпретатор.

Profile

office
thedeemon
Dmitry Popov

Latest Month

April 2026
S M T W T F S
   1234
567891011
12131415161718
19202122232425
2627282930  

Syndicate

RSS Atom

Comments

  • thedeemon
    7 Apr 2026, 19:22
    Спасибо, мне интересно! При случае напишу про ЯП хобби-проект, в котором я участвую, но там до системы типов дело ещё не дошло; я довольно мало времени в неделю ему посвящаю, увы.
  • thedeemon
    6 Apr 2026, 19:20
    Да, сейчас сделано на Racket, но планируется версия на самом себе с компиляцией в WebAssembly.
  • thedeemon
    6 Apr 2026, 19:19
    Функциональный язык с хаскелеподобным синтаксисом, статической типизацией, выводом типов, но не чистый: никаких монад и приседаний для эффектов. Свобода действий в духе Окамла или F#: захотел сделать…
  • thedeemon
    6 Apr 2026, 19:04
    А, на Racket, наверно. Я послал приглашение присоедениться на LinkedIn - на всякий случай.
  • thedeemon
    6 Apr 2026, 18:55
    Здорово - глядя на do-нотацию, наверно - some kind of pure functional, с хорошим type inference? Транслируется в Python или Swift, а на чём транслятор написан? Подожду описания!
Powered by LiveJournal.com
Designed by Lilia Ahner