Рискну дать тебе совет: ты лучше не с ветряными мельницами борись в попытках найти ответ на вопрос, что останавливает людей от изучения новых языков, а собери статистику причин, которые заставляют изучать новые языки. Ручаюсь, узнаешь много нового и неожиданного.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>И ответ "не хочу" на предложение прочитать статью, описывающую техники переднего края должен быть не мыслим.
А ну-ка, что у нас тут на передовом крае:
Gandy, Robin O. The simple theory of types. In Logic Colloquium 76, volume 87 of Studies in Logic and the Foundations of Mathematics, pages 173–181. North Holland, 1976.
Whitehead, Alfred North and Bertrand Russell. Principia Mathematica. Cambridge University Press, Cambridge, 1910. Three volumes (1910; 1912; 1913).
Ramsey, Frank P. The foundations of mathematics. Proceedings of the London Mathematical Society, Series 2, 25 (5): 338–384, 1925. Reprinted in (Braithwaite, 1931). Church, Alonzo. A formulation of the simple theory of types. Journal of Symbolic Logic, 5: 56–68, 1940.
Martin-Löf, Per. An intuitionistic theory of types: predicative part. In H. E. Rose and J. C. Shepherdson, editors, Logic Colloquium, ’73, pages 73–118. North-Holland, Amsterdam, 1973.
Martin-Löf, Per. Intuitionistic Type Theory. Bibliopolis, 1984.
Berardi, Stefano. Towards a mathematical analysis of the Coquand-Huet calculus of constructions and the other systems in Barendregt’s cube. Technical report, Department of Computer Science, CMU, and Dipartimento Matematica, Universita di Torino, 1988.
Barendregt, Henk P. Lambda calculi with types. In Abramsky, Gabbay, and Maibaum, editors, Handbook of Logic in Computer Science, volume II. Oxford University Press, 1992.
Причем предпоследнее — это скорее классификация имеющихся знаний, чем что-то новое. А последнее — тем более, довольно-таки прикладной репорт на основе имеющегося материала. В общем, что-то скорее нафталиновое, чем передовое. Да и есть ML-языки, которые пытаются реализовать эти наработки. И что эти яыки из себя представляют мы прекрасно знаем: неудобство для общеприкладных задач и тормозной получаемый код, требующий дохрена памяти. Был бы этот сыр бесплатный, весь этот материал давно был бы в мейнстриме.
Ну и опять же. Про узость самой области исследований языков ты похоже не въезжаешь абсолютно. Давай я тебя с утра до ночи алгоритмами обработки сигналов грузить буду? Это же круто! И даже область применения на многие порядки шире. Это настолько повсеместно используется, что вы просто не замечаете. Оно "работает и всё". Но в ней как раз "передних краев" дофига, т.е. гораздо больше свежака (катализованного спросом на сетевые технологии), в отличие от всего этого нафталина в области ФП и доказательства теорем.
Ну и по последнему писку моды тоже хватае тпроблем и они известны. Для зависимых типов — это ввод значений, требующий в общем случае техники суперкомпиляции (а не того подобия техники динамического приведения, что ты когда-то предлагал), а uniqueness типы имеют проблемы в многопоточном окружении. Собственно, эта практика еще допиливается, исследования идут именно в направлении как сделать это полезным на практике, и до мейнстрима прямо сейчас еще далеко. Такова се ляви.
WH>Лаптев на предложение почитать про немерле сказал примерно тоже самое но другими словами.
Дык, Немерле ведь от всего вышеупомянутого страшно далек, ты его сюда не приписывай. Он просто динозавр, родившийся поздно. Представляет из себя сугубо практическую попытку собрать несколько полезных наработок в одном языке на основе имеющейся мощной платформы, угу. В общем, вовсе не "край", а сугубо практическая попытка найти приемлемый компромисс м/у обилием фич и привносимыми ими помехами. Кстати, я не отрицаю полезность этой попытки. Скорее наоборот, обоими руками ЗА. Ведь макросы в С несколько сдали назад по тем временам и подорвали доверие к этой технике. Например, даже возможности макроассемблера на порядок превосходят возможности препроцессора С, не говоря уже о 50-летнем Лиспе или 40-летнем Форте. Пора вернуть макросы на заслуженное место, снабдив их типобезопасностью. Возможно, Немерле своим примером поможет сделать это в следующих версиях интересных мне языков. Хотя, справедливости ради, чрезмерное увлечение макросами всегда считалось плохим тоном во всех перечисленных языках. Элегантности кода не нужно приносить в жертву очевидность происходящего. Иначе бывает больно, вплоть до полного выкидывания и переписывания заново. В общем, моё ИМХО по этому вопросу умеренное, не приемлет обе крайности.
V>>Нужно нечто более полезное из прикладных IT-областей. WH>Бла-бла-бла.
Кстати, показательно. По-твоему, "настоящие программисты" должны писать софт исключительно для других программистов и заниматься исключительно проблемами языков. Сорри, но это сразу в сад, не задерживаясь.
V>>Язык реализации — это последнее, что интересует. Вернее, не интересует никогда. WH>Ну да... конечно. WH>И после того как человек в это начинает верить получается всякая байда типа компиляторов на С.
А что не так с С? Отличная абстракция ассемблера. Настоящий нейтив во-плоти, без встроенных фокусов (если сравнивать с Паскалем, например). Что получится в итоге известно фактически до бит, что и требуется для ПО, непосредственно общающегося с кодом. С этого языка "взлетают" все современные аппаратные платформы, и уже поверх него работают все эти джавы, дотнеты и прочие экзотичности. Поверх него — т.е. поверх кода, созданного компилятором С. Фактически весь современный нейтивный код написан на С/С++, от операционок, офиса и БД, до дотнета и игрушек.
V>>Защитите хотя бы кандидатскую... WH>И нахрена оно мне надо?
Чтобы привести в порядок собственные наработки. Чтобы в численном виде подсчитать характеристики и преимущества, наконец, если они есть. Чтобы провести и зафиксировать полноценное сравнение с имеющимися наработками в этой же области, показать прогресс (если есть), и характерные отличия.
Например, ты прямо сейчас способен обосновать, почему нерекурсивные алгебраические типы представлены ссылочными типами, хотя дотнет позволяет оперировать value-type? А ведь ML-языки умеют делать такие оптимизации уже черти сколько лет. Пяток подобных вопросов без убедительных ответов, и можно идти допиливать диссер, а лучше сам язык.
V>>Ну и самое главное — будущего инженера надо научить учиться, а остальное — шелуха и болтовня. Дотнетов, джав и прочих технологий будет еще много, заранее всему не научишь. А классика — она вечна. WH>И что есть классика? WH>С++?
Для императивных — Фортран/С/Паскаль. Функциональный — Лисп, логический — Пролог. Отличные языки для изучения парадигм. Почему отличные? — а ничего лишнего, никаких понтов, шелухи и синтаксического сахара. Да, в этом и проблема Пролога например, что у него плохая стыковка с "общепрограммисткими" задачами, типа ГУИ, БД, сетка и т.д. Но для целей изучения логического програмимрования — это наоборот, мега-плюс. Бо ничего лишнего.
V>>Во-первых, в 20 раз меньше кода — это ты переборщил. WH>1)Читай что написано. WH>2)Это факты. WH>Причем даже без макросов.
Пока я не видел примеров. Все, что многократно приводились на этом сайте и по сто раз обсуждались в течении 5-ти лет, не дают такой разницы. Ну и домашние заготовки под определенные классы задач в любом более-менее универсальном языке накрутить можно.
V>>Насчет простоты поддержки... Чем более решение высокоуровневое, тем более дорогая нужна поддержка, то бишь требующая более дорогих спецов. Я пока сталкиваюсь ровно с противоположным, что мои более-менее неординарные снипетты кода ругаются более молодыми коллегами за "сложность и непонятность". WH>Неординарные? Ты имеешь в виду лапшу?
А вот и оно, спасибо. Типичный индусокод. Ни малейшего понятия о декомпозиции и тестопригодности. Развязаться через независимые ф-ии видно не судьба.
Насчет тестопригодности. Ты должен будешь на один метод завязать как кучу низкоуровневых независимых тестов по проверке каждого отдельного вычисления, так и комплексные тесты, проверяющие их комбинации. А это залёт, курсант.
И где там пуля, ткни пальцем. 90% — ветвления идет по единичному тагу размеченного объединения.
Или в этих строках, что ли:
В факте предпросмотра на один уровень вперед (тоже самое тут: Fsm(a)::Fsm(b)::rest)? Да еще через ж... динамическую типизацию в реализации Nemerle? Издеваешься или как?
В общем, декомпозируй решение, и на любом языке это будет смотреться очень похоже. Ни в какие 20 раз и близко разницы не будет.
Если энергичные, то в топку, бо многопроходность, а оно вполне решаемо за один проход.
Тоже самое с Sequence(rules). Заметь, на плюсах тут вполне можно было обобщить на шаблонах оба случая. Но на немерле или C# — это надо было бы городить огород из паттерна "Стратегия" для целей обобщения, и овчинка выделки не стоила бы.
Собственно 90% функциональности метода рассмотрено. Проходишь по всем вложенным конструкциям и вызываешь оптимизацию правил для вложенных правил, если есть. Самих оптимизаций по сути две — это оптимизация последовательностей Not/And, и вызов FsmBuilder для цепочек символов и автоматов.
Далее. Есть предложение для обоих случаев насчет возможности построения оптимизированного варианта сразу, по мере парсинга правил, а не "потом", за вот этот проход оптимизации. Это как разница в подходах построения ДКА — сначала можно строить по регулярным выражениям НКА, приводить его к ДКА, а затем минимизировать, но ведь можно строить сразу минимизированный ДКА — это порой на порядок быстрее, т.к. на каждом шаге обработке подвергается множество меньшей мощности. Хоть алгоритм и чуть более сложный, угу. К автомату, в свою очередь генерируемому вызываемым тут FSMBuilder это тоже относится.
Кстати, тут еще одно будет преимущество: optimize у тебя распадётся на составляющие, каждая из которых будет вызвана в нужном известном месте без дополнительной диспетчеризации по тагам (т.к. мы заведом знаем, где мы). А то сейчас имеем тот самый случай, когда сначала сливаем в бутылочное горлышко, а потом снова разливаем.
В общем, подкинь что-нить посущественнее, что ли...
WH>Прикинь как он будет выглядеть на С++.
Кое в чем буков будет больше, кое в чем меньше. Разницы в разы не будет. А после декомпозиции вообще будет фактически 1-в-1. Исключение составляют ленивые вычисления на IEnumerable, но это тогда на каком-нить C# надо воспроизводить. Или на плюсах таки сразу строить минимизированный вариант и не париться с последующей ленивой обработкой.
Здравствуйте, VladD2, Вы писали:
VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
Исключительно этот пункт. Вообще не выходит изучать что-то "для себя" — вроде и интересно, а "не идёт". Кстати, с обычными языками та же беда: заинтересовался было испанским, почитал, посмотрел, пару песенок перевёл, да и забросил.
What a piece of work is a man! how noble in reason! how infinite in faculty! in form and moving how express and admirable! in action how like an angel! in apprehension how like a god! the beauty of the world! the paragon of animals!
Re[5]: Что вас останавливает от изучения нового языка?
V>>Значимость парадокса Блабла ИМХО преувеличена. Этот парадокс скорее применим к студенту 1-го курса, пока он прошел только тройку императивных языков по программе, и ему еще не прочитали другие языки и парадигмы. Потому как после 2-3-го курса профильного обучения с его Лиспами, Прологами, ИИ, базами знаний и курсовыми по разработке "запчастей" компиляторов, остальное выглядит как "где-то я ЭТО уже видел". WH>Это не правда. WH>Вон посмотри на Дворкина с Лаптевым. Они блин профессоры!
Профессорство за знание языков, слава богу, не дают. Нужно нечто более полезное из прикладных IT-областей. Язык реализации — это последнее, что интересует. Вернее, не интересует никогда. Если только сама специализация не на языках, но это крайне узкая область IT и ей занят маленький % научного народу. Кстати, если ваши эксперименты действительно что-то новое и полезное дадут, дык, отбросьте лень, накатайте диссер на эту тему. Защитите хотя бы кандидатскую... По возрасту еще не очень поздно.
WH>Но один застрял в С++ другой в обероне.
Оба достаточно универсальны для целей обучения императивному программированию.
Для примера, Лисп тоже весьма проблемный язык, как и Пролог, и не зря есть куда как более "продвинутые" современные их аналоги, однако же их успешно преподают на курсе "языки обработки знаний", потому как если студент поймет как работает программа на Лиспе и Прологе, он поймет и принцип работы более современных поделок.
Ну и самое главное — будущего инженера надо научить учиться, а остальное — шелуха и болтовня. Дотнетов, джав и прочих технологий будет еще много, заранее всему не научишь. А классика — она вечна.
WH>И ничего за их приделами не видят.
Прекрасно видят. Не видят пользы для целей обучения. Даже Паскль и С/С++ на отлично в ВУЗах знает меньше половины студентов. Или в твоей группе, где ты учился, была другая статистика? В общем, куда там твои "гигиенические макросы"... Захотят быть спецами — изучат сами, тем более после Лиспа.
WH>Вот только ты сильно преуменьшаешь значимость языка. WH>Если кода в 10 раз меньше, то это не только разгоняет разработку раз в 20, но и упрощает поддержку раз в 100.
Во-первых, в 20 раз меньше кода — это ты переборщил. Когда речь идет о такой катастрофической разнице, то уже используются кодогенераторы, даже самописные. Получить эти 20 раз можно лишь на очень маленьком классе задач, вот например то самое описание DependecyProperty в сравнении с C#. Но, во-первых это очень малая часть проекта, а во-вторых, в крайнем случае на макросах-шаблонах CLR/C++ с опцией компиляции в чистый байткод тоже выкрутиться можно в те же 20 раз, подготовив некий синтаксис простого перечисления.
А вот на произвольно взятой общей задаче, где нет "домашних заготовок" ты эти 20 раз не получишь никогда, ибо решения верхнего уровня будет выглядеть весьма похоже даже на разных языках, а все низлежащее придется делать и там и там.
Приличный разгон дает лишь повторное использование кода во многих проектах. Но это работает даже на библиотечном уровне.
Насчет простоты поддержки... Чем более решение высокоуровневое, тем более дорогая нужна поддержка, то бишь требующая более дорогих спецов. Я пока сталкиваюсь ровно с противоположным, что мои более-менее неординарные снипетты кода ругаются более молодыми коллегами за "сложность и непонятность". Они так и говорят, пусть будет в 3 раза больше кода, но пусть оно будет в 3 раза понятней и без сюрпризов в отладке. Спрашиваю — ну дык если что-то переделать, вам в 10 раз больше переделывать придется, вместо того, чтобы подкрутить в одном месте — "пусть, зато за конечное время".
От изучения не останавливает ничего, каждый разработчик изучает за свою жизнь великое множество всякой дряни, и в большинстве своем, это куда менее забавно чем поиграть с новым языком.
Правильный вопрос — что подталкивает к изучению. Подталкивают реальные задачи, они уже стоят, их уже нужно решать. И пока не будет очевидно что существующие инструменты для этих задач плохо подходят — вряд-ли кто-то будет искать что-то новое
Для примера миграция части проекта на шарп произошла исключительно из-за GUI библиотек на нете. Сам язык как никого не интересовал тогда, так никого не интересует и сейчас
Еще часть проекта мигрировала на шарп из-за необходимости написать тонкого веб клиента. И опять сам язык никого не интересовал ни тогда, ни сейчас
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
ГВ>>Не, этот код я полностью не могу прочесть, потому что смутно представляю себе постановку задачи. ПМ, язык — это всё шелуха. Кстати, спасибо, что объяснил, что именно и зачем тут оптимизируется.
VD>Нет, уважаемый. Код тут вполне очевидный. Вон тот же vdimas разобрался с ним на раз. Даже нашел реальный недостаток — небольшое дублирование функционала. А вот ты его не понял.
Как по мне, так тут недостатков намного больше. Кстати, что характерно, vdimas понял и моё высказывание тоже.
VD>>>Ген. Не моли чушь просто от того, что ты не понимашь написанного. Ну это же бред. ГВ>>А... Да, есть ошибочка. VD>Это не ошибочка. Это полное непонимание. Оно не мудренно. ПМ — это действительно другой подход к программированию. Но я тебе уверяю, что освоить его полезно просто для собственного развития.
Завелась шарманка... Оказывается локальный байндинг имён — это killer feature, надо мужикам с Прологом рассказать, что они, оказывается, на острие прогресса. Влад, как ты думаешь, почему я упустил это из внимания?
ГВ>>Вызов optimizie нужно было записать примерно так: optimize(And(r.Location, rule.r.r), чтобы показать, что новый узел формируется из вложенного. Но это простительная неточность в данном случае.
VD>Ага. Это простительная. Это — опечатка. А вот это "if (match(rule, Not(Not()))" полная чуешь.
Это почему это? Допущение для иллюстрации, не более того. В реальности код может выглядеть примерно так:
if (match(rule, Rule(Rule::Not, Rule(Rule::Not)))) ...
Что с помощью инлайновых функций несложно упрощается до искомого:
if (match(rule, Not(Not())))) ...
Можно помудрить и с привязкой переменных, получится что-то в этом роде:
if (match(rule, Not(Not, &subRule))) ...
То есть в subRule (скорее всего, это будет какой-нибудь smart-указатель) попадёт результат унификации, сиречь, анализа, выполняемого функцией match. Термин "унификация" употреблён из-за схожести процесса с прологовской унификацией.
ГВ>>Я же полностью рабочий код не собирался делать. VD>А кому интересны не работающие выдумки? Я тогда могу тоже код представить: Done! и заявить, что он решает данную задачу.
Как минимум, они интересны тебе, раз ты продолжаешь их обсуждать.
ГВ>>Кстати, Not(Not()) может быть заменён на статическую константу: ГВ>>
VD>Ну, то есть ты перемещаешь код проверки объекта в match. А что тогда ее код не приводишь?
Так он тривиальней некуда, хотя зависит от реализации самого Rule. Вот из-за того, что мне лень всё это раскручивать, я и не привожу код match.
VD>Кроме того ты не понял важной фишки ПМ. ПМ не только распознает паттерн, но и производит декомпозицию структуры данных. VD>Паттерн: VD>
VD>| Not(Not(rule)) => ... rule ...
VD>
VD>означает выполнить код "... rule ..." в случае если сопоставляемый объект это экземпляр типа None у которого поле rule яляется так же экземпляром типа None, и если этот паттерн распознался, то связать с полем rule вложенного типа локальное имя rule. В коде обработчика (том что идет за =>) в rule будет находиться ссылка на поле вложенного типа. Кроме того тип поля rule Rule (а это базовый тип для Not и остальных правил), так что ПМ за одно осуществляет проверку типов.
Угу, спасибо за объяснение. Почему-то ничего нового для меня тут не прозвучало. Да, я действительно не придал значения локально связанным именам, но, в общем, на мой вывод (и на иллюстрацию) это никак не влияет.
ГВ>>Спасибо за перевод, но это мне понятно. VD>Очевидно же, что не понятно. Или надо констатировать факт — ты обманываешь намеренно.
Кого обманываю и в чём?
ГВ>>Конечно, не гарантируется. Только кто тебе сказал, что по отношению к такому примеру цикл заметно ухудшит код? VD>Мне говорить не надо. Я это на своей шкуре проходил. Это и замедление, и возможность вылететь по переполнению стека.
Я не доверяю переживаниям "твоей шкуры" уж лет восемь как. Так что, не стоит бередить старые раны.
ГВ>>Цикл тут один, подразумевается он в любом случае, хотя бы в виде tail-оптимизированной рекурсии через ПМ, так что, на "понимаемость" кода его введение повлияет слабо. VD>Ну, ты давай, перепиши весь пример на знакомом тебе языке, так чтобы он работал и сравним. VD>С рекурсией здесь все шоколадно, а цикл сразу добавит грязи.
Немного добавит, не спорю, но принципиальным для сопровождения это не станет. Главная проблема здесь в теоретической основе этих самых match-ей, что ты сам и доказал, сказав, что Wolfhound потратил пару месяцев на... Короче, не помню, на что именно, на что-то теоретическое.
ГВ>>Да и управляться он, пожалуй, будет лучше. VD>
ГВ>>Иными словами, приведённый фрагмент будет выглядеть где-то так:
ГВ>>
VD>Это бред, который даже не скомпилируется. Зачем повторяться?
Чтобы показать, где именно будет стоять continue в этом коде.
VD>>>2. Компилятор немерла работает не с объектами, а свариантами. Это позволяет ему контролировать, что match-и обрабатывают все возможные сочетания. В твоем случае такая проверка невозможна в приципе.
ГВ>>Хм. Not(Sequence(rule)) где? Ты ведь говоришь обо всех возможных сочетаниях, нет? Кстати, сочетания какой длины гарантированно контролируются?
VD>Контролируется, что в операторе match перехвачены все случаи, а не то что в коде присутствует перемножение всех сочетаний. [...]
Ясно, спасибо. Собственно, этого я и ждал (хотя надеялся на чудо) — да, контролируется полнота проверки по всем возможным вариациям данного АлгТД, но никак не его сочетаний. Пожалуй, что мне теперь стоит зацепиться за твою фразу: "...что match-и обрабатывают все возможные сочетания" и поднять шум о том, какой ты бессовестный обманщик и как вводишь в заблуждение своих наивных слушателей.
VD>Таким образом верхние паттерны (например, Not(Not(rule))) распознаю частные случаи, а нижние (например, Not(rule)) более общие. VD>В ПМ важен порядок. Паттерны идущие выше более приоритеные. Если они сопоставились, то нижние уже не проверяются.
Короче говоря, порядок перебора совпадений — "сверху-вниз" в порядке перечисления. В принципе, схоже с пролог-машиной, только там учитывается порядок занесения предикатов в базу данных. Правила перебора совпадают с точностью до деталей реализации вычислительной среды.
VD>>>Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель. Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше. ГВ>>Влад, ты когда с самим собой разговариваешь, клавиатуру в сторону отодвигай. При чём тут паттерн "посетитель"? VD>При том, что он описывает список веток которые нужно посещать и как и ПМ гарантирует, что ты не забудешь посетить их все.
Ценой распыления аналитического кода по всем классам? Ну, я не спорю, субъект с тяжёлым синдромом ООП головного мозга способен и на такое ради "гарантий". Только зачем болезнь выдавать за правило?
ГВ>>То есть я понимаю, каким боком его тут можно привинтить, но это как тебе сказать... Нечто вроде метода показать наихудший из возможных способов реализации. Здесь самая обыкновенная трансформация дерева структур, даже ОО-стиль особо-то впихивать некуда. VD>Посетитель наилучший способ из имеющихся в арсенале ООП. Код обработки выделяется в одном месте. Есть возможность гарантировать, что посещены все ветки. Можно добавлять другие обработки не ломая уже существующие и не вводя тонны методов (по одному на каждую ветку).
Хм. Зачем ты так рьяно защищаешь такое убогое применение ООП? Ну, я как бы в курсе твоего любимого метода критики — взять нечто идиотское, реализованое на языке X и на этом основании заклеймить весь язык X, но это не совсем чистоплотно, не находишь?
VD>Если тебе это не очевидно, я не виноват.
Ты понимаешь, в чём проблема, я переболел парадигмами и прочими идеологиями уже довольно давно. Поэтому то, о чём ты говоришь, мне очевидно, но очевидно ещё и то, что сейчас я (и не только я) без веских причин так не сделаю, чтобы там ни тарахтели разнообразные ООП-пуристы и прочие, сдвинутые на спасении мира посредством чистоты парадигмы. Честно, мне плевать, как код реализации проецируется на некий идеал, взятый из той или иной химеры (aka парадигмы), я руководствуюсь вполне локальными соображениями.
VD>Вариант с МП обладает всеми теми же достоинствами плюс: VD>1. Намного более краткий. VD>2. Позволяет легко обрабатывать сложные случаи (вложенные паттерны).
VD>В приведенном примере вложенность небольшая (2). Но она не ограничена. И чем сложнее анализ, тем полезнее становится ПМ.
Я не спорю с тем, что ПМ полезен, но это далеко не то, ради чего стоит пускаться во все тяжкие (читай, непременно менять язык реализации и т.п.).
VD>>>Так что насмехаешься и горлопанишь ты тут исключительно от своей невежественности. Ну, а приведенный тобой "код" просто нерабочий. ГВ>>Конечно, не рабочий, я и не пытался делать его рабочим. Я тебе что, полный PEG-парсер буду переписывать? VD>Ну, а что обсуждать набор символов нечего не имеющий с реальным кодом?
Разницу между иллюстрацией и фрагментом рабочего кода объяснять нужно?
ГВ>>Не, Влад, эпопею с делегатами я повторять не буду — одного раза мне хватило. VD>Я не слышал про эпопею с делегатами, но если там ты приводил такой же бред вместо года, то понятно что ты "победил" в том споре. Ведь всегда можно написать краткий и понятный, но неправильный код.
Я же говорю, что переживаниям "твоей шкуры" я доверяю чуть менее, чем никак. Ты теперь сам прекрасно подтверждаешь мои размышления. Поищи в Исходниках по ключевому слову "Делегаты на C++", там даже твои комментарии имеются. Лаялись, кстати, знатно. Что характерно, с того момента ты, если я ничего не путаю, уже изменил свою оценку значения делегатов, как таковых. А в C++ появились лямбды.
ГВ>>Это не значит ничего. То есть я хотел сказать, что в соответствии с правилами форума ФП из этих двух фактов можно сделать совершенно любой вывод.
VD>Ты? Да, пожалуй.
Я? Да, пожалуй, что не могу.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Изучать что-то новое всегда останавливает отсутствие материала для обучения.
Если брать конкретно nemerle:
1)Когда будет спецификация языка на уровне Ecma-334?
2)Когда появится Nemerle Team Blog или что-то в этом роде, где будут свежие новости, примеры, анонсы итп?
3)Когда будут статьи с внятными объяснениями чем макросы помогут рядовому программисту, который не компиляторы и DSL изобретает, а нечто более приземленное?
4)Когда появится хотябы одна книга или учебный курс по Nemerle?
5)Когда будет справка по библиотеке nemerle и макросов на уровне MSDN?
6)Когда будут опубликованы скринкасты, показывающие вживую разработку на nemerle?
Кстати если вы изобретаете свои фреймворки "независимые от asp.net\ado.net\что_то_там_net, то все указанное выше касается и этих фреймворков тоже.
Re: Что вас останавливает от изучения нового языка?
Ничего не останавливает. Изучаю, стараюсь применять на практике. Единственное исключение — Nemerle. Отпугивает сложиышшеся вокруг него сообщество в RSDN. Не хочется даже близко подходить.
Re: Что вас останавливает от изучения нового языка?
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Тут большиинство телепатирует, что вопрос скорее всего был задан с целью понять, почему народ не хочет изучать Немерле. Это не обязательно так, но предположим, что так.
Ответ простой: не нужен
Это почти что "3. Политические предпосылки — Все равно не смогу применять его на работе....", но не совсем.
Дальше идет мало отформатированный и плохо сформированый поток сознания
Итак, последние пару месяцев я периодически (по работе и для души) писал на:
— PHP
— Python
— Javascript
— Java
— Erlang
Оказалось, что эти 5 языков покрывают мои нынешние и будущие потребности, как бык корову. И куда и зачем впихивать туда еще один язык программирования —
То есть совсем непонятно, какие проблемы этот язык решит лично для меня.
— PHP. Мне за него платят. Так что приходится
— Python. На нем решаем проблемы, с которыми РНР не справляется. Быстрее, чем РНР, скриптовый, достаточно простой и лаконичный — то, что доктор прописал именно для скриптов (1000 строчек — практически потолок).
— Javascript. Ну, в вебе без него никуда
— Java. Потому что в graph databases она сейчас рулит со страшной силой, а я все думаю, куда эти самые базы применить
— Erlang. Потому что я все же подсел на Zotonic CMS ну и вообще он мне нра
Ну и не говоря о плюшках, которые каждый из этих языков предлагает (да, и РНР тоже):
— PHP. LAMP или LNMP (N == nginx). Проверенная годами связка
— Python. Скрипты + некоторая изящность самого языка + уже готовые удобные библиотеки типа Mysqldb/PIL и некоторых других
— Javascript. В вебе без него никуда А также ExtJS, jQuery И т.п.
— Java. Потому что мегакрутые фичи для graph databases на Java.
— Erlang. Думаю, и так понятно Асинхронность, параллельность и тыды и тыпы.
А зачем мне нужен Немерле?
Тут, помнится, не раз жаловались, что новые люди, приходящие в Немерле, через пару недель начинают писать компилятор вместо того, чтобы разрабатывать какие-то другие проекты на Немерле. Вот тут кроется и ответ на вопрос "почему" и на вопрос "зачем".
Если отойти в сторонку и взглянуть на суету вокруг Немерле, а также на сообщения людей, его продвигающих, то окажется, что:
— этим людям интересно языкостроение и написание компиляторов
— этим людям интересны парсеры, их теория и построение
Не даром в качестве killer-фичи языка в последнее время приводится именно Nemerle.Peg. Ведь несмотря на то, что формально язык позиционируется, как язык общего назначения, (подавляющее?) большинство разговоров о нем сводится имено к парсингу и/или компилятору.
Если бы я интересовался этими вопросами, то, возможно, меня Немерле и заинтересовал. Но, увы Даже для того самого PEG у меня на руках есть Neotoma для Erlang'а
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
В основном останавливает уверенность в том, что не в языке загвоздка. Прикладная IT-область, с которой работаешь, порой требует внимания и объема знаний на порядки больше, чем требуется для изучения некоего языка и его основных либ. И еще останавливает тот факт, что в багаже уже хватает историй с изучением языков до приличного уровня, успешного их применения в течении некоторого продолжительного времени, а потом это всё становится не нужным на новых проектах. Сколько еще подобного балласта надо изучить? К тому же, изучение языков — это вовсе не фундаментальные знания IT, а тоже весьма прикладные, недалеко отстоящие по характеру "знаний" от каких-нить библиотек или АПИ. Ну и самое главное, изучение языка и его использование не занимает исторически долгое время. Особенно при наличии достаточного кол-ва исходников, про которые можно сказать — "это true style для данного языка". Т.е. учить новые языки вполне можно (и желательно) для реальной работы на них, а не ради ознакомления с еще одним "занимательным диалектом".
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Время одиночек прошло, вот что останавливает. Приходится подстраиваться под команду.
Ты лучше поинтересуйся, что именно толкает людей на изучение новых языков. Это куда интереснее, ибо отсутствие каких-либо причин не изучать язык Х — не является причиной немедленно бросаться его изучать.
Re[5]: Что вас останавливает от изучения нового языка?
Дабы не витать в абстракциях, я буду говорить по вопросу на примере Nemerle.
Меня от изучения языка не останавливает ничего. Наоборот, интересно в новом всём копаться. Часто идеи из разных языков программирования можно переложить на используемый повседневно(ну, например, использование ООП в ассемблере)
Но само по себе изучение даёт мало. Язык надо еще применять и, при том, применять на реальных задачах. Например, изучить синтаксис LUA можно за день-два. А вот так, чтобы сказать, что я на этом языке умею программировать, у меня ощущение появилось где-то через год, когда на этом языке решил много всяких разных задач(я работал в GameDev, а там LUA широко применяется) и попрограммировал игровой GUI в смешанном императивно-фунциональном стиле.
А вот от применения чего-то нового останавливают несколько вещей:
1. Риск. Всегда есть ненулевая вероятность, что я не смогу эффективно решить этим языком свою задачу, впустую потрачу время и придётся вернуться к привычным методам, если кто-то уже не решал подобную и нет success story об этом. Конечно же, интересно быть первопроходцем, интересно копать и искать лучшее, но почти всегда на это у компании нет ни времени ни денег. Всегда легче "педалить" старым, проверенным, стабильным методом.
2. Страх. Самое страшное — это внутренние ошибки языка, IDE, отладчика. И есть понимание, что, так как язык молодой, шишек на нём не набили, то может всплыть что угодно как раз посредине пути по реализации проекта. Кто мне даст гарантию, что баги быстро исправятся, если я сделаю багрепорт? Кто мне даст гарантию, что они вообще исправятся? Когда сообщество вокруг языка не является устоявшимся, нет, вообще, гарантии, что все просто не разбегутся.
3. Человеческая инертность. Ну вот я такой весь из себя рыцарь на белом коне кодер на розовом слоне, который готов применять новый подход и идеи, но, как убедить членов команды, что язык будет полезен и стоит его изучать, и на нём мы сможем решать задачи быстрее и лучше? Исходя из пунктов 1. и 2. это будет трудно. Я на работе рассказывал про Nemerle, про фичи, про то, что есть статьи и ведётся разработка, на что мне ответили: "Смысл на него смотреть? За пределы RSDN он не вышел, никто о нём не знает".
雪の天使
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
WH>>Если кода в 10 раз меньше, то это не только разгоняет разработку раз в 20, но и упрощает поддержку раз в 100. U>Если сущностей в коде в десять раз меньше, а не буковок.
Кстати если сущностей столькоже, а кода очень мало получается наоборот. Кто поймёт собственный Regexp написанный месяц назад?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
...
4. Утомило в очередной раз искать — как в языке N вывести число в формате 00.000. Ну и ещё тысячу мелочей.
Принимаю платежи в любой валюте
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
L>Корректный ответ на этот вопрос можно дать только зная язык. L>Далее — см. парадокс Блаба.
Значимость парадокса Блабла ИМХО преувеличена. Этот парадокс скорее применим к студенту 1-го курса, пока он прошел только тройку императивных языков по программе, и ему еще не прочитали другие языки и парадигмы. Потому как после 2-3-го курса профильного обучения с его Лиспами, Прологами, ИИ, базами знаний и курсовыми по разработке "запчастей" компиляторов, остальное выглядит как "где-то я ЭТО уже видел".
Тем более что налицо следующее наблюдение: значительный прирост производительности программиста дает не столько язык, сколько наличие хороших библиотек и инструментария вокруг него. Джава или дотнет тому пример. Имеем тупые, как пробка, языки (по крайней мере C# в прошлых версиях), но мильон библиотек под все случаи жизни + одна из самых неплохих на сегодня IDE в сумме делают из тупейшего языка просто чудеса в плане производительности программиста. И даже миллионы индусов стали кому-то полезны. Значит, дело не столько только в языке, сколько в инфраструктуре: помимо среды и библиотек это доступный хороший справочный материал, форумы, книги, мильон примеров по интернету на все случаи жизни и т.д. Все это создает уверенность, что взяв этот язык вдруг не упрешься по ходу разработки в нечто, значительно прибавляющее трудоемкости и геммороя.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Не неси пургу. Это трансформация дерева. Причем вынесенная в отдельную функцию (локализованная). Устранять здесь "диспечиризацию" — означает превращать код в говно смешивая разную логику.
Кто-то предложил устранить диспетчеризацию? Перечитай плиз замечания еще раз, бо ты пока не понял, что именно критикуется.
VD>Если ты до этого еще не до рос, то иди работай над собой, а не давай советы вселенского масштаба и вселенской же глупости.
И тебя приятно видеть все в той же боевой форме.
V>>Хе. А если ему Лисп привычен? VD>Он только название такое знает.
А как с тобой люди работают? После пары итераций любого технического обсуждения с тобой самый адекватный ответ на твои выпады — это предложения эротического плана. В общем, поменьше рефлексии.
V>>А что, обрабатываемые правила могут иметь бесконечную вложенность?
VD>С достаточной чтобы получить переполнение стега.
Ты в состоянии нарисовать такую систему правил, что глубина графа выражений переполнит стек при его обходе?
V>>И вопрос на 1000000 баксов: в Немерле хвостовая рекурсия только в рамках одной ф-ии работает?
VD>К сожалению — да.
В принципе, тогда все ясно, половину обсуждения можно сворачивать.
VD>Проблема в том, что реализовать взаимную рекурсию для общего случая не так просто.
Общий случай спасает агрессивный инлайнинг, который умудряется раскручивать в цикл даже нехвостовую рекурсию. Хотя, суперкомпиляция — это отдельная тема, но мое ИМХО в том, что для языков с ПМ суперкомпиляция просто обязательна.
VD>Ну, не томи. Давай продемонстрируй нам код на шарпе или плюсах. Потом без посетителей конечно можно жить, но вот только до появления второго обхода дерева. После этого экономия на спичках сразу же превращается в гимор.
Это понятно, просто сия задача оптимизации сильно привязана к типу узла, и я многократно видел (и сам так же организовывал оптимизацию графов выражений) именно через ее реализацию в теле соответствующего объекта, представляющего узел. Бо задача как бы обязательная при построении графов выражений. Как минимум от лишних скобок (ваше And(And))) всегда избавляются.
Хотя, после пояснения относительно ограничений хвостовой рекурсии в N все вопросы отпадают. Беда, тут нечего обсуждать.
Вот этим стоило заняться в первую очередь. Просто все остальное бросить и заняться этим. Ибо (посмотри чуть со стороны) влияние фичи конкретной реализации компилятора на стиль писания на языке (а компилятор и язык, по идее, не одно и то же, хоть и верно для ваших реалий), это жирный такой минус. Факт: приведенный код сразу же сказал о св-вах компилятора заглянувшему человеку со стороны. Показательно.
VD>Код, кстати, не верный.
Проверь оригинал. Если же речь про Location, я позволил себе опустить подробности.
VD>А что ты будешь делать когда потребуется еще один уровень вложенности? Начнешь типы приводить и вложенные кейсы писать? VD>Да, и не видно шаблонов! Ты тут ведь недавно про шаблоны говорил. Они же должны дать невероятный эффект.
Я говорил про код Гены и хелперы для синтаксиса.
VD>Очень интересно что ты будешь делать когда придется кроме оптимизации еще каую-то обработку сделать? Бежим по файлам и добавляем новые методы? Посетитель ведь нам не нужен.
Смотреть надо. Посетитель тоже тормоз порядочный, хоть и быстрее обычно на порядок, чем развесистый ПМ. Если не привязываться в AST к виртуальным вызовам и некоему "базовому интерфейсу", который не облокотился при наличии структурной типизации на шаблонах в С++, то конечно! бежать по файлам и добавлять легковесные операции в специализированные легковесные объекты, всё в инлайне и без виртуальных вызовов.
В общем, в плюсах свои интересные плюшки есть и их охотно пользуют.
VD>А где Команда? Ты ведь еще этот паттерн упоминал.
"Стратегию", а не "Команду". и не для матча, а для одной из операций во время пробега по списку.
VD>Если приглядеться, то несложно заметить, что код твой стал полным говном, так как контроль компилятора утрачен. Обрати внимание на то что МП контролирует наличие всех возможных пересечений в match.
Ты уж договаривай. Ваш матч так же позволяет задать дефолтное поведение, чтобы не описывать все варианты, если оно не надо. С++ тоже не позволит не вернуть значение, если его положено вернуть, поэтому там стоит default. Насчет лучшей типизированности решения на матчах я и не спорю, бо лучшая типизированность всегда лучше.
А замечания были о следующем, напомню:
— диспатчинг и обработка свалены в кучу, например, приведенные мной ф-ии не были завязаны даже на optimize, т.е. на ограничения по хвостовой рекурсии, т.е. они просто не нужны в теле этого метода. И их нельзя отдельно протестировать в данном оформлении. А тестировать надо, ведь вы запчасти компилятора пишете, и ошибка вероятна не только в этом коде, а где-то еще в компиляторе, но на этом участке она может просто проявиться.
— утверждения насчет 20 раз экономии строк кода.
Оба вопроса ортогональны друг другу.
VD>Серьзено? Вместо аж трех? Ты привел замену двум строкам кода: VD>
VD>В результате вместо двух строк ты получил 7 в сжатом виде.
Нет, я получил вместо N строк кода N+2. Дополнительные строки, связанные с закрывающими скобками, зависят от форматирования.
VD>А в придачу ты заработал геморрой на всю оставшуюся жизнь, так как код этот не будет контролироваться компилятором. Любой изменение в структуре правил сможет привести к долгим и мучительным вискиваниям мест в которых ты забыл добавить обработку.
Ровно наоборот. При удачной декомпозиции, любые изменения в ДРУГИХ, не связанных типах узлов, не повлияют на ЭТОТ код.
V>>"Рабочесть" приведенного кода зависит от обвески,
VD>Что за rule тут взялось из неоткуда? А Not(Not()) это что за хрень? Врменные объекты?
Вот, наконец вопросы по существу, хоть и развлекательного плана.
Да, Not(Not()) может быть чем угодно, например, временным объектом, и совсем другим, чем Tag::Not, т.е. специальным как бы "синтаксическим хелпером", он может быть 0-й длины, и служить исключительно целям визуализации диспетчеризации перегрузок сигнатуры match. В общем, в плюсах выбор синтаксиса невелик: это синтаксис вызова ф-ий (оно же вызов конструкторов) + переопределяемые имеющиеся операторы, в том числе operator(). Поэтому, тут возможны минимум три варианта. Один из них приведу ниже.
VD>Короче это бред, а не код. Его не заставить летать даже с помощью волшебной палочки.
С помощью ящика пива на спор гораздо проще.
VD>Не знаю. Покажи, я ознакомлюсь.
Здравствуйте, dimgel, Вы писали:
FR>>Чуть выше показали на шаблонах C++. D>Чуть выше ответили так же, что в шаблонах используется динамическая типизация.
Структурная, а не динамическая. Это разыне вещи. Там типизация статическая (ты не можешь добавить метод классу в рантайме, шаблон не будет использовать метод из наследника) и структурная.
Здравствуйте, vdimas, Вы писали:
V>Время одиночек прошло, вот что останавливает.
Скорее, прошло время слепой веры в заоблачные возможности синтаксиса.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[11]: Что вас останавливает от изучения нового языка?
FR>>Для них обоих современные динамические языки именно "не читал но осуждаю" теоретики они. FR>>У меня самого было очень похожее мнение насчет динамики, изменилось оно только через полгода программирования на питоне.
D>Как тебе уже ответил WolfHound, в твоих ответах отсутствуют конкретные возражения по конкретным претензиям к динамике. Чистое бла-бла-бла.
Их претензии претензии теоретиков, у них гипертрофированные претензии к тем вещам которые на практике не являются сколь либо значимыми помехами
при работе с динамическими языками. В теории они да во многом правы, и как по тебе видно могут быть и очень убедительны. Ну и плюс их большевистский
черно-белый взгляд на мир, этого достаточно чтобы спорить вечно.
D>Сам я не знаю питона, но я знаю PHP и скалу, и я вполне могу экстраполировать свой опыт со слабо-динамически-типизированным языком на сильно-, тем более, что это будет по сути не экстра- а интерполяция (там с другого конца скала подпирает).
Вот ты знаешь PHP а они нет.
Я PHP и JavaScript практически не знаю, но судя по тем же флеймам они гораздо более подвержены ошибкам чем питон и руби ввиду очень слабой типизации.
D>То есть, я знаю достаточно, чтобы квалифицированно оценивать аргументы обоих сторон.
Я тоже, так как пишу еще и на одном из самых сильно типизированных языков — OCaml.
D>Ты — сторона спора.
Я уже практически нет, так иногда огрызаюсь.
D>Я — посторонний наблюдатель. "В споре рождается истина" — это, конечно, полная брехня, но одно исключение я таки-обнаружил: в позиции постороннего наблюдателя картина максимально полная, учитывающая аргументы всех сторон. Это касается не только статики-динамики, но и rich-anemic, к примеру, и всех остальных срачей. Ну а ты, если тебе так охота защищать динамику, — так защищай её, продумывай ответы на аргументы твоих оппонентов. Наезды на их квалификацию — это не аргументы, а переход на личности.
Нет никаких наездов, я уважаю их квалификацию в той области в которой они специалисты.
Но у них нулевая практика в динамике (а знание любого языка на 90% практика) поэтому они не могут адекватно судить о важности и значимости
недостатков динамики которые конечно существуют и про которые они годами не устают повторять.
D>Доказывающий кстати, что твоя квалификация ниже, раз тебя не хватает на аргументы должного уровня.
Возможно и ниже, но не в динамике.
Аргументы тут не помогут, в теории они во многом правы, например в том что теоретически в динамических языках
должно быть гораздо больше ошибок на единицу функциональности, на практике этого не наблюдается. Чтобы это доказать
нужно проводить крупномасштабное исследование, чего я сделать не в состоянии.
Re: Что вас останавливает от изучения нового языка?
1. принципиальная невозможность использования на практике
вот есть язык Go, и он интересен, но его нет под винду, а у меня все проекты под винду по этому учить мне его бессмысленно
2. наличие альтернативного языка
как-то я интереса ради поставил перл, прочитал тутор, поигрался в интерпретаторе
— да хороший интересный язык, но на этом всё закончилось, т.к. для скриптов я знаю питон который имеет схожую область применения,
при этом питон мне нужен для проектов на google-app-engine, для скриптов в одной проге, а для перла у меня таких "зацепок" нет
3. ограниченная возможность использования на практике
в основном у меня нативные проекты, потому что у многих юзеров нет .NET и я не могу заставить их его поставить.
по этому я мало интересуюсь .NET языками, скажем я изучил F#, почитал тутор немерле, но в текущих проектах я не могу использовать .NET, а значит мне пока нет никакого толку с этих языков.
4. отсутствие нормальных средств разработки для языка
VС++ живо в винде потому что есть ИДЕ (MSVC+VAX) которая лучше всех остальных ИДЕ и плагинов к блокнотам (для языков типа С++),
потому что есть компилятор с поддержкой расширений нужных в винде,
потому что есть хороший отладчик, .pdb и минидампы.
По этому нет смысла учить D, т.к. при всех минусах С++, разработка в VC++ будет быстрее и надежнее.
Аналогично — C#+решарпер лучше чем самая-последняя-версия-немерле+блокнот с подсветкой
Однако в ряде случаев 50 строк питона в IDLE лучше 2000 строк C++\C#\хзчего в самой навороченной ИДЕ
5. эстетические\религиозные соображения
я не понимаю, почему когда я в хаскеле компилю .dll, которая экспортирует функцию int32_t returns_x_plus_y(int32_t x, int32_t y), я получаю файл в котором более 1Мб кода. Это подрывает веру в компилятор и производительность программ.
Считайте это странным и несовременным, но я хочу юзать языки которые компилят большие исполняемые файлы.
(это относится и к mingw (который использует хаскель), и к D)
6. отсутствие нормальных библиотек для языка.
обычно проще взять старый добрый язык для которого всё есть,
чем новый для которого есть только какие-то альфа-версии биндингов и то не всех нужных библиотек
In Zen We Trust
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Язык — это часто просто средство для достижения определенной цели.
Перед тем, как начать применять новый язык(новое средство), его надо выучить(освоить). Нет можно и по другому но лучше не надо
Перед тем, как начать изучать новый язык, люди обычно думают на тему "А действительно ли проблема в языке(средстве)?"
И обычно находят другие проблемы. Например недостаточный уровень владения старым инструментом.
Находят, решают и достигают цели. Все просто. Новый язык тут не нужен.
Бывают и другие случаи. Когда например изучение языка и есть цель. Вот тут новый язык очень нужен по определению.
Его изучают или даже придумывают.
А потом носятся с ним и с неуемным желанием хоть куда-нибудь его применить.
А вот с применением туговато. И начинается...
Вполне безобидная и простая фраза "Не нужен" становится самым сильным оскорблением. Ну и всякое такое.
Лично я — сторонник первого подхода. Более того я им зарабатываю на жизнь.
Хотя и во втором подходе я ничего особо плохого не вижу.
Мне правда кажется что им сложнее заработать(ну судя например по сегодняшним вакансиям), но кто знает что будет завтра
Проектирование велосипедов для слепых жирафов
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
L>>Корректный ответ на этот вопрос можно дать только зная язык.
U>Для этого достаточно думать не в терминах языка, а в терминах решаемой задачи. Тогда сразу становится видно хорошо ли наилучшее решение ложится на используемый язык или плохо. Если, как правило, ложится хорошо, то особо смысла искать новый язык нет.
Понятий "хорошо" и "плохо", имхо, не существует. Зато есть "лучше" и "хуже", для употребления которых уже и нужно зныние иных языков.
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Угу IDE'шки для питона сейчас уже вменяемее чем для C++.
Нашёл с чем сравнивать.
Ты хотя бы с интеграций немерле сравни.
Смех же на палочке. Питон намного старше. Имеет на порядки больше ресурсов, а все ИДЕ, в том числе коммерческие говно на фоне интеграции немерла.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>В теории и частично и на практике(PyPy) да является, для сильно типизированного динамического языка подмножество кода приводимого к статическому будет намного большим. Например тот-же PyPy транслирует код в статически типизированный RPython для которого все плюшки статически FR>сильно типизированных языков доступны.
Но это возможно только для де-факто статически типизированных кусков кода.
Отсюда вывод: Код по факту статически типизирован. Но компилятору об этом почему-то ничего не говорят.
Следствие: Раз код и так статически типизирован то нахрена нам вообще динамическая типизация?
FR>Я так не считаю, как и множество других программистов. FR>Юнит тесты в динамике да необходимы, но не тонны, их размер будет вполне сопоставим с размером оных для статики.
Ты почитай, что тебе говорят.
Как, например я код рефакторю: Правлю интерфейсы, и компилятор мне все места, где код поправить нужно находит.
Что мне может предложить питон?
Тесты гонять?
А где гарантия, что покрытие 100%?
А если оно и 100% то где гарантия что на вход все типы подаются?
А в случае со статикой мне забыть ни о чем не дадут.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Значимость парадокса Блабла ИМХО преувеличена. Этот парадокс скорее применим к студенту 1-го курса, пока он прошел только тройку императивных языков по программе, и ему еще не прочитали другие языки и парадигмы. Потому как после 2-3-го курса профильного обучения с его Лиспами, Прологами, ИИ, базами знаний и курсовыми по разработке "запчастей" компиляторов, остальное выглядит как "где-то я ЭТО уже видел".
Это не правда.
Вон посмотри на Дворкина с Лаптевым. Они блин профессоры!
Но один застрял в С++ другой в обероне.
И ничего за их приделами не видят.
V>Тем более что налицо следующее наблюдение: значительный прирост производительности программиста дает не столько язык, сколько наличие хороших библиотек и инструментария вокруг него.
Вот только ты сильно преуменьшаешь значимость языка.
Если кода в 10 раз меньше, то это не только разгоняет разработку раз в 20, но и упрощает поддержку раз в 100.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[34]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Меняется, шаблоны статическая часть C++, динамики там нет.
Понятно, ты готов повторять слово "сахар", пока во рту не станет сладко.
D>>Тут уже двое отписали — WolfHound и adontz — что шаблоны C++ НЕстатические. FR>adontz говорил ровно противоположное.
adontz говорил "В шаблонах Си++ структурная типизация." WolfHound — "В С++ типы динамически типизированы. Вот у нас есть template<class T>. И это все что у нас есть. Про тип T мы ничего не знаем пока его нам не дадут и мы не начнем компилировать данный шаблон с данным типом." Про статику никто из них не говорил.
FR>Тебе читать хотя бы Вандервуда "Шаблоны С++".
Не интересно. Ты в состоянии сам логично и последовательно объяснить, почему они — статика? Вышеупомянутые персоны не гнушаются аргументировать свои утверждения, чем ты хуже?
D>>При чём здесь твой окалм? О нём речь вообще не идёт. Начинаем сначала: FR>Это статический жестко типизированный язык, обобщенное программирование в нем тоже есть.
И что?
D>>1) ты защищал динамику, утверждая, что её недостатки, описываемые немерлистами, несущественны. FR>Нет, ты перевираешь, я говорил что они несущественны на практике.
Не придирайся к словам. Программирования — это практическая дисциплина. Теория никого не интересует.
D>>2) в ответ на просьбы указать преимущества динамики ты не смог сказать ничего. FR>Не видел просьб, только нападки тролля.
Просьба шла от WolfHound: "Ну так где аргументы то? Есть только один: Меньше кода. Но это по сравнению с жабой меньше. А по сравнению с немерле экономии почти нет. А какие еще? Ну, хоть один."
D>>3) когда зашла речь о том, что тесты не дают никаких гарантий, ты стал утверждать, что статика тоже не даёт гарантий. FR>Нет, я сказал что статика не дает 100% гарантии.
Угу.
D>>4) когда тебя попросили привести пример заявленных тобой проблем статики, ты привёл пример шаблонов C++. FR>Который вполне релевантный.
Нет.
D>>5) два C++ника ответили, что шаблоны в C++ — это не статика. FR>Нет, один из них такого не говорил, ну и плюс я сам C++ник, а ты можешь пока постоять в сторонке.
Что они говорили, см. выше. Я писал на C++ лет 5, хоть и давно. Наезды свои оставь при себе. (Очередной съезд на личности, похоже принцип "как аукнется, так и откликнется" до тебя не доходит.)
D>>6) ты скорректировал своё утверждение: "полный статический анализ возможен не для всех статически типизированных языков". В новой редакции оно эквивалентно следующему: "существуют статически-типизированные языки, в которых невозможен полный статический анализ". Что ни коим образом не доказывает порочность самой концепции, т.к. не отрицает существования языков, в которых этот самый полный статический анализ возможен. Согласен?
FR>А я нигде ни собирался доказывать порочность концепции.
Тогда что ты пытаешься доказать?
FR>Ты выдумал себе виртуального собеседника и с ним беседуешь, а мне приходится за него отвечать, цирк какой-то
Можешь не отвечать, тебя же никто не заставляет? Тем более, что ты уже слил по всем фронтам неоднократно.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
V>>Профессорство за знание языков, слава богу, не дают. WH>Человек, преподающий программирование обязан знать множество языков.
Тебя и Влада послушать, так получится, что любое множество изученных языков без Nemerle является нерепрезентативным.
WH>И ответ "не хочу" на предложение прочитать статью, описывающую техники переднего края должен быть не мыслим. WH>Но Дворкин мне именно это и заявил. WH>Лаптев на предложение почитать про немерле сказал примерно тоже самое но другими словами.
Лаптев сказал, если я не путаю, что синтаксическим макросам сто лет в обед.
V>>Язык реализации — это последнее, что интересует. Вернее, не интересует никогда. WH>Ну да... конечно. WH>И после того как человек в это начинает верить получается всякая байда типа компиляторов на С.
Кто куда чем стоял?
V>>Для примера, Лисп тоже весьма проблемный язык, как и Пролог, и не зря есть куда как более "продвинутые" современные их аналоги, однако же их успешно преподают на курсе "языки обработки знаний", потому как если студент поймет как работает программа на Лиспе и Прологе, он поймет и принцип работы более современных поделок. WH>Ага, конечно.
За такую лапшу нужно отлучать от клавиатуры. Вложенные match доставляют особо. Не, знаешь, такой ценой добиваться сокращения объёма кода — это себе дороже. Пусть код будет втрое длиннее, но хоть сгруппировали бы по ветвлениям одного уровня. Это был раз. А два, я, например, не вижу принципиальной разницы между:
else if (match(rule, Not(Not())) { return optimize(And(r.Location, rule)); }
Совпадения имён случайные, ни один кролик во время прикидок не пострадал.
Так что, подозреваю, что в изображении подобного кода на C++ ничего чудовищного не будет.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Да ты шутник, однако. Только форумом ошибся. Тебе нужно в юмор.
VD>2 WolfHound: Когда ты поймешь, что показывать примеры кода можно только тем, кто их понимает. Ты думешь, что что-то там обосновываешь, а человек тупо нихрена не понимает. Он в жини только if-ы освоил. И твои примеры для него — это еще один енпонятный набор крокозябр.
Влад, поменьше понтов. Сначала попробуй понять, что именно критикуется. Автор кода, я уверен, понял прекрасно. А вот ты нет.
На досуге помедитируй над вот этими двумя локальными ф-иями и попробуй найти у них связанность:
А после тщетных попыток попробуй нарыть хотя бы одну метрику оценки кач-ва кода, значение которой не будет для приведенных отрывков наихудшим.
VD>Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках:
Да пофиг, основное замечание было в смешении процесса диспетчеризации и каких-то ф-ий "по месту", которые не связаны с диспетчеризацией.
VD>1. В привычных тебе языках оптимизация концевой рекурсии не гарантируется,
Хе. А если ему Лисп привычен?
VD>так что для корректной реализации тебе придется заменить вложенную функцию на цикла и стек (с ручной манипуляцией этим стеком).
А что, обрабатываемые правила могут иметь бесконечную вложенность? И вопрос на 1000000 баксов: в Немерле хвостовая рекурсия только в рамках одной ф-ии работает? Т.е. случай двух взаимно-вызываемых ф-ий не оптимизируется? Только это бы объяснило приведенный код в стиле дельфийского MegaButton_Click, т.е. оправдало бы автора... но это же приговор текущей реализации компилятора, требующей от программистов говнокодить.
VD>2. Компилятор немерла работает не с объектами, а свариантами. Это позволяет ему контролировать, что match-и обрабатывают все возможные сочетания. В твоем случае такая проверка невозможна в приципе. VD>Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель.
Ваш optmize не требует посетителя. Достаточно абстрактного метода и реализация в наследниках. Тоже забыть переопределить будет сложно. К тому же, можно будет обобщить, где близко (Choice/Sequence) и разнести нафиг несвязанный функционал всего остального.
VD>Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше.
Это вместо 3-х матчей в исходном примере. Разница ровно на "обвеску" (заголовок метода), но это ведь после декомпозиции.
VD>Так что насмехаешься и горлопанишь ты тут исключительно от своей невежественности. Ну, а приведенный тобой "код" просто нерабочий.
"Рабочесть" приведенного кода зависит от обвески, то бишь реализации окружения, как и в вашем примере. В плюсах, знаешь ли, бывают удивительные шаблонные перегрузки сигнатур, вполне можно и такой синтаксис сбацать.
VD>Так для справки. Обрезанный компилятор C# (из SS CLI) написанный на С++ Майрософтом занимает 5 мег. Компилятор Немерле ~2. И это при том, что язык сложнее в разы.
И это при том, что компилятор Немерле имеет зависимость от нескольких основных дотнетных либ по многу мег, а приведенный компилятор C# писан с 0-ля без внешних зависимостей. Сравнил так уж сравнил.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
V>>Это понятно, просто сия задача оптимизации сильно привязана к типу узла, и я многократно видел (и сам так же организовывал оптимизацию графов выражений) именно через ее реализацию в теле соответствующего объекта, представляющего узел. Бо задача как бы обязательная при построении графов выражений. Как минимум от лишних скобок (ваше And(And))) всегда избавляются. WH>И что тут лишнего?
Лишние подстановки в традиционных грамматиках — это лишние вызовы ф-ии перебора, либо сдвига-свертки. Поэтому правила обычно оптимизируют, "раскрывают скобки". Всего вашего кода не видел, но эта оптимизация And(And(rule)) в приведенном файле очень похожа именно на нивелирование избыточной глубины графа выражений.
Или ты не понял смысла фразы о "лишних скобках"?
V>>Хотя, после пояснения относительно ограничений хвостовой рекурсии в N все вопросы отпадают. Беда, тут нечего обсуждать. V>>Вот этим стоило заняться в первую очередь. Просто все остальное бросить и заняться этим. Ибо (посмотри чуть со стороны) влияние фичи конкретной реализации компилятора на стиль писания на языке (а компилятор и язык, по идее, не одно и то же, хоть и верно для ваших реалий), это жирный такой минус. Факт: приведенный код сразу же сказал о св-вах компилятора заглянувшему человеку со стороны. Показательно. WH>Показательно что ты снова несешь бред на ровном месте. WH>Я этот код писал не задумываясь о каких либо оптимизациях.
Ты решил показательно проигнорировать суть замечаний о декомпозиции и тестопригодности? Это поза такая? Под названием "идите все на х..."? Тебя никто не заставлял выставлять исходник на обсуждение, если что.
WH>И я не вижу ни одной причины написать его иначе.
Значит, ни тестов на него писаться ни поддерживаться другими людьми этот код не будет. Это мусор, называя вещи своими именами. То самое "первое приближение", результат эксперимента, и т.д., требующее рефакторинга перед завершением работы над этим участком. Хотя, вот тут уже спотыкаемся об ограничения на раскрутку хвостовой рекурсии. И если это требование принципиально, то декомпозировать можно будет не все.
V>>Смотреть надо. Посетитель тоже тормоз порядочный, хоть и быстрее обычно на порядок, чем развесистый ПМ. WH>Лол. WH>Учитывая что ПМ очень даже может тупо по таблицам работать...
В реализации Немерле? Сколько я смотрел рефлектором, пока не замечал. Не покажешь, если я плохо смотрел? Например, вот скомпилированный обсуждаемый кусок. Ну и табличный вариант как раз с виртуальным вызовом сравняется.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Выдумки я твои пропустил. Обсуждать их не вижу никакгого смысла.
Ну нет, так нет.
ГВ>>Угу, спасибо за объяснение. Почему-то ничего нового для меня тут не прозвучало. Да, я действительно не придал значения локально связанным именам, но, в общем, на мой вывод (и на иллюстрацию) это никак не влияет. VD>Ну, есссено! Только код что тебе привели компилируется и работает. И более того, работает очень шустро. А твой — это выдумка которая никогда не заработает. Вот и вся разница. Так что в деталях как всегда кроется черт.
Конечно, не заработает. На фига мне PEG-парсер? Хотя, если вдруг понадобится...
ГВ>>Кого обманываю и в чём? VD>Приведением кода который по твоим словам аналогичен, а на практике является полной фигней.
ГВ>>Ясно, спасибо. Собственно, этого я и ждал (хотя надеялся на чудо) — да, контролируется полнота проверки по всем возможным вариациям данного АлгТД, но никак не его сочетаний.
VD>Ну, почему же? Убери вхождения: VD>
VD>и компилятор проверит те что есть и выдаст предупреждения для каждого не покрытого случая. Если ты хотя бы одино из вхождений не укажешь будет сообщение. А укажешь все — не будет.
М-м-м... Разве такое поведение компилятора будет вызвано не тем, что в типе Rule прямо объявлено:
| Not { rule : Rule; }
| And { rule : Rule; }
?
ГВ>>Пожалуй, что мне теперь стоит зацепиться за твою фразу: "...что match-и обрабатывают все возможные сочетания" и поднять шум о том, какой ты бессовестный обманщик и как вводишь в заблуждение своих наивных слушателей. VD>Ну, попробуй. Авось в процессе еще немного в тему въедешь .
Не буду пробовать, у меня не получится так экспрессивно, как у тебя.
ГВ>>Короче говоря, порядок перебора совпадений — "сверху-вниз" в порядке перечисления. В принципе, схоже с пролог-машиной, только там учитывается порядок занесения предикатов в базу данных. Правила перебора совпадают с точностью до деталей реализации вычислительной среды.
VD>Ну, в прологе механизм по круче. Там тот же ПМ, но на базе унификации. В конце сопоставления обе стороны унифицируются.
Угу, покруче в каком-то смысле. Понятно теперь, почему ПМ для меня не новость? И ни для кого не новость, кто знаком с Прологом.
VD>МП из ФЯ по слабее, но за то сильно шустрее. В результате получается очень эффективный код. Такой же если бы это дело писалось вручную на базе низкоуровневых средств.
VD>Но в общем, механизм действительно похожий на прологовский. Разница только в том, что он работает только в одну сторону.
Ну да, правильно, потому что предназначен для других вещей — не только для поиска набора унификаций.
VD>>>>>Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель. Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше. ГВ>>>>Влад, ты когда с самим собой разговариваешь, клавиатуру в сторону отодвигай. При чём тут паттерн "посетитель"? VD>>>При том, что он описывает список веток которые нужно посещать и как и ПМ гарантирует, что ты не забудешь посетить их все.
ГВ>>Ценой распыления аналитического кода по всем классам? VD>У меня закрадываются сомнения в том, что ты знаешь что такое паттерн посетитель.
Объясни, что ты имеешь в виду в данном контексте?
ГВ>>Ну, я не спорю, субъект с тяжёлым синдромом ООП головного мозга способен и на такое ради "гарантий". Только зачем болезнь выдавать за правило? VD>Ты видимо очень крут. Но вот все компиляторы и системы обработки деревьев выражений (включая LINQ) создаваемые на ООЯ почему-то всегда реализуют Посетителя для своих структур. Видимо ООП головного мозга поразил всех окружающих. И меня в том числе. В R# я тоже его реализовывал. Правда средствами метапрограммирования, так что это не было так уж многословно.
Всё зависит от контекста. Если набор типов изначально не ограничен, как, например, ограничен набор вариаций для Rule, то "посетитель" может оказаться уместным. Но мы, вроде как, обсуждаем другой случай — Rule имеет строго определённый набор вариаций.
VD>>>Посетитель наилучший способ из имеющихся в арсенале ООП. Код обработки выделяется в одном месте. Есть возможность гарантировать, что посещены все ветки. Можно добавлять другие обработки не ломая уже существующие и не вводя тонны методов (по одному на каждую ветку). ГВ>>Хм. Зачем ты так рьяно защищаешь такое убогое применение ООП? VD>Я? Я его не защищаю. Но в арсенале ООП и ИП дугих средств нет. Точнее те что есть еще хуже. Уж лучше проиграть в обхеде кода посетителя, но потом не иметь тех проблем что можно огрести без него.
Какие это проблемы можно без него огрести, например, в коде транслятора? Забыть, что ли, switch/if вставить там, где он нужен? Так это, прости меня, детский сад, право слово. Корректность компилятора контролируется наборами тестов, а не языком реализации. Да и, собственно, ветку в ПМ тоже можно запросто "заглушить".
ГВ>>Ну, я как бы в курсе твоего любимого метода критики — взять нечто идиотское, реализованое на языке X и на этом основании заклеймить весь язык X, но это не совсем чистоплотно, не находишь? VD>Если ты считаешь этот паттерн идиотским, то или ты его не понимаешь, или ты освоил ПМ и понимаешь, что Посетитель жалкое его подобие (частный случай).
Ну, в данном контексте другого применения Посетителю, кроме идиотского я придумать не могу. Поясню:
class Rule {
virtual Rule *optimize() = 0;
};
class AndRule : public Rule {
virtual Rule *optimize() {
// "Самооптимизация" And либо что-то в этом духе:return host->optimizeAnd(this);
}
};
Вполне возможно, что ты видишь другие варианты.
VD>>>Если тебе это не очевидно, я не виноват. ГВ>>Ты понимаешь, в чём проблема, я переболел парадигмами и прочими идеологиями уже довольно давно. VD>Да я заметил. Жаль что это случилось чуть раньше чем ты освоил их все.
Я? Да ну что ты, я ни одной так и не освоил, мне наука освоения парадигм программирования как неких цельных артефактов не под силу by design — не умею я бессмысленные вещи осваивать.
ГВ>> Поэтому то, о чём ты говоришь, мне очевидно, но очевидно ещё и то, что сейчас я (и не только я) без веских причин так не сделаю, чтобы там ни тарахтели разнообразные ООП-пуристы и прочие, сдвинутые на спасении мира посредством чистоты парадигмы. VD>Я тебе назвал минимум три причины. Тебя не волнует дальнейшая поддержка кода? Тогда можно их игнорировать.
Э-э-э... А где они перечислены? Не ткнёшь пальцем?
ГВ>>Честно, мне плевать, как код реализации проецируется на некий идеал, взятый из той или иной химеры (aka парадигмы), я руководствуюсь вполне локальными соображениями. VD>Да мне тоже. Лишь бы он был рабочим, простым и легким в поддержке.
Ну вот видишь, к чему тогда паттерн Посетитель там, где цепочка if-ов покрывает потребности без выкрутасов?
VD>Но у этой задачи есть только три решения. Посетитель, ПМ и неправильное. Последнее на первый взгляд выглядит разумно и даже порой красиво, но на самом деле это мина замедленного действия. Отложенные грабли.
Не, не так. У задачи подбора по структурному паттерну есть много решений, все они так или иначе связаны с перебором. ПМ, Посетитель, if/switch — это возможные реализации, только у ПМ реализация самого перебора неявная. Ну а оптимизация перебора может выполняться как вручную (скажем, подходящей декомпозицией), так и реализовываться компилятором (например, хэш где-нибудь вычислять). Впрочем, хэш можно и явно вычислять.
ГВ>>Я не спорю с тем, что ПМ полезен, но это далеко не то, ради чего стоит пускаться во все тяжкие (читай, непременно менять язык реализации и т.п.). VD>Ну, это мнение того кто сам на практике это самое МП не использовал. Я так понимаю Пролог ты ведь тоже на практике не используешь?
Мимо. Не часто, но использую.
VD>А вот среди тех кто попользовался ПМ бытует другое мнение — что языки не поддерживающие ПМ сразу проигрывают тем что поддерживают. У многих просто ломка начинается когда они вынуждены возвращаться на язык без ПМ.
Меня их мнение не волнует, как и ломка. Забегая вперёд, я понимаю о чём идёт речь, когда люди говорят о "ломке" при переходе от одного языка к другому, и сам её испытывал некогда, но не считаю эту причину, в общем, сколь-нибудь существенной. Куда как сильнее "ломка" от осознания бессмысленности замены одного средства разработки на другое, когда, например, ясности с постановкой задачи как не было, так и нет. Или, скажем, когда решение задачи упирается в её теоретическую неразрешимость. А тасование языков программирования ради "комфорта" — это как в той басне про квартет: "А вы, друзья, как ни садитесь..."
VD>А дело здесь в том, что ты не думаешь категориями АлгТД и ПМ. А те кто думает очень многие задачи видят именно в их применении. Как результат разрыв между возможностями языка и внутренним представлением решения. Далее начинаются эмуляции ПМ в рантайме (на функция) и т.п. На следующей стадии эта эмуляция выбрасывается, так как становится явсно, что без поддержки языка получается плохо.
Влад, я думаю вовсе не в категориях языка программирования и вообще затрудняюсь вербализовать сам процесс — в каких категориях осуществляется мышление. Так что, ты свой "мозгоскоп" лучше отключи, а то батарейки только сажаешь.
ГВ>>Разницу между иллюстрацией и фрагментом рабочего кода объяснять нужно? VD>Не надо. Но твой код не рабочий потому что бессмысленный, в не потому что он не полон.
Я это в цитатник занесу: "код не рабочий потому что бессмысленный, а не потому что он не полон". Махатма Ганди нервно протирает очки.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>>>и компилятор проверит те что есть и выдаст предупреждения для каждого не покрытого случая. Если ты хотя бы одино из вхождений не укажешь будет сообщение. А укажешь все — не будет.
ГВ>>М-м-м... Разве такое поведение компилятора будет вызвано не тем, что в типе Rule прямо объявлено:
ГВ>>
ГВ>> | Not { rule : Rule; }
ГВ>> | And { rule : Rule; }
ГВ>>
ГВ>>?
VD>Именно. Но не только этих двух вхождений, а всех. Там очень хитрая штука делается. Строится так называемое дерево решения. А потом анализируется.
1. Что является входными данными для Decision tree?
2. Что имеется в виду под 'given branch' и 'given pattern':
If given branch is not found in the output tree, then given pattern
never matches and is thus redundant.
?
3. Что такое и откуда берутся failure nodes в Decision tree?
Чую, что ответы достаточно простые, но пока это только чутьё "спинным мозгом".
ГВ>>Угу, покруче в каком-то смысле. Понятно теперь, почему ПМ для меня не новость? И ни для кого не новость, кто знаком с Прологом. VD>К сожалению, эти "все" (включая тебя) Пролог изучали так же. Побаловались и бросили. В прочем, я от вас не далеко ушел. Вот только разве что не гоню напраслину.
Ну, насчёт побаловались и бросили — это оставляю на твоей совести. А напраслину ты прекрасно гонишь в адрес C++ и тех, кто на нём программирует — у тебя это получается даже лучше, чем у других в адрес N.
VD>Раз ты знаком с прологом, то должен понимать, что похожие механизмы но обеспечивающие высокую скорость кода очень даже крутая штука. И по уму ты должен жалеть, что в "твоих" языках такого нет. Но тебя радует то что ты "это видел".
Понимаю, отчасти сожалею. Отчасти, потому что для меня главной проблемой всегда было не "как" перебрать структуры, а "что" именно перебирать. Догадываешься, в чём разница?
ГВ>>Ну да, правильно, потому что предназначен для других вещей — не только для поиска набора унификаций. VD>Не для других, а для одной из целей — нахождения соответствия. А вот унификацию он как раз таки не обеспечивает.
Нахождения первого соответствия, заметь. В остальном согласен (замнём терминологические тонкости для ясности).
VD>>>У меня закрадываются сомнения в том, что ты знаешь что такое паттерн посетитель. ГВ>>Объясни, что ты имеешь в виду в данном контексте? VD>То что сказал. Похоже ты просто не понимаешь зачем этот паттерн был придуман.
Ну-ка, ну-ка, я весь внимание.
ГВ>>Всё зависит от контекста. Если набор типов изначально не ограничен, как, например, ограничен набор вариаций для Rule, то "посетитель" может оказаться уместным. Но мы, вроде как, обсуждаем другой случай — Rule имеет строго определённый набор вариаций.
VD>Вот еще одно подтверждение. Посетителя ты не понимаешь. Как раз Посетитель уместен только когда набор типов необходимых посетить ограничен и редко расширяется.
Да ты что? То есть разносить реализации управления посещением по классам нужно только тогда, когда этот набор редко расширяется? А я-то всегда считал, что Посетитель нужен для того, чтобы предоставить "посещаемым" возможность самостоятельно выбрать метод(ы) их обработки. То есть набор доступных методов у "посетителя" как правило должен отличаться от набора "посещаемых" классов. Иначе на хрена оно вообще нужно-то при фиксированном наборе классов? Так просто, из принципа?
То есть набор операций IVisitor вовсе не обязан соответствовать набору имеющихся "внешних" классов. А иначе реализация этого паттерна являет собой просто паттерн ради паттерна с вырожденной реализацией посещаемых классов типа такой:
class A {
virtual void visit(IVisitor *visitor)
{
visitor->visitTypeAnode(this);
}
};
Хотя это по сути двойная диспетчеризация, но, тем менее, она служит хорошим примером к тезису о вреде работоспособных иллюстраций — людей клинит на иллюстративном материале, как на истине в последней инстанции. Весьма показательны в этом смысле истории с примерами из книг Буча — их тоже, почему-то иной раз пытаются прямо перенести в рабочий код.
ГВ>>Какие это проблемы можно без него огрести, например, в коде транслятора? VD>Все те же. При очередном рефакторинге забыть обработать некоторые из типов (ветвей дерева).
Ясен перец, копаться в десятке реализаций удобнее, чем в одном case, кто бы спорил... Влад, не гони, а?
ГВ>>Забыть, что ли, switch/if вставить там, где он нужен? VD>Ага. Они то и приводят к проблемам.
Ага, я даже представляю, что ты вспомнишь следующим. LSP, да?
ГВ>>Так это, прости меня, детский сад, право слово. VD>Детский сад — это не знать детали паттерна и лезть спорить о нем.
Какие ещё детали паттерна? О чём ты?
ГВ>> Корректность компилятора контролируется наборами тестов, а не языком реализации. Да и, собственно, ветку в ПМ тоже можно запросто "заглушить". VD>Ага! Разговоры о тестах это такая лакмусовая бумажка.
VD>Ты понимаешь разницу между значением слов "гарантия" и "протестировано"? VD>Если есть возможность получить гарантию глупо делать тесты.
Если хоть один компилятор сможет мне дать гарантию, что никто из разработчиков не напишет вот такой:
| Not(Not(rule)) => r // Пока не знаю, что тут делать
или такой код:
virtual Rule *optimize(RuleOptimizer *)
{
return this; // TODO: Разобраться, что тут писать
}
...то я готов принести тебе свои извинения. А если нет, то уж прости, но это можно проверить только тестами. Вне зависимости от того, считаешь ты их лакмусовой бумажкой или нет. Да, я вовсе не думаю, что напишут это по злому умыслу — причин для появления заглушек может быть миллион.
ГВ>>Я это в цитатник занесу: "код не рабочий потому что бессмысленный, а не потому что он не полон". Махатма Ганди нервно протирает очки. VD>Занеси. Только не показывай никому. А то стыдно будет.
Кому? Тебе? Не бойся, я никому не скажу!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
V>>И нафига там, все-таки, прикидка по весам, хоть убей не пойму? Это типа такой эвристики, наподобие алгоритма инлайнера компилятора gcc? Чья идея? Это же не из той области. В стандартном шаге упрощения систем правил производят ПОЛНУЮ подстановку (!!!), т.е. до тех пор, пока не натыкаемся на рекурсию. Заметь, пофиг веса абсолютно. WH>Ну так и знал. WH>Теоретик.
Отчего же, не только теоретик.
WH>После некоторого размера инлайн ничего не дает. WH>Но размер генерируемого кода раздувает очень сильно.
Это смотря как делать. Бо еще делают так, что ровно наоборот: размер генерируемого кода зависит только от общего кол-ва нетерминалов, и чем оно меньше, тем меньше кода. Т.е. избавление от промежуточных нетерминалов, не являющимися целевыми, идет на пользу. Тело правил — табличное. И оно по быстродействию ручному switch/case вовсе не уступает, а местами ровно наоборот, бо вызовов и косвенности меньше при полном раскрытии.
Ну а ты как обычно пускаешь понты и пузыри. Первый парсер в твоей истории, что ли? Эдак тебя прет.
WH>Короче обсуждать с тобой парсер я более не намерен. WH>Толку нет. WH>Ибо ты ничего не угадал. Совсем.
Я и не обязан был подробности угадать, но спросить мог. А тот факт, что ты свои подробности считаешь единственно возможным вариантом реализации, говорит само за себя.
Re: Что вас останавливает от изучения нового языка?
Да потому что вы сами, носители вашего немерле, ниче поразительного на нем не сделали. Удиви нас, сделай что то чтобы я сказал вау, какую хрень можно однако сотварить на етом Н.
Ни вы со своим немерле, ни микросовт со своим ф# не могут донести чего ж там у вас такова..
А тем временем шарп уже дорос почти до статуса ФЯП, так что ребята сори, но вы зря тратите время.
ну если тока грантик какой нить пилите, тоды понятно.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
D>>А про языки вообще, самый главный аргумент — время. Всё изучить — жизни не хватит. Вот я долго прицеливался, и взялся за скалу. Потому что жопа моя чует, что это будущее, и надо долбить задел, пока мозги работают. А тратить время на всякие питоны и прочее — нет у меня его столько, времени этого. Старею уже.
VD>Вот, вот. Это как раз и интересно. Не мог бы ты описать свои мысли и действия по подробнее? Что останавливает? Что произошло при начале изучения? На каком сейчас этапе? Не хочется ли бросить изучение? ...
Я изучаю язык только с одной целью: начать на нём писать. Полноценно: много и сложно. Варианты "поглядеть 20-страничную презентацию по языку" и "поковыряться с недельку" — это чистейшая профанация. Ну то есть, для тебя возможно и нет, если ты уже стотыщ разных языков знаешь (имеешь реальный опыт программирования) и поэтому быстро понимаешь, какие идеи языка откуда спёрты, ну и в итоге быстро и адекватно оцениваешь язык в целом. Я же не знаю "нормальных" динамически-типизированных языков, и языков с МП тоже не знаю. А изучать их только ради того, чтобы потом быстрее изучать ещё более другие языки — мне чё, больше заняться нечем? Языков, на которых действительно стоит писать, не так много, чтобы специально прокачивать скилл "поиск нормального языка". Тупо между делом поглядывая на форумы, я в фоновом режиме, в порядке отдыха получаю вполне достаточно информации. Гораздо больше, чем мог бы получить, поковырявшись неделю-другую в самом языке: в спорах в "Философии" и "Архитектуре" обсуждают вещи, которые на мелких задачах увидеть невозможно.
Re[37]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>А generics с вариантностью и upper/lower bounds в окалме есть?
Сложный вопрос, без шуток.
Проблема в том что в OCaml объекты и интерфейсы структурно типизированы, а понятие класс практически синтаксический сахар для удобства
наследования реализации.
Вторая проблема в OCaml нет выделенного понятия generic, но есть несколько своих механизмов их заменяющих.
Во первых параметизированые классы http://caml.inria.fr/pub/docs/manual-ocaml/manual005.html#toc27 это как раз очень близко
по свойствам к генерикам или шаблонам классам C++, но там засада в том что в терминах C++ это скорее ближе не к шаблоному классу,
а к классу с шаблонным конструктором.
В третьих обычные методы и функции у которых параметры объекты из-за структурной типизации ведут себя как генерики, например функция
let f o = o#put
будет обобщенной принимающей любой объект с методом put и соответствующей сигнатурой, что в большинстве случаев делает бессмысленными
использование генериков.
В четвертых кроме этого есть параметизированные модули (модули в ML не связанны с единицами компиляции) http://caml.inria.fr/pub/docs/manual-ocaml/manual004.html#toc16 на них тоже можно изобразить что-то похожее на генерики.
D>Пример lower bound на скале:
D>
D>Здесь запись [A <: Animal] означает "generic-тип A, являющийся подтипом Animal". Благодаря этому внутри generic-класса ZooCage компилятор имеет информацию о супертипе A и в состоянии проверить корректность вызова метода a.feed(). А при инстанциировании ZooCage с конкретным аргументом выполняется проверка, что A=Elephant удовлетворяет условию A <: Animal. Полный контроль, в отличие от шаблонов C++.
В OCaml иерархия выше малоосмыслена из-за структурной типизации. При структурной типизации классы не различаются по именам, если будет два класса у которых имена разные, но все публичные сигнатуры функций совпадают будут считаться компилятором одним и тем же классом. Хотя тут вру классы вообще не
учитываются, в внимание принимаются только сигнатуры методов. Ну и подтип определяется не наследованием а только структурным совпадением.
Поэтому твой пример повторить не получится, языки слишком разные.
Вот примерно попытался показать особенности, но это так чтобы только продемонстрировать разницу.
open Printf
class elephant =
object
method say = printf "elephant\n"end(* с точки зрения компилятора этот класс совпадает с elephant *)class mamont =
object
method say = printf "mamont\n"end
class dog =
object
method say = printf "dog\n"method dog_id = ()
end
class wolf =
object
method say = printf "wolf\n"method wolf_id = ()
end(* этот класс совсем левый, метода say нет *)class troll =
object
method hollow = printf "bla-bla\n"end(* инициализируем объекты *)let elephant_ = new elephant
let mamont_ = new mamont
let dog_ = new dog
let wolf_ = new wolf
let troll_ = new troll
(* максимально обобщенная функция *)let say o = o#say
let _ = say elephant_
let _ = say mamont_
let _ = say dog_
let _ = say wolf_
(* тут если раскомметировать будет ошибка компиляции у класса нет метода say *)
(*let _ = say troll_*)
(*
переопределяем, теперь принимаются только типы полностью структурно совпадающие
с elephant, то есть elephant_ и mamont_ то что закомментированно ошибка
компиляции.
*)let say (o : elephant) = o#say
let _ = say elephant_
let _ = say mamont_
(* let _ = say dog_ *)
(* let _ = say wolf_ *)
(*let _ = say troll_*)
(*
переопределяем, теперь принимаются только типы полностью структурно
совпадающие с dog.
*)let say (o : dog) = o#say
(*let _ = say elephant_*)
(*let _ = say mamont_*)let _ = say dog_
(* let _ = say wolf_ *)
(*let _ = say troll_*)
Контроль здесь тоже полный с учетом структурности конечно, в отличии от C++ тип класса хоть и максимально обобщенно, но _выводится_
учитывая используемые в теле функции методы класса, C++ же поступает наоборот подставляет тип в шаблон.
FR>>Я ничего, пытаюсь отбиться от тролля, чистая самозащита.
D>Лучший способ избавиться от тролля — это перевести разговор в конструктивное русло, давать грамотные аргументы. Поскольку ты себя этим не отягощаешь, троллем выступаешь именно ты. Но я очень надеюсь, что аргументы рано или поздно наконец появятся. Итак?
Ладно чушь про С++ замнем. Динамику тоже, мне про нее спорить давно обрыдло, так по инерции в очередной срач влетаю.
В общем предлагаю перестать нападать друг на друга
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Аналогия не верна. ПМ используется во всех проектах и используется очень широко. Логический решатель — узкая ниша.
Я же смайл поставил.
А если по делу, мне крайне не нравится реализация алгебраических типов в Немерле. Она там одинакова для рекурсивных и нерекурсивных АглТД, т.е. явно была сделано "на скорую руку". Но нынешняя команда сим вопросом заниматься не будет.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Vasilich3333, Вы писали:
VD>>Необходимость появится точас же как ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
V>Спорный аргумент о необходимости! Я уверен многие обладают знаниями,которые так и не были востребованы
Бесспорно одно, из невостребованности одних знаний не вытекает ненужности других. Не делай таких логических ошибок в будущем.
В общем, кури Парадокс Блаба, если не понял о чем я говорю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Я PHP и JavaScript практически не знаю, но судя по тем же флеймам они гораздо более подвержены ошибкам чем питон и руби ввиду очень слабой типизации.
Является ли сильная типизация по сравнению со слабой преимуществом при автоматическом рефакторинге, если оба языка динамически типизированные? Я склонен считать, что нет, т.к. ошибка типов в любом случае вылетит в рантайме, IDE никакой помощи тут не предоставит. Если так, то это ключевая претензия, и она ни на йоту не гипертрофированная: её значение переоценить невозможно. Как по мне, невозможность быстро и надёжно (без необходимости писать тонну юнит тестов) рефакторить код — это приговор языку. На любом хоть сколько-нибудь крупном проекте рефакторинг будет выливаться в такой геморрой, что проще повеситься. "Отвинтили пупок — отвалилась задница." Всё остальное я перетерплю, но когда рефакторинг кода похож на хождение по минному полю, когда на каждый чих типа переименования метода приходится вручную шерстить весь проект глобальным поиском, потом смотреть, что из найденного относится к нашему классу, а что не относится (а в отсутствие информации о типах приходится анализировать логику, иногда глубоко), а потом молиться, чтобы где-нибудь не упала завязанная на рефлексии динамика, конструирующая имя вызываемого метода так, что он не нашёлся поиском... это ад, в общем. Огромное количество временных затрат на ровном месте. Вот реальная проблема. А что в рантайме я не смогу присвоить числовой переменной строку — мне глубоко пофиг, я уже привык assert-ами по коду разбрасываться, они неплохо компенсируют слабую типизацию.
Re: Что вас останавливает от изучения нового языка?
Изучают языки, как мне кажется, в нескольких случаях. Когда люди увлекаются языками программирования, и постоянно изучают новые и малоизвестные академические языки программирования для расширения кругозора, решают на них всякие головоломки, пытаются "сломать" компилятор и тд. Потом, например, человек, не увлекающийся языками, может изучать новый, когда необходимо сменить область деятельности на некоторую другую, в которой принято использовать другие языки.
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
ИМХО ни одна из этих причин не играет роли.
Зачастую синтаксические различия не играют роль, но так исторически сложилось, что языки с си подобным синтаксисом были в целом удобнее остальных, по некоторым другим причинам.
Идеологические причины имхо тоже не должны играть определяющую роль, потому что все эти языковые парадигмы не равнозначны, как например цвет рабочего стола или атомобиля. Где то удобнее применять одно, где то другое. Поэтому я считаю, современный язык должен быть мультипарадигменным.
Ну и политические предпосылки тоже не катят. Что значит применить на работе? Начальство не одобрит? Тогда ставится вопрос, а почему уже оно не хочет перейти на новый язык.
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Такая ситуация бывает у тех кто изучает языки ради развлечения. И бывает это довольно часто, ну почти всегда если изучается язык, ещё не ставший популярным.
Я думаю, основная проблема, из-за которой недавно созданный язык не становится популярным и почти не ипользуяется на практике, заключатся в том, что он не решает задачи ЗНАЧИТЕЛЬНО лучше чем существующие средства. То есть недостаточно просто сделать язык немного лучше. Никто из-за этого не бросит свои старые проекты и не будет переходить на него.
Про язык Немерле я могу сказать следующее. Я читал все статьи, написаные про него, часто читаю переписку на этом форуме, устанавливал компилятор, ковырялся в языке, но до практического применения так и не доходило. А всё потому что я, например, не знаю таких задач (мне они не встречались), которые с одной стороны наилучшим образом решались бы на .NET, а с другой стороны требовали чего то навороченного от языка.
То есть все эти фитчи с изменением синтаксиса просто негде использовать среднестатистическому программисту на .NET.
Вот если бы язык Немерле компилировался в нативный код, тогда было бы другое дело...
Недавно Влад писал о фреймворке для создания языков программирования. Несмотря на то, что я крайне одобряю идеи метапрограммирования, мне кажется возможность такого обширного изменения синтаксиса попросту бесполезной. Этим почти никто не воспользуется.
На самом деле менять синтаксис требуется очень редко. Большинству програмимистов это не требуется никогда. И уж тем более писать свой язык. Свой язык пишут тогда, когда необходимо компилировать код под какое то свое устройство, для которого нет ещё нормальных языком. Но НИКТО не будет писать свой язык, под существующую богатую языками платформу в рамках выполнения работы. Ради развлечения — конечно.
Изменять синтаксис можно и в языке C++, при этом мало кто этим занимается. В основном люди и шаблоны то не используют.
Вполне достаточно иметь возможность менять синтаксис в таких же пределах, как это сделано в С++. Ну если честно, то чуть больше.
Следовательно, раз такая функциональность не востребована, не стоит её делать основной фитчей языка.
И вообще, вся идея с .NET о том, что будет одна среда выполнения и куча разных языков довольно глупая. По факту большинство языков обладает одинаковой выразительностью и отличается только особенностями синтаксиса.
Если бы Немерле компилировался в нативный код (не только, например под llvm ещё), то это открыло бы большой простор для реализации различных макросов, которые не только добавляют синтаксический сахар, как текущие макросы, но и позволяют удобно трансформировать код и управлять процессом кодогенерации. Таким образом, во первых, можно было бы использовать Немерле как универсальный язык для современных компьютеров, то есть можно было бы программировать всю аппаратную часть на нем. То есть не так, что для видеокарты один язык, для основного процессора другой. А во вторых, появилась бы возможность автоматизировать использование современных инструкций процессора, а не писать на ассемблере или использовать интринсики.
Это повысило бы выразительность Немерле ещё на один уровень.
Я знаю, что в Немерле некоторые такие вещи можно делать, например Nemerle CL и CUDA, но всё таки, как я понял, не самым удобным образом. И это совсем не пропагандируется как одна из основных фитч Немерле. Также можно было бы использовать Немерле для вычислений на кластерах.
То есть на мой взгляд, лучше при разработке Немерле 2 сконцентрировать силы на добавлении возможности генерировать код под разные платформы.
А то получается, что немерле повторяет в основном просто фитчи сишарпа, только на макросах. Ну да, есть PEG, которого нет в сишарп, но он нужен опять же только для тех кто пишет компиляторы. Для большинства программистов тут нет значительных преимущества перед сишарпом, чтобы переходить на Немерле.
Если бы Немерле компилировался в нативный код, появилась бы возможность ручного управления памятью, а сборщик мусора можно было бы реализовать на макросах. Тогда программист мог бы сам выбирать алгоритм сборки мусора, используя тот или иной набор макросов, тем самым повышая производительность программы для разных сценариев раборы с памятью.
PS Я понимаю, что перевести Немерле на генерацию нативного кода довольно сложная задача, но на платформе .NET у Немерле вряд ли есть будущее. Можно конечно отработать некоторые идеи в текущей реализации, а потом уже с готовыми решениями браться за переписывание. Я повторюсь, на платформе .NET Немерле вряд ли когда нибудь будет обладать значительными преимуществами по сравнению с сишарпом для среднестатистического программиста. По сравнению с эфшарпом, Немерле конечно выглядит более привлекательным, но и эфшарп вряд ли станет популярным языком.
Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Для затравки дам некоторые возможные ответы:
1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы.
2. Идеологические отличия. Например, язык не ООП, а я привык к ООП.
3. Политические предпосылки — "Все равно не смогу применять его на работе...".
...
Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
А про языки вообще, самый главный аргумент — время. Всё изучить — жизни не хватит. Вот я долго прицеливался, и взялся за скалу. Потому что жопа моя чует, что это будущее, и надо долбить задел, пока мозги работают. А тратить время на всякие питоны и прочее — нет у меня его столько, времени этого. Старею уже.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, alpha21264, Вы писали:
A>>Нафиг надо, если С++ уже есть?
VD>На фиг нужен был С++ когда был С или даже Фортран?
A>>Зачем изучать "те же яйца в профиль", если они не дают новых возможностей?
VD>Не, ну правда! С++ это же те же яйца только в профиль. На фиг ты его учил? Время тратил?
Эээ... Ну перечитай же еще раз "если они не дают новых возможностей".
То есть, если новые возможности будут, то я изучать буду.
A>>Я лучше что-нибудь другое поизучаю ступенькой повыше. Паттерны например. Или что-нибудь связанное с архитектурой.
VD>А если тебе скажут, что есть язык который повзоляет эти паттерны превратить в готовую к использованию библиотеку или фичу языка, тебя это не заинтересует?
Заинтересует. Только ты пойми правильно. Паттерны хороший программист придумывает достаточно часто.
Конечно не так часто как функции и алгоритмы, но мир паттернов не исчерпывается теми двадцатью, которые написаны в книжке.
Ну и ты сам сказал, что мне более нужно: дайте мне это в виде библиотеки, а язык оставьте старый.
Чтобы я получил новые возможности, а все старые остались при мне.
VD>Зачем учить паттерны, когда можно просто воспользоваться готовым решением?
VD>Когда-то давно было много программистов писавших GUI на С. GUI отилично ложится на ООП. Но ООП в С не было. Тогда С-программисты придумали паттерны: класс, сообщение, событие и т.п. и начали писать код с их использованием. Многие и сейчас так делают. Но ты видимо к ним не относишься, так как знаешь, что есть язык — С++ в котором эти паттерны встроены. И знаешь, что писать на таком языке объектно-ориентированные прогрммы проще чем на С.
1) Эээ... ООП — это вообще-то внеязыковая конценция. ООП даже на ассемблере бывает. Только таблицу виртуальных функций будешь организовывать сам.
2) C++ он именно потому и плюс-плюс, что не забрал ни одной старой возможности. Вот идеал, к которому надо стремиться.
VD>Вот такая же фигня и с другими частями. Скажем ты усердно выписываешь паттерн перебора элементов контейнера везде где нужно с ними что-то делать. А в каком-нить Шарпе есть встроенный оператор foraech который позовляет не выпиливать паттерн, а точно описать что с ним делать. А в каком-то другом языке есть готове решение позволяющее не писать циклы вообще (это я на ФП намекаю, хотя оно и в Шарпе есть).
VD>А теперь представь, что есть язык который позволяет большую часть таких паттернов (в том числе и паттернов-проектирования) запихнуть в библиотеки и использовать где надо. Вместо тщательного выпиливания канонов паттерна ты просто декларируешь его применение и задаешь (тоже декларативно) нужные параметры. А все остальное автоматически выпиливает компилятор по программе называемой "макрос" (не путать с сишными текстуальными макросами). И более того, такие "программы" для компилятора ты можешь создавать сам.
VD>Не уж-то это не стоит того, чтобы хотя бы ознакомиться с таким языком?
Нет, не стОит. Язык не будет за тебя решать твою задачу.
Зайди (например) на сайт Яндекса и посмотри какие там задачи. Ну вот одна из таких:
Есть два списка глаголов русского языка 1) совершенные и 2) несовершенные.
Соберите каким-нибудь образом все пары типа "делал-сделал".
Ну вот каким образом новый язык программирования поможет в решении такой задачи? Воот...
Я обьясню это через придуманную мною алегорию.
Можно купить машину с очень мощным мотором.
Но стоять в пробке она будет примерно с той же скоростью как Запорожец.
Потому что движение лимитурует другой фактор.
Так и с языками. Языки программирования уже давно не лимитируют твое понимание предметной области.
PS.
Я так понял что ты языками занимаешься? Немерл (или как его там) сочиняешь? Идея мне тут в голову пришла.
Макрос — это же не языковое понятие. Результатом применения макроса является преобразование одного текста в другой текст.
Текст этот не обязательно должен быть именно на языке программирования. Он может быть и на русском.
Вот... придумай достаточно мощщщщщщщщный язык макросов, который можно было бы прикрутить... к чему угодно.
Например как препроцессор препроцессора С++. И реализуй на нем то, что ты мне тут в виде рекламы написал — паттерны.
И прославишь ты свое имя на веки вечные как Страуструп и Степанов.
А С++ не трожь, не замахивайся на святое!
Когда разбогатеешь 10% мне не забудь, ты же честный человек
PS2. Макросы как часть IDE могут быть. Чтоб сразу видеть было-стало.
Течёт вода Кубань-реки куда велят большевики.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>У вас этого опыта нет, так что ценность ваших поучений относительно этого предмета близка к нулю. FR>Вот если вы будете критиковать C# или Немерле это будет весьма ценно для цели "обучения на чужом опыте".
Ну то есть притензий к озвеченным фактам нет.
Так и запишем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
L>>Понятий "хорошо" и "плохо", имхо, не существует. Зато есть "лучше" и "хуже", для употребления которых уже и нужно зныние иных языков.
U>И что эта игра словами изменила? Если думать не в терминах языка, а в терминах решаемой задачи, то становится видно можно ли найденное решение записать лучшим образом по сравнению с записью в используемом языке. Знать другие языки для этого не требуется. Вот если видишь, что решение можно было записать лучше, но язык не позволил, тогда да возникает вопрос, а существуют ли языки, в которых нужная тебе запись доступна. И вот только для ответа на этот вопрос требуется знание других языков.
Есть у тебя список, надо вернут все элементы, удовлетворяюшие условию.
Если ты не знаком с функциональными фичами шарпа, то у тебя родится тчо-то вроде
var result = new List();
foreach (var x in coll)
if (test(x))
result.Add(x);
Как, думая в терминах решаемой задачи, прийти к более простому варианту
var result = new List(coll.Where(test));
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>И что эта игра словами изменила? Если думать не в терминах языка, а в терминах решаемой задачи, то становится видно можно ли найденное решение записать лучшим образом по сравнению с записью в используемом языке. Знать другие языки для этого не требуется. Вот если видишь, что решение можно было записать лучше, но язык не позволил, тогда да возникает вопрос, а существуют ли языки, в которых нужная тебе запись доступна. И вот только для ответа на этот вопрос требуется знание других языков.
Неверная логика.
Если человек не знает о возможностях то он о них и думать не будет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
L>Есть у тебя список, надо вернут все элементы, удовлетворяюшие условию. L>Если ты не знаком с функциональными фичами шарпа, то у тебя родится тчо-то вроде
L>
L>var result = new List();
L>foreach (var x in coll)
L> if (test(x))
L> result.Add(x);
L>
L>Как, думая в терминах решаемой задачи, прийти к более простому варианту L>
L>var result = new List(coll.Where(test));
L>
L>
Плохой пример. Для меня первый вариант проще, чем второй. В простых случаях (таких как приведенный) это не заметно, но очень хорошо видно в случаях сложных.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Я PHP и JavaScript практически не знаю, но судя по тем же флеймам они гораздо более подвержены ошибкам чем питон и руби ввиду очень слабой типизации.
D>Является ли сильная типизация по сравнению со слабой преимуществом при автоматическом рефакторинге, если оба языка динамически типизированные?
В теории и частично и на практике(PyPy) да является, для сильно типизированного динамического языка подмножество кода приводимого к статическому будет намного большим. Например тот-же PyPy транслирует код в статически типизированный RPython для которого все плюшки статически
сильно типизированных языков доступны.
D>Я склонен считать, что нет, т.к. ошибка типов в любом случае вылетит в рантайме, IDE никакой помощи тут не предоставит.
Статический анализ кода для динамики тоже существует и используется в таких вещах как pylint pychecker rope
Плюс довольно большое число ошибок ловится в такой фазе как загрузка модуля, да это рантайм, но он не требует полного исполнения кода, также как и
такие вещи как абстрактная интерпретация работающая на грани динамики и статики.
Конечно пока до уровня хорошей сильной статики это все не дотягивает, но движение есть.
D>Если так, то это ключевая претензия, и она ни на йоту не гипертрофированная: её значение переоценить невозможно. Как по мне, невозможность быстро и надёжно (без необходимости писать тонну юнит тестов) рефакторить код — это приговор языку.
Я так не считаю, как и множество других программистов.
Юнит тесты в динамике да необходимы, но не тонны, их размер будет вполне сопоставим с размером оных для статики.
D>На любом хоть сколько-нибудь крупном проекте рефакторинг будет выливаться в такой геморрой, что проще повеситься. "Отвинтили пупок — отвалилась задница." Всё остальное я перетерплю, но когда рефакторинг кода похож на хождение по минному полю, когда на каждый чих типа переименования метода приходится вручную шерстить весь проект глобальным поиском, потом смотреть, что из найденного относится к нашему классу, а что не относится (а в отсутствие информации о типах приходится анализировать логику, иногда глубоко), а потом молиться, чтобы где-нибудь не упала завязанная на рефлексии динамика, конструирующая имя вызываемого метода так, что он не нашёлся поиском... это ад, в общем. Огромное количество временных затрат на ровном месте. Вот реальная проблема. А что в рантайме я не смогу присвоить числовой переменной строку — мне глубоко пофиг, я уже привык assert-ами по коду разбрасываться, они неплохо компенсируют слабую типизацию.
Тесты в этом вполне рулят.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Демагогия detected. Система типов именно что даёт математически доказанные гарантии.
Для языков с выводом типов не дает. Мешает проблема останова и алгоритмическая сложность, если нужны подробности смотри Основания языков программирования
последнюю главу.
Для императивных языков без вывода типов никаких математических теорий просто нет.
FR>>В данном случае да статика(вернее ее подмножество) рулит.
D>А ещё рулит компилятор, ага, который выполнит анализ без необходимости деплоймента и запуска приложения (иногда дорогостоящего) и кликанья по менюшкам, чтобы добраться до загрузки проверяемого модуля.
Здравствуйте, FR, Вы писали:
FR>Так с анализом обобщенного когда и в статике проблематично.
Чего?
FR>Тебе не нужно, это уже практически аксиома
Что значит мне не нужно?
Оно вообще не нужно.
Ибо никто не может сказать зачем.
FR>Оно поможет тем что нужно меньше правок.
Это ложь.
FR>Угу, кто не хочет слушать не услышит.
Ну так где аргументы то?
Есть только один: Меньше кода.
Но это по сравнению с жабой меньше. А по сравнению с немерле экономии почти нет.
А какие еще? Ну, хоть один.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[28]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Как-то не тянет, обращаться к сильно агрессивным людям
То есть претензия исключительно к моей манере общения, а не к квалификации? Ну хоть на том спасибо.
D>>И кстати, рекомендую на досуге поизучать скалу, чтобы ознакомиться с настоящей, нормальной статикой, и не демонстрировать собственное невежество,
FR>Только начинаю думать что с тобой можно нормально общаться и опять трололо с переходом на личности
D>>утверждая про проблемы с generics.
FR>Спасибо за совет про скалу, но мне хватает OCaml'а и небольших доз F# там этой статики более чем достаточно.
Раз ты говорил о проблемах с generics, значит нормальных generics ты не видел, следовательно недостаточно. И не надо расценивать констатацию факта твоего невежества в отдельно взятом вопросе (который ты собственноручно доказал) как переход на личности — это детство какое-то. Я сам невежда в огромном количестве областей, и что? Так что повторю рекомендацию: изучи скалу. "Мне хватает того-то сего-то" — это констатация собственной лени и нежелании развиваться. Кто тебя после этого будет воспринимать всерьёз?
By the way, я не знаю, что ты вкладываешь в слова "со мной можно нормально общаться". Я не вижу причин менять стиль общения с человеком, не понимающим аргументов, не желающим развиваться, не дружащим с формальной логикой, неспособным вести строго аргументированные споры, постоянно скатывающимся на обсуждение квалификации собеседника. Если честно, я вообще не вижу смысла с таким человеком общаться, но уж как-то так случилось. Положительная сторона в том, что мне не нужно строить из себя политкорректность.
Re[34]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>Типизация выполняется полностью на этапе компиляции. WH>Но из-за того что отсутствуют типы типов ошибка компиляции появляется черт знает где, а не там где она действительно произошла.
Это я понимаю. Но это уточнение не прибавит аргументов FR-у.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Дык, Немерле ведь от всего вышеупомянутого страшно далек, ты его сюда не приписывай. Он просто динозавр, родившийся поздно. Представляет из себя сугубо практическую попытку собрать несколько полезных наработок в одном языке на основе имеющейся мощной платформы, угу. В общем, вовсе не "край", а сугубо практическая попытка найти приемлемый компромисс м/у обилием фич и привносимыми ими помехами. Кстати, я не отрицаю полезность этой попытки. Скорее наоборот, обоими руками ЗА. Ведь макросы в С несколько сдали назад по тем временам и подорвали доверие к этой технике. Например, даже возможности макроассемблера на порядок превосходят возможности препроцессора С, не говоря уже о 50-летнем Лиспе или 40-летнем Форте. Пора вернуть макросы на заслуженное место, снабдив их типобезопасностью. Возможно, Немерле своим примером поможет сделать это в следующих версиях интересных мне языков. Хотя, справедливости ради, чрезмерное увлечение макросами всегда считалось плохим тоном во всех перечисленных языках. Элегантности кода не нужно приносить в жертву очевидность происходящего. Иначе бывает больно, вплоть до полного выкидывания и переписывания заново. В общем, моё ИМХО по этому вопросу умеренное, не приемлет обе крайности.
Ты бы лучше чем выпячивать тут свои знания истории ответил на один простой вопрос. Так почему наши профессора не знают даже такой дремучей древности?
V>Кстати, показательно. По-твоему, "настоящие программисты" должны писать софт исключительно для других программистов и заниматься исключительно проблемами языков. Сорри, но это сразу в сад, не задерживаясь.
Они должны знать перспективы индустрии и учить этому студентов. А не зацикливаться на поделаках вроде ББ, у которых даже GC на уровни Симулы остался.
V>>>Язык реализации — это последнее, что интересует. Вернее, не интересует никогда. WH>>Ну да... конечно. WH>>И после того как человек в это начинает верить получается всякая байда типа компиляторов на С.
V>А что не так с С? Отличная абстракция ассемблера. Настоящий нейтив во-плоти, без встроенных фокусов...
Если бы ты прекратил токовать как тетерев и внимательно прочел его слова, то заметил бы слово "компиляторов". Писать компиляторы на С при наличии потомков того самого МЛ — это действительно глупость.
V>>>Защитите хотя бы кандидатскую... WH>>И нахрена оно мне надо?
V>Чтобы привести в порядок собственные наработки. Чтобы в численном виде подсчитать характеристики и преимущества, наконец, если они есть. Чтобы провести и зафиксировать полноценное сравнение с имеющимися наработками в этой же области, показать прогресс (если есть), и характерные отличия.
Ды та не боись. На немрле пару человек уже защитилось. Проблема только в том, что код написанный для защиты — это код приготовленный в топку. И за "защитниками" все надо переписывать.
V>Например, ты прямо сейчас способен обосновать, почему нерекурсивные алгебраические типы представлены ссылочными типами, хотя дотнет позволяет оперировать value-type? А ведь ML-языки умеют делать такие оптимизации уже черти сколько лет. Пяток подобных вопросов без убедительных ответов, и можно идти допиливать диссер, а лучше сам язык.
Ну, ты разберись в рантйме дотнета и тогда ты поймешь, что на то есть объективные причины. В дотнете запрещена реинтерпретация памяти (типобезопасность однако). А для реализации АлгТД в виде вэлью-типов нужна реинтерпретация. Дотнетный GC тупо упадет если ему попытаться подсунуть структуру в которой совмещены, скажем, целочисленные и ссылочные поля.
WH>>И что есть классика? WH>>С++?
Незнаю, не знаю. Когда я слушаю моцерта, то понимаю, что большей части моих современников до него как до луны. Когда я вижу код на С++, я понимаю, что это была тупиковая ветвь эволюции.
V>Для императивных — Фортран/С/Паскаль. Функциональный — Лисп, логический — Пролог. Отличные языки для изучения парадигм. Почему отличные?
Да не очень то они отличные. Хотя приемлемые. Но ведь на практике же их все равно никто в вузах не преподает. Точнее иногда преподают, но на уровне все того же Паскля. Сколько я видел людей говоривших мне что учили Лисп в универе и даже сдававших лабы на нем. Только вот когда они видели макры и ФВП, то сразу дополняли свой рассказ откровение вроде — "А я думал что Лисп это такй императивный язык...". То есть они вообще не проходили того что делает Лисп Лиспом.
V> — а ничего лишнего, никаких понтов, шелухи и синтаксического сахара. Да, в этом и проблема Пролога например, что у него плохая стыковка с "общепрограммисткими" задачами, типа ГУИ, БД, сетка и т.д. Но для целей изучения логического програмимрования — это наоборот, мега-плюс. Бо ничего лишнего.
+100. Ну, и где от Лаптева или Дворкина хоть слово про Пролог?
А где те программисты которые могут программировать на Прологе?
Фактом является то, что максимум что могут заложить наши бездарные учителя вузов — это общие знания о том, что есть какой-то ЛП, а есть что-то вроде ФП.
Я тебе скажу больше. Образование в области программирования у нас практически уничтожено. В стране осталось 3-4 вуза из которых выходят действительно программисты. Большая часть молодых программистов стали таковыми не благодаря системе образования, а вопреки ей.
Ты понты бы по убрал. А то вон на тебя ГЫ тут загляделся и на "Си" этот код переписал. Профи, хренов.
V>Насчет тестопригодности. Ты должен будешь на один метод завязать как кучу низкоуровневых независимых тестов по проверке каждого отдельного вычисления, так и комплексные тесты, проверяющие их комбинации. А это залёт, курсант.
Курсант, ты бредишь. Все что нужно тут тестировать — это то, что после преобразования из дерева А получилось дерево Б.
Более того подобные тесты просто не нужны. Тестом является любое применение макроса для которого этот оптимизатор работает.
V>И где там пуля, ткни пальцем.
Да маттерн-матчинг, о котором ГВ и Лаптеву известно только то что он есть.
V>90% — ветвления идет по единичному тагу размеченного объединения.
Ты людей то не пугай такими словами "размеченного объединения". Их знания оканчиваются на ББ и СыПласПласс. А это никак не 92-ой год.
V>В факте предпросмотра на один уровень вперед (тоже самое тут: Fsm(a)::Fsm(b)::rest)? Да еще через ж... динамическую типизацию в реализации Nemerle? Издеваешься или как?
Не. Не издевается. Для них это кибер-бластер. Они вообще не понимаю, что здесь происходит. А вольфхаунд и не заявлял, что код особо сложный. Для любоого языка с ПМ код самый обыйденный.
Проблема в том, что строку вроде:
| (Rule.Fsm(fsm1) as r1) :: (Rule.Fsm(fsm2) as r2) :: rules =>
Ни Лаптев, ни Дворкин, ни Васильев понять не смогут. Для них это набор какой-то хрени.
V>В общем, декомпозируй решение, и на любом языке это будет смотреться очень похоже. Ни в какие 20 раз и близко разницы не будет.
есть изолированный пример уже переведенный в классическую форму для ООЯ. Можешь разы сам посчитать. Если брать полный компилятор, то по моим прикидкам выходит где-то раз в 10. Но это, правда, в купе с макросами и остальной замшелой фигней известной с МЛ и Лиспа.
V>Далее, вот это ленивые вычисления или энергичные? V>
V>Если энергичные, то в топку, бо многопроходность, а оно вполне решаемо за один проход.
Энергичные. Только вот многопроходность ты здесь выдумал. В прочем, можно было конечно и в ленивой манере написать. Не думаю, что скорость изменилась бы.
V>Тоже самое с Sequence(rules). Заметь, на плюсах тут вполне можно было обобщить на шаблонах оба случая.
А ну-ка изобрази! Языком то все молоть горазды.
V>Но на немерле или C# — это надо было бы городить огород из паттерна "Стратегия" для целей обобщения, и овчинка выделки не стоила бы.
О как? Стратегия говоришь. Тоже давай изобрази. Люблю юмор.
V>Собственно 90% функциональности метода рассмотрено. Проходишь по всем вложенным конструкциям и вызываешь оптимизацию правил для вложенных правил, если есть.
Ага. Если язык гарантирует оптимизацию хвостовой рекурсии и есть МП, то нет пролем. Этот код что на F#, что на Скле можно написать за милую душу. А вот про С++ ты уже врешь. Про C# и подавно.
В общем, попробуй. Флаг тебе в руки. Особенно смешно со стратегией ты тут залудил. Я вообще люблю паттерны. Как они появляютс, так сразу весело становится. Посетители, Сратегии... И это все вместо ПМ и лямбд.
V> Самих оптимизаций по сути две — это оптимизация последовательностей Not/And, и вызов FsmBuilder для цепочек символов и автоматов.
Да не важно сколько их. Сейчас две. Завтра 22. Важно насколько на языке легко выразить задачу. Вот есть исходное дерево (или граф) и нужно получить конечное. Какие там паттерны на С++ использовать будешь? Ну, что будешь делать, если нужно будет вложенность в 4 колена обработать?
V>Далее. Есть предложение для обоих случаев насчет возможности построения оптимизированного варианта сразу, по мере парсинга правил, а не "потом", за вот этот проход оптимизации.
Офигительное предложение! За одно его тебя я уже больше никогда всерьез воспринимать не буду. Взять и смешать сложность из двух задач. Супер! Так держать. И еще при этом у тебя хватает наглости смеяться над чужим кодом. Да ты же просто ламер нахватавшийся умных слов.
V>Это как разница в подходах построения ДКА — сначала можно строить по регулярным выражениям НКА, приводить его к ДКА, а затем минимизировать, но ведь можно строить сразу минимизированный ДКА — это порой на порядок быстрее, т.к.
Ну, ты очень крут. Но как-то скромен. Можно же пойти дальше и сразу в один проход построить эффективный исполняемый код! Давай, дерзни.
Так вот я вот что тебе скажу. Код Вольфхаунда может быть и не безупречен, но на сегодня никто еще лучше не написал. Из реализаций PEG-а его самая быстрая.
А вам, ... с корачками у него лучше поучиться, а не выставлять свое распухшее эго на показ.
V> на каждом шаге обработке подвергается множество меньшей мощности. Хоть алгоритм и чуть более сложный, угу.
Угу. "Чуть более сложный". Я без мата этот лам даже дальше коментировать не могу. Чуть более сложный в данных условиях означает неподъемный. Там сложность зашкаливает. Только благодаря не ординарным способностям Вольфхаунда и использованию инструмента позволяющего снизить сложность до приемлемого значения этот генератор парсеров и стал возможным. Конкуренты лабающие аналоги на Яве и С++ уже много лет нервно курят в сторонке, так как их поделки раза в 3 медленнее.
V>В общем, подкинь что-нить посущественнее, что ли...
Куда тебе. Ты на этой задаче садяшь со своими подходами. Ты только что расписался в полном и беспросветном ламерстве. Идея распихать код оптимизации по парсеру — это супер! Глупее и придумать ничего нельзя.
В общем, сори, но читать подобну ахинею да еще с таким ханжеским апломбом я не могу. Я понимаю, что я перешел грань. Пойду забаню себя к чретям.
Тему вы мою все равно угробили офтопом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
VD>>Да ты шутник, однако. Только форумом ошибся. Тебе нужно в юмор.
VD>>2 WolfHound: Когда ты поймешь, что показывать примеры кода можно только тем, кто их понимает. Ты думешь, что что-то там обосновываешь, а человек тупо нихрена не понимает. Он в жини только if-ы освоил. И твои примеры для него — это еще один енпонятный набор крокозябр.
V>Влад, поменьше понтов.
Это ты по меньше понтов бросла бы. А то все равно твои слова лам выдают ведь.
Цитата выше, правда, не про тебя была.
V>Сначала попробуй понять, что именно критикуется. Автор кода, я уверен, понял прекрасно. А вот ты нет.
Да я то понял. Он вообще не понимает как работат ПМ и что такое АлгТД. Ты явно это понимаешь, но похоже только теоретически. Потому как твои советы были феерическим ламом.
V>На досуге помедитируй над вот этими двумя локальными ф-иями и попробуй найти у них связанность: V>
V>А после тщетных попыток попробуй нарыть хотя бы одну метрику оценки кач-ва кода, значение которой не будет для приведенных отрывков наихудшим.
Ты говоришь о небольшом дублировании кода. А ГВ говорил о другом. Он вообще не понял написанного.
VD>>Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках:
V>Да пофиг, основное замечание было в смешении процесса диспетчеризации и каких-то ф-ий "по месту", которые не связаны с диспетчеризацией.
Не неси пургу. Это трансформация дерева. Причем вынесенная в отдельную функцию (локализованная). Устранять здесь "диспечиризацию" — означает превращать код в говно смешивая разную логику.
Если ты до этого еще не до рос, то иди работай над собой, а не давай советы вселенского масштаба и вселенской же глупости.
VD>>1. В привычных тебе языках оптимизация концевой рекурсии не гарантируется,
V>Хе. А если ему Лисп привычен?
Он только название такое знает.
VD>>так что для корректной реализации тебе придется заменить вложенную функцию на цикла и стек (с ручной манипуляцией этим стеком).
V>А что, обрабатываемые правила могут иметь бесконечную вложенность?
С достаточной чтобы получить переполнение стега. К тому же даже если ты его не получишь скорость может очень сильно прочесть.
V>И вопрос на 1000000 баксов: в Немерле хвостовая рекурсия только в рамках одной ф-ии работает?
К сожалению — да.
V>Т.е. случай двух взаимно-вызываемых ф-ий не оптимизируется?
Нет.
V> Только это бы объяснило приведенный код в стиле дельфийского MegaButton_Click, т.е. оправдало бы автора... но это же приговор текущей реализации компилятора, требующей от программистов говнокодить.
Как раз взнаимная рекурсия нужна не так часто. Проблема в том, что реализовать взаимную рекурсию для общего случая не так просто. Хотя конечно, нужно реализовать хотя бы для случая вложенных функций. Это не так сложно.
В дотнете есть специальная мсил-ина для хвостовой рекурсии, но на практике вместо ускорения кода она дает замедление.
V>Ваш optmize не требует посетителя. Достаточно абстрактного метода и реализация в наследниках. Тоже забыть переопределить будет сложно. К тому же, можно будет обобщить, где близко (Choice/Sequence) и разнести нафиг несвязанный функционал всего остального.
Ну, не томи. Давай продемонстрируй нам код на шарпе или плюсах. Потом без посетителей конечно можно жить, но вот только до появления второго обхода дерева. После этого экономия на спичках сразу же превращается в гимор.
VD>>Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше.
V>В 10? V>
А что ты будешь делать когда потребуется еще один уровень вложенности? Начнешь типы приводить и вложенные кейсы писать?
Да, и не видно шаблонов! Ты тут ведь недавно про шаблоны говорил. Они же должны дать невероятный эффект.
Очень интересно что ты будешь делать когда придется кроме оптимизации еще каую-то обработку сделать? Бежим по файлам и добавляем новые методы? Посетитель ведь нам не нужен.
А где Команда? Ты ведь еще этот паттерн упоминал.
Если приглядеться, то несложно заметить, что код твой стал полным говном, так как контроль компилятора утрачен. Обрати внимание на то что МП контролирует наличие всех возможных пересечений в match.
V>Это вместо 3-х матчей в исходном примере. Разница ровно на "обвеску" (заголовок метода), но это ведь после декомпозиции.
Серьзено? Вместо аж трех? Ты привел замену двум строкам кода:
В результате вместо двух строк ты получил 7 в сжатом виде. А в придачу ты заработал геморрой на всю оставшуюся жизнь, так как код этот не будет контролироваться компилятором. Любой изменение в структуре правил сможет привести к долгим и мучительным вискиваниям мест в которых ты забыл добавить обработку.
V>Это ты бредишь. Твой код просто не верен. Ты выбросил одну проверку.
VD>>Так что насмехаешься и горлопанишь ты тут исключительно от своей невежественности. Ну, а приведенный тобой "код" просто нерабочий.
V>"Рабочесть" приведенного кода зависит от обвески,
Не. Никак. Это принципиально не рабочий код. Там как минимум требовалось дополнительное приведение типов. Плюс в коде для банального сравнения создавались временные объекты:
else if (match(rule, Not(Not())) { return optimize(And(r.Location, rule)); }
Что за rule тут взялось из неоткуда? А Not(Not()) это что за хрень? Врменные объекты?
Короче это бред, а не код. Его не заставить летать даже с помощью волшебной палочки.
V>то бишь реализации окружения, как и в вашем примере. В плюсах, знаешь ли, бывают удивительные шаблонные перегрузки сигнатур, вполне можно и такой синтаксис сбацать.
Не знаю. Покажи, я ознакомлюсь. Твой код я вот посмотрел и он похож на правду. Хреновую такую, но все же. А код ГВ просто не код, а его вымысел.
VD>>Так для справки. Обрезанный компилятор C# (из SS CLI) написанный на С++ Майрософтом занимает 5 мег. Компилятор Немерле ~2. И это при том, что язык сложнее в разы.
V> V>И это при том, что компилятор Немерле имеет зависимость от нескольких основных дотнетных либ по многу мег, а приведенный компилятор C# писан с 0-ля без внешних зависимостей. Сравнил так уж сравнил.
Ну, давай расскажи что за чудо либы использует компилятор немерла? Я вот знаю одну — чтение из файла. В состав сишного кода тоже не включены библиотеки. Они там рядом лежат. Занимают бесятки мег.
А языки меж тем не соизмеримы. Так что если дать поправку на сложность кода, то получится где-то 7-10 раз. Ты же наверно не забыл, что в немерле как раз таки по полной программе есть и макросы, и расширяемый парсер, и паттерн-матчинг, и АлгТД, и поддержка linq. И это все против C# 2.0.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>Здравствуйте, VoidEx, Вы писали:
A>>Ты очень далеко увел аналогию от обсуждаемой темы. A>>Я не знаю, что такое "посторили метро" или "не построили метро" A>>применительно к процессу написания программы.
VE>
A>Метро всё равно быстрее их обоих.
VE>Сам придумал, сам не знаешь?
Не хами. Метро быстрее — очевидный факт. В большинстве случаев просто в разы.
A>>Моё утверждение просто как палка: A>>был бы хороший алгоритм, а реализовать его можно хоть на хинди. Язык не важен. A>>Вот с этим спорь.
VE>Ты аналогию придумал, сам ввел метро, вот теперь и потрудись рассказать, что есть метро? Алгоритм? Тогда каким местом стоит выбор между метро (алгоритм) и автомобилем (языком)? VE>А если это язык, который есмь побыстрее остальных, то назови ж нам его. VE>Алгоритм — это путь; в пробочном пути ехать на мерсе дольше, но это не значит, что по более быстрому пути теперь можно и на запоре гонять.
Тебе сколько лет?
Я тебе уже сказал. Для сложных задач (не ларек об1Сивать) язык не важен.
Совсем не важен, как авторучка для писателя, нужно чтобы просто была какая-нибудь.
Ничто, никакой божественный язык не позволит тебе написать FineRider или хотя бы Промт.
Потому что ты не знаешь что и как должна делать программа.
С самым совершенным языком ты будешь просто в два раза быстрее тупить.
Мерседес тебя никуда не довезет, если ты не знаешь, куда ехать.
Я тут уже предлагал простенькую задачку (с сайта Яндекса). Есть список глаголов русского языка.
Сформировать список пар глаголов "делал"-"сделал".
Какие преимущества в этой задаче может дать язык программирования?
В качестве эталона берем С++.
Течёт вода Кубань-реки куда велят большевики.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
H>Цель парсера, построенного с помощью нашего макроса — разобрать исходник и построить его AST.
Я тут выше намекал уже на парсер SAX, и на парсер XML-DOM. Второй получается из первого, путем добавления модуля постройки этого DOM. Похожую схему я как наблюдал неоднократно, так и делал сам, — очень удобно, рекомендую. Особенно в целях тестирования и гибкости доработки построителя модели, в вашем случае ACT. А wolfhound просто воткнуть никак в этот намек не может.
H>Абракадабра получается после трансформации некоторых правил в конечный автомат (но даже тогда вполне читаемая и наглядная). В остальном все вполне читаемо и приемлемо для отладки и профилирования.
Да я уже понял, что у вас даже конечный автомат не табличный. Хотя, учитывая тормоза дотнета по чтению из массивов, может оно и правильно.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
От изучения — не останавливает. Я "изучал" десятки языков на уровне "понять основные концепции-пройти несколько туториалов".
От применения останавливает следующее.
К сожалению, язык сам по себе — ничто, как сколь гениален он бы не был. Попробуйте переплюнуть Чарльза Мура и Джона Маккарти. Для серьезной работы нужны инструменты (как минимум, визуальный отладчик), окружение, библиотеки, причем не альфа-бета качества, и даже не первого релиза. Я присоединяюсь в данном случае к Ричарду Гэбриелу, в окончание своей почти 20летней эпопеи сказавшему что хороший программист хорошо и быстро пишет без корелляции с языком (не в том смысле что он способен хорошо писать на любом языке, а в том смысле что хороший С++шник способен не хуже писать на С++ чем хороший жавист на Java). Необходимо коммьюнити, вагончик библиотек на все случаи жизни (да, я знаю что ТЕОРЕТИЧЕСКИ я способен многое написать лучше, но ПРАКТИЧЕСКИ это нереально).
Есть определенные неубиенные слоны, которых не обойти. Навскидку (то что лично для меня создает наибольшую проблему, я такое написать неспособен в приемлемые сроки) — многопоточность, concurrency, lock-free алгоритмы и структуры данных, кластеризация. Пока таких слонов на "новом" языке нет — на нет и суда нет.
Re: Что вас останавливает от изучения нового языка?
Любое изучение нового языка преследует 2 цели
1. Познавательная, для определения различий и из этого достоинства того или иного языка и в основном обзорное изучение.
2. Практическая, когда известно премущество данного языка для конкретной цели.
По первому пункту всегда интересно что нового появляется в программостроении.
Второй пункт зависит от существующих задач, а так же интересом применения накопленного опыта.
и солнце б утром не вставало, когда бы не было меня
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, 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[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Нафиг надо, если С++ уже есть?
На фиг нужен был С++ когда был С или даже Фортран?
A>Зачем изучать "те же яйца в профиль", если они не дают новых возможностей?
Не, ну правда! С++ это же те же яйца только в профиль. На фиг ты его учил? Время тратил?
A>Я лучше что-нибудь другое поизучаю ступенькой повыше. Паттерны например. Или что-нибудь связанное с архитектурой.
А если тебе скажут, что есть язык который повзоляет эти паттерны превратить в готовую к использованию библиотеку или фичу языка, тебя это не заинтересует?
Зачем учить паттерны, когда можно просто воспользоваться готовым решением?
Когда-то давно было много программистов писавших GUI на С. GUI отилично ложится на ООП. Но ООП в С не было. Тогда С-программисты придумали паттерны: класс, сообщение, событие и т.п. и начали писать код с их использованием. Многие и сейчас так делают. Но ты видимо к ним не относишься, так как знаешь, что есть язык — С++ в котором эти паттерны встроены. И знаешь, что писать на таком языке объектно-ориентированные прогрммы проще чем на С.
Вот такая же фигня и с другими частями. Скажем ты усердно выписываешь паттерн перебора элементов контейнера везде где нужно с ними что-то делать. А в каком-нить Шарпе есть встроенный оператор foraech который позовляет не выпиливать паттерн, а точно описать что с ним делать. А в каком-то другом языке есть готове решение позволяющее не писать циклы вообще (это я на ФП намекаю, хотя оно и в Шарпе есть).
А теперь представь, что есть язык который позволяет большую часть таких паттернов (в том числе и паттернов-проектирования) запихнуть в библиотеки и использовать где надо. Вместо тщательного выпиливания канонов паттерна ты просто декларируешь его применение и задаешь (тоже декларативно) нужные параметры. А все остальное автоматически выпиливает компилятор по программе называемой "макрос" (не путать с сишными текстуальными макросами). И более того, такие "программы" для компилятора ты можешь создавать сам.
Не уж-то это не стоит того, чтобы хотя бы ознакомиться с таким языком?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VD>>Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках:
VE>Плохо переводишь. Неаккуратно. Можно как-нибудь так:
Ты напиши. Не как-нибудь так, а конкретный код, матчащий Not(Not(rule)).
Чтобы он делал именно это и не был завязан на реализацию Not:
if (r is Rule.Not)
{
var rNot = (Rule.Not)r;
if (rNot.rule is Rule.Not)
{
var rule = (Rule.Not)rNot.rule;
return optimize(new Rule.And(r.Location, rule));
}
}
Здравствуйте, dimgel, Вы писали:
A>>В шаблонах Си++ структурная типизация. То есть, если говорить проще, факт использования типа влияет на процесс его рефакторинга. D>А можешь примерчик нарисовать для иллюстрации? А то я не въехал.
В С++ типы динамически типизированы.
Вот у нас есть template<class T>. И это все что у нас есть. Про тип T мы ничего не знаем пока его нам не дадут и мы не начнем компилировать данный шаблон с данным типом.
И нет никакой возможности задать какие у типа должны быть методы.
Какие вложенные типы итп.
Порутчикам: Про хаки, которыми можно что-то вытащить, мне рассказывать не надо (я сам про них кому угодно могу рассказать). Ибо они начинают работать, когда нам уже тип подсунули.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
A>>В шаблонах Си++ структурная типизация. То есть, если говорить проще, факт использования типа влияет на процесс его рефакторинга. D>А можешь примерчик нарисовать для иллюстрации? А то я не въехал.
template <class T>
class MyTemplate
{
public:
void Method(T t)
{
t.Invoke();
}
};
class MyTest
{
public:
Invoke();
}
class MyTest2
{
public:
Invoke();
}
При переименовании MyTest.Invoke() надо так же переименовать вызов T.Invoke() в MyTemplate<T>.Method(T), если шаблон MyTemplate инстанциировался классом MyTest. Так же надо найти и переименовать методы Invoke в других классах, которыми инстанциируется MyTemplate (например MyTest2). Добавь сюда правила перегрузки функций: const, &, koenig lookup.
Здравствуйте, FR, Вы писали:
D>>4) когда тебя попросили привести пример заявленных тобой проблем статики, ты привёл пример шаблонов C++.
FR>Который вполне релевантный.
Да не очень то. Проблемы динамики носят системный характер (потеря информации о типах вызвана самой динамикой). Проблемы шаблонов С++ вызваны проектным решением. По сути это ошибка дизайна. Можно было бы выбрать дизайн не приводящий к проблемам.
К тому же в следствии того, что С++ статически-типизированный язык все же получать информацию о типах в шаблонах таки можно. Просто делать это придется в рамках конкретных воплощений. Рефакторинг для С++ так же возможен (и даже имеется кое где), хотя и сложен. Но сложности эти в основном носят вычислительный характер.
D>>5) два C++ника ответили, что шаблоны в C++ — это не статика.
FR>Нет, один из них такого не говорил, ну и плюс я сам C++ник, а ты можешь пока постоять в сторонке.
Да и первый тоже. Вольфхаунд сказал загадочную фразу о нитипизированости типов в С++. Это совсем не то что С++ не типизированн.
На самом деле все встает на свои места когда начинаешь думать о шаблонах С++ не как об обобщенных типах (которыми они являются с большой натяжкой), а как о синтаксическом препроцессоре. Фактически шаблоны не используются как тип. Воплощение шаблона (часто называемое дебильным словом "инстанциация") ни что иное как процесс копирования АСТ шаблона и замена параметров типов на реальные значения. Таким образом речь идет о процессе чуть более вменяемом чем текстуальная подстановка. Такой процесс нормален для метапрограммирования (тех же макросов), но не для системы типов. Отсюда и все проблемы.
Однако воплощенный шаблон — это вполне себе законченный тип в котором можно делать проверки типов.
Вольфхаунд указывает на то, что такие проверки делаются не на самом шаблоне, а на его воплощении, что приводит к тому, что сообщения об ошибках появляются не тогда когда компилируется шаблона, а в совсем в другое время. Зачастую у пользователя шаблона.
Именно это препятствует созданию полноценного рефакторинга для С++. Но все же это усложняет задачу, а не делает ее невозможной. Ну, и слабая типизация, конечно, в следствии которой в С++ спокойно можно обмануть систему типов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
О, не про табы и пробелы, а полрсдна участвует... Вот еще взгляд программиста-маргинала, даже бомжа — мой.
Я раньше вникал в разные языки по делу и из любопытства. Сейчас без необходимости даже не интересуюсь. "Сейчас" многое отличаются от "тогда", но я, наверное, "тогда" этими языками уже объелся.
VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы.
Программист — млекопитающее, должное мыслить абстрактно, в том числе обязанное уметь абстрагироваться от синтаксиса. В известных разумных пределах, конечно (не брэйнфак). Синтаксис на выбор должен влиять только при прочих равных. Но в жизни бывает не так, привычка — страшная сила.
VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП.
Программировать объектно-ориентированным образом можно на Си и ассемблере. А в итоге все сводится к производительности труда при решении задач. Здесь надо учитывать затраты на изучения языка. Студент, формально выучивший язык в институте, должен на нем отработать годик-другой, чтобы котироваться на рынке труда. А, казалось бы, практические языки — это всего лишь "раствор" для склеивания предметных "кирпичей" (или материал для скульптора — как нравится), не более того.
Можно сказать, что человек, делающий язык, старается переложить свой способ восприятия и мышления на компьютерную реальность (в широком смысле и насколько это возможно: рамки существующих парадигм, за которые автор нового языка не всегда способен/хочет выйти; цели; доступный технический уровень и т.д.). Для успеха автору языка надо, само собой, попасть в какую-нибудь нишу, совпасть с другими в способе конвертации мысли в код, сделать что-то выгодное.
VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
Вспоминаются, например, дискуссии об использовании NET и java в шароваре. Мне в свое время нравилось "расслабленное" программирование на java, но использовать ее сейчас лично мне негде. Ограничения "политические", думаю, редки, они обычно технические, рациональные. Хотя я сталкивался и с "историко-политическими", когда в одной конторе ту же джаву пихали в каждое отверстие, или когда я был вынужден покодить на Бэйсике из-за чисто политических глупостей. Но это исключения.
VD>Так же интересно что останавливает от применения языков.
Отсутствие необходимости. Также порог вхождения, отсутствие комплексной среды разработки (а среду сейчас в большинстве случаев трудно отделять от языка) и т.д. Нужны веские причины, чтобы использовать новый язык. Я подумаю об изучении нового языка/среды, только если передо мной открывается весомое новое направление, и этот язык обеспечит выигрыш с перспективой (хотя я бомж и скорее выберу другое направление ). А для небольших разовых задач я скорее предпочту погрузиться в новую среду на минимально необходимую глубину, а основную работу сделать знакомым старым не оптимальным инструментом, рассчитывая выиграть в суме.
VD>...
VD>Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
У меня наоборот: С++ я использовать могу, но не изучил, и на строгом экзамене меня можно убить виртуальным деструктором.
п.с.
Имхо, в этой теме кое-что навалено в кучу. Есть промышленные разработки, есть академические. Не обязательно в масштабах ИТ, это может быть в рамках одной фирмы: есть череп, который слабает алгоритм в Матлабе и отдаст кодировать на Си юниорам или еще как-то. В итоге есть массовые языки — промышленные стандарты, а есть "штучные". Массовые, "штучные", академические... — вот это было бы неплохо попытаться разделить, как-то яснее будет.
Массовый язык в основе должен быть понятен дятлу и с минимальной вероятностью приводить к катастрофам. Здесь большая инерция.
п.п.с.
Интересно вспомнить 80-е, когда языки плодились со страшной силой. Это было время новых задач, больших, как запуск Гагарина: языки-всемогуторы; ИИ, базы знаний, компы 5-го поколения; параллельные вычисления и все такое. Потом наступило относительное затишье. Сейчас стало поживее. Вот мне кажется (именно кажется, я на самом деле не знаю), что сейчас это в массе связано с исканиями для промышленного программирования: производительность труда, безопасность... Тоже похоже на космос: уже в основном чистая прагматика, без романтики. Но может, я отстал от жизни.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Время и интерес. Мне вот что бы попробовать Немерле, надо отложить более интересные для меня вещи. На кой ляд это надо, если у немерла все success истории находятся рядом с компиляторм этого немерла ?
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Нафиг надо, если С++ уже есть? Зачем изучать "те же яйца в профиль", если они не дают новых возможностей?
Я лучше что-нибудь другое поизучаю ступенькой повыше. Паттерны например. Или что-нибудь связанное с архитектурой.
Течёт вода Кубань-реки куда велят большевики.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
HB>>Исключительно этот пункт. Вообще не выходит изучать что-то "для себя" — вроде и интересно, а "не идёт". Кстати, с обычными языками та же беда: заинтересовался было испанским, почитал, посмотрел, пару песенок перевёл, да и забросил.
VD>ОК, а чтобы могло подвигнуть преодолеть этот пункт?
Наличие хорошо оплачиваемых вакансий — точно могло бы. Хотя... если я сижу на такой же хорошо оплачиваемой и "пишу на дельфе", нафига оно мне надо? В общем, всё это сугубо личное, совокупность собственного любопытства и окружающих обстоятельств. С испанским — хороший пример, я его плюсанул. Отсутствие реальной практики, реальных проектов — и всё, тот же C++ я вообще не помню, хотя когда-то весьма интенсивно на форумах отвечал на вопросы (это было до кывта). Впрочем, нынешний C++ по слухам имеет уже мало общего с тогдашним — всякие Александрески с бустами понародились...
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
Во-первых, меня не интересуют маргинальные языки. Если у него нет своей ниши , и он реально не используется — подожду, когда ниша появится и использоваться будет реально. Изучить язык — много времени не надо, а зря тратить время на него незачем.
Во-вторых, я не люблю моду. Вдруг все набрасываются на что-то. Подождем, когда это нашествие козлотуров придет в какие-то рамки и выяснится, что же получилось. Где сейчас Ада ? А шуму было...
В-третьих, я должен быть уверен, что от этого языка будет для меня польза, то есть использовать его лучше, чем его предшественника. Иными словами, мне нужно быть уверенным, что он мне что-то такое положительное дает, чего в других языках, ранее мне известных, не было. И это не синтаксические конструкции, а нечто реальное.
With best regards
Pavel Dvorkin
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
I>>Время и интерес. Мне вот что бы попробовать Немерле, надо отложить более интересные для меня вещи.
VD>А если не секрет, что за более интересные вещи ждут твоего внимания?
Например кое какие планы на WCF, несколько книг (в т.ч. про компиляторы) которые я купил но еще не освоил, продожить Эрланг, который пришлось давненько отложить ради ASP.NET, и Хаскель.
VD>Я слово на Н даже не произносил. Предположим что это J$.
VD>Что до "success истории", то эта тема очень интересна. Ты сейчас на чем программируешь? Что за "success истории" ты слышал об этом средстве?
С#. Когда я начинал его где то в 2003м, C# и менеджед почти не применялся для тех задач, для которых мы его заюзали.
1 был в наличии интерес обусловленный _внятной_ демонстрацией возможностей(а не написанием калькуляторов). Возможности, например, быстрая и качественная разработка UI, легкая интерграция с COM, множество самого различного функционала и самое главное — возможность почти что безболезненного перехода с С++, настолько легкая что вопрос о наборе никогда не стоял — тупо брали почти любых сиплюсников ибо дотнетчиков практически не было.
2 success истории были найдены как в менеджед(Java), а уже позже в C#. Что именно это были за проекты, я точно не понмоню, извини, это был 2003й год. Направление — сапр, проектирование, вычисления.
то же самое было в своё время, когда я занимался Питоном. success история это был конвертер большой базы в xml и обратно при наличии _мизерного_ количества кода, при том, что с++ аналоги лажали на каждом шагу и соджержали в десятки раз больше кода при тех же возможностях.
Когда ты в свое время на право и налево вещал про парадокс Блаба и прочее непотребство, Гапертон написал всего немного сообщений про Эрланг на примере текстового процессора и я пошел смотреть эрланг.
Здравствуйте, VladD2, Вы писали:
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
1. Традиции предметной области.
Занимаюсь компьютерным зрением, большая часть библиотек на С/С++. Меньше на Матлабе. Совсем немного — Фортран. У многих есть биндинги к другим языкам, но они не так удобны, например при отладке. Например, пытался использовать OpenCV из Питона — не пошло.
2. Плюшки от более глубокого изучения предметной области.
Хочется изучить ещё этот алгоритм, посмотреть тот, а вот в новой статье написано так... Для меня эти знания важнее, чем языки. Следствие. Время на кодирование гораздо меньше времени разработки алгоритмов. Ну и зачем мне тогда более удобный язык?
3. Быстродействие.
Не все языки (но многие) позволят мне достичь необходимой скорости выполнения программ.
4. Цена.
Увы! Хотелось бы работать с Матлабом — он очень удобен. Но дорогой, блин. Если контора ещё потянет, то я дома с ним работать не смогу.
P.S. Пользуюсь в основном связкой C++/CUDA/Lua
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, x-code, Вы писали:
XC>Это то, что следовало бы сделать, когда принимали новый стандарт С++: не впихивать кучу костылей в существующий cpp, а просто взять и сделать новое расширение cppx с ДРУГИМ синтаксисом, не ограниченным совмесиммостью со старым, и просто сказать: вот он, новый стандарт.
Ну и пошли бы они лесом. Как метры уже имеющегося кода переводить на новый стандарт? Выносить куски кода в отдельные файлы? В топку!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ausergiy, Вы писали:
A>>появится задача, за которую заплатят деньги, буду учить язык. Не появится, значит не надо. Даже если потратишь время и выучишь, работодателя потом не убедишь что язык знаешь, но опыта не имеешь.
VD>То есть изучать что-то новое для саморазвития не нужно?
ну не все же подряд языки же программирования. это как молотки изучать — примерно также интересно. Обычно это и делают, или по молодости, от соответствующего энтузиазма, или в силу производственной необходимости...
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Здравствуйте, dimgel, Вы писали:
D>>То есть, ты предлагаешь мне убить пару-тройку лет на какие-нибудь динамически типизированные языки, чтобы убедиться, что все те помои, которые вы с WolfHound-ом на них выливаете, заслуженные? Гы, сорри, но это как раз тот случай, когда я предпочту поучиться на чужом опыте. Вполне, так сказать, доверяю.
D>Тем более, что помои аргументированные. А сам играясь с языком, я к этим же аргументам никогда, может быть, и не приду. Так и буду "писать на дельфе".
Очень большей частью как раз не аргументированные и Влад и WolfHound чистые теоретики и не имеют мало мальского опыта писания на этих языках.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
DR>>В языках с поддержкой метапрограммирования, вроде Немерле, макрос оперирует не текстом, а языковыми конструкциями.
A>Это как?
Оперирует уже распарсеным текстом обычно в виде AST
Есть даже препроцессоры, но не текстовые как в Си/С++ а синтаксические например http://en.wikipedia.org/wiki/Camlp4
которые также оперируют AST.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, robin_of_the_wood, Вы писали:
___>Перед тем, как начать применять новый язык(новое средство), его надо выучить(освоить). Нет можно и по другому но лучше не надо ___>Перед тем, как начать изучать новый язык, люди обычно думают на тему "А действительно ли проблема в языке(средстве)?"
Корректный ответ на этот вопрос можно дать только зная язык.
Далее — см. парадокс Блаба.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, WolfHound, Вы писали:
WH>>1)А чем 2008 не устраивает? A>тем что у меня есть 2010 и я нехочу ставить еще и 2008.
Поставь Visual Studio Isolated Shell, хотя точно не знаю работает ли с ним Немерл.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
___>>Перед тем, как начать изучать новый язык, люди обычно думают на тему "А действительно ли проблема в языке(средстве)?"
L>Корректный ответ на этот вопрос можно дать только зная язык. L>Далее — см. парадокс Блаба.
Да я согласен с этим.
И может даже корректность этого ответа не так и важна.
Главное чтобы не получилось что человек писал плохой код на одном языке а теперь пишет
плохой код на другом языке, более мощном.
Проектирование велосипедов для слепых жирафов
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
L>Понятий "хорошо" и "плохо", имхо, не существует. Зато есть "лучше" и "хуже", для употребления которых уже и нужно зныние иных языков.
И что эта игра словами изменила? Если думать не в терминах языка, а в терминах решаемой задачи, то становится видно можно ли найденное решение записать лучшим образом по сравнению с записью в используемом языке. Знать другие языки для этого не требуется. Вот если видишь, что решение можно было записать лучше, но язык не позволил, тогда да возникает вопрос, а существуют ли языки, в которых нужная тебе запись доступна. И вот только для ответа на этот вопрос требуется знание других языков.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Отсутствие смысла в изучении языка ради изучения языка.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
D>>Вот тут мне не надо ляля. Я читаю флеймы достаточно подробно. Не все и не всегда, но тем не менее. С аргументацией у немерлистов всё гораздо лучше, чем у их оппонентов, чьи аргументы сводятся к "не читал но осуждаю", ноль конструктива. Да ты хоть эту ветку перечитай. Половина спорщиков даже примерно не представляет, что такое макросы в N.
FR>Для них обоих современные динамические языки именно "не читал но осуждаю" теоретики они. FR>У меня самого было очень похожее мнение насчет динамики, изменилось оно только через полгода программирования на питоне.
Как тебе уже ответил WolfHound, в твоих ответах отсутствуют конкретные возражения по конкретным претензиям к динамике. Чистое бла-бла-бла. Сам я не знаю питона, но я знаю PHP и скалу, и я вполне могу экстраполировать свой опыт со слабо-динамически-типизированным языком на сильно-, тем более, что это будет по сути не экстра- а интерполяция (там с другого конца скала подпирает). То есть, я знаю достаточно, чтобы квалифицированно оценивать аргументы обоих сторон. Ты — сторона спора. Я — посторонний наблюдатель. "В споре рождается истина" — это, конечно, полная брехня, но одно исключение я таки-обнаружил: в позиции постороннего наблюдателя картина максимально полная, учитывающая аргументы всех сторон. Это касается не только статики-динамики, но и rich-anemic, к примеру, и всех остальных срачей. Ну а ты, если тебе так охота защищать динамику, — так защищай её, продумывай ответы на аргументы твоих оппонентов. Наезды на их квалификацию — это не аргументы, а переход на личности. Доказывающий кстати, что твоя квалификация ниже, раз тебя не хватает на аргументы должного уровня.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Является ли сильная типизация по сравнению со слабой преимуществом при автоматическом рефакторинге, если оба языка динамически типизированные? Я склонен считать, что нет, т.к. ошибка типов в любом случае вылетит в рантайме, IDE никакой помощи тут не предоставит. Если так, то это ключевая претензия, и она ни на йоту не гипертрофированная: её значение переоценить невозможно. Как по мне, невозможность быстро и надёжно (без необходимости писать тонну юнит тестов) рефакторить код — это приговор языку. На любом хоть сколько-нибудь крупном проекте рефакторинг будет выливаться в такой геморрой, что проще повеситься. "Отвинтили пупок — отвалилась задница." Всё остальное я перетерплю, но когда рефакторинг кода похож на хождение по минному полю, когда на каждый чих типа переименования метода приходится вручную шерстить весь проект глобальным поиском, потом смотреть, что из найденного относится к нашему классу, а что не относится (а в отсутствие информации о типах приходится анализировать логику, иногда глубоко), а потом молиться, чтобы где-нибудь не упала завязанная на рефлексии динамика, конструирующая имя вызываемого метода так, что он не нашёлся поиском... это ад, в общем. Огромное количество временных затрат на ровном месте. Вот реальная проблема. А что в рантайме я не смогу присвоить числовой переменной строку — мне глубоко пофиг, я уже привык assert-ами по коду разбрасываться, они неплохо компенсируют слабую типизацию.
Рефакторинг это поведение IDE, а не свойство языка. Си++ типизирован и кому это помогло?
Здравствуйте, MxMsk, Вы писали:
U>>Плохой пример. Для меня первый вариант проще, чем второй. В простых случаях (таких как приведенный) это не заметно, но очень хорошо видно в случаях сложных. MM>Чем первый вариант проще?
Насчет проще на таком простом примере видно не будет. Но в этом случае код примерно одинаков по сложности, т.к. содержит равное количество сущностей. В обоих вариантах есть и пробег по коллекции, и условие, и обработка условия. Разница лишь в лаконичности, т.к. во втором случае пробег по коллекции спрятан внутрь функции.
Здравствуйте, adontz, Вы писали:
U>>Также объясни сколько языков нужно знать для того, чтобы понять, что даже в C# 1.0 можно было написать функцию: string MyJoin(string separator, string format, IEnumerable items), которая позволила бы избавиться от мусорного кода, хотя бы в простых (но очень распространенных) случаях? A>
A> public static string Join(string separator, IEnumerable<string> values);
A>
Это в каком шарпе появилось? Очевидно, что не в 1.0 и вроде даже не в 2.0.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
WH>>Тесты гонять? FR>Да. WH>>А где гарантия, что покрытие 100%? FR>100% гарантии теперь даже в банках не дают.
Демагогия detected. Система типов именно что даёт математически доказанные гарантии.
FR>В данном случае да статика(вернее ее подмножество) рулит.
А ещё рулит компилятор, ага, который выполнит анализ без необходимости деплоймента и запуска приложения (иногда дорогостоящего) и кликанья по менюшкам, чтобы добраться до загрузки проверяемого модуля.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>>>Юнит тесты в динамике да необходимы, но не тонны, их размер будет вполне сопоставим с размером оных для статики.
D>>Гыгы, нуну. -1.
FR>В статике они тоже необходимы, если пишется хоть что-то более-менее серьезное.
В статике я тестирую логику, и только логику. Там, где эта логика достаточно сложна и устойчива, где написание и поддержание актуальности тестов выгоднее, чем тыкаться вручную. Мне не нужно писать тесты на всё подряд только ради возможности безболезненно отрефакторить, и кроме того, при рефакторингах тесты будут зацеплены по необходимости (вследствии ругани компилятора). И таким образом не только количество, но и сложность поддержания юнит тестов в статике ниже.
FR>>>Тесты в этом вполне рулят. D>>Пишите, Шура, пишите, они золотые. FR>Жаль, мне ты казался более вменяемым
Ну, сорри, что разочаровал. Я не спец по языкам и компиляторам, но зато я практик, гы, в отличие от этих "теоретиков" Влада и WolfHound-а.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Чуть выше показали на шаблонах C++.
Показывать на С++ и говорить что статика говно это демагогия.
Ибо С++ сам по себе гора страшных костылей.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[25]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
NB>>ты ведь понимаешь, что никто в нормальном здравии так писать не будет. WH>Почему? WH>В C# пишут. WH>В хаскеле пишут. WH>Почему на С++ не будут?
весь интерфейс используемый в функции переписывают?
этож застрелиться можно.
я думал это си — многословный язык, ан нет.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
WH>>Ну так где аргументы то? WH>>Есть только один: Меньше кода. WH>>Но это по сравнению с жабой меньше. А по сравнению с немерле экономии почти нет. WH>>А какие еще? Ну, хоть один.
FR>Практика.
Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
Re[21]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Практика.
D>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
Я не верю в существование лучшего языка у всех реальных языков полно недостатков.
Практика не демагогия, а очень толстый и жирный аргумент, если язык живет и долгое время популярен, на нем выпускаются
вполне успешные проекты, то это железно доказывает его нужность при всех его недостатках, если этого не видят поклонники
одного очень крутого, но пока (хотя при таких фанатах может и навсегда ) не практичного языка то это их проблемы.
Re[23]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Нет, а вот твой тупой переход на личности мне очень не нравится, хотелось бы чтобы модераторы придерживались такого же мнения. FR>>Ладно бы еще тонко тролил
D>Я не тролю, я общаюсь с фанатиком, неспособным аргументировать свою точку зрения. А переход на личности начал ты, я лишь его проявил.
Прикольно я тоже общаюсь с фанатиком.
Теоретизм наших уважаемых модераторов в динамике это не переход на личности а факт.
Re[25]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, adontz, Вы писали: A>>Тебе есть что сказать по существу? Я где-то не прав?
WH>Так я вроде по существу и сказал. WH>Что не ясно?
Девочки, не ссорьтесь.
Re[33]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>ИМХО эти вещи до некотороый степени взаимосвязаны. Там где я в ФП могу написать `val strings = ints.map(_.toStrings)`, на императивном языке я буду вынужден корёжиться с циклом (сорри, вы тут неподалёку что-то похожее в тему обсуждали, но мне в вашу тему вчитываться лениво). И сущностей меньше, и букв.
Это должен быть совсем ограниченный "жестко-императивный" язык, типа Джавы или Паскаля. На любом более-менее универсальном языке, например C# или С++, это делается примерно в такой же записи, +- несколько букв.
Джава — это вообще приговор мозгам. По фичам уступает даже до-дотнетному VB (за исключением поддержки наследования реализаций). Переносил как-то после появления дотнета несколько прог с Джавы на C#, исходники получались в 2-3 раза меньше, бо весь этот мусор из листенеров и самописных итераторов шел лесом, и становилось гораздо чище.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, dimgel, Вы писали:
A>>>В шаблонах Си++ структурная типизация. То есть, если говорить проще, факт использования типа влияет на процесс его рефакторинга. D>>А можешь примерчик нарисовать для иллюстрации? А то я не въехал. WH>В С++ типы динамически типизированы. WH>Вот у нас есть template<class T>. И это все что у нас есть. Про тип T мы ничего не знаем пока его нам не дадут и мы не начнем компилировать данный шаблон с данным типом. WH>И нет никакой возможности задать какие у типа должны быть методы. WH>Какие вложенные типы итп.
Думаешь это так просто? Вот пример. Есть объект типа T: T obj. Я для него зову boost::begin(obj). Как ты думаешь, что нужно этому типу иметь, чтобы данный вызов работал? А ответ заключается в том, что в C++ понятие интерфейса типа гораздо шире, чем набор методов этого типа.
Re: Что вас останавливает от изучения нового языка?
On 22.04.2011 19:19, VladD2 wrote:
> 3. Политические предпосылки — "Все равно не смогу применять его на работе...".
Вот типа этого. Отсутствие реалных проектов, где язык можно было бы применить.
Например, прочитал о python -- а толком ничего написать не могу, нечего.
Erlang — то же самое.
Posted via RSDN NNTP Server 2.1 beta
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, alexeiz, Вы писали:
A>Думаешь это так просто? Вот пример. Есть объект типа T: T obj. Я для него зову boost::begin(obj). Как ты думаешь, что нужно этому типу иметь, чтобы данный вызов работал? А ответ заключается в том, что в C++ понятие интерфейса типа гораздо шире, чем набор методов этого типа.
Читай про классы типов в хаскеле.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[31]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Иными словами, ты пытаешься брать худшие примеры (по факту ты берёшь примеры, вообще к теме не относящиеся) и на них пытаешься показать порочность самой идеи. Предложения ознакомиться с хорошими примерами реализации ты отклоняешь. Троллизм, демагогия и воюющее невежество. Я тебя запомнил.
В зеркало посмотри
Re[28]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
VD>>Ну, так и потрудись быть конструктивным. Я понимаю твою позицию, но товарищ был прав, ты действительное не приводишь никаких аргументов, а в место этого постоянно обсуждаешь чужую компетенцию в отдельных областях.
FR>Тык он тоже, ладно замнем.
На зеркало не пеняй. Я вынужденно бью тебя твоим же оружием.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
D>>ИМХО эти вещи до некотороый степени взаимосвязаны. Там где я в ФП могу написать `val strings = ints.map(_.toStrings)`, на императивном языке я буду вынужден корёжиться с циклом (сорри, вы тут неподалёку что-то похожее в тему обсуждали, но мне в вашу тему вчитываться лениво). И сущностей меньше, и букв.
V>Это должен быть совсем ограниченный "жестко-императивный" язык, типа Джавы или Паскаля. На любом более-менее универсальном языке, например C# или С++, это делается примерно в такой же записи, +- несколько букв.
То же самое можно сказать про паттерн матчинг. Которого нет в C# и C++. Только те, кто им не пользовался — не проникнутся, будут говорить, что есть if и визитор.
По сравнению с Nemerle, C# ограниченный императивный язык.
Re[33]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Ок, было вот что: D>
FR>>>Так с анализом обобщенного когда и в статике проблематично.
D>>В самом деле? Пример дашь? А я в ответку решение на скале без проблем.
D>Чуть выше показали на шаблонах C++.
D>Суть от этого не меняется: ты пытаешься притянуть за уши нестатическую часть C++ в качестве доказательства проблем со статикой.
Меняется, шаблоны статическая часть C++, динамики там нет.
FR>>Конечно имелось в виду "полный статический анализ возможен не для всех статически типизированных языков".
D>Недостатки конкретной реализации не являются подтверждением недостатков самой идеи. Хотя бы это тебе понятно, или твоя цель — много и бессмысленно троллить?
Троллить это твоя цель.
Если бы я хотел показать недостатки конкретной реализации то я бы взял более слабо типизированный чем С++ Си.
FR>>Кто-то тут про невежество втирал, да ладно, шаблоны статическая часть C++ выполняются только в compile time в рантайме их не существует.
D>Тут уже двое отписали — WolfHound и adontz — что шаблоны C++ НЕстатические. Я тебе уже минимум дважды предлагал ознакомиться с полноценной статической реализацией генериков. Как об стенку горох. Ты для чего, как заведённый, повторяешь одну и ту же мантру, которую уже сто раз опровергли, а?
adontz говорил ровно противоположное.
Тебе читать хотя бы Вандервуда "Шаблоны С++".
D>При чём здесь твой окалм? О нём речь вообще не идёт. Начинаем сначала:
Это статический жестко типизированный язык, обобщенное программирование в нем тоже есть.
D>1) ты защищал динамику, утверждая, что её недостатки, описываемые немерлистами, несущественны.
Нет, ты перевираешь, я говорил что они несущественны на практике.
D>2) в ответ на просьбы указать преимущества динамики ты не смог сказать ничего.
Не видел просьб, только нападки тролля.
D>3) когда зашла речь о том, что тесты не дают никаких гарантий, ты стал утверждать, что статика тоже не даёт гарантий.
Нет, я сказал что статика не дает 100% гарантии.
D>4) когда тебя попросили привести пример заявленных тобой проблем статики, ты привёл пример шаблонов C++.
Который вполне релевантный.
D>5) два C++ника ответили, что шаблоны в C++ — это не статика.
Нет, один из них такого не говорил, ну и плюс я сам C++ник, а ты можешь пока постоять в сторонке.
D>6) ты скорректировал своё утверждение: "полный статический анализ возможен не для всех статически типизированных языков". В новой редакции оно эквивалентно следующему: "существуют статически-типизированные языки, в которых невозможен полный статический анализ". Что ни коим образом не доказывает порочность самой концепции, т.к. не отрицает существования языков, в которых этот самый полный статический анализ возможен. Согласен?
А я нигде ни собирался доказывать порочность концепции.
Ты выдумал себе виртуального собеседника и с ним беседуешь, а мне приходится за него отвечать, цирк какой-то
Re[35]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>adontz говорил "В шаблонах Си++ структурная типизация." WolfHound — "В С++ типы динамически типизированы. Вот у нас есть template<class T>. И это все что у нас есть. Про тип T мы ничего не знаем пока его нам не дадут и мы не начнем компилировать данный шаблон с данным типом." Про статику никто из них не говорил.
Любой C++ знает что шаблоны это статика.
FR>>Тебе читать хотя бы Вандервуда "Шаблоны С++".
D>Не интересно. Ты в состоянии сам логично и последовательно объяснить, почему они — статика? Вышеупомянутые персоны не гнушаются аргументировать свои утверждения, чем ты хуже?
Ты не просил. Это общеизвестная вещь.
Статика они потому что существуют только во время компиляции. В объектном коде от них не остается вообще ничего, это одно из
основных свойств из-за которых их и применяют в таком повернутом на производительности языке как C++.
FR>>Это статический жестко типизированный язык, обобщенное программирование в нем тоже есть.
D>И что?
То что статику я знаю вполне нормально.
D>Не придирайся к словам. Программирования — это практическая дисциплина. Теория никого не интересует.
Тут это очень важно, это основное из-за чего у нас и идет весь этот спор динамика vs статика.
D>Просьба шла от WolfHound: "Ну так где аргументы то? Есть только один: Меньше кода. Но это по сравнению с жабой меньше. А по сравнению с немерле экономии почти нет. А какие еще? Ну, хоть один."
Ему отвечать бессмысленно, проверенно уже больше чем за пять лет.
D>>>4) когда тебя попросили привести пример заявленных тобой проблем статики, ты привёл пример шаблонов C++. FR>>Который вполне релевантный.
D>Нет.
Да.
D>>>5) два C++ника ответили, что шаблоны в C++ — это не статика. FR>>Нет, один из них такого не говорил, ну и плюс я сам C++ник, а ты можешь пока постоять в сторонке.
D>Что они говорили, см. выше. Я писал на C++ лет 5, хоть и давно. Наезды свои оставь при себе. (Очередной съезд на личности, похоже принцип "как аукнется, так и откликнется" до тебя не доходит.)
По твоим словам чуть выше видно что ты не писал на шаблонах C++.
Троллить еще не устал, справедливый ты наш?
FR>>А я нигде ни собирался доказывать порочность концепции.
D>Тогда что ты пытаешься доказать?
Я ничего, пытаюсь отбиться от тролля, чистая самозащита.
FR>>Ты выдумал себе виртуального собеседника и с ним беседуешь, а мне приходится за него отвечать, цирк какой-то
D>Можешь не отвечать, тебя же никто не заставляет? Тем более, что ты уже слил по всем фронтам неоднократно.
Надоест перестану.
Re[39]: Что вас останавливает от изучения нового языка?
D>Ок, каюсь. Возвращаемся к истокам, с которых всё началось: ты же не будешь спорить с тем, что шаблоны C++ — далеко не самый удачный пример статической типизации, и что по ним нельзя утверждать о том, что проблемы со 100% контролем типов в обобщённом программировании присущи всей статике как таковой?
Я утверждаю, что:
1) Статическая типизация не гарантия относительной лёгкости построения средств рефакторинга.
2) Динамическая типизация не гарантия относительно сложности построения средств рефакторинга.
и надо каждый язык рассматривать отдельно.
Здравствуйте, Undying, Вы писали:
U>Если мыслишь заученными конструкциями, то заучив новые конструкции, станешь всего лишь более знающим бараном. К умению думать владение заученными конструкциями не имеет никакого отношения. А умение думать строится на совершенно других принципах, в частности на принципе минимума сущностей. Но само по себе изучение других языков никак освоить эти принципы не помогает.
Умение думать — это очень похвальное качество. Я сам всегда повторяю, что во всех случаях надо думать голой. Вот только все своей головой не придумаешь. И будь твоя голова хоть трижды золотая ты не изобретешь и тысячной доли того, что смогло придумать человечество в области программирование за какие-то 50 лет. Потому кроме умения думать надо еще уметь развиваться. Познавать новые подходы (знания добытые и обобщенные другими для нас), перенимать практики. В том числе изучать передовые языки.
U>Пример со string.Join показывал, что очень часто проблема мусорности кода может быть решена средствами имеющегося языка.
Да, КО. Но это подтверждает или опровергает? Это так же верно, как утверждать, что иногда грязь на улице можно убрать нагнувшись и подняв ее. Но не ужели это отрицает того факта, что для уборки большой и замусоренной улицы лучше применять машину или хотя бы метлу?
U>Но в силу привычки думать заученными конструкциями программисты просто не замечают, что данный код является мусорным, и соответственно не ищут способа избавиться от этого мусорного кода.
Я уверен, что тот же Лойд прекрасно осознает что можно написать фуннкцию которая сделает код чище и лучше. Но не делает он это чисто из лени. Конкатенация строк с помощью string.Join ему нужна раз в два года и ему просто лень создавать новую функцию.
Если же человек такой ламер, что не понимает этого, то ему конечно и дела не должно быть ни до новых языков, ни до малейшего саморазвития. Но не все же такие?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Что вас останавливает от изучения нового языка?
Z>А чем должна отличаться реализация для нерекурсивных?
Инлайнится по-возможности, т.е. не создаваться на куче. Участвовать в распространении констант без всяких динамических проверок дискриминатора (т.е. типа объекта). Наиболее естественно — сделать как дотнетный value-type и агрессивно оптимизировать, как в Хаскеле.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, gandjustas, Вы писали:
VD>>>На уровне не на уровне, то оная присутствует. G>>Кроме синтаксиса языка есть еще семантика, а она там не описана.
VD>Семантику можно узнать из многочисленных туториалов и статей. Кроме того она в массе свой очень близка к Шарпу. Те кто пробовал язык на практике ни разу не жаловались на трудности. Если что можно всегда спросит на форуме. Вот только спрашивают очень редко, так как проблем особо не возникает.
То есть единого источника к которому можно обратиться за справкой таки нет.
G>>>>2)Когда появится Nemerle Team Blog или что-то в этом роде, где будут свежие новости, примеры, анонсы итп? VD>>>Вместо него http://www.rsdn.ru/forum/nemerle/ G>>Форум и блог — совершенно разные вещи. VD>Это ты себе сам эту мысль навязал. Меж тем разницы нет никакой. Цель — информирование о новых возможностях и практике применения — достигается.
Ну конечно, отличие только в том что мусора в форуме на несколько порядков больше и найти информацию там труднее.
G>>>>4)Когда появится хотябы одна книга или учебный курс по Nemerle?
VD>>>Они появились лет пять назад: VD>>>http://nemerle.org/wiki/Tutorials VD>>>http://nemerle.org/wiki/Courses
G>>Второе стоило бы включить в "спецификацию", первое вообще говоря на обучающий материал не тянет никак — несколько ссылок на банальные статьи и на svn, который уже неактуален.
VD>Это ты тоже придумал. На практике по этим курсам учат студентов в польском институте.
Я так понимаю что обучали те, кто писал nemerle. Ксттаи не поленись и попробуй прощелкать все ссылки, половина ведут вникуда.
VD>>>Плюс: http://www.rsdn.ru/summary/3766.xml G>>Сравни с http://msdn.microsoft.com/en-us/fsharp/cc835246 VD>А что мне сравнивать то? У МС бабла немеренно. С ними тягаться трудно. И тем не менее факт остается фактом. Человек с сишным опытом осваиваем Немерл за время от 3-х дней до двух месяцев, а F# обычно не осваивает вовсе (бросает). Потому как сколько бы материалов не было, а для его изучения нужен перелом мозга заработать.
Отличная позиция чтобы не заниматься популяризацией.
G>>>>5)Когда будет справка по библиотеке nemerle и макросов на уровне MSDN?
VD>>>Библиотеки как таковой нет. Nemerle использует .Net Framework. Ну, а описание той мелочи что есть в Nemerle.dll можно наблюдать в ObjectBrouser в VS. Как раз очень близко к МСДН-овскому описанию. В прочем, знание либы не требуется для испльзования языка. G>>Самая важная часть в MSDN это секция remarks, её в object browser нету.
VD>То что есть в док-коментах этого за глаза достаточно для понимания сути функции. Библоиотека немерла очень мала, проста и понятна. Там нет каких-то многоэтажных наворотов. Обычно это функции суть которых понятна из названия и сигнатуры.
Ты что-то сильно путаешь. Ты считаешь что библиотека компилятора проста и понятна?
G>>>>Кстати если вы изобретаете свои фреймворки "независимые от asp.net\ado.net\что_то_там_net, то все указанное выше касается и этих фреймворков тоже.
VD>>>Ну, тут до релиза пока далеко. А так, конечно обязательно будет описание. VD>>>Вот пример описания
к одному из мощнейших макросов созданных на немерле на сегодня — PegGrammar. G>>Это я видел. Снова та же проблема, есть описание "что", но абсолютно не написано "зачем" и "как мне это поможет".
VD>Зачем как раз написано. Просто у нас видимо разное понимание этого слова. Для меня "зачем" описывается назначением продукта. Раз сказано парсер компьютерных языков, то их список я и сам могу представить. VD>А вот что ты вкладываешь в "зачем" я понять не могу. VD>Если тебе нужен пример применения, то опять же гугль в твоем распоряжении (например). Да и из статьи ссылки есть.
Твое понимание не имеет никакого значения. Подавляющее большинство программистов не занимаются созданием парсеров. Для них эта фича не нужна.
VD>ЗЫ VD>В общем, похоже на то, что ты ищешь причины обосновывающие почему тебе надо не изучать что-то новое. А это исходно не конструктивная позиция. Типа "заинтересуйте меня, тогда может я проявлю милость и погляжу одним глазом". Те кому интересно осваивают язык без проблем. Материалов более чем достаточно. Ну, а те кому не надо (по причинам которые они не озвучивают) ищут псевдо-причины чтобы это не делать.
Я фигею. То что писал выше говорю уже два года. Адекватного материала для обучения как не было, так и нет. Твоя позиция типа "всего хватает, вы сам уроды" не то что неконструктивная, а в корне деструктивная.
Откройте наконец блог, твиттер. В идеале сделайте сам блог на мегафреймворке. Разместите большей статей с примерами решения более приземленных задач, чем создание парсеров. Например есть computational workflows, слабайте хотя бы такой пример.
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, VoidEx, Вы писали:
VE>>Разве что в системах с зависимыми типами. Назовешь пяток таких популярных промышленных языков? WH>Любая система типов дает математические гарантии. WH>Вопрос лишь в том, что именно она гарантирует. WH>Обычные типы дают довольно мало гарантий. Зависимые существенно больше.
Именно об этом и речь. И я отвечал на вполне конкретный комментарий о покрытии тестами.
Гарантия "на int и string функция вернет Boo" не сильно круче, чем "на 2 аргумента верну 1", а даже примитивные проверки NotNull в большинстве статически-типизируемых прикручиваются теми же тестами и ассертами.
В этом контексте
D>Демагогия detected. Система типов именно что даёт математически доказанные гарантии.
звучит как-то нелепо.
Re[28]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Можно, но как замена скриптам не очень удобно, типы приходится объявлять, шума больше. Вот динамический жестко функциональный язык, притом не сильно специализированный как эрланг не помешал бы. Вот за pure я слежу, и пока как-то не получилось посмотреть то что Воронков ваяет.
А я как раз и ваяю динамический и жестко функциональный. И фидбек бы мне не помешал
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, robin_of_the_wood, Вы писали:
___>И еще отсортирован список по алфавиту а не по мощности языка. Это ж просто безобразие. ___>Чтобы ласкающее взор имя прочесть некоторым приходится аж до секции N скролить. ___>Скролишь и думаешь — а вдруг убрали. Инфаркт можно получить однако.
Типа пошутил? Петросян, блин.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, cvetkov, Вы писали:
C>Здравствуйте, VladD2, Вы писали:
C>>>а не все ли равно на чем писать? VD>>Нет конечно. Иначе все бы писали на ассемблерах или хотя бы на Фортране 77. C>я не это имел ввиду.
Именно это ты и имел в виду. Только ты почему-то видишь разницу между фортраном и С++ (например), но не видишь разницу между скажем С++ и скажем Скалой.
C>>>а если так, то зачем учить очередной язык пока он не понадобился? VD>>А как ты поймешь что что-то тебе нужно, если ты даже не знаешь что там внутри и что это тебе может дать? C>А для того чтобы понять что там внутри не надо язык изучать, обычно достаточно прочитать какой нибуть обзор или полистать домашнюю страничку.
Не недостаточно. Чтобы понять новое его нужно пробовать. Ну, то есть в принципе можно понимать возможности языка просто прочитав про него, но при этом все концепции этого языка должны быть известны. Например, зная Немерле или ОКамл можно прочитать книгу об F# и понять что из себя представляет этот язык. Но зная С++ или C# недостаточно прочитать что-то про F#, Немерле или ОКамл. Это просто бесполезно.
C>>>понадобится, потрачу неделю чтобы выучить синтаксис и примерно прикинуть как семантика ложится на известные мне концепции и всех делов. VD>>Попробуй заменить в своей логике язык на телевизор. Скажем ты пользуешься радио. VD>>Тебе говорят, что есть же телевизор. И что он как радио, то только лучше. А ты в ответ — "понадобится, потрачу неделю чтобы понять что это такое". C>нет, такой ответ последует если мне предложат радио новой модели которое принимает сигнал улавливая нейтрино. C>а на телевизор я согласен.
Вот модель радио тут не причем. Ну, разве что если сравнивать гетеродинный приемник метрового диапазона и современные стереофонический FM-риемник. Но и это не корректное сравнение, так как кроме повышения качества тут ничего не будет. А в случае языков разница приципиальная. С языком ты получаешь новые концепции. После изучения которых ты сможешь мыслить другими категориями. Это именно как сменить звук на картинку со звуком.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
M>>Читаю некоторый обзор, придумываю задачу, которая должна соответствовать языку и потом начинаю на нем писать решение. В ощущения входит: (1) легкость быстрого старта (2) тормоза (3) хорошая диагностика ошибок (4) быстрый поиск по документации ответов на вопросы (5) бенефиты перед уже известными языками. VD>Пожалуй двигательный подход. Интересно почему такой ответ только одни?
Здравствуйте, Baudolino, Вы писали:
VD>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. B>Отсутствие практической необходимости. Имеющегося знания asm,C,Java,JavaScript,HTML,SQL достаточно для решения любых задач, которые у меня появляются или могут возникнуть. Ради интереса смотрел на Scala, haskell, C#, но в этом всем нет никакого смысла. Может быть, изучил бы Ceylon, когда под него будет IDE.
Необходимость появится точас же как ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
А до тех пор все эти языки для тебя будут непонятными хреновинвами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Здравствуйте, samius, Вы писали:
U>>>Пример со string.Join показывал, что очень часто проблема мусорности кода может быть решена средствами имеющегося языка. Но в силу привычки думать заученными конструкциями программисты просто не замечают, что данный код является мусорным, и соответственно не ищут способа избавиться от этого мусорного кода.
S>>См. так же пример с Where
.
U>И где там мусорный код и лишние сущности?
Сущности? Про сущности не было речи.
foreach, if, Add — мусор. Кроме того что много буков, еще и пространство для потенциальных ошибок, увеличение сложности кода по сравнению с Where.
обозначил места ошибок, которые невозможно допустить с вариантом Where:
var result = new List();
foreach (var x in coll)
if (test(y))
list.Add(t);
Re[21]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Здравствуйте, VoidEx, Вы писали:
D>Был здесь несколько лет назад некий Роман Дубров, доказывал мне с пеной у рта, что на PHP можно написать всё что угодно, и что memcached является частью платформы PHP, и что сериализация данных при его использовании не выполняется. Много ли этого самого "чего угодно" он написал, мне неведомо. Ну а я тоже дурак — зачем мне его разубеждать? Больше ламеров — ценнее моя квалификация. Адью.
Ты так радуешься любому проявлению глупости (по твоему мнению), что создаётся впечатление, что это единственный для тебя способ повысить свою квалификацию. Или, по крайней мере, наиболее предпочтительный. Ну, кесарю кесарево.
Re[10]: Что вас останавливает от изучения нового языка?
A>был бы хороший алгоритм, а реализовать его можно хоть на хинди. Язык не важен.
Угу, мне вот тоже сферические алгоритмы нравится писать, две недели работы в результате 200 строк кода на Си.
Жаль такая работа очень редко встречается, в остальных случаях чем язык выразительней тем лучше быстрее и
качественней работа.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, gandjustas, Вы писали:
G>>То есть единого источника к которому можно обратиться за справкой таки нет.
VD>http://nemerle.org на английском. rsdn на русском.
Еще раз. Я не могу найти быстро (как на msdn или тупо гуглом), ответ на интересующий меня вопрос ни там, ни тут.
не надо обвинять меня что я искать не умею, это будет "неконструктивная позиция".
Даже когда F# был в pre-release я мог посмотреть спецификацию и найти нужные мне вещи.
G>>Ну конечно, отличие только в том что мусора в форуме на несколько порядков больше и найти информацию там труднее. VD>Особо ценная информация вынесена в Q&A. Ну, а если язык интересен, то вряд ли форум будет для тебя мусором.
Ты что доказать пытаешься? ты не видишь фактов что на этот форум кроме гиков никто не ходит?
Сравни по полезности контента справку msdn и форумы msdn, сможешь понять в чем отличие.
VD>Просто не надо изучать язык для галочки.
А для чего его надо изучать? Чтобы приобщиться к высшему сообществу? Может решать какие-нить задачи? Ну вот я не вижу какие задачи nemerle решает, DSL я пока не пишу, мне тех что есть хватает.
VD>Или берешся за изучение и тогда информации более чем достаточно (проверенно на множестве людей), или он тебе не нужен, и тогда хоть альманах напиши, но ты ничего не найдешь и ничего не изучишь.
А как я узнаю нужен он или нет, если информации нету?
Ты сам себе противоречишь. Ты считаешь что мне (а значит и тыщам других программистов) язык не нужен, при этом говоришь что nemerle крут и нужен он чуть ли не каждому.
VD>Ты C# знаешь?
Знаю.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Название языка какое-то фиговое. Плюс агитки от евангелистов пугают — а вдруг я стану таким же и жизнь моя пойдет под откос.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Vasilich3333, Вы писали:
VD>>>Необходимость появится точас же как ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
V>>Спорный аргумент о необходимости! Я уверен многие обладают знаниями,которые так и не были востребованы
VD>Бесспорно одно, из невостребованности одних знаний не вытекает ненужности других. Не делай таких логических ошибок в будущем.
VD>В общем, кури Парадокс Блаба, если не понял о чем я говорю.
не надо скрываться за общими понятиями, типа ученье свет — неученье тьма. наверное это высказывание постарее Парадокса Блаба
из твоей "необходимости" получается : все что ты изучал, всегда находило применение и НЕМЕДЛЕННО.
я бы переделал твое предложение так
Необходимость МОЖЕТ ПОЯВИТСЯ, если ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Слушай, может я тут с другой планеты. Приведенный код — это и есть сложность, на твой взгляд?
Пока он отделен от остального кода — нет. Но как если смешать его с другим не сложным кодом, то на выходе получится неприемлемая сложность.
Более обобщенно: Обычно все просто когда смотришь на аспекты проблемы по очереди. Но все сложно кода они смешиваются.
V> Просто мне подобное приходилось делать в разных проектах более 5-ти раз (точно уже и не вспомню), и как-то малость обыденно. И выделения регулярного подмножества пару раз для парсеров EDI-форматов в т.ч. Там парсеры строятся динамически по описанию, а док-ты бывают по многу мег, и без этой фичи работало в 2-3 раза хуже. Грамматика в общем виде с неустранимой левой рекурсией (LL(к), где К зависит от конкретного описания структуры и может быть неограниченно), но имеет довольно протяженные "куски", хорошо разбираемые ДКА. Вот и приходилось комбинировать техники разбора.
Ну, вот изучи и попользуйся PegGrammar... и с большой вероятностью оценишь эту вещь по достоинству. Это я так мягко выражаюсь, чтобы не оскорбить тебя фразами вроде "поймешь что потратил много времени в своей жизни зря" .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
WH>>То-то ты предлагаешь оптимизатор с парсером совместить V>Я же говорю — теряешь форму. Я предлагал минимизировать по мере парсинга. А ты сделал... Действительно смешной вывод.
Так это и есть парсинг с оптимизатором совместить.
Это лапша!
V>Что искал классический инлайн.
Что значит классический?
V>Чтобы сгенерировать ДКА по этой системе, производят подстановку правил number и digit. Термин "инлайн" к этому процессу первый раз слышу. Хотя, не принципиально.
Так там много чего инлайнилось. Просто сейчас остался один ДКА ибо другое инлайнить нет смысла тк на производительность не влияет.
V>Значит, код, который "раньше" и нужно было приводить, как пример инлайна.
А это тебе чем не инлайн?
V>ИМХО, никакого классического инлайна вычислений, сопровождающимся ребиндингом аргументов, тут нет. Вот пример инлайна:
Ну то есть по твоему инлайн может быжет быть только когда мы имеем дело "обычным" кодом?
А когда мы берем другую модель кода, то инлайн уже не инлайн.
Смешно.
V>Да пофиг, коль мы уперлись в обсуждение — возможно это или нет. Ответа "мне так удобней" было бы достаточней, чем пытаться доказать, что это невозможно. Бо ты сильно ошибаешься.
И как ты собрался инлайнить в процессе парсинга правило которое еще не разобрано?
АСТ нет. Его еще из текста не достали.
Что ты инлайнить то собрался?
Давай расскажи.
V>Ну, это наверно из-за особенностей дотнета, где пробежка по массиву стоит почти столько же, сколько пробежка по графу разрозненных объектов в памяти. Опять же, я не видел еще реализации автоматной части, т.е. представления перехода и кода его выборки.
Нет. Это по тому, что и без автоматов код получался очень быстрым.
V>Дай имя алгоритма, который подразумеваешь.
Hopcroft, John (1971), "An n log n algorithm for minimizing states in a finite automaton", Theory of machines and computations (Proc. Internat. Sympos., Technion, Haifa, 1971), New York: Academic Press, pp. 189–196, MR0403320 .
V>Да что ты? И как же компилятор С++ позволяет даже в оптимизированном варианте сохранять,
Ой лол.
В релизе отладка не работает чуть менее чем полностью.
Там куча информации теряется.
V>Ты понимаешь, что вообще все твои аргументы пока что из разряда "вы все дураки, один я умный".
Ты обращаешься к себе на вы?
V>Ни одного по делу. Что конкретно мешает сохранять соответствие м/у исходными правилами и генерируемым, даже самым оптимальным кодом. Вот давай, с подробностями и примерами.
Пропадание кусков АСТ.
FSM в исходном коде нет.
Его из других кусков АСТ делают.
V>Походил я там по исходникам... У вас же нет в PEG-парсере той типизации, которая требует перебора, т.е. логического программирования. И бета-редукции нет. Что и где там не получится "типизировать"? Называй файл/метод/ф-ию, которые перестанут работать.
Запусти оптимизатор перед типизатором и увидишь феервек.
V>Сохраняй информацию, в чем проблема. Вы уже 5-й год над компилятором работаете, нельзя было доработать моменты, которые в текущем виде не устраивают?
Мы то сохраняем все, что можно сохранить.
А ты тут предлагаешь оптимизатор запустить и все порушить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
H>Что значит даже? Автомат как автомат. На goto.
Да их куча техник исполнения. Кстати, если исполнение на switch/case/goto, то неминимизированный по кол-ву состояний ДКА работает примерно вдвое быстрее (в общем случае), чем минимизированный. Только надо провести минимизацию по входному алфавиту, чтобы получить наилучший профит от разреженной таблицы переходов. Если табличная техника — то чуть быстрее работает минимизированный (по кол-ву состояний).
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
A>>Думаешь это так просто? Вот пример. Есть объект типа T: T obj. Я для него зову boost::begin(obj). Как ты думаешь, что нужно этому типу иметь, чтобы данный вызов работал? А ответ заключается в том, что в C++ понятие интерфейса типа гораздо шире, чем набор методов этого типа. WH>Читай про классы типов в хаскеле.
Это понятно, и чем-то похоже на Checked exception в Java — заставит блюсти всю иерархию, коль бы сложная она не была. В этом примере лишь показано, что налепив сюда контракт, мы обрежем себе возможность делать специализации шаблонной boost::begin() для своих уникальных типов, не отвечающих контрактам. В итоге, явная и частичная специализация шаблонов потеряет в гибкости (не сможет нарушать контракт, т.е. потеряется сама суть — сделать специализацию чего-либо под уникальный тип, а не подтип/"подконтракт" исходного), и вместо этой техники придется городить статические обертки (адаптеры/фасады), обеспечивающие контракт.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Vasilich3333, Вы писали:
V>я бы переделал твое предложение так V>Необходимость МОЖЕТ ПОЯВИТСЯ, если ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
Лучше так — если ты поймешь концепции, заложеные в языках, у тебя могут появиться новые возможности. Но могут и не появиться. А если появятся,ты можешь ими воспользоваться. Или не сможешь.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Ты напиши. Не как-нибудь так, а конкретный код, матчащий Not(Not(rule)).
А в твоём коде не очевидно, что именно надо поменять, чтобы не было завязано на Not?
Если нет, то прокопипасть его для 4 первых веток, сравни и выдели общее.
Потом прокопипасть для всех 6 и выдели наиболее общее.
Z>Как бы я видел реализации ПМ на функциях, все они сильно хуже поддержки компилятора.
10-20-кратно?
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
___>>И еще отсортирован список по алфавиту а не по мощности языка. Это ж просто безобразие. ___>>Чтобы ласкающее взор имя прочесть некоторым приходится аж до секции N скролить. ___>>Скролишь и думаешь — а вдруг убрали. Инфаркт можно получить однако.
VD>Типа пошутил? Петросян, блин.
Пошутил — да.
Петросян — нет. У меня эта фамилия с очень определенным типом шуток ассоциируется. Моя — другого типа.
Не делайте из языка культа.
Большинство проблем в программировании сменой языка не решаются. Как бы этого ни хотелось
И очень часто просто решаются сменой программиста. Язык тот же а результат — противоположный.
Это не значит, что новые языки не нужны.
Просто не надо от них слишком многого ожидать. И смотреть на нежелающего их учить, как на предателя всех передовых начинаний.
И я не вижу проблемы в "пошутил" на эту тему. Проблемы не в этом
Проектирование велосипедов для слепых жирафов
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
Z>>Ты напиши. Не как-нибудь так, а конкретный код, матчащий Not(Not(rule)).
VE>А в твоём коде не очевидно, что именно надо поменять, чтобы не было завязано на Not? VE>Если нет, то прокопипасть его для 4 первых веток, сравни и выдели общее. VE>Потом прокопипасть для всех 6 и выдели наиболее общее.
Z>>Как бы я видел реализации ПМ на функциях, все они сильно хуже поддержки компилятора.
VE>10-20-кратно?
Не надо менять тему. Ты утверждал, что можно сделать так, что "код станет не сильно хуже изначальной лапши". Будь добр, подтверди свои слова делом.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>А можно по аналогии привести примеры чего чудесного сделали авторы java/c#/питона/руби/хаскеля на своих языках?
И главное чудесные решения на языке Go которым Gaperton восхищался
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U> U>> Авторы C#, к примеру, dotnet framework написали. Для начала двухтысячных это было прорывом.
U> H>Yet another Java В чем прорыв?
U> На шарп же народ не с Java переманивали, а с плюсов. А на плюсах простого в освоении и написанного в едином стиле фрамеворка на все случаи жизни не было.
Ну как же, когда дотнет называли жабой от майкрософт (и чем он по сути и является)
Здравствуйте, Ziaw, Вы писали:
Z>Это ты сейчас видишь. Во втором фреймворке никто не жаловался. Блаб, не будь он к ночи упомянут.
Я тебе как раз объясняю, что пока новые фичи языка активно не используются стандартными библиотеками, подавляющее большинство разработчиков возможностей предоставляемых этими фичами не понимает и не замечает. С чем споришь-то?
Я активнейшим образом использую анонимные делегаты с конца 2006. Сам правда вряд ли бы об их мощи догадался, хорошо что Darkgray научил.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Вот как раз потому он и нужен. Если бы башка была резиновая, то весь софт можно было бы придумать в башке и закодировать на любом языке. А тот факт, что башка, блин, не резиновая, как раз и заставляет придумывать языки и технологии которые позволяют решать задачи не решаемые в виду невозможности их охвата интеллектом человека.
Я программировал на асме,форте,С, С++,С# и высокоуровневом русском матерном (ну в смысле ТЗ для программистов пишу).
В последнее время — почти исключительно последние три.
и больше мне, слава Аллаху, НИЧЕГО не надо. я просто не вижу ЗАЧЕМ мне еще один язык. Я допускаю, что если я влезу в какую-то очень особенную область, ну там искусственный интеллект какой-нить, мне может понадобиться что-то новое. Но пока меня и здесь хорошо кормят
In P=NP we trust.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Deprivator, Вы писали:
D>Здравствуйте, VladD2, Вы писали:
VD>>Вот как раз потому он и нужен. Если бы башка была резиновая, то весь софт можно было бы придумать в башке и закодировать на любом языке. А тот факт, что башка, блин, не резиновая, как раз и заставляет придумывать языки и технологии которые позволяют решать задачи не решаемые в виду невозможности их охвата интеллектом человека.
D>Я программировал на асме,форте,С, С++,С# и высокоуровневом русском матерном (ну в смысле ТЗ для программистов пишу). D>В последнее время — почти исключительно последние три. D>и больше мне, слава Аллаху, НИЧЕГО не надо. я просто не вижу ЗАЧЕМ мне еще один язык. Я допускаю, что если я влезу в какую-то очень особенную область, ну там искусственный интеллект какой-нить, мне может понадобиться что-то новое. Но пока меня и здесь хорошо кормят
Тоска зеленая, скудно-то как. Едва ли с таким задатками тебя начнут напрягать на новые задачи. Следующим этапом развития будет разгадывание кроссвордов и просмотр телепередач.
Я всю жизнь учился и получал от этого удовольствие, это такая потребность- что-то изучать.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, peterbes, Вы писали:
D>>Я программировал на асме,форте,С, С++,С# и высокоуровневом русском матерном (ну в смысле ТЗ для программистов пишу). D>>В последнее время — почти исключительно последние три. D>>и больше мне, слава Аллаху, НИЧЕГО не надо. я просто не вижу ЗАЧЕМ мне еще один язык. Я допускаю, что если я влезу в какую-то очень особенную область, ну там искусственный интеллект какой-нить, мне может понадобиться что-то новое. Но пока меня и здесь хорошо кормят
P>Тоска зеленая, скудно-то как. Едва ли с таким задатками тебя начнут напрягать на новые задачи. Следующим этапом развития будет разгадывание кроссвордов и просмотр телепередач.
сорри, не вам судить об этапах моего развития.
уж поверьте, обьем продаж написанного мною софта в очень немаленьких цифрах выражается (и что характерно, 99% денег принес С++)
P>Я всю жизнь учился и получал от этого удовольствие, это такая потребность- что-то изучать.
а потребности что-то ДЕЛАТЬ не возникает?
учеба ради учебы — трэш. и когда какая-нить баба (реальный случай на днях) говорит что у нее два высших образования и она сейчас в свои 36 получает третье — это называется не третье высшее, а очередное бесполезное. То же самое с языками — если их все время учить, а программировать когда? и какая, собственно, нужда осваивать новые?? осваивать новые алгоритмы и трюки в своей предметной области куда как полезней (и необходимей).
In P=NP we trust.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Deprivator, Вы писали:
P>>Тоска зеленая, скудно-то как. Едва ли с таким задатками тебя начнут напрягать на новые задачи. Следующим этапом развития будет разгадывание кроссвордов и просмотр телепередач.
D>сорри, не вам судить об этапах моего развития. D>уж поверьте, обьем продаж написанного мною софта в очень немаленьких цифрах выражается (и что характерно, 99% денег принес С++)
Я не видел твоих продуктов и речь, вообще, не об этом шла.
P>>Я всю жизнь учился и получал от этого удовольствие, это такая потребность- что-то изучать.
D>а потребности что-то ДЕЛАТЬ не возникает? D>учеба ради учебы — трэш. и когда какая-нить баба (реальный случай на днях) говорит что у нее два высших образования и она сейчас в свои 36 получает третье — это называется не третье высшее, а очередное бесполезное. То же самое с языками — если их все время учить, а программировать когда? и какая, собственно, нужда осваивать новые?? осваивать новые алгоритмы и трюки в своей предметной области куда как полезней (и необходимей).
Ты между дипломами, прочими цацками,регалиями и элементарным самообразованием различия делаешь? Языки развиваются под конкретные технологии, знание инструментов и средств из областей, которые на настоящий момент никак не связаны с текущей работой становится необходимым условием любого профессионального роста, не принимающие таких реалий быстро становятся маргиналами. Кроме всего прочего, от нового можно получать нехилое удовольствие.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, sunshine, Вы писали:
VD>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. S>... S>4. Утомило в очередной раз искать — как в языке N вывести число в формате 00.000. Ну и ещё тысячу мелочей.
Дык, а если язык на одной и той же платформе (дотнет/ява)?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
Это не политическая предпосылка, а практическая. По теме, в порядке убывания важности (все знают, о каких языках речь):
1. JVM давай, да? И возможность юзать java-либы тоже.
2. А вот если я захочу на N под CLR написать чё-нить десктопное и при этом кроссплатформенное, я смогу его распространять большим каталогом, не требующим исталляции, со встроенным mono runtime (аналогично jre)? Если нет, см. п.1.
3. Изучать ASP.NET категорически лениво, мне бы вот к сервлетам его подцепить... в общем, см. п.1.
4. Работы много, щас не до изучения.
5. А чего его изучать, если N2 ещё не зарелизили? Если в изучении хотя бы четверть времени будет уходить на хождение по граблям, я пожалуй лучше подожду.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Это не политическая предпосылка, а практическая. По теме, в порядке убывания важности (все знают, о каких языках речь): D>1. JVM давай, да? И возможность юзать java-либы тоже.
Принимается. Только тебе нужен ява, а другим еще что-то. Кому-то дотнет самое оно. А кто-то хочет нэйтив.
D>2. А вот если я захочу на N под CLR написать чё-нить десктопное и при этом кроссплатформенное, я смогу его распространять большим каталогом, не требующим исталляции, со встроенным mono runtime (аналогично jre)? Если нет, см. п.1.
Ну, на счет встроенного mono runtime не скажу, но распространять в виде каталога можно спокойно. Моно сейчас есть почти в любом линуксе, а дотнет на любой винде. Так что это не актуально, на мой взгляд.
D>3. Изучать ASP.NET категорически лениво, мне бы вот к сервлетам его подцепить... в общем, см. п.1.
Т.е. интересует разработка для Веб, но не хочется использовать незнакомые библиотеки?
Ну, а что скажешь, если в поставке будет идти либа для веба которая радикально упрощает разработку для веба и при этом она не зависит ни от каких библиотек вроде АСП.НЭТ?
D>4. Работы много, щас не до изучения.
Т.е. что думать? Трясти надо! (с) анекдот. Да?
И насколько этот фактор важен?
Точнее даже интересно что подвигло бы преодолеть этот фактор?
D>5. А чего его изучать, если N2 ещё не зарелизили?
Да я вообще-то не об N спрашивал. В прочем, в N1 тоже есть чего изучить.
D>Если в изучении хотя бы четверть времени будет уходить на хождение по граблям, я пожалуй лучше подожду.
Откуда информация о граблях? Прошлый опыт?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ikemefula, Вы писали:
I>Время и интерес. Мне вот что бы попробовать Немерле, надо отложить более интересные для меня вещи.
А если не секрет, что за более интересные вещи ждут твоего внимания?
I>На кой ляд это надо, если у немерла все success истории находятся рядом с компиляторм этого немерла ?
Я слово на Н даже не произносил. Предположим что это J$.
Что до "success истории", то эта тема очень интересна. Ты сейчас на чем программируешь? Что за "success истории" ты слышал об этом средстве?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы:
лень/отсутствие времени/куча вещей, более приоритетных.
платформа тоже играет не последнюю роль. если будет выбор между N и шарпом выбиру шарп, потому что на мелкософтовской территории вам его не одолеть (F# и другим тоже мало что светит)
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
если язык не имеет никаких преимуществ перед другими.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>А про языки вообще, самый главный аргумент — время. Всё изучить — жизни не хватит. Вот я долго прицеливался, и взялся за скалу. Потому что жопа моя чует, что это будущее, и надо долбить задел, пока мозги работают. А тратить время на всякие питоны и прочее — нет у меня его столько, времени этого. Старею уже.
Вот, вот. Это как раз и интересно. Не мог бы ты описать свои мысли и действия по подробнее? Что останавливает? Что произошло при начале изучения? На каком сейчас этапе? Не хочется ли бросить изучение? ...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
А что у кого-то сдесь проблемы с изучением языка?
а не все ли равно на чем писать? а если так, то зачем учить очередной язык пока он не понадобился?
понадобится, потрачу неделю чтобы выучить синтаксис и примерно прикинуть как семантика ложится на известные мне концепции и всех делов.
а потом гуглить документацию к библиотекам и вперед.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>лень/отсутствие времени/куча вещей, более приоритетных.
А можно по подробнее об этих фактора?
Что могло бы заставить переломить лень?
Что за более приоритетные вещи?
NB>платформа тоже играет не последнюю роль. если будет выбор между N и шарпом выбиру шарп, потому что на мелкософтовской территории вам его не одолеть (F# и другим тоже мало что светит)
Хм. Странная логика. Что тот, что тот генерит MSIL. Разница только в возможностях. Как можно вообще что-то говорить пока не попробовал разобраться?
VD>>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
NB>если язык не имеет никаких преимуществ перед другими.
А как ты делаешь для себя вывод о наличии или отсутствии преимуществ?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, cvetkov, Вы писали:
C>А что у кого-то сдесь проблемы с изучением языка?
Не знаю. Мне этот вопрос не очень интересен.
C>а не все ли равно на чем писать?
Нет конечно. Иначе все бы писали на ассемблерах или хотя бы на Фортране 77.
C>а если так, то зачем учить очередной язык пока он не понадобился?
А как ты поймешь что что-то тебе нужно, если ты даже не знаешь что там внутри и что это тебе может дать?
C>понадобится, потрачу неделю чтобы выучить синтаксис и примерно прикинуть как семантика ложится на известные мне концепции и всех делов.
Попробуй заменить в своей логике язык на телевизор. Скажем ты пользуешься радио. Тебе говорят, что есть же телевизор. И что он как радио, то только лучше. А ты в ответ — "понадобится, потрачу неделю чтобы понять что это такое".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
появится задача, за которую заплатят деньги, буду учить язык. Не появится, значит не надо. Даже если потратишь время и выучишь, работодателя потом не убедишь что язык знаешь, но опыта не имеешь.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, ausergiy, Вы писали:
A>появится задача, за которую заплатят деньги, буду учить язык. Не появится, значит не надо. Даже если потратишь время и выучишь, работодателя потом не убедишь что язык знаешь, но опыта не имеешь.
То есть изучать что-то новое для саморазвития не нужно?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Ничего не останавливает. Изучение языков просто из любопытства и в поисках идей — это мое хобби.
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
1. Начальство
2. Отсутствие подходящей точки приложения.
3. Риск.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
NB>>лень/отсутствие времени/куча вещей, более приоритетных.
VD>А можно по подробнее об этих фактора?
VD>Что могло бы заставить переломить лень?
наличие свободного времени и интерес. какая нибудь перспективная фича (типа эрланга)
VD>Что за более приоритетные вещи?
есть мечта сделать свой скриптовый (типа LUA), для плюсов.
NB>>платформа тоже играет не последнюю роль. если будет выбор между N и шарпом выбиру шарп, потому что на мелкософтовской территории вам его не одолеть (F# и другим тоже мало что светит)
VD>Хм. Странная логика. Что тот, что тот генерит MSIL. Разница только в возможностях. Как можно вообще что-то говорить пока не попробовал разобраться?
тут чистый прагматизм. потратить время на язык, на который есть спрос и который используется немалым количеством народа (неважно индусами или нет) или на кота в мешке.
VD>>>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
NB>>если язык не имеет никаких преимуществ перед другими.
VD>А как ты делаешь для себя вывод о наличии или отсутствии преимуществ?
трудно сказать. для меня паскаль не дает ничего нового по сравнению с си. для кого-то наоборот.
или ява -- тоже вроде ничего нового, но зато есть большая стандартная библиотека.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Принимается. Только тебе нужен ява, а другим еще что-то. Кому-то дотнет самое оно. А кто-то хочет нэйтив.
Ява — это весь ентерпрайз. Это дохрена, на самом деле.
VD>Моно сейчас есть почти в любом линуксе
В моём нет. Вполне себе линукс. Офис, браузеры, игрушки, кеды тяжеленные, dvd-писалка, медиа-плееры... Плюс масса девелоперской фигни. Кроме того, встаёт вопрос о версии этого самого .NET и mono, и о совместимостях версий. Ещё мне не хватало на десктопе поиметь такой же лютый гимор, который я имею в вебе с поддержкой всего зоопарка браузеров. Нафиг, нафиг.
VD>Ну, а что скажешь, если в поставке будет идти либа для веба которая радикально упрощает разработку для веба и при этом она не зависит ни от каких библиотек вроде АСП.НЭТ?
Если это будет полноценный многопоточный lightweight веб-сервер с поддержкой асинхронного io (для полнодуплексного comet) — тогда велики шансы, что заюзаю.
D>>4. Работы много, щас не до изучения. VD>И насколько этот фактор важен?
Это фактор усталости. Конкретно в данный период своей жизни я совершенно за#$анный, а на новой работе надо ещё себя показать.
VD>Да я вообще-то не об N спрашивал. В прочем, в N1 тоже есть чего изучить.
А откуда мне знать, что то, что я изучу в N1, не пропадёт в N2 (или N3)? Это и к следующему вопросу тоже относится.
D>>Если в изучении хотя бы четверть времени будет уходить на хождение по граблям, я пожалуй лучше подожду. VD>Откуда информация о граблях? Прошлый опыт?
Хм. Ну в общем, да. Компилятор скалы вполне стабильный, но trait NotNull они в какой-то из бет 2.8.0 таки-сломали (пришлось его всюду в lib.web комментить; вернуть взад и проверить всё недосуг). А вот IDE — это просто песня. Что Eclipse, что Idea. Ну и резидентный fast scala compiler падает постоянно; феноменально глючная вещь.
Re[4]: Что вас останавливает от изучения нового языка?
А Скала выбрана так как основная платформа — Ява?
D>Я изучаю язык только с одной целью: начать на нём писать. Полноценно: много и сложно. Варианты "поглядеть 20-страничную презентацию по языку" и "поковыряться с недельку" — это чистейшая профанация. Ну то есть, для тебя возможно и нет, если ты уже стотыщ разных языков знаешь (имеешь реальный опыт программирования) и поэтому быстро понимаешь, какие идеи языка откуда спёрты, ну и в итоге быстро и адекватно оцениваешь язык в целом. Я же не знаю "нормальных" динамически-типизированных языков, и языков с МП тоже не знаю. А изучать их только ради того, чтобы потом быстрее изучать ещё более другие языки — мне чё, больше заняться нечем?
Мне кажется ты сам ответил на свой же вопрос. Зная применяемые фичи (парадигмы) ты сможешь освоить другой язык в разы быстрее.
D>Языков, на которых действительно стоит писать, не так много,
Тем более! Тогда какой смысл слушать сказки и домыслы о языках, когда можно попробовать?
D>чтобы специально прокачивать скилл "поиск нормального языка". Тупо между делом поглядывая на форумы, я в фоновом режиме, в порядке отдыха получаю вполне достаточно информации. Гораздо больше, чем мог бы получить, поковырявшись неделю-другую в самом языке: в спорах в "Философии" и "Архитектуре" обсуждают вещи, которые на мелких задачах увидеть невозможно.
ОК. Ты остановил свой взор на Скале. Это, на мой взгляд, достойный выбор. Так что тебя подтолкнуло к этому?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, 0x7be, Вы писали:
0>Ничего не останавливает. Изучение языков просто из любопытства и в поисках идей — это мое хобби.
Если не секрет, какие языки знаешь в общих чертах и на каких можешь свободно писать (т.е. без особого напряга использовать в реальной работе)?
VD>>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете? 0>1. Начальство
С этим все ясно.
0>2. Отсутствие подходящей точки приложения. 0>3. Риск.
А вот об этих пунктах можно по подробнее?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Hobot Bobot, Вы писали:
VD>>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
HB>Исключительно этот пункт. Вообще не выходит изучать что-то "для себя" — вроде и интересно, а "не идёт". Кстати, с обычными языками та же беда: заинтересовался было испанским, почитал, посмотрел, пару песенок перевёл, да и забросил.
ОК, а чтобы могло подвигнуть преодолеть этот пункт?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>наличие свободного времени и интерес. какая нибудь перспективная фича (типа эрланга)
А почему ты считаешь, что в Эрланге есть перспективная фича, а в Scala, F# или скажем в Nemerle таких нет? Или тебя интересует именно динамически-типизированный язык?
VD>>Что за более приоритетные вещи?
NB>есть мечта сделать свой скриптовый (типа LUA), для плюсов.
Хм. Просто для развлечения? Ведь LUA уже есть и из плюсов ее использовать не трудно.
NB>тут чистый прагматизм. потратить время на язык, на который есть спрос и который используется немалым количеством народа (неважно индусами или нет) или на кота в мешке.
Дык ты какой смысл тратить время на то что любит миллион мух? Ведь преимущество это не даст. Там и так миллион мух. Твой прагматизм тебе не подсказывает, что получив в свое распоряжение (если ты конечно себя ценишь выше интеллектуального большинства) инструмент по мощьнее, ты мог бы быть более конкурентоспособным на том же рынке?
VD>>А как ты делаешь для себя вывод о наличии или отсутствии преимуществ?
NB>трудно сказать. для меня паскаль не дает ничего нового по сравнению с си. для кого-то наоборот.
Ну, в общем-то оба утверждения можно назвать верными. Разница и правда синтаксическая. Есть конечно пара плюсов и минусов у обоих. Но в общем, языки одноклассники. И ты вполне можешь судить о них зная один из них.
NB>или ява -- тоже вроде ничего нового, но зато есть большая стандартная библиотека.
С явой уже не все так просто. В ней есть типобезопасность, автоматическое управление памятью, ООП и дженерики (как минимум). Так что по сравнению с С и Паскалем ява все же имеет преимущества. Недостатки тоже есть, но опять же есть что обсуждать.
Но ты же отвергаешь новое. Получается, что ты по аналогии с С и Паскалем уравниваешь все новые языки с какой-нибудь Явой. Не боишься, что ты просто не понимаешь тех преимущество которые могли бы тебе дать эти новые языки?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, dimgel, Вы писали:
VD>А Скала выбрана так как основная платформа — Ява?
D>>Я изучаю язык только с одной целью: начать на нём писать. Полноценно: много и сложно. Варианты "поглядеть 20-страничную презентацию по языку" и "поковыряться с недельку" — это чистейшая профанация. Ну то есть, для тебя возможно и нет, если ты уже стотыщ разных языков знаешь (имеешь реальный опыт программирования) и поэтому быстро понимаешь, какие идеи языка откуда спёрты, ну и в итоге быстро и адекватно оцениваешь язык в целом. Я же не знаю "нормальных" динамически-типизированных языков, и языков с МП тоже не знаю. А изучать их только ради того, чтобы потом быстрее изучать ещё более другие языки — мне чё, больше заняться нечем?
VD>Мне кажется ты сам ответил на свой же вопрос. Зная применяемые фичи (парадигмы) ты сможешь освоить другой язык в разы быстрее.
Ещё раз: для меня "освоить язык" означает "иметь опыт написания на нём больших проектов и соответствующее количество набитых шишек". Писать большой проект на питоне только ради того, чтобы быстрее осваивать другие языки (а сам этот
питон выбросить вместе с проектом) — это ИМХО крайне неэффективная трата времени. Тем более, что применимость полученного опыта к другим "почти таким же" языкам всё равно будет ограниченная, и шишки придётся набивать заново.
Послё трёх больших проектов на скале, я могу сказать, что её знаю. Много чего не знаю, акторов не знаю, не знаю чем отличается iterable от traversable (хотя мне пытались объяснить), но зато я реально на ней пишу, и у меня выработались паттерны решений, заточенные конкретно под этот язык и эффективные в нём. Я честно могу сказать "скала, конечно, говно, но мне нравиццо =)" — и это, собсна, критерий. Однако у меня на это ушло два-три года. Не дофига ли будет по два-три года на каждую хрень тратить?
D>>Языков, на которых действительно стоит писать, не так много, VD>Тем более! Тогда какой смысл слушать сказки и домыслы о языках, когда можно попробовать?
То есть, ты предлагаешь мне убить пару-тройку лет на какие-нибудь динамически типизированные языки, чтобы убедиться, что все те помои, которые вы с WolfHound-ом на них выливаете, заслуженные? Гы, сорри, но это как раз тот случай, когда я предпочту поучиться на чужом опыте. Вполне, так сказать, доверяю.
VD>ОК. Ты остановил свой взор на Скале. Это, на мой взгляд, достойный выбор. Так что тебя подтолкнуло к этому?
Интуиция.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
0>>Ничего не останавливает. Изучение языков просто из любопытства и в поисках идей — это мое хобби. VD>Если не секрет, какие языки знаешь в общих чертах и на каких можешь свободно писать (т.е. без особого напряга использовать в реальной работе)?
C++, Delphi, C# — это те, на которых много писал, так что тут рука набита.
Nemerle, Prolog, Lisp, Java — "со словарем", то есть сами языки знаю, но стандартные библиотеки не очень.
0>>2. Отсутствие подходящей точки приложения. 0>>3. Риск. VD>А вот об этих пунктах можно по подробнее?
п.2: Если нечто нельзя применять на работе, то для этого нужен pet project, а с этим проблемы Времени мало.
п.3: Если мне надо сделать что-то и сделать это качественно и в срок, то я выберу знакомый инструмент, даже если он объективно менее способен, чем тот, который я знаю наполовину. То есть риск в данном случае — это субъективный фактор, а не объективный.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>То есть, ты предлагаешь мне убить пару-тройку лет на какие-нибудь динамически типизированные языки, чтобы убедиться, что все те помои, которые вы с WolfHound-ом на них выливаете, заслуженные? Гы, сорри, но это как раз тот случай, когда я предпочту поучиться на чужом опыте. Вполне, так сказать, доверяю.
Тем более, что помои аргументированные. А сам играясь с языком, я к этим же аргументам никогда, может быть, и не приду. Так и буду "писать на дельфе".
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Ява — это весь ентерпрайз. Это дохрена, на самом деле.
Ну, дотнет это тоже не малая часть энтерпрайза. Причем на десктопе как раз дотнет то по активнее используется.
VD>>Моно сейчас есть почти в любом линуксе
D>В моём нет. Вполне себе линукс. Офис, браузеры, игрушки, кеды тяжеленные, dvd-писалка, медиа-плееры... Плюс масса девелоперской фигни. Кроме того, встаёт вопрос о версии этого самого .NET и mono, и о совместимостях версий. Ещё мне не хватало на десктопе поиметь такой же лютый гимор, который я имею в вебе с поддержкой всего зоопарка браузеров. Нафиг, нафиг.
Странный ты. Как раз Моно или дотнет тебя защищает от этого зоопарка. Да, конечно что дотнета, что моно есть много разных версий. Но они все как один совместимы со старыми своими версиями. Это же стандрат! Потом ты волен поставить ту версию Моно, что тебе нужна. Да и с Явой будет та же котовасия. Она же и версии разные имеет, и реализации.
ОК. А что бы ты сказал, если бы один язык позволял бы создавать исполнимые модули и для Явы, и для Дотнета?
VD>>Ну, а что скажешь, если в поставке будет идти либа для веба которая радикально упрощает разработку для веба и при этом она не зависит ни от каких библиотек вроде АСП.НЭТ?
D>Если это будет полноценный многопоточный lightweight веб-сервер с поддержкой асинхронного io (для полнодуплексного comet) — тогда велики шансы, что заюзаю.
Полноценного конечно.
А comet то зачем? Спам толкать?
D>>>4. Работы много, щас не до изучения. VD>>И насколько этот фактор важен?
D>Это фактор усталости. Конкретно в данный период своей жизни я совершенно за#$анный, а на новой работе надо ещё себя показать.
Ясно. Сочувствую.
VD>>Да я вообще-то не об N спрашивал. В прочем, в N1 тоже есть чего изучить.
D>А откуда мне знать, что то, что я изучу в N1, не пропадёт в N2 (или N3)? Это и к следующему вопросу тоже относится.
Зачем отвечать вопросом на вопрос? Вопрос вместимости — это отдельный вопрос. Если ты не изучишь первую версию, то вопрос совместимости тебя не будет трогать.
D>>>Если в изучении хотя бы четверть времени будет уходить на хождение по граблям, я пожалуй лучше подожду. VD>>Откуда информация о граблях? Прошлый опыт?
D>Хм. Ну в общем, да. Компилятор скалы вполне стабильный, но trait NotNull они в какой-то из бет 2.8.0 таки-сломали (пришлось его всюду в lib.web комментить; вернуть взад и проверить всё недосуг).
Дык зачем бэты то юзать? Бэты и у Майрософта застенько глючат.
D> А вот IDE — это просто песня. Что Eclipse, что Idea. Ну и резидентный fast scala compiler падает постоянно; феноменально глючная вещь.
Хм. А я слышал что Скаловские плагины вроде уже зрелые.
Было бы очень интересно если бы ты попробовал Немерл в деле и высказал мнение о стабильности его IDE. Ну, и о самом языке. Они со Скалой своего рода братья. Только Скала скрещивает Яву с МЛ-ем, а Немерл Шарп. Ну, это конечно, если не считать макросов. В прочем в Скале есть плагины к компилятору. Которые с натяжкой можно сравнить с макрами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Странный ты. Как раз Моно или дотнет тебя защищает от этого зоопарка. Да, конечно что дотнета, что моно есть много разных версий. Но они все как один совместимы со старыми своими версиями. Это же стандрат! Потом ты волен поставить ту версию Моно, что тебе нужна. Да и с Явой будет та же котовасия. Она же и версии разные имеет, и реализации.
Яву нужной мне версии я тупо задеплою вместе со своим приложением, о чём и был исходный вопрос.
VD>А comet то зачем? Спам толкать?
Онлайн-казино и вебчаты делать. Спам — это совсем из другой оперы.
VD>Дык зачем бэты то юзать? Бэты и у Майрософта застенько глючат.
Там была масса переделок, тянущих на новый мажор. В частности, коллекции поменялись без совместимости. Одерски спрашивал в рассылке "а не запулить ли нам 3.0 вместо 2.8?" Но в итоге не запулили. А я как раз новый проект начинал, хотелось минимизировать потом миграцию остального кода.
VD>Было бы очень интересно если бы ты попробовал Немерл в деле и высказал мнение о стабильности его IDE. Ну, и о самом языке. Они со Скалой своего рода братья. Только Скала скрещивает Яву с МЛ-ем, а Немерл Шарп. Ну, это конечно, если не считать макросов. В прочем в Скале есть плагины к компилятору. Которые с натяжкой можно сравнить с макрами.
Мне бы тоже было интересно, но в ближайшем обозримом будущем (полгода-год) у меня всё беспросветно. Поэтому пока что я просто поглядываю и собираюсь с силами.
Re: Что вас останавливает от изучения нового языка?
Отсутствие IDE и отсутствие документации. Выучить новый синтаксис не сложно, а вот застревать при решении элементарных задач не хочется.
Простой пример, буквально вчерашнее происшествие. Писал мелкую утилитку, решил использовать WPF. До того не использовал. Сразу выяснилось что:
1) Нет встроенного NotifyIcon. Ладно я скачал какой-то сторонний элемент управления, но не приятно.
2) Байндинг между bool и Visibility выполняется только с написание своего класса-конвертора. Я его написал, он не заработал, так и не понял почему.
3) XAML редактор не балует автодополнением. Дизайнер для контекстного меню я так и не заставил появится.
При этом кое-какие вещи я, абсолютно неопытный в WPF, сделал в краткие сроки значительно лучше, чем мог бы на WinForms. Но в итоге забил, потому что необходимо было все задачи решить приемлемо, а получалось что какие-то я решаю хорошо, а какие-то совсем не могу. Как делать локализацию я уже вообще не стал разбираться. Два раза застрял на том, что в WinForms было элементарным. С WPF я ещё потом разберусь, куда денусь, но осталось впечатление сыроватости продукта (а ведь это далеко не первый релиз). При этом WinForms меня не устраивает и я сознательно искал альтернативу, был мотивирован. А ведь это всего лишь другая библиотека, не другой язык. Ну ладно, XAML новый язык, но XML/HTML я знаю, так что семантика новая, синтаксис — нет.
А в прошлом году надо было кое-что сделать на Питоне. До того вообще не писал на Питоне. Быстро нагуглил и синтаксис (буквально писал читая документацию), и куски кода решающего мою задачу. Что-то доработал, переделал, пользуюсь результатом до сих пор. Правда всё свалил в один файл, так и не разобрался тогда как сделать библиотеку, но и так сойдёт. Задача решена.
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Для изучения языка нужен проект, тестовые программки полезны в изучении, но по настоящему чувствовать язык начинаешь на крупном проекте, написав более 20 тысяч строк (по крайней мере так у меня). Теперь, допустим, что подходящий проект появился и есть предположение, что новый язык значительно облегчит разработку, а иначе зачем менять шило на мыло?
Возникают следущие вопросы:
1. Будет ли работать компилятор на другой версии операционной системы, как с поддержкой 64 бит, насколько генерируемый код адекватен? Для принятия положительного решения, очевидно должны быть версии компиляторов под основные платформы и несколько крупных, уже успешно завершенных проектов.
2. Насколько богаты библиотеки? Мне категорически не хочется самому писать парсеры XML или функции работы со временем.
3. Есть ли обучающая литература, отзывчивое сообщество где я могу задать вопросы.
4. Насколько язык помогает писать в хорошем стиле, насколько защищает от ошибок.
5. Наличие инструментов: билд системы, статические анализаторы кода, IDE и т.д.
6. Язык должен "отстоятся", постоянные изменения не очень распологают к использованию языка.
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Бывает. Было интересно, освоил, но из-за несоответствия приведенным мною критериям, не использовался и забылся.
Re: Что вас останавливает от изучения нового языка?
1. Низкая практичность — не смогу применять на работе.
2. Нехватка времени на изучение основ языка и потом на раскапывание того как сделать вроде бы простую вещь.
3. В случае немейнстримовых языков — намного меньшее сообщество, т.е. будет сложнее найти решение своей проблемы или обсудить проблему.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
NB>>наличие свободного времени и интерес. какая нибудь перспективная фича (типа эрланга)
VD>А почему ты считаешь, что в Эрланге есть перспективная фича, а в Scala, F# или скажем в Nemerle таких нет? Или тебя интересует именно динамически-типизированный язык?
легковесные потоки, насколько мне известно, впервые в эрланге появились.
VD>>>Что за более приоритетные вещи?
NB>>есть мечта сделать свой скриптовый (типа LUA), для плюсов.
VD>Хм. Просто для развлечения? Ведь LUA уже есть и из плюсов ее использовать не трудно.
ниповеришь. хочу с макросами (желание еще до Н появилось). в луа грамматика жестко забита.
NB>>тут чистый прагматизм. потратить время на язык, на который есть спрос и который используется немалым количеством народа (неважно индусами или нет) или на кота в мешке.
VD>Дык ты какой смысл тратить время на то что любит миллион мух? Ведь преимущество это не даст. Там и так миллион мух. Твой прагматизм тебе не подсказывает, что получив в свое распоряжение (если ты конечно себя ценишь выше интеллектуального большинства) инструмент по мощьнее, ты мог бы быть более конкурентоспособным на том же рынке?
ну приходишь ты с этим инструментом устраиваться на работу, и тебя культурно посылают дальше.
VD>>>А как ты делаешь для себя вывод о наличии или отсутствии преимуществ?
NB>>трудно сказать. для меня паскаль не дает ничего нового по сравнению с си. для кого-то наоборот.
VD>Ну, в общем-то оба утверждения можно назвать верными. Разница и правда синтаксическая. Есть конечно пара плюсов и минусов у обоих. Но в общем, языки одноклассники. И ты вполне можешь судить о них зная один из них.
NB>>или ява -- тоже вроде ничего нового, но зато есть большая стандартная библиотека.
VD>С явой уже не все так просто. В ней есть типобезопасность, автоматическое управление памятью, ООП и дженерики (как минимум). Так что по сравнению с С и Паскалем ява все же имеет преимущества. Недостатки тоже есть, но опять же есть что обсуждать.
типобезопасность, ООП, шаблоны есть в плюсах.
а автоматическое управление памяти, что нового оно дает?
VD>Но ты же отвергаешь новое. Получается, что ты по аналогии с С и Паскалем уравниваешь все новые языки с какой-нибудь Явой. Не боишься, что ты просто не понимаешь тех преимущество которые могли бы тебе дать эти новые языки?
откуда такой вывод?
библиотеку явы я привел как пример того, из-за чего может пригодится ее изучение.
Re: Что вас останавливает от изучения нового языка?
The main reason is TIME! I have a lot of other interesting and useful things to spent my time on.
I had 4 years of learning new programming languages: CShell, C, C++, Java, C#, JavaScript/ActionScript, Lisp, Prolog, SmallTalk.
I've stopped learning new languages about 6 months ago, when i've found Common Lisp... and Emacs. After that i discovered many others langs., for example, Scala, Nemerle, Python, Erlang. But I can't start learn them, because i didn't find the weakness of the CommonLisp. I'll try to get acquainted with Scala or Python, when I've found the weakness of Common Lisp.
At the work I use C#. It is requirement of customer(project manager at the same time). But every time when I have a beautiful solution in Common Lisp, I can't find such in C#. But C# still continue to be very effective and powerful because of the IDE — Visual Studio.
So, if I start learn new language, it should have possibilities better than Common Lisp and very powerful IDE.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>The current version of metalua is 0.4 alpha.
это норма для бесплатных проектов. кто-то как-то посчитал, что на ruby'шном аналоге cpan больше всего библиотек имеют версию 0.02
NB>синтаксис тоже не понравился
вот и переопредели его для начала
Люди, я люблю вас! Будьте бдительны!!!
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, BulatZiganshin, Вы писали:
NB>>The current version of metalua is 0.4 alpha.
BZ>это норма для бесплатных проектов. кто-то как-то посчитал, что на ruby'шном аналоге cpan больше всего библиотек имеют версию 0.02
последний коммит 2009-02-10.
это тоже норма?
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, VD>а в новом языке переменные по другому описываются (типы через двоеточие)
синтаксические различия меня не смущают, хотя все-таки напрягают. вот в языках A, B и C можно записать foo += bar, а в языках D, F и J только как foo = foo + bar. при переключении между языками по десять раз на дню замечаешь, что даже на языках A, B и C начинаешь писать foo = foo + bar, потому как голова идет кругом...
между _принчипиально_ разным синтаксисом типа 10.times{|x| puts x} -- таких проблем нет, поскольку на си мне и в голову не придет такое писать.
VD> и параметры типов задаются иначе.
...тут вообще очень сложно. скажем, вот такой код.
obj = {'apple':do_apple, 'tree':do_tree, 'die':exit}; x = obj[y](args)
после этого мучительно возвращаться на си, где такой же трюк реализуется ну никак не в две строки. и вот изучаешь ты все это новое, а потом тебе тошно от того, что оно не везде есть... ведь далеко не всегда выбор языка произволен. вот эту часть можно написать и на си, и на js, а вот эту часть -- только на си и... ну вы понимаете. и думаешь -- лучше бы я всех этих фич не знал.
VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
это важно, хотя не критично. можно экспериментировать с быстрым прототипированием, можно писать всякие скрипты под себя. можно просто развлекаться, решая голические головоломки типа обхода конем шахматной доски.
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, VD>что язык вы изучили, а использовать его не можете?
языки изучаю по мере возникновения в них потребности, оставаясь довольно консервативным. мой путь изучения c -> js -> питон -> рубин. переход от си к js произошел легко. сначала писал в стиле си, потом стал юзать фичи js (типа приведенной выше с obj и apple). после js переход на питон не стал проблемой, ибо там синтаксис довольно близок к си, а новые фичи воспринимаются легко (типа return a, b). и уж ужасно не хватает в си потом. рубин сильно отличается от всего остального как синтаксисом, так и концепциями, однако, за счет простоты самого языка его легко освоить.
но во всех случаях у меня была цель. js -- потому что по работе надо (никто не спрашивал хочу или нет), питон -- потому что парсить тексовые файлы на си в конец задолбало, да и давно был нужен инструмент для быстрого прототипирования. руби -- потому что мы на нем пишем (снова требование работодателя).
так что только питон был моей инициативой, призванной облегчить мне жизнь. и меня очень радует, что мои скрипты, написанные для себя, могут быть в любой момент использованы коллегами, которые тоже знают питон и у которых он запуститься без всяких телодвижений (у них мак и никс).
нермеле, к сожалению, базируется на дотнете, который у нас никто не знает и никто не устанавливает даже в виде моно. и беглый взгляд на него показал, что... ох, блин... как же сильно он отличается от всего того, что я знают о языках. и литературы нет. по питону и руби купил пару бумажных книг (справочники по языку), что позволило освоить руби за два выходных дня (во всяком случае его ядро), а при возникновении проблем толковое руководство (с кучей примером) выводит меня из тупика.
в общем, мне нужно: язык на всех платформах, литература, способность языка решать мои проблемы в разы лучше, чем это делают другие языки, а в идеале еще и возможность обмена сорцами с коллегами.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[2]: Что вас останавливает от изучения нового языка?
Если не секрет, зачем было писать на английском и с ошибками?
# Сообщения следует писать на русском языке. Использование английского языка и транслитерации допускается только в крайнем случае. Использование любых других языков запрещается. В случае необходимости, пользуйтесь услугами сайтов-переводчиков:
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
1. Отсутствие нормальных книг. Читал про хаскель — не осилил
Купил F# Сошникова — тоже туго идет Читал про F# из блогов. Вроде нормально — можно использовать.
N пошел на ура, хоть и доки могло быть побольше.
Boo — нормально, только мало доки про метaпрограммирование.
Python — намана.
Ruby — давно это было, но тоже нормально.
Ela — прикольно, радует скорость обновлений
Lua
Считаю важным — даже если не используешь. Расширяет кругозор. Можно на проблему посмотреть со стороны.
4. Важная штука для использования — выход из статуса беты. Говорят мол — используй багов меньше чем в c#. А тут VladD2 предлагает ламающие изменения, мол еще бета, так что можно.
Вроде на этот раз пронесло.
ЗЫ.
1. Подскажите, пожалуйста, Программирование на F# Смит К. понятней чем у Сошникова или нет?
2. Заинтересовался Lisp — что посоветуете почитать?
Здравствуйте, Nuzhny, Вы писали:
N>Занимаюсь компьютерным зрением, большая часть библиотек на С/С++. Меньше на Матлабе. Совсем немного — Фортран. У многих есть биндинги к другим языкам, но они не так удобны, например при отладке. Например, пытался использовать OpenCV из Питона — не пошло.
Для .NET, кстати, есть отличный порт/обёртка — EmguCV.
Ce n'est que pour vous dire ce que je vous dis.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>>>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
HB>>Исключительно этот пункт. Вообще не выходит изучать что-то "для себя" — вроде и интересно, а "не идёт". Кстати, с обычными языками та же беда: заинтересовался было испанским, почитал, посмотрел, пару песенок перевёл, да и забросил.
VD>ОК, а чтобы могло подвигнуть преодолеть этот пункт?
Наличие подходящей задачи. Либо мне понадобится написать что-то для личного пользования (но это бывает редко) и я решу совместить это с изучением нового языка, либо по какой-то причине новый язык будет выбран для рабочего проекта (вот, сейчас, например, ждём проект на руби — будет повод познакомится с ней поближе).
What a piece of work is a man! how noble in reason! how infinite in faculty! in form and moving how express and admirable! in action how like an angel! in apprehension how like a god! the beauty of the world! the paragon of animals!
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
1. Несовмесимость новых языков с нативным программингом и с существующими проектами на С/С++.
2. Ориентированность новых языков на платформы дотнет/ява (в лучшем случае) или вовсе интерпретируемость (в худшем). Скрипты меня не интересуют.
3. Отсутствие в новых языках интеграции в Visual Studio из коробки, причем я имею в виду также и внутрипроектную интеграцию, которой нет нигде.
Внутрипроектная интеграция (интеграция на уровне файлов) — это такая интеграция, когда я могу в существующий проект на некотором языке (в моем случае С++) содержащий, скажем, несколько сотен файлов *.cpp, добавить новый файл типа file.newlang на новом языке и написать там пару функций или класс на новом языке. И чтобы компилятор корректно скомпилировал это и отдал общему линкеру. Это вообще НЕОБХОДИМОЕ условие перехода на любой новый язык — совмесимость с гигабайтами унаследованного кода. Это то, что следовало бы сделать, когда принимали новый стандарт С++: не впихивать кучу костылей в существующий cpp, а просто взять и сделать новое расширение cppx с ДРУГИМ синтаксисом, не ограниченным совмесиммостью со старым, и просто сказать: вот он, новый стандарт.
Впрочем, все это не мешает мне изучать новые языки (по крайней мере, собирать про них информацию).
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, CreatorCray, Вы писали:
XC>>Это то, что следовало бы сделать, когда принимали новый стандарт С++: не впихивать кучу костылей в существующий cpp, а просто взять и сделать новое расширение cppx с ДРУГИМ синтаксисом, не ограниченным совмесиммостью со старым, и просто сказать: вот он, новый стандарт. CC>Ну и пошли бы они лесом. Как метры уже имеющегося кода переводить на новый стандарт? Выносить куски кода в отдельные файлы? В топку!
Очень просто — по мере необходимости. Есть код, который работает десятки лет и никто его не трогает — зачем переводить? Но, если, к примеру, в процессе рефакторинга обнаружилось, что какую-то часть кода можно сделать лучше, можно было бы создать новый файл нового типа и написать эту часть уже по новому. За счет линковочной совмесимости старый код сможет работать с новым.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, x-code, Вы писали:
XC>Очень просто — по мере необходимости. Есть код, который работает десятки лет и никто его не трогает — зачем переводить? Но, если, к примеру, в процессе рефакторинга обнаружилось, что какую-то часть кода можно сделать лучше, можно было бы создать новый файл нового типа и написать эту часть уже по новому. За счет линковочной совмесимости старый код сможет работать с новым.
Ок. Появилось например decltype и какой то template типа std::vector (это чтоб понятно было в скольких местах он используется) переписан более эффективно с его использованием.
И приехали.
Все старые .cpp в которых есть его include — уже надо переписывать на новый синтаксис.
В общем — плохая идея изначально.
Без backward compatibility такое расширение языка нафиг не нужно. Это будет уже отдельный язык.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Ок. Появилось например decltype и какой то template типа std::vector (это чтоб понятно было в скольких местах он используется) переписан более эффективно с его использованием. CC>И приехали. CC>Все старые .cpp в которых есть его include — уже надо переписывать на новый синтаксис. CC>В общем — плохая идея изначально. CC>Без backward compatibility такое расширение языка нафиг не нужно. Это будет уже отдельный язык.
Переписывать std::vector и прочие такие вещи никто не предлагает, я имею в виду исключительно прикладной код. И к тому же шаблоны С++ реализованы на включении заголовочных файлов в код, а такое включение — одна из самых идиотских вещей в С/С++, которая фактически очень затрудняет тот подход, который я предлагаю. Но найти возможности все равно можно.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, x-code, Вы писали:
CC>>Ок. Появилось например decltype и какой то template типа std::vector (это чтоб понятно было в скольких местах он используется) переписан более эффективно с его использованием.
XC>Переписывать std::vector и прочие такие вещи никто не предлагает, я имею в виду исключительно прикладной код.
Ты невнимательно читаешь. Не std::vector а что то вроде него по частоте употребления в коде. Т.е. это наш прикладной темплейтный класс, который очень много где используется.
XC> И к тому же шаблоны С++ реализованы на включении заголовочных файлов в код, а такое включение — одна из самых идиотских вещей в С/С++, которая фактически очень затрудняет тот подход, который я предлагаю. Но найти возможности все равно можно.
А зачем? Какие от твоего предложения бенефиты?
Переписывать кусок кода на новый синтаксис в отдельный файл (не факт что не накосячив при этом) чтоб заюзать например auto? C'mon!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, x-code, Вы писали:
XC>Очень просто — по мере необходимости. Есть код, который работает десятки лет и никто его не трогает — зачем переводить? Но, если, к примеру, в процессе рефакторинга обнаружилось, что какую-то часть кода можно сделать лучше, можно было бы создать новый файл нового типа и написать эту часть уже по новому. За счет линковочной совмесимости старый код сможет работать с новым.
1. программистам придётся знать два близких языка и не путаться где какой
2. верить в линковочную совмесимость может только человек, никогда не делавший многоязычных проектов. главная проблема — не как одно из другого вызывать, а как совместить концепции языка. типы данных, сбор мусора, обработку исключений, концепции классов и интерфейсов, лямбды и т.д.
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Макрос — это же не языковое понятие. Результатом применения макроса является преобразование одного текста в другой текст.
В языках с поддержкой метапрограммирования, вроде Немерле, макрос оперирует не текстом, а языковыми конструкциями.
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Hobot Bobot, Вы писали:
VD>>3. Политические предпосылки — "Все равно не смогу применять его на работе...". HB>Исключительно этот пункт. Вообще не выходит изучать что-то "для себя" — вроде и интересно, а "не идёт". Кстати, с обычными языками та же беда: заинтересовался было испанским, почитал, посмотрел, пару песенок перевёл, да и забросил.
Совершенно точно!
При практической программерской работе (в первую же пятилетку) уже "не идет" — точный термин.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Так и с языками. Языки программирования уже давно не лимитируют твое понимание предметной области. A>PS. A>Я так понял что ты языками занимаешься? Немерл (или как его там) сочиняешь? Идея мне тут в голову пришла. A>Макрос — это же не языковое понятие. Результатом применения макроса является преобразование одного текста в другой текст. A>Текст этот не обязательно должен быть именно на языке программирования. Он может быть и на русском. A>Вот... придумай достаточно мощщщщщщщщный язык макросов, который можно было бы прикрутить... к чему угодно.
Был уже — ML-1 называется. Еще в конце 60-х... A>PS2. Макросы как часть IDE могут быть. Чтоб сразу видеть было-стало.
А это — есть. В 2010 студии студию можно расширять, дописывая на С№ макросы. А ранее — на VBA.
А в ББ — на Компонентном паскале.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Во-первых, меня не интересуют маргинальные языки. Если у него нет своей ниши , и он реально не используется — подожду, когда ниша появится и использоваться будет реально. Изучить язык — много времени не надо, а зря тратить время на него незачем. PD>Во-вторых, я не люблю моду. Вдруг все набрасываются на что-то. Подождем, когда это нашествие козлотуров придет в какие-то рамки и выяснится, что же получилось. Где сейчас Ада ? А шуму было...
Ада как раз в своей нише... Просто ты с этой нишей мало пересекаешься... PD>В-третьих, я должен быть уверен, что от этого языка будет для меня польза, то есть использовать его лучше, чем его предшественника. Иными словами, мне нужно быть уверенным, что он мне что-то такое положительное дает, чего в других языках, ранее мне известных, не было. И это не синтаксические конструкции, а нечто реальное.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Что вас останавливает от изучения нового языка?
В основном, невозможность практического использования (хотя если бы N умел компилировать и под силверлайт, все было бы несколько по-другому). А для изучения языка "просто так" недостаточно мотивации — у меня и на работе есть много интересных задач.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Честно говоря, лично мне интересен и Nemerle и ты сам. НО. Чробы взять и изучить, к примеру тот же Nemerle, его надо применять, а без этого знания будут теоритические — этого явно мало. Поэтому Nemerle для меня не представляет интереса. Ну я попробовал, концепции понравились, дальше что? Через день всё забылось, потому что не променяется. А сидеть и учить, только для того, чтобы учить уже ни сил, ни времени нет.
Другой пример — не язык — технология. WPF — изначально не понравилось, но политика партии решает всё — GUI на WPF. Изучил и применяю, интересуюсь обновлениями, читаю блоги...
Как-то так.
Спасибо за внимание
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>Во-первых, меня не интересуют маргинальные языки. Если у него нет своей ниши , и он реально не используется — подожду, когда ниша появится и использоваться будет реально. Изучить язык — много времени не надо, а зря тратить время на него незачем. PD>>Во-вторых, я не люблю моду. Вдруг все набрасываются на что-то. Подождем, когда это нашествие козлотуров придет в какие-то рамки и выяснится, что же получилось. Где сейчас Ада ? А шуму было... LVV>Ада как раз в своей нише... Просто ты с этой нишей мало пересекаешься...
Так это же пункт 2 . Ада в своей нише, но позиционировали ее как всеобщую панацею.
With best regards
Pavel Dvorkin
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, x-code, Вы писали:
XC>...и просто сказать: вот он, новый стандарт.
Правда, что-то мне подсказывает, что при этом WG21 прекратил бы своё существование чуть раньше, чем незадолго до объявления таких радикальных изменений. ЧСХ, его бы даже никто не "разгонял", сам бы растворился.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>2. Заинтересовался Lisp — что посоветуете почитать?
На русском — "Мир Лиспа", классика, хотя и старовата на сегодняшний день. Ещё — перевод SICP (Структура и интерпретация компьютерных программ). На английском — ищи по автору Paul Graham.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Abyx, Вы писали:
A>4. отсутствие нормальных средств разработки для языка A>VС++ живо в винде потому что есть ИДЕ (MSVC+VAX) которая лучше всех остальных ИДЕ и плагинов к блокнотам (для языков типа С++), A>потому что есть компилятор с поддержкой расширений нужных в винде, A>потому что есть хороший отладчик, .pdb и минидампы. A>По этому нет смысла учить D, т.к. при всех минусах С++, разработка в VC++ будет быстрее и надежнее.
Здравствуйте, Don Reba, Вы писали:
DR>Здравствуйте, alpha21264, Вы писали:
A>>Макрос — это же не языковое понятие. Результатом применения макроса является преобразование одного текста в другой текст.
DR>В языках с поддержкой метапрограммирования, вроде Немерле, макрос оперирует не текстом, а языковыми конструкциями.
Это как?
Течёт вода Кубань-реки куда велят большевики.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Ответ на этот вопрос совпадает с причиной, почему я завязал с программированием: развитие языков слишком медленно облегчает труд программистов; мне надоело, что для того, что бы сделать простой функционал, приходится тратить на это кучу времени и сил.
Сейчас пишу только в своё удовольствие на C# 2.0. На новые языки смотрю, но пока ещё не появился язык, который бы существенно улучшил дело с облегчением труда.
Вселенная бесконечна как вширь, так и вглубь.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
NB>>если язык не имеет никаких преимуществ перед другими. VD>А как ты делаешь для себя вывод о наличии или отсутствии преимуществ?
Ну вот я умею немного писать на J. Но не вижу ни одного реального применения ему.
До последнего не верил в пирамиду Лебедева.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Очень большей частью как раз не аргументированные и Влад и WolfHound чистые теоретики и не имеют мало мальского опыта писания на этих языках.
Тормоза, игнорирование ошибок и убогие IDE это мы конечно же выдумали. Ага, конечно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Abyx, Вы писали:
A>Аналогично — C#+решарпер лучше чем самая-последняя-версия-немерле+блокнот с подсветкой
Ты интеграцию немерла то видел?
Она уже давно и далеко ушла от блокнота с подсевткой.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Что вас останавливает от изучения нового языка?
FR>>Очень большей частью как раз не аргументированные и Влад и WolfHound чистые теоретики и не имеют мало мальского опыта писания на этих языках. WH>Тормоза, игнорирование ошибок и убогие IDE это мы конечно же выдумали. Ага, конечно.
Неважно, выше по ветке человек хочет:
То есть, ты предлагаешь мне убить пару-тройку лет на какие-нибудь динамически типизированные языки, чтобы убедиться, что все те помои, которые вы с WolfHound-ом на них выливаете, заслуженные? Гы, сорри, но это как раз тот случай, когда я предпочту поучиться на чужом опыте. Вполне, так сказать, доверяю.
У вас этого опыта нет, так что ценность ваших поучений относительно этого предмета близка к нулю.
Вот если вы будете критиковать C# или Немерле это будет весьма ценно для цели "обучения на чужом опыте".
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
A>>Аналогично — C#+решарпер лучше чем самая-последняя-версия-немерле+блокнот с подсветкой WH>Ты интеграцию немерла то видел? WH>Она уже давно и далеко ушла от блокнота с подсевткой.
для msvs2010 — не видел
In Zen We Trust
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
___>>Перед тем, как начать изучать новый язык, люди обычно думают на тему "А действительно ли проблема в языке(средстве)?" L>Корректный ответ на этот вопрос можно дать только зная язык.
Для этого достаточно думать не в терминах языка, а в терминах решаемой задачи. Тогда сразу становится видно хорошо ли наилучшее решение ложится на используемый язык или плохо. Если, как правило, ложится хорошо, то особо смысла искать новый язык нет. Если во многих случаях ложится плохо, тогда да надо изучать новые языки и искать тот, на котором будет ложится лучше.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
L>Есть у тебя список, надо вернут все элементы, удовлетворяюшие условию. L>Если ты не знаком с функциональными фичами шарпа, то у тебя родится тчо-то вроде
L>
L>var result = new List();
L>foreach (var x in coll)
L> if (test(x))
L> result.Add(x);
L>
L>Как, думая в терминах решаемой задачи, прийти к более простому варианту L>
L>var result = new List(coll.Where(test));
L>
L>
В том-то и смысл, что самому такой вариант выдумывать не надо. Надо лишь посмотреть, что может предоставить язык для оперирования со списками. Для этого есть литература и туториалы по языку, примеры кода в сети.
Ещё пример: достаточно бегло посмотреть на Матлаб, чтобы понять как он удобен для решения многих математических задач по сравнению с любыми универсальными языками высокого уровня. Но люди, занимающие символьными вычислениями в Maple, посмотрев на Матлаб вряд ли поменяют язык. И для этого совсем не надо ничего серьёзно изучать.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, Nuzhny, Вы писали:
N>Чтобы узнать о возможностях, не обязательно изучать язык. Достаточно посмотреть, как на нём решаются типичные задачи твоей предметной области.
Плохой способ.
Ибо ты узнаешь не столько о языке сколько, о тараканах тех, кто писал конкретный проект.
А учитывая, что на любом языке можно писать как на фортране...
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, adontz, Вы писали:
A>2) Байндинг между bool и Visibility выполняется только с написание своего класса-конвертора. Я его написал, он не заработал, так и не понял почему.
Оффтоп, но всё же. Есть готовый конвертер: BooleanToVisibilityConverter
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Плохой пример. Для меня первый вариант проще, чем второй. В простых случаях (таких как приведенный) это не заметно, но очень хорошо видно в случаях сложных.
Чем первый вариант проще?
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
N>>Чтобы узнать о возможностях, не обязательно изучать язык. Достаточно посмотреть, как на нём решаются типичные задачи твоей предметной области. WH>Плохой способ. WH>Ибо ты узнаешь не столько о языке сколько, о тараканах тех, кто писал конкретный проект. WH>А учитывая, что на любом языке можно писать как на фортране...
Разумеется, что надо выбирать примеры кода от создателей языка, авторов книг по нему или распространённых и известных продуктов на нём.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Очень большей частью как раз не аргументированные и Влад и WolfHound чистые теоретики и не имеют мало мальского опыта писания на этих языках.
Вот тут мне не надо ляля. Я читаю флеймы достаточно подробно. Не все и не всегда, но тем не менее. С аргументацией у немерлистов всё гораздо лучше, чем у их оппонентов, чьи аргументы сводятся к "не читал но осуждаю", ноль конструктива. Да ты хоть эту ветку перечитай. Половина спорщиков даже примерно не представляет, что такое макросы в N.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Вот тут мне не надо ляля. Я читаю флеймы достаточно подробно. Не все и не всегда, но тем не менее. С аргументацией у немерлистов всё гораздо лучше, чем у их оппонентов, чьи аргументы сводятся к "не читал но осуждаю", ноль конструктива. Да ты хоть эту ветку перечитай. Половина спорщиков даже примерно не представляет, что такое макросы в N.
Для них обоих современные динамические языки именно "не читал но осуждаю" теоретики они.
У меня самого было очень похожее мнение насчет динамики, изменилось оно только через полгода программирования на питоне.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, Nuzhny, Вы писали:
N>Разумеется, что надо выбирать примеры кода от создателей языка, авторов книг по нему или распространённых и известных продуктов на нём.
И ничего не поменялось.
Скажем код адептов тяжёлых ОРМ и легких ОРМ будет противоречить друг другу чуть менее чем во всем.
И все действо будет происходить на одном и том же языке.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, bober_maniac, Вы писали:
_>Отсутствие смысла в изучении языка ради изучения языка.
Изучение нового языка обычно дает новые подходы и новый взгляд на вещи, который ты с разной степенью успешности можешь применять и на том языке, с которым ты работаешь сейчас.
(Степанов ругался на Java как раз в этом смысле, что это первый язык из всех, что он когда-либо изучал, который не дал ему абсолютно никаких новых идей.)
Ну и есть языки, не зависящие от "главного" языка, на котором пишется проект.
Например, bash/grep/cut/whatever для командной строки и стартовых скриптов (PowerShell на винде?) и perl для работы с логами. Без знания перла (причем в объеме четвертого перла, т.е. без классов и т.п.) работать с логами — мучение, я вижу это на примере своих коллег, перла не знающих — то, что я делаю минут за 5-10 на перле, они могут делать по полдня на питоне, экселе, SQLite и прочих не приспособленных для этого девайсах. Причем это не преувеличение, это реальные цифры.
Здравствуйте, Lloyd, Вы писали:
L>Есть у тебя список, надо вернут все элементы, удовлетворяюшие условию. L>Если ты не знаком с функциональными фичами шарпа, то у тебя родится тчо-то вроде
Вот более удачный пример. В шарпе есть такая функция string.Join, которая благодаря гениальным программистам из МС принимает только массив строк и ничего другого. В результате при использовании этой функции типичным является такой код:
List<string> itemsAsString = new List<string>();
foreach (int item in items)
itemsAsString.Add(item.ToString());
return string.Join(", ", itemsAsString.ToArray());
Объясни сколько языков нужно знать для того, чтобы понять, что весь код относящийся к созданию промежуточного массива строк является мусорным?
Также объясни сколько языков нужно знать для того, чтобы понять, что даже в C# 1.0 можно было написать функцию: string MyJoin(string separator, string format, IEnumerable items), которая позволила бы избавиться от мусорного кода, хотя бы в простых (но очень распространенных) случаях?
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Также объясни сколько языков нужно знать для того, чтобы понять, что даже в C# 1.0 можно было написать функцию: string MyJoin(string separator, string format, IEnumerable items), которая позволила бы избавиться от мусорного кода, хотя бы в простых (но очень распространенных) случаях?
[Serializable, ComVisible(true)]
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
{
...
public static string Join(string separator, IEnumerable<string> values);
...
}
Здравствуйте, adontz, Вы писали:
D>>Является ли сильная типизация по сравнению со слабой преимуществом при автоматическом рефакторинге, если оба языка динамически типизированные? Я склонен считать, что нет, т.к. ошибка типов в любом случае вылетит в рантайме, IDE никакой помощи тут не предоставит.
A>Рефакторинг это поведение IDE, а не свойство языка. Си++ типизирован и кому это помогло?
1. Ты не ответил на вопрос в начале моего поста.
2. При отсутствии информации о типах, IDE неспособна надёжно выполнить автоматический рефакторинг (кроме локальных, например, переименование приватного члена класса или внутренней переменной метода). И никак не помогает при ручном рефакторинге. Про C++ это не ко мне, я его не помню. Но на скале я могу расхерачить API классов просто вдребезги, не беспокоясь о том, что потом где-нибудь забуду поменять использующий их код. Компилятор не даст забыть. И на C++, по идее, тоже не должен дать забыть, если typecast-ами не увлекаться — я просто не уверен, что нынче на нём вообще можно писать без кастов. На PHP приходится работать чётко по Фаулеру — крошечными шагами, тратя массу времени на проверку корректности каждого шага. И думаю, что на сильнотипизированных динамических языках ситуация не лучше.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>1. Ты не ответил на вопрос в начале моего поста.
Является ли типизация преимуществом при рефаткоринге? Нет. Даже статически типизированный язык может быть трудным для рефакторина.
D>2. При отсутствии информации о типах, IDE неспособна надёжно выполнить автоматический рефакторинг (кроме локальных, например, переименование приватного члена класса или внутренней переменной метода). И никак не помогает при ручном рефакторинге. Про C++ это не ко мне, я его не помню. Но на скале я могу расхерачить API классов просто вдребезги, не беспокоясь о том, что потом где-нибудь забуду поменять использующий их код. Компилятор не даст забыть. И на C++, по идее, тоже не должен дать забыть, если typecast-ами не увлекаться — я просто не уверен, что нынче на нём вообще можно писать без кастов. На PHP приходится работать чётко по Фаулеру — крошечными шагами, тратя массу времени на проверку корректности каждого шага. И думаю, что на сильнотипизированных динамических языках ситуация не лучше.
В шаблонах Си++ структурная типизация. То есть, если говорить проще, факт использования типа влияет на процесс его рефакторинга.
Здравствуйте, WolfHound, Вы писали:
FR>>Угу IDE'шки для питона сейчас уже вменяемее чем для C++. WH>Нашёл с чем сравнивать. WH>Ты хотя бы с интеграций немерле сравни. WH>Смех же на палочке. Питон намного старше. Имеет на порядки больше ресурсов, а все ИДЕ, в том числе коммерческие говно на фоне интеграции немерла.
Какие рефакторинги поддерживает интеграция Немерле?
Здравствуйте, adontz, Вы писали:
A>Какие рефакторинги поддерживает интеграция Немерле?
Переименование.
А какие рефакторинги поддерживают ИДЕ питона?
Переименование там не работает! Все что они осилили это глобальная замена всех одноименных методов.
С автодополнением и навигацией та же байда.
И это фундаментальные проблемы, которые не лечатся теоритически.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, adontz, Вы писали:
A>В шаблонах Си++ структурная типизация. То есть, если говорить проще, факт использования типа влияет на процесс его рефакторинга.
А можешь примерчик нарисовать для иллюстрации? А то я не въехал.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, Nuzhny, Вы писали:
N>В том-то и смысл, что самому такой вариант выдумывать не надо. Надо лишь посмотреть, что может предоставить язык для оперирования со списками. Для этого есть литература и туториалы по языку, примеры кода в сети.
Посыл оппонента был в том, что и этого не надо, достаточно думать "в терминах решаемой задачи". Собственно, на это я и возражал.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Меня особо ничего не останавливает.
Раньше писал на ассемблере для восьмиразрядных компьютеров, этот опыт позже перенес на Windows.
Потом понадобилось работать с COM — стал изучать C и C++. В результате понравилось, возвращаться не захотел.
Несколько раз приходилось плотно "общаться" с другими языками — C#, Javascript, некоторые скриптовые
диалекты для узкоспецифических областей. Тоже никаких особых проблем не наблюдалось, просто брал и делал.
Думаю, любой современный язык можно освоить в достаточной степени за два или три года.
В смысле, до такой степени, когда он становится основным. Ничего тут страшного-ужасного нету.
Если придется по каким-то причинам оставить С++ и перейти на управляемые языки, спокойно
перенесу это явление и там тоже найду себе работу по вкусу.
VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы.
Есть такой момент.
Меня, например, жутко бесит необходимость в паскалевских диалектах писать что-то вроде "a:=n",
а не просто "a=n". Но это так, мелочь. На ассемблере тоже нету фигурных скобок, а ведь привык же.
VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП.
Да, интересный пункт.
Но ведь если нет ООП, значит есть что-то другое, гораздо более сильное. Так ведь ?
Какая-то новая парадигма... Интересно было бы, по крайней мере.
VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
Если человек пишет системный софт вроде драйверов, систем мониторинга и контроля доступа, то он
сильно ограничен в выборе средств. Скажем так — язык определяется предметной областью, к которой
человек расположен, а вовсе не личными предпочтениями.
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Такое, наверное, может возникнуть тогда, когда язык изучался просто с целью расширения кругозора.
Как меч в ножнах — наточен до звона в лезвии, а резануть нечего (или некого).
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Плохой пример. Для меня первый вариант проще, чем второй. В простых случаях (таких как приведенный) это не заметно, но очень хорошо видно в случаях сложных.
Как раз в простом случае-то преимуществ и не видно. Вот когда будет под десяток этих where и когда будут они присоединяться/отсоединяться в зависимости от тех изи иных условий, вот тогда-то и будет хороший пример.
Re[15]: Что вас останавливает от изучения нового языка?
WH>Но это возможно только для де-факто статически типизированных кусков кода.
Не совсем, скорее для кода который приводится к конечному числу статически типизированных вариантов.
Плюс абстрактная интерпретация которая позволяет нам смотреть только на нужные для данного действия аспекты
и отбрасывая несущественные.
WH>Отсюда вывод: Код по факту статически типизирован. Но компилятору об этом почему-то ничего не говорят.
Нет в целом код может быть не типизирован статически.
WH>Следствие: Раз код и так статически типизирован то нахрена нам вообще динамическая типизация?
Вам не нужно, мы это уже давно выяснили
FR>>Я так не считаю, как и множество других программистов. FR>>Юнит тесты в динамике да необходимы, но не тонны, их размер будет вполне сопоставим с размером оных для статики. WH>Ты почитай, что тебе говорят. WH>Как, например я код рефакторю: Правлю интерфейсы, и компилятор мне все места, где код поправить нужно находит. WH>Что мне может предложить питон?
утиную типизацию вместо интерфейсов
WH>Тесты гонять?
Да.
WH>А где гарантия, что покрытие 100%? WH>А если оно и 100% то где гарантия что на вход все типы подаются?
100% гарантии теперь даже в банках не дают.
WH>А в случае со статикой мне забыть ни о чем не дадут.
В данном случае да статика(вернее ее подмножество) рулит.
Все таки 1001 раз это все уже уныло.
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Юнит тесты в динамике да необходимы, но не тонны, их размер будет вполне сопоставим с размером оных для статики.
D>Гыгы, нуну. -1.
В статике они тоже необходимы, если пишется хоть что-то более-менее серьезное.
FR>>Тесты в этом вполне рулят.
D>Пишите, Шура, пишите, они золотые.
Жаль, мне ты казался более вменяемым
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>Порутчикам: Про хаки, которыми можно что-то вытащить, мне рассказывать не надо (я сам про них кому угодно могу рассказать). Ибо они начинают работать, когда нам уже тип подсунули.
Жаль что эти редиски из комитета концепты зарубили
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Вот более удачный пример. В шарпе есть такая функция string.Join, которая благодаря гениальным программистам из МС принимает только массив строк и ничего другого. В результате при использовании этой функции типичным является такой код:
U>
U>List<string> itemsAsString = new List<string>();
U>foreach (int item in items)
U> itemsAsString.Add(item.ToString());
U>return string.Join(", ", itemsAsString.ToArray());
U>
U>Объясни сколько языков нужно знать для того, чтобы понять, что весь код относящийся к созданию промежуточного массива строк является мусорным?
Достаточно знать, что в 4.0 это исправили.
U>Также объясни сколько языков нужно знать для того, чтобы понять, что даже в C# 1.0 можно было написать функцию: string MyJoin(string separator, string format, IEnumerable items), которая позволила бы избавиться от мусорного кода, хотя бы в простых (но очень распространенных) случаях?
к чему относится format?
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
WH>>Порутчикам: Про хаки, которыми можно что-то вытащить, мне рассказывать не надо (я сам про них кому угодно могу рассказать). Ибо они начинают работать, когда нам уже тип подсунули.
FR>Жаль что эти редиски из комитета концепты зарубили
жаль то оно конечно жаль, но обсуждаемую проблему концепты бы не решили.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Не совсем, скорее для кода который приводится к конечному числу статически типизированных вариантов.
А что в статически типизированных языках обобщенный код уже отменили?
Не знал.
FR>Плюс абстрактная интерпретация которая позволяет нам смотреть только на нужные для данного действия аспекты и отбрасывая несущественные.
И нахрена козе баян если нормальные языки и так все проверяют?
WH>>Отсюда вывод: Код по факту статически типизирован. Но компилятору об этом почему-то ничего не говорят. FR>Нет в целом код может быть не типизирован статически.
Мне ни кто, ни разу не привел пример когда динамическая типизация нужны.
Ближе всех был мыщъх с очень узкой задачей декодирования жабоскрипта. Для этого он использовал интерпритатор жабоскрипта чтобы скрипт сам себя декодировал.
Остальные не показали ничего. Ни разу.
FR>утиную типизацию вместо интерфейсов
И как оно мне поможет найти места, где код править надо?
FR>В данном случае да статика(вернее ее подмножество) рулит.
Она всегда рулит.
FR>Все таки 1001 раз это все уже уныло.
Аргументов как не было так и нет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>жаль то оно конечно жаль, но обсуждаемую проблему концепты бы не решили.
Именно они и должны были ее решить. Хотябы частично.
Ибо они по факту классы типов (привет хаскелю) для типов.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
A>>Какие рефакторинги поддерживает интеграция Немерле? WH>Переименование.
Я вот думал, что VS поддерживает переименование в C#. А потом поставил ReSharper и узнал о преименовании много нового . Хотя я согласен, что переименвоание наиболее часто используемый вид рефакторинга, списочек всё же скудноват. Автоматизация рефакторинга ценится не частотой использования, а сэкономленным временем.
Здравствуйте, WolfHound, Вы писали:
NB>>жаль то оно конечно жаль, но обсуждаемую проблему концепты бы не решили. WH>Именно они и должны были ее решить. Хотябы частично. WH>Ибо они по факту классы типов (привет хаскелю) для типов.
Здравствуйте, adontz, Вы писали:
A>Я вот думал, что VS поддерживает переименование в C#. А потом поставил ReSharper и узнал о преименовании много нового .
И что ты такого нового узнал?
Просто я решарпер уже давно не видел, ибо на C# давно не пишу.
A>Хотя я согласен, что переименвоание наиболее часто используемый вид рефакторинга, списочек всё же скудноват. Автоматизация рефакторинга ценится не частотой использования, а сэкономленным временем.
Но работает.
А в ИДЕ для динамически типизированных языков не работает.
А количество неработающих фич никого не интересует.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
FR>>Жаль что эти редиски из комитета концепты зарубили
NB>жаль то оно конечно жаль, но обсуждаемую проблему концепты бы не решили.
Полностью нет, но очень приличную часть да.
Re[22]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>потом я решаю, что bar плохое название, и переименовываю на baz. как концепты помогут мне найти все места, где используется старое наименование?
Я С++ давно не интересовался, так что не помню точно, что там предлагалось.
Поэтому напишу, как это могло бы быть:
contract FooBar
{
void bar();
}
template<class Value>
contract iterator
{
Value* operator->();
}
template<class Iterator, class Value>
where Iterator : iterator<Value>
where Value : FooBar
void foo ( Iterator it ) { it->bar(); }
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
A>>Я вот думал, что VS поддерживает переименование в C#. А потом поставил ReSharper и узнал о преименовании много нового . WH>И что ты такого нового узнал? WH>Просто я решарпер уже давно не видел, ибо на C# давно не пишу.
Решарпер переименовывает тип в комментариях, регионах, свойства одноимённые с типом, поля и переменные. В общем это не просто корректная замена имени типа. Например вот это
class Test
{
private MyOldType _myOldType;
public MyOldType MyOldType
{
get { return _myOldType; }
}
}
студия преобразует к виду
class Test
{
private MyNewType _myOldType;
public MyNewType MyOldType
{
get { return _myOldType; }
}
}
что не очень здорово.
A>>Хотя я согласен, что переименвоание наиболее часто используемый вид рефакторинга, списочек всё же скудноват. Автоматизация рефакторинга ценится не частотой использования, а сэкономленным временем. WH>Но работает. WH>А в ИДЕ для динамически типизированных языков не работает. WH>А количество неработающих фич никого не интересует.
Ну, не работать могут конкретные реализации. Если Visual Assist как-то переваривает Си++, то уж Питон-то точно можно переварить. Меня вообще конкретные реализации мало волнуют, я просто хочу сказать что язык без IDE рассматривать не стоит. С#, если писать в Блокноте, то ещё говно, наверное.
Здравствуйте, VladD2, Вы писали:
VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы.
нет, но избыточность пунктуации/спецсимволов действует отталкивающе.. читать ещё можно привыкнуть, а вот печатается уже медленнее..
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
не применяю и даже не заканчиваю внятное изучение(всё равно забуду), если нет возможности применять на работе, а дома никаких интересных в данный момент проектов с этим языком не придумать..
...coding for chaos...
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>А что в статически типизированных языках обобщенный код уже отменили? WH>Не знал.
Так с анализом обобщенного когда и в статике проблематично.
FR>>Плюс абстрактная интерпретация которая позволяет нам смотреть только на нужные для данного действия аспекты и отбрасывая несущественные. WH>И нахрена козе баян если нормальные языки и так все проверяют?
А какая разница если это делает машина?
WH>>>Отсюда вывод: Код по факту статически типизирован. Но компилятору об этом почему-то ничего не говорят. FR>>Нет в целом код может быть не типизирован статически. WH>Мне ни кто, ни разу не привел пример когда динамическая типизация нужны. WH>Ближе всех был мыщъх с очень узкой задачей декодирования жабоскрипта. Для этого он использовал интерпритатор жабоскрипта чтобы скрипт сам себя декодировал. WH>Остальные не показали ничего. Ни разу.
Тебе не нужно, это уже практически аксиома
FR>>утиную типизацию вместо интерфейсов WH>И как оно мне поможет найти места, где код править надо?
Оно поможет тем что нужно меньше правок.
FR>>В данном случае да статика(вернее ее подмножество) рулит. WH>Она всегда рулит.
FR>>Все таки 1001 раз это все уже уныло. WH>Аргументов как не было так и нет.
Угу, кто не хочет слушать не услышит.
Re[23]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
NB>>потом я решаю, что bar плохое название, и переименовываю на baz. как концепты помогут мне найти все места, где используется старое наименование? WH>Я С++ давно не интересовался, так что не помню точно, что там предлагалось. WH>Поэтому напишу, как это могло бы быть:
ты ведь понимаешь, что никто в нормальном здравии так писать не будет.
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
U>>Объясни сколько языков нужно знать для того, чтобы понять, что весь код относящийся к созданию промежуточного массива строк является мусорным? L>Достаточно знать, что в 4.0 это исправили.
Т.е. своей головы у тебя нет и сам ты предложить решение не можешь? Поэтому в этом случае ты ждал десять лет, пока МС решит проблему?
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
D>>Демагогия detected. Система типов именно что даёт математически доказанные гарантии.
FR>Для языков с выводом типов не дает. Мешает проблема останова и алгоритмическая сложность, если нужны подробности смотри Основания языков программирования
Что-то мне подсказывает, что ты неправ, потому что как при выводе типов, так и при проверки их согласованности используются формальные алгоритмы с известными свойствами. Но это пусть лучше "теоретики" ответят.
D>>А ещё рулит компилятор, ага, который выполнит анализ без необходимости деплоймента и запуска приложения (иногда дорогостоящего) и кликанья по менюшкам, чтобы добраться до загрузки проверяемого модуля.
FR>Зачем менюшки, юнит тесты выполняются одним нажатием на клавишу, и вообще с ними удобно работать http://pydev.blogspot.com/2010/12/improved-unittest-support-in-pydev.html приложение запускается не чаще чем в статике.
Ещё раз: во view-слое тоже бывают ошибки, с соответствующим процентом банальных опечаток. Вместо того, чтобы дать компилятору возможность ловить их автоматически, ты предлагаешь городить вручную юнит-тесты, суммарного кода в которых для мало-мальски сложных интерактивных страниц будут как минимум не меньше, чем в самой странице, тупо потому что нужно покрыть все базовые варианты поведения этой страницы. И использоваться при этом монстров типа celestia, которые ни простоты, ни скорости работы тестов не добавят. И поддерживать это потом всё в актуальном состоянии, что опять же, в случае celestia, гораздо сложнее, чем в "обычных" тестах, т.к. на клиенте можно проверять только косвенные признаки правильно отработавшего серверного кода: типа "а вот есть ли у нас элемент с таким-то id, содержащим такой-то текст?". А если кто-нибудь в ресурсном файле исправил грамматическую ошибку в тексте, или прикрутил локализацию, то все тесты дружно полетят. В отличие от компилятора. Я на скале view-слой не тестирую вообще: логическим ошибкам в нём просто неоткуда взяться, он простой как пять копеек, а опечатки и согласования типов ловит компилятор.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>>>Объясни сколько языков нужно знать для того, чтобы понять, что весь код относящийся к созданию промежуточного массива строк является мусорным? L>>Достаточно знать, что в 4.0 это исправили.
U>Т.е. своей головы у тебя нет и сам ты предложить решение не можешь? Поэтому в этом случае ты ждал десять лет, пока МС решит проблему?
На основе чего вы сделали такой вывод?
P.S. Если честно, всегда тупо писал .ToArray. Склеивание строк никогда не было узким местом в моих приложениях.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, adontz, Вы писали:
A>Решарпер переименовывает тип в комментариях, регионах, свойства одноимённые с типом, поля и переменные. В общем это не просто корректная замена имени типа. Например вот это
Понятно.
Никаких проблем с этим нет.
Просто ресурсов сделать не хватает.
A>Ну, не работать могут конкретные реализации. Если Visual Assist как-то переваривает Си++, то уж Питон-то точно можно переварить.
Вот тут ты не прав.
С++ не смотря на всю свою ужасность статически типизированный.
Так что там есть что переваривать.
А в питоне переваривать нечего.
Информации в исходниках просто физически нет.
A>Меня вообще конкретные реализации мало волнуют, я просто хочу сказать что язык без IDE рассматривать не стоит. С#, если писать в Блокноте, то ещё говно, наверное.
Покажи работающую, которая хотя бы в 10 строках не путается.
Нет таких. Ибо проблемы теоритические и "реализациями" не решаются.
А вот для немерле решарпер при наличии ресурсов сделать можно.
Компилятор второго немереле вообще изначально проектируется не только как компилятор но и как фундамент для ИДЕ.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Так с анализом обобщенного когда и в статике проблематично.
В самом деле? Пример дашь? А я в ответку решение на скале без проблем.
FR>А какая разница если это делает машина?
Разница в том, что в твоём случае, чтобы это сделала машина, надо либо писать юнит-тесты, либо кликать до нужного места в программе. Так что у тебя машина это делает не сама, а с твоей активной помощью.
FR>>>утиную типизацию вместо интерфейсов WH>>И как оно мне поможет найти места, где код править надо?
FR>Оно поможет тем что нужно меньше правок.
И больше бардака в итоге. А возможность плодить бардак выливается в отсутствие дисциплины при разработке интерфейсов, и в лютую головную боль с дальнейшей поддержкой проекта, в т.ч. с рефакторингом.
FR>>>Все таки 1001 раз это все уже уныло. WH>>Аргументов как не было так и нет.
+1
FR>Угу, кто не хочет слушать не услышит.
Мы бы и рады послушать. Какие-нибудь новые для разнообразия, вдруг они окажутся убедительнее нынешних. Но проблема в том, что их нет.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
L>P.S. Если честно, всегда тупо писал .ToArray. Склеивание строк никогда не было узким местом в моих приложениях.
Т.е. до шарпа 3.5 ты пользовался стандартным string.Join, каждый раз руками преобразуя коллекцию исходных типов в коллекцию строк. И у тебя не возникало мыслей, что код этого преобразования является мусорным, соответственно ты не задумывался о том, что в первом шарпе можно было самому написать решение, которое сделало бы это ненужным в простых случаях, а во втором шарпе — для всех случаях?
И сколько языков нужно изучить, чтобы это понять?
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>>>Демагогия detected. Система типов именно что даёт математически доказанные гарантии.
FR>>Для языков с выводом типов не дает. Мешает проблема останова и алгоритмическая сложность, если нужны подробности смотри Основания языков программирования
последнюю главу.
D>Что-то мне подсказывает, что ты неправ, потому что как при выводе типов, так и при проверки их согласованности используются формальные алгоритмы с известными свойствами. Но это пусть лучше "теоретики" ответят.
Если не знаешь, то про демагогию лучше промолчать.
FR>>Зачем менюшки, юнит тесты выполняются одним нажатием на клавишу, и вообще с ними удобно работать http://pydev.blogspot.com/2010/12/improved-unittest-support-in-pydev.html приложение запускается не чаще чем в статике.
D>Ещё раз: во view-слое тоже бывают ошибки, с соответствующим процентом банальных опечаток. Вместо того, чтобы дать компилятору возможность ловить их автоматически, ты предлагаешь городить вручную юнит-тесты, суммарного кода в которых для мало-мальски сложных интерактивных страниц будут как минимум не меньше, чем в самой странице, тупо потому что нужно покрыть все базовые варианты поведения этой страницы. И использоваться при этом монстров типа celestia, которые ни простоты, ни скорости работы тестов не добавят. И поддерживать это потом всё в актуальном состоянии, что опять же, в случае celestia, гораздо сложнее, чем в "обычных" тестах, т.к. на клиенте можно проверять только косвенные признаки правильно отработавшего серверного кода: типа "а вот есть ли у нас элемент с таким-то id, содержащим такой-то текст?". А если кто-нибудь в ресурсном файле исправил грамматическую ошибку в тексте, или прикрутил локализацию, то все тесты дружно полетят. В отличие от компилятора. Я на скале view-слой не тестирую вообще: логическим ошибкам в нём просто неоткуда взяться, он простой как пять копеек, а опечатки и согласования типов ловит компилятор.
В веб я ни в зуб ногой так что ничего ни могу сказать. В desktop все удобно и просто.
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
U>>Также объясни сколько языков нужно знать для того, чтобы понять, что даже в C# 1.0 можно было написать функцию: string MyJoin(string separator, string format, IEnumerable items), которая позволила бы избавиться от мусорного кода, хотя бы в простых (но очень распространенных) случаях?
L>к чему относится format?
Применяется к каждому item'у, т.е. он должен называться itemFormat.
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Что-то мне подсказывает, что ты неправ, потому что как при выводе типов, так и при проверки их согласованности используются формальные алгоритмы с известными свойствами. Но это пусть лучше "теоретики" ответят.
При выводе типов используется бубен и такаятоматерь.
Но нормальные люди после вывода типов вставляют проверку типов, которая таки проста и формальна.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Так с анализом обобщенного когда и в статике проблематично.
D>В самом деле? Пример дашь? А я в ответку решение на скале без проблем.
Чуть выше показали на шаблонах C++.
FR>>А какая разница если это делает машина?
D>Разница в том, что в твоём случае, чтобы это сделала машина, надо либо писать юнит-тесты, либо кликать до нужного места в программе. Так что у тебя машина это делает не сама, а с твоей активной помощью.
Нет был разговор про PyPi там все тоже делает полностью автоматически компилятор и анализатор.
D>Мы бы и рады послушать. Какие-нибудь новые для разнообразия, вдруг они окажутся убедительнее нынешних. Но проблема в том, что их нет.
Бессмысленно проверено 1001 раз.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>ты ведь понимаешь, что никто в нормальном здравии так писать не будет.
Почему?
В C# пишут.
В хаскеле пишут.
Почему на С++ не будут?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
L>>P.S. Если честно, всегда тупо писал .ToArray. Склеивание строк никогда не было узким местом в моих приложениях.
U>Т.е. до шарпа 3.5 ты пользовался стандартным string.Join, каждый раз руками преобразуя коллекцию исходных типов в коллекцию строк.
Думай дальше.
U>И у тебя не возникало мыслей, что код этого преобразования является мусорным, соответственно ты не задумывался о том, что в первом шарпе можно было самому написать решение, которое сделало бы это ненужным в простых случаях, а во втором шарпе — для всех случаях?
Да, можно. Что ты хотел этим продемонстрировать?
U>И сколько языков нужно изучить, чтобы это понять?
Очевидно, нисколько. О чем ты вообще?
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
FR>>Так с анализом обобщенного когда и в статике проблематично. WH>Чего?
Выше пример с шаблонами C++
FR>>Тебе не нужно, это уже практически аксиома WH>Что значит мне не нужно? WH>Оно вообще не нужно. WH>Ибо никто не может сказать зачем.
Нет критерий нужности доказывает только практика, по нему очень даже нужно.
FR>>Оно поможет тем что нужно меньше правок. WH>Это ложь.
Нет.
FR>>Угу, кто не хочет слушать не услышит. WH>Ну так где аргументы то? WH>Есть только один: Меньше кода. WH>Но это по сравнению с жабой меньше. А по сравнению с немерле экономии почти нет. WH>А какие еще? Ну, хоть один.
Практика.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
D>>Что-то мне подсказывает, что ты неправ, потому что как при выводе типов, так и при проверки их согласованности используются формальные алгоритмы с известными свойствами. Но это пусть лучше "теоретики" ответят.
FR>Если не знаешь, то про демагогию лучше промолчать.
Влад описывал алгоритм вывода типов совсем недавно, через итеративное решение неполной системы, и это отдельный этап. Проверка согласованности типов выполняется в любом случае. Компилятор скалы после вывода типов проверят сначала корректность программы в системе типов скалы, а потом отдельно — в системе типов жавы, т.к. компиляция идёт под JVM. Про математические гарантии системы типов я взял фразу у Мартина Одерски, автора скалы. (Я понимаю, что для тебя он тоже ламер, демагог и теоретик, ну извините, чем богаты. Ты сам наверное куда больше языков разработал, чем Одерски и Влад с WolfHound-ом вместе взятые.)
FR>В веб я ни в зуб ногой так что ничего ни могу сказать. В desktop все удобно и просто.
В desktop, чтобы тестировать user interaction, ты должен делать эмуляцию действий пользователя. "Кликнуть по такому-то контролу, затем ввести что-то в такое-то поле, затем проверить что в такой-то области появился такой-то текст". Проще, но не сильно.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Чуть выше показали на шаблонах C++.
Чуть выше ответили так же, что в шаблонах используется динамическая типизация. Generics в скале таких проблем не имеют, там можно указывать вариантность и lower/upper bounds, контроль 100%-ный и внутри generic-методов, и при вызове.
FR>Бессмысленно проверено 1001 раз.
Именно.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, Lloyd, Вы писали:
U>>И сколько языков нужно изучить, чтобы это понять? L>Очевидно, нисколько. О чем ты вообще?
О том, что если при решении задачи пользоваться принципом минимума сущностей, то проблемные места языка становятся очевидными, даже без знания каких-либо других языков.
Re[26]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>весь интерфейс используемый в функции переписывают? NB>этож застрелиться можно. NB>я думал это си — многословный язык, ан нет.
Ты о чем?
Это будет прописано один раз.
Здравствуйте, adontz, Вы писали:
A>Структурная, а не динамическая. Это разыне вещи. Там типизация статическая (ты не можешь добавить метод классу в рантайме, шаблон не будет использовать метод из наследника) и структурная.
Для тебя, похоже, новость, что типы имеют свои типы.
И типы типов в С++ описать нельзя.
Как следствие вычисление типов динамически типизированное.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[21]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Если не знаешь, то про демагогию лучше промолчать.
D>Влад описывал алгоритм вывода типов совсем недавно, через итеративное решение неполной системы, и это отдельный этап. Проверка согласованности типов выполняется в любом случае. Компилятор скалы после вывода типов проверят сначала корректность программы в системе типов скалы, а потом отдельно — в системе типов жавы, т.к. компиляция идёт под JVM. Про математические гарантии системы типов я взял фразу у Мартина Одерски, автора скалы. (Я понимаю, что для тебя он тоже ламер, демагог и теоретик, ну извините, чем богаты. Ты сам наверное куда больше языков разработал, чем Одерски и Влад с WolfHound-ом вместе взятые.)
Нет, а вот твой тупой переход на личности мне очень не нравится, хотелось бы чтобы модераторы придерживались такого же мнения.
Ладно бы еще тонко тролил
Ну и если про авторитеты, в математике я буду доверять больше Дж. Митчелу а не Мартиу Одерски, при всем моем к нему уважении.
FR>>В веб я ни в зуб ногой так что ничего ни могу сказать. В desktop все удобно и просто.
D>В desktop, чтобы тестировать user interaction, ты должен делать эмуляцию действий пользователя. "Кликнуть по такому-то контролу, затем ввести что-то в такое-то поле, затем проверить что в такой-то области появился такой-то текст". Проще, но не сильно.
Зависит от приложения.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
WH>>Если кода в 10 раз меньше, то это не только разгоняет разработку раз в 20, но и упрощает поддержку раз в 100.
U>Если сущностей в коде в десять раз меньше, а не буковок.
ИМХО эти вещи до некотороый степени взаимосвязаны. Там где я в ФП могу написать `val strings = ints.map(_.toStrings)`, на императивном языке я буду вынужден корёжиться с циклом (сорри, вы тут неподалёку что-то похожее в тему обсуждали, но мне в вашу тему вчитываться лениво). И сущностей меньше, и букв.
Re[23]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
A>>Структурная, а не динамическая. Это разыне вещи. Там типизация статическая (ты не можешь добавить метод классу в рантайме, шаблон не будет использовать метод из наследника) и структурная. WH>Для тебя, похоже, новость, что типы имеют свои типы.
Тебе есть что сказать по существу? Я где-то не прав?
Здравствуйте, WolfHound, Вы писали:
NB>>весь интерфейс используемый в функции переписывают? NB>>этож застрелиться можно. NB>>я думал это си — многословный язык, ан нет. WH>Ты о чем? WH>Это будет прописано один раз. WH>
WH>contract FooBar
WH>{
WH> void bar();
WH>}
WH>
именно об этом. если в функции еще используется bar1 и bar2 то их тоже придется описать (опять же здесь или в отдельном контракте?)
если в отдельном контракте то опять их все перечислять в функции.
если в этом, то в другой функции придется создавать свой контракт.
засорять пространство имен.
этого никто не будет делать.
WH>Это вообще часть стандартной библиотеки. WH>
Здравствуйте, Undying, Вы писали:
WH>>Если кода в 10 раз меньше, то это не только разгоняет разработку раз в 20, но и упрощает поддержку раз в 100. U>Если сущностей в коде в десять раз меньше, а не буковок.
Ессно я не имею в виду шифрование исходников сжатием имен в однобуквенную хрень.
И если код написан нормально и он в 10 раз меньше то вывод о том что из него убрали, напрашивается сам собой.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[22]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Нет, а вот твой тупой переход на личности мне очень не нравится, хотелось бы чтобы модераторы придерживались такого же мнения. FR>Ладно бы еще тонко тролил
Я не тролю, я общаюсь с фанатиком, неспособным аргументировать свою точку зрения. А переход на личности начал ты, я лишь его проявил.
FR>Ну и если про авторитеты, в математике я буду доверять больше Дж. Митчелу а не Мартиу Одерски, при всем моем к нему уважении.
Ну а я буду больше доверять Одерски, чем тебе. И прежде всего — своему опыту использования языков. Ок?
D>>В desktop, чтобы тестировать user interaction, ты должен делать эмуляцию действий пользователя. "Кликнуть по такому-то контролу, затем ввести что-то в такое-то поле, затем проверить что в такой-то области появился такой-то текст". Проще, но не сильно.
FR>Зависит от приложения.
Во, прогресс, уже "зависит от", без оголтелого отрицания самой возможности существования ситуаций, когда тесты себе дороже.
Re[28]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>именно об этом. если в функции еще используется bar1 и bar2 то их тоже придется описать (опять же здесь или в отдельном контракте?) NB>если в отдельном контракте то опять их все перечислять в функции. NB>если в этом, то в другой функции придется создавать свой контракт. NB>засорять пространство имен.
Если говорить не об абстрактных bar, baz итп то выяснится что у нас есть вполне определенный контракт, которому должны соответствовать объекты, попадающие в библиотеку.
Практика языков, где по-другому не сделать говорит, что это никого не напрягает и занимает намного меньше места, чем ты себе напридумывал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[24]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>Если говорить не об абстрактных bar, baz итп то выяснится что у нас есть вполне определенный контракт, которому должны соответствовать объекты, попадающие в библиотеку. WH>Практика языков, где по-другому не сделать говорит, что это никого не напрягает и занимает намного меньше места, чем ты себе напридумывал.
не исключаю.
о каких языках речь?
есть в них возможность не полного указания контракта?
как там работает переименование?
Re[24]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Прикольно я тоже общаюсь с фанатиком. FR>Теоретизм наших уважаемых модераторов в динамике это не переход на личности а факт.
Если это факт, то тебе не составит труда его доказать. У тебя, наверное, есть их полное резюме и портфолио. Итак?
Re[22]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>>>Практика.
D>>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
FR>Я не верю в существование лучшего языка у всех реальных языков полно недостатков.
О, вера — это прекрасный аргумент. Для верующих.
FR>Практика не демагогия, а очень толстый и жирный аргумент, если язык живет и долгое время популярен, на нем выпускаются FR>вполне успешные проекты, то это железно доказывает его нужность при всех его недостатках, если этого не видят поклонники FR>одного очень крутого, но пока (хотя при таких фанатах может и навсегда ) не практичного языка то это их проблемы.
PHP — живой и долгое время популярен. Что не мешает ему быть абсолютным говном.
Re[30]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>не исключаю. NB>о каких языках речь?
Уже сказал.
C# с констрейнтами на генерики (да и все нормальные языки для .НЕТ), хаскель с его классами типов,...
NB>есть в них возможность не полного указания контракта?
Нет. И не нужно.
NB>как там работает переименование?
Чего?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[25]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Теоретизм наших уважаемых модераторов в динамике это не переход на личности а факт.
D>Если это факт, то тебе не составит труда его доказать. У тебя, наверное, есть их полное резюме и портфолио. Итак?
Информация у меня только с общения с ними же на форуме, насколько я знаю Влад некоторое время писал на VB который нельзя
отнести к современным динамическим языкам, о том чтобы WolfHound говорил что писал на динамике ни разу ни слышал, если бы
это было так он наверняка бы апеллировал к этому.
Re[23]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>>>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
FR>>Я не верю в существование лучшего языка у всех реальных языков полно недостатков.
D>О, вера — это прекрасный аргумент. Для верующих.
Ну уж настолько то контекст не надо терять, или тут кто-то про демагогию говорил кажется?
Я лишь перефразировал — "Серебряной пули не существует".
FR>>Практика не демагогия, а очень толстый и жирный аргумент, если язык живет и долгое время популярен, на нем выпускаются FR>>вполне успешные проекты, то это железно доказывает его нужность при всех его недостатках, если этого не видят поклонники FR>>одного очень крутого, но пока (хотя при таких фанатах может и навсегда ) не практичного языка то это их проблемы.
D>PHP — живой и долгое время популярен. Что не мешает ему быть абсолютным говном.
Это только твое мнение. Хотя с этим к PHP'шникам.
Re[31]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
NB>>не исключаю. NB>>о каких языках речь? WH>Уже сказал. WH>C# с констрейнтами на генерики (да и все нормальные языки для .НЕТ), хаскель с его классами типов,...
генерики могут быть без констрейнтов?
NB>>есть в них возможность не полного указания контракта? WH>Нет. И не нужно.
NB>>как там работает переименование? WH>Чего?
рефакторинг. по шарпу можешь не говорить.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>1. JVM давай, да? И возможность юзать java-либы тоже. D>2. А вот если я захочу на N под CLR написать чё-нить десктопное и при этом кроссплатформенное, я смогу его распространять большим каталогом, не требующим исталляции, со встроенным mono runtime (аналогично jre)? Если нет, см. п.1.
Ну Моно-пекеджер вроде как есть и вполне рабочий. Вон на Моно даже под Апп-стор приложения умудряются писать.
Re[26]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>>>Теоретизм наших уважаемых модераторов в динамике это не переход на личности а факт.
D>>Если это факт, то тебе не составит труда его доказать. У тебя, наверное, есть их полное резюме и портфолио. Итак?
FR>Информация у меня только с общения с ними же на форуме, насколько я знаю Влад некоторое время писал на VB который нельзя FR>отнести к современным динамическим языкам, о том чтобы WolfHound говорил что писал на динамике ни разу ни слышал, если бы FR>это было так он наверняка бы апеллировал к этому.
На логическое доказательство не тянет. Отсутствие упоминаний о факте не означает отсутствие факта. Я надеюсь, это очевидно?
В любом случае, опыт с динамикой есть у меня. С "ненормальной", но мы тут недавно выяснили, что "нормальная" тоже требует запуска программы, в том или ином виде. А также у меня имеется опыт с нормальной статикой, так что обращайся, если что. И кстати, рекомендую на досуге поизучать скалу, чтобы ознакомиться с настоящей, нормальной статикой, и не демонстрировать собственное невежество, утверждая про проблемы с generics.
Re[32]: Что вас останавливает от изучения нового языка?
Здравствуйте, night beast, Вы писали:
NB>генерики могут быть без констрейнтов?
Могут.
Но тогда нельзя методы вызывать.
NB>рефакторинг. по шарпу можешь не говорить.
Если типы типизированные (а не как в С++) то это дело техники.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[27]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>На логическое доказательство не тянет. Отсутствие упоминаний о факте не означает отсутствие факта. Я надеюсь, это очевидно?
Нет, если бы мы плотно не общались (мягко говоря) на эту тему то было бы очевидно.
D>В любом случае, опыт с динамикой есть у меня. С "ненормальной", но мы тут недавно выяснили, что "нормальная" тоже требует запуска программы, в том или ином виде. А также у меня имеется опыт с нормальной статикой, так что обращайся, если что.
Как-то не тянет, обращаться к сильно агрессивным людям
D>И кстати, рекомендую на досуге поизучать скалу, чтобы ознакомиться с настоящей, нормальной статикой, и не демонстрировать собственное невежество,
Только начинаю думать что с тобой можно нормально общаться и опять трололо с переходом на личности
D>утверждая про проблемы с generics.
Спасибо за совет про скалу, но мне хватает OCaml'а и небольших доз F# там этой статики более чем достаточно.
Re[24]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
D>>>>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
FR>>>Я не верю в существование лучшего языка у всех реальных языков полно недостатков.
D>>О, вера — это прекрасный аргумент. Для верующих.
FR>Ну уж настолько то контекст не надо терять, или тут кто-то про демагогию говорил кажется? FR>Я лишь перефразировал — "Серебряной пули не существует".
С несуществованием серебряной пули никто в здравом уме спорить не будет, но утверждал ты во-первых не это, а то, что не бывает языка, лучшего других. Похоже, ты не дружишь даже с элементарной формальной логикой.
Во-первых, отсутствие идеальной вещи в своём классе не означает отсутствия лучшей, просто лучшая может быть тоже неидеальной. Так, можно найти максимальное число из конечного множества неодинаковых чисел, но оно не будет равно бесконечности. Это понятно?
Во-вторых, речь шла исключительно про "статика vs динамика", а не про лучший язык. Кто из нас потерял контекст обсуждения, съехав в какие-то "наилучшие языки"? Моя фраза насчёт "дельфи — лучший языков" — это не смена темы, а попытка показать, что твоя аппеляция к "практике" в качестве аргумента зачтена быть не может, потому что, повторюсь, практика у всех своя, а тем, кто будет читать это обсуждение в будущем, никакой пищи для размышлений такая "аргументация" не даст.
В-третьих, "я верю" написал ты, и если ты считаешь это аргументом, а не демагогией, то я даже и не знаю, что ответить.
FR>>>Практика не демагогия, а очень толстый и жирный аргумент, если язык живет и долгое время популярен, на нем выпускаются FR>>>вполне успешные проекты, то это железно доказывает его нужность при всех его недостатках, если этого не видят поклонники FR>>>одного очень крутого, но пока (хотя при таких фанатах может и навсегда ) не практичного языка то это их проблемы.
D>>PHP — живой и долгое время популярен. Что не мешает ему быть абсолютным говном.
FR>Это только твое мнение. Хотя с этим к PHP'шникам.
Опять повторюсь для совсем непонятливых: я своей фразой просто опровергаю твой тезис, что практика является аргументом. Не является, потому что практика у всех своя. Давай нормальные, осмысленные аргументы, полезные для тех, кто будет читать.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>О том, что если при решении задачи пользоваться принципом минимума сущностей, то проблемные места языка становятся очевидными, даже без знания
каких-либо других языков.
Ты действительно не понимаешь, что приводить в качестве примера недостатка языка какую-то неудобную функцию не корректно?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Прикольно я тоже общаюсь с фанатиком. FR>Теоретизм наших уважаемых модераторов в динамике это не переход на личности а факт.
Уважемый! Ты наглый лжец. Наглый, потому
что повторяещь одну и ту же лож много раз.
Я тебе уже многораз отвечал, что имел с
динамикой дело не один раз. Один из
ASP-овайтов, написвнный мной 10 лет назад
работает по сей день. Так что я хоте бы впредь
не слышать от тебя домыслы о моих знаниях.
оооо
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, rm822, Вы писали:
R>Для примера миграция части проекта на шарп произошла исключительно из-за GUI библиотек на нете.
А почему именно нетовский GUI? Почему не java swing? Почему не дельфи? Сколько претензий я про этот нетовский GUI в своё время видел, сколько говна на него вылили за нерасширяемость и глючность! А вот свинг хвалили неоднократно за отличный дизайн и расширяемость. Отсюда и мой вопрос: видимо, на выбор конкретного языка/платформы повлияли и более другие причины.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, gandjustas, Вы писали:
G>Если брать конкретно nemerle: G>1)Когда будет спецификация языка на уровне Ecma-334?
На уровне не на уровне, то оная присутствует.
G>2)Когда появится Nemerle Team Blog или что-то в этом роде, где будут свежие новости, примеры, анонсы итп?
Вместо него http://www.rsdn.ru/forum/nemerle/
G>3)Когда будут статьи с внятными объяснениями чем макросы помогут рядовому программисту, который не компиляторы и DSL изобретает, а нечто более приземленное?
Хотя, согласен. Наверно стоит создать некую вводную статью рассказывающую о том что можно создавать с помощью макросов.
G>4)Когда появится хотябы одна книга или учебный курс по Nemerle?
Библиотеки как таковой нет. Nemerle использует .Net Framework. Ну, а описание той мелочи что есть в Nemerle.dll можно наблюдать в ObjectBrouser в VS. Как раз очень близко к МСДН-овскому описанию. В прочем, знание либы не требуется для испльзования языка.
G>6)Когда будут опубликованы скринкасты, показывающие вживую разработку на nemerle?
Я работаю над этим. Думаю первые появятся в течении месяца или в начале следующего.
G>Кстати если вы изобретаете свои фреймворки "независимые от asp.net\ado.net\что_то_там_net, то все указанное выше касается и этих фреймворков тоже.
Ну, тут до релиза пока далеко. А так, конечно обязательно будет описание. Вот пример описания
Здравствуйте, VladD2, Вы писали:
VD>Ты действительно не понимаешь, что приводить в качестве примера недостатка языка какую-то неудобную функцию не корректно?
Речь шла о том, что недостатком языка является наличие мусорного кода. А также о том, что для того, чтобы определить наличие мусорного кода, знание других языков не требуется, достаточно принципа минимума сущностей.
Склеивание строк это пример, показывающий что даже возможности имеющегося языка не используются большинством на 100% до появления стандартных библиотек, в которых эти возможности разжеваны. И это происходит именно из-за того, что большинство программистов думает заученными конструкциями языка, хотя это вовсе не требуется.
Re[25]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
FR>>Теоретизм наших уважаемых модераторов в динамике это не переход на личности а факт.
VD>Уважемый! Ты наглый лжец. Наглый, потому VD>что повторяещь одну и ту же лож много раз.
VD>Я тебе уже многораз отвечал, что имел с VD>динамикой дело не один раз. Один из VD>ASP-овайтов, написвнный мной 10 лет назад VD>работает по сей день. Так что я хоте бы впредь VD>не слышать от тебя домыслы о моих знаниях.
Во первых извиняюсь если обидел.
Во вторых давай ни будем возвращаться во времена постоянного срача, не интересно.
Ну и как же много раз я и раньше говорил я не считаю VB нормальным динамическим языком, не очень
большой опыт работы с ним у меня тоже присутствует.
Re[29]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>То есть претензия исключительно к моей манере общения, а не к квалификации? Ну хоть на том спасибо.
Я не телепат в отличии от тебя.
FR>>Спасибо за совет про скалу, но мне хватает OCaml'а и небольших доз F# там этой статики более чем достаточно.
D>Раз ты говорил о проблемах с generics, значит нормальных generics ты не видел, следовательно недостаточно. И не надо расценивать констатацию факта твоего невежества в отдельно взятом вопросе (который ты собственноручно доказал) как переход на личности — это детство какое-то. Я сам невежда в огромном количестве областей, и что? Так что повторю рекомендацию: изучи скалу. "Мне хватает того-то сего-то" — это констатация собственной лени и нежелании развиваться. Кто тебя после этого будет воспринимать всерьёз?
Нельзя объять необъятное.
Разговор был не про генерики, а про возможность статического анализа языков, то что не для всех языков это возможно показывает пример C++, этого достаточно.
D>By the way, я не знаю, что ты вкладываешь в слова "со мной можно нормально общаться". Я не вижу причин менять стиль общения с человеком, не понимающим аргументов, не желающим развиваться, не дружащим с формальной логикой, неспособным вести строго аргументированные споры, постоянно скатывающимся на обсуждение квалификации собеседника. Если честно, я вообще не вижу смысла с таким человеком общаться, но уж как-то так случилось. Положительная сторона в том, что мне не нужно строить из себя политкорректность.
Не общайся.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Отсутствуют интересные не синтетические задачи. Без практики один фиг все забудется.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, gandjustas, Вы писали:
G>>Если брать конкретно nemerle: G>>1)Когда будет спецификация языка на уровне Ecma-334?
VD>На уровне не на уровне, то оная присутствует.
Кроме синтаксиса языка есть еще семантика, а она там не описана.
G>>2)Когда появится Nemerle Team Blog или что-то в этом роде, где будут свежие новости, примеры, анонсы итп? VD>Вместо него http://www.rsdn.ru/forum/nemerle/
Форум и блог — совершенно разные вещи.
Второе стоило бы включить в "спецификацию", первое вообще говоря на обучающий материал не тянет никак — несколько ссылок на банальные статьи и на svn, который уже неактуален.
VD>Плюс: http://www.rsdn.ru/summary/3766.xml
Сравни с http://msdn.microsoft.com/en-us/fsharp/cc835246
G>>5)Когда будет справка по библиотеке nemerle и макросов на уровне MSDN?
VD>Библиотеки как таковой нет. Nemerle использует .Net Framework. Ну, а описание той мелочи что есть в Nemerle.dll можно наблюдать в ObjectBrouser в VS. Как раз очень близко к МСДН-овскому описанию. В прочем, знание либы не требуется для испльзования языка.
Самая важная часть в MSDN это секция remarks, её в object browser нету.
G>>Кстати если вы изобретаете свои фреймворки "независимые от asp.net\ado.net\что_то_там_net, то все указанное выше касается и этих фреймворков тоже.
VD>Ну, тут до релиза пока далеко. А так, конечно обязательно будет описание. VD>Вот пример описания
к одному из мощнейших макросов созданных на немерле на сегодня — PegGrammar.
Это я видел. Снова та же проблема, есть описание "что", но абсолютно не написано "зачем" и "как мне это поможет".
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, ajukraine, Вы писали:
A>I've stopped learning new languages about 6 months ago, when i've found Common Lisp... and Emacs. After that i discovered many others langs., for example, Scala, Nemerle, Python, Erlang. But I can't start learn them, because i didn't find the weakness of the CommonLisp. I'll try to get acquainted with Scala or Python, when I've found the weakness of Common Lisp.
Common Lisp is not silver bullet. Вообще, серебряных пуль нет. Зря ты застрял на Common Lisp'е. Посмотри еще на Clojure. В твоем списке я не нашел Haskell, на него обязательно стоит посмотреть. В данный момент я сам изучаю Mozart/Oz, ИМХО он тоже стоит того, чтобы его изучить.
У Common Lisp есть куча объективных/субъективных недостатков, но главным из недостатков я бы выделил то, что многие как ajukraine застревают на нем.
Computer science is no more about computers than astronomy is about telescopes (c) Edsger Dijkstra
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Профессорство за знание языков, слава богу, не дают.
Человек, преподающий программирование обязан знать множество языков.
И ответ "не хочу" на предложение прочитать статью, описывающую техники переднего края должен быть не мыслим.
Но Дворкин мне именно это и заявил.
Лаптев на предложение почитать про немерле сказал примерно тоже самое но другими словами.
V>Нужно нечто более полезное из прикладных IT-областей.
Бла-бла-бла.
V>Язык реализации — это последнее, что интересует. Вернее, не интересует никогда.
Ну да... конечно.
И после того как человек в это начинает верить получается всякая байда типа компиляторов на С.
V>Если только сама специализация не на языках, но это крайне узкая область IT и ей занят маленький % научного народу. Кстати, если ваши эксперименты действительно что-то новое и полезное дадут, дык, отбросьте лень, накатайте диссер на эту тему. Защитите хотя бы кандидатскую... По возрасту еще не очень поздно.
И нахрена оно мне надо?
Чтобы давить авторитетом уподобившись невежественным неучам с корочками?
V>Для примера, Лисп тоже весьма проблемный язык, как и Пролог, и не зря есть куда как более "продвинутые" современные их аналоги, однако же их успешно преподают на курсе "языки обработки знаний", потому как если студент поймет как работает программа на Лиспе и Прологе, он поймет и принцип работы более современных поделок.
Ага, конечно.
V>Ну и самое главное — будущего инженера надо научить учиться, а остальное — шелуха и болтовня. Дотнетов, джав и прочих технологий будет еще много, заранее всему не научишь. А классика — она вечна.
И что есть классика?
С++?
V>Во-первых, в 20 раз меньше кода — это ты переборщил.
1)Читай что написано.
2)Это факты.
Причем даже без макросов.
V>Насчет простоты поддержки... Чем более решение высокоуровневое, тем более дорогая нужна поддержка, то бишь требующая более дорогих спецов. Я пока сталкиваюсь ровно с противоположным, что мои более-менее неординарные снипетты кода ругаются более молодыми коллегами за "сложность и непонятность".
Неординарные? Ты имеешь в виду лапшу?
Не мудрено.
Вот тебе кусочек кода. https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/Nemerle.Peg.Macros/Optimizer/Optimizer.OptimizeRule.n
Прикинь как он будет выглядеть на С++.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, gandjustas, Вы писали:
VD>>На уровне не на уровне, то оная присутствует. G>Кроме синтаксиса языка есть еще семантика, а она там не описана.
Семантику можно узнать из многочисленных туториалов и статей. Кроме того она в массе свой очень близка к Шарпу. Те кто пробовал язык на практике ни разу не жаловались на трудности. Если что можно всегда спросит на форуме. Вот только спрашивают очень редко, так как проблем особо не возникает.
G>>>2)Когда появится Nemerle Team Blog или что-то в этом роде, где будут свежие новости, примеры, анонсы итп? VD>>Вместо него http://www.rsdn.ru/forum/nemerle/ G>Форум и блог — совершенно разные вещи.
Это ты себе сам эту мысль навязал. Меж тем разницы нет никакой. Цель — информирование о новых возможностях и практике применения — достигается.
G>>>4)Когда появится хотябы одна книга или учебный курс по Nemerle?
VD>>Они появились лет пять назад: VD>>http://nemerle.org/wiki/Tutorials VD>>http://nemerle.org/wiki/Courses
G>Второе стоило бы включить в "спецификацию", первое вообще говоря на обучающий материал не тянет никак — несколько ссылок на банальные статьи и на svn, который уже неактуален.
А что мне сравнивать то? У МС бабла немеренно. С ними тягаться трудно. И тем не менее факт остается фактом. Человек с сишным опытом осваиваем Немерл за время от 3-х дней до двух месяцев, а F# обычно не осваивает вовсе (бросает). Потому как сколько бы материалов не было, а для его изучения нужен перелом мозга заработать.
G>>>5)Когда будет справка по библиотеке nemerle и макросов на уровне MSDN?
VD>>Библиотеки как таковой нет. Nemerle использует .Net Framework. Ну, а описание той мелочи что есть в Nemerle.dll можно наблюдать в ObjectBrouser в VS. Как раз очень близко к МСДН-овскому описанию. В прочем, знание либы не требуется для испльзования языка. G>Самая важная часть в MSDN это секция remarks, её в object browser нету.
То что есть в док-коментах этого за глаза достаточно для понимания сути функции. Библоиотека немерла очень мала, проста и понятна. Там нет каких-то многоэтажных наворотов. Обычно это функции суть которых понятна из названия и сигнатуры.
G>>>Кстати если вы изобретаете свои фреймворки "независимые от asp.net\ado.net\что_то_там_net, то все указанное выше касается и этих фреймворков тоже.
VD>>Ну, тут до релиза пока далеко. А так, конечно обязательно будет описание. VD>>Вот пример описания
к одному из мощнейших макросов созданных на немерле на сегодня — PegGrammar. G>Это я видел. Снова та же проблема, есть описание "что", но абсолютно не написано "зачем" и "как мне это поможет".
Зачем как раз написано. Просто у нас видимо разное понимание этого слова. Для меня "зачем" описывается назначением продукта. Раз сказано парсер компьютерных языков, то их список я и сам могу представить.
А вот что ты вкладываешь в "зачем" я понять не могу.
Если тебе нужен пример применения, то опять же гугль в твоем распоряжении (например). Да и из статьи ссылки есть.
ЗЫ
В общем, похоже на то, что ты ищешь причины обосновывающие почему тебе надо не изучать что-то новое. А это исходно не конструктивная позиция. Типа "заинтересуйте меня, тогда может я проявлю милость и погляжу одним глазом". Те кому интересно осваивают язык без проблем. Материалов более чем достаточно. Ну, а те кому не надо (по причинам которые они не озвучивают) ищут псевдо-причины чтобы это не делать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Разговор был не про генерики, а про возможность статического анализа языков, то что не для всех языков это возможно показывает пример C++, этого достаточно.
Ты действительно дурак, или только притворяешься? Ты сам первый выкатил претензии к generics, на вопрос о примере указал на шаблоны C++, которые мало того что не статически типизированные, так и не generics вообще, и делаешь совершенно идиотские обобщения за гранью не то что формальной логики, но и здравого смысла. Твоё утверждение переформулируется как "статический анализ возможен не для всех языков". Ну фигли, тут ты прав, для нестатических невозможен. А сильная типизация невозможна для слабых языков, ага. Чего тебе достаточно? Ты взял в качестве примера нестатическую часть C++ и на её примере пытаешься доказать, что статика сосёт? А с нормальной статикой тебе учить лень, для тебя это "необъятное". Что ж, бывают просто невежды, а ты "невежда воюющий" — худший из подклассов. Больше мне сказать тебе нечего.
Re[30]: Что вас останавливает от изучения нового языка?
Иными словами, ты пытаешься брать худшие примеры (по факту ты берёшь примеры, вообще к теме не относящиеся) и на них пытаешься показать порочность самой идеи. Предложения ознакомиться с хорошими примерами реализации ты отклоняешь. Троллизм, демагогия и воюющее невежество. Я тебя запомнил.
Re[26]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Во первых извиняюсь если обидел.
Так просто не надо обижать. Думаю тебе будет не очень приятно, если я начну заходить в любую ветку и говорить, что твои слова ничего не стоит, так как ты никогда не использовал на практике C# и Nemerle.
FR>Во вторых давай ни будем возвращаться во времена постоянного срача, не интересно.
Ну, так и потрудись быть конструктивным. Я понимаю твою позицию, но товарищ был прав, ты действительное не приводишь никаких аргументов, а в место этого постоянно обсуждаешь чужую компетенцию в отдельных областях.
FR>Ну и как же много раз я и раньше говорил я не считаю VB нормальным динамическим языком, не очень FR>большой опыт работы с ним у меня тоже присутствует.
Ты можешь считать все что угодно. Но VBScript и JavaScript (с которыми я знаком не по наслышки) — это полноценные динамически типизированные языки и поработав с ними все надостатки динамики можно ощутить с полная.
Я не против твоих аргументов вроде того, что Руби и Питон имеют более строгую систему типов и что это хорошо.
Но принципиально это ничего не меняет. Даже если забыть про банальные ошибки дизайна вроде отсутствие явного объявления переменных (чего, кстати, нет в жабаскрипте, например), динамические проблемы никуда не деваются.
Я тебе уже сто раз говорил о них. Повторяться смысла не вижу. Динамика это приговор как для возможности сгенерировать производительный код, так и для возможности извлечения метаинформации во время разработки. Все что делают в этих областях разные ПиПи и т.п. — это не более чем попытки вытащить из общей массы нетипизированного (во время разработки) кода части которые можно статически типизировать. Но тут все очень просто. Если мы можешь вытащить значительные куски такого кода, то это уже не динамика. А раз так то глупо заниматься ужимками. Проще взять сразу статически-типизированный язык.
Немного демогогии . По сути языки вроде ОКамла и Немерла можно использовать как динамически-типизированный языки в которых все продумано для извлечения информации о типах во время компиляции и в которых есть явные средства описания необходимого динамического полиморфизма.
С динамическими языками, на мой взгляд, все очень просто. Они живут из-за двух причин:
1. Они проще в изучении, так как те самые концепции описывающие необходимый полиморфизм в них не нужны.
2. Их значительно проще реализовать и в них легче обеспечить разные приятные фичи вроде исправления кода на ходу с продолжением выполнения.
Однако пункт 2 это не более чем вопрос времени. По объему кода который необходимо написать для реализации задачи Немерл уже не уступает лучшим скриптам. Так что скрипы — это тупиковое направление. Рано или поздно появятся статически-типизированные языки которые ни в чем не будут им уступать. А преимуществ у статики и так хватает.
Скрипты уже сегодня развиваются в сторону статики. Попытки компиляции сктиптов (ПиПи и гуглевые наработки) — это и есть движение в эту сторону.
Так что ты можешь говорить все что угодно. Но по сути Вольфхаунд прав. Просто он максималист и не различает оттенков. Он всегда говорит о светлом будущем. А мы живем в сером настоящем. Но даже в нем статика рулит. И чем больше проект тем больше она рулит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
VD>>Ты действительно не понимаешь, что приводить в качестве примера недостатка языка какую-то неудобную функцию не корректно?
U>Речь шла о том, что недостатком языка является наличие мусорного кода.
Ну, то есть ты просто не умеешь правильно мыслить?
U>А также о том, что для того, чтобы определить наличие мусорного кода, знание других языков не требуется, достаточно принципа минимума сущностей.
Ты несешь несусветуню чушь. Если проблема может быть решена введением дополнительной фукнции, то это не проблема языка, а проблема библиотеки. Заметь, в 4-ом фрэймворке ее решили без изменения зыка.
U>Склеивание строк это пример, показывающий что даже возможности имеющегося языка не используются большинством на 100% до появления стандартных библиотек, в которых эти возможности разжеваны. И это происходит именно из-за того, что большинство программистов думает заученными конструкциями языка, хотя это вовсе не требуется.
Ты можешь показывать все что угодно. Это не относится к делу. Я вот строки склеиваю вот так:
$"Items: ..$itemsAsString"
и на Nemerle так делают все.
Что до мышления заученными конструкциями, то новые языки и надо изучать чтобы знать как можно делать по дргому. Даже если ты начинаешь писать на старом языке, где нет спец.конструкций, ты все же будешь лучшим программистом, так как твой список "заученных конструкций" будет шире.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Что вас останавливает от изучения нового языка?
D>Ты действительно дурак, или только притворяешься?
Да я действительно дурак, так как продолжаю с тобой общаться.
D>Ты сам первый выкатил претензии к generics, на вопрос о примере указал на шаблоны C++, которые мало того что не статически типизированные, так и не generics вообще,
Нет, все началось с этой фразы:
А что в статически типизированных языках обобщенный код уже отменили?
WolfHound'а. Generic'и появились только в твоем воспаленном воображении, про них разговора не было.
D>и делаешь совершенно идиотские обобщения за гранью не то что формальной логики, но и здравого смысла. Твоё утверждение переформулируется как "статический анализ возможен не для всех языков". Ну фигли, тут ты прав, для нестатических невозможен.
Конечно имелось в виду "полный статический анализ возможен не для всех статически типизированных языков".
D>А сильная типизация невозможна для слабых языков, ага. Чего тебе достаточно? Ты взял в качестве примера нестатическую часть C++ и на её примере пытаешься доказать, что статика сосёт?
Кто-то тут про невежество втирал, да ладно, шаблоны статическая часть C++ выполняются только в compile time в рантайме их не существует.
D>А с нормальной статикой тебе учить лень, для тебя это "необъятное". Что ж, бывают просто невежды, а ты "невежда воюющий" — худший из подклассов. Больше мне сказать тебе нечего.
Не надо пороть чушь, я пишу на OCaml конечно не так много как хотелось бы, но вполне регулярно. Хотя что говорить сильно вежественному человеку который OCaml в глаза не видел.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Что до мышления заученными конструкциями, то новые языки и надо изучать чтобы знать как можно делать по дргому. Даже если ты начинаешь писать на старом языке, где нет спец.конструкций, ты все же будешь лучшим программистом, так как твой список "заученных конструкций" будет шире.
Если мыслишь заученными конструкциями, то заучив новые конструкции, станешь всего лишь более знающим бараном. К умению думать владение заученными конструкциями не имеет никакого отношения. А умение думать строится на совершенно других принципах, в частности на принципе минимума сущностей. Но само по себе изучение других языков никак освоить эти принципы не помогает.
VD>Ты несешь несусветуню чушь. Если проблема может быть решена введением дополнительной фукнции, то это не проблема языка, а проблема библиотеки. Заметь, в 4-ом фрэймворке ее решили без изменения зыка.
Пример со string.Join показывал, что очень часто проблема мусорности кода может быть решена средствами имеющегося языка. Но в силу привычки думать заученными конструкциями программисты просто не замечают, что данный код является мусорным, и соответственно не ищут способа избавиться от этого мусорного кода.
Re[32]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
D>>Ты сам первый выкатил претензии к generics, на вопрос о примере указал на шаблоны C++, которые мало того что не статически типизированные, так и не generics вообще, FR>Нет, все началось с этой фразы:
FR>
FR>А что в статически типизированных языках обобщенный код уже отменили?
FR>WolfHound'а. Generic'и появились только в твоем воспаленном воображении, про них разговора не было.
Ок, было вот что:
FR>>Так с анализом обобщенного когда и в статике проблематично.
D>В самом деле? Пример дашь? А я в ответку решение на скале без проблем.
Чуть выше показали на шаблонах C++.
Суть от этого не меняется: ты пытаешься притянуть за уши нестатическую часть C++ в качестве доказательства проблем со статикой.
FR>Конечно имелось в виду "полный статический анализ возможен не для всех статически типизированных языков".
Недостатки конкретной реализации не являются подтверждением недостатков самой идеи. Хотя бы это тебе понятно, или твоя цель — много и бессмысленно троллить?
FR>Кто-то тут про невежество втирал, да ладно, шаблоны статическая часть C++ выполняются только в compile time в рантайме их не существует.
Тут уже двое отписали — WolfHound и adontz — что шаблоны C++ НЕстатические. Я тебе уже минимум дважды предлагал ознакомиться с полноценной статической реализацией генериков. Как об стенку горох. Ты для чего, как заведённый, повторяешь одну и ту же мантру, которую уже сто раз опровергли, а?
D>>А с нормальной статикой тебе учить лень, для тебя это "необъятное". Что ж, бывают просто невежды, а ты "невежда воюющий" — худший из подклассов. Больше мне сказать тебе нечего.
FR>Не надо пороть чушь, я пишу на OCaml конечно не так много как хотелось бы, но вполне регулярно. Хотя что говорить сильно вежественному человеку который OCaml в глаза не видел.
При чём здесь твой окалм? О нём речь вообще не идёт. Начинаем сначала:
1) ты защищал динамику, утверждая, что её недостатки, описываемые немерлистами, несущественны.
2) в ответ на просьбы указать преимущества динамики ты не смог сказать ничего.
3) когда зашла речь о том, что тесты не дают никаких гарантий, ты стал утверждать, что статика тоже не даёт гарантий.
4) когда тебя попросили привести пример заявленных тобой проблем статики, ты привёл пример шаблонов C++.
5) два C++ника ответили, что шаблоны в C++ — это не статика.
6) ты скорректировал своё утверждение: "полный статический анализ возможен не для всех статически типизированных языков". В новой редакции оно эквивалентно следующему: "существуют статически-типизированные языки, в которых невозможен полный статический анализ". Что ни коим образом не доказывает порочность самой концепции, т.к. не отрицает существования языков, в которых этот самый полный статический анализ возможен. Согласен?
Re[27]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Так просто не надо обижать. Думаю тебе будет не очень приятно, если я начну заходить в любую ветку и говорить, что твои слова ничего не стоит, так как ты никогда не использовал на практике C# и Nemerle.
Можешь, я на самом деле их не знаю, но блин что-то F# начинает меня затягивать, а там NET совсем пропаду
VD>Ну, так и потрудись быть конструктивным. Я понимаю твою позицию, но товарищ был прав, ты действительное не приводишь никаких аргументов, а в место этого постоянно обсуждаешь чужую компетенцию в отдельных областях.
Тык он тоже, ладно замнем.
VD>Ты можешь считать все что угодно. Но VBScript и JavaScript (с которыми я знаком не по наслышки) — это полноценные динамически типизированные языки и поработав с ними все надостатки динамики можно ощутить с полная.
Угу настолько сполна, что и достоинства можно не увидеть.
VD>Я не против твоих аргументов вроде того, что Руби и Питон имеют более строгую систему типов и что это хорошо. VD>Но принципиально это ничего не меняет. Даже если забыть про банальные ошибки дизайна вроде отсутствие явного объявления переменных (чего, кстати, нет в жабаскрипте, например), динамические проблемы никуда не деваются.
VD>Я тебе уже сто раз говорил о них. Повторяться смысла не вижу. Динамика это приговор как для возможности сгенерировать производительный код, так и для возможности извлечения метаинформации во время разработки. Все что делают в этих областях разные ПиПи и т.п. — это не более чем попытки вытащить из общей массы нетипизированного (во время разработки) кода части которые можно статически типизировать. Но тут все очень просто. Если мы можешь вытащить значительные куски такого кода, то это уже не динамика. А раз так то глупо заниматься ужимками. Проще взять сразу статически-типизированный язык.
Ладно не будем повторятся и ходить по кругу, можно было бы про ту же абстрактную интерпретацию поговорить, но лучше в отдельной не срачной теме.
VD>Немного демогогии . По сути языки вроде ОКамла и Немерла можно использовать как динамически-типизированный языки в которых все продумано для извлечения информации о типах во время компиляции и в которых есть явные средства описания необходимого динамического полиморфизма.
Можно, но как замена скриптам не очень удобно, типы приходится объявлять, шума больше. Вот динамический жестко функциональный язык, притом не сильно специализированный как эрланг не помешал бы. Вот за pure я слежу, и пока как-то не получилось посмотреть то что Воронков ваяет.
VD>С динамическими языками, на мой взгляд, все очень просто. Они живут из-за двух причин: VD>1. Они проще в изучении, так как те самые концепции описывающие необходимый полиморфизм в них не нужны. VD>2. Их значительно проще реализовать и в них легче обеспечить разные приятные фичи вроде исправления кода на ходу с продолжением выполнения.
Легкое метапрограммирование тоже одна из причин, особенно у руби.
VD>Однако пункт 2 это не более чем вопрос времени. По объему кода который необходимо написать для реализации задачи Немерл уже не уступает лучшим скриптам. Так что скрипы — это тупиковое направление. Рано или поздно появятся статически-типизированные языки которые ни в чем не будут им уступать. А преимуществ у статики и так хватает. VD>Скрипты уже сегодня развиваются в сторону статики. Попытки компиляции сктиптов (ПиПи и гуглевые наработки) — это и есть движение в эту сторону.
Ну и динамика тоже проникает в статические языки, так что вполне возможно будут рулить гибриды.
VD>Так что ты можешь говорить все что угодно. Но по сути Вольфхаунд прав. Просто он максималист и не различает оттенков. Он всегда говорит о светлом будущем. А мы живем в сером настоящем. Но даже в нем статика рулит. И чем больше проект тем больше она рулит.
Угу, но это как коммунизм, всегда в будущем
Re[33]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Тут уже двое отписали — WolfHound и adontz — что шаблоны C++ НЕстатические. Я тебе уже минимум дважды предлагал ознакомиться с полноценной статической реализацией генериков. Как об стенку горох. Ты для чего, как заведённый, повторяешь одну и ту же мантру, которую уже сто раз опровергли, а?
Типизация выполняется полностью на этапе компиляции.
Но из-за того что отсутствуют типы типов ошибка компиляции появляется черт знает где, а не там где она действительно произошла.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Можешь, я на самом деле их не знаю, но блин что-то F# начинает меня затягивать, а там NET совсем пропаду
Ну, ну. А там и до немерла рукой подать.
VD>>Ты можешь считать все что угодно. Но VBScript и JavaScript (с которыми я знаком не по наслышки) — это полноценные динамически типизированные языки и поработав с ними все надостатки динамики можно ощутить с полная.
FR>Угу настолько сполна, что и достоинства можно не увидеть.
Не боись. Руби и (от части) Питон я поизучал. На практике не применял, так как не было задач и желания. Но с их возможностями в общем знаком. Потом ты мне про них уже который год рассказываешь .
Так что я в курсе достоинств. Но как я уже говорил оные (в большей части) не есть привилегия именно динамики. Просто делать статику куда сложнее. Но время работает на статику.
FR>Ладно не будем повторятся и ходить по кругу, можно было бы про ту же абстрактную интерпретацию поговорить, но лучше в отдельной не срачной теме.
"абстрактную интерпретацию" это глупость. На самом деле — это не более чем процесс типизации. Типизатор немерла, окамла или фшарпа делает тоже самое. Он бежит по программе и пытается виртуально ее выполнить попутно вычисляя типы.
Тут проблема в том, что если в язык сразу не заложить детерминизм типов и явного описания полиморфизма, то твой "абстрактный интерпретатор" будет постянно нарываться на места в которых он не сможет сделать вывод типов. И чем больше будут применяться прелести динамики (МП на прототипах, кодогенерация, ...), тем меньше толка от подобных начинаний.
VD>>Немного демогогии . По сути языки вроде ОКамла и Немерла можно использовать как динамически-типизированный языки в которых все продумано для извлечения информации о типах во время компиляции и в которых есть явные средства описания необходимого динамического полиморфизма.
FR>Можно, но как замена скриптам не очень удобно, типы приходится объявлять, шума больше.
А ты не говори пока не попробовал. Многие используют Немерл именно как скрипты. На работе не дают писать на немерле подакшн, так они используют его для генерации чего-то или для автоматизации.
Если человек знаком с АПИ дотнета, то для него такой скрипт получается куда выгоднее нежели использование настоящих скриптов, потому как объем кода то же, а затрат времени меньше (не надо изучать новый АПИ). Плюс поддержка IDE, человеческая отладка и высокая скорость исполнения. Почти идеальный скрип... как бы это не звучало странно для тебя.
У F# так вообще есть специальный формат файлов для этого. И вообще его просто таки пропагандируют как скриптовый язык.
FR>Вот динамический жестко функциональный язык, притом не сильно специализированный как эрланг не помешал бы. Вот за pure я слежу, и пока как-то не получилось посмотреть то что Воронков ваяет.
Тебе может и не помешал бы. А я искренне не вижу в нем нужды. Ну, а без IDE я жить не хочу, так же как не хочу жить без многих повседневных сервисов вроде газа и электричества.
FR>Легкое метапрограммирование тоже одна из причин, особенно у руби.
Вот это уж "дудки". Я даже готов согласиться, что МП в Немерле не очень то просто. Но это ни разу не означает, что его нельзя сделать проще. А по возможностям МП немерле не уже любого другого из динамического языка. При этом есть ряд преимуществ. Самое важное, на мой взгляд, это скорость работы макроса и порождаемого им кода. Именно она дает возможность делать вещи недоступные на сктиптах. Скажем повторить PegGrammar на Питоне ты не сможешь в принципе, так как ты не достигнешь требуемой производительности.
Можно конечно мешать скрипты с низкоуровневыми компилируемыми языками вроде С, но тогда встает вопрос — а зачем оно надо? Ведь от сктиптовой легкости при этом не остается и следа. А того же самого можно добиться в рамках одного языка чей уровень не ниже скриптового, а производительность на уровне компилируемого.
FR>Ну и динамика тоже проникает в статические языки, так что вполне возможно будут рулить гибриды.
Динамика была в статических языках всегда. Просто в том же шарпе ее попытались рассахарить и упростить.
Тут с одной стороны нельзя не согласиться, но с другой статус динамики в статических языках далеко не тот, что статики в динамических. Если в динамических авторы пытаются разными не научными методами вытащить "зашифрованную" статику из динамики, то в случае динамики в статике имеет место более явного декларирования намерений. Так что это сравни превращению паттернов в языковые конструкции (ну, типа превращение for-а для перебора коллекции в foreach). Так что, и да, и нет.
VD>>Так что ты можешь говорить все что угодно. Но по сути Вольфхаунд прав. Просто он максималист и не различает оттенков. Он всегда говорит о светлом будущем. А мы живем в сером настоящем. Но даже в нем статика рулит. И чем больше проект тем больше она рулит.
FR>Угу, но это как коммунизм, всегда в будущем
В данном случае — это не утопия. Просто нужно время и ресурсы чтобы его построить. И умным людям лучше было бы не тратить время на срачи между собой, а объединить усилия и попытаться приблизить это будущее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, alvas, Вы писали:
A>>По твоим прогнозам когда ожидается релиз?
VD>Немерла то? Да вчера. Мы сейчас уперлись в то, что к релизу хотим подправить заглавную страницу сайта и выложить кое какой материал на анлгиском.
Здравствуйте, FR, Вы писали:
D>>adontz говорил "В шаблонах Си++ структурная типизация." WolfHound — "В С++ типы динамически типизированы. Вот у нас есть template<class T>. И это все что у нас есть. Про тип T мы ничего не знаем пока его нам не дадут и мы не начнем компилировать данный шаблон с данным типом." Про статику никто из них не говорил.
FR>Любой C++ знает что шаблоны это статика.
А как быть с вышепроцитированными C++-никами, которые этого не знают и утверждают обратное?
FR>>>Тебе читать хотя бы Вандервуда "Шаблоны С++". D>>Не интересно. Ты в состоянии сам логично и последовательно объяснить, почему они — статика? Вышеупомянутые персоны не гнушаются аргументировать свои утверждения, чем ты хуже? FR>Ты не просил. Это общеизвестная вещь.
Я и книгу не просил. Но если ты хочешь, чтобы спор был аргументированный, изволь приводить аргументы сам. Итак?
FR>>>Это статический жестко типизированный язык, обобщенное программирование в нем тоже есть. D>>И что? FR>То что статику я знаю вполне нормально.
А generics с вариантностью и upper/lower bounds в окалме есть?
Пример lower bound на скале:
trait Animal {
def feed(...)
}
class Elephant extends Animal {
def feed(...) {
// ...
}
}
class ZooCage[A <: Animal] (a: A) {
// ....
a.feed(...)
}
new ZooCage(new Elephant)
Здесь запись [A <: Animal] означает "generic-тип A, являющийся подтипом Animal". Благодаря этому внутри generic-класса ZooCage компилятор имеет информацию о супертипе A и в состоянии проверить корректность вызова метода a.feed(). А при инстанциировании ZooCage с конкретным аргументом выполняется проверка, что A=Elephant удовлетворяет условию A <: Animal. Полный контроль, в отличие от шаблонов C++.
D>>Не придирайся к словам. Программирования — это практическая дисциплина. Теория никого не интересует. FR>Тут это очень важно, это основное из-за чего у нас и идет весь этот спор динамика vs статика.
Ещё раз: тут все говорят исключительно о практике, теория никого не интересует. Ты уже извинился перед Владом за то, что врал, называя его теоретиком, не работавшим на динамических языках?
D>>Просьба шла от WolfHound: "Ну так где аргументы то? Есть только один: Меньше кода. Но это по сравнению с жабой меньше. А по сравнению с немерле экономии почти нет. А какие еще? Ну, хоть один." FR>Ему отвечать бессмысленно, проверенно уже больше чем за пять лет.
Читал я многое из ваших споров. Ему, как разработчику немерла, действительно был бы интересен конструктив, в качестве посылок для определения направлений развития языка. Тебе просто нечего ему ответить. Но сейчас суть не в этом, а в том, что твой предыдущий ответ "не видел просьб, только нападки тролля" — очередное враньё. Просьбы-то, оказывается, были.
D>>>>4) когда тебя попросили привести пример заявленных тобой проблем статики, ты привёл пример шаблонов C++. FR>>>Который вполне релевантный. D>>Нет. FR>Да.
Как быть с вышепроцитированными C++-никами, которые не считают шаблоны статикой? Напиши здесь пожалуйста и для них тоже аргументацию, почему ты считаешь их статикой.
FR>По твоим словам чуть выше видно что ты не писал на шаблонах C++. FR>Троллить еще не устал, справедливый ты наш?
Очередной съезд на личности. Аргументы будут?
D>>Тогда что ты пытаешься доказать? FR>Я ничего, пытаюсь отбиться от тролля, чистая самозащита.
Лучший способ избавиться от тролля — это перевести разговор в конструктивное русло, давать грамотные аргументы. Поскольку ты себя этим не отягощаешь, троллем выступаешь именно ты. Но я очень надеюсь, что аргументы рано или поздно наконец появятся. Итак?
Re[37]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
FR>>Любой C++ знает что шаблоны это статика. D>А как быть с вышепроцитированными C++-никами, которые этого не знают и утверждают обратное?
Ок, каюсь. Возвращаемся к истокам, с которых всё началось: ты же не будешь спорить с тем, что шаблоны C++ — далеко не самый удачный пример статической типизации, и что по ним нельзя утверждать о том, что проблемы со 100% контролем типов в обобщённом программировании присущи всей статике как таковой?
Re[40]: Что вас останавливает от изучения нового языка?
D>>Ок, каюсь. Возвращаемся к истокам, с которых всё началось: ты же не будешь спорить с тем, что шаблоны C++ — далеко не самый удачный пример статической типизации, и что по ним нельзя утверждать о том, что проблемы со 100% контролем типов в обобщённом программировании присущи всей статике как таковой?
A>Я утверждаю, что: A>1) Статическая типизация не гарантия относительной лёгкости построения средств рефакторинга. A>2) Динамическая типизация не гарантия относительно сложности построения средств рефакторинга. A>и надо каждый язык рассматривать отдельно.
Ты здесь рассматриваешь языки как нечто, данное свыше. В таком случае надо говорить не о статической и динамической типизации как таковых, а об их реализациях в конкретных языках. Реализации эти могут быть в той или иной степени гибридными или компромиссными. Я же стою на той точке зрения, что язык — это не данность, и если в каком-то языке статика реализована криво, я не буду уподобляться мартышке "и тот дурак, кто слушает людских всех врак", а почитаю, что люди пишут, чтобы отделить принципиальные недостатки от недостатков реализации, а затем поищу язык, свободный от устранимых недостатков — в частности, язык, в котором статика реализована лучше.
1) В конкретном C++ статическая типизация не гарантия относительной лёгкости построения средств рефакторинга, потому что она там реализована криво и не полностью. Это недостаток не статики, это недостаток языка, одна из подсистем которого отрабатывает почти так же тупо, как текстовый препроцессор, и никакой статикой в момент её отработки не пахнет, как не пахнет ею во время работы препроцессора — несмотря на то, что ошибки в текстовых макросах вылезут на более поздних этапах.
я привожу скалу, где реализация generics даёт 100% гарантии согласованности типов. Вот здесь — статическая типизация в полный рост: компилятор имеет достаточно информации для проверок и внутри generic-классов, и в контексте, где эти классы используются.
Ещё один хороший пример плохой статики в generics — это java; в ней разработчики языка намеренно шли на нарушение математической строгости ради упрощения и снижения порога вхождения. В результате на java generics нельзя сделать и десятой доли того, что можно сделать в scala, и на java очень часто приходится обращаться к existential types (generic от произвольного типа). Проверка типов, естественно, сосёт.
2) По второму пункту ты неправ. Динамическая типизация — именно что гарантия сложности построения средств рефакторинга. Потому что у IDE нет надёжной информации о типах во всех частях системы. Свой опыт я описал здесь
Здравствуйте, vdimas, Вы писали:
Z>>По сравнению с Nemerle, C# ограниченный императивный язык.
V>От задач зависит. По сравнению с Прологом на некоторых задачах Nemerle — макро-ассемблер.
Аналогия не верна. ПМ используется во всех проектах и используется очень широко. Логический решатель — узкая ниша.
Впрочем Nemerle тут тоже рулит, если в проекте требуется делать логические выводы, вполне можно прикрутить пролог и использовать его, бесшовно встраивая в основной код.
Re[38]: Что вас останавливает от изучения нового языка?
Идею про статическую структурную типизацию уловил, спасибо, но оценить в сравнении с номинативной не могу. И раньше как-то пропускал мимо ушей, если оно обсуждалось. Я правильно понимаю, что классы как синтаксический сахар нужны, чтобы не описывать повторяющуюся сигнатуру параметров? Т.е. если у нас есть, например, несколько фасадных методов, выполняющих сложные действия над однотипными параметрами и соответственно требующих, чтобы у типа параметра была объявлена прорва методов, описывать каждый раз эту прорву охренеешь, а класс — как раз шоткат для этой прорвы, так?
Кстати, на duck typing смахивает. Это оно и есть, или чем-то отличается? Duck typing я не люблю: им легко злоупотреблять, как и динамикой. Вот в этом adontz-овом примере
видно, что переименование метода в одном классе потянет за собой переименование метода в другом, никак с не связанном с исходным. Ещё пример: мне не так давно доводилось рефакторить сложную развесистую структуру (одних классов штук 30) — мапить на ORM вместо сериализации в блоб. Там один из классов оказался вне своей иерархии из-за желания разработчика приктунть в него на тяп-ляп какую-то специфическую хрень, с базовым классом несовместимую. Был заюзан duck typing. При мапинге, разумеется, полезли проблемы с подгрузкой полиморфных ссылок. Пришлось расхерачивать логику, вместо чисто механического рефакторинга.
Вообще, как по мне, чем больше ограничений, тем лучше. Дисциплинирует. И самое смешное, что результат, как ни странно, на статике выходит качественней, при всех её ограничениях. Свою lib.web forms, разработанную для скалы, я без проблем перенёс на PHP один в один; она потеряла в компактности синтаксиса (например, мои валидаторы на скале используются так: VRequired & VInt & VRange(0, 100)) и в контроле типов (в примере с валидаторами их невозможно даже местами поменять; к примеру, компилятор ругнётся на VRange перед VInt; так что ошибиться при использовании моих валидаторов на скале просто невозможно :-P ), но сохранила расширяемость: я потом на неё довешивал клиентскую валидацию, зависимости (транзитивные и рекурсивные), ajax-подгрузку зависимых полей в одном запросе — чего я только с ней не делал, архитектура выдержала. Обратно — хрен, мой тогдашний шеф PHP-шник, избалованный динамикой, начал пытаться валидацию на скале сделать — и хихикал-плакался "блин, сложно-то как, всюду ограничения". Повторюсь, к структурной типизации это может и не иметь никакого отношения, я её не юзал. Просто что знаю, то и пишу.
FR>В общем предлагаю перестать нападать друг на друга
Мир.
Re[39]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Идею про статическую структурную типизацию уловил, спасибо, но оценить в сравнении с номинативной не могу. И раньше как-то пропускал мимо ушей, если оно обсуждалось. Я правильно понимаю, что классы как синтаксический сахар нужны, чтобы не описывать повторяющуюся сигнатуру параметров? Т.е. если у нас есть, например, несколько фасадных методов, выполняющих сложные действия над однотипными параметрами и соответственно требующих, чтобы у типа параметра была объявлена прорва методов, описывать каждый раз эту прорву охренеешь, а класс — как раз шоткат для этой прорвы, так?
Ну можно и так наверно сказать.
Еще они нужны для наследования (включая и множественное) реализации и когда нужна параметризация.
База же в ОО системе OCaml'а это объект, например можно спокойно объявлять анонимные объекты.
D>Кстати, на duck typing смахивает. Это оно и есть, или чем-то отличается? Duck typing я не люблю: им легко злоупотреблять, как и динамикой. Вот в этом adontz-овом примере
видно, что переименование метода в одном классе потянет за собой переименование метода в другом, никак с не связанном с исходным. Ещё пример: мне не так давно доводилось рефакторить сложную развесистую структуру (одних классов штук 30) — мапить на ORM вместо сериализации в блоб. Там один из классов оказался вне своей иерархии из-за желания разработчика приктунть в него на тяп-ляп какую-то специфическую хрень, с базовым классом несовместимую. Был заюзан duck typing. При мапинге, разумеется, полезли проблемы с подгрузкой полиморфных ссылок. Пришлось расхерачивать логику, вместо чисто механического рефакторинга.
Я раньше тоже с утиной типизацией путал, но все-таки это разные вещи, хотя структурная типизация некоторую динамику все-равно привносит.
Насчет примера adontz, проблема в С++ в том что из описания шаблона параметризующий тип T вывести практически невозможно, шаблон работает наоборот
методом подстановки, в OCaml же тип выводится компилятором, он известен хоть и сильно обобщен. Дальше остается проблема какие именно из несвязанных
друг с другом классов нужно переименовывать, понятно что те что вызываются нашим "шаблоном" необходимо, а вот что делать с теми которые структурно
соответствуют, но сейчас "шаблоном" не вызываются мне не очень понятно. Но при этом после такого рефакторинга все останется в нормальном компилируемом
состоянии, в C++ это обеспечить будет намного сложнее.
D>Вообще, как по мне, чем больше ограничений, тем лучше. Дисциплинирует. И самое смешное, что результат, как ни странно, на статике выходит качественней, при всех её ограничениях. Свою lib.web forms, разработанную для скалы, я без проблем перенёс на PHP один в один; она потеряла в компактности синтаксиса (например, мои валидаторы на скале используются так: VRequired & VInt & VRange(0, 100)) и в контроле типов (в примере с валидаторами их невозможно даже местами поменять; к примеру, компилятор ругнётся на VRange перед VInt; так что ошибиться при использовании моих валидаторов на скале просто невозможно :-P ), но сохранила расширяемость: я потом на неё довешивал клиентскую валидацию, зависимости (транзитивные и рекурсивные), ajax-подгрузку зависимых полей в одном запросе — чего я только с ней не делал, архитектура выдержала. Обратно — хрен, мой тогдашний шеф PHP-шник, избалованный динамикой, начал пытаться валидацию на скале сделать — и хихикал-плакался "блин, сложно-то как, всюду ограничения". Повторюсь, к структурной типизации это может и не иметь никакого отношения, я её не юзал. Просто что знаю, то и пишу.
По мне нужно уметь писать по разному, и почти без ограничений и на жестких языках.
Ну и для меня прототипы намного приятней писать используя динамику.
Re[35]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Да не очень то. Проблемы динамики носят системный характер (потеря информации о типах вызвана самой динамикой). Проблемы шаблонов С++ вызваны проектным решением. По сути это ошибка дизайна. Можно было бы выбрать дизайн не приводящий к проблемам.
Угу, но учти историю развития этого добра. Там же все по Дарвину фактически
VD>К тому же в следствии того, что С++ статически-типизированный язык все же получать информацию о типах в шаблонах таки можно. Просто делать это придется в рамках конкретных воплощений. Рефакторинг для С++ так же возможен (и даже имеется кое где), хотя и сложен. Но сложности эти в основном носят вычислительный характер.
Проблема в том что похоже задача теоретически или неразрешима или очень сложна.
На практике да кое-что получается.
FR>>Нет, один из них такого не говорил, ну и плюс я сам C++ник, а ты можешь пока постоять в сторонке.
VD>Да и первый тоже. Вольфхаунд сказал загадочную фразу о нитипизированости типов в С++. Это совсем не то что С++ не типизированн.
Угу куда-то в метатипы забрался.
VD>На самом деле все встает на свои места когда начинаешь думать о шаблонах С++ не как об обобщенных типах (которыми они являются с большой натяжкой), а как о синтаксическом препроцессоре. Фактически шаблоны не используются как тип. Воплощение шаблона (часто называемое дебильным словом "инстанциация") ни что иное как процесс копирования АСТ шаблона и замена параметров типов на реальные значения. Таким образом речь идет о процессе чуть более вменяемом чем текстуальная подстановка. Такой процесс нормален для метапрограммирования (тех же макросов), но не для системы типов. Отсюда и все проблемы.
Как аналогия да похоже, в реале там еще сложнее есть зависимость от контекста, SFINAE и т. п.
VD>Однако воплощенный шаблон — это вполне себе законченный тип в котором можно делать проверки типов.
VD>Вольфхаунд указывает на то, что такие проверки делаются не на самом шаблоне, а на его воплощении, что приводит к тому, что сообщения об ошибках появляются не тогда когда компилируется шаблона, а в совсем в другое время. Зачастую у пользователя шаблона.
VD>Именно это препятствует созданию полноценного рефакторинга для С++. Но все же это усложняет задачу, а не делает ее невозможной. Ну, и слабая типизация, конечно, в следствии которой в С++ спокойно можно обмануть систему типов.
Ну тут уровень сложности похоже не меньше чем для динамики.
На практике точно, тот же PyDev в среднем получше рефакторит чем VA.
Re[36]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Ну тут уровень сложности похоже не меньше чем для динамики. FR>На практике точно, тот же PyDev в среднем получше рефакторит чем VA.
Еще раз. Нельзя сравнивать уровень сложности (какой бы он не был) с отсутствием возвожности в следствии потери информации.
В С++ информация появляется во время воплощения шаблона. Да поздновато, но это все же время компиляции. В динамике же информация о типах появляется только рантайме. И более того ее появление никак не влияет на тот факт, что в следующий раз типы могут быть другие.
Так что для динамики можно говорить исключительно о шаманстве и попытках вывести хоть что-то.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Лаптев сказал, если я не путаю, что синтаксическим макросам сто лет в обед.
Лаптев много говорит. Но по его же словам отчетливо видно, что он не понимает то о чем говорит. Его уровень — это императивный язык. К сожалению подняться выше он не то что не может, но даже не хочет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Что вас останавливает от изучения нового языка?
Да ты шутник, однако. Только форумом ошибся. Тебе нужно в юмор.
2 WolfHound: Когда ты поймешь, что показывать примеры кода можно только тем, кто их понимает. Ты думешь, что что-то там обосновываешь, а человек тупо нихрена не понимает. Он в жини только if-ы освоил. И твои примеры для него — это еще один енпонятный набор крокозябр.
ГВ>Не, знаешь, такой ценой добиваться сокращения объёма кода — это себе дороже.
Ген, это те когда не знаешь что читаешь, то не выступай. А то ну совсем же ведь ламером себя выставляешь. В этом коде никто не пытался сделать что-то нарочито коротко. В нем, просто, решается весьма не тривиальная задача — оптимизация гамматик. В нормальном виде эту задачу на простом языке не описать. Тут единственное нормальное решение было бы создание специализированного ДЛС-я с поддержкой паттерн-матчинга в терминах прикладной задачи. А на if-ах или ООП тут будет просто жопа. Кода будет раз в 5 больше и он будет абсолютно не читаем. А этот код ты прочесть не можешь только потому, что не знаешь ПМ и язык.
ГВ>Пусть код будет втрое длиннее, но хоть сгруппировали бы по ветвлениям одного уровня. Это был раз. А два, я, например, не вижу принципиальной разницы между:
ГВ>
else if (match(rule, Not(Not())) { return optimize(And(r.Location, rule)); }
Ген. Не моли чушь просто от того, что ты не понимашь написанного. Ну это же бред.
Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках:
if (r is Rule.Not)
{
var rNot = (Rule.Not)r;
if (rNot.rule is Rule.Not)
{
var rule = (Rule.Not)rNot.rule;
return optimize(new Rule.And(r.Location, rule));
}
}
Но тут есть пара особенностей.
1. В привычных тебе языках оптимизация концевой рекурсии не гарантируется, так что для корректной реализации тебе придется заменить вложенную функцию на цикла и стек (с ручной манипуляцией этим стеком).
2. Компилятор немерла работает не с объектами, а свариантами. Это позволяет ему контролировать, что match-и обрабатывают все возможные сочетания. В твоем случае такая проверка невозможна в приципе.
Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель. Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше.
Так что насмехаешься и горлопанишь ты тут исключительно от своей невежественности. Ну, а приведенный тобой "код" просто нерабочий.
ГВ>Так что, подозреваю, что в изображении подобного кода на C++ ничего чудовищного не будет.
Ну, ты давай подтяни ФП. Тогда и подозревать не придется.
Так для справки. Обрезанный компилятор C# (из SS CLI) написанный на С++ Майрософтом занимает 5 мег. Компилятор Немерле ~2. И это при том, что язык сложнее в разы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>А ну-ка, что у нас тут на передовом крае: V>
V>Gandy, Robin O. The simple theory of types. In Logic Colloquium 76, volume 87 of Studies in Logic and the Foundations of Mathematics, pages 173–181. North Holland, 1976.
V>Whitehead, Alfred North and Bertrand Russell. Principia Mathematica. Cambridge University Press, Cambridge, 1910. Three volumes (1910; 1912; 1913).
V>Ramsey, Frank P. The foundations of mathematics. Proceedings of the London Mathematical Society, Series 2, 25 (5): 338–384, 1925. Reprinted in (Braithwaite, 1931).
V>Church, Alonzo. A formulation of the simple theory of types. Journal of Symbolic Logic, 5: 56–68, 1940.
V>Martin-Löf, Per. An intuitionistic theory of types: predicative part. In H. E. Rose and J. C. Shepherdson, editors, Logic Colloquium, ’73, pages 73–118. North-Holland, Amsterdam, 1973.
V>Martin-Löf, Per. Intuitionistic Type Theory. Bibliopolis, 1984.
V>Berardi, Stefano. Towards a mathematical analysis of the Coquand-Huet calculus of constructions and the other systems in Barendregt’s cube. Technical report, Department of Computer Science, CMU, and Dipartimento Matematica, Universita di Torino, 1988.
V>Barendregt, Henk P. Lambda calculi with types. In Abramsky, Gabbay, and Maibaum, editors, Handbook of Logic in Computer Science, volume II. Oxford University Press, 1992.
Какой, к чертям, это передний край? Это до ML-ная эра. И дажее ее наши професоры не осилили пока что. Так о чем ты говоришь то?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>А теперь представь, что есть язык который позволяет большую часть таких паттернов (в том числе и паттернов-проектирования) запихнуть в библиотеки и использовать где надо. Вместо тщательного выпиливания канонов паттерна ты просто декларируешь его применение и задаешь (тоже декларативно) нужные параметры. А все остальное автоматически выпиливает компилятор по программе называемой "макрос" (не путать с сишными текстуальными макросами). И более того, такие "программы" для компилятора ты можешь создавать сам.
VD>Не уж-то это не стоит того, чтобы хотя бы ознакомиться с таким языком?
А что где-то есть библиотека реализации паттернов на Немерле? Пока что, то что я вижу, это 6 маленьких библиотечек макросов на nemerle.org и какая-то масса разрозненного кода на google code. А солидной, готовой для использования, хорошо документированной библиотеки я не вижу.
Или предлагается самому писать себе макросы на каждый конкретный случай?
Макросы — это, конечно, круто и все дела. Только пусть кто-нибудь другой их напишет, хорошо оттестирует, отдокументирует, и сделает тривиальным для использования. Вот тогда-то Немерле и будет представлять существенный интерес. А пока это просто хобби для тех, кому интересно возиться с макросами.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>А если по делу, мне крайне не нравится реализация алгебраических типов в Немерле. Она там одинакова для рекурсивных и нерекурсивных АглТД, т.е. явно была сделано "на скорую руку". Но нынешняя команда сим вопросом заниматься не будет.
А чем должна отличаться реализация для нерекурсивных?
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Какой, к чертям, это передний край? Это до ML-ная эра. И дажее ее наши професоры не осилили пока что. Так о чем ты говоришь то?
Ты бы обратил, вообще-то, внимание на две последние приведенные публикации. Они ключевые на сегодня в теории типов. В предпоследней, наконец, классифицируются способы типизации и отношения м/у ними и показано место, к примеру, зависимых типов в т.н. Barendregt's Lambda Cube
Не открыв ничего нового, товарищ "открыл" взаимосвязь способов типизаций по трем признакам-координатам, внеся стройность в современную теорию типов. Вот с этих пор точно ничего нового не было.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>А если по делу, мне крайне не нравится реализация алгебраических типов в Немерле. Она там одинакова для рекурсивных и нерекурсивных АглТД, т.е. явно была сделано "на скорую руку". Но нынешняя команда сим вопросом заниматься не будет.
2 Ziaw: Ты попался на наукоподобный бред ламера. Он и представления не имеет о платформе реализации, а лезет с умными мыслями.
Очень советую относиться к его словам "осторожно". Это понты и лам. Просто когда ты не знаешь деталей, они выглядят как вменяемые и умные.
На самом деле делать АлгТД в виде единого блока данных (вэлью-типа если по дотнетному) можно даже если АлгТД рекурсивный. МЛ именно так и поступает, если я не ошибаюсь. В дотнете же это сделать невозможно, так как дотнетный GC не поддерживает пересечение указателей и данных в одной структуре. Потненциально в дотнете есть атрибуты позволяющие сделать смещение полей разных типов одинаковыми. Но GC упадет если в поле-адресе будет неверное значение. По сему реализовать АлгТД в виде вэлью-типа в дотнете невозможно в приципе. Этот "проффесор" таких деталей не знает, но суется рассуждать о высших материях.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, alexeiz, Вы писали:
A>А что где-то есть библиотека реализации паттернов на Немерле?
А как же?
Прямо в стандартной библиотеке. Вот здесь есть описание.
A>Пока что, то что я вижу, это 6 маленьких библиотечек макросов на nemerle.org и какая-то масса разрозненного кода на google code. А солидной, готовой для использования, хорошо документированной библиотеки я не вижу.
Плохо смотришь.
A>Или предлагается самому писать себе макросы на каждый конкретный случай?
Самому тоже предлагается. Если в повседневной жизни встречается задача которая уже достала тем, что ее нужно каждый раз повторять под копирку, то пиши свое решение. Если оно универсальное, то можешь вставить на суд общественности. Если она одобрит, включим в стандартную библиотеку.
A>Макросы — это, конечно, круто и все дела.
Не то что-бы круто, но иногда очень облегчает жизнь. Не дай бог привыкнешь, так потом просто чувствешь ломку когда к другому языку возвращаешься.
A>Только пусть кто-нибудь другой их напишет, хорошо оттестирует, отдокументирует, и сделает тривиальным для использования.
Дык для стандартных нужды конечно напишут. Но ведь бывают и частные задачи. И тут можно и самому что-то сделать.
A>Вот тогда-то Немерле и будет представлять существенный интерес. А пока это просто хобби для тех, кому интересно возиться с макросами.
Пока что кто-то плохо пользуется поиском по сайту. Вот автоматизацию паттернов не нашел и возмущается .
А вообще подход странный, но в то же время традиционный. Вот пусть другие за меня сделают, а я подожду. Ну, дык от МС ты никогда не дождешся, чтобы они в язык включили вещи нужные именно тебе. Получается или всю жизнь долбить и копипастить неуклюжий код вместо того, чтобы написать самому.
Библиотеки ты тоже ждешь когда за тебя напишут?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Ты бы обратил, вообще-то, внимание на две последние приведенные публикации. Они ключевые на сегодня в теории типов. В предпоследней, наконец, классифицируются способы типизации и отношения м/у ними и показано место, к примеру, зависимых типов в т.н. Barendregt's Lambda Cube
V>Не открыв ничего нового, товарищ "открыл" взаимосвязь способов типизаций по трем признакам-координатам, внеся стройность в современную теорию типов. Вот с этих пор точно ничего нового не было.
Ну, так и что нового то? Не лучше бы было на работу по тем самым зависимым типам ссылку дать?
Потом меня все эти теоритические рботы просто радуют. Куча заумностей на ровном месте. В реальных компиляторах вся эта псевдонаучная хрень не использутся.
Народ в дисерах упражняется в искустве шифрования мыслей. Считается, что чем заковыристей ты свою мысль завернешь, тем она более научна.
Чушь это все. Даже сложнейшие концепции вроде зависимых типов или уникальных типов можно на пальцах объяснить за пять минут. И на практике в компиляторе важны не научные теории, а банально продуманный алгоритм.
В итоге нам недоучкам приходится переписывать за научными деятелями алгоритмы вывода типов и построения парсеров. Ничего общего с их умными алгоритмами это не имеет, но зато работает и делает то что надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
Z>>А чем должна отличаться реализация для нерекурсивных?
V>Инлайнится по-возможности, т.е. не создаваться на куче. Участвовать в распространении констант без всяких динамических проверок дискриминатора (т.е. типа объекта). Наиболее естественно — сделать как дотнетный value-type и агрессивно оптимизировать, как в Хаскеле.
Зачем говорить о том в чем плохо разбираешься?
Создай тестовый проект на Шарпе и попробуй сэмулировать свое решение. Тебе ждет огромное разочарование.
Потому во всех языках дотнета (что поддерживают АлгТД) АлгТД сделаны через классы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Что вас останавливает от изучения нового языка?
V>>Инлайнится по-возможности, т.е. не создаваться на куче. Участвовать в распространении констант без всяких динамических проверок дискриминатора (т.е. типа объекта). Наиболее естественно — сделать как дотнетный value-type и агрессивно оптимизировать, как в Хаскеле.
VD>Зачем говорить о том в чем плохо разбираешься?
Ну, давай разбираться подробней, если готов.
VD>Создай тестовый проект на Шарпе и попробуй сэмулировать свое решение. Тебе ждет огромное разочарование.
Да сделано давно discriminated union для компилятора IIOP.Net.
VD>Потому во всех языках дотнета (что поддерживают АлгТД) АлгТД сделаны через классы.
И вот целый пласт возможных оптимизаций на уровне джита просто обрубается, не говоря уже о том, что даже дотнетная куча вовсе не бесплатна.
Сама платформа доставляет неудобств. В Хаскеле размеченное объединение может перекрывать свои адреса, в дотнете это можно только для bool и чисел, а ссылки должны стоять где-то сбоку. Т.е. вопрос упаковки и смещений полей не последний. Но и это решаемо. К тому же, полно сценариев, где все варианты довольно простые и не содержат ссылочных полей. Уж их-то точно можно было выразить через value-type.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>На самом деле делать АлгТД в виде единого блока данных (вэлью-типа если по дотнетному) можно даже если АлгТД рекурсивный. МЛ именно так и поступает, если я не ошибаюсь.
Он всегда там в виде единого блока данных. Речь лишь об оптимизации его использования — брать из кучи по ссылке, или размещать/копировать по значению без выделения памяти в куче.
VD>В дотнете же это сделать невозможно, так как дотнетный GC не поддерживает пересечение указателей и данных в одной структуре. Потненциально в дотнете есть атрибуты позволяющие сделать смещение полей разных типов одинаковыми. Но GC упадет если в поле-адресе будет неверное значение. По сему реализовать АлгТД в виде вэлью-типа в дотнете невозможно в приципе.
Ну и кто тут лам? Вопрос непротиворечивой упаковки полей уже нерешаемый?
VD>Этот "проффесор" таких деталей не знает, но суется рассуждать о высших материях.
С каких пор задача рассовать три шара по двум корзинам перекочевала в высшие материи?
Влад, не позорься. Попробуй, и увидишь, как все просто.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Сама платформа доставляет неудобств. В Хаскеле размеченное объединение может перекрывать свои адреса, в дотнете это можно только для bool и чисел, а ссылки должны стоять где-то сбоку. Т.е. вопрос упаковки и смещений полей не последний. Но и это решаемо. К тому же, полно сценариев, где все варианты довольно простые и не содержат ссылочных полей. Уж их-то точно можно было выразить через value-type.
Можно, но с существующей семантикой надо что-то делать, варианты не иммутабельны. Поэтому передача части их по значению, а части по ссылке принесет неприятные сюрпризы.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Чушь это все. Даже сложнейшие концепции вроде зависимых типов или уникальных типов можно на пальцах объяснить за пять минут.
Вот этот куб — это и есть пальцы.
VD>И на практике в компиляторе важны не научные теории, а банально продуманный алгоритм. В итоге нам недоучкам приходится переписывать за научными деятелями алгоритмы вывода типов и построения парсеров. Ничего общего с их умными алгоритмами это не имеет, но зато работает и делает то что надо.
Вообще-то, там твой напарник выделил FSM полностью по классике. Регулярная грамматика растет только вправо за счет терминалов. Он даже реализовал т.н. расширенную нотацию регулярных грамматик, без которой выделение регулярного подмножества не было бы полным. Поэтому ты не прав, все очень даже по науке. Это не только слова.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>2 Ziaw: Ты попался на наукоподобный бред ламера. Он и представления не имеет о платформе реализации, а лезет с умными мыслями.
Это один из немногих постов в дискуссии в котором не обсасывается в тысячный раз то, что я уже читал тут. Это не бред, а, вероятно, ошибочная теория, но практически все остальные посты треда не несут конструктива вообще.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Пока что кто-то плохо пользуется поиском по сайту. Вот автоматизацию паттернов не нашел и возмущается .
Мне-то что? Мне немерле не нужен. Я просто говорю, как ситуация вокруг него выглядит со стороны. А ты вместо того, чтобы принять к сведению, посылаешь меня в поиск...
И поверь мне, макросы никто писать не хочет. Использовать готовые — пожалуйста. На это и нужно давить. Создавать библиотеку макросов общего назначения для облегчения написания кода, который обычно доставляет сложности (например в C#). Без такой библиотеки Немерле — не более чем еще один функциональный язык со странным синтаксисом.
PS: зашёл на сайт Boo недавно. Захотелось что-нибудь на нём написать. С чего бы это?
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, alexeiz, Вы писали:
A>>А что где-то есть библиотека реализации паттернов на Немерле?
VD>А как же? VD>Прямо в стандартной библиотеке. Вот здесь есть описание.
Это скорее статья на тему "смотрите какие в принципе есть возможности". Но никак не готовая к использованию библиотека.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Ну, давай разбираться подробней, если готов.
Не, ну, давай. А сначала разбирайся, а потом выноси суждения о спешке в реализации.
Направление исследований я тебе обозначил. Дерзай.
VD>>Создай тестовый проект на Шарпе и попробуй сэмулировать свое решение. Тебе ждет огромное разочарование.
V>Да сделано давно discriminated union для компилятора IIOP.Net.
Я не знаю что за хреть такая IIOP.Net, то чудес не бывает. Единственное решение которое я могу себе представить — это завести структуру которая бы сдублировала бы все поля всех вхождений АлгТД плюс тег. В итоге вместо создания объекта получаем перемножение всех полей всех вхождений. Передавать такую структуру через параметр это просто праздник какой-то.
VD>>Потому во всех языках дотнета (что поддерживают АлгТД) АлгТД сделаны через классы.
V>И вот целый пласт возможных оптимизаций на уровне джита просто обрубается, не говоря уже о том, что даже дотнетная куча вовсе не бесплатна.
Стек тоже не бесплатен. А совмещать поля в дотнете нельзя. Любая грязь в ссылочном поле прведет к падению ЖЦ.
V>Сама платформа доставляет неудобств. В Хаскеле размеченное объединение может перекрывать свои адреса, в дотнете это можно только для bool и чисел, а ссылки должны стоять где-то сбоку.
Ну, и какой смысл в таких "оптимизациях". В варианте по больше ссылочных полей будет море. Их перекрытие невозможно. Значит все распухнет и будет тормозить при передаче через стек. А не дай бог в список это дело надо положить...
V>Т.е. вопрос упаковки и смещений полей не последний. Но и это решаемо.
Не решаемого это. Точнее решения получаются хуже оригинального.
К тому же сам по себе АлгТД в МЛ-языках имеет ссылочную семантику (размещается в куче).
V>К тому же, полно сценариев, где все варианты довольно простые и не содержат ссылочных полей. Уж их-то точно можно было выразить через value-type.
Смысла нет. На копировании в итоге проиграешь. Разве что ли для вариантов с одним полем. Но это как раз редкость.
Многие варианты рекурсивны и имеют по 3 и более полей. Делать разную семантику для одной и той же сущности?
Что до оптимизаций, то по уму это проблема фрэймворка. Варианты переписываются в sealed-классы с одним предком. Проверить, что наследование закрытое не составило бы струда. А дальше можно много чего делать.
Забавно, что отсутствие в Яве пользовательских вэлью-типов заставило ее авторов больше заниматься оптимизацией. В итоге казалось бы более убогий рантайм работает быстрее дотнетного.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>На самом деле делать АлгТД в виде единого блока данных (вэлью-типа если по дотнетному) можно даже если АлгТД рекурсивный. МЛ именно так и поступает, если я не ошибаюсь.
А поле типа самого себя становится ссылкой?
Оффтоп: я бы вообще запретил мутабельность в вариантах (пока писал, понял, что сам ее ни разу не юзал, даже засомневался, есть ли она на самом деле).
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Ну и кто тут лам? Вопрос непротиворечивой упаковки полей уже нерешаемый?
Если есть ссылочные поля — нет.
VD>>Этот "проффесор" таких деталей не знает, но суется рассуждать о высших материях.
V>С каких пор задача рассовать три шара по двум корзинам перекочевала в высшие материи? V>Влад, не позорься. Попробуй, и увидишь, как все просто.
А ты не подменяй тему. Речь шла о использовании ПМ.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Вообще-то, там твой напарник выделил FSM полностью по классике.
Это в одном мелком случае. А в 5 других он послал классику в одно широко известно место и написал свой алгоритм который работает в десятки раз быстрее оригинала. Онигинал, правда, линейную скорость гарантировал, но линейно низкую. А алгоритм Вольфхаунда линейность не ганартирует, но на реальных языках показывает общую скорость на уровне и привышающую рукописные парсеры.
V>Регулярная грамматика растет только вправо за счет терминалов. Он даже реализовал т.н. расширенную нотацию регулярных грамматик, без которой выделение регулярного подмножества не было бы полным. Поэтому ты не прав, все очень даже по науке. Это не только слова.
Да, тут он сработал по науке. Только чтобы эту науку прикрутить в нужное место, он где-то месяц или два голову ломал. В двух словах дело было так. Я сделал предположение, что для некоторых подграмматик (а это PEG, значит лексера нет!) можно генерить ДКА и за счет этого улучшить производительность (до этого в шипко научных работах считалось что Пакрат (реализация пега) вообще не пригоден для распознавания ключевых слов, так как это шибко медленно). Он подергался и первая реализация получилась никакая. Ускорения она не давала. Тогда он начал ломать голову на счет того как улучшить встраивание ДКА в безлексерный пасрер, и как ускорить код генерируемый по этому ДКА. В итоге он добился очень значительных успехов. В принципе, одно это уже на дисер тянет.
В общем, между научной работой и реально пригодным для использования продуктом стоит пропасть. Талкнуть общую идею не сложно. А вот творчиски воплотить ее в жизнь — это задачка не беручка.
И как не странно основная проблема тут — это сложность. Заслуга Вольфхаунда в основном состоит в том, что он сумел сохранить эту сложность в разумных пределах.
Выделение отдельных стадий и есть способ держать сложность в разумных пределах. Ведь сложность имеет привычку перемножаться. Засунь оптимизацию в парсер и кирдык. А кроме оптимизации есть еще куча стадий обработки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Это один из немногих постов в дискуссии в котором не обсасывается в тысячный раз то, что я уже читал тут. Это не бред, а, вероятно, ошибочная теория, но практически все остальные посты треда не несут конструктива вообще.
Они еще и офтоп.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, alexeiz, Вы писали:
A>И поверь мне, макросы никто писать не хочет. Использовать готовые — пожалуйста. На это и нужно давить. Создавать библиотеку макросов общего назначения для облегчения написания кода, который обычно доставляет сложности (например в C#). Без такой библиотеки Немерле — не более чем еще один функциональный язык со странным синтаксисом.
Дык я согласен. Только макросы должны писать те кто ими пользуется. Тогда они хорошими будут.
И таких макросов не мало. PegGrammar, ComputationExpressions, втоматизация паттернов...
A>PS: зашёл на сайт Boo недавно. Захотелось что-нибудь на нём написать. С чего бы это?
Не знаю, но в любом случае хорошо. Попиши, потом расскажешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, alexeiz, Вы писали:
VD>>Прямо в стандартной библиотеке. Вот здесь есть описание.
A>Это скорее статья на тему "смотрите какие в принципе есть возможности". Но никак не готовая к использованию библиотека.
Там же примеры даны
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
VD>>На самом деле делать АлгТД в виде единого блока данных (вэлью-типа если по дотнетному) можно даже если АлгТД рекурсивный. МЛ именно так и поступает, если я не ошибаюсь.
Z>А поле типа самого себя становится ссылкой?
В МЛ сам вариант помещается в кучу. В дотнете это тоже возможно. Любой вэлью-тип можно забоксисть и получить ссылку. В С++ это сделать можно. Но вот при этом уже совсем не ясно в чем цимис от использования вэлью-типа .
Z>Оффтоп: я бы вообще запретил мутабельность в вариантах (пока писал, понял, что сам ее ни разу не юзал, даже засомневался, есть ли она на самом деле).
Ну, в общем — да. Польза не часто от этого появляется. Но в жизни разные случаи бывают.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
C>>а не все ли равно на чем писать? VD>Нет конечно. Иначе все бы писали на ассемблерах или хотя бы на Фортране 77.
я не это имел ввиду.
C>>а если так, то зачем учить очередной язык пока он не понадобился? VD>А как ты поймешь что что-то тебе нужно, если ты даже не знаешь что там внутри и что это тебе может дать?
А для того чтобы понять что там внутри не надо язык изучать, обычно достаточно прочитать какой нибуть обзор или полистать домашнюю страничку. C>>понадобится, потрачу неделю чтобы выучить синтаксис и примерно прикинуть как семантика ложится на известные мне концепции и всех делов. VD>Попробуй заменить в своей логике язык на телевизор. Скажем ты пользуешься радио. VD>Тебе говорят, что есть же телевизор. И что он как радио, то только лучше. А ты в ответ — "понадобится, потрачу неделю чтобы понять что это такое".
нет, такой ответ последует если мне предложат радио новой модели которое принимает сигнал улавливая нейтрино.
а на телевизор я согласен.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Я обьясню это через придуманную мною алегорию. A>Можно купить машину с очень мощным мотором. A>Но стоять в пробке она будет примерно с той же скоростью как Запорожец. A>Потому что движение лимитурует другой фактор.
Поэтому ты предпочитаешь запорожец? Мне нравится твоя аллегория. Она какбе намекает, что помимо скорости езды есть ещё какой-то важный фактор, так что даже в таком случае запорожец — не вариант.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Здравствуйте, FR, Вы писали:
WH>>>Тесты гонять? FR>>Да. WH>>>А где гарантия, что покрытие 100%? FR>>100% гарантии теперь даже в банках не дают.
D>Демагогия detected. Система типов именно что даёт математически доказанные гарантии.
Разве что в системах с зависимыми типами. Назовешь пяток таких популярных промышленных языков?
Re[21]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
D>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
Дык если и правда можно, то PHP хороший язык. Но на практике почему-то не пишут.
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Пример со string.Join показывал, что очень часто проблема мусорности кода может быть решена средствами имеющегося языка. Но в силу привычки думать заученными конструкциями программисты просто не замечают, что данный код является мусорным, и соответственно не ищут способа избавиться от этого мусорного кода.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, alpha21264, Вы писали:
DR>>>В языках с поддержкой метапрограммирования, вроде Немерле, макрос оперирует не текстом, а языковыми конструкциями.
A>>Это как?
FR>Оперирует уже распарсеным текстом обычно в виде AST
FR>Есть даже препроцессоры, но не текстовые как в Си/С++ а синтаксические например http://en.wikipedia.org/wiki/Camlp4 FR>которые также оперируют AST.
На первый взгляд штука могучая, но... Она только на один язык заточена?
Могу я эти макросы для произвольного (например русского) языка применить?
Течёт вода Кубань-реки куда велят большевики.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>Я обьясню это через придуманную мною алегорию. A>>Можно купить машину с очень мощным мотором. A>>Но стоять в пробке она будет примерно с той же скоростью как Запорожец. A>>Потому что движение лимитурует другой фактор.
VE>Поэтому ты предпочитаешь запорожец? Мне нравится твоя аллегория. Она какбе намекает, что помимо скорости езды есть ещё какой-то важный фактор, так что даже в таком случае запорожец — не вариант.
Потому что если нет разницы, то зачем платить больше?
Как говорил мой великий и мудрый шеф (отмеченый орденами и медалями)
Был бы хороший алгоритм. А реализуем мы его хоть на хинди.
Понятно? Алгоритм важнее, чем язык.
Так было до того, как программисты превратились в обезьян.
Ну а сейчас имеем то, что имеем.
Течёт вода Кубань-реки куда велят большевики.
Re[29]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Причем предпоследнее — это скорее классификация имеющихся знаний, чем что-то новое. А последнее — тем более, довольно-таки прикладной репорт на основе имеющегося материала. В общем, что-то скорее нафталиновое, чем передовое.
1)Они даже этого не знают.
2)Теория типов в чистом виде на практике бесполезна. Я же тыкаю их носом в статьи 20хх годов. Где описаны практически работающие подходы.
V>Да и есть ML-языки, которые пытаются реализовать эти наработки. И что эти яыки из себя представляют мы прекрасно знаем: неудобство для общеприкладных задач и тормозной получаемый код, требующих дохрена памяти. Был бы этот сыр бесплатный, весь этот материал давно был бы в мейнстриме.
Ну то что ученые не осилили оптимизатор ни о чем не говорит.
Немерле вполне себе МЛ и проблем нет.
V>Ну и опять же. Про узость самой области исследований языков ты похоже не въезжаешь абсолютно.
Эти люди учат языкам!
Они должны быть в курсе дела.
V>Ну и по последнему писку моды тоже хватае тпроблем и они известны. Для зависимых типов — это ввод значений, требующий в общем случае техники суперкомпиляции (а не того подобия техники динамического приведения, что ты когда-то предлагал),
Чего?
V>а uniqueness типы имеют проблемы в многопоточном окружении.
А я то наивный думал, что они как раз решают проблемы с многопоточностью. http://lamp.epfl.ch/~phaller/uniquerefs/capabilities_for_uniqueness_TR.pdf
Ты вообще в курсе, о чем пишешь?
V>Дык, Немерле ведь от всего вышеупомянутого страшно далек, ты его сюда не приписывай.
Там макросы. И Лаптев о них не в курсе.
Совсем.
Ни разу.
Иначе бы не пропагандировал текстовый препроцессор как последний писк моды.
V>А что не так с С? Отличная абстракция ассемблера.
Кода в десятки раз больше чем нужно. А так никаких проблем.
V>Настоящий нейтив во-плоти, без встроенных фокусов (если сравнивать с Паскалем, например). Что получится в итоге известно фактически до бит, что и требуется для ПО, непосредственно общающегося с кодом. С этого языка "взлетают" все современные аппаратные платформы, и уже поверх него работают все эти джавы, дотнеты и прочие экзотичности. Поверх него — т.е. поверх кода, созданного компилятором С. Фактически весь современный нейтивный код написан на С/С++, от операционок, офиса и БД, до дотнета и игрушек.
Но должны взлетать вот с этого: Verve: типобезопасная ОС от MS Research
Там все известно еще лучше и что характерно все верифицировано.
V>Например, ты прямо сейчас способен обосновать, почему нерекурсивные алгебраические типы представлены ссылочными типами, хотя дотнет позволяет оперировать value-type? А ведь ML-языки умеют делать такие оптимизации уже черти сколько лет. Пяток подобных вопросов без убедительных ответов, и можно идти допиливать диссер, а лучше сам язык.
По тому что .НЕТ.
В немерле куча проблем из-за того что мелкософты сделали тупую ВМ.
Вот тебе ответ на все твои "вопросы".
V>Для императивных — Фортран/С/Паскаль.
А фортран то нахрена? Чтобы людям жизнь поломать?
V>Функциональный — Лисп,
Он слишком императивен чтобы преподавать на нем функциональщину.
Видел я как на нем люди пишут после императивных языков.
Императив императивом.
Тут нужно брать хаскель. Без вариантов. Ибо он вывернет руки но заставит писать функционально.
V>логический — Пролог.
Он очень грязный.
Лучше уж http://en.wikipedia.org/wiki/Mercury_%28programming_language%29
V>Отличные языки для изучения парадигм. Почему отличные? — а ничего лишнего, никаких понтов, шелухи и синтаксического сахара.
"Отличные они по тому", что ты других не знаешь.
WH>>Неординарные? Ты имеешь в виду лапшу? V>Define "лапшу"?
Ну те сишный препроцессор?
Лапша лапшой.
V>А вот и оно, спасибо. Типичный индусокод. Ни малейшего понятия о декомпозиции и тестопригодности. Развязаться через независимые ф-ии видно не судьба.
А зачем? Эта функция решает строго одну задачу. И только ее.
V>Насчет тестопригодности. Ты должен будешь на один метод завязать как кучу низкоуровневых независимых тестов по проверке каждого отдельного вычисления, так и комплексные тесты, проверяющие их комбинации. А это залёт, курсант.
У меня на этот метод вообще тестов нет.
И ошибок в нем ни разу не было.
Ибо простой как пробка.
V>В факте предпросмотра на один уровень вперед (тоже самое тут: Fsm(a)::Fsm(b)::rest)? Да еще через ж... динамическую типизацию в реализации Nemerle? Издеваешься или как?
Нет там никакой динамической типизации.
А то, что твориться в скомпилированном коде никого не волнует.
V>В общем, декомпозируй решение, и на любом языке это будет смотреться очень похоже. Ни в какие 20 раз и близко разницы не будет.
Код в студию!
V>Если энергичные, то в топку, бо многопроходность, а оно вполне решаемо за один проход.
Типа меня волнует производительность этого куска.
Тем более что при желании можно сделать оптимизатор, который эти проблемы устранит.
V>Тоже самое с Sequence(rules). Заметь, на плюсах тут вполне можно было обобщить на шаблонах оба случая. Но на немерле или C# — это надо было бы городить огород из паттерна "Стратегия" для целей обобщения, и овчинка выделки не стоила бы.
1)Код в студию.
2)Это сейчас код похож. Раньше он был разным. И потом он тоже станет разным.
Так что обобщение тут, мягко говоря, противопоказано.
V>Далее. Есть предложение для обоих случаев насчет возможности построения оптимизированного варианта сразу, по мере парсинга правил, а не "потом", за вот этот проход оптимизации.
Ой лол. Там такая лапша получится что
Причем на любом языке.
А если вспомнить про инлайн
Я теперь понимаю твоих коллег. И почему они говорят, что у тебя говнокод.
V>Это как разница в подходах построения ДКА — сначала можно строить по регулярным выражениям НКА, приводить его к ДКА, а затем минимизировать, но ведь можно строить сразу минимизированный ДКА — это порой на порядок быстрее, т.к. на каждом шаге обработке подвергается множество меньшей мощности.
Ссылку на работу в студию.
Ни один из известных мне алгоритмов минимальный ДКА в общем случае не строит.
V>В общем, подкинь что-нить посущественнее, что ли...
Ты с этим хотя бы разберись.
V>Кое в чем буков будет больше, кое в чем меньше. Разницы в разы не будет.
Будет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Разве что в системах с зависимыми типами. Назовешь пяток таких популярных промышленных языков?
Любая система типов дает математические гарантии.
Вопрос лишь в том, что именно она гарантирует.
Обычные типы дают довольно мало гарантий. Зависимые существенно больше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках:
Плохо переводишь. Неаккуратно. Можно как-нибудь так:
match (r, types(typeof(Not), typeof(Not)), rule => ... ));
С учётом написания not = typeof(Not) и другого boilerplate в 2-3 строки код станет не сильно хуже изначальной лапши.
Частные случаи, которые под этот вариант не подпадут, уж никак 20-кратного отставания не принесут.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, VoidEx, Вы писали:
VE>>Здравствуйте, alpha21264, Вы писали:
A>>>Я обьясню это через придуманную мною алегорию. A>>>Можно купить машину с очень мощным мотором. A>>>Но стоять в пробке она будет примерно с той же скоростью как Запорожец. A>>>Потому что движение лимитурует другой фактор.
VE>>Поэтому ты предпочитаешь запорожец? Мне нравится твоя аллегория. Она какбе намекает, что помимо скорости езды есть ещё какой-то важный фактор, так что даже в таком случае запорожец — не вариант.
A>Потому что если нет разницы, то зачем платить больше? A>Как говорил мой великий и мудрый шеф (отмеченый орденами и медалями) A>Был бы хороший алгоритм. А реализуем мы его хоть на хинди.
Ты утверждаешь, что нет разницы между запорожцем и Бугурти?
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
A>>Пожалуй, останавливает само количество языков: A>>http://en.wikipedia.org/wiki/List_of_programming_languages A>>Насчитал тут более 650 штук(!)
VD>Там большая часть мертвых или чисто исследовательских.
И еще отсортирован список по алфавиту а не по мощности языка. Это ж просто безобразие.
Чтобы ласкающее взор имя прочесть некоторым приходится аж до секции N скролить.
Скролишь и думаешь — а вдруг убрали. Инфаркт можно получить однако.
Проектирование велосипедов для слепых жирафов
Re[9]: Что вас останавливает от изучения нового языка?
[skip классическое введение от VladD2: "ламо" повторяется не меньше двух раз]
VD>В этом коде никто не пытался сделать что-то нарочито коротко. В нем, просто, решается весьма не тривиальная задача — оптимизация гамматик. В нормальном виде эту задачу на простом языке не описать. Тут единственное нормальное решение было бы создание специализированного ДЛС-я с поддержкой паттерн-матчинга в терминах прикладной задачи. А на if-ах или ООП тут будет просто жопа. Кода будет раз в 5 больше и он будет абсолютно не читаем. А этот код ты прочесть не можешь только потому, что не знаешь ПМ и язык.
Не, этот код я полностью не могу прочесть, потому что смутно представляю себе постановку задачи. ПМ, язык — это всё шелуха. Кстати, спасибо, что объяснил, что именно и зачем тут оптимизируется.
ГВ>>Пусть код будет втрое длиннее, но хоть сгруппировали бы по ветвлениям одного уровня. Это был раз. А два, я, например, не вижу принципиальной разницы между:
ГВ>>
else if (match(rule, Not(Not())) { return optimize(And(r.Location, rule)); }
VD>Ген. Не моли чушь просто от того, что ты не понимашь написанного. Ну это же бред.
А... Да, есть ошибочка. Вызов optimizie нужно было записать примерно так: optimize(And(r.Location, rule.r.r), чтобы показать, что новый узел формируется из вложенного. Но это простительная неточность в данном случае. Я же полностью рабочий код не собирался делать. Кстати, Not(Not()) может быть заменён на статическую константу:
Просто, чтобы не создавать временных объектов попусту.
VD>Я тебе сейчас переведу этот код. Вот как это будет выглядеть на доступных для тебя языках: [...]
Спасибо за перевод, но это мне понятно.
VD>Но тут есть пара особенностей. VD>1. В привычных тебе языках оптимизация концевой рекурсии не гарантируется, так что для корректной реализации тебе придется заменить вложенную функцию на цикла и стек (с ручной манипуляцией этим стеком).
Конечно, не гарантируется. Только кто тебе сказал, что по отношению к такому примеру цикл заметно ухудшит код? Цикл тут один, подразумевается он в любом случае, хотя бы в виде tail-оптимизированной рекурсии через ПМ, так что, на "понимаемость" кода его введение повлияет слабо. Да и управляться он, пожалуй, будет лучше. Иными словами, приведённый фрагмент будет выглядеть где-то так:
Тоже, в общем, не перегрузка. Навертеть можно много, на самом деле, при этом выглядеть и сопровождаться оно будет совсем не так, как слепленные на коленке "по-быстрому" ФП-аналоги, которые подчас завязаны на контекст чуть более, чем намертво. Далее, тебе 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]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
ГВ>>Лаптев сказал, если я не путаю, что синтаксическим макросам сто лет в обед.
VD>Лаптев много говорит. Но по его же словам отчетливо видно, что он не понимает то о чем говорит. Его уровень — это императивный язык. К сожалению подняться выше он не то что не может, но даже не хочет.
По словам Лаптева отчётливо видно, что его оппоненты не совсем понимают реальную значимость того, что они пропонируют.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Какой именно тип должен быть указан в качестве RulePattern прямо сейчас сказать не могу.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, Mystic, Вы писали:
VD>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
M>Щупаю и далее по ощущениям.
А как выглядит процесс щупания?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>По словам Лаптева отчётливо видно, что его оппоненты не совсем понимают реальную значимость того, что они пропонируют.
Лично мне довольно фиолетово что он там пропонирует и с кем. Мне даже по фигу что он учит люлей на ББ. Хотя сам ББ не имеет никакого практического значения, но на его основе люди попробуют программировать и если им это понравится, то освоят более полезные языки даже вопреки вам всем. Так что польза от этого несомненно есть.
Тут вопрос в другом. Вопрос в том, что те кто должны быть (по идее) на передовых рубежах индустрии, на самом деле застряли в дремучих шестидесятых. И вместо того чтобы попытаться освоить что-то более новое (как резонно заметил vdimas, из 70-90-ых), они рьяно отстаивают свое право на невежество.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Mystic, Вы писали:
VD>>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
M>>Щупаю и далее по ощущениям.
VD>А как выглядит процесс щупания?
Читаю некоторый обзор, придумываю задачу, которая должна соответствовать языку и потом начинаю на нем писать решение. В ощущения входит: (1) легкость быстрого старта (2) тормоза (3) хорошая диагностика ошибок (4) быстрый поиск по документации ответов на вопросы (5) бенефиты перед уже известными языками.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>Здравствуйте, VoidEx, Вы писали:
VE>>>Здравствуйте, alpha21264, Вы писали:
A>>>>Я обьясню это через придуманную мною алегорию. A>>>>Можно купить машину с очень мощным мотором. A>>>>Но стоять в пробке она будет примерно с той же скоростью как Запорожец. A>>>>Потому что движение лимитурует другой фактор.
VE>>>Поэтому ты предпочитаешь запорожец? Мне нравится твоя аллегория. Она какбе намекает, что помимо скорости езды есть ещё какой-то важный фактор, так что даже в таком случае запорожец — не вариант.
A>>Потому что если нет разницы, то зачем платить больше? A>>Как говорил мой великий и мудрый шеф (отмеченый орденами и медалями) A>>Был бы хороший алгоритм. А реализуем мы его хоть на хинди.
VE>Ты утверждаешь, что нет разницы между запорожцем и Бугурти?
Разница есть даже между двумя Запорожцами.
Вопрос насколько она принципиальна.
Между Запорожцем и Бугурти (к стати, что это?) принципиальной разницы нет.
Метро всё равно быстрее их обоих.
А мне надо ехать.
Течёт вода Кубань-реки куда велят большевики.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Разница есть даже между двумя Запорожцами. A>Вопрос насколько она принципиальна. A>Между Запорожцем и Бугурти (к стати, что это?) принципиальной разницы нет.
Бугатти. A>Метро всё равно быстрее их обоих. A>А мне надо ехать.
Ну дак метро ещё не построили по твоим же словам. Получается, чёрт с ним с Бугатти, я и на запоре покатаюсь?
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
ГВ>>По словам Лаптева отчётливо видно, что его оппоненты не совсем понимают реальную значимость того, что они пропонируют. VD>Лично мне довольно фиолетово что он там пропонирует и с кем.
Перечитай мою реплику внимательней. Я имел в виду реальную значимость тех идей, которые продвигают оппоненты Лаптева. Сиречь — ты, Wolfhound и далее по списку.
VD>Мне даже по фигу что он учит люлей на ББ. Хотя сам ББ не имеет никакого практического значения, но на его основе люди попробуют программировать и если им это понравится, то освоят более полезные языки даже вопреки вам всем. Так что польза от этого несомненно есть.
Собственно, этого вполне себе немало, не находишь?
VD>Тут вопрос в другом. Вопрос в том, что те кто должны быть (по идее) на передовых рубежах индустрии, на самом деле застряли в дремучих шестидесятых. И вместо того чтобы попытаться освоить что-то более новое (как резонно заметил vdimas, из 70-90-ых), они рьяно отстаивают свое право на невежество.
По идее они должны обучать начинающих программистов программированию. Точка. Передовой рубеж, если я правильно понимаю — обучение балбесов, которые пришли в вуз не за знаниями, а корочки для. Отсюда постоянный поиск компромисса между сложностью (читай, теоретичностью) материала, практической его ценностью и порогом вхождения. Дальше вдаваться в дискуссии по этому поводу с тобой не буду — не имеет смысла спорить о минеральном составе устриц с тем, кто ограничивает свои оценки категорией "вкусненько".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, samius, Вы писали:
U>>Пример со string.Join показывал, что очень часто проблема мусорности кода может быть решена средствами имеющегося языка. Но в силу привычки думать заученными конструкциями программисты просто не замечают, что данный код является мусорным, и соответственно не ищут способа избавиться от этого мусорного кода.
S>См. так же пример с Where
Здравствуйте, alpha21264, Вы писали:
FR>>Есть даже препроцессоры, но не текстовые как в Си/С++ а синтаксические например http://en.wikipedia.org/wiki/Camlp4 FR>>которые также оперируют AST.
A>На первый взгляд штука могучая, но... Она только на один язык заточена? A>Могу я эти макросы для произвольного (например русского) языка применить?
Здравствуйте, VoidEx, Вы писали:
D>>Это демагогия, а не аргументы. Практика у всех своя. Практика дельфистов говорит, что дельфи — самый лучший из языков. Практика PHP-ников с восемью классами среднего образования говорит, что на PHP можно написать всё что угодно. Аргументы-то где?
VE>Дык если и правда можно, то PHP хороший язык. Но на практике почему-то не пишут.
Был здесь несколько лет назад некий Роман Дубров, доказывал мне с пеной у рта, что на PHP можно написать всё что угодно, и что memcached является частью платформы PHP, и что сериализация данных при его использовании не выполняется. Много ли этого самого "чего угодно" он написал, мне неведомо. Ну а я тоже дурак — зачем мне его разубеждать? Больше ламеров — ценнее моя квалификация. Адью.
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает.
Всё это очень здорово. Если бы не одно но — в дотнете есть генерики. Вся эта оптимизация для контейнерных variant-ов идет лесом, она также идет лесом для вариантов наследованных от обыных классов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает. Эти ссылочные поля нельзя перекрывать нессылочными. Только ты GC все-равно не поломаешь, среда исполнения просто не загрузит такую сборку. Я же не зря упомянул процесс "упаковки". Должен быть внутри адресного поля объекта некий "пул" под объединение нессылочных и отдельно ссылочных полей.
И еще, если мы имеем в варианте структуру, состоящую более чем из одного поля, а также без LayoutKind, то оптимизация опять же идет лесом.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>На самом деле делать АлгТД в виде единого блока данных (вэлью-типа если по дотнетному) можно даже если АлгТД рекурсивный. МЛ именно так и поступает, если я не ошибаюсь.
В OCaml если конструктор АлгТД без параметров то он представлен целым числом, иначе прямой указатель на блок памяти (в куче) со значением параметра конструктора. Реинтерпретация памяти не используется.
ГВ>Какой именно тип должен быть указан в качестве RulePattern прямо сейчас сказать не могу.
Никакой. В таком виде ты код не перепишешь. Пример того как это можно сделать показал vdimas. Но в его варианте тоже проблем выше крыши. Так что в реальной жизни люди реализуют паттерн посетитель и дальше пишут много ифов. Кор разрастается как раз где-то в 10 раз. И чем сложнее паттерны, тем более объемным получается аналог на языке без ПМ. Очень скоро объем кода становится таким, что управлять им становится сложно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков.
Отсутствие практической необходимости. Имеющегося знания asm,C,Java,JavaScript,HTML,SQL достаточно для решения любых задач, которые у меня появляются или могут возникнуть. Ради интереса смотрел на Scala, haskell, C#, но в этом всем нет никакого смысла. Может быть, изучил бы Ceylon, когда под него будет IDE.
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Аналогично — нет практической необходимости.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Не, этот код я полностью не могу прочесть, потому что смутно представляю себе постановку задачи. ПМ, язык — это всё шелуха. Кстати, спасибо, что объяснил, что именно и зачем тут оптимизируется.
Нет, уважаемый. Код тут вполне очевидный. Вон тот же vdimas разобрался с ним на раз. Даже нашел реальный недостаток — небольшое дублирование функционала. А вот ты его не понял.
VD>>Ген. Не моли чушь просто от того, что ты не понимашь написанного. Ну это же бред.
ГВ>А... Да, есть ошибочка.
Это не ошибочка. Это полное непонимание. Оно не мудренно. ПМ — это действительно другой подход к программированию. Но я тебе уверяю, что освоить его полезно просто для собственного развития.
ГВ>Вызов optimizie нужно было записать примерно так: optimize(And(r.Location, rule.r.r), чтобы показать, что новый узел формируется из вложенного. Но это простительная неточность в данном случае.
Ага. Это простительная. Это — опечатка. А вот это "if (match(rule, Not(Not()))" полная чуешь.
ГВ>Я же полностью рабочий код не собирался делать.
А кому интересны не работающие выдумки? Я тогда могу тоже код представить: Done! и заявить, что он решает данную задачу.
ГВ>Кстати, Not(Not()) может быть заменён на статическую константу:
ГВ>
Ну, то есть ты перемещаешь код проверки объекта в match. А что тогда ее код не приводишь?
Кроме того ты не понял важной фишки ПМ. ПМ не только распознает паттерн, но и производит декомпозицию структуры данных.
Паттерн:
| Not(Not(rule)) => ... rule ...
означает выполнить код "... rule ..." в случае если сопоставляемый объект это экземпляр типа None у которого поле rule яляется так же экземпляром типа None, и если этот паттерн распознался, то связать с полем rule вложенного типа локальное имя rule. В коде обработчика (том что идет за =>) в rule будет находиться ссылка на поле вложенного типа. Кроме того тип поля rule Rule (а это базовый тип для Not и остальных правил), так что ПМ за одно осуществляет проверку типов.
ГВ>Спасибо за перевод, но это мне понятно.
Очевидно же, что не понятно. Или надо констатировать факт — ты обманываешь намеренно.
ГВ>Конечно, не гарантируется. Только кто тебе сказал, что по отношению к такому примеру цикл заметно ухудшит код?
Мне говорить не надо. Я это на своей шкуре проходил. Это и замедление, и возможность вылететь по переполнению стека.
ГВ>Цикл тут один, подразумевается он в любом случае, хотя бы в виде tail-оптимизированной рекурсии через ПМ, так что, на "понимаемость" кода его введение повлияет слабо.
Ну, ты давай, перепиши весь пример на знакомом тебе языке, так чтобы он работал и сравним.
С рекурсией здесь все шоколадно, а цикл сразу добавит грязи.
ГВ>Да и управляться он, пожалуй, будет лучше.
ГВ>Иными словами, приведённый фрагмент будет выглядеть где-то так:
ГВ>
Это бред, который даже не скомпилируется. Зачем повторяться?
VD>>2. Компилятор немерла работает не с объектами, а свариантами. Это позволяет ему контролировать, что match-и обрабатывают все возможные сочетания. В твоем случае такая проверка невозможна в приципе.
ГВ>Хм. Not(Sequence(rule)) где? Ты ведь говоришь обо всех возможных сочетаниях, нет? Кстати, сочетания какой длины гарантированно контролируются?
Контролируется, что в операторе match перехвачены все случаи, а не то что в коде присутствует перемножение всех сочетаний. В частности гарантируется, что все случаи применения Not и And обработаны так как в конце:
идут два паттерна сопоставляемые с Not и And имеющими любые параметры. Образец And(rule) — это образец-конструтор. Он описывает объект в терминах его создания через конструктор. "rule" соответствует параметру конструктора. Этот паттерн связывает значение поля rule с локальной переменной с именем rule. При этом в rule может быть любой объект типа Rule. Rule — это вариантный тип (АлгТД). Вот его описание. Из описания не трудно понять, что поля rule в Not и And — это рекурсивные ссылки на Rule.
Таким образом верхние паттерны (например, Not(Not(rule))) распознаю частные случаи, а нижние (например, Not(rule)) более общие.
В ПМ важен порядок. Паттерны идущие выше более приоритеные. Если они сопоставились, то нижние уже не проверяются.
VD>>Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель. Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше.
ГВ>Влад, ты когда с самим собой разговариваешь, клавиатуру в сторону отодвигай. При чём тут паттерн "посетитель"?
При том, что он описывает список веток которые нужно посещать и как и ПМ гарантирует, что ты не забудешь посетить их все.
ГВ>То есть я понимаю, каким боком его тут можно привинтить, но это как тебе сказать... Нечто вроде метода показать наихудший из возможных способов реализации. Здесь самая обыкновенная трансформация дерева структур, даже ОО-стиль особо-то впихивать некуда.
Посетитель наилучший способ из имеющихся в арсенале ООП. Код обработки выделяется в одном месте. Есть возможность гарантировать, что посещены все ветки. Можно добавлять другие обработки не ломая уже существующие и не вводя тонны методов (по одному на каждую ветку).
Если тебе это не очевидно, я не виноват.
Вариант с МП обладает всеми теми же достоинствами плюс:
1. Намного более краткий.
2. Позволяет легко обрабатывать сложные случаи (вложенные паттерны).
В приведенном примере вложенность небольшая (2). Но она не ограничена. И чем сложнее анализ, тем полезнее становится ПМ.
VD>>Так что насмехаешься и горлопанишь ты тут исключительно от своей невежественности. Ну, а приведенный тобой "код" просто нерабочий.
ГВ>Конечно, не рабочий, я и не пытался делать его рабочим. Я тебе что, полный PEG-парсер буду переписывать?
Ну, а что обсуждать набор символов нечего не имеющий с реальным кодом?
ГВ>Не, Влад, эпопею с делегатами я повторять не буду — одного раза мне хватило.
Я не слышал про эпопею с делегатами, но если там ты приводил такой же бред вместо года, то понятно что ты "победил" в том споре. Ведь всегда можно написать краткий и понятный, но неправильный код.
ГВ>Это не значит ничего. То есть я хотел сказать, что в соответствии с правилами форума ФП из этих двух фактов можно сделать совершенно любой вывод.
Ты? Да, пожалуй.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Что вас останавливает от изучения нового языка?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>А я как раз и ваяю динамический и жестко функциональный. И фидбек бы мне не помешал
Ela не помещал бы interop, то что ты называешь биндингами.
Ela ты в статьях сравниваешь с Javascript, но он может обращаться к Com-объектам, например, а Ela нет Твои предложения делать обертки для каждого .Net класса выглядят не очень.
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>А я как раз и ваяю динамический и жестко функциональный. И фидбек бы мне не помешал
A>Ela не помещал бы interop, то что ты называешь биндингами. A>Ela ты в статьях сравниваешь с Javascript, но он может обращаться к Com-объектам, например, а Ela нет Твои предложения делать обертки для каждого .Net класса выглядят не очень.
Пока писал подумалось.
Есть ли Ela поддержка xml?
Передаем на вход сериализованный объект, Ela c ним что-то делает и отдает сериализованный объект наружу.
VE>С учётом написания not = typeof(Not) и другого boilerplate в 2-3 строки код станет не сильно хуже изначальной лапши. VE>Частные случаи, которые под этот вариант не подпадут, уж никак 20-кратного отставания не принесут.
Это очередной говнокод. В добавок еще и дико медленный.
Всем кто хочет эмулировать МП в рантайме — сливового геморрой!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, gandjustas, Вы писали:
G>То есть единого источника к которому можно обратиться за справкой таки нет.
http://nemerle.org на английском. rsdn на русском.
G>Ну конечно, отличие только в том что мусора в форуме на несколько порядков больше и найти информацию там труднее.
Особо ценная информация вынесена в Q&A. Ну, а если язык интересен, то вряд ли форум будет для тебя мусором.
Просто не надо изучать язык для галочки. Или берешся за изучение и тогда информации более чем достаточно (проверенно на множестве людей), или он тебе не нужен, и тогда хоть альманах напиши, но ты ничего не найдешь и ничего не изучишь.
VD>>Это ты тоже придумал. На практике по этим курсам учат студентов в польском институте. G>Я так понимаю что обучали те, кто писал nemerle. Ксттаи не поленись и попробуй прощелкать все ссылки, половина ведут вникуда.
Еще раз. Не настраивай себя исходно негативно. Ты C# знаешь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Что вас останавливает от изучения нового языка?
Здравствуйте, Mystic, Вы писали:
M>Читаю некоторый обзор, придумываю задачу, которая должна соответствовать языку и потом начинаю на нем писать решение. В ощущения входит: (1) легкость быстрого старта (2) тормоза (3) хорошая диагностика ошибок (4) быстрый поиск по документации ответов на вопросы (5) бенефиты перед уже известными языками.
Пожалуй двигательный подход. Интересно почему такой ответ только одни?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
M>>Читаю некоторый обзор, придумываю задачу, которая должна соответствовать языку и потом начинаю на нем писать решение. VD>Интересно почему такой ответ только одни?
Потому что как правило "придумать себе задачу" == "высосать её из пальца". "Когда результат никому не нужен, трудно процесс сделать захватывающим." (c) МихМих.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Ela не помещал бы interop, то что ты называешь биндингами.
Обвертки так или иначе делать придется. Собственно, посмотри на F#. Хочешь писать в функциональном стиле — только через обвертки, без этого имеешь тупые tupled функции, с которыми ничего интересного не сделать.
Так же и тут. Можно сделать интероп, но он будет слабо юзабелен. Параметры аргументов в функциях неправильные, первым аргументом для большинства будет какой-то this, который непонятно вообще что за зверь и пр. Зачем нужен такой интероп? А времени на него придется убить немало, одна перегрузка чего стоит.
A>Ela ты в статьях сравниваешь с Javascript, но он может обращаться к Com-объектам, например, а Ela нет Твои предложения делать обертки для каждого .Net класса выглядят не очень.
По факту даже не так. Надо делать не обвертки для каждого класса — если бы было так просто, то этот процесс легко бы автоматизировался — а переводить .NET API в более функциональное. Императивный код и ОО-код на Ela писать в принципе можно, но это неудобно.
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает. Эти ссылочные поля нельзя перекрывать нессылочными.
Это да. Но это не декларируется. Стало быть это будет закладывание на особенности реализации. Вот перепишут ЖЦ и что будет тогда?
V>Только ты GC все-равно не поломаешь,
Я ломал. Во втором рантайме по крайней мере. Достаточно добавить атрибуты задающий отстпы полей в структуре и получаешь вылет ЖЦ. Там тупой С++-ный код. Я описывал примерный алгоритм здесь
.
V>среда исполнения просто не загрузит такую сборку.
Еще как загрузит. Уж не знаю к счастью или к огорчению. Вот верификацию может такая сборка и не пройдет. Но верификация при запуске не делается.
V>Я же не зря упомянул процесс "упаковки". Должен быть внутри адресного поля объекта некий "пул" под объединение нессылочных и отдельно ссылочных полей.
Это все оверкил. Еще о вариантах в которых все поля — вэшлью-типы можно подумать. А если появляются ссылочные поля, то овчинка просто не стоит выделки.
Потом такая оптимизация изменит семантику. Ведь у вэлью-вариантов будет семантика копирования. Если для неизменяемых вариантов это еще как-то прокатит, то для изменяемых может привести к очень странным эффектам.
Да и по жизни это все не нужно. Варианты обычно используются для описания сложны структур данных. Обычно они являются рекурсивными. Тот мизерный процент простых вариантов просто не даст никакого эффекта (кроме усложнения компилятора).
V>Вот простеший пример, я поля вручную раскидал, ссылочные перекрывают ссылочные, нессылочные перекрывают нессылочные: V>Отлично вызываются все финализаторы. Запусти проверь. Заметь, я поставил не просто два экземпляра похожих типов, но один из них завернул в коллекцию List<>.
Я прекрасно знаю семантику этого дела. В таком варианте работать будет. Только вот это ты для конкретного примера поля подобрал. В раельности все будет не так радужно. Будут вхождения только с вэлью-типами, а будут только со ссылочными. В итоге получим полное дублирование.
Уже четрые поля размером по 32 бита делают делаю структуру невыгодной с точки зрения производительности.
Получается, что подобная оптимизация будет распространяться на очень малое количество применений.
А вот в компиляторе для этого придется натыкать множество проверок. Так что лично я бы на это не пошел.
V>По моим замерам, для небольших структур (на десятки байт), во многих сценариях было быстрее почти на порядок использовать эффективнее стековые объекты, чем из кучи.
Это потому что у тебя тесты не реальный. 10 байт это по сути два поля. Причем вариант не должен содержать вхождения только вэлью-полей и только ссылочных.
Ну, и тесты тоже скорее всего к реальной жизни отношения не имеют. Варианты нужны там где с их помщью описывается модель. А там твои оптимизации не прокатят (рекусрия и много полей). Остальные случаи будут иметь столь малое влияние на производительность что смешно даже об этом говорить.
И вообще, говорить о производительности по синтетическим тестам и предполжения — это верх безрассудсва. Я этого уже наелся. Недавняя история с переводом вариантов на мсильныые switch-и очень характерна. Предположения об ускорении не оправдались ни на грош.
V> Понятное дело, что компилятор должен иметь верхний предел размера объекта после операции всех упаковок для принятия решения о технике реализации конкретного АлгТД.
Ладно. Время затраченное на этот разговор уже превысило разумное.
Если ты считаешь свои предположения верными, я тебе могу предоставить полигон для исследований. Делай брэнч и реализуй свою идею. А там посмотрим во что это тебе станет, и что это даст на практике. Скомпилируем измененным компилятор компилятор же и посмотрим насколько изменилась его производительность. Уверен, что выхлоп будет нулевой. Но если я все же не прав, то я сниму шляпу и попрошу прощения.
VD>>Смысла нет. На копировании в итоге проиграешь. Разве что ли для вариантов с одним полем. Но это как раз редкость.
V>Где-то на копировании проиграешь, а где-то за счет -1 уровню косвенности прилично выиграешь. Про верхний предел в размере я уже сказал и его было бы неплохо поискать через эксперименты. Или же явно дать программисту возможность управлять этим, MS же не постеснялась ввести ключевое слово struct. Потому как не только размер имеет значение, но и сценарии использования. Почему бы не ввести некое "variant value"?
Потому что это лишняя сущность не дающая ничего кроме производительности.
Пойми, если нужно создать очень быстырй код, то в нем просто не место ни вариантам, ни объектам, ни даже полиморфизму. Погляди на код который порождает тот же PegGrammar. Это ужасный код в стиле С времен К&Р. Но он действительно быстр!
У немерла свой путь. Его путь — это очень высокий уровень при статическйо типизации с возможность, если надо, сгенерировать очень быстрый код.
По этому обычной практикой бывает забить на оверхэд абстракций вроде вариантов и лямбд. Ну, а если нужна производительность, то мы добиваемся ее путем генерации кода во время компиляции.
Описанный код оптимизации правил работает именно во время компиляции. Более того он может работать только когда компилируется оптимизированная релиз-версия программы. По сему он отнимает время только во время компиляции. К тому же он довольно быстр. Объектная модель грамматики не так уж велика. Это какая-то жалкая сотня правил (даже десяток тысяч объектов не затормозит существенно его работу).
VD>>Многие варианты рекурсивны и имеют по 3 и более полей. Делать разную семантику для одной и той же сущности?
V>Фишка в том, что даже рекурсивные АлгТД вполне выполнимы по этой технике и во многих простых случаях дают прирост за счет буста наиболее частой операции — получения головы. Почти все алгоритмы смотрят/матчат значение головы, а тут -1 на косвенность. Это не мало.
ОК, убедил речисты. Я не согласен с твоими предположениями по повышению скорости. Если тебе не жалко своего времени, то дерзай — проверяй. Только реальная реализация может показать прав ты или нет.
V>Дополнительные оптимизации к этой только плюсуются и никак ей не помешают. Передача небольших типов по значению — это самое естественное в программировании.
Не спорю. Но любая оптимизация — это многоаспектная задача. Просто так предсказать результат практически невозможно. К тому же любая оптимизация не бесплатна. Она неизбежно ухудшит код компилятора.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Что вас останавливает от изучения нового языка?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Обвертки так или иначе делать придется. Собственно, посмотри на F#. Хочешь писать в функциональном стиле — только через обвертки, без этого имеешь тупые tupled функции, с которыми ничего интересного не сделать.
Это отмазки. Немерле никаких проблем не имеет.
Так что сделать можно.
Нужно только сразу делать как надо.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[31]: Что вас останавливает от изучения нового языка?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, alvas, Вы писали:
A>>Ela не помещал бы interop, то что ты называешь биндингами.
ВВ>Обвертки так или иначе делать придется. Собственно, посмотри на F#. Хочешь писать в функциональном стиле — только через обвертки, без этого имеешь тупые tupled функции, с которыми ничего интересного не сделать.
Так в N вроде без оберток. Или но не функциональный?
Самое основное — стремящаяся к нулю вероятность использования в работе.
К сожалению, на просторах СНГ старую недобрую Java требуют гораздо чаще.
Будут идеи — попробую в своих собственных проектах.
К тому же, со временем стал относиться к ЯП просто как к инструменту. Проектирование системы, R&D, постановка цели для меня сейчас вышли на первый план.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>В OCaml если конструктор АлгТД без параметров
Вхождение без параметров в немерле переписывается в синглтон. Он тоже практически бесплатен. Ну, а если все элементы без параметров, то на то есть enum.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
V>>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает.
H>Всё это очень здорово. Если бы не одно но — в дотнете есть генерики. Вся эта оптимизация для контейнерных variant-ов идет лесом, она также идет лесом для вариантов наследованных от обыных классов.
Тогда тем более, стоит ввести еще одно ключевое выражение, типа
struct A {}
struct B {}
variant value UnionAB { |A:A; |B:B; };
Никто же не страдает, что структуру в дотнете нельзя от класса унаследовать.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
V>>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает. Эти ссылочные поля нельзя перекрывать нессылочными. Только ты GC все-равно не поломаешь, среда исполнения просто не загрузит такую сборку. Я же не зря упомянул процесс "упаковки". Должен быть внутри адресного поля объекта некий "пул" под объединение нессылочных и отдельно ссылочных полей.
H>И еще, если мы имеем в варианте структуру, состоящую более чем из одного поля, а также без LayoutKind, то оптимизация опять же идет лесом.
Из-за этого очевидного аргумента я сделал пример чуть более избыточным, чем надо было. Просмотри еще раз на код, рассмотрен именно сей случай.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
если не брать во внимание аспект сложности (кому-то легко, кому-то сложнее, кто-то вообще останется на уровне "Hello world"), то все определяется стимулом, а вернее его отсутствием. синтаксические, идеологические и уж политические заморочки взламываются легче тогда когда стимул сильнее
а вот уже стимул — это сложная штука. я щас вообще с трудом нахожу стимул на работе
вот последний мой пример возможно переберусь на другую работу осенью и вернусь к старым делам ... а там вроде бы появлися свет в тунеле — стандард uTCA и уж FPGA, которое я уже лет 5-10 хочу научится программировать, рулит по полной. взял софт, и даже плату к нему. установил на рабочем компе, поковырялся часок и решил дома продолжить. а дома софт на home edition не встал ... все пипец — уже неделю на работе не остаюсь по вечерам и в выходные не приезжаю ... это воскресенье хотел, очень хотел, а еще хотел до бассейна добраться поплавать хоть разок за прошедшую неделю ... в итоге пошел хайкать до дюн
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Это понятно, просто сия задача оптимизации сильно привязана к типу узла, и я многократно видел (и сам так же организовывал оптимизацию графов выражений) именно через ее реализацию в теле соответствующего объекта, представляющего узел. Бо задача как бы обязательная при построении графов выражений. Как минимум от лишних скобок (ваше And(And))) всегда избавляются.
И что тут лишнего?
V>Хотя, после пояснения относительно ограничений хвостовой рекурсии в N все вопросы отпадают. Беда, тут нечего обсуждать. V>Вот этим стоило заняться в первую очередь. Просто все остальное бросить и заняться этим. Ибо (посмотри чуть со стороны) влияние фичи конкретной реализации компилятора на стиль писания на языке (а компилятор и язык, по идее, не одно и то же, хоть и верно для ваших реалий), это жирный такой минус. Факт: приведенный код сразу же сказал о св-вах компилятора заглянувшему человеку со стороны. Показательно.
Показательно что ты снова несешь бред на ровном месте.
Я этот код писал не задумываясь о каких либо оптимизациях.
И я не вижу ни одной причины написать его иначе.
V>Смотреть надо. Посетитель тоже тормоз порядочный, хоть и быстрее обычно на порядок, чем развесистый ПМ.
Лол.
Учитывая что ПМ очень даже может тупо по таблицам работать...
V>Если не привязываться в AST к виртуальным вызовам и некоему "базовому интерфейсу", который не облокотился при наличии структурной типизации на шаблонах в С++, то конечно! бежать по файлам и добавлять легковесные операции в специализированные легковесные объекты, всё в инлайне и без виртуальных вызовов.
Чего? Тут ссылки на базовый класс.
Какие к черту шаблоны?
V>Так можно:
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
VD>>Особо ценная информация вынесена в Q&A. Ну, а если язык интересен, то вряд ли форум будет для тебя мусором.
A>Где можно посмотреть список фич, которые добавились после поляков?
Ну, вот если глянуть те же Q&A начиная с 2008-го года, то все это новые фичи.
Из особо интересныех я бы выделил улучшение вывода типов позволяющиее использовать линк-ту-обжект. Поддержка линка. ComputationExpressions (async, yeild внутри выражений), оператор .?. ПМ по обычным объектам.
Специальным образом мы не делили Немерл на эпоху поляков и после них.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Что вас останавливает от изучения нового языка?
Мне это обсуждение надоело. Так что отвечу только на это:
V>А как с тобой люди работают? После пары итераций любого технического обсуждения с тобой самый адекватный ответ на твои выпады — это предложения эротического плана. В общем, поменьше рефлексии.
Как не странно не плохо работают. Когда речь идет на уровне громких заявлений, а на уровне продумывания реализации, то люди становятся в разы адекватнее. С теми кто не становится я попросту не общаюсь.
Вот когда ты вместо того чтобы изрекать громкие фразы вроде "реализовали не подумав" (или как там?) начал продумывать реализацию, то с тобой стало можно общаться. Ты стал более адекватен. И заметь! Громкие оскорбительные выкрики сами собой исчезли сами собой.
Я тебе на полном серьезе предлагаю реализовать твою идею в компиляторе немерла. Я тебе помогу, а ты сможешь оценить как со мной общаться в конструктивной манере.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, hardcase, Вы писали:
V>>>Дык, ссылочные поля могут как раз могут перекрывать друг друга, и GC отлично работает. Эти ссылочные поля нельзя перекрывать нессылочными. Только ты GC все-равно не поломаешь, среда исполнения просто не загрузит такую сборку. Я же не зря упомянул процесс "упаковки". Должен быть внутри адресного поля объекта некий "пул" под объединение нессылочных и отдельно ссылочных полей.
H>>И еще, если мы имеем в варианте структуру, состоящую более чем из одного поля, а также без LayoutKind, то оптимизация опять же идет лесом.
V>Из-за этого очевидного аргумента я сделал пример чуть более избыточным, чем надо было. Просмотри еще раз на код, рассмотрен именно сей случай.
Я посмотрел внимательно. Я просто знаю, что sizeof можно вычислить в компайлтайме лишь для примитивных типов (int, double...). Попробуй в свой пример вместо int подставить GCHandle.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[32]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
ВВ>>Обвертки так или иначе делать придется. Собственно, посмотри на F#. Хочешь писать в функциональном стиле — только через обвертки, без этого имеешь тупые tupled функции, с которыми ничего интересного не сделать. A>Так в N вроде без оберток. Или но не функциональный?
Ну N по крайней мере, скажем так, сильно гибридный. И спроектированный под дотнет по сути. Что приводит к ряду особенностей.
Вообще не особо хочется распространяться по поводу N в этой ветке, очередной срачь начнется.
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Из особо интересныех я бы выделил улучшение вывода типов позволяющиее использовать линк-ту-обжект. Поддержка линка. ComputationExpressions (async, yeild внутри выражений), оператор .?. ПМ по обычным объектам.
Что такое ПМ?
VD>Специальным образом мы не делили Немерл на эпоху поляков и после них.
Это понятно. Просто язык учил по польским талмудам + первые твои статьи.
Здравствуйте, alvas, Вы писали:
A>Это понятно. Просто язык учил по польским талмудам + первые твои статьи.
A>ЗЫ. Поддерживаются ли фичи 4.0 фреймворка?
DLR — нет. Но он не особенно востребован.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, VladD2, Вы писали:
VD>>Из особо интересныех я бы выделил улучшение вывода типов позволяющиее использовать линк-ту-обжект. Поддержка линка. ComputationExpressions (async, yeild внутри выражений), оператор .?. ПМ по обычным объектам.
A>Что такое ПМ?
Pattern matching — сопоставление с образцом.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[33]: Что вас останавливает от изучения нового языка?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, alvas, Вы писали:
ВВ>>>Обвертки так или иначе делать придется. Собственно, посмотри на F#. Хочешь писать в функциональном стиле — только через обвертки, без этого имеешь тупые tupled функции, с которыми ничего интересного не сделать. A>>Так в N вроде без оберток. Или но не функциональный?
ВВ>Ну N по крайней мере, скажем так, сильно гибридный. И спроектированный под дотнет по сути. Что приводит к ряду особенностей. ВВ>Вообще не особо хочется распространяться по поводу N в этой ветке, очередной срачь начнется.
Ну то что Ela вещь в себе ты согласен? Сначала глянул — вау, зашибись, а потом подумал — как его использовать?
По сути текст на входе — текст на выходе. Можно и так вообще-то, но если что-то посложнее строки текста — начинаются проблемы. Вот и предлагаю — сделай поддержку xml или json — будет проще объекты серелизовать.
Здравствуйте, VladD2, Вы писали:
VD>Это да. Но это не декларируется. Стало быть это будет закладывание на особенности реализации. Вот перепишут ЖЦ и что будет тогда?
Ничего не измениться. GC пользует информацию о типах времени исполнения, поэтому все ссылки для него аналогичны ссылкам на нетипизированный Object. Это принципиально, иначе как бы он работал, например, для полей типа Object?
VD>Еще как загрузит. Уж не знаю к счастью или к огорчению. Вот верификацию может такая сборка и не пройдет. Но верификация при запуске не делается.
Попробуй еще раз на 3.5. Опять же, я ломать не призываю. Наоборот — надо корректно распределять поля.
VD>Потом такая оптимизация изменит семантику. Ведь у вэлью-вариантов будет семантика копирования. Если для неизменяемых вариантов это еще как-то прокатит, то для изменяемых может привести к очень странным эффектам.
Таким же точно как и у обычных value-типов сейчас, когда некое св-во имеет value-тип. Например Rectangle Control::Bounds {get;}. Что в случае попыток изменения полей временных объектов говорит компилятор C# — этого вполне достаточно.
И замечание насчет иммутабельности — отличное. Есть ли возможность объявлять иммутабельные типы как таковые в N? Если есть — то это тоже первые кандидаты, даже со ссылочными полями.
VD>Да и по жизни это все не нужно. Варианты обычно используются для описания сложны структур данных. Обычно они являются рекурсивными. Тот мизерный процент простых вариантов просто не даст никакого эффекта (кроме усложнения компилятора).
Это потому что у вас такая область деятельности — компилятор писать. А сколько я видел примеров на том же Хаскель — приличная доля вариантов очень простые.
VD>Я прекрасно знаю семантику этого дела. В таком варианте работать будет. Только вот это ты для конкретного примера поля подобрал. В раельности все будет не так радужно. Будут вхождения только с вэлью-типами, а будут только со ссылочными. В итоге получим полное дублирование.
Логично, я же предложил явно управлять этой фичей, т.е. остаавить прежнее поведение по-умолчанию. Программист же сейчас каким-то макаром разбирается, где ему на шарпе писать class, а где struct. Разберется и тут. Это всё часть знаний о плюшках языка.
VD>Уже четрые поля размером по 32 бита делают делаю структуру невыгодной с точки зрения производительности.
Не прав. Зависит исключительно от сценариев. Можно подобрать сценарий, где и 8 байт будет неэффективно юзать по значению.
VD>Получается, что подобная оптимизация будет распространяться на очень малое количество применений.
Разумеется, как и все value-типы сейчас. Но речь идет о самых узких в плане эффективности местах, только там идут на все жертвы и неудобства, связанные с value-типами (а они дейсвительно очень неудобны в сравнении с классами в дотнете). Я вот экспериментировал прилично с мультимедиа на дотнете, так вот, многие сценарии без value-type просто не работают. Непрерывного выделения 100к объектов в секунду никакой GC не выносит, получаются паузы, влияющие на кач-во звука и плавность видео. На value-типах напротив, без проблем.
VD>Ну, и тесты тоже скорее всего к реальной жизни отношения не имеют. Варианты нужны там где с их помщью описывается модель.
Для всяких протоколов discriminated union очень вкусная фича. Я же говорю — у вас специфика особенная. Одни AST вокруг.
VD>И вообще, говорить о производительности по синтетическим тестам и предполжения — это верх безрассудсва. Я этого уже наелся. Недавняя история с переводом вариантов на мсильныые switch-и очень характерна. Предположения об ускорении не оправдались ни на грош.
Не понял, вы начали переделывать код ДО экспериментов? Или тебя огорчил сам факт проведения эксперимента?
VD>Если ты считаешь свои предположения верными, я тебе могу предоставить полигон для исследований. Делай брэнч и реализуй свою идею. А там посмотрим во что это тебе станет, и что это даст на практике. Скомпилируем измененным компилятор компилятор же и посмотрим насколько изменилась его производительность. Уверен, что выхлоп будет нулевой. Но если я все же не прав, то я сниму шляпу и попрошу прощения.
Лучше поискать задачу с большим кол-вом маленьких АлгТД.
VD>Потому что это лишняя сущность не дающая ничего кроме производительности.
Логично.
VD>Пойми, если нужно создать очень быстырй код, то в нем просто не место ни вариантам, ни объектам, ни даже полиморфизму. Погляди на код который порождает тот же PegGrammar. Это ужасный код в стиле С времен К&Р. Но он действительно быстр!
На дотнете тоже можно писать быстрый код, поверь. Бесит лишь сценарий обработки массивов, когда массивы используются как предвыделенные буфера памяти, т.е. без возможности использовать оптимизацию for для массивов. Приходится пользовать unsafe для пробежки по памяти. В случае же обработки графов объектов, дотнет никакому нейтиву не уступает. И как везде, чем меньше косвенность, тем эффективнее.
VD>У немерла свой путь. Его путь — это очень высокий уровень при статическйо типизации с возможность, если надо, сгенерировать очень быстрый код.
И я так считаю, что все сложности — это внутреннее дело компилятора в итоге. А в жизни оно по-всякому бывает. Например, когда мы активно использовали тогдашний RFD, по моим замерам мы много теряли на нетипизированном чтении всех полей как object из db-ридера. Я еще тогда предлагал IT сделать матрицу типизированных ридеров, но был полный игнор сего предложения. В итоге, кое-как у себя для пары самых критичных мест сделали, на этом всё. Через 3 года они таки это сделали в BLT в общем виде, и тесты на производительность говорят сами за себя.
VD>Описанный код оптимизации правил работает именно во время компиляции.
Это не имеет отношение к примеру кода. О чем он, я понял и так, это видно по имени ветки репозитория. Это было очень давнее наблюдение и раскрутить тебя на сей разговор я уже пытался примерно 4 года назад. Вам было не до того. Но сейчас же в разработке новая версия компилятора. Как бы самое время.
А тесты можно и нужно провести ДО переделки компилятора. Т.е. подобрать пример, где будет много маленьких АлгТД, прогнать бинарник через рефлектор (подшаманить, где надо, чтобы рефлектор не спотыкался), восстановить в C# (ибо там value-type доступны), и уже там экспериментировать. Дорогостоящие по времени эксперименты никому не нужны.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, alvas, Вы писали:
A>>Это понятно. Просто язык учил по польским талмудам + первые твои статьи.
A>>ЗЫ. Поддерживаются ли фичи 4.0 фреймворка?
H>DLR — нет. Но он не особенно востребован.
Зря ты так. Cейчас изучаю ASP.Net MVC 3 — там без этого никак
Здравствуйте, hardcase, Вы писали:
H>Я посмотрел внимательно. Я просто знаю, что sizeof можно вычислить в компайлтайме лишь для примитивных типов (int, double...). Попробуй в свой пример вместо int подставить GCHandle.
Э нет, ты не туда смотришь. Я поля из целевых структур храню, а не сами структуры как "черные ящики". Согласен, что тут есть к чему придраться, но для типов из этой же сборки такой подход работает.
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>Разница есть даже между двумя Запорожцами. A>>Вопрос насколько она принципиальна. A>>Между Запорожцем и Бугурти (к стати, что это?) принципиальной разницы нет. VE>Бугатти. A>>Метро всё равно быстрее их обоих. A>>А мне надо ехать.
VE>Ну дак метро ещё не построили по твоим же словам. Получается, чёрт с ним с Бугатти, я и на запоре покатаюсь?
Ты очень далеко увел аналогию от обсуждаемой темы.
Я не знаю, что такое "посторили метро" или "не построили метро"
применительно к процессу написания программы.
Моё утверждение просто как палка:
был бы хороший алгоритм, а реализовать его можно хоть на хинди. Язык не важен.
Вот с этим спорь.
PS. У меня даже Запорожца нет. Предпочел деньги потратить на квартиру.
Течёт вода Кубань-реки куда велят большевики.
Re[22]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, hardcase, Вы писали:
H>>Я посмотрел внимательно. Я просто знаю, что sizeof можно вычислить в компайлтайме лишь для примитивных типов (int, double...). Попробуй в свой пример вместо int подставить GCHandle.
V>Э нет, ты не туда смотришь. Я поля из целевых структур храню, а не сами структуры как "черные ящики". Согласен, что тут есть к чему придраться, но для типов из этой же сборки такой подход работает.
"Туда" я тоже смотрел Посему резюмирую:
1) работает лишь для структур из того же компилируемого модуля,
2) работает без наследования,
3) затруднено использование из C#.
Я считаю что этот слишком специфический случай, лучше поддержать макробиблиотекой и активными паттернами.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, alvas, Вы писали:
H>>>DLR — нет. Но он не особенно востребован.
A>>Зря ты так. Cейчас изучаю ASP.Net MVC 3 — там без этого никак
H>А я на нем (ASP.NET MVC 3) код боевой пишу. Вполне обходимся без этой нетипизированной мерзости.
Здравствуйте, hardcase, Вы писали:
H>Стопицот строк бессмысленного и по сути ненужного кода хэлперов супротив оригинальных 100?
Дык, в оригинальном само описание типов узлов не приведено, а без них эти 100 не работают. Т.е. это за рассматриваемым кодом, и я тоже привел код, который "за". И всего +10 строк кода хелперов, посчитай внимательнее.
А насчет нужности... За читабельный синтаксис всегда платить приходится. Код макросов немерле зачастую вообще птичий язык. Но на это идут ради получаемых красивостей.
Re[34]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Ну то что Ela вещь в себе ты согласен?
Не больше чем другие функциональные языки
A>Сначала глянул — вау, зашибись, а потом подумал — как его использовать?
Для чего использовать? Если для ембединга, то так и так лучше свое АПИ отдельно описать.
A>По сути текст на входе — текст на выходе. Можно и так вообще-то, но если что-то посложнее строки текста — начинаются проблемы. Вот и предлагаю — сделай поддержку xml или json — будет проще объекты серелизовать.
Тут я не понял. Можно поконкретнее? Глобальная задача "интеропа" решается сложно и криво, но вот конкретные задачи решатся могут легко и просто. Скажем, автоматически транслировать дотнетовый класс в запись Ela, и делать обратный маппинг — не слишком сложная задача.
Наконец это, все типы Ela вполне юзабельны из того же C#
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, VoidEx, Вы писали:
A>Ты очень далеко увел аналогию от обсуждаемой темы. A>Я не знаю, что такое "посторили метро" или "не построили метро" A>применительно к процессу написания программы.
A>Метро всё равно быстрее их обоих.
Сам придумал, сам не знаешь?
A>Моё утверждение просто как палка: A>был бы хороший алгоритм, а реализовать его можно хоть на хинди. Язык не важен. A>Вот с этим спорь.
Ты аналогию придумал, сам ввел метро, вот теперь и потрудись рассказать, что есть метро? Алгоритм? Тогда каким местом стоит выбор между метро (алгоритм) и автомобилем (языком)?
А если это язык, который есмь побыстрее остальных, то назови ж нам его.
Алгоритм — это путь; в пробочном пути ехать на мерсе дольше, но это не значит, что по более быстрому пути теперь можно и на запоре гонять.
Re[34]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Ну то что Ela вещь в себе ты согласен? Сначала глянул — вау, зашибись, а потом подумал — как его использовать? A>По сути текст на входе — текст на выходе. Можно и так вообще-то, но если что-то посложнее строки текста — начинаются проблемы. Вот и предлагаю — сделай поддержку xml или json — будет проще объекты серелизовать.
Ну вот, например, "концепт" универсальной обверточки, через которую в Ela можно скормить любой объект:
public sealed class ElaWrapper<T> : ElaObject
{
private readonly T obj;
public ElaWrapper(T obj)
{
this.obj = obj;
}
protected override ElaValue GetField(string field)
{
var pi = typeof(T).GetProperty(field);
return ElaValue.FromObject(pi.GetValue(obj, null));
}
}
Теперь ты можешь делать так:
class MyType {
public int value { get; set; }
}
var elaObj = new ElaWrapper<MyType>(new MyType());
и в Ela будет доступно:
elaObj.value
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, hardcase, Вы писали:
H>>Здравствуйте, alvas, Вы писали:
H>>>>DLR — нет. Но он не особенно востребован.
A>>>Зря ты так. Cейчас изучаю ASP.Net MVC 3 — там без этого никак
H>>А я на нем (ASP.NET MVC 3) код боевой пишу. Вполне обходимся без этой нетипизированной мерзости.
A>Можешь ссылку кинуть?
В самом Nemerle можно макрос написать для генерирования вьюх, (гдето даже был). А в C# приходится руками модели прописывать.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[31]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Пока писал подумалось. A>Есть ли Ela поддержка xml?
В библиотеке пока нет. Можно добавить. Не хочешь попробовать?
A>Передаем на вход сериализованный объект, Ela c ним что-то делает и отдает сериализованный объект наружу.
Если это только для интеропа, то это — оверкил. Все можно гораздо проще.
Здравствуйте, VladD2, Вы писали:
ГВ>>Какой именно тип должен быть указан в качестве RulePattern прямо сейчас сказать не могу.
VD>Никакой. В таком виде ты код не перепишешь. Пример того как это можно сделать показал vdimas. Но в его варианте тоже проблем выше крыши. Так что в реальной жизни люди реализуют паттерн посетитель и дальше пишут много ифов. Кор разрастается как раз где-то в 10 раз. И чем сложнее паттерны, тем более объемным получается аналог на языке без ПМ. Очень скоро объем кода становится таким, что управлять им становится сложно.
У рассуждений, подобных этому, есть одна общая проблема: они начинаются с мелкого некорректного обобщения ("...в реальной жизни люди..."), сделанного ради придания высказыванию эмоциональной окраски, а завершаются некими числами ("...где-то в 10 раз"). То есть — это в прямом смысле "произведение икс и детской неожиданности". Практическая ценность таких построений, как ты понимаешь, находится где-то между надписями на заборе и разговорами во сне.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
A>>Можешь ссылку кинуть?
H>В самом Nemerle можно макрос написать для генерирования вьюх, (гдето даже был). А в C# приходится руками модели прописывать.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Baudolino, Вы писали:
VD>>>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. B>>Отсутствие практической необходимости. Имеющегося знания asm,C,Java,JavaScript,HTML,SQL достаточно для решения любых задач, которые у меня появляются или могут возникнуть. Ради интереса смотрел на Scala, haskell, C#, но в этом всем нет никакого смысла. Может быть, изучил бы Ceylon, когда под него будет IDE.
VD>Необходимость появится точас же как ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
Спорный аргумент о необходимости! Я уверен многие обладают знаниями,которые так и не были востребованы
VD>А до тех пор все эти языки для тебя будут непонятными хреновинвами.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, hardcase, Вы писали:
A>>>Можешь ссылку кинуть?
H>>В самом Nemerle можно макрос написать для генерирования вьюх, (гдето даже был). А в C# приходится руками модели прописывать.
A>А с этого места поподробней, пожалуйста
Для генерирования моделей (я там оговорился) есть макрос в составе замороженного NRails проекта.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, alvas, Вы писали:
H>>>DLR — нет. Но он не особенно востребован.
A>>Зря ты так. Cейчас изучаю ASP.Net MVC 3 — там без этого никак
H>А я на нем (ASP.NET MVC 3) код боевой пишу. Вполне обходимся без этой нетипизированной мерзости.
Расскажи как? Например, у тебя типизированная вьюха для записи User, но еще нужно передать заголовок для страницы и еще чего-то там.
Здравствуйте, alvas, Вы писали:
H>>А я на нем (ASP.NET MVC 3) код боевой пишу. Вполне обходимся без этой нетипизированной мерзости.
A>Расскажи как? Например, у тебя типизированная вьюха для записи User, но еще нужно передать заголовок для страницы и еще чего-то там.
Ручками-ручками примитивный класс с одним конструктором. Типизация позволяет быть уверенным что нигде не накосячил с типами и именами полей: aspnet_compiler на билдсервере проверит все использования во вьюхах, чего нельзя сказать про использование ExpandoObject для модели.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, alvas, Вы писали:
H>>>А я на нем (ASP.NET MVC 3) код боевой пишу. Вполне обходимся без этой нетипизированной мерзости.
A>>Расскажи как? Например, у тебя типизированная вьюха для записи User, но еще нужно передать заголовок для страницы и еще чего-то там.
H>Ручками-ручками примитивный класс с одним конструктором. Типизация позволяет быть уверенным что нигде не накосячил с типами и именами полей: aspnet_compiler на билдсервере проверит все использования во вьюхах, чего нельзя сказать про использование ExpandoObject для модели.
Покажи как.
Код ниже.
public ActionResult Create(User user)
{
return View(user);
}
Здравствуйте, vdimas, Вы писали:
V>Ты решил показательно проигнорировать суть замечаний о декомпозиции и тестопригодности? Это поза такая? Под названием "идите все на х..."? Тебя никто не заставлял выставлять исходник на обсуждение, если что.
Что и зачем тут нужно декомпозировать?
Что и зачем тестировать?
У меня есть огромный парсер C# которым можно легко ловить все регрессии.
Нахрена козе баян?
V>Значит, ни тестов на него писаться ни поддерживаться другими людьми этот код не будет.
Другие люди его вполне себе правят.
Никаких проблем нет.
V>Это мусор, называя вещи своими именами.
Мусор это твое предложение скрестить парсер с оптимизатором.
Вот это действительно получится мусор.
А это нормальный код который легко читают и понимают все кто знаком со сравнением с образцом.
V>Хотя, вот тут уже спотыкаемся об ограничения на раскрутку хвостовой рекурсии. И если это требование принципиально, то декомпозировать можно будет не все.
Повторю еще раз свой вопрос: Нахрена?
Да и что ты к этой хвостовой рекурсии пристал? Особенно в свете того что глубина рекурсии больше десятка вызовов маловероятна.
V>В реализации Немерле? Сколько я смотрел рефлектором, пока не замечал. Не покажешь, если я плохо смотрел? Например, вот скомпилированный обсуждаемый кусок. Ну и табличный вариант как раз с виртуальным вызовом сравняется.
И в немерле тоже. Хардкейс некоторое время назад прикрутил.
Только толку от этого мало.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, hardcase, Вы писали:
H>>Здравствуйте, alvas, Вы писали:
H>>>>А я на нем (ASP.NET MVC 3) код боевой пишу. Вполне обходимся без этой нетипизированной мерзости.
A>>>Расскажи как? Например, у тебя типизированная вьюха для записи User, но еще нужно передать заголовок для страницы и еще чего-то там.
H>>Ручками-ручками примитивный класс с одним конструктором. Типизация позволяет быть уверенным что нигде не накосячил с типами и именами полей: aspnet_compiler на билдсервере проверит все использования во вьюхах, чего нельзя сказать про использование ExpandoObject для модели.
A>Покажи как. A>Код ниже.
A>
A> public ActionResult Create(User user)
A> {
A> return View(user);
A> }
A>
Ela.ElaTranslationException was unhandled
Message=(1,6): Error ELA611: A name '+' is unresolved. It is not declared externally or its type has changed.
(1,6): Error ELA610: An argument 'y' is unresolved. No argument with such name were provided.
(1,1): Error ELA610: An argument 'x' is unresolved. No argument with such name were provided.
Source=ElaWrapper
StackTrace:
at ElaWrapper.Program.Eval(String source, Object args) in c:\Downloads\Ela-0-9-3\ElaWrapper\ElaWrapper\Program.cs:line 40
at ElaWrapper.Program.Main(String[] args) in c:\Downloads\Ela-0-9-3\ElaWrapper\ElaWrapper\Program.cs:line 47
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
public object Eval(string source, object args)
{
var l = new ElaIncrementalLinker(new LinkerOptions(), CompilerOptions.Default);
l.SetSource(source);
var res = l.Build();
if (res.Success)
{
foreach (var pi in args.GetType().GetProperties())
res.Assembly.AddArgument(pi.Name, pi.GetValue(args, null));
var vm = new ElaMachine(res.Assembly);
return vm.Run().ReturnValue.AsObject();
}
else
{
var sb = new StringBuilder();
foreach (var m in res.Messages)
sb.AppendLine(m.ToString());
throw new ElaTranslationException(sb.ToString());
}
}
//sample usagevar r = Eval("$x + $y", new { x = 2, y = 4 });
H>Но это лучше чем использование dynamic на вьюхе и неудобного для инициализации ExpandoObject в контроллере.
H>Какие-то общие параметры (для master/layout страницы) передаем через ViewData (немного прокачав ее экстеншин методами).
И чем концептуально ViewData отличается от ViewBag?
Здравствуйте, VladD2, Вы писали:
WH>>>И после того как человек в это начинает верить получается всякая байда типа компиляторов на С.
V>>А что не так с С? Отличная абстракция ассемблера. Настоящий нейтив во-плоти, без встроенных фокусов...
VD>Если бы ты прекратил токовать как тетерев и внимательно прочел его слова, то заметил бы слово "компиляторов". Писать компиляторы на С при наличии потомков того самого МЛ — это действительно глупость.
Да ты знаешь. Не знаю, с чем это связано у функциональщиков. Но помнишь тему про комбинаторные парсеры? Сколько её тут обсуждали по большей части матерые функциональщики, вроде thesz. Я такой профанации в области языков и грамматик не видел за всю свою жизнь. Нам тут толкали нисходящий разбор "в лоб" и выдавали за мега-фичу. И это при том, что там уйти навсегда в левую рекурсию, даже в ленивом языке — как два пальца об асфальт. Пусть лучше программист посидит вечерок с карандашиком, построит таблицу LL(к) парсера и аккуратно приделает автомат к нему. Пусть даже на С. По крайней мере, это будет адекватное решение задачи, хоть и на низкоуровневом инструменте.
Или твой напарник, Wolfhound, автоматиками-то владеет неплохо, как я погляжу. Собсно, как и большинство сишников со стажем, бо периодически приходилось упражняться. От того знает как и что сейчас писать. В общем, палка о двух концах.
VD>Ды та не боись. На немрле пару человек уже защитилось. Проблема только в том, что код написанный для защиты — это код приготовленный в топку. И за "защитниками" все надо переписывать.
Смотри в корень. Не было бы этого кода, не было бы продуманных непротиворечивых концепций, не было бы ничего.
VD>Незнаю, не знаю. Когда я слушаю моцерта, то понимаю, что большей части моих современников до него как до луны. Когда я вижу код на С++, я понимаю, что это была тупиковая ветвь эволюции.
Как и Фортран.
Все хорошо в свое время. У С++ реальная проблема со стандартизацией, т.е. со скоростью развития. С другой стороны, т.к. это самый мейнстрим, для него существуют самые оптимизирующие компиляторы, фактически непревзойденные на сегодня компиляторами других языков. А они дорогие, и эти задержки возможно есть попытки отбить инвестиции или же банально сэкономить на разработке.
VD>Да не очень то они отличные. Хотя приемлемые. Но ведь на практике же их все равно никто в вузах не преподает. Точнее иногда преподают, но на уровне все того же Паскля. Сколько я видел людей говоривших мне что учили Лисп в универе и даже сдававших лабы на нем. Только вот когда они видели макры и ФВП, то сразу дополняли свой рассказ откровение вроде — "А я думал что Лисп это такй императивный язык...". То есть они вообще не проходили того что делает Лисп Лиспом.
Это верно для любого языка. На 10% зависит от преподавателя, и на 90% от студента. На С, например в нашей группе сносно на 5-м курсе писало менее четверти студентов/студенток. И это еще группа сильной считалась.
V>> — а ничего лишнего, никаких понтов, шелухи и синтаксического сахара. Да, в этом и проблема Пролога например, что у него плохая стыковка с "общепрограммисткими" задачами, типа ГУИ, БД, сетка и т.д. Но для целей изучения логического програмимрования — это наоборот, мега-плюс. Бо ничего лишнего.
VD>+100. Ну, и где от Лаптева или Дворкина хоть слово про Пролог?
Ну, у нас один препод читал С/Паскль/Фортран, другой — Лисп/Пролог.
VD>А где те программисты которые могут программировать на Прологе?
Вообще, ты про одного такого только что сказал, что он про Лисп только слышал. Он еще и про Пролог слышал. И не хуже, чем про Лисп.
VD>Но это все здесь полнейший офтоп. Так что предлагаю с ним завязать.
Да, давненько не разминались.
VD>Ни Лаптев, ни Дворкин, ни Васильев понять не смогут. Для них это набор какой-то хрени.
Вот охота и ответить, и на место поставить, и пропросить коллегу показать аналогичный код еще с тех времен, когда ты об COM разве что спотыкался и роперы на хендлы писал... Но он на эту хрень не поведется, поэтому придется завязывать.
VD>О как? Стратегия говоришь. Тоже давай изобрази. Люблю юмор.
Попроси коллегу, более чем уверен, он осилит.
VD>В общем, попробуй. Флаг тебе в руки. Особенно смешно со стратегией ты тут залудил. Я вообще люблю паттерны. Как они появляютс, так сразу весело становится. Посетители, Сратегии... И это все вместо ПМ и лямбд.
Конкретно упомянутый паттерн "стратегия", как и разновидности IoC, используются в фП чуть менее, чем везде. И тобой тоже.
VD>Да не важно сколько их. Сейчас две. Завтра 22.
На счет "завтра 22" — это мой аргумент относительно декомпозиции.
VD>Ну, что будешь делать, если нужно будет вложенность в 4 колена обработать?
Пошлю читать материал по распространению констант и оптимизации выражений. Больше 2-х не надо.
VD>Офигительное предложение! За одно его тебя я уже больше никогда всерьез воспринимать не буду. Взять и смешать сложность из двух задач.
Что значит "смешать сложность двух задач"? Вы там в одну ф-ию что-ли все пишете? И есть проблемы вызвать тот же код из другого места или как?
VD>И еще при этом у тебя хватает наглости смеяться над чужим кодом. Да ты же просто ламер нахватавшийся умных слов.
Да нет, просто выполнял похожие вещи не раз. Отлаживаешь независимо построение AST, независимо оптимизацию каждого типа узла. Соединяешь, пользуешься. Просто у вас всё в кучу свалено. Для экспериментов пойдет. На промышленный код не тянет.
V>>Это как разница в подходах построения ДКА — сначала можно строить по регулярным выражениям НКА, приводить его к ДКА, а затем минимизировать, но ведь можно строить сразу минимизированный ДКА — это порой на порядок быстрее, т.к.
VD>Ну, ты очень крут. Но как-то скромен. Можно же пойти дальше и сразу в один проход построить эффективный исполняемый код! Давай, дерзни.
Вообще-то, сей алгоритм я упомянул, т.к. Wolfhound его знает. И может подчерпнуть идеи. А поторопился я только насчет совета строить сразу минимизированный ДКА его FSMBuilder-ом, и только лишь из-за поддержки расширенной нотации регулярных правил — она требует сначала приведения к каноническому виду, и только потом идет построение ДКА.
VD>Так вот я вот что тебе скажу. Код Вольфхаунда может быть и не безупречен, но на сегодня никто еще лучше не написал. Из реализаций PEG-а его самая быстрая.
Предположу, что это не из-за особенностей компоновки исходного кода, а из-за выделения регулярного подмножества. Хотя, когда пошли первые разговоры о PEG-парсере, ты эту идею отвергал. А она очевидна. Могу поднять эту тему.
VD>А вам, ... с корачками у него лучше поучиться, а не выставлять свое распухшее эго на показ.
Ну, выставил вообще-то он. На сей раз неудачно. Хотя на плюсах в свое время выдавал шикарные примеры, был виден полет мысли. Например — типизированная система преобразования физических величин или куча ответов помельче в форуме по плюсам. А тут, сорри, но банальные вещи, да еще небрежно оформленные. Вот эта небрежность и раздражает, когда ей еще пытаются в лицо тыкать. Нет былой четкости, старания и внимания к деталям. Наверно, это где-то психологическое: "все это круто уже потому, что ОНО на Немерле".
V>> на каждом шаге обработке подвергается множество меньшей мощности. Хоть алгоритм и чуть более сложный, угу.
VD>Угу. "Чуть более сложный". Я без мата этот лам даже дальше коментировать не могу. Чуть более сложный в данных условиях означает неподъемный. Там сложность зашкаливает. Только благодаря не ординарным способностям Вольфхаунда и использованию инструмента позволяющего снизить сложность до приемлемого значения этот генератор парсеров и стал возможным. Конкуренты лабающие аналоги на Яве и С++ уже много лет нервно курят в сторонке, так как их поделки раза в 3 медленнее.
Я же не против. Сделали первое приближение, отлично. Но разве время компиляции до фени? Теперь-то можно и переписать.
V>>В общем, подкинь что-нить посущественнее, что ли...
VD>Куда тебе. Ты на этой задаче садяшь со своими подходами. Ты только что расписался в полном и беспросветном ламерстве. Идея распихать код оптимизации по парсеру — это супер! Глупее и придумать ничего нельзя.
Не по парсеру, по типам узлов. Обычный подход, не вижу причин для возмущения. Тут иначе никак. Без декомпозиции кода оптимизации ее невозможно будет выполнять по мере построения АСТ. И не так всё страшно, если хорошо попросишь, твой коллега справится. Просто ему очень некогда, как и тебе. Ибо ежедневный тяжелый труд по чморению коллег на форуме отнимает все ресурсы организма.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Да ты знаешь. Не знаю, с чем это связано у функциональщиков. Но помнишь тему про комбинаторные парсеры? Сколько её тут обсуждали по большей части матерые функциональщики, вроде thesz. Я такой профанации в области языков и грамматик не видел за всю свою жизнь. Нам тут толкали нисходящий разбор "в лоб" и выдавали за мега-фичу. И это при том, что там уйти навсегда в левую рекурсию, даже в ленивом языке — как два пальца об асфальт. Пусть лучше программист посидит вечерок с карандашиком, построит таблицу LL(к) парсера и аккуратно приделает автомат к нему. Пусть даже на С. По крайней мере, это будет адекватное решение задачи, хоть и на низкоуровневом инструменте.
Твой LL(k) на левой рекурсии тоже сдохнет.
Так что тут комбинаторы не отстают.
Но они очень гибкие. И это свойство очень ценно, когда нужно что-то по быстрому накатать.
Но для серьезной работы они конечно не годяться.
Как и рукопашный LL(k) тем более на С.
Это же вообще застрелиться можно.
V>Или твой напарник, Wolfhound, автоматиками-то владеет неплохо, как я погляжу. Собсно, как и большинство сишников со стажем, бо периодически приходилось упражняться. От того знает как и что сейчас писать. В общем, палка о двух концах.
Чего? Ты про генерацию ДКА что ли?
V>Да нет, просто выполнял похожие вещи не раз. Отлаживаешь независимо построение AST, независимо оптимизацию каждого типа узла. Соединяешь, пользуешься. Просто у вас всё в кучу свалено. Для экспериментов пойдет. На промышленный код не тянет.
Это ты нафантазировал.
У меня то как раз все отдельно.
Отдельно парсер. Отдельно оптимизатор. Отдельно кодогенератор.
V>Предположу, что это не из-за особенностей компоновки исходного кода, а из-за выделения регулярного подмножества. Хотя, когда пошли первые разговоры о PEG-парсере, ты эту идею отвергал. А она очевидна. Могу поднять эту тему.
И окажешься не правым. Выделение регулярного подмножества дало очень мало.
V>Ну, выставил вообще-то он. На сей раз неудачно. Хотя на плюсах в свое время выдавал шикарные примеры, был виден полет мысли. Например — типизированная система преобразования физических величин или куча ответов помельче в форуме по плюсам. А тут, сорри, но банальные вещи, да еще небрежно оформленные. Вот эта небрежность и раздражает, когда ей еще пытаются в лицо тыкать. Нет былой четкости, старания и внимания к деталям. Наверно, это где-то психологическое: "все это круто уже потому, что ОНО на Немерле".
1)Чихать я хотел на немерле. Он для меня не более чем подопытный кролик.
2)То что ты чего-то не видишь не значит что этого нет.
V>Я же не против. Сделали первое приближение, отлично. Но разве время компиляции до фени? Теперь-то можно и переписать.
Ты даже не представляешь насколько.
Особенно учитывая то, что время работы макроса ничтожно по сравнению со временем работы компилятора, который переваривает сгенерированный код.
А что касается первого приближения, то поначалу у оптимизатора была экспоненциальная сложность (привет инлайну). И меня это не парило.
Это потом я сделал волшебную функцию GraphWalk, которая превращает экспоненциальные алгоритмы в линейные.
V>Не по парсеру, по типам узлов. Обычный подход, не вижу причин для возмущения. Тут иначе никак. Без декомпозиции кода оптимизации ее невозможно будет выполнять по мере построения АСТ. И не так всё страшно, если хорошо попросишь, твой коллега справится. Просто ему очень некогда, как и тебе. Ибо ежедневный тяжелый труд по чморению коллег на форуме отнимает все ресурсы организма.
Я не буду это делать по тому что это бред.
Особенно учитывая то, что я делаю инлайн. А как его делать в один проход не ясно совершенно.
Ибо то, что нужно инлайнить нужно сначала разобрать. А правило вполне может идти позже.
И нужно учесть, что инлайн дает очень не мало. Так что отказ от него не вариант. Совсем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, alpha21264, Вы писали:
A>>был бы хороший алгоритм, а реализовать его можно хоть на хинди. Язык не важен.
FR>Угу, мне вот тоже сферические алгоритмы нравится писать, две недели работы в результате 200 строк кода на Си. FR>Жаль такая работа очень редко встречается, в остальных случаях чем язык выразительней тем лучше быстрее и FR>качественней работа.
Не знаю. А мне вот уже 20 лет встречается работа, где важен алгоритм (а часть кода таки на Фортране).
Течёт вода Кубань-реки куда велят большевики.
Re[12]: Что вас останавливает от изучения нового языка?
Выдумки я твои пропустил. Обсуждать их не вижу никакгого смысла.
ГВ>Угу, спасибо за объяснение. Почему-то ничего нового для меня тут не прозвучало. Да, я действительно не придал значения локально связанным именам, но, в общем, на мой вывод (и на иллюстрацию) это никак не влияет.
Ну, есссено! Только код что тебе привели компилируется и работает. И более того, работает очень шустро. А твой — это выдумка которая никогда не заработает. Вот и вся разница. Так что в деталях как всегда кроется черт.
ГВ>Кого обманываю и в чём?
Приведением кода который по твоим словам аналогичен, а на практике является полной фигней.
ГВ>Ясно, спасибо. Собственно, этого я и ждал (хотя надеялся на чудо) — да, контролируется полнота проверки по всем возможным вариациям данного АлгТД, но никак не его сочетаний.
и компилятор проверит те что есть и выдаст предупреждения для каждого не покрытого случая. Если ты хотя бы одино из вхождений не укажешь будет сообщение. А укажешь все — не будет.
ГВ>Пожалуй, что мне теперь стоит зацепиться за твою фразу: "...что match-и обрабатывают все возможные сочетания" и поднять шум о том, какой ты бессовестный обманщик и как вводишь в заблуждение своих наивных слушателей.
Ну, попробуй. Авось в процессе еще немного в тему въедешь .
ГВ>Короче говоря, порядок перебора совпадений — "сверху-вниз" в порядке перечисления. В принципе, схоже с пролог-машиной, только там учитывается порядок занесения предикатов в базу данных. Правила перебора совпадают с точностью до деталей реализации вычислительной среды.
Ну, в прологе механизм по круче. Там тот же ПМ, но на базе унификации. В конце сопоставления обе стороны унифицируются.
МП из ФЯ по слабее, но за то сильно шустрее. В результате получается очень эффективный код. Такой же если бы это дело писалось вручную на базе низкоуровневых средств.
Но в общем, механизм действительно похожий на прологовский. Разница только в том, что он работает только в одну сторону.
VD>>>>Так что описанная выше прямая трансляция является плохим стилем. Стало быть ее, по уму, нужно заменить на использование паттерна посетитель. Но как только ты это сделашь распознование вложенных паттернов (Not вложенный в Not, как в данном примере) превратится в мучение. Кода станет уже не в 5, а в 10-20 раз больше. ГВ>>>Влад, ты когда с самим собой разговариваешь, клавиатуру в сторону отодвигай. При чём тут паттерн "посетитель"? VD>>При том, что он описывает список веток которые нужно посещать и как и ПМ гарантирует, что ты не забудешь посетить их все.
ГВ>Ценой распыления аналитического кода по всем классам?
У меня закрадываются сомнения в том, что ты знаешь что такое паттерн посетитель.
ГВ>Ну, я не спорю, субъект с тяжёлым синдромом ООП головного мозга способен и на такое ради "гарантий". Только зачем болезнь выдавать за правило?
Ты видимо очень крут. Но вот все компиляторы и системы обработки деревьев выражений (включая LINQ) создаваемые на ООЯ почему-то всегда реализуют Посетителя для своих структур. Видимо ООП головного мозга поразил всех окружающих. И меня в том числе. В R# я тоже его реализовывал. Правда средствами метапрограммирования, так что это не было так уж многословно.
VD>>Посетитель наилучший способ из имеющихся в арсенале ООП. Код обработки выделяется в одном месте. Есть возможность гарантировать, что посещены все ветки. Можно добавлять другие обработки не ломая уже существующие и не вводя тонны методов (по одному на каждую ветку).
ГВ>Хм. Зачем ты так рьяно защищаешь такое убогое применение ООП?
Я? Я его не защищаю. Но в арсенале ООП и ИП дугих средств нет. Точнее те что есть еще хуже. Уж лучше проиграть в обхеде кода посетителя, но потом не иметь тех проблем что можно огрести без него.
ГВ>Ну, я как бы в курсе твоего любимого метода критики — взять нечто идиотское, реализованое на языке X и на этом основании заклеймить весь язык X, но это не совсем чистоплотно, не находишь?
Если ты считаешь этот паттерн идиотским, то или ты его не понимаешь, или ты освоил ПМ и понимаешь, что Посетитель жалкое его подобие (частный случай).
VD>>Если тебе это не очевидно, я не виноват.
ГВ>Ты понимаешь, в чём проблема, я переболел парадигмами и прочими идеологиями уже довольно давно.
Да я заметил. Жаль что это случилось чуть раньше чем ты освоил их все.
ГВ> Поэтому то, о чём ты говоришь, мне очевидно, но очевидно ещё и то, что сейчас я (и не только я) без веских причин так не сделаю, чтобы там ни тарахтели разнообразные ООП-пуристы и прочие, сдвинутые на спасении мира посредством чистоты парадигмы.
Я тебе назвал минимум три причины. Тебя не волнует дальнейшая поддержка кода? Тогда можно их игнорировать.
ГВ>Честно, мне плевать, как код реализации проецируется на некий идеал, взятый из той или иной химеры (aka парадигмы), я руководствуюсь вполне локальными соображениями.
Да мне тоже. Лишь бы он был рабочим, простым и легким в поддержке.
Но у этой задачи есть только три решения. Посетитель, ПМ и неправильное. Последнее на первый взгляд выглядит разумно и даже порой красиво, но на самом деле это мина замедленного действия. Отложенные грабли.
ГВ>Я не спорю с тем, что ПМ полезен, но это далеко не то, ради чего стоит пускаться во все тяжкие (читай, непременно менять язык реализации и т.п.).
Ну, это мнение того кто сам на практике это самое МП не использовал. Я так понимаю Пролог ты ведь тоже на практике не используешь?
А вот среди тех кто попользовался ПМ бытует другое мнение — что языки не поддерживающие ПМ сразу проигрывают тем что поддерживают. У многих просто ломка начинается когда они вынуждены возвращаться на язык без ПМ.
А дело здесь в том, что ты не думаешь категориями АлгТД и ПМ. А те кто думает очень многие задачи видят именно в их применении. Как результат разрыв между возможностями языка и внутренним представлением решения. Далее начинаются эмуляции ПМ в рантайме (на функция) и т.п. На следующей стадии эта эмуляция выбрасывается, так как становится явсно, что без поддержки языка получается плохо.
ГВ>Разницу между иллюстрацией и фрагментом рабочего кода объяснять нужно?
Не надо. Но твой код не рабочий потому что бессмысленный, в не потому что он не полон.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, WolfHound, Вы писали:
WH>>Хардкейс некоторое время назад прикрутил. Только толку от этого мало.
V>Если ветвление будет не по константе, а по значению ссылки, получаемому через typeof(), толку будет действительно мало.
switch строится по константе (VariantCode) для минимум десятка вхождений различных вариант. Т.е. ДЕСЯТЬ тайпкастов в дотнете в среднем не хуже CIL-switch инструкции.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[36]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Здравствуйте, Воронков Василий, Вы писали: ВВ>>Ну вот, например, "концепт" универсальной обверточки, через которую в Ela можно скормить любой объект:
A>Код ниже из http://code.google.com/p/elalang/wiki/GettingStarted A>Выдает 3 ошибки
(+) — это в дефолтных настройках компиляция происходит без прелюда, вот никакого (+) и нет. А с аргументами — бага, да. В текущей версии аргументы поломаны, надо чинить.
Чтобы починить (+) надо сделать так (потом добавлю в дефолт):
var opts = new LinkerOptions();
opts.CodeBase.Directories.Add(new DirectoryInfo(@"Папка с Prelude.ela"));
var l = new ElaIncrementalLinker(opts, new CompilerOptions {
WarningsAsErrors = false,
ShowHints = true,
Optimize = true,
Prelude = "prelude"
});
Или можно прям по месту плюсик объявить:
let (+) = __internal add
Re[11]: Что вас останавливает от изучения нового языка?
Ммм... LL(к) — это и есть грамматика без левой рекурсии. За то ее и любят писатели компиляторов. Если при построении ДКА получаем конфликт, то применяем один из методов устранения левой рекурсии или факторизацию.
WH>Так что тут комбинаторы не отстают. WH>Но они очень гибкие. И это свойство очень ценно, когда нужно что-то по быстрому накатать.
Т.е. не более чем для экспериментов по отладке грамматики? Или же можно так и оставлять для продакшн кода?
WH>Но для серьезной работы они конечно не годяться. WH>Как и рукопашный LL(k) тем более на С. WH>Это же вообще застрелиться можно.
Да вроде автоматическое построение автомата для LL(1) идет как одна из лаб на 3-м курсе обучения. Не? Приведение грамматики к LL(к), а еще лучше к LL(1) — ИМХО отличная стадия работы перед началом кодирования любого парсера. Все-таки, эффективность LL(к) того стоит.
Re[23]: Что вас останавливает от изучения нового языка?
H>"Туда" я тоже смотрел Посему резюмирую:
H>1) работает лишь для структур из того же компилируемого модуля,
Работает для любых ссылочных типов и для любых структур, где все поля публичные. Просто для того же компиллриуемого модуля есть способ обойти последнее ограничение через internal.
Заметь, что небольшие АлгТД чаще всего объявляют как объединение мини-туплов, а это идеальный вариант для исполнения в предложенной технике.
H>2) работает без наследования,
как и в C#, и никто не жалуется.
H>3) затруднено использование из C#.
Был дан пример IIOP.Net, который генерит размеченные объединения с безопасным для дотнетных языков интерфейсом. Когда-то давно я им как раз на эту тему патчи слал.
H>Я считаю что этот слишком специфический случай, лучше поддержать макробиблиотекой и активными паттернами.
Э нет. value-types имеют специфическую поддержку средой исполнения. Именно до нее охота достучаться.
Re[13]: Что вас останавливает от изучения нового языка?
VD>Выделение отдельных стадий и есть способ держать сложность в разумных пределах. Ведь сложность имеет привычку перемножаться. Засунь оптимизацию в парсер и кирдык. А кроме оптимизации есть еще куча стадий обработки.
Слушай, может я тут с другой планеты. Приведенный код — это и есть сложность, на твой взгляд? Просто мне подобное приходилось делать в разных проектах более 5-ти раз (точно уже и не вспомню), и как-то малость обыденно. И выделения регулярного подмножества пару раз для парсеров EDI-форматов в т.ч. Там парсеры строятся динамически по описанию, а док-ты бывают по многу мег, и без этой фичи работало в 2-3 раза хуже. Грамматика в общем виде с неустранимой левой рекурсией (LL(к), где К зависит от конкретного описания структуры и может быть неограниченно), но имеет довольно протяженные "куски", хорошо разбираемые ДКА. Вот и приходилось комбинировать техники разбора.
class Optimizer;
class Rule {
virtual Rule *optimize(Optimizer *) = 0;
};
class AndRule : public Rule {
virtual Rule *optimize(Optimizer *optimizer) {
// "Самооптимизация" And либо что-то в этом духе:return optimizer->optimizeAnd(this);
}
};
Это чтобы избежать очередного круга обсуждения моего невежества.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Конечно, не заработает. На фига мне PEG-парсер? Хотя, если вдруг понадобится...
Гы-гы.
VD>>и компилятор проверит те что есть и выдаст предупреждения для каждого не покрытого случая. Если ты хотя бы одино из вхождений не укажешь будет сообщение. А укажешь все — не будет.
ГВ>М-м-м... Разве такое поведение компилятора будет вызвано не тем, что в типе Rule прямо объявлено:
ГВ>
ГВ> | Not { rule : Rule; }
ГВ> | And { rule : Rule; }
ГВ>
ГВ>?
Именно. Но не только этих двух вхождений, а всех. Там очень хитрая штука делается. Строится так называемое дерево решения. А потом анализируется.
The algorithm used here is based on the ``ML pattern match compilation
and partial evaluation'' by Peter Sestoft, available at:
However the partial evaluator used there is purely functional, while we use
a more imperative, but conceptually simpler approach.
The idea is to build a decision tree (type Decision) out of a list
of patterns. The nodes in the tree represent a constructor (type Con)
equality tests, while the leafs contains the result of matching (either
failure or a branch to be taken).
If given branch is not found in the output tree, then given pattern
never matches and is thus redundant.
If there is at least one Failure leaf, the matching is not exhaustive.
The counter example (type CounterExample) is constructed by walking the
path to the Failure leaf and adding positive and negative information
to it.
The idea used in building the decision tree is to use available static
information. It is encoded in a ``skeleton'' of a term we're currently
matching (type Skeleton). For example given a pattern: Foo (Bar), if the
head of the term matches Foo, but the argument ain't Bar, then in this
branch we're confident that the term is Foo(NOT(Bar)) (this Foo(NOT(Bar))
is an example of a skeleton) that is and if the next pattern to check
is Foo (Baz), we just need to check for Baz.
The data flow is:
list [Match_case] -> // input
list [Pattern * bool * int] -> // pattern, has_guard, id
the first element of the above list is used to construct the first
TopLevelPattern, rest of patterns are handled automatically by
TopLevelPattern in its failure branches ->
Decision // output
ГВ>Угу, покруче в каком-то смысле. Понятно теперь, почему ПМ для меня не новость? И ни для кого не новость, кто знаком с Прологом.
К сожалению, эти "все" (включая тебя) Пролог изучали так же. Побаловались и бросили. В прочем, я от вас не далеко ушел. Вот только разве что не гоню напраслину.
Раз ты знаком с прологом, то должен понимать, что похожие механизмы но обеспечивающие высокую скорость кода очень даже крутая штука. И по уму ты должен жалеть, что в "твоих" языках такого нет. Но тебя радует то что ты "это видел".
ГВ>Ну да, правильно, потому что предназначен для других вещей — не только для поиска набора унификаций.
Не для других, а для одной из целей — нахождения соответствия. А вот унификацию он как раз таки не обеспечивает.
VD>>У меня закрадываются сомнения в том, что ты знаешь что такое паттерн посетитель.
ГВ>Объясни, что ты имеешь в виду в данном контексте?
То что сказал. Похоже ты просто не понимаешь зачем этот паттерн был придуман.
ГВ>Всё зависит от контекста. Если набор типов изначально не ограничен, как, например, ограничен набор вариаций для Rule, то "посетитель" может оказаться уместным. Но мы, вроде как, обсуждаем другой случай — Rule имеет строго определённый набор вариаций.
Вот еще одно подтверждение. Посетителя ты не понимаешь. Как раз Посетитель уместен только когда набор типов необходимых посетить ограничен и редко расширяется.
ГВ>Какие это проблемы можно без него огрести, например, в коде транслятора?
Все те же. При очередном рефакторинге забыть обработать некоторые из типов (ветвей дерева).
ГВ>Забыть, что ли, switch/if вставить там, где он нужен?
Ага. Они то и приводят к проблемам.
ГВ>Так это, прости меня, детский сад, право слово.
Детский сад — это не знать детали паттерна и лезть спорить о нем.
ГВ> Корректность компилятора контролируется наборами тестов, а не языком реализации. Да и, собственно, ветку в ПМ тоже можно запросто "заглушить".
Ага! Разговоры о тестах это такая лакмусовая бумажка.
Ты понимаешь разницу между значением слов "гарантия" и "протестировано"?
Если есть возможность получить гарантию глупо делать тесты.
ГВ>Я это в цитатник занесу: "код не рабочий потому что бессмысленный, а не потому что он не полон". Махатма Ганди нервно протирает очки.
Занеси. Только не показывай никому. А то стыдно будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
V>>Настоящий нейтив во-плоти, без встроенных фокусов (если сравнивать с Паскалем, например). Что получится в итоге известно фактически до бит, что и требуется для ПО, непосредственно общающегося с кодом. С этого языка "взлетают" все современные аппаратные платформы, и уже поверх него работают все эти джавы, дотнеты и прочие экзотичности. Поверх него — т.е. поверх кода, созданного компилятором С. Фактически весь современный нейтивный код написан на С/С++, от операционок, офиса и БД, до дотнета и игрушек. WH>Но должны взлетать вот с этого: Verve: типобезопасная ОС от MS Research
WH>Там все известно еще лучше и что характерно все верифицировано.
Это которая была сингулярити?
И это масштабируется от систем с 64к памяти до систем с 64гиг памяти? Как стек TCP, например?
V>>Для императивных — Фортран/С/Паскаль. WH>А фортран то нахрена? Чтобы людям жизнь поломать?
А что не так? Есть процедуры и ф-ии, циклы и ветвления, ввод и вывод, числовые операции. Что еще надо для программирования всяких численных методов?
WH>Тут нужно брать хаскель. Без вариантов. Ибо он вывернет руки но заставит писать функционально.
Можно взять Схему — допиленный до функциональной чистоты и имеющий стандарт новомодный диалект Лиспа. Ограничения алфавита Хаскеля, и не очень бросающийся в глаза синтаксис замыканий вряд ли будет способствовать пониманию происходящего. ИМХО, понимать происходящее лучше на чем-нить попроще, а к Хаскелю подступаться уже хоть с каким-то багажом.
V>>логический — Пролог. WH>Он очень грязный.
Да, есть что подчерпнуть. Но, как я же сказал, там много лишнего для целей логического программирования. Это довольно-таки мощный и универсальный язык.
Есть еще важный такой момент. Понимать ЯП — это понимать его до такой степени, чтобы знать, как написать компилятор этого языка. Если Фортран/С/Паскаль/Лисп/Пролог сильный студент 4-5-го курса вполне будет в состоянии написать (пусть не самым оптимальным образом или даже не в полном объеме стандартов, не суть), то вот с этим Меркури или с Хасклелем — 100% обломается. Значит, рано пока.
Хотя, шаблоны плюсов тоже писать обломается. Потому вчерашние студенты и не особо в них разбираются. Потому учить плюсам в полном объеме в ВУЗе мне тоже кажется не очень хорошей идеей. Наследование — да, виртуальные методы — да. Метапрограммирование на шаблонах — нет!
V>>Отличные языки для изучения парадигм. Почему отличные? — а ничего лишнего, никаких понтов, шелухи и синтаксического сахара. WH>"Отличные они по тому", что ты других не знаешь.
Линейку сейчас прикладывать будем, или чуть потом?
V>>Если энергичные, то в топку, бо многопроходность, а оно вполне решаемо за один проход. WH>Типа меня волнует производительность этого куска.
Ну блин, каждый лишний запуск обхода дерева с каждого его узла по мере обхода верхнего уровня, это +1 к показателю степени сложности. А тут +4. Итого, квадратичная изначальная сложность алгоритма превращается в 6-ю степень. Я понимаю, что глубина правил обычно маленькая, да и % правил именно такого вида может быть небольшой... Но для общего случая сразу режет по глазам.
WH>2)Это сейчас код похож. Раньше он был разным. И потом он тоже станет разным. WH>Так что обобщение тут, мягко говоря, противопоказано.
Ну так, если предполагается дальнейшее независимая доработка, почему бы не вынести этот код за пределы этой одной мега ф-ии? И не дорабатывать независимо от остальной отлаженной части?
V>>Далее. Есть предложение для обоих случаев насчет возможности построения оптимизированного варианта сразу, по мере парсинга правил, а не "потом", за вот этот проход оптимизации. WH>Ой лол. Там такая лапша получится что WH>Причем на любом языке.
Это зависит от того, как ты строишь АСТ, больше ни от чего. Парсер даже знать не будет, что там что-то оптимизируется по ходу построения этого АСТ.
WH>А если вспомнить про инлайн
Я тут инлайна не увидел, хотя ты дважды его упоминал. Где он? И чем инлайн-подстановка принципиально отличается от других преобразований АСТ?
WH>Я теперь понимаю твоих коллег. И почему они говорят, что у тебя говнокод.
Потому что не с первого раза понимают, наверно.
Надо им твой показать, и запротоколировать комменты. Или проще будет еще по разику назвать друг друга ламерами и разбежаться? На радость читателям ветки.
WH>Ни один из известных мне алгоритмов минимальный ДКА в общем случае не строит.
Согласен, самый минимальный вариант можно вычислить в общем случае через полный перебор применения алгоритма минимизации, начиная от каждого уникального первого входного сигнала из начального состояния. Сойдемся на термине минимизированный. Обычно же полный перебор не делает. Просто от первого же состояния склеивают остальные возможные состояния до первого конфликта выходных сигналов, потом вводят новое подстановочное состояние и т.д. Если в общем случае кол-во состояний после минимизации уменьшается грубо на порядок, то разница в несколько % получившегося кол-ва состояний от варианта полного перебора не принципиальна. Тем более, что минимизация состояний влияет на кол-во памяти под таблицу переходов, но не на кол-во пройденных состояний при разборе входных цепочек, т.е. связь с быстродействием тут не совсем прямая, а коссвенная через кеши процессора и прочие такие вещи.
Но это мы отвлеклись. Речь была об организации алгоритма построения сразу минимизированного ДКА из НКА, а не на том факте, самый минимальный вариант получаем, или нет (сие не зависит от того, сразу строим минимальный ДКА или сначала строим эквивалентный, а потом минимизируем). Да и для твоего графа выражений имеем единственное решение в любом случае.
Давай, чтобы не ходить вокруг да около, попытаешься объяснить, что не так в рассуждениях.
Как организована структура парсеров обычно:
— сам парсер чего-то там парсит и выдает калбэки о об успешном разборе очередного правила (ветки/выражения/элемента). Как пример можно привести SAX парсер.
— построитель модели документа. Этот модуль ловит сигналы парсера, отслеживает его состояние, и строит по текущему состоянию и сигналам граф/модель документа. Например, АСТ программы, XML DOM, или линкованный электронный EDI-документ.
Остановимся на абстрактном построителе модели документа. Согласись, что никакие подробности его внутренней работы не усложнят и не повлияют на код собственно парсера входного потока. В свою очередь, при построении АСТ мы уже имеем диспетчеризацию либо через нужную ф-ию калбэка (что хорошо), либо через код нетерминала (что чуть хуже,но с выходом на первый вариант внутри). Что мешает там же не просто создать узел АСТ, а сразу его минимизированный вариант? Характерно, что тут процесс двухтактный — начало формирования узла, потом идет обработка низлежащих, и потом приходит сигнал окончания формирования низлежащих узлов (аргументов). Вот здесь и можно строить сразу оптимизированный вариант узла, без промежуточного построения неоптимизированного. Заметь еще один момент, если ты сейчас обходишь граф сверху, то описанный момент происходит наоборот — выражение "сворачивается" снизу вверх, что и требуется. В случае forward reference, к которым можно отнести и инлайн, сигнал об окончании формирования узла просто приходит позже, по мере парсинга этих forward references.
Согласен, что еще встречаются реализации, где оба модуля настолько диффузируют друг в друга, что их разделение — отдельная неплохая задача... И там код оптимизации АСТ будет усложнять код парсера... но это же не повод для подражательства?
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Ну, вот изучи и попользуйся PegGrammar... и с большой вероятностью оценишь эту вещь по достоинству. Это я так мягко выражаюсь, чтобы не оскорбить тебя фразами вроде "поймешь что потратил много времени в своей жизни зря" .
Что есть PEG я понял еще с того первого твоего поста на эту тему. Меня в нём напрягает приоритетность правил. Т.е. даже все эти вопросы оптимизированной его реализации мне пока пофиг абсолютно.
Какой вид грамматики получается после применения этой "приоритетности"? Не есть ли это способ "замыливания" неоднозначностей? Я не видел еще док-ва, что невозможна ситуация, когда мы строим корректное выражение согласно неким правилам PEG, но оно распознается (перехватывается) другим правилом (участком правила) за счет приоритетности. Т.е. отсутствие таких гарантий будет заставлять полагаться только на бесконечное тестирование парсера на основе PEG с целью обкатки решения в боевых условиях. В общем, это что-то вроде статической vs динамической типизации. Без нормальной диагностики конфликтов выражений систем правил остается надеяться на авось и на тесты. Даже парсер Эрли, выдавая все возможные варианты, дает нам шанс проанализировать их, например, на семантическом уровне, если у нас какая-нить совсем уж контекстно-зависимая грамматика или семантика управляется данными. А тут контекстно-свободное отсечение на основе приоритетов... Не могу пока побороть недоверие.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Что есть PEG я понял еще с того первого твоего поста на эту тему. Меня в нём напрягает приоритетность правил. Т.е. даже все эти вопросы оптимизированной его реализации мне пока пофиг абсолютно.
V>Какой вид грамматики получается после применения этой "приоритетности"?
PEG. Включает почти любой сложности контекстно свободную, однозначную грамматику.
V>Не есть ли это способ "замыливания" неоднозначностей? Я не видел еще док-ва, что невозможна ситуация, когда мы строим корректное выражение согласно неким правилам PEG, но оно распознается (перехватывается) другим правилом (участком правила) за счет приоритетности. Т.е. отсутствие таких гарантий будет заставлять полагаться только на бесконечное тестирование парсера на основе PEG с целью обкатки решения в боевых условиях. В общем, это что-то вроде статической vs динамической типизации. Без нормальной диагностики конфликтов выражений систем правил остается надеяться на авось и на тесты. Даже парсер Эрли, выдавая все возможные варианты, дает нам шанс проанализировать их, например, на семантическом уровне, если у нас какая-нить совсем уж контекстно-зависимая грамматика или семантика управляется данными. А тут контекстно-свободное отсечение на основе приоритетов... Не могу пока побороть недоверие.
Это тот случай когда надо пробовать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Здравствуйте, VoidEx, Вы писали:
VE>>
A>Метро всё равно быстрее их обоих.
VE>>Сам придумал, сам не знаешь?
A>Не хами. Метро быстрее — очевидный факт. В большинстве случаев просто в разы.
Я не хамил, я лишь процитировал, что аналогию увёл в сторону не я.
A>Тебе сколько лет?
Максималист тут не я.
A>Я тебе уже сказал. Для сложных задач (не ларек об1Сивать) язык не важен. A>Совсем не важен, как авторучка для писателя, нужно чтобы просто была какая-нибудь.
Даже я ручку выбираю не от балды. Писать-то всякая может, но некоторыми удобнее. А уж писатели и подавно.
A>Ничто, никакой божественный язык не позволит тебе написать FineRider или хотя бы Промт. A>Потому что ты не знаешь что и как должна делать программа. A>С самым совершенным языком ты будешь просто в два раза быстрее тупить. A>Мерседес тебя никуда не довезет, если ты не знаешь, куда ехать.
Разумеется. Но если знаю, то мерседес предпочтительней.
A>Я тут уже предлагал простенькую задачку (с сайта Яндекса). Есть список глаголов русского языка. A>Сформировать список пар глаголов "делал"-"сделал". A>Какие преимущества в этой задаче может дать язык программирования? A>В качестве эталона берем С++.
GC, замыкания, АлгТД, лямбды, ФВП, легковесные потоки, иммутабельность: все эти на твой взгляд незначимые плюшки дают возможность писать тот самый алгоритм, а не в очередной раз бороться с языком (в этом плане C++ и правда эталон). Для неспецифических задач (где легковесные потоки, например, позволят на порядок проще написать) разница в простоте написания будет не в разы, но всё же будет заметна.
Re[10]: Что вас останавливает от изучения нового языка?
V>Есть еще важный такой момент. Понимать ЯП — это понимать его до такой степени, чтобы знать, как написать компилятор этого языка. Если Фортран/С/Паскаль/Лисп/Пролог сильный студент 4-5-го курса вполне будет в состоянии написать (пусть не самым оптимальным образом или даже не в полном объеме стандартов, не суть), то вот с этим Меркури или с Хасклелем — 100% обломается. Значит, рано пока.
Тогда схема (без макросов) идеальный вариант, функциональный и императивный язык в одном флаконе плюс очень легко написать транслятор.
То же самое и ML, императивная часть не хуже паскаля, функциональщина полноценная, транслятор тоже несложен и уже есть готовый курс
его написания для студентов http://min-caml.sourceforge.net/index-e.html
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
C>>>>а не все ли равно на чем писать? VD>>>Нет конечно. Иначе все бы писали на ассемблерах или хотя бы на Фортране 77. C>>я не это имел ввиду.
VD>Именно это ты и имел в виду.
преклоняюсь перед твоими телепатическими способностями.
C>>>>а если так, то зачем учить очередной язык пока он не понадобился? VD>>>А как ты поймешь что что-то тебе нужно, если ты даже не знаешь что там внутри и что это тебе может дать? C>>А для того чтобы понять что там внутри не надо язык изучать, обычно достаточно прочитать какой нибуть обзор или полистать домашнюю страничку. VD>Не недостаточно. Чтобы понять новое его нужно пробовать. Ну, то есть в принципе можно понимать возможности языка просто прочитав про него, но при этом все концепции этого языка должны быть известны. Например, зная Немерле или ОКамл можно прочитать книгу об F# и понять что из себя представляет этот язык. Но зная С++ или C# недостаточно прочитать что-то про F#, Немерле или ОКамл. Это просто бесполезно.
в цитате на следующей строчке именно это и сказано. C>>>>понадобится, потрачу неделю чтобы выучить синтаксис и примерно прикинуть как семантика ложится на известные мне концепции и всех делов. VD>>>Попробуй заменить в своей логике язык на телевизор. Скажем ты пользуешься радио. VD>>>Тебе говорят, что есть же телевизор. И что он как радио, то только лучше. А ты в ответ — "понадобится, потрачу неделю чтобы понять что это такое". C>>нет, такой ответ последует если мне предложат радио новой модели которое принимает сигнал улавливая нейтрино. C>>а на телевизор я согласен.
VD>Вот модель радио тут не причем. VD>Ну, разве что если сравнивать гетеродинный приемник метрового диапазона и современные стереофонический FM-риемник.
мы говорим про сферический язык в вакууме или ты опять рекламируеш какойто конкретный язык?
я вот могу тебе чесно сказать что стерео звук от моно не отличаю, и ни капельки не страдаю от этого. VD>Но и это не корректное сравнение, так как кроме повышения качества тут ничего не будет. А в случае языков разница приципиальная. С языком ты получаешь новые концепции. После изучения которых ты сможешь мыслить другими категориями. Это именно как сменить звук на картинку со звуком.
а кто сказал что я этих концепций не знаю?
Re[3]: Что вас останавливает от изучения нового языка?
B>>Отсутствие практической необходимости. Имеющегося знания asm,C,Java,JavaScript,HTML,SQL достаточно для решения любых задач, которые у меня появляются или могут возникнуть. Ради интереса смотрел на Scala, haskell, C#, но в этом всем нет никакого смысла. Может быть, изучил бы Ceylon, когда под него будет IDE. VD>Необходимость появится точас же как ты поймешь концепции заложенные в эти языки и научишься применять их на практике. VD>А до тех пор все эти языки для тебя будут непонятными хреновинвами.
Вы, видимо, считаете себя носителем сокровенного знания, недоступного другим, и очень этим гордитесь, раз делаете такие выводы. Я не писал, что там что-то для меня не понятно, как раз наоборот.
Re[6]: Что вас останавливает от изучения нового языка?
V>я бы переделал твое предложение так V>Необходимость МОЖЕТ ПОЯВИТСЯ, если ты поймешь концепции заложенные в эти языки и научишься применять их на практике.
Осталось завершить логическую конструкцию с учетом моего исходного комментария:
Необходимость могла появиться, когда я понял концепции, заложенные в эти языки, и научился применять их на практике.
Увы и ах.
Re[37]: Что вас останавливает от изучения нового языка?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, alvas, Вы писали:
A>>Здравствуйте, Воронков Василий, Вы писали: ВВ>>>Ну вот, например, "концепт" универсальной обверточки, через которую в Ela можно скормить любой объект:
A>>Код ниже из http://code.google.com/p/elalang/wiki/GettingStarted A>>Выдает 3 ошибки
ВВ>(+) — это в дефолтных настройках компиляция происходит без прелюда, вот никакого (+) и нет. А с аргументами — бага, да. В текущей версии аргументы поломаны, надо чинить.
ВВ>Чтобы починить (+) надо сделать так (потом добавлю в дефолт):
ВВ>
ВВ>var opts = new LinkerOptions();
ВВ>opts.CodeBase.Directories.Add(new DirectoryInfo(@"Папка с Prelude.ela"));
ВВ>var l = new ElaIncrementalLinker(opts, new CompilerOptions {
ВВ> WarningsAsErrors = false,
ВВ> ShowHints = true,
ВВ> Optimize = true,
ВВ> Prelude = "prelude"
ВВ> });
ВВ>
ВВ>Или можно прям по месту плюсик объявить:
ВВ>
ВВ>let (+) = __internal add
ВВ>
Не помогло — теперь такая ошибка
Ela.ElaTranslationException was unhandled
Message=(1,6): Error ELA610: An argument 'y' is unresolved. No argument with such name were provided.
(1,1): Error ELA610: An argument 'x' is unresolved. No argument with such name were provided.
Source=ElaWrapper
StackTrace:
at ElaWrapper.Program.Eval(String source, Object args) in c:\Downloads\Ela-0-9-3\ElaWrapper\ElaWrapper\Program.cs:line 50
at ElaWrapper.Program.Main(String[] args) in c:\Downloads\Ela-0-9-3\ElaWrapper\ElaWrapper\Program.cs:line 57
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>Здравствуйте, VoidEx, Вы писали:
VE>>>
A>Метро всё равно быстрее их обоих.
VE>>>Сам придумал, сам не знаешь?
A>>Не хами. Метро быстрее — очевидный факт. В большинстве случаев просто в разы.
VE>Я не хамил, я лишь процитировал, что аналогию увёл в сторону не я.
A>>Тебе сколько лет?
VE>Максималист тут не я.
Я не говорил, что ты максималист. Я говорил, что ты отрицаешь очевидные факты про метро.
A>>Я тебе уже сказал. Для сложных задач (не ларек об1Сивать) язык не важен. A>>Совсем не важен, как авторучка для писателя, нужно чтобы просто была какая-нибудь.
VE>Даже я ручку выбираю не от балды. Писать-то всякая может, но некоторыми удобнее. А уж писатели и подавно.
Ну если тебе нравится эта аналогия, то ты пытаешься утверждать, что писатель не важен,
достаточно дать хорошую ручку любому алкоголику, и он сразу станет Львом Толстым.
А я говорю, что ручка не важна. Чтобы стать Толстым нужно поучаствовать в обороне Севастополя.
Иначе писать будет не о чем.
A>>Ничто, никакой божественный язык не позволит тебе написать FineRider или хотя бы Промт. A>>Потому что ты не знаешь что и как должна делать программа. A>>С самым совершенным языком ты будешь просто в два раза быстрее тупить. A>>Мерседес тебя никуда не довезет, если ты не знаешь, куда ехать.
VE>Разумеется. Но если знаю, то мерседес предпочтительней.
Мерседес предпочтительнее, если он бесплатный.
А изучение нового языка (и всех сопутсвующих вещей) не бесплатно.
Оно стоит года (а то и нескольких) жизни.
И лучше это время потратить на что-то другое — например алгоритмы и предметную область.
Да хоть на английский тот же самый.
A>>Я тут уже предлагал простенькую задачку (с сайта Яндекса). Есть список глаголов русского языка. A>>Сформировать список пар глаголов "делал"-"сделал". A>>Какие преимущества в этой задаче может дать язык программирования? A>>В качестве эталона берем С++.
VE>GC, замыкания, АлгТД, лямбды, ФВП, легковесные потоки, иммутабельность: все эти на твой взгляд незначимые плюшки дают возможность писать тот самый алгоритм, а не в очередной раз бороться с языком (в этом плане C++ и правда эталон). Для неспецифических задач (где легковесные потоки, например, позволят на порядок проще написать) разница в простоте написания будет не в разы, но всё же будет заметна.
Я не понял, так ты слил что-ли? Все, что ты перечислил никак не помогает решить названную задачу. Вот то есть совсем.
Спорим, что я с помощью С++ (плюс голова, разумеется) решу эту задачу быстрее чем ты (любыми средствами)?
Хочешь еще задачку с сайта Яндекса?
Есть Террабайт текстов на русском языке.
Нужно найти миллион самых частотных сочетаний из двух слов.
Течёт вода Кубань-реки куда велят большевики.
Re[38]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
A>Не помогло — теперь такая ошибка
Я говорю же — аргументы там поломаны сейчас. Можешь взять версию из транка, там работает, но аргументы передаются через событие ArgumentResolve.
GettingStarted я обновил с новым примером.
Вообще аргументы такая штука... Может, вообще их под кат пущу. Передать какие-нибудь значения можно и через модуль. И не придется писать всякие уродливые $x $y.
Re[39]: Что вас останавливает от изучения нового языка?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, alvas, Вы писали:
A>>Не помогло — теперь такая ошибка
ВВ>Я говорю же — аргументы там поломаны сейчас. Можешь взять версию из транка, там работает, но аргументы передаются через событие ArgumentResolve. ВВ>GettingStarted я обновил с новым примером.
ВВ>Вообще аргументы такая штука... Может, вообще их под кат пущу. Передать какие-нибудь значения можно и через модуль. И не придется писать всякие уродливые $x $y.
Ругается на l.ArgumentResolve. Когда выложишь новую сборку — свисни.
P.S. Сам же просил фидбека, я не враг тебе, а скорее наоборот
P.P.S. Завел новую ветку
Здравствуйте, alvas, Вы писали:
ВВ>>Вообще аргументы такая штука... Может, вообще их под кат пущу. Передать какие-нибудь значения можно и через модуль. И не придется писать всякие уродливые $x $y.
A>Ругается на l.ArgumentResolve. Когда выложишь новую сборку — свисни.
Это есть только в транке.
A>P.S. Сам же просил фидбека, я не враг тебе, а скорее наоборот
Да нет, спасибо. Баг нашел Я очень даже рад. У меня как раз аргументы тестами не покрыты
A>P.P.S. Завел новую ветку
Здравствуйте, alpha21264, Вы писали:
A>>>Тебе сколько лет?
VE>>Максималист тут не я.
A>Я не говорил, что ты максималист. Я говорил, что ты отрицаешь очевидные факты про метро.
Максималист ты, и подтверждаешь это нижеследующим сообщением очередной раз.
VE>>Даже я ручку выбираю не от балды. Писать-то всякая может, но некоторыми удобнее. А уж писатели и подавно.
A>Ну если тебе нравится эта аналогия, то ты пытаешься утверждать, что писатель не важен, A>достаточно дать хорошую ручку любому алкоголику, и он сразу станет Львом Толстым.
Я такого не утверждаю, перестань кидаться в крайности. У тебя либо одно не важно, либо другое.
A>А я говорю, что ручка не важна. Чтобы стать Толстым нужно поучаствовать в обороне Севастополя.
Важно и то, и другое. Ручка менее важна, но это не повод писать гусиным пером.
VE>>Разумеется. Но если знаю, то мерседес предпочтительней.
A>Мерседес предпочтительнее, если он бесплатный.
Либо если денег достаточно.
A>А изучение нового языка (и всех сопутсвующих вещей) не бесплатно. A>Оно стоит года (а то и нескольких) жизни.
При знании концепций язык можно изучить далеко не за год. А при незнании — польза будет в изучении этих самых концепций.
VE>>GC, замыкания, АлгТД, лямбды, ФВП, легковесные потоки, иммутабельность: все эти на твой взгляд незначимые плюшки дают возможность писать тот самый алгоритм, а не в очередной раз бороться с языком (в этом плане C++ и правда эталон). Для неспецифических задач (где легковесные потоки, например, позволят на порядок проще написать) разница в простоте написания будет не в разы, но всё же будет заметна.
A>Я не понял, так ты слил что-ли? Все, что ты перечислил никак не помогает решить названную задачу. Вот то есть совсем. A>Спорим, что я с помощью С++ (плюс голова, разумеется) решу эту задачу быстрее чем ты (любыми средствами)?
Спорим, начинай. Я, правда, не понимаю, что ты этим собираешься доказать, что не языком единым? Так этого никто и не утверждал, а ты всё упрямо опровергаешь.
A>Хочешь еще задачку с сайта Яндекса? A>Есть Террабайт текстов на русском языке. A>Нужно найти миллион самых частотных сочетаний из двух слов.
Давай лучше что-нибудь под Erlang возьмём, а ты это на Си++ начнёшь писать?
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
V>>Есть еще важный такой момент. Понимать ЯП — это понимать его до такой степени, чтобы знать, как написать компилятор этого языка. Если Фортран/С/Паскаль/Лисп/Пролог сильный студент 4-5-го курса вполне будет в состоянии написать (пусть не самым оптимальным образом или даже не в полном объеме стандартов, не суть), то вот с этим Меркури или с Хасклелем — 100% обломается. Значит, рано пока.
FR>Тогда схема (без макросов) идеальный вариант, функциональный и императивный язык в одном флаконе плюс очень легко написать транслятор.
У Схемы раскрутка хвостовой рекурсии — обязательная часть стандарта. В остальном это тот же Лисп, с т.з. реализации. Т.е. не принципиально.
FR>То же самое и ML, императивная часть не хуже паскаля, функциональщина полноценная, транслятор тоже несложен и уже есть готовый курс FR>его написания для студентов http://min-caml.sourceforge.net/index-e.html
Возможно. Стадии редукции типизированных лямбда выражений нам, например, не читали. Поэтому было бы странно требовать реализовать материал вне программы. Если где-то программа соответствует этому предложению — почему бы и нет?
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Это которая была сингулярити? V>И это масштабируется от систем с 64к памяти до систем с 64гиг памяти? Как стек TCP, например?
И нихрена ты не понял из того что там написано.
Там весь код доказанный.
V>Можно взять Схему — допиленный до функциональной чистоты и имеющий стандарт новомодный диалект Лиспа. Ограничения алфавита Хаскеля, и не очень бросающийся в глаза синтаксис замыканий вряд ли будет способствовать пониманию происходящего. ИМХО, понимать происходящее лучше на чем-нить попроще, а к Хаскелю подступаться уже хоть с каким-то багажом.
По сравнению с синтаксисом лиспов синтаксис хаскеля прост, понятен и логичен.
WH>>Он очень грязный. V>Например?
Например там IO императивное и может быть где попало.
И вообще читай про Mercury там все написано.
V>Да, есть что подчерпнуть. Но, как я же сказал, там много лишнего для целей логического программирования. Это довольно-таки мощный и универсальный язык.
И что же там лишнего?
V>Есть еще важный такой момент. Понимать ЯП — это понимать его до такой степени, чтобы знать, как написать компилятор этого языка. Если Фортран/С/Паскаль/Лисп/Пролог сильный студент 4-5-го курса вполне будет в состоянии написать (пусть не самым оптимальным образом или даже не в полном объеме стандартов, не суть), то вот с этим Меркури или с Хасклелем — 100% обломается. Значит, рано пока.
Там все проще, чем кажется. Особенно если "не самым оптимальным образом".
V>Хотя, шаблоны плюсов тоже писать обломается. Потому вчерашние студенты и не особо в них разбираются. Потому учить плюсам в полном объеме в ВУЗе мне тоже кажется не очень хорошей идеей. Наследование — да, виртуальные методы — да. Метапрограммирование на шаблонах — нет!
Вот это было как раз в том возрасте
Хотя на плюсах в свое время выдавал шикарные примеры, был виден полет мысли. Например — типизированная система преобразования физических величин или куча ответов помельче в форуме по плюсам.
Только с тех пор я сильно поумнел.
А ты остался на том же уровне.
V>Ну блин, каждый лишний запуск обхода дерева с каждого его узла по мере обхода верхнего уровня, это +1 к показателю степени сложности. А тут +4. Итого, квадратичная изначальная сложность алгоритма превращается в 6-ю степень. Я понимаю, что глубина правил обычно маленькая, да и % правил именно такого вида может быть небольшой... Но для общего случая сразу режет по глазам.
Это мне вынесло весь мозг.
Сложность данной реализации оптимизатора линейна.
А ты, судя по всему, вообще не умеешь считать асимптотику.
V>Ну так, если предполагается дальнейшее независимая доработка, почему бы не вынести этот код за пределы этой одной мега ф-ии? И не дорабатывать независимо от остальной отлаженной части?
Зачем?
V>Я тут инлайна не увидел, хотя ты дважды его упоминал. Где он?
Смотрим в книгу, видим фигу.
| Call(name, bp) =>
match (weights.Get(name))
{
| Some(weight) when weight < 20 =>
match (getOptimizedRule(name))
{
| Some(Fsm as rule) => rule
| _ => Rule.Call(r.Location, name, bp)
}
| _ => Rule.Call(r.Location, name, bp)
}
И что характерно те люди, которые таки правили, этот код находили инлайн сразу. И даже экспериментировали с ним.
V>И чем инлайн-подстановка принципиально отличается от других преобразований АСТ?
Тем, что правило должно быть распарсено.
А если процессы совместить, то правило может быть не распарсено к тому времени как понадобится инлайн.
Также для инлайна нужно посчитать, сколько правило "весит". А для этого опять же нужно распарсить все правила.
Ибо если считать веса сразу для всех, то алгоритм линейный. А если для каждого по отдельности, то от экспоненты никуда не деться.
V>Потому что не с первого раза понимают, наверно.
Код в котором сплетены несколько процессов говнокод сколько на него не смотри. Понять его нельзя.
V>Надо им твой показать, и запротоколировать комменты. Или проще будет еще по разику назвать друг друга ламерами и разбежаться? На радость читателям ветки.
Для того чтобы они его поняли нужно чтобы они знали что такое сравнение с образцом.
Иначе они сделают тупое выражение лица и скажут что это какие-то кракозябры.
V>Согласен, самый минимальный вариант можно вычислить в общем случае через полный перебор применения алгоритма минимизации, начиная от каждого уникального первого входного сигнала из начального состояния.
Чего?
ДКА минимизирует по-другому... очень сильно по-другому.
V> Сойдемся на термине минимизированный. Обычно же полный перебор не делает. Просто от первого же состояния склеивают остальные возможные состояния до первого конфликта выходных сигналов, потом вводят новое подстановочное состояние и т.д.
Это похоже на преобразование НКА в ДКА.
Но никак не на минимизацию.
Ты либо плохо объясняешь, либо нихрена не понимаешь в автоматах.
V>Остановимся на абстрактном построителе модели документа. Согласись, что никакие подробности его внутренней работы не усложнят и не повлияют на код собственно парсера входного потока. В свою очередь, при построении АСТ мы уже имеем диспетчеризацию либо через нужную ф-ию калбэка (что хорошо), либо через код нетерминала (что чуть хуже,но с выходом на первый вариант внутри). Что мешает там же не просто создать узел АСТ, а сразу его минимизированный вариант?
Инлайн.
Неоптимизированный вариант все равно нужен:
Для вывода типов.
Для подсказок в студии.
Для генерации отладочного кода.
Короче ты влез в тему, в которой ты нихрена не понимаешь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Ммм... LL(к) — это и есть грамматика без левой рекурсии. За то ее и любят писатели компиляторов. Если при построении ДКА получаем конфликт, то применяем один из методов устранения левой рекурсии или факторизацию.
У тебя была притензия к комбинаторам что они затыкаются на левой рекурсии.
Я тебе сказал что ЛЛ(К) тоже ее не умеют.
Что не ясно?
V>Т.е. не более чем для экспериментов по отладке грамматики? Или же можно так и оставлять для продакшн кода?
Продакшен он разный бывает.
Иногда лучше не стоит.
Но обычно пофигу.
V>Да вроде автоматическое построение автомата для LL(1) идет как одна из лаб на 3-м курсе обучения. Не? Приведение грамматики к LL(к), а еще лучше к LL(1) — ИМХО отличная стадия работы перед началом кодирования любого парсера. Все-таки, эффективность LL(к) того стоит.
Бред это.
Алгоритмы разбора из книги дракона тупиковая ветвь.
А то, что их пихают во все щели, замедляет развитие более перспективных техник.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
C>>а кто сказал что я этих концепций не знаю? VE>Если б знал, писал бы на Nemerle.
Как только мне за это будут платить буду писать на нем. А так же еще на полусотне других языков.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
V>>Это которая была сингулярити? V>>И это масштабируется от систем с 64к памяти до систем с 64гиг памяти? Как стек TCP, например? WH>И нихрена ты не понял из того что там написано.
Как же парит эта манера доставать сылки 5-тилетней давности и размахивать ими. К тому же, размахивать столь криво.
WH>Там весь код доказанный.
Насчет "весь" чушь полная. Вовсе не весь, а тот который выше "пояса безопасности" этой операционки. Так что вопрос относительно масштабируемости в силе.
V>>Да, есть что подчерпнуть. Но, как я же сказал, там много лишнего для целей логического программирования. Это довольно-таки мощный и универсальный язык. WH>И что же там лишнего?
Все, что не относится непосредственно к логическому программированию. Т.е. практически весь язык лишний. В общем, пример неудачный.
Я когда-то посоветовал обратить на него внимания, когда Влад метался по поводу алгоритмов вывода типов, и то лишь как пример встроенного логического движка, предлагая сделать в вашем случае это на уровне либы и прикрутить синтаксис макросами. Теперь вы оба тычете этой ссылкой мне обратно. Очень смешно.
V>>Есть еще важный такой момент. Понимать ЯП — это понимать его до такой степени, чтобы знать, как написать компилятор этого языка. Если Фортран/С/Паскаль/Лисп/Пролог сильный студент 4-5-го курса вполне будет в состоянии написать (пусть не самым оптимальным образом или даже не в полном объеме стандартов, не суть), то вот с этим Меркури или с Хасклелем — 100% обломается. Значит, рано пока. WH>Там все проще, чем кажется. Особенно если "не самым оптимальным образом".
Если делать полноценный вывод типов, то не так просто.
WH>Только с тех пор я сильно поумнел.
Ну, пока впечатление ровно обратное — потерял форму, спустился на более простые задачи. Да еще пытаешься выдавать их за откровения.
WH>А ты остался на том же уровне.
В какой из областей IT?
V>>Ну так, если предполагается дальнейшее независимая доработка, почему бы не вынести этот код за пределы этой одной мега ф-ии? И не дорабатывать независимо от остальной отлаженной части? WH>Зачем?
Чтобы экспериментами в одном месте не ломать случайно остальные. А зачем вообще стараются независимые вычисления разносить друг от друга?
V>>Я тут инлайна не увидел, хотя ты дважды его упоминал. Где он? WH>Смотрим в книгу, видим фигу. WH>
Ты это и называешь инлайном, что ли? Тю, блин. Я-то думал, у вас там где-то инлайн генерируемого кода разборщика, а не подстановка регулярной части правила, аналогичная операции приведения расширенной нотации регулярных выражений к канонической. Таким макаром инлайн искать можно было долго.
В общем, очередной пример изобретения велосипедов и выдачи за откровения.
Тогда вернемся к оптимизации по мере построения АСТ. Тебе всерьез эта подстановка мешает строить сразу оптимизированный вариант?
V>>И чем инлайн-подстановка принципиально отличается от других преобразований АСТ? WH>Тем, что правило должно быть распарсено.
Угу, что делают с forward reference мы не в курсе. А когда придумаем, скажем что это очередной алгоритм "переднего края"?
WH>А если процессы совместить, то правило может быть не распарсено к тому времени как понадобится инлайн.
Да понял я все эти "рассуждения".
WH>Также для инлайна нужно посчитать, сколько правило "весит". А для этого опять же нужно распарсить все правила.
Если инлайнится только FSM, то считать вес правила не надо. Вообще. Подставляют в любом случае. Или ты хочешь сэкономить сотню-другую состояний автомата? Кол-во состояний напрямую на быстродействие не влияет, уже упоминал.
WH>Ибо если считать веса сразу для всех, то алгоритм линейный. А если для каждого по отдельности, то от экспоненты никуда не деться.
Если по отдельности, то такая же очередь forward reference для обработки и всё. Обрати внимание, что предлагалось алгоритмы каждого способа оптимизации разнести по ф-иям, которые можно будет вызывать из разных мест. Я пока вижу, что вместо событийной модели построения ACT идет поочередная энергичная обработка.
V>>Потому что не с первого раза понимают, наверно. WH>Код в котором сплетены несколько процессов говнокод сколько на него не смотри. Понять его нельзя.
С чего ты взял про "несколько процессов"? Молодым коллегам обычно непонятен декларативный подход как таковой, потому что за ним "что-то скрывается", а им желательно видеть все происходящее целиком, пошагово в дебаге пройтись чтобы можно было. Ну и, читать код макросов С — тоже некий навык нужен. Как и макросов Немерле, справедливости ради.
V>>Надо им твой показать, и запротоколировать комменты. Или проще будет еще по разику назвать друг друга ламерами и разбежаться? На радость читателям ветки. WH>Для того чтобы они его поняли нужно чтобы они знали что такое сравнение с образцом. WH>Иначе они сделают тупое выражение лица и скажут что это какие-то кракозябры.
Сравнение с образцом разное бывает. Если бы была ее возможность унификации до значений, то это понимается раньше и проще, чем сопоставление со структурой. Опять же, в исполнении Немерле оно заметно отличается от классического разбора АлгТД, т.е. действительно местами кракозябры и самодеятельность.
V>>Согласен, самый минимальный вариант можно вычислить в общем случае через полный перебор применения алгоритма минимизации, начиная от каждого уникального первого входного сигнала из начального состояния. WH> Чего? WH>ДКА минимизирует по-другому... очень сильно по-другому.
Твое "по-другому" — это и есть единичный шаг того, о чем я говорю. Только это "по-другому" действительно не гарантирует самый минимальный вариант.
V>> Сойдемся на термине минимизированный. Обычно же полный перебор не делает. Просто от первого же состояния склеивают остальные возможные состояния до первого конфликта выходных сигналов, потом вводят новое подстановочное состояние и т.д. WH>Это похоже на преобразование НКА в ДКА.
Мде. Преобразование НКА в ДКА (которое без минимизации) "склеивает" только те состояния, в которые происходит переход по одному и тому же входному сигналу. Собственно, это и есть избавление от недетерминированности. А ЛЮБОЙ алгоритм минимизация кол-ва состояний ДКА "склеивает" лишь те состояния, в которых имеем непротиворечивый выход. Разница в алгоритмах только в способе разбиения исходных состояний на классы эквивалентности (заменяемых состоянием преобразованного автомата), но суть у них одинакова. Это по модели Мура. По Милли вариантов больше, но автоматы Милли неэффективны в программном исполнении, их разумно делать в аппаратуре, поэтому не здесь упоминаю.
WH>Но никак не на минимизацию. WH>Ты либо плохо объясняешь, либо нихрена не понимаешь в автоматах.
Либо наоборот, считал что ты знаешь и чем речь и не развожу лишнего. Есть же несколько координат минимиации: по состояниям и по входному множеству сигналов. Естественно, что второе тривиально на уже минимизированном автомате и я его не рассматриваю. А ни один алгоритм первой оптимизации не гарантирует наилучшего результата, бо в общем случае существует несколько вариантов разбиения состояний на непересекающиеся по выходным сигналам классы эквивалентности. Да он и не нужен обычно, самый минимальный вариант. Но чистоты спора ради я упомянул, как можно найти точный минимальный вариант — перебрав варианты разбиения.
V>>Остановимся на абстрактном построителе модели документа. Согласись, что никакие подробности его внутренней работы не усложнят и не повлияют на код собственно парсера входного потока. В свою очередь, при построении АСТ мы уже имеем диспетчеризацию либо через нужную ф-ию калбэка (что хорошо), либо через код нетерминала (что чуть хуже,но с выходом на первый вариант внутри). Что мешает там же не просто создать узел АСТ, а сразу его минимизированный вариант? WH>Инлайн. WH>Неоптимизированный вариант все равно нужен: WH>Для вывода типов.
PEG-парсер выводит типы?
WH>Для подсказок в студии.
Конкретно здесь что используется в кач-ве подсказки? Можешь на скриншоте показать?
WH>Для генерации отладочного кода.
Зачем кодогенератору создавать разный код для дебага и релиза? Там же птичья грамота все-равно. Грамматики не отлаживают пошаговым проходом по коду парсера.
WH>Короче ты влез в тему, в которой ты нихрена не понимаешь.
А ну да, у кого-то представления отличаются от твоих, значит он ничего не понимает.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, cvetkov, Вы писали:
C>Здравствуйте, VoidEx, Вы писали:
C>>>а кто сказал что я этих концепций не знаю? VE>>Если б знал, писал бы на Nemerle. C>Как только мне за это будут платить буду писать на нем. А так же еще на полусотне других языков.
Это был сарказм
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Как же парит эта манера доставать сылки 5-тилетней давности и размахивать ими. К тому же, размахивать столь криво.
June 2010
Это пятилетняя ссылка?
V>Насчет "весь" чушь полная. Вовсе не весь, а тот который выше "пояса безопасности" этой операционки. Так что вопрос относительно масштабируемости в силе.
Ты ссылку то почитай.
Там весь код доказан.
Кроме сотни ассемблерных инструкций загрузчика.
Но при желании можно и его доказать.
V>Все, что не относится непосредственно к логическому программированию. Т.е. практически весь язык лишний. В общем, пример неудачный.
Там собственно весь язык к логическому программированию и относиться.
V>Ну, пока впечатление ровно обратное — потерял форму, спустился на более простые задачи. Да еще пытаешься выдавать их за откровения.
Чего сложного в "типизированная система преобразования физических величин"?
Это же тупой примитивизм.
V>Чтобы экспериментами в одном месте не ломать случайно остальные. А зачем вообще стараются независимые вычисления разносить друг от друга?
То-то ты предлагаешь оптимизатор с парсером совместить
V>Я вижу здесь только одну подстановку: Some(Fsm as rule) => rule. Для остальных опять Call. (Весь код не смотрел, сужу только по этому файлу)
Ты что сказать то хотел?
V>Относительно подстановки FSM, я уже дважды упоминал, что у тебя идет поддержка, аналогичная "расширенной нотации регулярных выражений". Тут например.
И что? Ты вообще о чем?
V>Ты это и называешь инлайном, что ли? Тю, блин. Я-то думал, у вас там где-то инлайн генерируемого кода разборщика, а не подстановка регулярной части правила, аналогичная операции приведения расширенной нотации регулярных выражений к канонической. Таким макаром инлайн искать можно было долго.
Там вообще то инлай другого правила.
Это сейчас там стоит ограничение на Fsm.
Раньше оно и другие правила подставляло.
Просто это смысла не имеет.
А зачем инлайнить генерируемый код когда гораздо проще заинлайнить модель по которой код генерируется?
Более того после инлайна еще и оптимизация идет которую на сгенерированном коде не сделать.
V>В общем, очередной пример изобретения велосипедов и выдачи за откровения.
В очередная раз болтовня о том в чем не понимаешь нихрена.
V>Тогда вернемся к оптимизации по мере построения АСТ. Тебе всерьез эта подстановка мешает строить сразу оптимизированный вариант?
Всерьез.
V>Угу, что делают с forward reference мы не в курсе. А когда придумаем, скажем что это очередной алгоритм "переднего края"?
Нормальные люди строят АСТ и дальше уже плевать на forward reference.
Что я и сделал.
V>Если инлайнится только FSM, то считать вес правила не надо. Вообще. Подставляют в любом случае. Или ты хочешь сэкономить сотню-другую состояний автомата? Кол-во состояний напрямую на быстродействие не влияет, уже упоминал.
Автомат сам по себе на быстродействие почти не влияет. И я об этом уже раз сто говорил.
V>Если по отдельности, то такая же очередь forward reference для обработки и всё. Обрати внимание, что предлагалось алгоритмы каждого способа оптимизации разнести по ф-иям, которые можно будет вызывать из разных мест. Я пока вижу, что вместо событийной модели построения ACT идет поочередная энергичная обработка.
И что?
V>С чего ты взял про "несколько процессов"?
Так ты сам постоянно твердишь про то, что парсинг с оптимизатором скрестить обязательно надо.
V>Сравнение с образцом разное бывает. Если бы была ее возможность унификации до значений, то это понимается раньше и проще, чем сопоставление со структурой. Опять же, в исполнении Немерле оно заметно отличается от классического разбора АлгТД, т.е. действительно местами кракозябры и самодеятельность.
Чего? В немеле классика МЛ. Один в один. 1973й год однако.
V>Твое "по-другому" — это и есть единичный шаг того, о чем я говорю. Только это "по-другому" действительно не гарантирует самый минимальный вариант.
Ты действительно нихрена в автоматах не понимаешь.
Совсем.
Мое по-другому делает из ДКА гарантированно минимальный ДКА.
Открой дракона, наконец. Там все прекрасно написано. Даже ты поймешь. Может быть.
V>PEG-парсер выводит типы?
У меня парсер вообще-то типизированный.
Так что мне приходится выводить типы правил, чтобы проверить сигнатуры обработчиков и главное захватить распарсенные данные.
V>Конкретно здесь что используется в кач-ве подсказки? Можешь на скриншоте показать?
Запусти студию и посмотри.
V>Зачем кодогенератору создавать разный код для дебага и релиза? Там же птичья грамота все-равно. Грамматики не отлаживают пошаговым проходом по коду парсера.
Народ хочет.
Тем более что дебужный код получается весьма понятным.
V>А ну да, у кого-то представления отличаются от твоих, значит он ничего не понимает.
Ты просто несешь бред.
Твои понятия просто несовместимы с создание промышленных компиляторов.
Одна оптимизация во время парсинга чего стоит.
Оптимизация это потеря информации.
А без этой информации ни навигацию, ни сообщения об ошибках нормально не сделать.
Типизацию на оптимизированном АСТ тоже не сделать.
Вон спроси у Влада, что он думает о том, что поляки в компиляторе немерла не всю информацию полученную при разборе текста сохраняют. Услышишь много громкого мата. Я гарантирую это.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
V>>Чтобы экспериментами в одном месте не ломать случайно остальные. А зачем вообще стараются независимые вычисления разносить друг от друга? WH>То-то ты предлагаешь оптимизатор с парсером совместить
Я же говорю — теряешь форму. Я предлагал минимизировать по мере парсинга. А ты сделал... Действительно смешной вывод.
V>>Я вижу здесь только одну подстановку: Some(Fsm as rule) => rule. Для остальных опять Call. (Весь код не смотрел, сужу только по этому файлу) WH>Ты что сказать то хотел?
Что искал классический инлайн.
V>>Относительно подстановки FSM, я уже дважды упоминал, что у тебя идет поддержка, аналогичная "расширенной нотации регулярных выражений". Тут например.
Что сия фича была замечена и ранее, и она для описания FSM весьма популярна.
Т.е. вот пример расширенной нотации регулярных выражений:
rule digit = choice("0123456789");
lexema number = digit+;
lexema kg = number & "kg";
Чтобы сгенерировать ДКА по этой системе, производят подстановку правил number и digit. Термин "инлайн" к этому процессу первый раз слышу. Хотя, не принципиально.
V>>Ты это и называешь инлайном, что ли? Тю, блин. Я-то думал, у вас там где-то инлайн генерируемого кода разборщика, а не подстановка регулярной части правила, аналогичная операции приведения расширенной нотации регулярных выражений к канонической. Таким макаром инлайн искать можно было долго. WH>Там вообще то инлай другого правила. WH>Это сейчас там стоит ограничение на Fsm. WH>Раньше оно и другие правила подставляло.
Значит, код, который "раньше" и нужно было приводить, как пример инлайна.
WH>Просто это смысла не имеет. WH>А зачем инлайнить генерируемый код когда гораздо проще заинлайнить модель по которой код генерируется?
ИМХО, никакого классического инлайна вычислений, сопровождающимся ребиндингом аргументов, тут нет. Вот пример инлайна:
inline plus(int a, int b) { return a+b; }
При подстановке этой ф-ии, например сюда: return plus(a.x, b.x); происходит ребиндинг аргументов а и b на реальные параметры a.x и b.x, со всеми преобразованиями кода, связанными с особенностями получения их значений, т.е. генерируется новыйкод по "шаблону" заинлайненного выражения, а не подставляется имеющийся без изменений. Хотя, в вырожденном случае возможна подстановка без изменений, но у тебя только вырожденный случай и есть.
А я уже было чуть не заинтересовался...
WH>Более того после инлайна еще и оптимизация идет которую на сгенерированном коде не сделать.
Блин, как нудно. Обработка системы правил перед реализацией парсера — это обязательная стадия. Всегда. Реально весело читать все это, сопровождаемое пафосными "более того". А покажи, где у тебя выявляются и отбрасываются тупиковые ветки грамматики? Ну чтобы потом ты мог сказать "более того, у нас еще и тупиковые ветки отбрасываются, представляете?!!" Или нету этой стадии обработки правил в вашем "переднем крае"?
V>>В общем, очередной пример изобретения велосипедов и выдачи за откровения. WH>В очередная раз болтовня о том в чем не понимаешь нихрена.
Отчего же, то, что приведено, понятно и прозрачно. А что там было "раньше", или как ты хотел, а оно сейчас не так — это уже не мои половые трудности.
V>>Угу, что делают с forward reference мы не в курсе. А когда придумаем, скажем что это очередной алгоритм "переднего края"? WH>Нормальные люди строят АСТ и дальше уже плевать на forward reference.
Да пофиг, коль мы уперлись в обсуждение — возможно это или нет. Ответа "мне так удобней" было бы достаточней, чем пытаться доказать, что это невозможно. Бо ты сильно ошибаешься.
V>>Если инлайнится только FSM, то считать вес правила не надо. Вообще. Подставляют в любом случае. Или ты хочешь сэкономить сотню-другую состояний автомата? Кол-во состояний напрямую на быстродействие не влияет, уже упоминал. WH>Автомат сам по себе на быстродействие почти не влияет. И я об этом уже раз сто говорил.
Ну, это наверно из-за особенностей дотнета, где пробежка по массиву стоит почти столько же, сколько пробежка по графу разрозненных объектов в памяти. Опять же, я не видел еще реализации автоматной части, т.е. представления перехода и кода его выборки.
V>>С чего ты взял про "несколько процессов"? WH>Так ты сам постоянно твердишь про то, что парсинг с оптимизатором скрестить обязательно надо.
В событийной модели, или как тут модно называть ее "реактивной", это делается естественно. Только мне термин "скрещивать" не нравится. Зароутить события м/у относительно-независимыми модулями, это не есть их скрещивание.
WH>Мое по-другому делает из ДКА гарантированно минимальный ДКА. WH>Открой дракона, наконец. Там все прекрасно написано. Даже ты поймешь. Может быть.
Дай имя алгоритма, который подразумеваешь.
V>>А ну да, у кого-то представления отличаются от твоих, значит он ничего не понимает. WH>Ты просто несешь бред. WH>Твои понятия просто несовместимы с создание промышленных компиляторов. WH>Одна оптимизация во время парсинга чего стоит. WH>Оптимизация это потеря информации. WH>А без этой информации ни навигацию, ни сообщения об ошибках нормально не сделать.
Да что ты? И как же компилятор С++ позволяет даже в оптимизированном варианте сохранять, при надобности, дебажную информацию о соответствии исходного кода, и даже пошагово ходить по шаблонным и заинлайненым ф-ям? А ведь всё честно заинлайненно по самое нихочу. А может "передний край" тут в том, что сохранить сответствие строк исходника и даже самого оптимизированного бинарника не так уж сложно?
Ты понимаешь, что вообще все твои аргументы пока что из разряда "вы все дураки, один я умный". Ни одного по делу. Что конкретно мешает сохранять соответствие м/у исходными правилами и генерируемым, даже самым оптимальным кодом. Вот давай, с подробностями и примерами.
WH>Типизацию на оптимизированном АСТ тоже не сделать.
Походил я там по исходникам... У вас же нет в PEG-парсере той типизации, которая требует перебора, т.е. логического программирования. И бета-редукции нет. Что и где там не получится "типизировать"? Называй файл/метод/ф-ию, которые перестанут работать.
А может проблема в том, что вместо списка локейшенов протягивается один его экземпляр? Поэтому теряется история-цепочка подстановки правил в процессе оптимизации? Ну дык это от очевидной небрежности реализации, по принципу "и так потянет".
WH>Вон спроси у Влада, что он думает о том, что поляки в компиляторе немерла не всю информацию полученную при разборе текста сохраняют. Услышишь много громкого мата. Я гарантирую это.
Сохраняй информацию, в чем проблема. Вы уже 5-й год над компилятором работаете, нельзя было доработать моменты, которые в текущем виде не устраивают?
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, WolfHound, Вы писали:
WH>>>То-то ты предлагаешь оптимизатор с парсером совместить V>>Я же говорю — теряешь форму. Я предлагал минимизировать по мере парсинга. А ты сделал... Действительно смешной вывод. WH>Так это и есть парсинг с оптимизатором совместить. WH>Это лапша!
Ты отдели на досуге собственно парсер от построителя документа, то бишь AST. А остальное увидишь сам.
V>>Чтобы сгенерировать ДКА по этой системе, производят подстановку правил number и digit. Термин "инлайн" к этому процессу первый раз слышу. Хотя, не принципиально. WH>Так там много чего инлайнилось. Просто сейчас остался один ДКА ибо другое инлайнить нет смысла тк на производительность не влияет.
Да понял я уже, что ты упрощение правил называешь инлайном.
Что касается профита быстродействия, то что и как мерили? И нафига там, все-таки, прикидка по весам, хоть убей не пойму? Это типа такой эвристики, наподобие алгоритма инлайнера компилятора gcc? Чья идея? Это же не из той области. В стандартном шаге упрощения систем правил производят ПОЛНУЮ подстановку (!!!), т.е. до тех пор, пока не натыкаемся на рекурсию. Заметь, пофиг веса абсолютно. Если же на рекурсию в итоге не натыкаемся, т.е. удается полностью осуществить подстановку всех нетерминалов, то грамматика в результате упрощения вырождается в регулярную. Полную подстановку я вижу только для FSM-участков, а для остальных правил ты не производишь раскрытие Choice.
А коль у вас не полная подстановка, то непонятно что там пытались замерить. Ну и ес-но, что эффект от упрощения особенно заметен только на самом нижнем уровне, это аналогично тому, как имеет смысл оптимизировать вычисления на самом вложенном цикле, потому как оптимизация циклов верхнего уровня заметного профита не дает. Ладно, даже если пользовать эвристику по весам. Я вижу по коду, что вычисление веса слишком косвенно связано с частотой использования (обратно ему), т.к. вычисляет "сложность" правила. Было бы неплохо к весу непосредственно "примешивать" кол-во прямых и транзитивных вызовов, т.е. частоту использования правила, чтобы находить "самые низлежащие" правила. Более того, после беглого просмотра исходников мне кажется, что сам вес в вашей реализации после шага оптимизации может быть изменен, если пересчитать его заново по оптимизированному варианту. Т.е. после пересчета надо запускать оптимизацию снова и так итеративно до тех пор, пока очередной запуск оптимизации не будет "холостым". Кстати, это единственный пока момент, который обосновывает отдельную стадию оптимизации, бо ее надо будет вызывать многократно.
WH>Ну то есть по твоему инлайн может быжет быть только когда мы имеем дело "обычным" кодом? WH>А когда мы берем другую модель кода, то инлайн уже не инлайн.
К системе уравнений применяют термин "упрощение", а к отдельным выражениям "раскрытие скобок", "подстановка". Явно споткнулись о терминологию. Будем далее за нее бодаться?
V>>Ну, это наверно из-за особенностей дотнета, где пробежка по массиву стоит почти столько же, сколько пробежка по графу разрозненных объектов в памяти. Опять же, я не видел еще реализации автоматной части, т.е. представления перехода и кода его выборки. WH>Нет. Это по тому, что и без автоматов код получался очень быстрым.
Наверно, особенность ПЕГ в том, что на тех участках, где нет перебора/откатов, он действительно шпарит как автомат... так же как любой магазинный парсер, например LR.
А может, сие от грамматики зависит? Я вообще считал, что выделение FSM в вашей реализации ПЕГ нужно исключительно ради минимизации кол-ва его состояний, больше незачем. Реальное быстродействие конечно надо искать в оптимизации переборов/откатов, а не в выделении FSM. Бо минимизация состояний на быстродействии почти не сказывается. Вернее, если бы не эффекты кешей процессоров, то скорость работы по минимизированному ДКА в точности равна скорости работы по минимизированному. У последнего просто таблица переходов не такая "разреженная".
V>>Дай имя алгоритма, который подразумеваешь. WH>Hopcroft, John (1971), "An n log n algorithm for minimizing states in a finite automaton", Theory of machines and computations (Proc. Internat. Sympos., Technion, Haifa, 1971), New York: Academic Press, pp. 189–196, MR0403320 .
Вообще да, я немного не прав в исходном сообщении. Хотя, вариантов разбиения на непересекающиеся классы эквивалентности действительно может быть несколько в общем случае (что я и заметил в пред. сообщениях, т.к. наблюдал сие неоднократно на практике), искать сред них минимальный не надо, т.к. получающиеся варианты изоморфны, т.е. описывают идентичные автоматы с точностью до переименований состояний.
Ну а тот, алгоритм, что ты привел, лишь отличается способом порождения этого разбиения. Вместо попыток попарной попытки склейки (collapse) всех имеющихся состояний, производится отсечение по отсортированному алфавиту входных сигналов. И вместо квадратичной сложности получаем
O(m * log n) where m = Q and n = E*Q, where E is alphabet of input symbols of the nite automaton
Небольшое улучшение, надо заметить.
V>>Да что ты? И как же компилятор С++ позволяет даже в оптимизированном варианте сохранять, WH>Ой лол. WH>В релизе отладка не работает чуть менее чем полностью. WH>Там куча информации теряется.
Видать, ты давно не брал С++ в руки. Теряется только информация о локальных переменных, которые в процессе оптимизации были "уничтожены", т.е. их больше нет в шагах вычисления. Но по тем шагам, что есть, прекрасно можно ходить. Связь с исходником не теряется, а только это и важно.
V>>Ни одного по делу. Что конкретно мешает сохранять соответствие м/у исходными правилами и генерируемым, даже самым оптимальным кодом. Вот давай, с подробностями и примерами. WH>Пропадание кусков АСТ.
Ты показательно проигнорировал вот это:
А может проблема в том, что вместо списка локейшенов протягивается один его экземпляр? Поэтому теряется история-цепочка подстановки правил в процессе оптимизации?
Разве куски АСТ цель? А не привязка генерируемого кода к "исходнику"? В С++, например, через прагму можно вставлять в генерируемый исходник ссылки на другой исходник, что позволяет потом проводить пошаговую отладку по исходному файлу DSL, а не по "птичьему коду", порожденному кодогенератором. Может ли нечто аналогичное делать компилятор Nemerle? Всяко удобнее будет шагать по исходной граматике, чем по кодогенеренной абракадабре.
Ладно, спасибо, было немного интересно. Остальное ниже уже пошло по кругу.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Ты отдели на досуге собственно парсер от построителя документа, то бишь AST. А остальное увидишь сам.
А зачем мне парсер без построения АСТ?
V>Да понял я уже, что ты упрощение правил называешь инлайном.
Я инлайном называю подстановку одного правила в другое.
V>Что касается профита быстродействия, то что и как мерили?
Все. Парсером C#4.
V>И нафига там, все-таки, прикидка по весам, хоть убей не пойму? Это типа такой эвристики, наподобие алгоритма инлайнера компилятора gcc? Чья идея? Это же не из той области. В стандартном шаге упрощения систем правил производят ПОЛНУЮ подстановку (!!!), т.е. до тех пор, пока не натыкаемся на рекурсию. Заметь, пофиг веса абсолютно.
Ну так и знал.
Теоретик.
После некоторого размера инлайн ничего не дает.
Но размер генерируемого кода раздувает очень сильно.
Короче обсуждать с тобой парсер я более не намерен.
Толку нет.
Ибо ты ничего не угадал. Совсем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Разве куски АСТ цель?
Цель парсера, построенного с помощью нашего макроса — разобрать исходник и построить его AST.
V>В С++, например, через прагму можно вставлять в генерируемый исходник ссылки на другой исходник, что позволяет потом проводить пошаговую отладку по исходному файлу DSL, а не по "птичьему коду", порожденному кодогенератором. Может ли нечто аналогичное делать компилятор Nemerle?
Можно, например наш парсер C# подключенный к компилятору предоставляет информацию о позициях в *.cs файлах — по ним работает отладка. Только в обсуждаемой задаче это нафиг не нужно, ибо при отладке сгенерированного парсера интересны позиции в тексте и промежуточные состояния, информации о которых нет в исходном описании грамматики.
V>Всяко удобнее будет шагать по исходной граматике, чем по кодогенеренной абракадабре.
Абракадабра получается после трансформации некоторых правил в конечный автомат (но даже тогда вполне читаемая и наглядная). В остальном все вполне читаемо и приемлемо для отладки и профилирования.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Ты отдели на досуге собственно парсер от построителя документа, то бишь AST. А остальное увидишь сам.
Пользователь макроса задает грамматику, и обработчики для некоторых её правил, в которых изготавливает узлы AST. Макрос генерирует парсер, который вызвает после каждого успешно разобранного правила его обработчик. Задача парсера в формировании AST сводится к "протаскиванию" результатов одних обработчиков (либо информации о разобранном тексте — NToken) в аргументы других.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, hardcase, Вы писали:
H>>Цель парсера, построенного с помощью нашего макроса — разобрать исходник и построить его AST.
V>Я тут выше намекал уже на парсер SAX, и на парсер XML-DOM. Второй получается из первого, путем добавления модуля постройки этого DOM. Похожую схему я как наблюдал неоднократно, так и делал сам, — очень удобно, рекомендую.
Именно это и происходит. Для правил вызываются обработчики.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, vdimas, Вы писали:
V>Да я уже понял, что у вас даже конечный автомат не табличный. Хотя, учитывая тормоза дотнета по чтению из массивов, может оно и правильно.
Что значит даже? Автомат как автомат. На goto.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
конкретно про меня: знаю/пишу на C++/Python. Сталкиваюсь с Perl, но изучить пока не получается — не нравится синтаксис. Нравится Ruby, но поскольку коллегам он не интересен, то в проекте его не применишь.
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Вот модель радио тут не причем. Ну, разве что если сравнивать гетеродинный приемник метрового диапазона и современные стереофонический FM-риемник. Но и это не корректное сравнение, так как кроме повышения качества тут ничего не будет. А в случае языков разница приципиальная. С языком ты получаешь новые концепции. После изучения которых ты сможешь мыслить другими категориями. Это именно как сменить звук на картинку со звуком.
ну давай. Слушаешь ты по радио новости. Как обычно: треп ведущих, шансон или другое Г..., реклама. И вот тебе предлагают радио заменить на телевизор. Звук меняешь на звук + изображение. Ну и что тебе это даст, при условии, что тебе от радио надо только новости и фон? А ничего. Ну да, появятся ток-шоу, фильмы. Если оно тебе не надо — то и обмен не нужен, не так ли?
Re[17]: Что вас останавливает от изучения нового языка?
V>>Ты отдели на досуге собственно парсер от построителя документа, то бишь AST. А остальное увидишь сам.
H>Пользователь макроса задает грамматику, и обработчики для некоторых её правил, в которых изготавливает узлы AST. Макрос генерирует парсер, который вызвает после каждого успешно разобранного правила его обработчик. Задача парсера в формировании AST сводится к "протаскиванию" результатов одних обработчиков (либо информации о разобранном тексте — NToken) в аргументы других.
Речь шла об АСТ выражений ПЕГ-грамматики, по которым целевой парсер строится.
Re: Что вас останавливает от изучения нового языка?
Скоро уже у меня будет ещё одна причина останавливаться в изучении
новых языков -- необходимость читать такие вот супер-мега топики.
Народ, вам ещё не надоело ?
Posted via RSDN NNTP Server 2.1 beta
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>>>Тебе сколько лет?
VE>>>Максималист тут не я.
A>>Я не говорил, что ты максималист. Я говорил, что ты отрицаешь очевидные факты про метро.
VE>Максималист ты, и подтверждаешь это нижеследующим сообщением очередной раз.
VE>>>Даже я ручку выбираю не от балды. Писать-то всякая может, но некоторыми удобнее. А уж писатели и подавно.
A>>Ну если тебе нравится эта аналогия, то ты пытаешься утверждать, что писатель не важен, A>>достаточно дать хорошую ручку любому алкоголику, и он сразу станет Львом Толстым.
VE>Я такого не утверждаю, перестань кидаться в крайности. У тебя либо одно не важно, либо другое.
A>>А я говорю, что ручка не важна. Чтобы стать Толстым нужно поучаствовать в обороне Севастополя.
VE>Важно и то, и другое. Ручка менее важна, но это не повод писать гусиным пером.
С тебя доказательство того, что сейчас есть хоть один язык, который можно сравнить с гусиным пером.
Я готов предоставить доказательство (в виде примера), что между С++ и русским языком разница не очень велика.
Русский язык примем за недостижимый идеал. Абсолют.
VE>>>Разумеется. Но если знаю, то мерседес предпочтительней.
A>>Мерседес предпочтительнее, если он бесплатный.
VE>Либо если денег достаточно.
Сия аналогия должна означать, что у тебя ОЧЕНЬ много времени. То есть, ты бессмертен.
A>>А изучение нового языка (и всех сопутсвующих вещей) не бесплатно. A>>Оно стоит года (а то и нескольких) жизни.
VE>При знании концепций язык можно изучить далеко не за год. А при незнании — польза будет в изучении этих самых концепций.
Концепции — вещь внеязыковая. И лучше их именно так и изучать. На русском языке.
VE>>>GC, замыкания, АлгТД, лямбды, ФВП, легковесные потоки, иммутабельность: все эти на твой взгляд незначимые плюшки дают возможность писать тот самый алгоритм, а не в очередной раз бороться с языком (в этом плане C++ и правда эталон). Для неспецифических задач (где легковесные потоки, например, позволят на порядок проще написать) разница в простоте написания будет не в разы, но всё же будет заметна.
A>>Я не понял, так ты слил что-ли? Все, что ты перечислил никак не помогает решить названную задачу. Вот то есть совсем. A>>Спорим, что я с помощью С++ (плюс голова, разумеется) решу эту задачу быстрее чем ты (любыми средствами)?
VE>Спорим, начинай. Я, правда, не понимаю, что ты этим собираешься доказать, что не языком единым? Так этого никто и не утверждал, а ты всё упрямо опровергаешь.
Начинай ты. Покажи мощщщь языка.
Я утверждаю (поднимись выше по ветке), что язык С++ настолько мало проигрывает идеальному решению,
что изучение нового языка даст очень мало. А переход на новый язык может не только что-то дать, но и что-то забрать.
По этому, гораздо, ГОРАЗДО, ГОРАЗДО рациональнее потратить время на изучение чего-то неязыкового.
Алгоритмов, паттернов, искусственного интеллекта, андроида, математики, иностранного языка.
A>>Хочешь еще задачку с сайта Яндекса? A>>Есть Террабайт текстов на русском языке. A>>Нужно найти миллион самых частотных сочетаний из двух слов.
VE>Давай лучше что-нибудь под Erlang возьмём, а ты это на Си++ начнёшь писать?
Под чего возьмем? Ты задачу назови.
Я это (задачу про террабайт текстов) на РУССКОМ начну писать.
А когда решу задачу на русском, то переведу её на любой язык программирования.
Таки да, в данном случае на С++.
Даже выражение такое есть программируйте не "на языке" а "с использованием языка".
В умных книжках так пишут.
Таки резюмирую. Тема называется — "что вас останавливает от изучения языка".
И я даю ответ — "Новый язык дает очень мало, почти ничего не дает, иногда даже забирает".
Потому что на высшем уровне любая задача будет выглядеть примерно так:
int main( void )
{
перевести_слова_файлов_в_номера_слов(); // для ускорения сортировки на последующих этапах
сформировать_список_пар_слов();
внутренняя_сортировка_пар_со_слиянием(); // сортировка кусков, влезающих в ОЗУ методом qsort
внешняя_сортировка_пар_со_слиянием(); // методом слияния списков
выбрать_первый_миллион_пар();
return 0 ;
}
У тебя не возникло желание русский язык поучить? Видишь, какие в нем интересные программные концепции есть?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы.
Нет. Абсолютно всё равно.
c=a+b
c:=a+b
c<-a+b
+= a b c
a + b -> c
VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП.
нет. Как раз наоборот. Если, скажем, в языке нет переменных, то это уже интересно...
VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...".
нет.
Останавливает то, что все языки сводятся к одному и тому же: просто синтаксис разный. Нет новизны. (Ну или я о ней не слышал).
Ну вот скажите, придумали уже язык для написания программ исполняемых на множестве процессоров ? Есть там что-нибудь принципиально новое? Или всё то же , что и десять лет назад?
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Ну потому, что: изучить язык для его применения мало, надо ещё:
1. изучить библиотеку, среду разработки, ошибки и ограничения компилятора, трудности инсталяции программы, которую написал...
2. найти людей, которые будут за всё это платить...
3. найти людей, которые тоже изучили всё это...
И каждый день — без права на ошибку...
Re[35]: Что вас останавливает от изучения нового языка?
Здравствуйте, dimgel, Вы писали:
WH>>Типизация выполняется полностью на этапе компиляции. WH>>Но из-за того что отсутствуют типы типов ошибка компиляции появляется черт знает где, а не там где она действительно произошла.
D>Это я понимаю. Но это уточнение не прибавит аргументов FR-у.
Ты так и не понял аргумент насчет шаблонов C++, очевидно.
Re[29]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Концепции — вещь внеязыковая. И лучше их именно так и изучать. На русском языке.
Звучит голословно. Чем же лучше? Почему бы не выучить вместе с изучением языка?
VE>>Спорим, начинай. Я, правда, не понимаю, что ты этим собираешься доказать, что не языком единым? Так этого никто и не утверждал, а ты всё упрямо опровергаешь.
A>Начинай ты. Покажи мощщщь языка.
Ну, до тех пор, пока ты не предоставил решение, в споре выигрываю я, ибо условие строгое: "быстрее". Так что мне торопиться некуда. И я за ленивый программинг
A>Таки резюмирую. Тема называется — "что вас останавливает от изучения языка". A>И я даю ответ — "Новый язык дает очень мало, почти ничего не дает, иногда даже забирает". A>Потому что на высшем уровне любая задача будет выглядеть примерно так:
A>
A>int main( void )
A>{
A> перевести_слова_файлов_в_номера_слов(); // для ускорения сортировки на последующих этапах
A> сформировать_список_пар_слов();
A> внутренняя_сортировка_пар_со_слиянием(); // сортировка кусков, влезающих в ОЗУ методом qsort
A> внешняя_сортировка_пар_со_слиянием(); // методом слияния списков
A> выбрать_первый_миллион_пар();
A> return 0 ;
A>}
A>
А когда мы начнём это делать асинхронным и параллельным, то вся это красота превратится в кровавую кашу с коллбеками и тредпулами.
A>У тебя не возникло желание русский язык поучить? Видишь, какие в нем интересные программные концепции есть?
Русский я ещё в школе изучил.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, alpha21264, Вы писали:
A>>Концепции — вещь внеязыковая. И лучше их именно так и изучать. На русском языке.
VE>Звучит голословно. Чем же лучше? Почему бы не выучить вместе с изучением языка?
Лучше тем, что не нужно привязывать к ногам гири в виде нового языка.
Потому что с языком у тебя получится время=концепция+язык.
VE>>>Спорим, начинай. Я, правда, не понимаю, что ты этим собираешься доказать, что не языком единым? Так этого никто и не утверждал, а ты всё упрямо опровергаешь.
A>>Начинай ты. Покажи мощщщь языка.
VE>Ну, до тех пор, пока ты не предоставил решение, в споре выигрываю я, ибо условие строгое: "быстрее". Так что мне торопиться некуда. И я за ленивый программинг
Не, ну это уже не интересно — опять слил. То есть не можешь предложить вообще никакого решения?
A>>Таки резюмирую. Тема называется — "что вас останавливает от изучения языка". A>>И я даю ответ — "Новый язык дает очень мало, почти ничего не дает, иногда даже забирает". A>>Потому что на высшем уровне любая задача будет выглядеть примерно так:
A>>
A>>int main( void )
A>>{
A>> перевести_слова_файлов_в_номера_слов(); // для ускорения сортировки на последующих этапах
A>> сформировать_список_пар_слов();
A>> внутренняя_сортировка_пар_со_слиянием(); // сортировка кусков, влезающих в ОЗУ методом qsort
A>> внешняя_сортировка_пар_со_слиянием(); // методом слияния списков
A>> выбрать_первый_миллион_пар();
A>> return 0 ;
A>>}
A>>
VE>А когда мы начнём это делать асинхронным и параллельным, то вся это красота превратится в кровавую кашу с коллбеками и тредпулами.
Если вы — то действительно превратится. А если мы, то так красивым и останется.
Более того — ваше асинхронное (к стати зачем?) и параллельное (в каком месте?) в разы проиграет нашему однопоточному.
Сказать в каком месте или сам догадаешься?
К стати, мы на С++ (если очень припрет) даже сможем написать вот так:
выполнить_параллельно( массив_задач );
Таки да, выполнить_параллельно() будет функцией, которая будет принимать на вход специфичную структуру данных.
Но эта функция будет написана ОДИН РАЗ за всю жизнь программиста.
Это не я придумал, у Брюса Эккеля прочитал.
A>>У тебя не возникло желание русский язык поучить? Видишь, какие в нем интересные программные концепции есть?
VE>Русский я ещё в школе изучил.
Я подозреваю, что ты его изучил плохо.
Например, скажи мне, какой частью речи является слово "должен" во фразе "ты должен учиться"?
Течёт вода Кубань-реки куда велят большевики.
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, alpha21264, Вы писали:
A>Не, ну это уже не интересно — опять слил. То есть не можешь предложить вообще никакого решения?
Интересная у тебя логика. И часто ты ей пользуешься?
VE>>А когда мы начнём это делать асинхронным и параллельным, то вся это красота превратится в кровавую кашу с коллбеками и тредпулами.
A>Более того — ваше асинхронное (к стати зачем?) и параллельное (в каком месте?) в разы проиграет нашему однопоточному. A>Сказать в каком месте или сам догадаешься?
Скажи.
A>К стати, мы на С++ (если очень припрет) даже сможем написать вот так: A>
A> выполнить_параллельно( массив_задач );
A>
A>Таки да, выполнить_параллельно() будет функцией, которая будет принимать на вход специфичную структуру данных. A>Но эта функция будет написана ОДИН РАЗ за всю жизнь программиста. A>Это не я придумал, у Брюса Эккеля прочитал.
Только её грамотная реализация займёт больше, чем решение всей задачи, а в Erlang она уже написана.
A>>>У тебя не возникло желание русский язык поучить? Видишь, какие в нем интересные программные концепции есть?
VE>>Русский я ещё в школе изучил.
A>Я подозреваю, что ты его изучил плохо. A>Например, скажи мне, какой частью речи является слово "должен" во фразе "ты должен учиться"?
Наречие. А теперь ты скажи мне, какая разница "в какой фразе", коли часть речи, а не предложения?
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Mamut, Вы писали:
VD>>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
M>Тут большиинство телепатирует, что вопрос скорее всего был задан с целью понять, почему народ не хочет изучать Немерле. Это не обязательно так, но предположим, что так.
M>Ответ простой: не нужен
Он может и нужен, но Влад прилагает все усилия что бы нельзя было выяснить этот вопрос.
Re[3]: Что вас останавливает от изучения нового языка?
VD>>>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
M>>Тут большиинство телепатирует, что вопрос скорее всего был задан с целью понять, почему народ не хочет изучать Немерле. Это не обязательно так, но предположим, что так.
M>>Ответ простой: не нужен
I>Он может и нужен, но Влад прилагает все усилия что бы нельзя было выяснить этот вопрос.
Ну почему же. Как минимум, Немерле интересен с теоретической точки зрения — это раз. То есть, задайся я вопросами языкостроения, Немерле был бы гиперинтересным.
Здравствуйте, alvas, Вы писали:
H>>Для генерирования моделей (я там оговорился) есть макрос в составе замороженного NRails проекта.
A>А проект живой вообще?
Проект не разививается. По крайней мере пока нет поддержки 2010 студии для ASP.NET MVC3.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, VoidEx, Вы писали:
Z>>>Ты напиши. Не как-нибудь так, а конкретный код, матчащий Not(Not(rule)).
VE>>А в твоём коде не очевидно, что именно надо поменять, чтобы не было завязано на Not? VE>>Если нет, то прокопипасть его для 4 первых веток, сравни и выдели общее. VE>>Потом прокопипасть для всех 6 и выдели наиболее общее.
Z>>>Как бы я видел реализации ПМ на функциях, все они сильно хуже поддержки компилятора.
Не ПМом единым.
VE>>10-20-кратно?
Z>Не надо менять тему. Ты утверждал, что можно сделать так, что "код станет не сильно хуже изначальной лапши". Будь добр, подтверди свои слова делом.
Я уже написал, как это сделать в первой половине предыдущего сообщения. Ничего сложного не вижу.
Алсо, изначально тут некто утверждал
Если кода в 10 раз меньше
От этого и пляшем, не теряем нити.
Re[18]: Что вас останавливает от изучения нового языка?
Здравствуйте, alvas, Вы писали:
H>>Какие-то общие параметры (для master/layout страницы) передаем через ViewData (немного прокачав ее экстеншин методами).
A>И чем концептуально ViewData отличается от ViewBag?
Ничем. Но общие параметры в layout это очень ограниченная область. К тому же типизируются экстеншенами.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, robin_of_the_wood, Вы писали:
___>Пошутил — да. ___>Петросян — нет. У меня эта фамилия с очень определенным типом шуток ассоциируется. Моя — другого типа.
Ну, вот со стороны чистая петроснщина. Не смешно и туповато.
___>Не делайте из языка культа.
Язык и есть часть культуры.
___>Большинство проблем в программировании сменой языка не решаются. Как бы этого ни хотелось
Очень многие — решаются. Иначе языкового прогресса не было бы.
___>И очень часто просто решаются сменой программиста. Язык тот же а результат — противоположный.
Потому-что и от программистов тоже многое зависит. Но хорошему программисту нужен хороший язык. Иначе он у вас будет годами выпиливать лобзиком, то что мог наштамповать за 10 минут.
___>Это не значит, что новые языки не нужны. ___>Просто не надо от них слишком многого ожидать. И смотреть на нежелающего их учить, как на предателя всех передовых начинаний.
На предателя? Тут нечего продевать. Я смотрю на таких людей как на ленивых котово сидящих на своих яйцах и орущих от боли, так как лень вставать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Как 1С ник скажу своё мнеие У каждого свои проблемы к изучеию языков. Но изучат их надо хотя бы для увеличения кругозора.
Необходимость изучения как правило связано с его потребностью в той или иной области. А вот уже подготовившись педварительным изучением языков, легче перейти на новый. Кроме того, кроме основного языка, многие задачи проще решать на специализированном (от основного языка. Для меня это С# ).
Но еще одним фактором является количество свободного времени для развития. И здесь уже встают приоритету как это врмя лучше использовать
и солнце б утром не вставало, когда бы не было меня
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Mamut, Вы писали:
M>Ответ простой: не нужен
Скорее всего настоящая причина не в этом.
M>Итак, последние пару месяцев я периодически (по работе и для души) писал на: M>- PHP M>- Python M>- Javascript M>- Java M>- Erlang
M>Как-то так
Действительно не в этом. Для начала джависту, чтобы начать писать на Немерле хорошо бы подружиться с платформой .NET.
Например, меня как дотнетчика от ознакомления со Скалой сдерживает только необходимость подружиться с джавой как с платформой.
Если нам не помогут, то мы тоже никого не пощадим.
Re: Что вас останавливает от изучения нового языка?
M>>Ответ простой: не нужен
IT>Скорее всего настоящая причина не в этом.
M>>Итак, последние пару месяцев я периодически (по работе и для души) писал на: M>>- PHP M>>- Python M>>- Javascript M>>- Java M>>- Erlang
M>>Как-то так
IT>Действительно не в этом. Для начала джависту, чтобы начать писать на Немерле хорошо бы подружиться с платформой .NET.
IT>Например, меня как дотнетчика от ознакомления со Скалой сдерживает только необходимость подружиться с джавой как с платформой.
Ээээ. Учитывая, что в списке выше уже есть минимум три, а то и четыре разные платформы, то никаких проблем в знакомстве и дружбе с еще одной платформой, как видно, у меня нет
Здравствуйте, Mamut, Вы писали:
M>Ээээ. Учитывая, что в списке выше уже есть минимум три, а то и четыре разные платформы, то никаких проблем в знакомстве и дружбе с еще одной платформой, как видно, у меня нет M>Осталось выяснить целесообразность такой дружбы
Совершенно верно. Это лишь подтвержает мой вывод о том, что тебе не Немерле не нужен, а .NET в целом.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Что вас останавливает от изучения нового языка?
M>>Ээээ. Учитывая, что в списке выше уже есть минимум три, а то и четыре разные платформы, то никаких проблем в знакомстве и дружбе с еще одной платформой, как видно, у меня нет M>>Осталось выяснить целесообразность такой дружбы
IT>Совершенно верно. Это лишь подтвержает мой вывод о том, что тебе не Немерле не нужен, а .NET в целом.
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Изучал Common Lisp, писал кое-какие игрушечные примеры, считаю Lisp самым гибким и простым языком.
Но на работе использую яву (чем дальше тем больше) и на лиспе вряд ли буду писать, т.к.:
1) Политика: для явы существует удобный кроссплатформенный инструментарий и фреймворки (maven + Intellij Idea, junit, GWT, spring, hibernate, datanucleus), ее развитие поддерживается огромным сообществом и гигантскими компаниями, для создания сравнимого эквивалента даже при наличии больших ресурсов нужно будет потратить очень много сил и времени. Новый проект для веба, даже игрушечный, предпочту делать на яве.
2) Идеология: не люблю динамическую типизацию (хоть и можно считать, что в лиспе можно достичь эквивалентного эффекта).
3) С синтаксисом предпочтения меняются... Но мой код будут поддерживать другие люди, а они знают яву и не знают лисп.
4) Еще политика: Если вдруг я буду большим начальником и возьмусь нанимать народ — я предпочту брать специалистов, которых больше на рынке и которых легче заменить. Тут плюс опять у явы.
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Угу IDE'шки для питона сейчас уже вменяемее чем для C++.
гм. Сравниваю eclipse c++ и eclipse pydev. С обоими активно работаю.
Первая значительно лучше второй. И проблемы тут не в pydev, а в самом питоне — в том что он динамически типизируем.
Возьмите тот же контент ассист — для питона он работает на 1 уровень, и то не всегда. Для с++ он работает нормально везде, кроме как внутри шаблонов (некоторый аналог динамической типизации — на момент написания шаблона неизвестны типы). Однако ж большинство ошибок в шаблонах С++ будут выловлены при компиляции, а в питоне — только при исполнении кода...
Re[20]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, dimgel, Вы писали:
FR>>>Так с анализом обобщенного когда и в статике проблематично.
D>>В самом деле? Пример дашь? А я в ответку решение на скале без проблем.
FR>Чуть выше показали на шаблонах C++.
Правильный автоматический рефакторинг шаблонов С++ сложен или невозможен. Однако можно сделать несовершенный рефакторинг (который уже есть в большинстве С++ IDE), а при компиляции получить список ошибок.
Однако шаблонного кода в типичном С++ программе обычно не слишком много, поэтому обычно все сводится к правке нескольких ошибок компиляции после рефакторинга.
С питоном же все значительно хуже. Утилиты вроде pylint ловят далеко не все. Поэтому после рефакторинга надо запускать тесты, покрытие которых так же не 100%.
Собственно я недавно пытался сделать переход питон 2.6 -> питон 3.2 в своей программе.
Программа вспомогательная, но относительно большая. Тесты есть, но их мало. pylint используется.
Строки часто использовались как массивы байт. bytes из 3.2 несовместимы с str из 2.6 по очень многим параметрам. К примеру b'123'[1] == 50, а не b'2'.
Т.е. там где раньше было a = b[1] + 'qw' + b[2], теперь будет ошибка в рантайме. А там, где было a = b[1] + b[2], тоже будет ошибка в рантайме, вот только не в этой строке, а ниже — при использовании а. А если такое "a" пихается в коллекцию, то поиск того места, откуда оно вылезло, может стать сильно нетривиальной задачей.
Я денек поковырялся и понял, что я потрачу неделю на поиск всех таких мест и еще останется куча мест, которые я не нашел. При этом если бы прога была на статически типизируемом языке, то я бы просто получил несколько сотен ошибок компиляции. И весь процесс перехода занял бы пару дней, после которых у меня была бы работающая программа с минимальным числом новых багов.
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, VladD2, Вы писали:
VD>Хочется собрать статистику (мнения) по поводу что останавливает людей от изучения новых языков. VD>Для затравки дам некоторые возможные ответы: VD>1. Синтаксические различия. Скажем, привык к сишному синтаксису, а в новом языке переменные по другому описываются (типы через двоеточие) и параметры типов задаются иначе. Если бы язык был полным супесетом того языка который я знаю, то изучил бы. VD>2. Идеологические отличия. Например, язык не ООП, а я привык к ООП. VD>3. Политические предпосылки — "Все равно не смогу применять его на работе...". VD>...
VD>Так же интересно что останавливает от применения языков. Насколько часто бывает так, что язык вы изучили, а использовать его не можете?
Ну недавно с Python познакомился. Изучать язык нужно для конкретных целей, что бы писать на нём, иначе всех тонкостей всё равно не узнаешь. А так это для общего развития, посмотреть что другие делают. Мне одному С# и немного sql всегда хватит.
Программа — мысли спрессованные в код.
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, enji, Вы писали:
E>гм. Сравниваю eclipse c++ и eclipse pydev. С обоими активно работаю.
E>Первая значительно лучше второй. И проблемы тут не в pydev, а в самом питоне — в том что он динамически типизируем.
С eclipse CDT я плотно не работаю, так что сравнить не могу, но VC 2010 на проектах мало-мальски использующих буст и шаблоны
по моему намного хуже чем PyDev.
Re[21]: Что вас останавливает от изучения нового языка?
E>Правильный автоматический рефакторинг шаблонов С++ сложен или невозможен. Однако можно сделать несовершенный рефакторинг (который уже есть в большинстве С++ IDE), а при компиляции получить список ошибок.
Это не важно, там был спор о том что статика дает 100% гарантии, это неверно.
E>Однако шаблонного кода в типичном С++ программе обычно не слишком много, поэтому обычно все сводится к правке нескольких ошибок компиляции после рефакторинга.
Не знаю как в типичном, но буст уже очень часто используется, не говоря уже о STL.
E>С питоном же все значительно хуже. Утилиты вроде pylint ловят далеко не все. Поэтому после рефакторинга надо запускать тесты, покрытие которых так же не 100%.
В C++ после рефакторинга также необходимо запускать тесты.
E>Собственно я недавно пытался сделать переход питон 2.6 -> питон 3.2 в своей программе.
Я бы не назвал это рефакторингом. По сути это во многом переход на новый язык.
Хотя похожие истории можно рассказать и про переход с C++ на C++
E>Программа вспомогательная, но относительно большая. Тесты есть, но их мало. pylint используется.
Если бы тестов было больше думаю и переход получился бы.
E>Строки часто использовались как массивы байт. bytes из 3.2 несовместимы с str из 2.6 по очень многим параметрам. К примеру b'123'[1] == 50, а не b'2'. E>Т.е. там где раньше было a = b[1] + 'qw' + b[2], теперь будет ошибка в рантайме. А там, где было a = b[1] + b[2], тоже будет ошибка в рантайме, вот только не в этой строке, а ниже — при использовании а. А если такое "a" пихается в коллекцию, то поиск того места, откуда оно вылезло, может стать сильно нетривиальной задачей. E>Я денек поковырялся и понял, что я потрачу неделю на поиск всех таких мест и еще останется куча мест, которые я не нашел. При этом если бы прога была на статически типизируемом языке, то я бы просто получил несколько сотен ошибок компиляции. И весь процесс перехода занял бы пару дней, после которых у меня была бы работающая программа с минимальным числом новых багов.
Возможно так и было-бы, но при переходе даже на статически типизированном языке эквивалентном переходу py2.x -> py3.x сомневаюсь что можно было бы легко отделаться.
Re[22]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
E>>Правильный автоматический рефакторинг шаблонов С++ сложен или невозможен. Однако можно сделать несовершенный рефакторинг (который уже есть в большинстве С++ IDE), а при компиляции получить список ошибок. FR>Это не важно, там был спор о том что статика дает 100% гарантии, это неверно.
100% гарантии не дает ничто. Однако статика дает много больше гарантий, чем динамика. Я вижу массу способов влететь в недетектируемую компилятором ошибку после переименования имени метода и на С++, но шансов много меньше чем на питоне.
E>>Однако шаблонного кода в типичном С++ программе обычно не слишком много, поэтому обычно все сводится к правке нескольких ошибок компиляции после рефакторинга. FR>Не знаю как в типичном, но буст уже очень часто используется, не говоря уже о STL.
Буст используется часто, но это библиотека, а не мой код. В моем же коде написанных мной шаблонов не слишком то много. Поэтому рефакторинг (моего кода) делается обычно вполне нормально.
E>>С питоном же все значительно хуже. Утилиты вроде pylint ловят далеко не все. Поэтому после рефакторинга надо запускать тесты, покрытие которых так же не 100%. FR>В C++ после рефакторинга также необходимо запускать тесты.
Да. Но даже без тестов компилятор найдет очень многое. А в питоне пилинт массу всего пропускает...
E>>Собственно я недавно пытался сделать переход питон 2.6 -> питон 3.2 в своей программе. FR>Я бы не назвал это рефакторингом. По сути это во многом переход на новый язык.
Я уперся в проблемы именно со строками, что можно назвать рефакторингом (замена str->bytes). Причем в статически типизируемом языке таких проблем бы не было.
FR>Хотя похожие истории можно рассказать и про переход с C++ на C++
Можно наверное. Но я менял несколько версий компиляторов, большинство ошибок вылезало именно на этапе компиляции.
E>>Программа вспомогательная, но относительно большая. Тесты есть, но их мало. pylint используется. FR>Если бы тестов было больше думаю и переход получился бы.
Безусловно. Однако программа сама предназначена для тестирования основного продукта. Писать тесты для тестов — это уже перебор по моему получается Какие-то отдельные места были покрыты тестами, основная часть — нет.
Мне нравится питон, я использую его во многих местах. Билд система у меня на питоне, все здорово. Есть несколько вспомогательных скриптов, все тоже здорово. но писать на нем что-то "крупное", имхо, стоит очень осторожно. Да, что-то на нем сделать проще и быстрее, но для достижения той же надежности, которую дают компилируемые языки, надо писать тесты. А тесты часто писать некогда или лень — получается сам у себя занимаешь. Потом приходится отдавать — как в моем примере с миграцией.
Re[17]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, enji, Вы писали:
E>>гм. Сравниваю eclipse c++ и eclipse pydev. С обоими активно работаю.
E>>Первая значительно лучше второй. И проблемы тут не в pydev, а в самом питоне — в том что он динамически типизируем.
FR>С eclipse CDT я плотно не работаю, так что сравнить не могу, но VC 2010 на проектах мало-мальски использующих буст и шаблоны FR>по моему намного хуже чем PyDev.
cdt хуже работает с бустом, чем msvc2010. Но pydev далеко даже до cdt, имхо. Да даже если не лезть в буст и питоновские навороты вроде метаклассов или @:
def func(a, b):
a. # никакой подсказки не будет. Да и с чего бы ей появиться, если что такое "а" станет известно только при вызове f()
template<class T>
void f(T a, T b)
{
a. // и тут тоже не будет - что такое T неизвестно до инстанцирования
}
Но шаблонов в С++ обычно много меньше остального кода, в котором с автокомплитом все хорошо.
Re[23]: Что вас останавливает от изучения нового языка?
Здравствуйте, enji, Вы писали:
FR>>Это не важно, там был спор о том что статика дает 100% гарантии, это неверно.
E>100% гарантии не дает ничто.
Я это же самое и говорил но нашлись несогласные.
E>Однако статика дает много больше гарантий, чем динамика. Я вижу массу способов влететь в недетектируемую компилятором ошибку после переименования имени метода и на С++, но шансов много меньше чем на питоне.
Да согласен.
FR>>Не знаю как в типичном, но буст уже очень часто используется, не говоря уже о STL.
E>Буст используется часто, но это библиотека, а не мой код. В моем же коде написанных мной шаблонов не слишком то много. Поэтому рефакторинг (моего кода) делается обычно вполне нормально.
Рефакторинга в том же VC 2010 вообще нет, а интелсенс очень легко затыкается уже на проектах в десятки тысяч строк с тем же бустом. Ну и торомоза и
временное отжирание всей памяти на машинке с 4 гб памяти как-то сильно портят впечатление.
E>>>С питоном же все значительно хуже. Утилиты вроде pylint ловят далеко не все. Поэтому после рефакторинга надо запускать тесты, покрытие которых так же не 100%. FR>>В C++ после рефакторинга также необходимо запускать тесты.
E>Да. Но даже без тестов компилятор найдет очень многое. А в питоне пилинт массу всего пропускает...
Конечно в динамике тесты необходимость.
E>>>Собственно я недавно пытался сделать переход питон 2.6 -> питон 3.2 в своей программе. FR>>Я бы не назвал это рефакторингом. По сути это во многом переход на новый язык. E>Я уперся в проблемы именно со строками, что можно назвать рефакторингом (замена str->bytes). Причем в статически типизируемом языке таких проблем бы не было.
Сфероконически на те же проблемы можно нарваться и на C++ (да и на шарпе) если новый класс поменяет логику переопределенных операторов но не поменяет
возвращаемые типы.
FR>>Хотя похожие истории можно рассказать и про переход с C++ на C++ E>Можно наверное. Но я менял несколько версий компиляторов, большинство ошибок вылезало именно на этапе компиляции.
Но если все это править без тестов можно также нарваться на кучу ошибок уже в рантайме.
FR>>Если бы тестов было больше думаю и переход получился бы.
E>Безусловно. Однако программа сама предназначена для тестирования основного продукта. Писать тесты для тестов — это уже перебор по моему получается Какие-то отдельные места были покрыты тестами, основная часть — нет.
E>Мне нравится питон, я использую его во многих местах. Билд система у меня на питоне, все здорово. Есть несколько вспомогательных скриптов, все тоже здорово. но писать на нем что-то "крупное", имхо, стоит очень осторожно. Да, что-то на нем сделать проще и быстрее, но для достижения той же надежности, которую дают компилируемые языки, надо писать тесты. А тесты часто писать некогда или лень — получается сам у себя занимаешь. Потом приходится отдавать — как в моем примере с миграцией.
На питоне вполне можно писать достаточно крупные проекты, как пример TortoiseHg + Меркуриал, но их нельзя писать также как пишешь
небольшие скрипты, те же тесты уже необходимы также как и максимально модульная архитектура.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, barn_czn, Вы писали:
_>Да потому что вы сами, носители вашего немерле, ниче поразительного на нем не сделали. Удиви нас, сделай что то чтобы я сказал вау, какую хрень можно однако сотварить на етом Н.
Почему же не сделали. Очень даже сделали. Самую поразительную в мире вещь — компилятор чудесного Немерле. Что может быть более поразительно?
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, A13x, Вы писали:
A>Но на работе использую яву (чем дальше тем больше) и на лиспе вряд ли буду писать, т.к.: A>1) Политика: для явы существует удобный кроссплатформенный инструментарий и фреймворки (maven + Intellij Idea, junit, GWT, spring, hibernate, datanucleus), ее развитие поддерживается огромным сообществом и гигантскими компаниями, для создания сравнимого эквивалента даже при наличии больших ресурсов нужно будет потратить очень много сил и времени. Новый проект для веба, даже игрушечный, предпочту делать на яве.
А вот Пол Грэхем в свое время предпочел LISP. После чего, продал результат Yahoo, и стал миллионером. Результат известен, как Yahoo Shops.
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, Gaperton, Вы писали:
G>А вот Пол Грэхем в свое время предпочел LISP. После чего, продал результат Yahoo, и стал миллионером. Результат известен, как Yahoo Shops.
Только если мне не изменяет память, Яха этот их ViaWeb в конце концов переписала к чертям, не осилив лисп.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Что вас останавливает от изучения нового языка?
Здравствуйте, hardcase, Вы писали:
G>>А вот Пол Грэхем в свое время предпочел LISP. После чего, продал результат Yahoo, и стал миллионером. Результат известен, как Yahoo Shops.
H>Только если мне не изменяет память, Яха этот их ViaWeb в конце концов переписала к чертям, не осилив лисп.
Ага, именно так. После того, как Грэхем со своим партнером уволились из Yahoo, и там не осталось людей, знающих систему. Что, безусловно, отлично характеризует дальновидную политику руководства Yahoo.
Но это ведь не помешало Грэхему стать миллионером, не так ли?
Re[3]: Что вас останавливает от изучения нового языка?
Здравствуйте, Gaperton, Вы писали:
_>>Да потому что вы сами, носители вашего немерле, ниче поразительного на нем не сделали. Удиви нас, сделай что то чтобы я сказал вау, какую хрень можно однако сотварить на етом Н.
G>Почему же не сделали. Очень даже сделали. Самую поразительную в мире вещь — компилятор чудесного Немерле. Что может быть более поразительно?
А можно по аналогии привести примеры чего чудесного сделали авторы java/c#/питона/руби/хаскеля на своих языках?
Re[16]: Что вас останавливает от изучения нового языка?
Здравствуйте, FR, Вы писали:
WH>>Что мне может предложить питон?
FR>утиную типизацию вместо интерфейсов
Мне кажется будущее за языками со структурной (но с возможностью именования) типизацией и глобальным выводом типов. Сейчас вычислительные мощности просто не осилят такую компиляцию за приемлемое время. Динамика останется, но ее придется указывать явно, все остальное будет контроллировать компилятор (впрочем сейчас разница между компиляторами и интерпретаторами стерлась напрочь).
Re[5]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
Z>>А можно по аналогии привести примеры чего чудесного сделали авторы java/c#/питона/руби/хаскеля на своих языках?
U>Авторы C#, к примеру, dotnet framework написали. Для начала двухтысячных это было прорывом.
Yet another VCL? Впрочем они молодцы конечно. Только написали не благодаря языку (вполне могли и на VB.NET) а благодаря огромному людскому ресурсу MS.
Ну и конечно же для java/nemerle/питона/руби/хаскеля есть свои аналоги, только для nemerle пришлось писать совсем немного, в его распоряжении уже есть весь фреймворк.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U> Z>А можно по аналогии привести примеры чего чудесного сделали авторы java/c#/питона/руби/хаскеля на своих языках?
U> Авторы C#, к примеру, dotnet framework написали. Для начала двухтысячных это было прорывом.
Здравствуйте, hattab, Вы писали:
U>> Авторы C#, к примеру, dotnet framework написали. Для начала двухтысячных это было прорывом. H>Yet another Java В чем прорыв?
На шарп же народ не с Java переманивали, а с плюсов. А на плюсах простого в освоении и написанного в едином стиле фрамеворка на все случаи жизни не было. Поэтому шарп быстро и взлетел, несмотря на то что до версии 2.0 он как язык был еще тем убожеством.
Re[6]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Yet another VCL? Впрочем они молодцы конечно. Только написали не благодаря языку (вполне могли и на VB.NET) а благодаря огромному людскому ресурсу MS.
Причем здесь благодаря чему фрамеворк был написан? Речь о том, что благодаря дотнет фрамеворку решение типовых задач при переходе на шарп кардинально упростилось.
Z>Ну и конечно же для java/nemerle/питона/руби/хаскеля есть свои аналоги, только для nemerle пришлось писать совсем немного, в его распоряжении уже есть весь фреймворк.
Так это и плохо. Раз библиотек написанных под Nemerle практически нет, то нет и кардинального упрощения решения типовых задач при переходе на Nemerle. Какая разница будешь ты использовать дотнетовскую библиотеку из под шарпа или из под Nemerle?
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>Какая разница будешь ты использовать дотнетовскую библиотеку из под шарпа или из под Nemerle?
C#:
var sha1Bytes = SHA1Managed().ComputeHash(UTF8Encoding().GetBytes(String.Format("{0}{1}", param1, param2));
var stringBuilder = StringBuilder();
for (var i = 0; i < sha1Bytes.Length; i++)
stringBuilder.Append(sha1Bytes[i].ToString("x2"));
var sha1 = stringBuilder.ToString();
Т.е. и выигрыша особого нет, и главное это все мелочи. Для кардинального упрощения решения типовых задач нужны законченные библиотеки, использующие иные (более простые и прозрачные) принципы по сравнению со стандартными дотнетовскими. А одного синтаксического сахара для смены языка мало.
Re[8]: Что вас останавливает от изучения нового языка?
Здравствуйте, hattab, Вы писали:
U>> На шарп же народ не с Java переманивали, а с плюсов. А на плюсах простого в освоении и написанного в едином стиле фрамеворка на все случаи жизни не было.
H>Ну как же, когда дотнет называли жабой от майкрософт (и чем он по сути и является)
Именно поэтому с джавы на шарп почти никто не переходил, т.к. смысла менять шило на мыло было не много. А вот с плюсов народ начал переходить очень активно.
Re[9]: Что вас останавливает от изучения нового языка?
regexp match (str) {
| "a+.*" => printf ("a\n");
| @"(?<num : int>\d+)-\w+" => printf ("%d\n", num + 3);
| "(?<name>(Ala|Kasia))? ma kota" =>
match (name) {
| Some (n) => printf ("%s\n", n)
| None => printf ("noname?\n")
}
| _ => printf ("default\n");
}
if (str == null)
{
Console.WriteLine("default");
}
else
{
var regexObj = new Regex(@"(?<g1>^a+.*$)|(?<g2>^(?<num>\d+)-\w+$)|(?<g3>^(?<name>(Ala|Kasia))? ma kota$)", RegexOptions.ExplicitCapture | RegexOptions.Compiled);
var match = regexObj.Match(str);
if (match.Success)
{
if (match.Groups["g3"].Success)
{
if (!(match.Groups["name"].Success))
{
Console.WriteLine("noname?");
}
else
{
Console.WriteLine(match.Groups["name"].Value);
}
}
else if (match.Groups["g2"].Success)
{
Console.WriteLine(int.Parse(match.Groups["num"].ToString()) + 3);
}
else
{
Console.WriteLine("a");
}
}
else
{
Console.WriteLine("default");
}
}
Конечно, ты и на это скажешь, что оно частный случай: новый способ матчинга регулярных выражений. Но я намекаю не на новые способы. И "обилие спецсимволов", и этот пример, не имеют отношения непосредственно к языку. Это макросы, за которые спрятана работа с библиотеками, в т.ч. со стандартными .NET. Ты можешь взять некоторое количество похожих друг на друга частных случаев использования средств сторонних библиотек, выделить в них общую часть и реализовать макрос, позволяющий решать эти частные случаи декларативным образом (описывая желаемый результат, а не шаги по его достижению). И поэтому работа с библиотеками в нем может несколько отличаться от других языков. Вплоть до того, что ты не будешь должен даже задумываться, с какой библиотекой ты работаешь и каким образом она приводит тебя к желаемому результату, сосредоточившись на решение твоих задач, а не задач используемого окружения.
Здравствуйте, Undying, Вы писали:
U> U>> На шарп же народ не с Java переманивали, а с плюсов. А на плюсах простого в освоении и написанного в едином стиле фрамеворка на все случаи жизни не было.
U> H>Ну как же, когда дотнет называли жабой от майкрософт (и чем он по сути и является)
U> Именно поэтому с джавы на шарп почти никто не переходил, т.к. смысла менять шило на мыло было не много. А вот с плюсов народ начал переходить очень активно.
Следовательно и прорыва никакого небыло. Просто появилась жаба, мейд ин майкрософт Ну а на счет перехода плюсистов... Это и не удивительно в ситуации, когда майкрософт позиционировала (и ведь до сих пор) шарп, как основной язык для разработки прикладного софта под винды. Революции, однако, не случилось.
Здравствуйте, Undying, Вы писали:
U>Т.е. и выигрыша особого нет, и главное это все мелочи. Для кардинального упрощения решения типовых задач нужны законченные библиотеки, использующие иные (более простые и прозрачные) принципы по сравнению со стандартными дотнетовскими. А одного синтаксического сахара для смены языка мало.
Выигрыш есть, и ты его видишь прекрасно. Для написания, читабельности и навигации по коду пример на nemerle удобнее. Но это не важно.
Понимаешь, лямбду в С# тоже можно назвать сахаром. Класс, который компилятор под нее генерирует можно создать и самостоятельно. Только такой сахар дает огромный качественный скачок, никто не будет писать такие классы руками. Ибо ценность лямбды именно в коде по месту, а не засунутом в метод, пусть даже и в нескольких строчках от применения.
Те же продолжения тоже дают скачок, только не все его сейчас могут оценить. Как не все могли оценить то, что дадут лямбды до того, как попробовали их в деле. Тот же match дает немало.
Я прекрасно понимаю тех, кто кричит не нужен, не осилив банальные замыкания. Но удивляет то, что одни и те же люди могут кричать круто на появление expression tree в C# и скептически хмыкать, узнавая, что nemerle может разбирать вообще весь код как свой, так и C#, в очень удобную для анализа форму. Разобрать/проанализировать/собрать код легче легкого. А конструировать экспрешены для очень большого количества программистов до сих пор является офигенной магией от которой лучше держаться подальше. Хотя динамическая генерация цепочки "||" для линка сценарий совсем не экзотический.
А еще есть факт того что написание банального linq провайдера задача очень нетривиальная, и то, что тормозят они не по детски из-за чрезмерного количества абстракций, без которых код нереально поддерживать. Тот же nhibernate делает подход за подходом к его созданию и снова видно, что текущий код надо выкидывать и писать с нуля. Ибо тормоз даже по просторной мерке nhibernate. Но даже этот тормоз был бы использован, если бы не валился в самых неожиданных местах.
Nemerle позволяет писать код как удобнее, а генерить то что быстрее. Тот же linq провайдер на нем задача вполне подъемная.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Nemerle позволяет писать код как удобнее, а генерить то что быстрее. Тот же linq провайдер на нем задача вполне подъемная.
Для начала нужно хотя бы научиться заворачивать внешние иерархие классов вроде тех же Linq.Expressions в алгебраические типы. Без этого решение задачи Linq провайдера мало чем отличается от C#.
Если нам не помогут, то мы тоже никого не пощадим.
Re[12]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Понимаешь, лямбду в С# тоже можно назвать сахаром.
Речь о том, что пока возможности языка не используются стандартными библиотеками для большинства разработчиков они выглядят непонятными/неважными/ненужными. Например, те же лямбды появились в шарпе 2.0, но никакой поддержки в дотнет фрамеворке не получили (даже Func в библиотеке не было). Соответственно подавляющее большинство разработчиков возможности предоставляемые лямбдами не использовало. Вот когда поддержку лямбд добавили в фрамеворк (в виде линка в частности), тогда процесс пошел.
Z>А еще есть факт того что написание банального linq провайдера задача очень нетривиальная, и то, что тормозят они не по детски из-за чрезмерного количества абстракций, без которых код нереально поддерживать. Тот же nhibernate делает подход за подходом к его созданию и снова видно, что текущий код надо выкидывать и писать с нуля. Ибо тормоз даже по просторной мерке nhibernate. Но даже этот тормоз был бы использован, если бы не валился в самых неожиданных местах.
Есть большое подозрение, что там сам подход кривой и никаким синтаксическим сахаром его не исправишь.
Re[10]: Что вас останавливает от изучения нового языка?
Здравствуйте, hattab, Вы писали:
H>Следовательно и прорыва никакого небыло.
Так ни кому и не нужен сферический прорыв в вакууме. Прорыв должен быть по сравнению с языком, разработчиков которого планируется перетащить на новый язык. Гипотетический пример, на Nemerle пишется библиотека позволяющая создавать сайты в разы проще, чем на шарпе, то что эта библиотека не является принципиально новой по сравнению с библиотекой условно Ruby совершенно не важно, т.к. задача состоит в перетаскивании разработчиков с шарпа, а не с Ruby.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
Z>>Понимаешь, лямбду в С# тоже можно назвать сахаром.
U>Речь о том, что пока возможности языка не используются стандартными библиотеками для большинства разработчиков они выглядят непонятными/неважными/ненужными. Например, те же лямбды появились в шарпе 2.0, но никакой поддержки в дотнет фрамеворке не получили (даже Func в библиотеке не было). Соответственно подавляющее большинство разработчиков возможности предоставляемые лямбдами не использовало. Вот когда поддержку лямбд добавили в фрамеворк (в виде линка в частности), тогда процесс пошел.
Ты что-то путаешь. Появились анонимные делегаты. И они использовались во фреймворке много где, возьми тот же List.FindAll или треды. Но это был несладкий сахар, вот => (именно этот синтаксис называется лямбдой) и вывод типов сделали его достаточно сладким и двинули в массы. Хотя конечно удобные тренировочные использования в виде линка дали о себе знать.
Z>>А еще есть факт того что написание банального linq провайдера задача очень нетривиальная, и то, что тормозят они не по детски из-за чрезмерного количества абстракций, без которых код нереально поддерживать. Тот же nhibernate делает подход за подходом к его созданию и снова видно, что текущий код надо выкидывать и писать с нуля. Ибо тормоз даже по просторной мерке nhibernate. Но даже этот тормоз был бы использован, если бы не валился в самых неожиданных местах.
U>Есть большое подозрение, что там сам подход кривой и никаким синтаксическим сахаром его не исправишь.
Яж тебе говорю, они сделали уже два подхода и оба кривые. Одной лишь кривизной рук объяснить это не получится, задача действительно сложна. Первый подход был по туториалу от парня из MS. Решение и работало как туториал. Дальше его развивать тупо не получалось, сплошные хардкоды частных случаев. Второй подход был с помощью промежуточного немаленького фреймворка, берущего кучу работы на себя. Имхо тоже на выброс, но может и дотянут, я давно не глядел.
Re[13]: Что вас останавливает от изучения нового языка?
Здравствуйте, IT, Вы писали:
Z>>Nemerle позволяет писать код как удобнее, а генерить то что быстрее. Тот же linq провайдер на нем задача вполне подъемная.
IT>Для начала нужно хотя бы научиться заворачивать внешние иерархие классов вроде тех же Linq.Expressions в алгебраические типы. Без этого решение задачи Linq провайдера мало чем отличается от C#.
Имхо, вполне достаточно конвертера из/в PExpr из Nemerle.Linq. PExpr прекрасно конструируется и анализируется с помощью квазицитат.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>Ты что-то путаешь. Появились анонимные делегаты. И они использовались во фреймворке много где, возьми тот же List.FindAll или треды.
В сравнении с теми возможностями, которые предоставляют анонимные делегаты, их использование в фрамеворке 2.0 даже под микроскопом не разглядишь.
Z>Яж тебе говорю, они сделали уже два подхода и оба кривые. Одной лишь кривизной рук объяснить это не получится, задача действительно сложна.
Сам подход тяжелых ОРМ кривой, т.к. скрывает слишком много критически важных сущностей. Поэтому сколько их не переписывай, все равно хрень получится.
Re[15]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U>В сравнении с теми возможностями, которые предоставляют анонимные делегаты, их использование в фрамеворке 2.0 даже под микроскопом не разглядишь.
Это ты сейчас видишь. Во втором фреймворке никто не жаловался. Блаб, не будь он к ночи упомянут.
Z>>Яж тебе говорю, они сделали уже два подхода и оба кривые. Одной лишь кривизной рук объяснить это не получится, задача действительно сложна.
U>Сам подход тяжелых ОРМ кривой, т.к. скрывает слишком много критически важных сущностей. Поэтому сколько их не переписывай, все равно хрень получится.
Как меня радуют такие безапелляционные утверждения. Парсить текстовый hql и строить по его AST нему запрос тяжесть никак не мешает. А строить по AST от майкрософта значит мешает. Ничерта не тяжесть, просто АСТ убог. Он удобен для парсера языка, но никак не для анализа получившегося выражения.
Например, эквивалентные выражения
.Where(i => i < 10).Where(i => i > 0)
и
.Where(i => i < 10 && i > 0)
Различаются в AST как небо и земля. И если язык не дает нормальных конструкций для подобного анализа — туши свет. Визиторы выстраиваются в причудливые цепочки, на каждую перегрузку Where пишется гора кода и так далее.
Re[11]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U> H>Следовательно и прорыва никакого небыло.
U> Так ни кому и не нужен сферический прорыв в вакууме. Прорыв должен быть по сравнению с языком, разработчиков которого планируется перетащить на новый язык. Гипотетический пример, на Nemerle пишется библиотека позволяющая создавать сайты в разы проще, чем на шарпе, то что эта библиотека не является принципиально новой по сравнению с библиотекой условно Ruby совершенно не важно, т.к. задача состоит в перетаскивании разработчиков с шарпа, а не с Ruby.
Так ведь и шарп был ориентирован в область жаба-приложений ни в чуть не меньшей степени нежели на прикладной софт, странно этого не замечать и говорить только о плюсистах. Поначалу МС весьма активно включилась в поддержку жабы, и если бы не солнцевские, кто знает, писали бы сейчас шарписты на J++
Здравствуйте, Undying, Вы писали:
U>Я тебе как раз объясняю, что пока новые фичи языка активно не используются стандартными библиотеками, подавляющее большинство разработчиков возможностей предоставляемых этими фичами не понимает и не замечает. С чем споришь-то?
В целом все верно. Но использовать match и вывод типов в стандартных библиотеках несколько странно. Макросы используются.
U>Я активнейшим образом использую анонимные делегаты с конца 2006. Сам правда вряд ли бы об их мощи догадался, хорошо что Darkgray научил.
Об их мощи можно догадаться попользовав любой язык с лямбдами. Например руби.
Re[2]: Что вас останавливает от изучения нового языка?
Здравствуйте, Deprivator, Вы писали:
D>немерле не нужен D>и вообще, ничего больше не нужно. башка, блин, нерезиновая.
Вот как раз потому он и нужен. Если бы башка была резиновая, то весь софт можно было бы придумать в башке и закодировать на любом языке. А тот факт, что башка, блин, не резиновая, как раз и заставляет придумывать языки и технологии которые позволяют решать задачи не решаемые в виду невозможности их охвата интеллектом человека.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Что вас останавливает от изучения нового языка?
Здравствуйте, Ziaw, Вы писали:
Z>>>Nemerle позволяет писать код как удобнее, а генерить то что быстрее. Тот же linq провайдер на нем задача вполне подъемная. IT>>Для начала нужно хотя бы научиться заворачивать внешние иерархие классов вроде тех же Linq.Expressions в алгебраические типы. Без этого решение задачи Linq провайдера мало чем отличается от C#. Z>Имхо, вполне достаточно конвертера из/в PExpr из Nemerle.Linq. PExpr прекрасно конструируется и анализируется с помощью квазицитат.
Не получится, PExpr не оперирует типами.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Что вас останавливает от изучения нового языка?
Здравствуйте, Undying, Вы писали:
U> U>> Авторы C#, к примеру, dotnet framework написали. Для начала двухтысячных это было прорывом.
U> H>Yet another Java В чем прорыв?
U> На шарп же народ не с Java переманивали, а с плюсов. А на плюсах простого в освоении и написанного в едином стиле фрамеворка на все случаи жизни не было. Поэтому шарп быстро и взлетел, несмотря на то что до версии 2.0 он как язык был еще тем убожеством.
Надеюсь не некрофил для топика... Пару комментов, т.к. работаю иногда со студентами....
На шарп повалил народ именно с VB... На дельфях чуть сложнее, но таж хрень... Низкий порог входимости.... в индустрию что ль