Re: Что вас останавливает от изучения нового языка?
От: TheBeard Россия  
Дата: 25.04.11 09:26
Оценка: 1 (1) :))) :))
Здравствуйте, VladD2, Вы писали:

Ничего не останавливает. Изучаю, стараюсь применять на практике. Единственное исключение — Nemerle. Отпугивает сложиышшеся вокруг него сообщество в RSDN. Не хочется даже близко подходить.
Re[3]: Что вас останавливает от изучения нового языка?
От: robin_of_the_wood Россия  
Дата: 25.04.11 10:21
Оценка:
Здравствуйте, VladD2, Вы писали:

A>>Пожалуй, останавливает само количество языков:

A>>http://en.wikipedia.org/wiki/List_of_programming_languages
A>>Насчитал тут более 650 штук(!)

VD>Там большая часть мертвых или чисто исследовательских.

И еще отсортирован список по алфавиту а не по мощности языка. Это ж просто безобразие.
Чтобы ласкающее взор имя прочесть некоторым приходится аж до секции N скролить.
Скролишь и думаешь — а вдруг убрали. Инфаркт можно получить однако.
Проектирование велосипедов для слепых жирафов
Re[9]: Что вас останавливает от изучения нового языка?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.04.11 10:55
Оценка:
Здравствуйте, VladD2, Вы писали:

[skip классическое введение от VladD2: "ламо" повторяется не меньше двух раз]

VD>В этом коде никто не пытался сделать что-то нарочито коротко. В нем, просто, решается весьма не тривиальная задача — оптимизация гамматик. В нормальном виде эту задачу на простом языке не описать. Тут единственное нормальное решение было бы создание специализированного ДЛС-я с поддержкой паттерн-матчинга в терминах прикладной задачи. А на if-ах или ООП тут будет просто жопа. Кода будет раз в 5 больше и он будет абсолютно не читаем. А этот код ты прочесть не можешь только потому, что не знаешь ПМ и язык.


Не, этот код я полностью не могу прочесть, потому что смутно представляю себе постановку задачи. ПМ, язык — это всё шелуха. Кстати, спасибо, что объяснил, что именно и зачем тут оптимизируется.

ГВ>>Пусть код будет втрое длиннее, но хоть сгруппировали бы по ветвлениям одного уровня. Это был раз. А два, я, например, не вижу принципиальной разницы между:


ГВ>>
| Not(Not(rule))                => optimize(Rule.And(r.Location, rule))


ГВ>>и совершенно банальным:


ГВ>>
else if (match(rule, Not(Not())) { return optimize(And(r.Location, rule)); }


VD>Ген. Не моли чушь просто от того, что ты не понимашь написанного. Ну это же бред.


А... Да, есть ошибочка. Вызов optimizie нужно было записать примерно так: optimize(And(r.Location, rule.r.r), чтобы показать, что новый узел формируется из вложенного. Но это простительная неточность в данном случае. Я же полностью рабочий код не собирался делать. Кстати, Not(Not()) может быть заменён на статическую константу:

static const NotNotRulePattern = Not(Not());
...
else if (match(rule, NotNotRulePattern)) ...


Просто, чтобы не создавать временных объектов попусту.

VD>Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках: [...]


Спасибо за перевод, но это мне понятно.

VD>Но тут есть пара особенностей.

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

Конечно, не гарантируется. Только кто тебе сказал, что по отношению к такому примеру цикл заметно ухудшит код? Цикл тут один, подразумевается он в любом случае, хотя бы в виде tail-оптимизированной рекурсии через ПМ, так что, на "понимаемость" кода его введение повлияет слабо. Да и управляться он, пожалуй, будет лучше. Иными словами, приведённый фрагмент будет выглядеть где-то так:

else if (match(rule, Not(Not())) { rule = And(r.Location, rule); continue; }


Тоже, в общем, не перегрузка. Навертеть можно много, на самом деле, при этом выглядеть и сопровождаться оно будет совсем не так, как слепленные на коленке "по-быстрому" ФП-аналоги, которые подчас завязаны на контекст чуть более, чем намертво. Далее, тебе vdimas про тестирование очень правильно написал.

VD>2. Компилятор немерла работает не с объектами, а свариантами. Это позволяет ему контролировать, что match-и обрабатывают все возможные сочетания. В твоем случае такая проверка невозможна в приципе.


Хм. Not(Sequence(rule)) где? Ты ведь говоришь обо всех возможных сочетаниях, нет? Кстати, сочетания какой длины гарантированно контролируются?

VD>Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель. Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше.


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

VD>Так что насмехаешься и горлопанишь ты тут исключительно от своей невежественности. Ну, а приведенный тобой "код" просто нерабочий.


Конечно, не рабочий, я и не пытался делать его рабочим. Я тебе что, полный PEG-парсер буду переписывать? Не, Влад, эпопею с делегатами я повторять не буду — одного раза мне хватило.

VD>Так для справки. Обрезанный компилятор C# (из SS CLI) написанный на С++ Майрософтом занимает 5 мег. Компилятор Немерле ~2. И это при том, что язык сложнее в разы.


Это не значит ничего. То есть я хотел сказать, что в соответствии с правилами форума ФП из этих двух фактов можно сделать совершенно любой вывод.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: Что вас останавливает от изучения нового языка?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.04.11 10:58
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>Лаптев сказал, если я не путаю, что синтаксическим макросам сто лет в обед.


VD>Лаптев много говорит. Но по его же словам отчетливо видно, что он не понимает то о чем говорит. Его уровень — это императивный язык. К сожалению подняться выше он не то что не может, но даже не хочет.


По словам Лаптева отчётливо видно, что его оппоненты не совсем понимают реальную значимость того, что они пропонируют.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[10]: Опечатка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.04.11 11:31
Оценка:
static const RulePattern NotNotRulePattern = Not(Not());
...
else if (match(rule, NotNotRulePattern)) ...


Какой именно тип должен быть указан в качестве RulePattern прямо сейчас сказать не могу.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Что вас останавливает от изучения нового языка?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 25.04.11 12:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.


Щупаю и далее по ощущениям.
Re[2]: Что вас останавливает от изучения нового языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.04.11 12:40
Оценка:
Здравствуйте, Mystic, Вы писали:

VD>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.


M>Щупаю и далее по ощущениям.


А как выглядит процесс щупания?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Что вас останавливает от изучения нового языка?
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.04.11 12:48
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>По словам Лаптева отчётливо видно, что его оппоненты не совсем понимают реальную значимость того, что они пропонируют.


Лично мне довольно фиолетово что он там пропонирует и с кем. Мне даже по фигу что он учит люлей на ББ. Хотя сам ББ не имеет никакого практического значения, но на его основе люди попробуют программировать и если им это понравится, то освоят более полезные языки даже вопреки вам всем. Так что польза от этого несомненно есть.

Тут вопрос в другом. Вопрос в том, что те кто должны быть (по идее) на передовых рубежах индустрии, на самом деле застряли в дремучих шестидесятых. И вместо того чтобы попытаться освоить что-то более новое (как резонно заметил vdimas, из 70-90-ых), они рьяно отстаивают свое право на невежество.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Что вас останавливает от изучения нового языка?
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 25.04.11 13:06
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.


M>>Щупаю и далее по ощущениям.


VD>А как выглядит процесс щупания?


Читаю некоторый обзор, придумываю задачу, которая должна соответствовать языку и потом начинаю на нем писать решение. В ощущения входит: (1) легкость быстрого старта (2) тормоза (3) хорошая диагностика ошибок (4) быстрый поиск по документации ответов на вопросы (5) бенефиты перед уже известными языками.
Re[7]: Что вас останавливает от изучения нового языка?
От: alpha21264 СССР  
Дата: 25.04.11 13:26
Оценка:
Здравствуйте, VoidEx, Вы писали:

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


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


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


A>>>>Я обьясню это через придуманную мною алегорию.

A>>>>Можно купить машину с очень мощным мотором.
A>>>>Но стоять в пробке она будет примерно с той же скоростью как Запорожец.
A>>>>Потому что движение лимитурует другой фактор.

VE>>>Поэтому ты предпочитаешь запорожец? Мне нравится твоя аллегория. Она какбе намекает, что помимо скорости езды есть ещё какой-то важный фактор, так что даже в таком случае запорожец — не вариант.


A>>Потому что если нет разницы, то зачем платить больше?

A>>Как говорил мой великий и мудрый шеф (отмеченый орденами и медалями)
A>>Был бы хороший алгоритм. А реализуем мы его хоть на хинди.

VE>Ты утверждаешь, что нет разницы между запорожцем и Бугурти?


Разница есть даже между двумя Запорожцами.
Вопрос насколько она принципиальна.
Между Запорожцем и Бугурти (к стати, что это?) принципиальной разницы нет.
Метро всё равно быстрее их обоих.
А мне надо ехать.

Течёт вода Кубань-реки куда велят большевики.
Re[8]: Что вас останавливает от изучения нового языка?
От: VoidEx  
Дата: 25.04.11 13:41
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Разница есть даже между двумя Запорожцами.

A>Вопрос насколько она принципиальна.
A>Между Запорожцем и Бугурти (к стати, что это?) принципиальной разницы нет.
Бугатти.
A>Метро всё равно быстрее их обоих.
A>А мне надо ехать.

Ну дак метро ещё не построили по твоим же словам. Получается, чёрт с ним с Бугатти, я и на запоре покатаюсь?
Re[11]: Что вас останавливает от изучения нового языка?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.04.11 14:01
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>По словам Лаптева отчётливо видно, что его оппоненты не совсем понимают реальную значимость того, что они пропонируют.

VD>Лично мне довольно фиолетово что он там пропонирует и с кем.

Перечитай мою реплику внимательней. Я имел в виду реальную значимость тех идей, которые продвигают оппоненты Лаптева. Сиречь — ты, Wolfhound и далее по списку.

VD>Мне даже по фигу что он учит люлей на ББ. Хотя сам ББ не имеет никакого практического значения, но на его основе люди попробуют программировать и если им это понравится, то освоят более полезные языки даже вопреки вам всем. Так что польза от этого несомненно есть.


Собственно, этого вполне себе немало, не находишь?

VD>Тут вопрос в другом. Вопрос в том, что те кто должны быть (по идее) на передовых рубежах индустрии, на самом деле застряли в дремучих шестидесятых. И вместо того чтобы попытаться освоить что-то более новое (как резонно заметил vdimas, из 70-90-ых), они рьяно отстаивают свое право на невежество.


По идее они должны обучать начинающих программистов программированию. Точка. Передовой рубеж, если я правильно понимаю — обучение балбесов, которые пришли в вуз не за знаниями, а корочки для. Отсюда постоянный поиск компромисса между сложностью (читай, теоретичностью) материала, практической его ценностью и порогом вхождения. Дальше вдаваться в дискуссии по этому поводу с тобой не буду — не имеет смысла спорить о минеральном составе устриц с тем, кто ограничивает свои оценки категорией "вкусненько".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[19]: Что вас останавливает от изучения нового языка?
От: Undying Россия  
Дата: 25.04.11 14:28
Оценка:
Здравствуйте, samius, Вы писали:

U>>Пример со string.Join показывал, что очень часто проблема мусорности кода может быть решена средствами имеющегося языка. Но в силу привычки думать заученными конструкциями программисты просто не замечают, что данный код является мусорным, и соответственно не ищут способа избавиться от этого мусорного кода.


S>См. так же пример с Where
Автор: Undying
Дата: 23.04.11
.


И где там мусорный код и лишние сущности?
Re[17]: Что вас останавливает от изучения нового языка?
От: vdimas Россия  
Дата: 25.04.11 14:31
Оценка: 21 (1)
Здравствуйте, VladD2, Вы писали:

VD>Я не знаю что за хреть такая IIOP.Net, то чудес не бывает. Единственное решение которое я могу себе представить — это завести структуру которая бы сдублировала бы все поля всех вхождений АлгТД плюс тег. В итоге вместо создания объекта получаем перемножение всех полей всех вхождений. Передавать такую структуру через параметр это просто праздник какой-то.


Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает. Эти ссылочные поля нельзя перекрывать нессылочными. Только ты GC все-равно не поломаешь, среда исполнения просто не загрузит такую сборку. Я же не зря упомянул процесс "упаковки". Должен быть внутри адресного поля объекта некий "пул" под объединение нессылочных и отдельно ссылочных полей.

Вот простеший пример, я поля вручную раскидал, ссылочные перекрывают ссылочные, нессылочные перекрывают нессылочные:
  Скрытый текст
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace Union
{
    class Program
    {
        class TestObj1
        {
            ~TestObj1() { Console.WriteLine("TestObj1 collected"); }
        }

        class TestObj2
        {
            public virtual void SomeDummyMethodTomakeVTableDifferenced() { }
            ~TestObj2() { Console.WriteLine("TestObj2 collected"); }
        }

        struct A
        {
            public int i;
            public TestObj1 s;

            public A(int i, TestObj1 s)
            {
                this.i = i;
                this.s = s;
            }
        }

        struct B
        {
            public double d;
            public List<TestObj2> objs;

            public B(double d, List<TestObj2> objs)
            {
                this.d = d;
                this.objs = objs;
            }
        }

        [StructLayout(LayoutKind.Explicit)]
        struct Union
        {
            public enum Tag
            {
                A, B, C
            }

            [FieldOffsetAttribute(4)]
            Tag _tag;

            // A fields
            [FieldOffsetAttribute(sizeof(Tag) + 4)]
            int i;
            [FieldOffsetAttribute(sizeof(Tag) + sizeof(double) + 4)]
            TestObj1 s;

            // B fields
            [FieldOffsetAttribute(sizeof(Tag) + 4)]
            double d;
            [FieldOffsetAttribute(sizeof(Tag) + sizeof(double) + 4)]
            List<TestObj2> objs;

            public A A
            {
                get
                {
                    if (_tag != Tag.A)
                        throw new InvalidCastException();

                    return new A(i, s);
                }
            }

            public B B
            {
                get
                {
                    if (_tag != Tag.B)
                        throw new InvalidCastException();

                    return new B(d, objs);
                }
            }

            public Union(A a)
                : this()
            {
                _tag = Tag.A;
                i = a.i;
                s = a.s;
            }

            public Union(B b)
                : this()
            {
                _tag = Tag.B;
                d = b.d;
                objs = b.objs;
            }
        }

        static void Main(string[] args)
        {
            A a = new A(1, new TestObj1());
            B b = new B(1.0, new List<TestObj2> { new TestObj2(), new TestObj2() });

            Union u1 = new Union(a);
            Union u2 = new Union(b);
        }
    }
}

Отлично вызываются все финализаторы. Запусти проверь. Заметь, я поставил не просто два экземпляра похожих типов, но один из них завернул в коллекцию List<>.



VD>>>Потому во всех языках дотнета (что поддерживают АлгТД) АлгТД сделаны через классы.


V>>И вот целый пласт возможных оптимизаций на уровне джита просто обрубается, не говоря уже о том, что даже дотнетная куча вовсе не бесплатна.


VD>Стек тоже не бесплатен.


По моим замерам, для небольших структур (на десятки байт), во многих сценариях было быстрее почти на порядок использовать эффективнее стековые объекты, чем из кучи. Понятное дело, что компилятор должен иметь верхний предел размера объекта после операции всех упаковок для принятия решения о технике реализации конкретного АлгТД.

VD>Смысла нет. На копировании в итоге проиграешь. Разве что ли для вариантов с одним полем. Но это как раз редкость.


Где-то на копировании проиграешь, а где-то за счет -1 уровню косвенности прилично выиграешь. Про верхний предел в размере я уже сказал и его было бы неплохо поискать через эксперименты. Или же явно дать программисту возможность управлять этим, MS же не постеснялась ввести ключевое слово struct. Потому как не только размер имеет значение, но и сценарии использования. Почему бы не ввести некое "variant value"?

VD>Многие варианты рекурсивны и имеют по 3 и более полей. Делать разную семантику для одной и той же сущности?


Фишка в том, что даже рекурсивные АлгТД вполне выполнимы по этой технике и во многих простых случаях дают прирост за счет буста наиболее частой операции — получения головы. Почти все алгоритмы смотрят/матчат значение головы, а тут -1 на косвенность. Это не мало.

VD>Забавно, что отсутствие в Яве пользовательских вэлью-типов заставило ее авторов больше заниматься оптимизацией. В итоге казалось бы более убогий рантайм работает быстрее дотнетного.


Дополнительные оптимизации к этой только плюсуются и никак ей не помешают. Передача небольших типов по значению — это самое естественное в программировании.
Re[8]: Что вас останавливает от изучения нового языка?
От: FR  
Дата: 25.04.11 14:42
Оценка:
Здравствуйте, alpha21264, Вы писали:

FR>>Есть даже препроцессоры, но не текстовые как в Си/С++ а синтаксические например http://en.wikipedia.org/wiki/Camlp4

FR>>которые также оперируют AST.

A>На первый взгляд штука могучая, но... Она только на один язык заточена?

A>Могу я эти макросы для произвольного (например русского) языка применить?

Для русского вряд ли.
Для несложных языков программирования возможно: http://brion.inria.fr/gallium/index.php/Full_parser_tutorial
Re[20]: Что вас останавливает от изучения нового языка?
От: dimgel Россия https://github.com/dimgel
Дата: 25.04.11 14:50
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Гарантия "на int и string функция вернет Boo" не сильно круче, чем "на 2 аргумента верну 1",


Ну не круче, так не круче.

VE>а даже примитивные проверки NotNull в большинстве статически-типизируемых прикручиваются теми же тестами и ассертами.


В скале можно на этапе компиляции, хотя со строковыми литералами там беда.

VE>В этом контексте

VE>

D>>Демагогия detected. Система типов именно что даёт математически доказанные гарантии.

VE>звучит как-то нелепо.

Ну нелепо, так нелепо. Пишите на динамике, мне же лучше.
Re[22]: Что вас останавливает от изучения нового языка?
От: dimgel Россия https://github.com/dimgel
Дата: 25.04.11 14:53
Оценка:
Здравствуйте, VoidEx, Вы писали:

D>>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?


VE>Дык если и правда можно, то PHP хороший язык. Но на практике почему-то не пишут.


Был здесь несколько лет назад некий Роман Дубров, доказывал мне с пеной у рта, что на PHP можно написать всё что угодно, и что memcached является частью платформы PHP, и что сериализация данных при его использовании не выполняется. Много ли этого самого "чего угодно" он написал, мне неведомо. Ну а я тоже дурак — зачем мне его разубеждать? Больше ламеров — ценнее моя квалификация. Адью.
Re[18]: Что вас останавливает от изучения нового языка?
От: hardcase Пират http://nemerle.org
Дата: 25.04.11 14:59
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает.


Всё это очень здорово. Если бы не одно но — в дотнете есть генерики. Вся эта оптимизация для контейнерных variant-ов идет лесом, она также идет лесом для вариантов наследованных от обыных классов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[18]: Что вас останавливает от изучения нового языка?
От: hardcase Пират http://nemerle.org
Дата: 25.04.11 15:04
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает. Эти ссылочные поля нельзя перекрывать нессылочными. Только ты GC все-равно не поломаешь, среда исполнения просто не загрузит такую сборку. Я же не зря упомянул процесс "упаковки". Должен быть внутри адресного поля объекта некий "пул" под объединение нессылочных и отдельно ссылочных полей.


И еще, если мы имеем в варианте структуру, состоящую более чем из одного поля, а также без LayoutKind, то оптимизация опять же идет лесом.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[13]: Что вас останавливает от изучения нового языка?
От: FR  
Дата: 25.04.11 15:18
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>На самом деле делать АлгТД в виде единого блока данных (вэлью-типа если по дотнетному) можно даже если АлгТД рекурсивный. МЛ именно так и поступает, если я не ошибаюсь.


В OCaml если конструктор АлгТД без параметров то он представлен целым числом, иначе прямой указатель на блок памяти (в куче) со значением параметра конструктора. Реинтерпретация памяти не используется.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.