?

Log in

No account? Create an account

Previous Entry | Next Entry

Language with a Bright future

В начале мая в логове фейсбука прошла конференция DConf, посвященная языку D. Финансировали ее всем миром через проект на кикстартере, я там тоже поучаствовал скромным спонсором. Видео всех выступлений были выложены на ютюбе, вот наиболее мне понравившиеся, которые могу порекомендовать всем тем, кто открыт к новому и имеет немного любопытства:

1. Web Development in D - какие есть замечательные инструменты (в первую очередь vibe.d), как с ними все получается просто и красиво (и эффективно), благодаря грамотному использованию возможностей D.
2. Writing Testable Code in D - тут больше демонстрация умений и удобств языка.
3. Metaprogramming in the Real World - занятный experience report от компании с сотней программистов, где весь код пишется на D.

Tags:

Comments

( 41 comments — Leave a comment )
ex_juan_gan
Aug. 24th, 2013 02:21 pm (UTC)
Секретный язык. На accu один раз был доклад, а так всё в тайне. Митап бы организовали, что ли...
tretiy3
Aug. 24th, 2013 05:40 pm (UTC)
как вам кажется: D, Rust или Go?
thedeemon
Aug. 25th, 2013 03:19 am (UTC)
Go как язык наиболее идиотский, зато реализация из этих трех самая стабильная и отлаженная.
Rust выглядит наиболее обещающим и перспективным, но он сейчас наиболее недоделанный, все время там все ломают и переделывают.
D находится где-то между ними: как язык довольно приятен, реализации более-менее юзабельные, но есть еще недоделки.
Из этих трех мой выбор сейчас - D.
(no subject) - tretiy3 - Aug. 25th, 2013 03:56 am (UTC) - Expand
chaource
Aug. 25th, 2013 05:29 am (UTC)
Я посмотрѣлъ еще заключительный докладъ Александреску. Онъ сказалъ правильную вещь - во всѣхъ учебникахъ по ФП даются какъ первые примѣры три алгоритма - факторiалъ, Фибоначчи, и сортировка - которые изъ-за отсутствiя tail recursion работаютъ совершенно непрiемлемо, а вставить tail recursion означаетъ сильно усложнять изложенiе. Его рѣшенiе - допускать императивность внутрь чистыхъ функцiй - однако же мнѣ кажется педагогически неправильнымъ, т.к. оно не объясняетъ, что такое ФП. Я думаю, правильнымъ было бы вообще не использовать рекурсiю тамъ, гдѣ можно использовать библiотечныя функцiи типа fold/map/zip, т.е. опрѣделять факторiалъ какъ map (*) (seq 1 n), Фибоначчи черезъ zip, и т.д. Вообще можно рекурсiю запрѣтить, оставить только fold/map/zip - для программированiя этого будетъ почти всегда достаточно.
thedeemon
Aug. 25th, 2013 06:33 am (UTC)
Верно. Я думаю, ему просто хотелось продемонстрировать D'шный подход к чистоте. Если использовать комбинаторы из стандартной библиотеки, можно было написать
long fac(long n) { return iota(1,n+1).reduce!"a*b"; }
alexeyk77
Aug. 25th, 2013 05:53 am (UTC)
а по скорости компиляции, как соотносится с плюсами?
thedeemon
Aug. 25th, 2013 06:21 am (UTC)
На порядки быстрее, по крайней мере у основного компилятора - DMD. Эту фичу все перешедшие с плюсов особенно отмечают.
xeno_by
Aug. 28th, 2013 03:42 am (UTC)
Насчет CTFE. Какой есть хороший туториал на эту тему? Насколько полезна эта фича на практике? Спикер говорит, что у них в конторе почти никто ее не юзает. Почему?
thedeemon
Aug. 28th, 2013 02:14 pm (UTC)
Туториал на эту тему сейчас не припомню.

С вызовом функций в компайл-тайме на практике редко сталкиваешься, т.к. все интересные данные программа получает уже в рантайме, а при компиляции какие данные есть? Собственные исходники разве что, так что фича эта в основном используется внутри всяких шаблонов, генерирующих код. Чтобы код удобно было генерить, нужна работа со строками, массивами и основные алгоритмические штуки из стандартной библиотеки, вот они и используются. Т.е. в целом фича, может, и мегакрутая, но замечают это лишь библиотекописатели, а при написании обычных программ ее и не замечаешь, даже если где-то внутри используемых библиотек она и работает активно.
(no subject) - xeno_by - Aug. 28th, 2013 02:16 pm (UTC) - Expand
(no subject) - thedeemon - Aug. 28th, 2013 02:29 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 02:30 pm (UTC) - Expand
xeno_by
Aug. 28th, 2013 03:44 am (UTC)
Да и вообще, как народ юзает МП в D? Какие самые типичные юзкейсы?
thedeemon
Aug. 28th, 2013 02:04 pm (UTC)
Заметные примеры - регекспы и PEG-парсер, которые подготавливаются и оптимизируются в компайл-тайме.

Типичные же юзкейсы - это получить на вход некоторый заранее неизвестный тип Т, используя развитую компайл-тайм рефлексию разузнать, подходит ли он и что он умеет, и на выходе родить новый тип R, сохраняющий или преобразующий полезные свойства Т и делающий что-то свое. Например, так комбинаторы map/take/reverse/zip и т.п. сохраняют такие свойства переданных в них последовательностей как "известная длина", "клонируемость", "доступ по индексу за О(1)" и т.д. Или, например, берется на вход некоторый класс и возвращается его аналог, где методы превратились в RPC вызовы или наоборт обработчики RESTful запросов. Вся рефлексия и рождение кода происходят при компиляции, рантайм-оверхед нулевой.

Ну и всевозможная сериализация-десериализация, конечно.


Edited at 2013-08-28 06:06 pm (UTC)
(no subject) - xeno_by - Aug. 28th, 2013 02:08 pm (UTC) - Expand
(no subject) - thedeemon - Aug. 28th, 2013 02:19 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 02:09 pm (UTC) - Expand
(no subject) - thedeemon - Aug. 28th, 2013 02:55 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 02:14 pm (UTC) - Expand
(no subject) - thedeemon - Aug. 28th, 2013 02:37 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 02:49 pm (UTC) - Expand
(no subject) - thedeemon - Aug. 28th, 2013 03:21 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 03:39 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 29th, 2013 05:14 am (UTC) - Expand
(no subject) - thedeemon - Aug. 29th, 2013 08:34 am (UTC) - Expand
(no subject) - xeno_by - Aug. 29th, 2013 11:21 am (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 02:29 pm (UTC) - Expand
(no subject) - thedeemon - Aug. 28th, 2013 03:08 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 28th, 2013 03:35 pm (UTC) - Expand
(no subject) - xeno_by - Aug. 29th, 2013 04:25 am (UTC) - Expand
fi_mihej
Aug. 28th, 2013 03:15 pm (UTC)
Неожиданно: D в контексте метапрограммирования и ФП. Да еще и с такими вкусными фичами, как преобразование класса для работы с RPC и REST. Крутотенечка!
А я-то, грешным делом думал, что он сдох давно.

Edited at 2013-08-28 07:16 pm (UTC)
wizzard0
Aug. 28th, 2013 08:30 pm (UTC)
отлично! еще хочу ;)
xeno_by
Sep. 8th, 2013 06:37 am (UTC)
Слушай, а как у МП в D обстоят дела с порядком применения метапрограмм?

Например, вот в этом случае могут ли раскрываемые шаблоны видеть мемберы класса C и какие именно мемберы они увидят:
class C {
  int x;
  mixin(genJsonSerializable!C); // перебирает мемберы и создает метод toJson
  mixin(genXmlSerializable!C); // перебирает мемберы и создает метод toXml
  int y;
}
thedeemon
Sep. 8th, 2013 02:29 pm (UTC)
Обстоят удивительным образом. Оба миксина увидят все четыре мембера. Тестовый пример:
mixin template ToJSON(C)
{
    void toJSON()
    {
        enum mbs = [__traits(allMembers, C)]; // compile-time created array 
        writeln(mbs);
    }
}

mixin template ToXML(C)
{
    void toXML()
    {
        enum mbs = [__traits(allMembers, C)];
        writeln(mbs);
    }
}

class X {
    int x;
    mixin ToJSON!X;
    mixin ToXML!X;
    int y;
}

void main(string[] argv)
{
    auto x = new X;
    x.toJSON;
    x.toXML;
}

Выводит:
["x", "toJSON", "toXML", "y", "toString", "toHash", "opCmp", "opEquals", "Monitor", "factory"]
["x", "toJSON", "toXML", "y", "toString", "toHash", "opCmp", "opEquals", "Monitor", "factory"]
(no subject) - xeno_by - Sep. 8th, 2013 04:39 pm (UTC) - Expand
(no subject) - thedeemon - Sep. 8th, 2013 11:55 pm (UTC) - Expand
(no subject) - xeno_by - Sep. 8th, 2013 06:44 pm (UTC) - Expand
(no subject) - thedeemon - Sep. 8th, 2013 11:52 pm (UTC) - Expand
(no subject) - xeno_by - Sep. 9th, 2013 02:37 am (UTC) - Expand
(no subject) - thedeemon - Sep. 9th, 2013 03:51 am (UTC) - Expand
( 41 comments — Leave a comment )