1) Поддерживают ли Python, Ruby или Haskell истинную многопоточность?
Это не имеет ничего общего с языком. Это вопрос аппаратного обеспечения (если на машине только 1 процессор, просто физически невозможно выполнить две инструкции одновременно), операционной системы (опять же, если ОС не поддерживает истинную многопоточность, ничего не происходит вы можете сделать) и язык реализации / двигатель исполнения.
Если спецификация языка явно не запрещает или не обеспечивает истинную многопоточность, это не имеет абсолютно никакого отношения к языку.
Все языки, которые вы упомянули, а также все языки, которые были упомянуты в ответах, имеют несколько реализаций, некоторые из которых поддерживают истинную многопоточность, некоторые нет, а некоторые встроены поверх других механизмов исполнения, которые могут поддерживать или не поддерживать истинную многопоточность.
Взять, к примеру, Руби. Вот только некоторые его реализаций и моделей потоков:
- МРТ: зеленые нити, нет настоящей многопоточности
- YARV: потоки ОС, нет многопоточности
- Rubinius: потоки ОС, истинная многопоточность
- MacRuby: потоки ОС, истинная многопоточность
- JRuby, XRuby: потоки JVM, зависят от JVM (если JVM поддерживает истинную многопоточность, то JRuby / XRuby также делает, если JVM не поддерживает, тогда с этим ничего не поделать они не могут сделать она)
- IronRuby, Ruby.NET: точно так же, как JRuby, XRuby, но в CLI вместо JVM
См. Также мой ответ на другой похожий вопрос о Ruby . (Обратите внимание, что этому ответу больше года, а некоторые уже не точны. Например, Рубиниус теперь использует действительно параллельные собственные потоки, а не действительно одновременные зеленые потоки. Кроме того, с тех пор несколько новых Появились реализации Ruby, такие как BlueRuby, tinyrb, Ruby Go Lightly, Red Sun и SmallRuby.)
Аналогично для Python:
- CPython: собственные потоки, нет многопоточности
- PyPy: нативные потоки, в зависимости от механизма исполнения (PyPy может работать нативно, либо поверх JVM, либо над CLI, либо поверх другого механизма исполнения Python. Всякий раз, когда Базовая платформа поддерживает настоящую многопоточность, PyPy тоже.)
- Unladen Swallow: собственные потоки, в настоящее время нет многопоточности, но исправление планируется
- Jython: потоки JVM, см. JRuby
- IronPython: потоки CLI, см. IronRuby
Для Haskell, по крайней мере, Glorious Glasgow Haskell Compiler поддерживает настоящую многопоточность с собственными потоками. Я не знаю о UHC, LHC, JHC, YHC, HUGS или обо всех остальных.
Для Erlang и BEAM, и HiPE поддерживают истинную многопоточность с зелеными нитями.
2) Если программа содержит потоки, будет ли виртуальная машина автоматически назначать работу нескольким ядрам (или физическим процессорам, если на материнской плате более 1 процессора)?
Опять же: это зависит от виртуальной машины, операционной системы и оборудования. Кроме того, некоторые из реализаций, упомянутых выше, даже не имеют виртуальных машин .