пятница, 4 марта 2011 г.

Маниловщина


Иногда очень хочется, чтобы F# был отделен от .NET. Чтобы программы на нем работали под юниксами и виндой без использования тяжелой виртуальной машины. Или, как минимум, все его новшества были портированы в окамл. Уж больно F# хорош!


Однако реализация F# иногда хромает. Например, в нем есть такие костыли как OptimizedClosures.FSharpFunc и FSharpFunc.InvokeFast. На деле это означает, что при вызове функции со многими аргументами задействуется RTTI, чтобы узнать, а есть ли прямой вызов функции, минуя каррирование. Во многом потому, что это снизу .NET. Подозреваю, что в окамле такой вызов функции сильно оптимизирован, и он не использует RTTI.

5 комментариев:

  1. А какие у него новшества по сравнению с кемлом?

    ОтветитьУдалить
  2. Главным образом, вычислительные выражения: comprehension для списков, массивов, ленивых последовательностей, синтаксис для монад типа async. Все это предоставляют вычислительные выражения. Это очень удобно, декларативно, и иногда меняет сам стиль программирования. Для окамла есть какая-то поддержка, но неофициальная.

    Тесная интеграция с последовательностями. Для сравнения можно обратиться к кложуре. Последовательности важны.

    Есть еще активный паттерн-матчинг. В некотором виде он существует еще в скале, но по-моему в F# более общая реализация.

    Мне кажется, что эти вещи вполне можно было бы перенести в окамл.

    ОтветитьУдалить
  3. Активный паттерн-матчинг решается camlp4, см. bitstring, mikmatch, а в общем виде вряд-ли подходит камлю, т.к. скрывает за тупой привычной деконструкцией (с константным рантайм эффектом) произвольный код.

    ОтветитьУдалить
  4. Тесная интеграция с последовательностями есть в батарейках http://ocaml-batteries-team.github.com/batteries-included/hdoc/BatEnum.html. В них же есть comprehension который тоже поддерживает практически любые последовательности, включая и пользовательские модули http://batteries.forge.ocamlcore.org/doc.preview:batteries-beta1/html/extensions.html#comprehension
    Вообще батарейки очень прилично улучшили OCaml.
    Вот асинхронность с поддержкой SMP да так просто не перенесешь :(

    ОтветитьУдалить
  5. Батарейки скачал, но на винде еще не установил. Примеры выглядят интересно.

    Но в F# этот comprehension поддерживает еще и циклы. Фактически while и for офункционаливаются, принимая форму вызова функций. То же происходит с монадами - они также могут работать с циклами. Императивные конструкции в итоге подменяются функциональными. В этом что-то есть философское :)

    ОтветитьУдалить