вторник, декабря 13, 2005

3D шутер на языке Haskell

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


Он в исходниках и, честно говоря, мне было лень что-либо ставить, чтобы их скомпилять, так что в движении я его так и не посмотрела. Написан он с помощью Yampa - по документации "Yampa - это язык, встроенный в Haskell, предназначенный для описания реагирующих систем". В документации по Yampa рассказывается как с его помощью написать Space Invaders.

Вот еще игры на Haskell'е
. Сайт, увы, на японском.
Это, судя по всему, аркада.

А это похоже на паззл.


Думаю, что эти игры вызывают скорее академический, нежели практический интерес. Но все равно, забавно.

По ссылкам с блога GrammerJack: "Arcade Games in Haskell"

16 коммент.:

Анонимный комментирует...

Эммм. Это не паззл, это Reversi.

Анонимный комментирует...

Можно с вами не согласится по поводу функционального программирования? к чему такое пренебрежение?
Просто хочется вспомнить слова Вирта на одном из выступлений, о том, что ооп, это фактически тоже самое, что и было раньше, просто то, что раньше называли переменными стали называть "объектами", фунции - "методами", и что все то, что доступно через ооп, доступно и в функциональном программировании. Просто называется другими терминами. В качестве довода он приводит свой язык - Оберон, который по сути своей функциональный, но имеет все "фишки" ооп, такие как полиморфизм, наследование, инкапсуляция...
=)

Alena комментирует...

Можно с вами не согласится по поводу функционального программирования? к чему такое пренебрежение?
Никакого пренебрежения, ни в коем случае.
Просто хочется вспомнить слова Вирта на одном из выступлений, о том, что ооп,
Не, это совсем не то. Функциональное программирование (Haskell) противопоставляется императивному программированию (C, Pascal). А ООП противопоставляется процедурному программированию (хотя иногда его тоже называют функциональным, но смысл совсем другой).

Анонимный комментирует...

Ну что вы, хаскель чудесный совершенно general purpose язык. Кстати Frag написан одним человеком за небольшое время.
И это не удивительно, учитывая во сколько раз обычно короче на нем получаются программы и насколько много ошибок отлавливается еще на этапе компиляции.

Alena комментирует...

Ну что вы, хаскель чудесный совершенно general purpose язык.

Меня насторожило, что пришлось использовать Yampa плюс ко всему. Документацию я почитала по диагонали , но пока для меня это выглядит как некий хак, с помощью которого можно получить ввод пользователя. Надо будет еще с этим поразбираться, вообще интересно...

И это не удивительно, учитывая во сколько раз обычно короче на нем получаются программы и насколько много ошибок отлавливается еще на этапе компиляции.

Угу, про это много говорится на haskell.org.

Анонимный комментирует...

так yampa - это всего лишь библиотека типов и комбинаторов для FRP (functional reactive programming) - не более. Суммарный объем .hs файлов в afrp.tar.gz - 96k вместе с комментариями.
http://haskell.org/yampa/AFPLectureNotes.pdf
и вот еще интересный документ тех же авторов (там прослеживаются те же идеи): http://www.cs.pdx.edu/~apt/cs457/hudak-jones.pdf

reductor комментирует...

Здравствуйте, Алена. Это я написал 2 последних анонимных комментария
Сейчас девиртуализируюсь, чтобы сказать, что если интересно, то я здесь начал блог по языкам программирования (функциональным в т.ч) и особенно хаскелю здесь: http://y-combinator.blogspot.com/.
Там правда пока не очень много информации и я стараюсь объяснять все как можно более популярно и с минимумом сложных деталей, но..
Ну и еще мне можно задавать вопросы, если они есть, я буду рад ответить.
Не сочтите за спам :)

Alena комментирует...

Не сочтите за спам :)
Ну какой же это спам, очень в тему :-). Сама почитаю с удовольствием.

Анонимный комментирует...

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

У примитивненького C++ тоже есть некие зачатки таких возможностей - темплейты и перегрузка операторов, но сообщество пользователей C++ правильных привычек у себя не выработало (те, кто вырабатывает, уходят к функциональщикам), и от того эти возможности не очень то эффективно используются (да и не развиваются).

Читать стоит вот тут: http://lambda-the-ultimate.org/

Анонимный комментирует...

У примитивненького C++ тоже есть некие зачатки таких возможностей - темплейты и перегрузка операторов, но сообщество пользователей C++ правильных привычек у себя не выработало (те, кто вырабатывает, уходят к функциональщикам), и от того эти возможности не очень то эффективно используются (да и не развиваются).

Нехилый наезд. Уважаемый Anonymous, если Вам нетрудно прокомментируйте почему вы считаете С++ примитивным, какие есть альтернативы и в чём конкретно преимущество этих алтернативных языков над С++.

Анонимный комментирует...

Привет всем.
Ребяяята..
Ну не надо сориться!
C++ и например lisp нельзя сравнивать, это то же самое что сравнивать вертолет и самолет (удачная ли метафора?).
То, что самолет быстрее летит чем вертолет не умаляет возможностей последнего.
Почему бы не принимать разные способы, достижения результата.
Свобода выбора, это же хорошо.
Везде свои критерии, свои ценности и цели.

Анонимный комментирует...

Уважаемый Anonymous, если Вам нетрудно прокомментируйте почему вы считаете С++ примитивным

C++ примитивен, поскольку:

a) плохо формализованная и кривая система типов

b) крайне хреново спроектированные средства метапрограммирования

c) полное отсутствие общей философии дизайна языка

Альтернатив - полно. Собственно, нет такой задачи, для которой C++-у не нашлось бы гораздо более адекватной альтернативы. Я вообще не понимаю тех, кто использует этот ущербный язычок, если честно.


C++ и например lisp нельзя сравнивать

Можно, можно. Оба претендуют на роль универсальных мультипарадигмный языков. Только Лисп претендует успешно, а C++ - убого. Теоретически ниша у них одна, так что как раз их то и надо сравнивать. Вот C++ и Haskell таки нельзя сравнивать, их области применимости не пересекаются.

Анонимный комментирует...

1. Про "встроенные" языки лучше читать здесь http://martinfowler.com/articles/languageWorkbench.html
и здесь http://www.martinfowler.com/bliki/DomainSpecificLanguage.html
2. Увы, функцинальные языки не являются более успешными в рыночном смысле. Хотя, конечно, являются - в смысле функциональности (в смысле - юзабельности).
3. Объектную парадигму не противопоставляют структурной, ООП является развитием последней.
А вот функциональщина, да - полная противоположность императивщине.

Alena комментирует...

Увы, функцинальные языки не являются более успешными в рыночном смысле. Хотя, конечно, являются - в смысле функциональности (в смысле - юзабельности).

Только что вычитала у Джэла Спольски: "Не понимания функциональное программирование, вы никогда не изобретете MapReduce - алгоритм, благодаря которому у Гугла такая масштабируемость".
Функциональное программирование хорошо тем, что развивает мозг.

Анонимный комментирует...

Никак сам Луговский пожаловал в уютный бложек Алёны ^^

XSet комментирует...

Товарищ прав, С++ страшен и убог, не смотря на то что он большой. Он плохо продуман и в итоге наслоения костылей достигли невиданных масштабов.

То что на на Лиспе или ином метаязыке делается средствами самого языка в C++ постоянно пытаются залепить костылями, в последний раз придумали constexpr, это же кошмар на что способны люди (метапрограммирование на шаблонах нервно курит в сторонке в сравении с новыми "пользовательскими литералами"), лишь бы не делать нормальные макры. В Лиспе макры можно отлаживать, всяко разворачивать и т.п., а С++ компилятор тупо делает свою работу, вмешаться в неё никак нельзя и доработать языковые средства для построения DSL очень сложно.