суббота, 3 марта 2012 г.

Вернулся из спячки

Что-то я давно ничего не писал. Буду исправляться.

За последнее время я слегка разочаровался в F# и находился в неком поиске себя и тех инструментов, которые мне было бы интересно изучить и использовать.

Наверно стоит сказать пару слов почему я отказался от F#.


  • Плохой компилятор. В общем то всё хорошо, но дьявол кроется в мелочах. И одна из этих мелочей -  rec. Нет, он честно раскрывается в цикл, когда может, вот только когда функция чуть побольше пары строк, то уследить за тем, чтобы все рекурсивные вызовы были правильно сделаны не всегда получается. Ну и следовательно приходится ловить StackOverflow exception в рантайме. Не весело в общем.
  • Синтаксис. Да он кажется красивым, но это ровно до того момента, пока ты не пишешь чего-либо больше сотни строк (и не вылизываешь их по пол дня). А чем больше кода, тем стремительнее он пытается превратиться в кашу. Из этого следуют две следующие проблемы.
  • Выразительность кода на F# иногда может сыграть с программистом в довольно плохую шутку. Выразительность усложняет код, т.е. вносить правку в F# код значительно сложнее, чем в C/C++/C#/python код. Не потому, что сложнее написать пару символов, а потому что приходится дольше вникать в кусок кода, чтобы понять, где нужно поправить.
  • Синтаксис F# сложен, при этом в компиляторе есть косяки и не все заявленные в том же MSDN фичи работают + проблемы с автовыводом типов (приходится иногда ручками прописывать, либо изменять код на аналогичный, но для которого типы выводятся). Это заставляется писать более "грязный" код.
В общем и целом я отношусь к F# положительно, но пока буду ждать, как будут развиваться компилятор и среда разработки под него. 

Ах да, на НГ игрался с Mailbox + ZMQ, получилось забавно, хотя пришлось дополнительно использовать стандартные Thread для запуска ZMQ сокетов, т.к. Mailbox довольно мутно рулит потоками и, по умолчанию, должен использовать однопоточную обработку сообщений.


В любом случае сейчас я с .Net и C#/F# не работаю. Пересел на Java + Clojure и раскуриваю Gephi и gephi-toolkit, хотя качество документации к ним не фонтан. Первые пробы Clojure оказались довольно неплохи. Важным оказалось то, что после F# я смог быстро адаптироваться к recur. Что же, попробую заставить себя перевести https://github.com/gephi/gephi-toolkit-demos на Clojure, главное чтобы запала хватило :)

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

  1. Я тут у Вас не местный, но всё-таки.
    Удостоверяться в tail rec calls просто. Достаточно делать так, чтобы в каждой ветке ЯВНО прописывался ПОСЛЕДНИМ. Причём не инструкцией последней, а последним словом:
    вместо trFactorial (x - 1) (acc * x)
    писать
    (x - 1) (acc * x)
    |> trFactorial

    Или классический Seq.unfold.

    Don Syme давно думает о том, как сделать атрибут, которым можно было бы помечать метод. И компилятор падал бы, если у него не получился tail rec.

    ОтветитьУдалить
  2. Ну это больше на хак смахивает и противоречит самой идее синтаксического сахара. Вот атрибут - это да, было бы хорошо, было бы здорово, если бы его ввели в F# 3.0.

    ОтветитьУдалить
  3. После некоторый привычки функция автоматом получаютс хвосторекурсивные, а если алгоритм не хвостовой то в параметры добавляется continuation.
    Вопрос вникания тоже решается с опытом, после F# код на C# выглядит кашей которую никак не исправить.
    Необходимость понимать алгоритм вывода типов к плюсам отнести конечно нельзя, но спасет, что алгоритм довольно прост.
    Про mailbox сложно сказать сраху, но возможно решением было бы запускать async из обработчика сообщения.

    ОтветитьУдалить
  4. > Вопрос вникания тоже решается с опытом, после F# код на C# выглядит кашей которую никак не исправить.

    Сильно зависит от кода на F# и C#. И там и там можно наворотить ужаса.

    > Про mailbox сложно сказать сраху, но возможно решением было бы запускать async из обработчика сообщения.

    Так не всегда можно сделать. Я использовал связку mailbox + ZeroMQ. Вот только на сокеты ZMQ накладывается ограничение по потоку и async там не вариант + слушать то сокет надо. Засунуть сообщение в mailbox просто, а вот передать ответ от mailbox в сокет - чуть труднее и требует костыля.

    ОтветитьУдалить
  5. Без кода тут не разобрать.

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