Re[16]: За счет чего выстреливают языки?
От: Evgeny.Panasyuk Россия  
Дата: 13.07.15 11:12
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Т.е. я правильно понимаю, что весь десктоп и все мобильные приложения (всё это требует GUI) пролетают мимо? Т.е. по сути для Немерле остаются только сервера?

WH>>Любая логика.
WH>>Совсем любая.
WH>>Или, по-твоему, на десктопе нет логики?
_>Логики то полно, но она практически (написание инструментов командной строки или сервисов — это всё же редкость)

Помимо сервисов и утилит командной строки есть ещё библиотеки (обработка данных, алгоритмы, экспорт/импорт форматов и т.п.), внутри которых не требуется никакого GUI.

_>>>9. Ну на такие простенькие dsl (если xml без схем) C++ то уж легко хватает. )))

WH>>Вот чтобы прямо с нужным синтаксисом и проверками на этапе компиляции?
_>Не понял, что за проверки, если у нас xml без схем? ) Там же правильность получается по построению. )

Думаю имеется в виду балансировка тэгов. Но это всё реализуется в C++ через compile-time строки + raw string literals.

_>>>16. Из коробки

WH>>Ну-ка покажи как добавить в С++ оператор #@$! с правой ассоциативностью и приоритетом больше + и меньше *.
_>Не, я имел в виду просто переопределение обычных операторов. Если речь именно про введение новых, то такого конечно же нет. Правда оно и не особо надо — стандартных более чем хватает. )

Можно вводить новые именованные операторы.
Re[16]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 14:31
Оценка: +1
Здравствуйте, alex_public, Вы писали:

_>Логики то полно, но она практически (написание инструментов командной строки или сервисов — это всё же редкость) всегда должна соседствовать с GUI. А если на Nemerle нельзя писать GUI, то...

1)Можно. Но для C# есть куча кнопко-формо-шлёпок.
2)Код на немерле можно подключить к проекту на C# без проблем. Это тебе не С++.

_>Просто те же лёгкие потоки (а при их использование асинхронный IO начинает казаться синхронным) в .net сильно интегрированы в язык (async/await) и не совсем понятно как с этим у Nemerle.

Подключаешь пару длл и получаешь абсолютно тот же код.
https://github.com/rsdn/nemerle/blob/master/snippets/Nemerle.Async/Tests/async-compile2.n

_>А вообще речь шла про какие-то аналоги библиотек типа libevent, libev, libuv.

Чемп тебя Task Parallel Library не устраивает?

Ты мне лучше скажи есть в линуксе вот такое:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd627187%28v=vs.85%29.aspx

User-mode scheduling (UMS) is a lightweight mechanism that applications can use to schedule their own threads. An application can switch between UMS threads in user mode without involving the system scheduler and regain control of the processor if a UMS thread blocks in the kernel. UMS threads differ from fibers in that each UMS thread has its own thread context instead of sharing the thread context of a single thread. The ability to switch between threads in user mode makes UMS more efficient than thread pools for managing large numbers of short-duration work items that require few system calls.

Те винда возвращает управление пользовательскому планировщику, если поток завис на системном вызове или залез в своп.

_>Ну хорошо, а хотя бы веб-фреймворк на Nemerle имеется? Я помнится читал на хабре статью про NemerleWeb, но там было в основном про генерацию html/js (что не особо интересно сейчас, т.к. проще использовать статические страницы и какой-нибудь angular.js),

не проще.

_>а вот про собственно серверную работу (оптимальная организацию обработчиков ajax запросов) я так ничего и не увидел.

Это всё NemerleWeb сам делает.

_>Собственно даже не понятен базовый принцип работы — создаётся собственный сервер (как в node.js) или же каким-то образом организуется подключение к существующим (например к nginx, через wsgi).

Оно работает поверх ASP.NET.
Так что везде, где работает ASP.NET бедет работать NemerleWeb.

_>Эммм, у меня было утверждение, что это всё легко пишется на C++, а не то, что по всем пунктам существуют готовые идеально отлаженные решения. Я думаю нет никаких сомнение, что авторы легко могут довести данную разработку до законченного вида? )

Ну, с многопоточностью они, может быть, и разберутся.
А вот с остальным... что-то я не верю.

_>Возможно. Просто при реализации многопоточности через модель акторов понятие блокировки (в смысле ручного lock'a) автоматически полностью исчезает из всего кода... )))

Весьма смешное заявление.
Вся синхронизация всё равно остаётся, просто делается другими методами.

_>Ну да, препроцессор. Однако т.к. он уже полностью готовый, продуманный и вылизанный, то не вижу причин не использовать его, если возникла потребность в АОП. Лично я АОП вообще нигде не использую. Но если бы вдруг зачем-то понадобилось, то без проблем взял бы этого инструмент.

Вот когда попробуешь использовать оба инструмента. Поймешь.

_>Там в чём принципиальная "крутизна" форматирования строк в Nemerle? Проверка на этапе компиляции, как мы видим, есть и в C++.

В том что в С++ тебе придётся написать больше кода.

_>Не понял, что за проверки, если у нас xml без схем? ) Там же правильность получается по построению. )

Вот такое повторишь?
      def html = xml <# 
        <html>
          <head>
            <title>$title</title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
            <link rel="stylesheet" href="http://rsdn.ru/css/article.css" type="text/css" />
          </head>
          <body marginwidth="20" marginheight="20">
            <H1>$title</H1>
            
            <H2 $unless (props.IsEmpty())>Свойства</H2>
            <ol $unless (props.IsEmpty())>
              <li $foreach (p in props)>$(p.Name) : $(p.PropertyType)</li>
            </ol>
            
            <H2 $unless (events.IsEmpty())>События</H2>
            <ol $unless (events.IsEmpty())>
              <li $foreach (e in events)>$(e.Name) : $(e.EventHandlerType)</li>
            </ol>
          </body>
        </html>
   #>;


_>Эм, не очень понял как это соотносится с "Возможность поддержать кучу разных видов сериализации одним макросом". ) Вышеприведённый текст скорее напоминает какое-то автоматическую генерацию обёрток для чужого кода.

Как я понял разные системы, имеют разные протоколы.
И нужно уметь гонять по ним объекты.

_>И если речь не о рантайме, то такое обычно делается какой-то внешней утилитой.

Которая ничего не знает о проекте.
Я такое делал. Это ад.

_>Так я и написал, что "слабее Nemerle". ) Хотя это "слабее" общетеоретическое — на практике даже возможности C++ на полную редко используются.

Ибо в С++ это ад. Трудно написать. Трудно использовать. Про то, сколько времени оно компилируется, я лучше помолчу.
У нас один проект, генерирующий четырёх метровую сборку, компилируется минуту. Мы считаем, что это очень медленно.

_>Не понимаю как это возможно.

Да ваще не проблема.
Поднялись по стеку да посмотрели.

_>А если мы захватили мьютекс (об этом же речь, правильно?) где-то выше по стеку вызова?

Правильно.

_>Т.е. речь об интроспекции времени компиляции? ) Это да, классная вещь... Давно о ней мечтаю в C++. Собственно это, плюс работа со строками в шаблонах без костылей, и МП в C++ уже было бы приемлемым.

Вот только в немерле оно делает несколькими строками кода.
Да и не нужно в большинстве случаев.

_>
_>function<int(int)> fac=[&](int n) {return n==1?1:n*fac(n-1);};
_>cout<<fac(5)<<endl;//120
_>

Именно этот код я и ожидал.

_>Хотя такой код конечно же будет терять в эффективности (опускаться где до уровня быстродействия Java/.Net).

Вот только немерле локальные функции жестоко инлайнит.
А ещё тут нет вывода типов.

_>Не, я имел в виду просто переопределение обычных операторов. Если речь именно про введение новых, то такого конечно же нет. Правда оно и не особо надо — стандартных более чем хватает. )

Не хватает.

_>Эмм, причём тут открытые исходники компиляторов? ) Речь вообще о другом, как раз о специальной поддержке подгружаемых плагинов.

Это почти ничем не отличается от вставки кода в компилятор.
Вот только и то и другое ад.

_>На фоне C# и D и Nemerle находятся где-то рядом, в области полноценного МП. ))) А C++ где-то между ними (конец шкалы) и C# (начало шкалы — нулевое МП), скажем на 2/3 отрезка. )))

Вот только в реальности D сильно отстаёт от немерле.

_>Я имел в виду деньги на рекламу — у Mozilla нет орд евангелистов, как скажем у того же MS. Ну и кстати размер команды, работающей над языком, не обязательно определяется только деньгами.

Исключительно деньгами. Вопрос в том кто их платит.
Если человек работает за идею, то он просто сам за себя платит. Из накоплений или делая другую работу за деньги.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Отредактировано 14.07.2015 0:11 VladD2 . Предыдущая версия .
Re[12]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 14:31
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Забавно, а VladD2 говорит что
Автор: Evgeny.Panasyuk
Дата: 27.10.14
в том сообщении одна из проблем надуманная — ты тоже так считаешь?

Там говорится, что автоматически генерируется только для классов с IDisposable. Вот есть не-IDisposable класс с несколькими не-IDisposable полями. После небольшого изменения, какой-то объект из глубин композиции стал IDisposable, что транзитивно сделало IDisposable и поле нашего объекта.

Вот это надумано.
У меня ни разу не было, чтобы не IDisposable вдруг стал IDisposable.
Такое просто никогда не происходит.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 14:31
Оценка: :)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Возможен вот такой вариант
Автор: Evgeny.Panasyuk
Дата: 12.10.14
:

Раза в 2-3 больше кода это такая мелочь...

EP>Такое было в C++98 — помечаешь метод ключевым словом, и компилятор не даст вызывать его без лока.

Чего?

EP>В Nemerle есть вывод типов через использование, но не нужно забывать/умалчивать что сами типы-то несравнимо примитивнее — например higher-rank polymorphism'а нет, и соответствующего вывода типов тоже

Точно нет?
  Скрытый текст
public abstract class Foo
{
  public abstract Bar[T](value : T) : T;
}

public class FooImpl : Foo
{
  public override Bar[T](value : T) : T
  {
    value
  }
}

module Program
{
  Test[T](foo : Foo, t : T, s : string) : void
  {
    WriteLine(foo.Bar(t));
    WriteLine(foo.Bar(s));
  }

  Main() : void
  {
    Test(FooImpl(), 1, "asd");
    Test(FooImpl(), "qwe", "asd");
    _ = ReadKey();
  }
}


EP>Без проблем: live demo.

Тормоза и выделение памяти.

EP>Делают, например смотри ODB:

0.00001% пользователей это никто.

EP>Я использовал Clang ASTMatcher — никакого ада.

Вот это ад:
binaryOperator(hasOperatorName("+"), hasLHS(integerLiteral(equals(0))))

Для сравнения аналог на немерле.
<[ $r + 0 ]>


EP>С чем? С Nemerle? Почему?

Слишком долго объяснять, учитывая то, что для тебя Clang ASTMatcher не ад.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: За счет чего выстреливают языки?
От: alex_public  
Дата: 13.07.15 17:29
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Логики то полно, но она практически (написание инструментов командной строки или сервисов — это всё же редкость) всегда должна соседствовать с GUI. А если на Nemerle нельзя писать GUI, то...

WH>1)Можно. Но для C# есть куча кнопко-формо-шлёпок.
WH>2)Код на немерле можно подключить к проекту на C# без проблем. Это тебе не С++.

Т.е. чтобы написать приложение на Nemerle, мне придётся выучить ещё и C#? Нет, спасибо, такого не надо...

_>>А вообще речь шла про какие-то аналоги библиотек типа libevent, libev, libuv.

WH>Чемп тебя Task Parallel Library не устраивает?

Почему не устраивает?) Она вполне нормальная. Только это небольшая часть того, что реализовано в библиотеках типа libuv. Правда в сумме в библиотеках .net'а скорее всего тоже найдётся весь набор. Но не знаю насколько он интегрирован и оптимизирован под большие нагрузки.

WH>Ты мне лучше скажи есть в линуксе вот такое:

WH>..
WH>Те винда возвращает управление пользовательскому планировщику, если поток завис на системном вызове или залез в своп.

Да, я в курсе про эту штуку, но непонятно какое она имеет отношение к нашей дискуссии. Если бы мы обсуждали windows vs. linux, то понятно. Но мы то обсуждаем разные языки/фреймворки, которые должны обеспечивать максимальную эффективность на всех целевых платформах.

_>>а вот про собственно серверную работу (оптимальная организацию обработчиков ajax запросов) я так ничего и не увидел.

WH>Это всё NemerleWeb сам делает.

Может быть. Но про это в той статье не было ни слова — там всё только про генерацию html/js, что сейчас уже не так актуально. А сайт NemerleWeb вообще дохлый, так что даже не посмотреть документацию. )))

_>>Возможно. Просто при реализации многопоточности через модель акторов понятие блокировки (в смысле ручного lock'a) автоматически полностью исчезает из всего кода... )))

WH>Весьма смешное заявление.
WH>Вся синхронизация всё равно остаётся, просто делается другими методами.

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

_>>Там в чём принципиальная "крутизна" форматирования строк в Nemerle? Проверка на этапе компиляции, как мы видим, есть и в C++.

WH>В том что в С++ тебе придётся написать больше кода.

Где именно больше кода? Если при написание библиотеки форматирования, то возможно. Но на это мне как-то наплевать. А если речь про использование такого форматирования, то не вижу никакой разницы.

_>>Не понял, что за проверки, если у нас xml без схем? ) Там же правильность получается по построению. )

WH>Вот такое повторишь?
  Скрытый текст
WH>
WH>      def html = xml <# 
WH>        <html>
WH>          <head>
WH>            <title>$title</title>
WH>            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
WH>            <link rel="stylesheet" href="http://rsdn.ru/css/article.css" type="text/css" />
WH>          </head>
WH>          <body marginwidth="20" marginheight="20">
WH>            <H1>$title</H1>
            
WH>            <H2 $unless (props.IsEmpty())>Свойства</H2>
WH>            <ol $unless (props.IsEmpty())>
WH>              <li $foreach (p in props)>$(p.Name) : $(p.PropertyType)</li>
WH>            </ol>
            
WH>            <H2 $unless (events.IsEmpty())>События</H2>
WH>            <ol $unless (events.IsEmpty())>
WH>              <li $foreach (e in events)>$(e.Name) : $(e.EventHandlerType)</li>
WH>            </ol>
WH>          </body>
WH>        </html>
WH>   #>;
WH>

Хыхы, да такие вещи ещё в старом стандарте C++ легко делали: https://bitbucket.org/edd/xsmell/src/3551ac07c4711a87f3f70dfa703a87eee3a7e292/demo.cpp. А уж в новом можно вообще идеально со строками сделать.

_>>Так я и написал, что "слабее Nemerle". ) Хотя это "слабее" общетеоретическое — на практике даже возможности C++ на полную редко используются.

WH>Ибо в С++ это ад. Трудно написать. Трудно использовать. Про то, сколько времени оно компилируется, я лучше помолчу.
WH>У нас один проект, генерирующий четырёх метровую сборку, компилируется минуту. Мы считаем, что это очень медленно.

Я не про проблемы реализации. Я про то, что собственно такие задачи весьма не часто встречаются на практике. А для тех редкие случае, когда они реально встречались на практике, хватало скудных возможностей C++. Т.е. общетеоретически я безусловно согласен, что Nemerle или D на голову сильнее в этой области. Но практически это редко чувствуется. Хотя я бы естественно не отказался от таких возможностей, но только "на халяву" (т.е. не ценой перехода на сомнительную платформу, а путём добавления этих возможностей в мою развитую платформу).

_>>Не понимаю как это возможно.

WH>Да ваще не проблема.
WH>Поднялись по стеку да посмотрели.

Что посмотрим то? А если мьютекс захватывает вообще чужой код? Мы же не в рантайме смотрим, а во время компиляции...

_>>Хотя такой код конечно же будет терять в эффективности (опускаться где до уровня быстродействия Java/.Net).

WH>Вот только немерле локальные функции жестоко инлайнит.
WH>А ещё тут нет вывода типов.

Ну вообще то если говорить про конкретно этот код, то тут компилятор заменит рекурсию на цикл, так что будет глубоко наплевать на неэффективность (ну как неэффективность, оно работает со скоростью обычного виртуального вызова, т.е. как вся Java/.Net) std::function. Но в общем случае, если рекурсия не хвостовая, то конечно будет замедление относительно реализации без лямбды. Я так понимаю, что это единственный теоретический случай пользы локальных функций? )

_>>Не, я имел в виду просто переопределение обычных операторов. Если речь именно про введение новых, то такого конечно же нет. Правда оно и не особо надо — стандартных более чем хватает. )

WH>Не хватает.

Кстати, там вот Евгений забавный трюк https://github.com/klmr/named-operator на эту тему подкинул... )

_>>На фоне C# и D и Nemerle находятся где-то рядом, в области полноценного МП. ))) А C++ где-то между ними (конец шкалы) и C# (начало шкалы — нулевое МП), скажем на 2/3 отрезка. )))

WH>Вот только в реальности D сильно отстаёт от немерле.

Ну это при взгляде из Nemerle-центричного мира... А при взгляде из мира большинства обычных программистов оба эти языка обладают крутым МП и при этом оба маргинальные. Т.е. что очень похожи, только один из мира .net, а другой нативный. )

_>>Я имел в виду деньги на рекламу — у Mozilla нет орд евангелистов, как скажем у того же MS. Ну и кстати размер команды, работающей над языком, не обязательно определяется только деньгами.

WH>Исключительно деньгами. Вопрос в том кто их платит.
WH>Если человек работает за идею, то он просто сам за себя платит. Из накоплений или делая другую работу за деньги.

Ну т.е. ты думаешь, что так много обсуждений Rust'a было исключительно из-за того факта, что это язык, над которым работает не маленькая команда за деньги? )
Re[17]: За счет чего выстреливают языки?
От: alex_public  
Дата: 13.07.15 17:31
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Думаю имеется в виду балансировка тэгов. Но это всё реализуется в C++ через compile-time строки + raw string literals.


Интересно есть ли уже готовые библиотечки или ещё нет.

_>>Не, я имел в виду просто переопределение обычных операторов. Если речь именно про введение новых, то такого конечно же нет. Правда оно и не особо надо — стандартных более чем хватает. )

EP>Можно вводить новые именованные операторы.

О, интересный трюк. Не знал про такое. Хотя вроде как очевидная идея, но только после того, как увидишь пример. )))
Re[18]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 17:54
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Т.е. чтобы написать приложение на Nemerle, мне придётся выучить ещё и C#? Нет, спасибо, такого не надо...

Не надо в 10 раз сокращать работу? Ну не надо так не надо.

_>Почему не устраивает?) Она вполне нормальная. Только это небольшая часть того, что реализовано в библиотеках типа libuv. Правда в сумме в библиотеках .net'а скорее всего тоже найдётся весь набор. Но не знаю насколько он интегрирован и оптимизирован под большие нагрузки.

Чего конкретно нет?

_>Да, я в курсе про эту штуку, но непонятно какое она имеет отношение к нашей дискуссии. Если бы мы обсуждали windows vs. linux, то понятно. Но мы то обсуждаем разные языки/фреймворки, которые должны обеспечивать максимальную эффективность на всех целевых платформах.

Мне просто интересно.
В ближайшие год-два планирую написать язык программирования.
Ему будет очень полезен UMS.
Вот мне и интересно есть ли такое счастье в других ОС? Или придется вокруг системных вызовов пляски устраивать.

_>Не остаётся, т.к. в модели акторов вообще не используют разделяемые между потоками данные.

Только С++ это ни как не контролирует.

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

Только ни от гонок, ни от дедлоков это не спасает.

_>Где именно больше кода? Если при написание библиотеки форматирования, то возможно. Но на это мне как-то наплевать. А если речь про использование такого форматирования, то не вижу никакой разницы.

1.5-2 раза больше кода это конечно не разница.

_>Хыхы, да такие вещи ещё в старом стандарте C++ легко делали: https://bitbucket.org/edd/xsmell/src/3551ac07c4711a87f3f70dfa703a87eee3a7e292/demo.cpp. А уж в новом можно вообще идеально со строками сделать.

Ну ладно мусор в коде ещё можно потерпеть.
А как быть с этим:
            <H2 $unless (events.IsEmpty())>События</H2>
            <ol $unless (events.IsEmpty())>
              <li $foreach (e in events)>$(e.Name) : $(e.EventHandlerType)</li>
            </ol>


_>Я не про проблемы реализации. Я про то, что собственно такие задачи весьма не часто встречаются на практике.

Ты их просто избегаешь. Ибо ад.

_>Что посмотрим то? А если мьютекс захватывает вообще чужой код? Мы же не в рантайме смотрим, а во время компиляции...

Не проблема.

_>Ну вообще то если говорить про конкретно этот код, то тут компилятор заменит рекурсию на цикл, так что будет глубоко наплевать на неэффективность (ну как неэффективность, оно работает со скоростью обычного виртуального вызова, т.е. как вся Java/.Net) std::function. Но в общем случае, если рекурсия не хвостовая, то конечно будет замедление относительно реализации без лямбды. Я так понимаю, что это единственный теоретический случай пользы локальных функций? )

Это очередная демонстрация убогости С++.

_>Кстати, там вот Евгений забавный трюк https://github.com/klmr/named-operator на эту тему подкинул... )

Дурь это.
Ну и попробуй сделать его право ассоциативным с приоритетом между + и *.

_>Ну т.е. ты думаешь, что так много обсуждений Rust'a было исключительно из-за того факта, что это язык, над которым работает не маленькая команда за деньги? )

Много обсуждений не заметил.
Если бы не мозила обсуждений вообще бы не было.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: За счет чего выстреливают языки?
От: Evgeny.Panasyuk Россия  
Дата: 13.07.15 18:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

EP>>Возможен вот такой вариант
Автор: Evgeny.Panasyuk
Дата: 12.10.14
:

WH>Раза в 2-3 больше кода это такая мелочь...

1. В этом примере ad-hoc парсинг. С использованием готового комбинатора парсеров (например Metaparse принятого на днях в Boost) кода будет существенно меньше.
2. Это узко-специализированный библиотечный код — пишется намного реже чем используется. Тот же hi_octane, на которого ты ссылаешься, судя по всему сам форматирование не писал, а использовал.
3. В Nemerle мета-программирование действительно удобнее — я с этим и не спорил.

EP>>Такое было в C++98 — помечаешь метод ключевым словом, и компилятор не даст вызывать его без лока.

WH>Чего?

Alexandrescu 2001: volatile: The Multithreaded Programmer's Best Friend.

EP>>В Nemerle есть вывод типов через использование, но не нужно забывать/умалчивать что сами типы-то несравнимо примитивнее — например higher-rank polymorphism'а нет, и соответствующего вывода типов тоже

WH>Точно нет?

ЕМНИП, Об этом даже VladD2 говорил в своей презентации.

WH>
WH>public abstract class Foo
WH>{
WH>  public abstract Bar[T](value : T) : T;
WH>}
WH>


Это не то, тут сигнатура прибита гвоздями в базовом классе. В общем случае она может быть сильно разной. И сама функция принимающая эти templates/generics может ничего не знать об этих сигнатурах, а всего лишь передавать результат в другой generic полученный через параметры — типичная ситуация в коде с ФВП, а-ля всякие apply.

EP>>Без проблем: live demo.

WH>Тормоза и выделение памяти.

В подобном случае выделения памяти скорей всего не будет — во многих реализациях std::function используется small object optimization.
Используя же function_non_owning
Автор: Evgeny.Panasyuk
Дата: 26.02.15
— аллокаций не будет даже для больших объектов.

WH>>>Но никто не делает. Ибо ад.

EP>>Делают, например смотри ODB:
WH>0.00001% пользователей это никто.

Нет И ODB не единственный пример.

EP>>Я использовал Clang ASTMatcher — никакого ада.

WH>Вот это ад:
WH>
WH>binaryOperator(hasOperatorName("+"), hasLHS(integerLiteral(equals(0))))
WH>


Для редкого использования (там где не хватает встроенного MP) вполне приемлемо. Но в целом согласен что можно сделать проще, на что я им и указывал ранее.

WH>Для сравнения аналог на немерле.

WH>
WH><[ $r + 0 ]>
WH>


А это может использоваться для определения грамматики syntax extensions? Или хотя бы как условие PM?

EP>>С чем? С Nemerle? Почему?

WH>Слишком долго объяснять,

Да, да, "Нет времени объяснять, действуй юзай Nemerle!"
Re[18]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 18:25
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>2. Это узко-специализированный библиотечный код — пишется намного реже чем используется. Тот же hi_octane, на которого ты ссылаешься, судя по всему сам форматирование не писал, а использовал.

Я про использование и говорю.

EP>Alexandrescu 2001: volatile: The Multithreaded Programmer's Best Friend.

Ну, то есть только один захардкоженый случай.
А как отличить блокировку для чтения от блокировки для записи?

WH>>0.00001% пользователей это никто.

EP>Нет И ODB не единственный пример.
Что нет?

WH>>Для сравнения аналог на немерле.

WH>>
WH>><[ $r + 0 ]>
WH>>

EP>А это может использоваться для определения грамматики syntax extensions?
Чего?

EP>Или хотя бы как условие PM?

Может. Поищи в исходниках немерле
| <[

Найдёшь массу примеров.

EP>Да, да, "Нет времени объяснять, действуй юзай Nemerle!"

binaryOperator(hasOperatorName("+"), hasLHS(integerLiteral(equals(0))))

против
<[ $r + 0 ]>

Всё ещё не понятно?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: За счет чего выстреливают языки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.07.15 19:05
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, VladD2, Вы писали:


VD>>JavaScript вылез потому что только он был запихнут в броузеры и не имеет там конкуренции.


G>JS вылез по причине того, что его что его поддерживали MS и Netscape...


Я особо не спорю. Но будучи монополистом в броузерах остальное прикладывается автоматически.

G>ЗЫ. Торговая марка JavaScript принадлежит ораклу.


Вот это странно. Он то к языку ни каким боком. Но, это уже не особо интересно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: За счет чего выстреливают языки?
От: Evgeny.Panasyuk Россия  
Дата: 13.07.15 19:17
Оценка:
Здравствуйте, WolfHound, Вы писали:

EP>>2. Это узко-специализированный библиотечный код — пишется намного реже чем используется. Тот же hi_octane, на которого ты ссылаешься, судя по всему сам форматирование не писал, а использовал.

WH>Я про использование и говорю.

"Раза в 2-3 больше кода это такая мелочь" — это про явное перечисление захватываемых перемененных (не перечислив которые будет ошибка компиляции)?

EP>>Alexandrescu 2001: volatile: The Multithreaded Programmer's Best Friend.

WH>Ну, то есть только один захардкоженый случай.
WH>А как отличить блокировку для чтения от блокировки для записи?

Для этой цели можно использовать const аналогичным образом.

WH>>>0.00001% пользователей это никто.

EP>>Нет И ODB не единственный пример.
WH>Что нет?

Нет — твоё оригинальное высказывание "Но никто не делает" неверно — я привёл контр-пример. И нет — твоя попытка сыграть на том что это редко используется не превращает то утверждение в верное.

WH>>>Для сравнения аналог на немерле.

WH>>>
WH>>><[ $r + 0 ]>
WH>>>

EP>>А это может использоваться для определения грамматики syntax extensions?
WH>Чего?

Syntax extensions:
macro while_macro (cond, body) 
syntax ("while", "(", cond, ")", body)


EP>>Или хотя бы как условие PM?

WH>Может. Поищи в исходниках немерле
WH>
WH>| <[
WH>

WH>Найдёшь массу примеров.

Ок, хорошо.

EP>>Да, да, "Нет времени объяснять, действуй юзай Nemerle!"

WH>
WH>binaryOperator(hasOperatorName("+"), hasLHS(integerLiteral(equals(0))))
WH>

WH>против
WH>
WH><[ $r + 0 ]>
WH>

WH>Всё ещё не понятно?

Конечно не понятно, в этой под-ветке речь про D vs Nemerle, а ты приводишь пример Clang AST Matcher vs Nemerle
Re[14]: За счет чего выстреливают языки?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 13.07.15 19:23
Оценка:
Здравствуйте, alex_public, Вы писали:

У Кочеткова есть хорошая, хотя и относительно не новая статья по части из перечисленных вопросов: http://vkochetkov.blogspot.com/2011/06/nemerle.html Он там хорошо объясняет с примерами, для чего могут реально пригодиться фичи N.

P.S.: Мопед не мой.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[19]: За счет чего выстреливают языки?
От: alex_public  
Дата: 13.07.15 19:33
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>Почему не устраивает?) Она вполне нормальная. Только это небольшая часть того, что реализовано в библиотеках типа libuv. Правда в сумме в библиотеках .net'а скорее всего тоже найдётся весь набор. Но не знаю насколько он интегрирован и оптимизирован под большие нагрузки.

WH>Чего конкретно нет?

Если взглянуть на описание функциональности скажем той же libuv:
— Full-featured event loop backed by epoll, kqueue, IOCP, event ports.
— Asynchronous TCP and UDP sockets
— Asynchronous DNS resolution
— Asynchronous file and file system operations
— File system events
— ANSI escape code controlled TTY
— IPC with socket sharing, using Unix domain sockets or named pipes (Windows)
— Child processes
— Thread pool
— Signal handling
— High resolution clock
— Threading and synchronization primitives
то очевидно, что TPL явно не всё это покрывает. )))

_>>Да, я в курсе про эту штуку, но непонятно какое она имеет отношение к нашей дискуссии. Если бы мы обсуждали windows vs. linux, то понятно. Но мы то обсуждаем разные языки/фреймворки, которые должны обеспечивать максимальную эффективность на всех целевых платформах.

WH>Мне просто интересно.
WH>В ближайшие год-два планирую написать язык программирования.
WH>Ему будет очень полезен UMS.
WH>Вот мне и интересно есть ли такое счастье в других ОС? Или придется вокруг системных вызовов пляски устраивать.

Нуу на обычном уровне там достаточно разнообразное управление планировщиком: http://man7.org/linux/man-pages/man7/sched.7.html А если этого не хватает (как раз для тяжёлых случаев), то уже можно заняться и такими играми:
  Скрытый текст
http://www.youtube.com/watch?v=KXuZi9aeGTw.

_>>Не остаётся, т.к. в модели акторов вообще не используют разделяемые между потоками данные.
WH>Только С++ это ни как не контролирует.

Да, в C++ соблюдение модели акторов — это вопрос организации разработки, а не контроль со стороны компилятора.

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

WH>Только ни от гонок, ни от дедлоков это не спасает.

От гонок же как раз спасает — у нас же любой сущностью владеет только один поток. ) А от дедлоков действительно не спасает. Но от них никакой инструмент не спасает. )))

_>>Где именно больше кода? Если при написание библиотеки форматирования, то возможно. Но на это мне как-то наплевать. А если речь про использование такого форматирования, то не вижу никакой разницы.

WH>1.5-2 раза больше кода это конечно не разница.

Это ты про использование? ) Ну покажи конкретный пример где будет разница в 1,5-2 раза.

_>>Хыхы, да такие вещи ещё в старом стандарте C++ легко делали: https://bitbucket.org/edd/xsmell/src/3551ac07c4711a87f3f70dfa703a87eee3a7e292/demo.cpp. А уж в новом можно вообще идеально со строками сделать.

WH>Ну ладно мусор в коде ещё можно потерпеть.
WH>А как быть с этим:
WH>
WH>            <H2 $unless (events.IsEmpty())>События</H2>
WH>            <ol $unless (events.IsEmpty())>
WH>              <li $foreach (e in events)>$(e.Name) : $(e.EventHandlerType)</li>
WH>            </ol>
WH>


Это надо уже на новом стандарте писать, с constexpr строками в полный рост. ))) Вполне реализуемо, но на готовые библиотечки я не натыкался. )

_>>Ну вообще то если говорить про конкретно этот код, то тут компилятор заменит рекурсию на цикл, так что будет глубоко наплевать на неэффективность (ну как неэффективность, оно работает со скоростью обычного виртуального вызова, т.е. как вся Java/.Net) std::function. Но в общем случае, если рекурсия не хвостовая, то конечно будет замедление относительно реализации без лямбды. Я так понимаю, что это единственный теоретический случай пользы локальных функций? )

WH>Это очередная демонстрация убогости С++.

А в других языках рекурсивные лямбды работают быстрее, чем в C++? )))

_>>Ну т.е. ты думаешь, что так много обсуждений Rust'a было исключительно из-за того факта, что это язык, над которым работает не маленькая команда за деньги? )

WH>Много обсуждений не заметил.
WH>Если бы не мозила обсуждений вообще бы не было.

Ну это ты не заметил. ))) А все "нативщики" последний год поглядывали на Rust с тайной надеждой. )))
Re[17]: За счет чего выстреливают языки?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 13.07.15 19:43
Оценка:
Здравствуйте, WolfHound, Вы писали:

_>>А вообще речь шла про какие-то аналоги библиотек типа libevent, libev, libuv.

WH>Чемп тебя Task Parallel Library не устраивает?

Приведеные либы это IO — IOCP, epoll, события и тд и тд.
TPL это ,
Во первых, либа про управление задачами-потоками
Во вторых, совсем другая вычислительная модель, эвент-дривен асинхронщина в ней побочный эффект
Re[17]: За счет чего выстреливают языки?
От: Evgeny.Panasyuk Россия  
Дата: 13.07.15 20:43
Оценка: +1
Здравствуйте, WolfHound, Вы писали:
_>>
_>>function<int(int)> fac=[&](int n) {return n==1?1:n*fac(n-1);};
_>>cout<<fac(5)<<endl;//120
_>>

WH>Именно этот код я и ожидал.

Есть другой вариант:
auto recursive = [](auto f)
{
    return [=](auto... xs)
    {
        return f(f, xs...);
    };
};

auto test(unsigned long value)
{
    auto factorial = recursive([](auto &self, auto x) -> decltype(x)
    {
        return x ? self(self, x-1)*x : 1;
    });

    return factorial(value);
}


WH>Вот только немерле локальные функции жестоко инлайнит.


Если аргумент известен во время компиляции, то и GCC и Clang подставляют сразу результат. Если же нет, то делают автовекторизацию.
А что будет в случае Nemerle для такой non-tail-recursion?
Re[20]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 21:02
Оценка:
Здравствуйте, alex_public, Вы писали:

_>то очевидно, что TPL явно не всё это покрывает. )))

Что конкретно не покрывает кроме чисто линуксовых заморочек?

_>От гонок же как раз спасает — у нас же любой сущностью владеет только один поток. )

Учитывая, что мы может послать любой указатель любому актору...

_>Это ты про использование? ) Ну покажи конкретный пример где будет разница в 1,5-2 раза.

Да ты сам их и показал.

_>А в других языках рекурсивные лямбды работают быстрее, чем в C++? )))

В немерле на них все циклы реализованы.

_>Ну это ты не заметил. ))) А все "нативщики" последний год поглядывали на Rust с тайной надеждой. )))

Так, где они поглядывали то?
Тут про него говорили меньше чем про немерле.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: За счет чего выстреливают языки?
От: WolfHound  
Дата: 13.07.15 21:09
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>"Раза в 2-3 больше кода это такая мелочь" — это про явное перечисление захватываемых перемененных (не перечислив которые будет ошибка компиляции)?

process_format
(
    print,
    "val = $value$, cnt = $counter$, ch = $character$, again v=$value$;\n",
    counter, character, value
);

Всё что я выделил лишнее.

EP>Для этой цели можно использовать const аналогичным образом.

А если у нас ещё что-то появится?

EP>Syntax extensions:

EP>
Может.
[nemerle]
| <[ if ($cond) $trueExpr else $falseExpr ]> =>
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[21]: За счет чего выстреливают языки?
От: Evgeny.Panasyuk Россия  
Дата: 13.07.15 21:38
Оценка:
Здравствуйте, WolfHound, Вы писали:

EP>>"Раза в 2-3 больше кода это такая мелочь" — это про явное перечисление захватываемых перемененных (не перечислив которые будет ошибка компиляции)?

WH>
WH>process_format
WH>(
WH>    print,
WH>    "val = $value$, cnt = $counter$, ch = $character$, again v=$value$;\n",
WH>    counter, character, value
WH>);
WH>

WH>Всё что я выделил лишнее.

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

process_format — это аналог $ из Nemerle, можно кстати $ и использовать (многие компиляторы это поддерживают). То есть получается:
auto result = $("val = $value$, cnt = $counter$, ch = $character$, again v=$value$;\n", counter, character, value);
Лишним здесь является только захват, да. Но это практически бесплатный код. Да и при отсутствии необходимого захвата, либо при захвате лишнего, можно выдавать ошибку с пояснением каким он должен быть.

EP>>Для этой цели можно использовать const аналогичным образом.

WH>А если у нас ещё что-то появится?

Думаю можно выдавать что-то типа security token при захвате мьютекса, где методы требуют тот или иной тип token'а в зависимости от необходимой политики блокировки.
Но вряд ли понадобится что-то более разнообразное чем readers–writer lock. Да и не нравится мне идея ручного дёрганья мьютексов (пусть даже и через lock_guard'ы), я бы предпочёл хотя бы что-то типа монитора:
monitor<Account> m[2];
transaction([](auto &x, auto &y)
{
    x.money -= 100;
    y.money += 100;
}, m[0], m[1]);
причём тут также можно сделать разграничение readers/writer через константность.

EP>>Syntax extensions:

WH>Может.
WH>
WH>| <[ if ($cond) $trueExpr else $falseExpr ]> => 
WH>


Да, здорово.
Re[10]: За счет чего выстреливают языки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.07.15 21:45
Оценка:
Здравствуйте, mapnik, Вы писали:

M>Python прекрасный язык, я сам на нем периодически решаю некоторые задачи. Но это не мейнстрим (почему, вы сами написали). Это не плохо, это факт.


То что твое понимание понятия "мэйнстим" отличается от общепринятого — это еще пол беды. Но вот то, что ты позволяешь себе на этом основании оскорблять других людей — это уже никуда не годится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 13.07.2015 22:31 VladD2 . Предыдущая версия .
Re[9]: За счет чего выстреливают языки?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.07.15 21:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Извини, не был на курсах 1С и SharePoint. Но по криериям выше SQL не подходит. Ни один из диалектов SQL на сегодня не является универсальным яызыком.


Такие диалекты SQL, как Transact SQL и PL SQL, в каком-то смысле подходят, но это уже не совсем SQL, точнее совсем не SQL. Это императивные языки со встроенной поддержкой SQL. Так что по смыслу — да, SQL это не язык программирования общего назначения, а скорее DSL — язык обработки реляционных данных.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.