Vlad2, ты тут очень увлекательно рассказывал о Nemerle (говорю без всякой иронии),
какие преимущества ты бы получил разрабатывая R# на Nemerle?
Та же самая функциональность могла бы быть достигнута меньшим объёмом кода?
Код был бы понятнее?
Код был бы надёжнее (менее подвержен ошибкам)?
Как бы изменились требования к памяти?
Изменились ли бы скростные характеристики кода?
Можно было бы уложиться в меньшие сроки разработки?
Здравствуйте, WolfHound, Вы писали:
WH>Я не Влад но отвечу: Если есть Nemerle то R# не нужен. Ибо Nemerle может все что может R# при том намного проще и удобней.
R# взят просто как немаленький и достаточно сложный проект, который писал Vlad2, исходники которого доступны,
ну и ещё то, что Vlad2 главный евангелист Nemerle на rsdn, а то, что он не нужен при наличии Nemerle это понятно.
VladD2, если можно.
EC> ты тут очень увлекательно рассказывал о Nemerle (говорю без всякой иронии),
какие преимущества ты бы получил разрабатывая R# на Nemerle?
Имея Nemerle нет смысла заниматься R#-ом. Так что если бы я встретил такой проект в то время, то просто не стал бы заниматься R#-ом.
Дело в том, что R# — это попытка добавить в близкий к идеальном императивный яызык средства метапрограммирования. Макросы Nemerle — это уже готовая система метапрограммирования. Причем она более законченная и целостная.
Так что на сегодня R# имеет только одно приемущество над Nemerle — полноую обратную совместимость с C# 2.0 (а в будующем, думаю, и 3.0).
В общем-то идеи Nemerle можно 1 в 1 переносить в R#. Та же система квази-цитирования — это то, что я постоянно искал. В купе с идеей метаатрибутов (до которой я дошел еще не зная о Nemerle) получается полноценное и очень удобное решение практически всех вопросов метапрограммирования.
EC>Та же самая функциональность могла бы быть достигнута меньшим объёмом кода?
Еще раз. Скорее всего R#-а бы просто небыло бы.
Лучше описать разницу в подходах, чем думать о том, как R# выглядел бы на Nemerle.
Итак, в системе метапрограммирования нужны три вещи:
1. Средства порождения нового кода. Таким средством в Nemerle является квази-цитирование. В R# приходилось возиться с AST, что приводило к довольно сложному и трудно изменяемому коду. С подачи Вольфхаунда я ввел возможноть помечать код и получать помеченные куски AST относительно простым образом, но все же это намного сложнее чем использование квази-цитирования.
2. Средства привязки к имеющемуся коду. Поясню... Метакод в системах типа R# и Nemerle не может жить сам по себе. Он должен или по модели генерировать конечный код, или модифицировать имеющийся код. Во втором случае нужна некая привязка к коду явлющемуся моделью (т.е. коду который нужно изменить с помощью метапрограммы). Я додумался до очевидной идеии использования атрибутов C#, но долго мучался, и так и не пришел к тому как удобнее всего привязывать метапрограммы к коду методов. Я думал, о интерпретации вызовов функций как о макросах, но это не стыковалось с идеей использования атрибутов. Я даже думал о том, чтобы ввести атрибуты для кода методов. Но это привело бы к несовместимости с C#. А этого я очень нехотел. В Nemerle поступили просто. Они ввели метаатрибуты и макросы в стиле функций. Это решило все проблемы.
3. Средство поиска по AST. В R# было использовано довольно красивое рещение которое в общем-то даже в чем-то более мощьное чем то, что используется в Nemerle. Таким рещением стало использование XPath. Мы реализовали движок XPath-запросов над AST и таким образом получили возможность осуществлять сложнейший поиск кусков AST подлежащих анализу или модификации. В Nemerle для этих же целей используется сопоставление с образцом (pattrn matching). Учитывая, то, что в качестве образца можно применять квази-цитирование, и то, что в оразце можно задавать "активные части", т.е. переменные — это явилось очень хорошим решением проблемы. Хотя XPath более гибок как язык запросов, но он является, то что Nemerle-овцы называют "строковым DSL-ем", и плохо интегрируется с основным языком (C#-ом). Отсюда периодически возникает необходимость довольно некулюжих приведений типов и невозможность котроля типов во время компиляции. Кроме того в XPath нет средств модификации данных, и код которому требуется менять AST выглядит довольно громоздко.
Сопоставление с образцом не имеет этих проблем, хотя и хуже выглядит в качестве средства поиска по AST (поиск получается более императивным и громоздким). Однако на практике в макросах Nemerle все выглядит довольно гормонично.
EC>Код был бы понятнее?
Квази-цитирование, гигиеничность, сопоставление с образцом точно позволили бы сделать код короче и понятнее. Но все эти средства в общем-то можно встроить в R#.
EC>Код был бы надёжнее (менее подвержен ошибкам)?
Более короткий и более понятный код всегда более надежен.
EC>Как бы изменились требования к памяти?
Скорее всего никак. Отличия в общем-то в диеях. Рантайм почти один и тот же. Ну, разве что Nemerle подталкивает к использованию функционального стиля который из-за недоделанности компилятора и некоторых особенностей нотнета может оказаться чуть менее эффективным, но в целом тут пожалуй разницы не будет.
EC>Изменились ли бы скростные характеристики кода?
Они зависят от степени оптимизации. В R# и так оптимизаций было сделано очень не много. В основном алгоритмические. Так движок XPath-запросов был переписан с использованием генерации кода на основе иформации о типах, а потом и с использованием самого R#-а. Это дало резкое увеличение работы XPath-движка. Однако XPath-движек можно было бы оптимизировать и сильнее. Идеи в этой области были. Но из-за объема работа пока что они не реализованы. В принципе Nemerle позволил бы реализовать движок запросво проще и качественнее. Но и сам R# будучи доделанным повзолил бы это сделать.
EC>Можно было бы уложиться в меньшие сроки разработки?
Откровенно говоря сроки скорее зависят от наличия свободного времени и желания.
Учитывая, что время ресурс дорогой имея Nemerle просто небыло бы смысла ваять R#.
ЗЫ
Попробую объяснить почему я вообще занялся R#-ом.
Когда-то моим любимым языком был С++. Я перепробовал много чего, но из виденного мной он пожалуй был самым гибким и добным. Однако почти с самого начала я видел массу недостатков в нем. Глядя на Васик и Дельфи я понимал, что языку очень нехватает таких свойств как компонентности и типобезопасности (причем второе я скорее чувствовал чем понимал осознанно). В своих разработках мы даже применяли связку Васика и С++. На первом клепались контролы и бизнес-логика, а на С++ более системные библиотеки.
Когда появился C# я вдруг обнаружил, что этот язык намного совершенее С++ во многих обаластях. Однако кое чего в нем все же нехватало. Это было обобщенное программирование и метапрограммирование. Причем если обобщенное программирование в С++ было действительно на высоте, то метапрограммирование в нем было в ужаснейшом состоянии. Макросы приводили к куче опасных проблем и небыли полноценным языком программирования, а метапрограммирование на шаблонах попросу было реализовано на базе побочных эффектов и имело огромное количество проблем. По сути во времена когда я во всю программировал на С++ этого подхода просто небыло. Ведь метапрограммирование на шаблонах использует возможности котрых почти небыло в VC++ 5-6 которые я использовал.
Так вот обобщенное программирование появилось в C# 2.0, а вопрос с метопрограммированием как раз и был призван решить R#.
R# задумывался как расширение (надстройка) C# привносящее в него средства метапрограммирования. Nemerle же кроме очень логичной системы метапрограммирования привнес еще и средства фунционального программирования. Причем Nemerle позволяет выбирать парадигму более всего подходящую для решения задач. Этот язык реально реализовал лозунги которые только провозглашаются в C# и С++. Причем реализовал замечательно и не в ущерб другим возможностям.
Например, в Nemerle идиально реализуется идеи фикс о которой так любят твердить фанаты С++:
1. Зачем вводить в язык то, что реализуется библиотекой?
2. Язык должен включать только базовые вещи, а весь синтаксический сахар должен реализоваться в виде библиотек.
С++ реально содержит кучу того, что можно было бы реализовать в библиотеках и не предоставляет нужной функциональности.
При этом Nemerle обладает такими же компонентными возможностями как и C#.
И более того, он позволяет писать в функциональном стиле не хуже чем ML или Хаскель.
В общем, Nemerle — это отличная работа! И будет очень жаль если она пройдет мимо мэйнстрима. При должной раскрутке и "техническом оснащении" (поддержке IDE, наличии полноценной помощи, книг и т.п.) он может прочно и на долго занять место лидера среди мэйнстрим языков общего назначения. При этом Васик мог бы занять нишу языка для прикладников и "домохазяек", С/С++ нишу битодробилок, а Nemerle займет нишу котрую сейчас занимают C# и С++, т.е. языка общего назначения для решения нетривиальных задач.
Однако возможно, что Nemerle так и не станет лидером в жолтой майке, тогда его идеи можно будет хотя бы частично реализовать в R# и C#.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, EvilChild, Вы писали:
EC>R# взят просто как немаленький и достаточно сложный проект, который писал Vlad2, исходники которого доступны,
Тогда пример плохой. R# скорее конкурент Nemerle, чем что-то что можно реализовать на Nemerle.
Скорее тут нужно прикинуть Nemerle на другие проекты. Попробую это сделать:
1. Rsdn.Editor. Этот проект практически на 90% базируется на ООП. Варианты Nemerle-а позволили бы сократить описание некоторых частей проекта. Например, они позволили бы сократить описание команд (т.е. реализации паттерна команда). Возможно кое-где Nemerle позволил бы избавиться от реализации паттернов. Но не думаю, что бщий объем кода уменшился бы сильнее чем процентов на 20%. Хотя это конечно только прикидки. Возможно, что-то я упускаю из вида.
2. Янус. Вот тут бы Nemerle мог оказать очень большой эффект. Взять хоят бы пример реструктуризатора на который у меня никак не получается выделить времни, чтобы его закончить. Одна из проблем реструктуризатора — генерация SQL-кода для разных диалектов SQL. Чтобы упростить эту задачу я воспользовался шаблонным движком StringTemplate. Например, вот как выглядит код создания индекса:
Выражения внутри баксов (символов "$") — это активные части шаблона. Они или преобразуют в текст некоторые переменные, или вызвают другие шаблоны, или применяют шаблоны к так называемым множественным атрибутам. Так "$Quot(name)$" приводит к тому, что вызывается шаблон Quot() которому передается значнеие параметра name внешенего шаблона. В итоге "$Quot(name)$" приводит к тому, что вместо этого кода выводится имя индекса хранящееся в параметре "name" причем значение помещается в ковычки. Выражение "$entries:Xxx()$" приводит к тому, что шаблон Xxx применяется ко всем элементам помещенным в entries (в примере использован безымянный шаблон "{ ... }").
Думаю, что те кто уже успел пописать на Nemerle догадались, что это очень похоже на активные строки в Nemerle (реализуемые макросами).
StringTemplate — это здоровая библиотека (объем ее кода сравним с объемом кода всего реструктуризацтора) не лишенная кучи недостатков. Так сообщения об ошибках в StringTemplate бывают крайне неинформативными, время затрачиваемое на загрузку шаблонов при запуске из под отладчика очень высокое, а возможности по расшерению не очень высокие (фактически библиотеку развивает только ее автор).
На Nemerle я мог бы создать встроенный в язык движек шаблонов лишенный практически всех нидостатков StringTemplate. При этом решение было бы быстрым (ведь пораждался бы код во время компиляции) и гибким (ведь я мог бы использовать всю мощь языка). При этом слжность реализации такого движка была бы куда ниже чем если это делать внучную.
Подобных мест в Янусе очень много и можно было бы получить нехилый выигрышь.
Оданако для этого нужна хорошая поддержка среды.
Кстати, нехилым проектом доказывающим, что Nemerle мощьнейший язык является сам компилятор Nemerle. Он изначально является компонентом (реализован в виде ДЛЛ и может подгружаться динамически). Его код краток и понятен. Он задействует практически все свои возможности. Аналогичный проект на С++ был бы в десятки раз бльше. Да и на C# тоже намного больше.
EC>ну и ещё то, что Vlad2 главный евангелист Nemerle на rsdn, а то, что он не нужен при наличии Nemerle это понятно.
Да, я за него даже еще не брался. Мы еще шашочкой то помахаем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>И более того, он позволяет писать в функциональном стиле не хуже чем ML или Хаскель.
Ого, неслабое заявление.
Только необоснованное. Если взять Nemerle как _язык_, то он уступает и ML (особенно MetaML/Ocaml) и уж тем более хаскелю. ни такой развитой системы типов, ни контроля за редукционной стратегией (если я не упустил ничего) ни такого уровня формализма. Да первая же попытка написать какой-нибудь хитроумный комбинатор даст понять кто где.
А если взять компилятор немерля с этими на каждом шагу в кассу и не в кассу понапиханными макросами, так все еще хуже, как ни удивительно. Если кто-то несогласен, я с радостью услышу опровержение и рассказ как удобно на самом деле делать композицию из макроса и функции.
Кстати у common lisp'a та же проблема и даже после Scheme он часто вызывает лишь глухое раздражение, несмотря на более мощные макросы.
Да и сама по себе система макросов — сомнительная мегафича. Кроме того, что их выразительная мощь на самом деле сильно ограничена (самим фактом работы их на уровне AST и относительной их локальности и непредсказуемости — да, если они полны по-тьюрингу на них можно сделать все — но в какой-то момент сложность все равно сделает это бессмысленным), еще и сам по себе этот подход используется десятки лет и приделать макросистему к любому языку дело моментальное. Тем более что почти для любого языка уже готовых макродвижков как минимум дюжина. В Окамле даже встроенный есть. В хаскеле встроенных сразу три штуки на выбор.
Правда нужны они тому же хаскелю как собаке пятая нога — чем им заниматься в ленивом языке с каррингом — это нужно очень сильно думать, чтобы придумать. А когда придумаешь — тут-то они и бесполезны, т.к большинство таких задач сводятся к нетривиальной манипуляции с типами.
Потому если всерьез кому нужно реально что-то реально сложное, то используют term rewriting трансформацию. А вот здесь уже макросы ничем похвастаться не могут. MSP типа MetaOcaml еще как-то, но не макросы.
В общем конечно по сравнению с C# оно огого, но не боле.
VD>В общем, Nemerle — это отличная работа! И будет очень жаль если она пройдет мимо мэйнстрима. При должной раскрутке и "техническом оснащении" (поддержке IDE, наличии полноценной помощи, книг и т.п.) он может прочно и на долго занять место лидера среди мэйнстрим
Кстати если под IDE понимаются все эти рефакторинги и интеллисенсы — то в чем вообще смысл?
IDE как design-time metaprogramming явно и не имеет смысла и конфликтует с compile-time.
Причем где-где, а на этом уровне (вбитие километров повторяющегося кода и тп) макросы по возможностям кроют с лихвой.
Ну в самом деле — идеальный код не требует дублирования и необходимости сложной навигации просто в силу малой своей избыточности.
Макросы в общем для этого в основном и сделаны (ну еще, конечно, чтобы откладывать вычисления, например, но это мелочи по сравнению).
Формально это кстати очень просто обосновывается — во время compile-time в любом случае больше информации, чтобы оставлять работу кодогрузчику на уровне пользователя ну и следовательно таких же возможностей как раньше уже в IDE не получишь. В рантайме еще больше, потому и IDE для динамических языков — это обычно одно название.
Ну я вообще к тому, что аутлайн, фолдинг, подсветка и replace c регекспами есть везде, а большего на метауровне и ненужно. А то лишь когнитивный диссонанс получается.
VD>языков общего назначения. При этом Васик мог бы занять нишу языка для прикладников и "домохазяек", С/С++ нишу битодробилок, а Nemerle займет нишу котрую сейчас занимают C# и С++, т.е. языка общего назначения для решения нетривиальных задач.
Как-то сомневаюсь. Скорее к тому моменту, когда бренд Nemerle раскрутится, на дотнете можно станет пускать нормально окамл и хаскель и немерлю придется туговато. учитывая, что сейчас, например, большинство случаев отказа от них связано с отсутствием важных библиотек типа развивающегося и поддерживаемого гуя, а user- & codebase гораздо больше. Ну и еще один момент — дотнет — это вообще очень маленький сегмент всего IT и использовать языки, которые есть только на нем сильно менее целесообразно, чем те, что есть везде.
Ну и там для некоторых(большинства) нетривиальных задач как использовали пролог, лисп, APL и фортран, так и будут продолжать.
Ну по крайней мере пока некоторые не будут вытеснены монстрами а-ля Maude и ASF+SDF
Здравствуйте, VladD2, Вы писали:
VD>2. Янус. Вот тут бы Nemerle мог оказать очень большой эффект. Взять хоят бы пример реструктуризатора на который у меня никак не получается выделить времни, чтобы его закончить.
Так всё таки, что мещает заимплементить его на N, и интегрировать со "старым" Янусом?
Здравствуйте, VladD2, Вы писали:
ANS>>Так всё таки, что мещает заимплементить его на N, и интегрировать со "старым" Янусом?
VD>Реструктуризатор или весь Янус?
Ну, что же еще одно мнение законченного апологета ФЯ.
В общем-то особого смысла отвечать на него нет. Все равно столь сформировавшюся позицию не изменить.
Однако, я все же отвечу.
Ответ мой рассчитан на сомневающихся.
VD>>И более того, он позволяет писать в функциональном стиле не хуже чем ML или Хаскель.
BLA>Ого, неслабое заявление. BLA>Только необоснованное.
Я выражаю мое мнение. Что касается обоснованности, то в твоем ответе обоснований нет вовсе. Если уж ты требуешь обоснования от других, то хотя бы потрудился бы обосновывать свое несогласие.
BLA> Если взять Nemerle как _язык_, то он уступает и ML (особенно MetaML/Ocaml) и уж тем более хаскелю.
Это ничем не обоснованные заявления. Мое мнение — все что ужно длоя удобного программирования в функциональном стиле в нем есть. Но с удовольствием послушаю аргументированное доказательство обратного. Все же Ocaml и Хаскель я знаю очень поверхностно.
BLA> ни такой развитой системы типов,
Заявление громкое, необоснованное и крайне сомнительное.
BLA> ни контроля за редукционной стратегией (если я не упустил ничего)
Возможно, упустил. Если ты аргументируешь свои нападки, то можно будет попробовать понять насколько ты прав, и насколько то о чем ты говоришь актуально.
BLA> ни такого уровня формализма.
Очень убедительно. С такими аргументами в лес.
BLA> Да первая же попытка написать какой-нибудь хитроумный комбинатор даст понять кто где.
Ну, дык зачем дело встало?
К тому же ты кое-чего недопонимаешь. У 99% народа нет, нужды писать комбинаторы (хотя это на Nemerle делать можно). Людям нужно удобно и просто писать нужные им код, решать их задачи.
И тут кроется главный вопрос. Люди уже в массе своей не хотят использовать чисто функциональные языки типа Хаскель. Более того гибридные языки типа Окамла им тоже мало интересны. Это факт, который очень легко доказать. Надо доказывать?
BLA>А если взять компилятор Nemerle с этими на каждом шагу в кассу и не в кассу понапиханными макросами, так все еще хуже, как ни удивительно. Если кто-то не согласен, я с радостью услышу опровержение и рассказ как удобно на самом деле делать композицию из макроса и функции.
С радостью опровергну любое сделанное тобой утверждение, после того как ты потрудишься хоть немного его обосновать.
Апеллировать к возгласам вроде "в кассу понапиханными макросами, так все еще хуже, как ни удивительно..." бессмысленно и не интересно.
BLA>Кстати у common lisp'a та же проблема и даже после Scheme он часто вызывает лишь глухое раздражение, несмотря на более мощные макросы.
Какая такая же? Может быть сначала нужно доказать, что проблема вообще есть?
И вообще, может быть прежде чем выступать с критикой чего-то лучше сначала хоть немного узнать об этом чем-то? Или это такой способ познакомиться с незнакомым языком, наехать на него без малейшей аргументации заставив людей объяснять тебе базовые вещи?
Что касается макросов Nemerle-а, то как раз они намного ближе к макросам Схемы нежели Лиспа (хотя, по сути, Схема — это клон Лиспа, но как раз подсистема макросов в нем сильно отличается).
Надо понимать, что авторы Нэмерла знают как минимум не меньше тебя в этом вопросе. В конце вот этого http://nemerle.org/metaprogramming.pdf документа есть раздел "Related work". В нем кратко описывается, откуда растут ноги макросов Немерла, и почему были выбраны те или иные решения.
Вот что там сказано по поводу макросов Сехемы:
10.1 Гигиеничные макросы Scheme
У нашей системы много общего с современными макрорасширениями Scheme[1]:
• Альфа-переименование и связывание переменных выполняется после развертывания макроса, с использованием контекста, хранимого в макросе.
• Макросы могут контролируемо использовать внешние имена, не боясь пересечься с посторонними именами.
• Сторона, на которой вызывается макрос, не использует какого-либо особого синтаксиса для вызова макросов, единственное место, где используется особый синтаксис – определение макроса, что обуславливает легкость использования макросов программистами, несведущими в метапрограммировании.
Поддерживая перечисленное выше, мы встроили систему макросов в статически типизированный язык. Типы в сгенерированном коде проверяется после раскрытия. Мы также обеспечиваем четкое разделение этапов – метафункции до использования должны быть скомпилированы и сохранены в библиотеке.
Работа над Scheme длилась довольно долго, и предлагалось много интересных вещей. Например, макросы первого класса в [9], кажется, можно реализовать в Nemerle с помощью простой передачи функций, оперирующих кодом объектов.
Другими словами, как раз со Схемы и были взяты многие идеи макросов немерла.
BLA>Да и сама по себе система макросов — сомнительная мегафича.
Для меня по-прежнему больше сомнений вызывает обоснованность твоего мнения. Так что не забывай аргументировать.
BLA> Кроме того, что их выразительная мощь на самом деле сильно ограничена (самим фактом работы их на уровне AST и относительной их локальности и непредсказуемости — да,
Хм. Снова сотрясение воздуха. Хотелось бы развернутого объяснения того, чем не угадила работа на уровне AST (в том числе типизированного)? Ну, и по поводу непредсказуемости тоже хотелось бы услышать нечто большее, чем пустые заявления.
BLA>если они полны по-тьюрингу на них можно сделать все
Они полны по Тьюрингу.
BLA> — но в какой-то момент сложность все равно сделает это бессмысленным),
На каком-то безусловно. На каком-то уровне сложности все современные средства созданные человечеством бессильны. Ну и что?
Если не заниматься пустым философствованием, а поглядеть на то, что способны дать макросы, то мне кажется очевидным то, что они способны сильно упростить решение многих актуальных задач. А стало быть, они точно полезны.
BLA>... еще и сам по себе этот подход используется десятки лет
Да, используется. Не спорю. Но используется в языках, которые по тем или иным причинам не стали и вряд ли когда-нибудь станут действительно популярными. Nemerle же имеет все предпосылки стать популярным. Он не напичкан догмами. Как и С++ он предоставляет выбор парадигмы. Причем делает это куда эффективнее и чише чем С++. Функциональное программирование на Немерле — это функциональное программирование. Без компромиссов, моря обвязочного кода и ужимок свойственных С++. Императивное программирование хотя и практически целиком встроено на макросах, но все же выглядит очень естественно. Даже известные апологеты C#/С++ находят императивную составляющую в Немерле очень достойно реализованной.
BLA> и приделать макросистему к любому языку дело моментальное.
Ага. Языком. Я вот пытался сделать это для C# и могу сказать, что это не самая простая задача. Она конечно реально, но есть две проблемы. Первое — нужно иметь четкое видение того как это сделать с учетом особенностей языка. Второе — это просто большой объем работы. Даже банальные вещи вроде совместимости с языком в который встраиваются макросы и интуитивность использования являются очень немалыми проблемами. На сегодня языки обладающие действительно мольными, удобными, гибкими и совместимыми с разными парадигмами подсистемами макросов можно перечислить по пальцам одной руки. И, по-моему, Немерле лидер среди них. По крайней мере, аналогичной реализации у императивных языков я вообще не видел.
BLA> Тем более что почти для любого языка уже готовых макродвижков как минимум дюжина.
Громкие слова не имеющие ничего общего с действительностью. К примеру, перечисли эти дюжины для C# и С++.
BLA> В Окамле даже встроенный есть.
Это не правда. Для Окамла есть только препроцессор CamlP4. Вот слова о нем из привденного выше документа:
10.4 CamlP4
CamlP4 [12] – это препроцессор для OCaml. Его LL(1)-парсер — полностью динамический, что позволяет выразить весьма сложные расширения грамматики. Макросы (именуемые расширениями синтаксиса) должны быть скомпилированы и загружены в парсер до использования. При работе они могут конструировать новые выражения (используя систему цитирования), но только на уровне нетипизированного дерева разбора. Более углубленное взаимодействие с компилятором невозможно.
Немерле превосходит CamlP4 в том, что макросы в нем встроены в компилятор и мгут взаимодействовать с ним получая информацию о типах. В этом форуме было приведенио уже множество примеров того, как эта ценная возможность может сделать макросы предсказуемее и интеллектуальнее.
BLA>В хаскеле встроенных сразу три штуки на выбор.
Опять не правда. Есть экспериментальные расширения Хаскеля предоставляющие такие возможности. Лучший из них — Template Haskell и послужил одним из прототипом для макросов Немерла:
10.2 Template Haskell
Между макросами Template Haskell [2] и Nemerle есть интересные различия:
• Разрешение связываний при трансляции цитирования дает возможность сделать вывод о корректности типов объектного кода до его использования. Это позволяет значительно раньше обнаруживать ошибки. Но наличие splicing-конструкции $ делает типизацию отложенной до следующего этапа компиляции, и в этом случае новые связывания должны быть динамическими.
• Макросы Template Haskell, как и любая другая функция Haskell, являются функциями высшего порядка: их можно передавать как аргументы, применять частично и т.д. Это, однако, требует вручную помечать, какой код должен исполняться при компиляции. Мы решили позволить вызывать макросы просто по имени (как в Scheme), так что их использование выглядит как вызов обычной функции. Вы по-прежнему можете использовать функции высшего порядка (функции, оперирующие объектным кодом, могут быть произвольными), но только верхние метафункции (предваряемые macro) запускают вычисления во время компиляции.
• Мы не ограничиваем splicing объявлений с кодом верхнего уровня и не вводим особого синтаксиса для вводящих их макросов. Это кажется хорошим способом использования преимуществ связывания имен после раскрытия макроса и императивного стиля, присущего Nemerle. Для императивного программиста естественно думать о вводимых определениях как о побочных эффектах вызова макросов, даже если эти вызовы находятся в цитируемом коде.
• Мы вводим макросы, оперирующие с типами, объявляемыми в программе, и способные императивно изменять их. Более того, они выглядят как атрибуты, применяемые к определениям типов, так что опять же программисту не обязательно знать что-нибудь о метапрограммировании, чтобы использовать их.
Есть еще много сходств с Template Haskell. Мы напрямую позаимствовали оттуда идею квази-цитирования и splicing-а. Идеи исполнения функций при компиляции и отложенной проверки типов также навеяна Template Haskell.
BLA>Правда нужны они тому же хаскелю как собаке пятая нога — чем им заниматься в ленивом языке с каррингом — это нужно очень сильно думать, чтобы придумать.
Само их наличие говорит, что нужны. Зачем собственно делать то, что и так есть?
BLA> А когда придумаешь — тут-то они и бесполезны, т.к большинство таких задач сводятся к нетривиальной манипуляции с типами.
Которые с успехом могут быть организованы в Немерле, так как компилятор предоставляет средства анализа имеющихся типов, средства их модификации, и средства порождения новых типов.
BLA>Потому если всерьез кому нужно реально что-то реально сложное, то используют term rewriting трансформацию. А вот здесь уже макросы ничем похвастаться не могут. MSP типа MetaOcaml еще как-то, но не макросы.
Хм. Сдается мне, то эти слова просто демонстрируют то, что ты не понимаешь, что такое макросы Немерла.
А вот, что сказано о MetaML в упомянутом мной выше документе:
10.6 MetaML
MetaML [7] вдохновил и Template Haskell и MacroML, введя квази-цитирование и идею типизация объектного кода. Он был разработан в основном для операций с кодом и его исполнения в рантайме, так что это несколько отличающаяся от нашей область деятельности.
И о MacroML, так как без слов о нем картина не будет ясна:
10.5 MacroML
В MacroML [6] было предложено использовать макросы времени компиляции для языка ML. Это имеет много общего с Template Haskell в смысле связывания имен в цитировании до раскрытия макросов. MacroML, кроме того, позволяет захватывать символы в месте применения макроса (это похоже на нашу функцию UseSiteSymbol()). И все это производится без необходимости отказываться от типизации цитат.
Макросы в MacroML ограничены конструированием кода из имеющихся частей, поиск декомпозиция и кода невозможны.
BLA>В общем конечно по сравнению с C# оно огого, но не боле.
Если убрать снобизм и предвзятость "в корман", и как следует разобраться в Немерле, то даже апологетам чистых ФЯ станет понятно, что Немерле как минимум достойный конкуретн.
Ну, а лично я полностью уверен, что Неперле превосходит Окамл и Хаскель. Как минимум Немерле значительно удобнее если рассматривать его как статически-типизированный, типобезопасный, объектно-ориентированный язык. Ведь ОО-возможности в нем позаимствованы из лидеров в этой области среди мэйнстрим языков (C#, Ява, С++).
VD>>В общем, Nemerle — это отличная работа! И будет очень жаль если она пройдет мимо мэйнстрима. При должной раскрутке и "техническом оснащении" (поддержке IDE, наличии полноценной помощи, книг и т.п.) он может прочно и на долго занять место лидера среди мэйнстрим
BLA>Кстати если под IDE понимаются все эти рефакторинги и интеллисенсы — то в чем вообще смысл?
Это отдельный вопрос. Мне вобщем-то окровенено мало интересно обсуждение этого вопроса с теми кто не видит нужны в IDE, интелисенсе и рефакторинге, так как лично я испытываю потребность в этих возможностях просто таки на чисто животном, интуитивном уровне. Такой спор для меня аналогичен спору на тему "нужен ли лифт в 16-ти этажном доме". Это просто очень удобно!
BLA>IDE как design-time metaprogramming явно и не имеет смысла и конфликтует с compile-time.
От IDE в первую очередь мне нужны средства ускоряющие написание, отладку и рефакторинг кода. Метапрограммирование тут как бы вовсе не причем. Хотя кое что из метапрограммирования мне в IDE тоже не помешала бы. Например, к оным можно отнести всякого рода дизайнеры. Так мне очень нравится изучать иерархию классов в дизайнере классов (если кто не видел оный в SV2005, то ближайшим аналогом будут UML-дизайнеры, хотя они несколько отличаются), а так же нравится пользоваться GUI-дизайренами.
BLA>Причем где-где, а на этом уровне (вбитие километров повторяющегося кода и тп) макросы по возможностям кроют с лихвой.
Макросы действительно способны устранить дублирование кода не понижая при этом других качеств кода. Но они не в силах заменить то же автодополнение при вводе, а я знайте ли, не люблю убивать массу времени на то, чтобы вспомнить или уточнить то как пишется тот или иной метод/класс/функция/т.п.
К тому же у интелисенса есть еще ряд премуществ. Одно из важнейших — это отсуствие необходимости сокращать названия идентификаторов. Плохая читабельность кода на Хаскеле и других ФЯ зачастую связанна с банальным пренебрежением к качеству и осмысленности идентификаторов. Это же повышает и сложность обучения. Ведь запоминать традиции вроде x::xs или даже h::t — это отдельный и не малый труд. И мне жаль тех апологетов ФЯ которые не понимают этого просто потому, что сами уже прошли через это.
BLA>Ну в самом деле — идеальный код не требует дублирования и необходимости сложной навигации просто в силу малой своей избыточности.
Хм. Эти слова сомнительны сразу по двум причинам.
1. Идиальный код — это то к чему стремятся хорошие программисты. Тут сразу два ключевых слова. Стремятся и хорошие. Между тем не всегда удается написать идеальный код. Причем "не всегда" — это слова про хороших программистов. Начинающие же и плохие программисты создают идеальный код вообще очень редко. Так что возможности по навигации и рефакторингу нужных хотя бы для того, чтобы превращать не идеальный код в тот, что ближе к идеалу. Забавно, что этот процесс рекурсивен по своей природе. Один рефакторинг может привести к осознанию того, что нужен еще один. Да и со временем отношение к коду может измениться.
2. Код может быть большим не только из-за того, что он не идеален. Код банально может быть слишком объемным вследствие сложности решаемой задачи. Несомненно, грамотная декомпозиция способна сделать отдельные его участки простыми и понятными, но, черт побери, декомпозиция только увеличивает объем кода! Рано или поздно мы приходим к тому, объем проекта столь велик, что в нем становится сложно разораться не только без достойных средств навигаций, но и без средств визуализации вроде дизайнеров классов.
Я замечал, что апологеты ФЯ часто с пренебрежением относятся к данным вопросам, но мне кажется, что это их заблуждение. И сформировано оно возможно оттого, что они реально не решали с помощью своих любимых инструментов действительно объемных задач. ФЯ часто появляется где-то рядом с математикой или синтаксическим анализом. В этих областях функциональная декомпозиция, поднятая на высоких уровень в ФЯ действительно дает хороший эффект, но эти задачи не являются действительно объемными и легко делятся на относительно небольшие подзадачи. Связанность таких задач не очень высока. Между тем банальные примитивные финансовые программы приводят к огромным массивам тесно связанного кода. И в этих областях не использовать средства предоставляемые современными IDE — просто не размуно. Это все равно что добровольно вешать на себя гандикап.
BLA>Макросы в общем для этого в основном и сделаны (ну еще, конечно, чтобы откладывать вычисления, например, но это мелочи по сравнению). BLA>Формально это кстати очень просто обосновывается — во время compile-time в любом случае больше информации, чтобы оставлять работу кодогрузчику на уровне пользователя ну и следовательно таких же возможностей как раньше уже в IDE не получишь. В рантайме еще больше, потому и IDE для динамических языков — это обычно одно название.
BLA>Ну я вообще к тому, что аутлайн, фолдинг, подсветка и replace c регекспами есть везде, а большего на метауровне и ненужно. А то лишь когнитивный диссонанс получается.
Однако "когнитивный диссонанс" звучит красиво. Хотя и совершенно не ясно о чем речь.
Отступы подсветка и replace — это минимум. Причем совершенно не достаточный для большинства людей привыкших полноценным IDE. Я не хочу спорить с тобой. Тебе может это и не надо. Но ты в меньшинстве. Заведи голосование на этом сайте и убедишься в этом.
VD>>языков общего назначения. При этом Васик мог бы занять нишу языка для прикладников и "домохазяек", С/С++ нишу битодробилок, а Nemerle займет нишу котрую сейчас занимают C# и С++, т.е. языка общего назначения для решения нетривиальных задач.
BLA>Как-то сомневаюсь. Скорее к тому моменту, когда бренд Nemerle раскрутится, на дотнете можно станет пускать нормально окамл и хаскель и немерлю придется туговато.
Вот только, по-моему, во многом эти языки не дотягивают даже до C#. Например, ООП в них выглядит весьма странно и не удобно.
BLA>учитывая, что сейчас, например, большинство случаев отказа от них связано с отсутствием важных библиотек типа развивающегося и поддерживаемого гуя, а user- & codebase гораздо больше.
Ну, так какие там проблемы с библиотеками для вышеперечисленных языков?
Надо уметь смотреть правде в глаза. Языки вроде Окамла и Хаскеля просто не принимаются большинством программистов. Их любят только те, кто окончательно и бесповоротно проникся идеями ФЯ. Хаскель отпугивает своими манадами, полной ленивостью, отсутствием императивных конструкций и шифровальным стилем записи. Окамл кривой поддержкой ООП, отсутствием компонентности, непривычным синтаксисом. Схема и Лисп пугают тем, что нужно писать программы в АСТ.
Мне лично все равно будут ли апологеты ФЯ считать это фобиями, но это факт. Мэйнстрим не принял и врде ли примет большинство ФЯ.
Немерле же по сути являясь ФЯ умудряется достойно поддерживать и другие парадигмы. Даже в стиле старого доброго С на нем пишется без проблем.
BLA> Ну и еще один момент — дотнет — это вообще очень маленький сегмент всего IT и использовать языки, которые есть только на нем сильно менее целесообразно, чем те, что есть везде.
Кому как. Есть мнение, что управляемые среды вроде дотнета и Явы — это будущее программирования. Но это опять же отдельная тема, поднимавшаяся здесь не раз.
BLA>Ну и там для некоторых(большинства) нетривиальных задач как использовали пролог, лисп, APL и фортран, так и будут продолжать.
Для решения большинства задач, в том числе и не тривиальных, сегодня используются С++, Ява и C#. Это факт. Как раз Пролог и даже Лисп являются скорее исключением. Это языки используемые в узких нишах. Обычно в научных кругах. Я же говорю о Немерле как о претенденте на лидерство в области промышленного программирования.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Все же Ocaml и Хаскель я знаю очень поверхностно.
VD>Ну, а лично я полностью уверен, что Неперле превосходит Окамл и Хаскель. Как минимум Немерле значительно удобнее если рассматривать его как статически-типизированный, типобезопасный, объектно-ориентированный язык.
Довольно противоречивые высказывания однако. С учетом того, что OCaml (насколько я наслышан) как раз статически-типизированный и типобезопасный.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Довольно противоречивые высказывания однако. С учетом того, что OCaml (насколько я наслышан) как раз статически-типизированный и типобезопасный.
Выделю ключевые слова:
Ну, а лично я полностью уверен, что Неперле превосходит Окамл и Хаскель. Как минимум Немерле значительно удобнее если рассматривать его как статически-типизированный, типобезопасный, объектно-ориентированный язык.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Ну, а лично я полностью уверен, что Неперле превосходит Окамл и Хаскель. Как минимум Немерле значительно удобнее если рассматривать его как статически-типизированный, типобезопасный, объектно-ориентированный язык.
Если вспомнить про то, что OCaml -- это Objective Caml и посмотреть на Chapter 3 Objects in Caml, то в твой фразе жирным придется выделить только вот это:
Ну, а лично я полностью уверен, что Неперле превосходит Окамл и Хаскель. Как минимум Немерле значительно удобнее если рассматривать его как статически-типизированный, типобезопасный, объектно-ориентированный язык.
Поскольку аргументы про типизацию и объектность к OCaml-у не относятся.
Кстати, забавную ты описку сделал: 'Неперле'
Как бы после такого массированного промоушена Nemerle к нему эта кличка не приклеилась
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Если вспомнить про то, что OCaml -- это Objective Caml и посмотреть на Chapter 3 Objects in Caml, то в твой фразе жирным придется выделить только вот это:
E>
Ну, а лично я полностью уверен, что Неперле превосходит Окамл и Хаскель. Как минимум Немерле значительно удобнее если рассматривать его как статически-типизированный, типобезопасный, объектно-ориентированный язык.
Я уже все написал все в исходном сообщении. Я считаю реализацию ООП в Окале неудобной.
Если ты считашь иначе, то выбрасывай свой любимый С++ на и перебирайся на Окамл.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Я уже все написал все в исходном сообщении. Я считаю реализацию ООП в Окале неудобной.
Так вот я и хочу тебе показать, что подобные утвержения мало чего стоят из-за твоих же слов: "Все же Ocaml и Хаскель я знаю очень поверхностно." Вряд ли поверхностные знания могут позволять считать что-либо удобным или неудобным.
VD>Если ты считашь иначе, то выбрасывай свой любимый С++ на и перебирайся на Окамл.
Кстати, это не так уж маловероятно, как ты думаешь. Я бы сам хотел перейти на более современный язык, чем C++, лишенный тяжелого наследия C. Объектно-ориентированный, кроссплатформенный, быстрый, OpenSource и не принадлежащий какой-нибудь корпорации. Пока всерьез присматривался к D. А вот про OCaml забыл. Спасибо, что напомнил.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
VD>>Я уже все написал все в исходном сообщении. Я считаю реализацию ООП в Окале неудобной.
E>Так вот я и хочу тебе показать, что подобные утвержения мало чего стоят из-за твоих же слов: "Все же Ocaml и Хаскель я знаю очень поверхностно." Вряд ли поверхностные знания могут позволять считать что-либо удобным или неудобным.
Знания чего, Хаскеля или ООП? Я вот например знаю джаву очень поверхностно, но считаю отсутствие свойсв и принятые в мире джавы соглашения по именованию неудобными. Что не так в моём утверждении?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Знания чего, Хаскеля или ООП? Я вот например знаю джаву очень поверхностно, но считаю отсутствие свойсв и принятые в мире джавы соглашения по именованию неудобными. Что не так в моём утверждении?
Знания OCaml-а. Влад противопоставляет Nemerle OCaml-у и высказывает свои оценки по OCaml-у не владея самим OCaml-ом. Именно это мне не нравится.
Твой же пример с Java в данном случае мне кажется неудачным.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
VD>Ну, что же еще одно мнение законченного апологета ФЯ.
По-моему, это и то что ниже — это хамство конченного неуча.
Я даже не подумаю отвечать на весь этот агрессивный "слышал звон".
Посоветую только подучиться что ли.
ну там что такое "функциональный стиль" и чем он отличается от хаскеля и окамла, что такое типы и типобезопасный (немерль как типобезопасный язык меня особенно повеселил), что такое currying и term rewriting.
Да и вообще — выучить чтоли те же хаскель, окамл схему и коммон лисп, чтобы уже понимать о чем говоришь.
И поменьше слов вроде "апологет" — это из лексикона продавщиц пива.
Интересно, почему наиболее агрессивные и неадекватные участники 'Философии программирования' в последнее время (reductor, Winnie Poh, теперь вот г.Необрезанный) оказываются приверженцами ФЯ? Это что не с проста? Что первично: ФЯ так крышу сносит или же безбашенные экстремалы находят для себя ФЯ в качестве любимой полянки для отдыха?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
bigger longer and uncut wrote: > И поменьше слов вроде "апологет" — это из лексикона продавщиц пива.
Кхм... "Апологет" — слово греческого происхождения (от "апалогия" —
"защита позиций против атак").
Здравствуйте, eao197, Вы писали:
E>Интересно, почему наиболее агрессивные и неадекватные участники 'Философии программирования' в последнее время (reductor, Winnie Poh, теперь вот г.Необрезанный) оказываются приверженцами ФЯ? Это что не с проста? Что первично: ФЯ так крышу сносит или же безбашенные экстремалы находят для себя ФЯ в качестве любимой полянки для отдыха?
Это вы мне?
Отлично просто
Сначала меня обзывают "законченным апологетом", потом с презрительным тоном выливают ушат текста с неслабой концентрацией глупостей на строчку, после моего с этим несогласием я оказываюсь пдонком, агрессивным и неадекватным, оказываюсь в ряду с какими-то неизвестными людьми и называюсь "приверженцем ФЯ".
Это у вас так здесь принято в этой `философии' программирования?
Здравствуйте, bigger longer and uncut, Вы писали:
BLA>Это вы мне?
Вообще-то вопрос был ко всем сторонникам функциональных языков программирования.
Но если брать лично вас, то признаком неадекватности для меня являются ваш ник и подпись под сообщениями.
Что же касается неизвестных вам людей, перечисленных в одном ряду с вами, то они так же советовали всем и каждому подучиться, в довольно агрессивном тоне иногда. Временами очень похоже на то, как сделали это вы.
BLA>Это у вас так здесь принято в этой `философии' программирования?
Да здесь много чего случается. И межличностные и межкланновые разборки, и сеансы пенисометрии, и заявления о собственной возвышенности над толпой. Много чего. Что потом в 'Священные войны' и в 'Мусор' перебирается.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, bigger longer and uncut, Вы писали:
BLA>>Это вы мне?
E>Вообще-то вопрос был ко всем сторонникам функциональных языков программирования.
Я только не понял одного — откуда вы взяли, что я сторонник функциональных языков программирования?
E>Но если брать лично вас, то признаком неадекватности для меня являются ваш ник и подпись под сообщениями.
Тоже мнение. Вы, наверное, очень не любите американскую [контр]культуру?
E>Что же касается неизвестных вам людей, перечисленных в одном ряду с вами, то они так же советовали всем и каждому подучиться, в довольно агрессивном тоне иногда. Временами очень похоже на то, как сделали это вы.
А как по вашему я должен был себя повести?
Ну то есть как Это здесь принято.
Здравствуйте, bigger longer and uncut, Вы писали:
BLA>Я только не понял одного — откуда вы взяли, что я сторонник функциональных языков программирования?
Показалось. Если я ошибся, то извините.
BLA>Тоже мнение. Вы, наверное, очень не любите американскую [контр]культуру?
Я даже не знаю, что это такое.
BLA>А как по вашему я должен был себя повести? BLA>Ну то есть как Это здесь принято.
Не берусь утверждать, как здесь принято, но я бы поступил так: проигнорировал бы выпады в адрес личности и постарался бы обсудить только предмет спора. Меня, например, смущает, что все цитаты VladD2 приводил из описания Nemerle -- т.е. высказывал только одну точку зрения -- точку зрения разработчиков Nemerle. С одной стороны, они хотели взять лучшее из разных языков (OCaml, MathML, Haskell и разных пристроек к ним). Однако, совсем не факт, что сборная солянка из "лучших возможностей" действительно окажется вкусным блюдом под названием Nemerle. Поскольку я сам не знаю функциональных языков, то мне было бы интересно услышать мнение знающего человека (мнение по существу).
Переход же на личностные разборки просто убивает интерес к первоначальной теме.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Так вот я и хочу тебе показать, что подобные утвержения мало чего стоят из-за твоих же слов: "Все же Ocaml и Хаскель я знаю очень поверхностно." Вряд ли поверхностные знания могут позволять считать что-либо удобным или неудобным.
Более чем. Я же не не глядя гворю?
ЗЫ
Ну, да ладно. Я так понимаю, что в остальном ты со мной согласен. И то не полохо.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, bigger longer and uncut, Вы писали:
BLA>По-моему, это и то что ниже — это хамство конченного неуча.
А, по-моему, кто-то не умеет воспринимать чужое мнение и отсутствии аргументов решил перейти на личность оппонента.
BLA>Я даже не подумаю отвечать на весь этот агрессивный "слышал звон".
Ты уже это сделал. Причем продемонстрировал всю свою несостоятельность.
BLA>Посоветую только подучиться что ли.
Спасибо. Всю жизнь этим занимаюсь.
BLA>И поменьше слов вроде "апологет" — это из лексикона продавщиц пива.
Тебе, конечно, виднее, у меня в кругу общения продавщиц пива не было.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Интересно, почему наиболее агрессивные и неадекватные участники 'Философии программирования' в последнее время (reductor, Winnie Poh, теперь вот г.Необрезанный) оказываются приверженцами ФЯ? Это что не с проста? Что первично: ФЯ так крышу сносит или же безбашенные экстремалы находят для себя ФЯ в качестве любимой полянки для отдыха?
Забавно. Ты просто в точку попал "bigger longer and uncut" пересекается по айпишникам исключительно с reductor. Но Winnie Poh все же, похоже, не он.
Но тем страннее... Неадекватное поведение функциональщиков действительно становится тенденцией.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
BLA>>Тоже мнение. Вы, наверное, очень не любите американскую [контр]культуру? E>Я даже не знаю, что это такое.
Мой ник — это название мультфильма.
BLA>>А как по вашему я должен был себя повести? BLA>>Ну то есть как Это здесь принято.
E>Не берусь утверждать, как здесь принято, но я бы поступил так: проигнорировал бы выпады в адрес личности и постарался бы обсудить только предмет спора. Меня, например, смущает, что все цитаты VladD2 приводил из описания Nemerle -- т.е. высказывал только одну точку зрения -- точку зрения разработчиков Nemerle.
Вот именно это и забило окончательный гвоздь в мое терпение. Как можно беседовать с человеком, когда он говорит агитками?
Разве можно апеллировать к агитке? По-моему, нельзя.
E>С одной стороны, они хотели взять лучшее из разных языков (OCaml, MathML, Haskell и разных пристроек к ним). Однако, совсем не факт, что сборная солянка из "лучших возможностей" действительно окажется вкусным блюдом под названием Nemerle. Поскольку я сам не знаю функциональных языков, то мне было бы интересно услышать мнение знающего человека (мнение по существу).
Ну здесь как — вообще термин "функциональный язык" достаточно условная вещь, конечно, но одно видимо можно сказать — это языки, которые в основе своей имеют лямбда-исчисление.
То есть лямбда-функции являются основным и единственным строительным блоком и все конструкции в языке(ну как минимум все функции) состоят из лямбд. лямбда — это анонимная функция, которая так же является замыканием — то есть помнит родительский контекст.
Смысл в том, чтобы получить язык с формальной семантикой — чтобы программы были предсказуемыми, доказуемыми и как можно проще.
Это конечно все очень упрощенно, но примерно так.
Так вот — Nemerle никакого отношения к этому описанию не имеет. В нем даже лямбд нет — то, что там называется таковой, на самом деле макрос, который генерирует делегат.
Причем макросы в немерле — это вообще говоря антифункциональная вещь. То есть они не first-class values, их нельзя передавать куда-то или возвращать, хотя со стороны они выглядят как функции. Удачи маленьким любителям функциональных языков.
То есть немерль не более функциональный, чем, скажем, С++. Javascript к слову гораздо более функциональный, если на то пошло.
Если же мы идем дальше и пытаемся сравнить с Хаскелем и Окамлом, то все еще хуже.
То есть достаточно было бы упомянуть отсутствие карринга в немерле, чтобы выкинуть гигантский кусок выразительной мощи из окамла с хаскелем, но еще ведь есть типы. Которые в немерле — это просто дотнетовские классы на самом деле, со всеми их проблемами.
То есть кроме всего прочего понятно, что они еще динамические и т.п.
Ну и как вишенка на тортике — Null_pointer_exception.
Конечно после этого пытаться искать в немерле следы функторов, полиморфных вариантов, классов типов, экзистенциальных типов, функциональных зависимостей и полиморфизм второго ранга — не стоит.
Вот такие у нас нынче пошли типобезопасные функциональные языки.
Еще принято считать, что ленивые языки как минимум в два раза выразительнее, чем энергичные (небезосновательно).
Вот теперь вы можете отличать функциональные языки.
Конечно немерль — это лучший язык за сто лет и сто лет еще лучше не появится.
E>Переход же на личностные разборки просто убивает интерес к первоначальной теме.
Здравствуйте, bigger longer and uncut, Вы писали:
BLA>Сначала меня обзывают "законченным апологетом", потом с презрительным тоном выливают ушат текста с неслабой концентрацией глупостей на строчку, после моего с этим несогласием я оказываюсь пдонком, агрессивным и неадекватным,
Дык, может быть задуматься над своим поведением? Заметь, до твоего откровенного срыва eao197 был если не на твоей стороне, то по крайней мере поддержал тебя оценкой.
Если бы ты вместо откровенного хамства потрудился бы аргументировать свою позицию, то он и дальше поддерживал бы тебя. И не только он.
BLA>оказываюсь в ряду с какими-то неизвестными людьми и называюсь "приверженцем ФЯ".
Не известными говоришь? А айпишники у тебя и reductor-а совподают совсем случайно? И ник девственно чистый без единого указания на личность тоже появился просто так?
BLA>Это у вас так здесь принято в этой `философии' программирования?
Да, у нас здесь принято уважать оппонентов и ставить на место тех кто зарывается. Уверяю тебя, что такое же отношение ты получишь в любом уважающем себя обществе.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
E>Меня, например, смущает, что все цитаты VladD2 приводил из описания Nemerle
Дык странно было бы в обсуждении Nemerle приводить цитаты из чего-то другого. Претензии, причем ничем не аргументированные, были именно к метаподсистеме Nemerle. Причем она постоянно сравнивалась с анлогичной в функциональных языках. Я и развеивал эти заблуждения цитированием второв Nemerle-а.
E>-- т.е. высказывал только одну точку зрения -- точку зрения разработчиков Nemerle. С одной стороны, они хотели взять лучшее из разных языков (OCaml, MathML, Haskell и разных пристроек к ним). Однако, совсем не факт, что сборная солянка из "лучших возможностей" действительно окажется вкусным блюдом под названием Nemerle. Поскольку я сам не знаю функциональных языков, то мне было бы интересно услышать мнение знающего человека (мнение по существу).
Собственно по существу я тоже был с удовольствием послушал. Но видимо судьба такая. Если челвоек не равнодушен к ФЯ, то любая аргументация идущая в разрез с его точкой зрения воспринимается им как личное оскорбление.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
IT>>Знания чего, Хаскеля или ООП? Я вот например знаю джаву очень поверхностно, но считаю отсутствие свойсв и принятые в мире джавы соглашения по именованию неудобными. Что не так в моём утверждении?
E>Знания OCaml-а. Влад противопоставляет Nemerle OCaml-у и высказывает свои оценки по OCaml-у не владея самим OCaml-ом. Именно это мне не нравится.
E>Твой же пример с Java в данном случае мне кажется неудачным.
Ты придрался к следующему:
Я считаю реализацию ООП в Окале неудобной.
Ещё и выделил жирным шрифтом. Где тут Немерле?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
VD>Забавно. Ты просто в точку попал "bigger longer and uncut" пересекается по айпишникам исключительно с reductor. Но Winnie Poh все же, похоже, не он.
ИМХО, для того, чтобы понять это, не требуется ни доступ к IP участников, ни секретный ИИ
Здравствуйте, bigger longer and uncut, Вы писали:
BLA>Вот именно это и забило окончательный гвоздь в мое терпение. Как можно беседовать с человеком, когда он говорит агитками?
не потрудился аргументировать ни одного своего утверждения. На что я старался отвечать аргументировано.
BLA>Разве можно апеллировать к агитке? По-моему, нельзя.
Тогда с тобй вообще нельзя разговаривать.
BLA>Ну здесь как — вообще термин "функциональный язык" достаточно условная вещь, конечно,
+1
BLA> но одно видимо можно сказать — это языки, которые в основе своей имеют лямбда-исчисление.
Необязательно лямбда. Просто ориентированы на работу с выражениями, а не предложениями. Хотя конечно любой язык поддерживающий функциональный стиль обычно позволяет создавать анаонимные функции а-ка лямбды.
BLA>То есть лямбда-функции являются основным и единственным строительным блоком и все конструкции в языке(ну как минимум все функции) состоят из лямбд. лямбда — это анонимная функция, которая так же является замыканием — то есть помнит родительский контекст.
В общих чертах можно согласиться. Хотя мнение несколько натянутое на мой взгляд.
BLA>Смысл в том, чтобы получить язык с формальной семантикой — чтобы программы были предсказуемыми, доказуемыми и как можно проще.
Это цель любого современного ЯП.
BLA>Это конечно все очень упрощенно, но примерно так.
Я бы даже скзал очень расплывчато и натянуто.
Классическое определение функционального программирования звучит как-то так:
Функциональное программирование — это парадигма программирования трактующая вычисления как вычисление математических функций, т.е. отсуствие побочных эффектов/изменения переменных.
BLA>Так вот — Nemerle никакого отношения к этому описанию не имеет. В нем даже лямбд нет — то, что там называется таковой, на самом деле макрос, который генерирует делегат.
Ошибаешся. Лямбда в Немерле описывается так:
fun(список параметров){ тело }
С макросами это никак не связано.
Есть макрос позволяющий записывать лябды с одним параметром таким образом:
lambda x -> тело
но он преобразуется во все ту же конструкцию fun.
Что до делегатов, то функция никак не может являеться делегатом, просто потму, что делегат — это ссылка на функцию.
Иногда компилятор может порождат теявное использование делегатов, но это уже особенности реализации. К вопросу о том есть лябды в языке или нет — это отношения не имеет.
BLA>Причем макросы в немерле — это вообще говоря антифункциональная вещь.
Во как? Прэлесно!
BLA> То есть они не first-class values,
Ну, и что? Кому-то это мешает? Мне — нет.
BLA> их нельзя передавать куда-то или возвращать, хотя со стороны они выглядят как функции. Удачи маленьким любителям функциональных языков.
Действительно удачи любителям функциональных языков. А лично мне это все на фиг не упало. Внутри макроса я без проблем могу использовать любой стиль. Сами макросы я опять же могу использовать из любого стиля. Обернуть макрос в фнкцию проблемы не составляет.
В общем, мне не нужна фунциональщина любой ценой. Как приятный бонус я ей рад. Но как единственно-верное учение — увольте.
BLA>То есть немерль не более функциональный, чем, скажем, С++. Javascript к слову гораздо более функциональный, если на то пошло.
Логика откровенно никудышная. Нэмерле и без макросов позволяет писать в функциональном стиле (использовать функциональную парадигму, если угодно). Более того фунциональный стиль в нем является основным. Как раз императивный стиль там на макросах в основном реализаван. Даже циклы макросами переписываются в рекурсивные функции/замыкания.
Учитывая, что непосредственно во функциональных языках макросы встретить можно не часто, вообще не ясно о чем речь.
BLA>Если же мы идем дальше и пытаемся сравнить с Хаскелем и Окамлом, то все еще хуже. BLA>То есть достаточно было бы упомянуть отсутствие карринга в немерле, чтобы выкинуть гигантский кусок выразительной мощи из окамла с хаскелем,
Хм. С каких это пор карринг стал неотемлемой частью ФЯ? А как же тогда Схема, Лисп и т.п.? И чем же это его отсуствие так сильно угнетает выразительность?
Карринг конфликтует с перегрузкой. Естественно, что в языке претендующем на С-подобный синтаксис выбрали перегрузку, а не карринг.
Собственно на практике и без каринга получается жить очень неплохо. Например:
def list1 = [1, 3, 5, 9];
def Add(a, b) { a + b } // функция с двумя аргументами
def list2 = list1.Map(Add(_, 1)); // Применяем ее как функцию с одни аргументом
Ну, и естественно никто не мешает комбирировать фунции явно с помощью создания лябд или локальных функций (как в Лиспах).
Выбор в пользу перегрузки совершенно очевиден. Дотнетные библиотеки напичканы перегруженными методами. Если бы язык не поддерживал пергрузку, то были бы нехилые проблемы в совместимости с дотнетом.
BLA>но еще ведь есть типы. BLA> Которые в немерле — это просто дотнетовские классы на самом деле, со всеми их проблемами.
И достоинствами. Про них тоже забывать не стоит.
BLA>То есть кроме всего прочего понятно, что они еще динамические и т.п.
В смысле динамически создаются в динамически выделяемой памяти? Да, и что? Это совершенно нормально для любого языка претендующего на звание ОО. И уж просто обязательно для любой компонентной системы.
BLA>Ну и как вишенка на тортике — Null_pointer_exception.
Ужас какой! И как люди с этим живут?
BLA>Конечно после этого пытаться искать в немерле следы функторов, полиморфных вариантов, классов типов, экзистенциальных типов, функциональных зависимостей и полиморфизм второго ранга — не стоит.
И тем неменее все это в нем есть.
Например, те же варианты:
variant Tree [T]
{ | Node { left : Tree[T]; mid : T; right : Tree[T]; }
| Leaf
public override ToString () : string
{
match (this)
{ | Node (l, m, r) => $"($l $m $r)"
| Leaf => "."
}
}
}
def tree = Tree.Node(Tree.Node(Tree.Leaf(), 1, Tree.Leaf()), 2, Tree.Leaf());
System.Console.WriteLine(tree.ToString());
выводит:
((. 1 .) 2 .)
BLA>Вот такие у нас нынче пошли типобезопасные функциональные языки.
Ага. Только не функциональные, а скорее поддерживающие функциональный стиль. Впрочем это определение полностью подходит и ОКамлу.
А ты просто неверно трактушь понятие "типобезопасный". http://en.wikipedia.org/wiki/Typesafe
BLA>Еще принято считать, что ленивые языки как минимум в два раза выразительнее, чем энергичные (небезосновательно).
Видимо по этой причине ты тут все время пиаришь ОКамл.
Рельно линивые по умолчанию языки порождают медленный код и иногда приводят к не очень очевидному коду. В Немерле, как и в ОКамле можно выборочно помечать части кода как линивые. А можно использовать подход из C# 2.0 и использовать итераторы.
BLA>Вот теперь вы можете отличать функциональные языки.
Ну, раз теперь вы это можете делать, то попробуйте найти серьезные отличия между тем же ОКамлом и Немерле в поддержке функционального стиля.
E>>Переход же на личностные разборки просто убивает интерес к первоначальной теме.
BLA>Да.
Ну, так держи себя в руках. А то ведь долго тебя терпеть никто не будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Дарней,
LCR>>Задай в поиске слово "бред". Ты увидишь, что неадекватное поведение "функциональщиков" — капля в море
Д>есть еще эти.... ну, которые с черной коробкой... только тихо, а то опять бедлам начнется (оглядываясь по сторонам)
Здравствуйте, IT, Вы писали:
IT>Ты придрался к следующему:
IT>
Я считаю реализацию ООП в Окале неудобной.
IT>Ещё и выделил жирным шрифтом. Где тут Немерле?
Ты вырываешь фразы из контекста. Первоначально я указал Владу, что он в своем посте говорит о том, что не знает в достаточной степени OCaml, а затем говорит, что Nemerle по сравнению с OCaml более удобен, поскольку статически типизирован, типобезопасен и объектно-ориентирован. Но на самом деле OCaml так же статически типизирован, типобезопасен и объектно-ориентирован. Т.е. сравнение Nemerle с OCaml по этим критериям уже не выглядит убедительным.
Далее Влад подчеркивает, что по его мнению в OCaml-е неудобная реализация ООП. Но это мнение стоит еще меньше, поскольку у Влада нет реального опыта использования OCaml-а (был бы такой опыт, он бы не говорил про недостаточное знание OCaml). А опыт -- это такая штука, которая меняет наши поверхностные впечатления. То, что при чтении мануала может выглядеть странным, убогим и неудобным при использовании на практике, бывает, оказывается логичным и удобным. Например, после нескольких месяцев использования Ruby я был не самого высокого мнения о динамических языках (чему можно найти свидетельство, например, здесь
). Тем не менее, мой дальнейший опыт показал, что я сильно заблуждался. Поэтому мне кажется, что мнение Влада про ООП в OCaml может быть не менее ошибочным. К тому же даже не зная самого языка, просто прочитав половину главы про ООП в мануале по OCaml-у, мне показалось, что нормальная там поддержка ООП: и классы, и наследование, и закрытые методы, и виртуальные.
Вот и все. С моей точки зрения, Влад сделал не очень удачное и обоснованное сравнение Nemerle с OCaml-ом.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
.
VD>Ну, да ладно. Я так понимаю, что в остальном ты со мной согласен. И то не полохо.
Нет, не согласен Мне кажется, ты там особо ничего нового про Nemerle не сказал.
Просто я совершенно не сведущ в Haskell и OCaml чтобы как-то серьезно возражать тебе.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
eao197,
E>... А опыт -- это такая штука, которая меняет наши поверхностные впечатления. То, что при чтении мануала может выглядеть странным, убогим и неудобным при использовании на практике, бывает, оказывается логичным и удобным.
Да!^:_ Замечу, это справедливо везде и всюду, а не только в программировании.
Вообщем то, что тема уже давно ушла от первоначального вопроса (в кратце — что нам даст то, что мы перепишем, используя Nemerle, какой-либо проект, написанный, например на C# 2.0) — это понятно, и понятно почему — потому что ответ на него в принципе уже ясен наверное всем.
А вот то, что разошелся такой внушительный спор, мне например несколько не понятно. (ну т.е. все таки понятно, с одной стороны , bigger longer and uncut хочет доказать, что Nemerle никакой не ФЯ, т.е. доказать то, чего никто и не утверждал , а VladD2 пытается ему это объяснить, — что мол не стоит опровергать то, чего никто и не говорил (по крайней мере он сам)).
Ведь по сути весь разговор, начавшийся, можно свести к паре абзацев и все. Nemerle убийца всех остальный ФЯ? Да ни за что. Убийца ООЯ? Тоже ни в коей мере. Это просто другое средство, и не более...
Да, безусловно есть задачи где нужен истинный ФЯ и никто и не суется туда с тем же шарпом, равно как и есть задачи где ФЯзыкам делать нечего (как уже было тоже сказано), соль в том, что в последнее время в мэйнстриме все меньше места ФЯ, но оно есть... И если попробовать охватить широким взглядом этот самый мэйнстрим — то может показаться, что ФЯ несправедливо (ну или почти) несколько позабыты что-ли...
Так вот имхо Nemerle как раз и создан для того, чтобы перекрыть точку соприкосновения что-ли этих двух разных областей.
Влад на мой взгляд попал в точку, заметив:
Как приятный бонус я ей рад. Но как единственно-верное учение — увольте.
Это о возможности писать в функциональном стиле... и ведь верно, очень хорошо, что я могу не меняя язык, писать, как в одном стиле, так и в другом. И именно в этом прелесть Nemerle, а не в том, что он в плане функционального программирования лучше любого ФЯ (он не претендует на это звание) или что он в плане ООП лучше любого ОО языка (на это он тоже, как я понимаю, не претендует... хотя я могу и ошибаться ). А вот на что он претендует, так это на то, что один единственный такой... и Влад, говоря о том, что очень может статься так, что он займет очень большую нишу в мэйнстриме, как мне кажется имел ввиду именно эту его особенность, а не то, что он лучше любого ФЯ.
Ну и если уж совсем абстрагироваться от языков, то как мне кажется всем известно, что абсолютной панацеи не бывает...
И в Nemerle конкретно, мне нравится именно то, что он позволяет писать и в том и в другом стиле — раз.
Плюс позволяет делать то, для чего делался R# — два.
Ну и просто на выходе можно получить стандартную дот нет сборку, которую как я понимаю можно использовать из того же шарпа или бэйсика.нет если в этом есть необходимость.
И уже этого, больше чем достаточно для того, чтобы Nemerle занял очень большую нишу (возможно откусив ее у других языков).
________________________________
When in Rome, do as the Romans do...
Здравствуйте, AleXXus, Вы писали:
AXX>Это о возможности писать в функциональном стиле... и ведь верно, очень хорошо, что я могу не меняя язык, писать, как в одном стиле, так и в другом. И именно в этом прелесть Nemerle, а не в том, что он в плане функционального программирования лучше любого ФЯ (он не претендует на это звание) или что он в плане ООП лучше любого ОО языка (на это он тоже, как я понимаю, не претендует... хотя я могу и ошибаться )
C++ программисты стремяться программировать на отдельных островках языка, т.е. очень искусно использует некоторые возможности, избегая множества других. Хотя код более-менее переносим с компилятора на компилятор может быть очень тяжело перенести его от программиста к программисту. Великая сила C++ в том, что он поддерживат много совершенно разных стилей программирования, но при длительном использовании перекрывающиеся и несовместимые стили программирования становятся преградой.
Здравствуйте, eao197, Вы писали:
E>Не страшно, что подобная мультипарадигменность в Nemerle приведет к таким же последствиям, как в C++?
Как мне кажется, в случае с Nemerle к таким последствиям приведет скорее не очень разумное использование "мультипарадигменности", нежели само ее наличие
________________________________
When in Rome, do as the Romans do...
Здравствуйте, AleXXus, Вы писали:
AXX>Как мне кажется, в случае с Nemerle к таким последствиям приведет скорее не очень разумное использование "мультипарадигменности", нежели само ее наличие
Так ведь это и произошло в C++. Или есть основания полагать, что Nemerle будет использоваться "более качественными программистами", которые всегда все делают правильно и никогда ничего не ставят с ног на голову?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, AleXXus, Вы писали:
AXX>>Как мне кажется, в случае с Nemerle к таким последствиям приведет скорее не очень разумное использование "мультипарадигменности", нежели само ее наличие
E>Так ведь это и произошло в C++. Или есть основания полагать, что Nemerle будет использоваться "более качественными программистами", которые всегда все делают правильно и никогда ничего не ставят с ног на голову?
Да, вы правы, таких оснований нету. В моем предыдущем посте, я бы сейчас убрал Nemerle, т.к. не он определяет в данном случае И в принципе наверное действительно, вероятность того, что все придет к тому же — равна вероятности, с какой оно пришло к этому в С++.
Но тут есть другой момент. Раз уже есть печальный опыт (пришли один раз к такому), то можно попробовать использовать мультипарадигменность именно так, чтобы привела к "хорошему", а не "плохому"...
Хотя опять же — людей много, и так или иначе одни придут к "хорошему", другие к "плохому" итогу... И вот здесь — уже задача (возможно для авторов языка) — каким либо примером, или еще как, показать и научить, чтобы народ в массе своей чаще приходил к "хорошему", нежели к "плохому"
Да и вообще, всегда когда есть вариации — результаты будут разными. Один из кирпичей дом построит, а другой и себя и помошников под поддоном кирпичей похоронить может...
________________________________
When in Rome, do as the Romans do...
Здравствуйте, eao197, Вы писали:
E>Не страшно, что подобная мультипарадигменность в Nemerle приведет к таким же последствиям, как в C++?
Проблема С++ не в том, что в нем есть мультипарадигменность. Его проблема в том, что никто не думал о том, чтобы встроить мультипарадигменность в С++. Никто не проектировал, не думал о том, как сделать лучше.
Возможность использовать метапрограммирование, например, возникла просто как побочный эффект работы компилятора, а потом это уже научились использовать.
Вот и результаты — соответствующие.
Здравствуйте, Дарней, Вы писали:
Д>Проблема С++ не в том, что в нем есть мультипарадигменность. Его проблема в том, что никто не думал о том, чтобы встроить мультипарадигменность в С++. Никто не проектировал, не думал о том, как сделать лучше.
Сильное утверждение, однако.
Тем не менее, Nemerle поются диферамбы, хотя реальных проектов на Nemerle не видно (кроме самого Nemerle). А вот показательные примеры мультипарадигменных языков C++ (который только ленивый не ругает) и Lisp (который мало кто знает и еще меньше кто использует) почему-то в расчет не принимаются. Мол, мы уже ученые и ошибок темного прошлого не повторим.
Вот и посмотрим, что получится.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Дарней, Вы писали:
Д>а ты хочешь сказать, что возможность написания библиотек типа Локи была запланирована Страуструпом заранее? не верю (С)
Я хочу сказать, что вот здесь:
Проблема С++ не в том, что в нем есть мультипарадигменность. Его проблема в том, что никто не думал о том, чтобы встроить мультипарадигменность в С++. Никто не проектировал, не думал о том, как сделать лучше.
ты ничего не говорил ни про Локи, ни про метапрограммирование. С появлением шаблонов в C++ действительно была мультипарадигменность -- можно было писать в процедурном, объектно-ориентированном и обобщенном стиле. И писать нормально. И я думаю, что до года 1995, когда стало понятно, что именно в C++ будет стандартизированно, как раз думали о том, чтобы язык сделать лучше. По крайней мере я помню, насколько проще становилось пользоваться C++ по мере того, как в компиляторах становились доступны шаблоны, пространства имен, исключения, STL.
То, до чего C++ довели в Локи со компанией -- это уже последствие отсутствия тормозов у некоторых оголтелых апологетов (имхо).
Но если говорить о Nemerle, скажи мне, в Nemerle есть препятствия для того, чтобы Nemerle не превратили в такую же страшилку?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>ты ничего не говорил ни про Локи, ни про метапрограммирование. С появлением шаблонов в C++ действительно была мультипарадигменность -- можно было писать в процедурном, объектно-ориентированном и обобщенном стиле.
процедурный стиль — всего лишь подмножество ООП.
"Обобщенный" стиль.. а что ты имеешь под этим в виду, если исключить буст и локи? STL? Ну дык это просто очень урезанный вариант ФП. Или что-то другое?
E>Но если говорить о Nemerle, скажи мне, в Nemerle есть препятствия для того, чтобы Nemerle не превратили в такую же страшилку?
в страшилку можно превратить все что угодно, если поставить себе такую задачу. Намного хуже, когда программу приходится превращать в страшилку, потому что по другому нельзя
Здравствуйте, Дарней, Вы писали:
Д>процедурный стиль — всего лишь подмножество ООП.
Да уж...
И какое именно? Инкапсуляция? Полиморфизм? Не о наследовании же говорить?
Д>"Обобщенный" стиль.. а что ты имеешь под этим в виду, если исключить буст и локи? STL? Ну дык это просто очень урезанный вариант ФП. Или что-то другое?
Именно, другое. Обобщенное программирование в стиле Duck Typing-а.
Д>в страшилку можно превратить все что угодно, если поставить себе такую задачу. Намного хуже, когда программу приходится превращать в страшилку, потому что по другому нельзя
Тем не менее, ты мне не ответил.
Вообще Nemerle славословят, но не используют. Я припоминаю только одного участника обсуждений, который использовал Nemerle вместо Delphi.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Да уж... E>И какое именно? Инкапсуляция? Полиморфизм? Не о наследовании же говорить?
Например, инкапсуляция предполагает, что код будет выделен в отдельные процедуры, вызывающие друг друга.
E>Тем не менее, ты мне не ответил.
Дизайнеры C++ не думали о том, что C++ будут использовать для метапрограммирования. Дизайнеры Nemerle постулировали это с самого начала.
Это, конечно, не отменяет возможности использования Nemerle для чего-то совершенно третьего, о чём ни мы ни разработчики Nemerle не догадываются (чего они не планируют, точнее). И вот это-то и приведёт к проблеме использования неподходящих средств (средств, которые предполагалось использовать иначе) для решения проблемы. Но разговор сейчас о метапрограммировании, я так понимаю
E>Вообще Nemerle славословят, но не используют. Я припоминаю только одного участника обсуждений, который использовал Nemerle вместо Delphi.
Дык он же только-только становится известным. Потерпи чуток
eao197,
E>Но если говорить о Nemerle, скажи мне, в Nemerle есть препятствия для того, чтобы Nemerle не превратили в такую же страшилку?
К счастью для немерлистов препятствия есть. Это здравый смысл конкретного разработчика.
Как подходит программист на C++ к выбору библиотеки? Думает, выбирает, пробует. Если не подходит (кривая, неудобный апи, неэффективная) — откладывает в сторонку и переходит к следующей (или свою пишет).
Точно так же программист на Немерле (Не Перле) будет выбирать библиотеку макросов. Полагаю, что в будущем появятся тысячи синтаксических библиотек, заточенных под различные задачи. Вероятно, с библиотекой, скажем, алгоритмов на графах, будет идти и соответствующая настройка синтаксиса под эту библиотеку. Конечно, и реализация этих макросов будет ранжироваться от "упражнения для продолжающих" до "boost-like".
Картинка получается счастливой, радужной. Примерно как в "Мы" Евгения Замятина...
Здравствуйте, bigger longer and uncut, Вы писали:
BLA>Ну по крайней мере пока некоторые не будут вытеснены монстрами а-ля Maude и ASF+SDF
Maude и ASF+SDF — как я понял, специализированы на переписывании термов, и их использование в качестве универсальных языков, на мой взгляд, должно быть сопряжено с трудностями. Или это не так?
Здравствуйте, eao197, Вы писали:
Д>>процедурный стиль — всего лишь подмножество ООП.
E>Да уж... E>И какое именно? Инкапсуляция? Полиморфизм? Не о наследовании же говорить?
их в процедурном стиле просто нет, хотя при желании можно эмулировать. Я же говорю — подмножество.
E>Именно, другое. Обобщенное программирование в стиле Duck Typing-а.
Нет там duck typing'a. Есть только генерация кода, который потом пытаются скомпилировать. Или получится, или нет.
E>Вообще Nemerle славословят, но не используют. Я припоминаю только одного участника обсуждений, который использовал Nemerle вместо Delphi.
Здравствуйте, eao197, Вы писали:
E>Нет, не согласен Мне кажется, ты там особо ничего нового про Nemerle не сказал.
Нового для кого? Или по сравнению с чем?
E>Просто я совершенно не сведущ в Haskell и OCaml чтобы как-то серьезно возражать тебе.
Тогда не ясна твоя радосная раекция на первое сообщение товарища. Он ведь вообще ничего обоснованного не сказал.
Поверь мне на слово, что моего сегодняшнего знания Немерла достаточно чтобы понять, что товаришь его незнает вовсе и на этот незнании делает далеко идущие выводы.
Неперле банально проектировался с учетом опыта ML-подобных языков и Хаскеля. Так что функциональная парадигма для него радная. Вот только Немерле — это не чистый ФЯ, и даже не ФЯ с прикрученным к нему императивом и ООП. Немрле — это попытка сделать язык одинаково хорошо поддерживающий множество парадигм.
Собственно учет опыта предыдущих работ и подкупает. Именно этим похоже и объясняется стройнось и сбалансированность языка.
Я согласен с товарищем, что в Немерле нет коег чего что есть в классических ФЯ. Как в прочем и с тем, что нем многое сделано по своему. Но это и есть следствие баланса. Ведь в язык впихнут (причем отлично!) императив, и функциональщина, и обощенное программирование, и метапрограммирование.
Я бы сказал, что по духу Немерле близок к С++. Вернее к тому чем этот язык пытаются представить.
Но по реализации этот язык намного более чист. В нем если функциональшина, то без ужимок и выкрутасов. Если метапрограммирование, то полноценное, с поддержкой отладки и т.п.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>Задай в поиске слово "бред". Ты увидишь, что неадекватное поведение "функциональщиков" — капля в море
Я говорю, что вижу. Причем не хочу оскорбить тебя лично. Ты как раз ведеш себя в рамках приличия. Но случаев когда именно функциональщики переходили все допустимые пределы настолько много, что это бросается в глаза. И не только мне.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AleXXus, Вы писали:
AXX>А вот то, что разошелся такой внушительный спор, мне например несколько не понятно. (ну т.е. все таки понятно, с одной стороны , bigger longer and uncut хочет доказать, что Nemerle никакой не ФЯ, т.е. доказать то, чего никто и не утверждал , а VladD2 пытается ему это объяснить, — что мол не стоит опровергать то, чего никто и не говорил (по крайней мере он сам)).
В общем, да. То что такое Немерле прекрасно сказано на заглавной странице его сайта:
Nemerle is a high-level statically-typed programming language for the .NET platform. It offers functional, object-oriented and imperative features. It has a simple C#-like syntax and a powerful meta-programming system.
Превод.
Nemerle — это высокоуровневый, статически-типизированный, язык программирования для платформы .NET. Он предлагает функциональные, объектно-ориентированные и императивные возможности. Он имеет простой похожий на C# синтаксис и мощьную подсистему метапрограммирования.
То есть, ежу понятно, что это не ФЯ, а гибрид поддерживающих разные парадигмы.
AXX>Да, безусловно есть задачи где нужен истинный ФЯ и никто и не суется туда с тем же шарпом, равно как и есть задачи где ФЯзыкам делать нечего (как уже было тоже сказано), соль в том, что в последнее время в мэйнстриме все меньше места ФЯ, но оно есть... И если попробовать охватить широким взглядом этот самый мэйнстрим — то может показаться, что ФЯ несправедливо (ну или почти) несколько позабыты что-ли...
Вот тут не согласен. Во-первых, на истинном ФЯ получить значимых приемуществ не удастся. А, во-вторых, как на ФЯ, так и на ИЯ можно решать практически любые задачи. Ну, а на гибридном языке уж точно. У Немерле есть области для которых он явно не преспособен. Они простикают из его характеристик — типобезопасность (а значит все рулезка битами идет лесом), основа на платформе .NET. В остальном это язык общего назначения.
AXX>Так вот имхо Nemerle как раз и создан для того, чтобы перекрыть точку соприкосновения что-ли этих двух разных областей.
Я бы скзал, Nemerle позволяет свести многие достижения "язкостроителей" в одном языке. Он позволяет мэйстриму задействовать метапрограммирование и функциональную парадигму там где это даст нибольший эффект и писать остальное в ООП стиле, если это удобнее или просто привычнее.
AXX>Влад на мой взгляд попал в точку, заметив: AXX>
AXX>Как приятный бонус я ей рад. Но как единственно-верное учение — увольте.
AXX>Это о возможности писать в функциональном стиле... и ведь верно, очень хорошо, что я могу не меняя язык, писать, как в одном стиле, так и в другом. И именно в этом прелесть Nemerle, а не в том, что он в плане функционального программирования лучше любого ФЯ (он не претендует на это звание)
Именно! Да я и не говорил, что Nemerle лучший ФЯ. Я скзал, что он позволяет писать в функциональном стиле не хуже чем любой ФЯ. Карринг это пожалуй единственная фича отсуствующая в Nemerle, но ее ведь нет и в Лиспах.
AXX> или что он в плане ООП лучше любого ОО языка (на это он тоже, как я понимаю, не претендует... хотя я могу и ошибаться ).
Так и есть. Он практически аналогичен C# 2.0 с точки зрения ООП. Но вот поддержка метапрограммирования позволила ввести в Nemerle такие приятные бонусы как Traits. А это уже явно больше чем C#. Но есть ли в этом заслуга именно поддержки ООП? Я думаю — это заслуга грамотности проектирования языка.
AXX> А вот на что он претендует, так это на то, что один единственный такой... и Влад, говоря о том, что очень может статься так, что он займет очень большую нишу в мэйнстриме, как мне кажется имел ввиду именно эту его особенность, а не то, что он лучше любого ФЯ.
Я бы сформулировал это так... Nemerle, как и любой другой язык — это набор сдержек и противовесов. Другими словами компромисов. Но эти компромисы в нем настолько хорошо сбалансированы, что язык вполне способен стать новым лидером мэйнстрима. То есть отесть рэнок у C++, Java и C#.
Безусловно он врядли сильно изменит рынок ФЯ. Но этот рынок и так в микроскоп не заметить.
Более того большинство программистов вряд ли перйдут на ФЯ. Или этот процесс буде очень долгим. А на Nemerle спокойно. Ведь они по сути останутся в своей родной среде и как бонус получат возможность изучить и использовать то, что раньше им казалось непонятным и странным.
Те же кто уже знаком с непонятным и странным сможет воспользоваться отличной поддержкой ООП, компонетной парадигмы и огромным числом библиотек от дотнета.
Ну, что в этом может быть плохого?
AXX>Ну и если уж совсем абстрагироваться от языков, то как мне кажется всем известно, что абсолютной панацеи не бывает...
Естественно. Но лидеры индустрии все же есть. Сегодня их завут Java, C++, VB и C#. Все эти языки явно проигрывают Nemerle по выразительности и простоте реализации сложных вещей. Так почему бы им хотя бы не подвинутся?
AXX>И в Nemerle конкретно, мне нравится именно то, что он позволяет писать и в том и в другом стиле — раз.
И мене. Причем этот лозунг я слышал по отношению к С++, но чувствовал, что это именно лозунг. Так как реально выбор парадигмы в нем очень сильно ограничен. Только императивная и ОО состовляющие действительно находятся на высоке. Потуги писать в функциональном стиле или заниматься метапрограммированием сопряжены с огромным количеством проблем.
AXX>Плюс позволяет делать то, для чего делался R# — два.
+1
AXX>Ну и просто на выходе можно получить стандартную дот нет сборку, которую как я понимаю можно использовать из того же шарпа или бэйсика.нет если в этом есть необходимость.
Ага. Более того, я уверен, что не проблема сделать так, чтобы в одном проекте можно было держать и файлы Немерла и файлы Шарпа. Ведь конвертировать Шарп в немерле не проблема! А значит можно на первых порах обойти многие проблемы. Например, дизайнер форм пока не умеет работать с Немерле.
Более того, можно даже сделать еще более забавное решение. И C# 2.0, и Nemerle поддерживают partial-классы. Так вот можно сделать так, чтобы одна часть класса была на C#, а другая на Nemerle.
AXX>И уже этого, больше чем достаточно для того, чтобы Nemerle занял очень большую нишу (возможно откусив ее у других языков).
К сожалению, одного этого явно недостаточно. Кроме этого нужны:
1. Качестванная реализация, т.е. отсуствие глюков при отладке, вылетов компилятора, наличие внятных сообщений компилятора.
2. Интеграция с IDE. Хотя бы интелисенс и навигация. Ну, если была бы поддержка рефакторинга и дизайнеров — это вообще было бы здорово.
3. Промоушен. Ну, или если хотите пиар. Без него о Nemerle просто никто не узнает.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Дарней, Вы писали:
Д>Здравствуйте, eao197, Вы писали:
E>>Не страшно, что подобная мультипарадигменность в Nemerle приведет к таким же последствиям, как в C++?
Д>Проблема С++ не в том, что в нем есть мультипарадигменность. Его проблема в том, что никто не думал о том, чтобы встроить мультипарадигменность в С++. Никто не проектировал, не думал о том, как сделать лучше. Д>Возможность использовать метапрограммирование, например, возникла просто как побочный эффект работы компилятора, а потом это уже научились использовать. Д>Вот и результаты — соответствующие.
+1
Кроме того у С++ есть еще две проблемы:
1. Он унаследовал все худшие черты С.
2. Он слишком сложен.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>ты ничего не говорил ни про Локи, ни про метапрограммирование. С появлением шаблонов в C++ действительно была мультипарадигменность -- можно было писать в процедурном, объектно-ориентированном и обобщенном стиле.
Нет никакого обобщенного стиля. Обобщать можно в любом стиле. Это статический полиморфизм, а не стиль.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
Д>>процедурный стиль — всего лишь подмножество ООП.
E>Да уж... E>И какое именно? Инкапсуляция? Полиморфизм? Не о наследовании же говорить?
И ООП, и процедурное программирование по сути императивное программирование. То есть программирование с явным изменением состояний.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Именно! Да я и не говорил, что Nemerle лучший ФЯ. Я скзал, что он позволяет писать в функциональном стиле не хуже чем любой ФЯ. Карринг это пожалуй единственная фича отсуствующая в Nemerle, но ее ведь нет и в Лиспах.
VD>Хм. С каких это пор карринг стал неотемлемой частью ФЯ? А как же тогда Схема, Лисп и т.п.? И чем же это его отсуствие так сильно угнетает выразительность?
В Scheme, CL и даже Javascript карринг, разумеется, есть:
Если в Nemerle функции — first-class- тогда и у него есть. Странно, но я прочитав "Grokking Nemerle" — так и не смог грокнуть насколько функции first-class, а насколько это все макросы Просветите меня.
Здравствуйте, eao197, Вы писали:
E>Не страшно, что подобная мультипарадигменность в Nemerle приведет к таким же последствиям, как в C++?
Страшно. Но если это приведёт к тем же последствиям через 20 лет, то не страшно
Я писал на C/C++ 14 лет и отказался от него не из-за мультипарадигменности, а из-за банальной устарелости. Все эти свойства, один единственный тип string, компонентность, рефлекшин, знаете ли, сегодня уже давно не роскошь. Фактически речь идёт о суперсовременном языке, на котором я начинал писать, и о блеклом, заурядном, невыразительном и переусложнённом языке, развитие которого пошло своим далёким от мэйстрима путём, на котором я писать закончил.
Если Nemerle протянет хотя бы столько же — это будет большим успехом. Но архитектура языка предполагает одну очень важную вешь, а именно развитие языка без участия его создателей. Победит сильнейший. В случае с C++ произошло тоже самое — побел сильнейший — его создатели и комитет. У меня есть подозрение, что в случае с Nemerle это будет другая сторона — пользователи, т.е. мы с вами.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, VladD2, Вы писали:
VD>Нового для кого? Или по сравнению с чем?
Нового для меня.
VD>Тогда не ясна твоя радосная раекция на первое сообщение товарища. Он ведь вообще ничего обоснованного не сказал.
А почему ты решил, что радостная? Просто интересно мнение еще одного человека, не разделяющего восторгов по поводу потенции Nemerle.
VD>Неперле банально проектировался с учетом опыта ML-подобных языков и Хаскеля. Так что функциональная парадигма для него радная. Вот только Немерле — это не чистый ФЯ, и даже не ФЯ с прикрученным к нему императивом и ООП. Немрле — это попытка сделать язык одинаково хорошо поддерживающий множество парадигм.
Одинакого хорошо -- это, очень вероятно, на одинаково сером уровне. О чем человек говорит, сравнивая Nemerle с ФЯ. Как бы не получилось так, что кто-то захотел использовать функциональные возможности Nemerle (раз уж есть такие). А потом оказалось, что возможностей-то и не хватит.
В общем, твоя точка зрения понятна. Не имея практического опыта программирования на Nemerle ты от него в восторге. Но, имхо, не стоит удивляться, если далеко не все придерживаются того же мнения.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
E>>... С появлением шаблонов в C++ действительно была мультипарадигменность -- можно было писать в процедурном, объектно-ориентированном и обобщенном стиле.
VD>Нет никакого обобщенного стиля. Обобщать можно в любом стиле. Это статический полиморфизм, а не стиль.
Здесь тоже статический полиморфизм?:
#include <cstddef>
#include <iostream>
template <std::size_t N>
class array_of_ints {
int value[N];
public:
std::size_t size() { return N; }
int& operator[](int i) { return value[i]; }
array_of_ints& operator+=(int v)
{
for (int i = 0; i < N; ++i)
value[i] += v;
return *this;
}
};
int main()
{
array_of_ints<10> a;
for (int i = 0; i < a.size(); ++i)
a[i] = i;
a += 5;
for (int i = 0; i < a.size(); ++i)
std::cout << a[i] << ' ';
std::cout << '\n';
}
VladD2,
VD>Я говорю, что вижу. Причем не хочу оскорбить тебя лично. Ты как раз ведеш себя в рамках приличия. Но случаев когда именно функциональщики переходили все допустимые пределы настолько много, что это бросается в глаза. И не только мне.
Не согласен. (Однако я не хотел бы заниматься этими ненужными подсчётами, поэтому ну их (подсчёты) нафиг). Я в одном согласен: неуважительное отношение одних участников к другим — это плохо, и чем меньше будет этой фигни, тем лучше для коммьюнити. Давай замнём этот оффтоп?
Такой "карринг" конечно есть и в Nemerle. Можно практически переписать вышеприведенный код один-в-один, но так как язык статически типизированный он будет работать только с функциями одного типа. Но можно использовать дженерики:
А речь разумеется о синтаксическом сахаре для currying, который есть в ML и Haskell. Там можно написать нечто вроде add42 = (+) 42. В Nemerle так нельзя, но можно так:
На мой взгляд это ничем не хуже, а в определенных случаях даже лучше. Но название и суть несколько другие.
Z>Странно, но я прочитав "Grokking Nemerle" — так и не смог грокнуть насколько функции first-class, а насколько это все макросы Просветите меня.
Макросы здесь вообще не причем, а функции естественно first-class. Странный вопрос вообще...
Здравствуйте, eao197, Вы писали:
E>А почему ты решил, что радостная? Просто интересно мнение еще одного человека, не разделяющего восторгов по поводу потенции Nemerle.
Настараживает, то что ты даже не обратил внимания, что ни одно его возражение не подкреплено хотя бы какими-то фактами. Как только товарищ заговорил о Немерле более детально, стразу стало понятно, что он его попросту не знает. Его слова об остуствии в немерле лямбд свидетелсьвуют об этом очень красноречиво.
Получается, что тебя радует просто возражение, а не реальные аргументы.
E>Одинакого хорошо -- это, очень вероятно, на одинаково сером уровне.
Дело в том, что Немерле — это не мечтания на тему, а готовый язык с компилятором.
Я его уже попробовал, и смею заверить тебя реализовано все очень достойно. И уши оной парадигмы не мешают другой.
E> О чем человек говорит, сравнивая Nemerle с ФЯ.
Не о чем он не говорит. Привиди хотя бы одно его утверждение подтвержденное фактами.
E> Как бы не получилось так, что кто-то захотел использовать функциональные возможности Nemerle (раз уж есть такие). А потом оказалось, что возможностей-то и не хватит.
Практически весь компилятор написан в функциональном стиле. Вряд ли немероловцы стали бы это делать если бы язык имел проблемы в его поддержке.
И вообще, спроси лобого кто пытасля разобраться в этом языке и он скажет тебе, что Немерле основан на функциональной парадигме. Она для него родная.
Меня откровенно говоря начинает раздражать когда одно и то же заблуждение повторяется из раза в раз.
Давай договоримся, что или ты разберешся в вопросе и предъявешь факты говорящие о том, что поддержка функционального стиля в Немерле проблемотична, или поверишь тем, кто разбирался в языке.
E>В общем, твоя точка зрения понятна. Не имея практического опыта программирования на Nemerle ты от него в восторге.
Я имею опыт практического программирования на Немерле. За время пока я с ним разбирался я написал не так мало кода. Это конечно не огромное приложение, но более чем достаточно чтобы судить о языке.
E> Но, имхо, не стоит удивляться, если далеко не все придерживаются того же мнения.
Я удивляюсь с другого. Люди которые не толко не смотрели этот язык, но даже не имеют желания смотреть на него постоянно выносят суждения о нем и пытаются найти в нем фатальные недостатки.
Может быть лучше разобраться в обсуждаемом вопросе, или тогда уж просто пополчать и не выносить никаких суждений?
Вынесением суждений без наличия информации, ты банально выносишь недоверие чужому мнению. Прчем аргументировать это недоверие ты не хочешь. Тебе достаточно того, что "ты не веришь". Так вот это не конструктивно и в общем-то оскорбительно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Я в одном согласен: неуважительное отношение одних участников к другим — это плохо, и чем меньше будет этой фигни, тем лучше для коммьюнити. Давай замнём этот оффтоп?
Поддерживаю!
Чем больше на этом форуме будет аргументов и чем меньше флэйма, тем лучше всем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, igna, Вы писали:
I>Здесь тоже статический полиморфизм?:
I>
I>template <std::size_t N>
I>class array_of_ints {
I> int value[N];
..
I> array_of_ints& operator+=(int v)
I> {
I> for (int i = 0; i < N; ++i)
I> value[i] += v;
I> return *this;
I> }
I>
В некотором смысле да, так как по сути array_of_ints с разыми значениями параметров типа являются разными типами. Так что "+=" будет работать над разными типами.
Другое дело, что использование констатн в качестве параметров типов довольно бессмысленно на мой взгляд. И в следствии этого данный код тоже бессмысленнен.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Z>Если в Nemerle функции — first-class- тогда и у него есть.
Несомненно повторить приведенное тобой извращение можно. Есть тольк две проблемы:
1. curry в твоем примере полиморфна (так как допускает применение разных функций), что приводит к необходимости кроме комбинаторов воспользоваться еще и дженериками.
2. Операторы в немерле нельзя напрямую использовать как функцию (насколько я понял, хотя может и ошибаюсь).
Исходя из этих замечаний нужно ввести две функции обертки для операторов (
// Функции-обертки над операторами ">" и "+".
def GreaterThan(x, y) { x > y }
def Add(x : int, y) { x + y }
// Curry полиморфна, что в Немерле нужно указывать явно. По умолчанию будет производиться
// вывод типов который выведет тип фунции для первого применения и сочтет второе
// (полиморфное) применение ошибкой.
// T - тип параметров.
// R - тип возвращаемого значения функции.
// f - это фукнция имеющая тип "T * T -> R". Звездочкой разделяются параметры, а после "->"
// идет описание возвращаемого значения функции.
def Curry[T, R](f : T * T -> R) { fun(x) { fun(y) { f(x, y); } } }
// Остальное как в примере на Схеме.
def Positive(value) { Curry(GreaterThan)(0)(value) }
def Add42(value) { Curry(Add)(42)(value) }
// Тесты:
System.Console.WriteLine(Positive(2));
System.Console.WriteLine(Positive(-1));
System.Console.WriteLine(Add42(2));
System.Console.WriteLine(Add42(-1));
Результат выводимый на консоль:
False
True
44
41
Единственно, что... за такой код в реальных проектах я бы потрывал кое чего, так как он неоправданно сложен.
Вот так:
def Positive(value) { value > 0 }
def Add42(value) { value + 42 }
было бы куда проще.
Так вот это все к делу, как я понимаю, не относится.
Как я понимаю карринг — это сопсобность создавать комбинаторы (аналогичные приведенным в примерах) по месту, просто передавая в качестве параметров одной функции другую частично примененную.
В этом смысле карринга не в Немерле, не Лиспах нет. Но несомннено, что это не является припятствием для создания комбинаторов.
Ну, и главно. Это все соревнования в длинне пенисов. Ведь если действительно потребуется упрощенное создание комбинаторов, то нет проблем написать макрос который решит проблему наиболее чистым образом.
Z>Странно, но я прочитав "Grokking Nemerle" — так и не смог грокнуть насколько функции first-class, а насколько это все макросы Просветите меня.
Для этого не нжно було чить "Grokking". Об этом говорится во введении. Собственно я уже продемонстрировал применение функционалов. Но можно описать это дело проще.
Функция может быть передена в качестве параметра или возвращена в качестве возвращаемого значения. Кроме того функция может быть частью кортежа (tuple-а), класса, структуры или варинта.
Описывается тип функции так... Параметры функции перечисляются через символ "*". Возвращаемое значение отделяется строкой "->". Собственно символ "*" используется и при описании кортежей. Более того, в Немерле кортежи взаимозаменяемы со списком параметров, так что описание функции можно представить как описание двух кортежей разделенного строкой "->".
Примеры:
// Переменная позволяющая хранить ссылку на функцию принимающую
// два параметра типа инт и возвращающая булево значение.
mutable f1 : int * int -> bool;
// Функция принимающая в качестве параметра другую функцию (int * int -> bool), два значения типа int и возвращающая инвертированное значение вызова переданной фукнции.
def Func(f : int * int -> bool, x : int, y : int) : bool
{
!f(x, y)
}
// Используя вывод типов можно записать эту же функцию так:
def Func(f : int * int -> bool, x, y)
{
!f(x, y)
}
// или так:
def Func(f, x : int, y : int) : bool
{
!f(x, y)
}
// или даже так:
def Func(f, x, y)
{
!f(x, y)
}
При этом функция не получается полиморфной. Все типы включая тип функционала вычисляются исходя из первого применения. Точнее используется алгоритм накладвания ограничений. Например, в таком коде:
using System.Console;
def GreaterThan(x, y) { x > y }
def Func(f, x, y)
{
!f(x, y)
}
WriteLine(Func(GreaterThan, 3, 5));
все типы прекрасно будут выведены.
Выведение типов доступно только для вложенных функций и переменных. Все типы полей и методов должны задаваться явно.
Язык позволяет как объявлять вложенные фукнции захватывающие контекст как лямбды, так и реальные лямбды. Локальные фукнции описываются так:
def LocalFunc(param1, param2) { /* тело */ }
при этом можно использовать локальный контест:
mutable x = 1;
def AddX(y) { x + y }
WriteLine(AddX(4));
x++;
WriteLine(AddX(4));
вывод:
5
6
Типы параметров и возвращаемых значений можно описывать по необходимости. Например, если компилятор выдал не очень внятное сообщение об ошибке, то лучше уточнить типы. Это приведет к более ясному сообщению.
Лямбды в Немерле описываются так:
fun(x, y){ /*тело фукнции*/ }
Для лямбд тоже доступн вывод типов и захват локального контекста.
Есть макрос позволяющий записывать безымянные фукнции с одним параметром в стиле Лиспа:
lambda параметр -> выражение
но этот макрос находится в отдельном пространстве имен Nemerle.Extensions. Да и смысла особого его применять нет.
Лучше создать макрос в стиле C# 3.0.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, IT, Вы писали:
IT>Кстати, мне ужасно не нравится его название. Давай обсудим это
сложный вопрос — а как оно вообще произносится
насколько я понял, есть несколько вариантов. Сами поляки произносят как Немерл(е), но есть еще англизированный вариант. Про него пишут "it rhymes with M-Perl"
Здравствуйте, VladD2, Вы писали:
VD>Другое дело, что использование констатн в качестве параметров типов довольно бессмысленно на мой взгляд. И в следствии этого данный код тоже бессмысленнен.
На текущем уровне развития оптимизаторов это бывает весьма полезно.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
> Получается, что тебя радует просто возражение, а не реальные аргументы.
Порекомендую лучше посмотреть на твой собственный стиль возражений:
BLA>Причем макросы в немерле — это вообще говоря антифункциональная вещь.
Во как? Прэлесно!
BLA> То есть они не first-class values,
Ну, и что? Кому-то это мешает? Мне — нет.
BLA> их нельзя передавать куда-то или возвращать, хотя со стороны они выглядят как функции. Удачи
маленьким любителям функциональных языков.
Действительно удачи любителям функциональных языков. А лично мне это все на фиг не упало. Внутри макроса
я без проблем могу использовать любой стиль. Сами макросы я опять же могу использовать из любого стиля.
Обернуть макрос в фнкцию проблемы не составляет.
Т.е. ты даже не позволяешь себе принять во внимание тот факт, что для кого-то некоторые вещи могут быть важными. Тебе не важно -- и все, после этого хоть потоп.
Подобным образом со мной общались, когда я пытался выяснить, есть ли потенциальные проблемы с синтаксическими макросами в Nemerle. Так что, как я вижу, ничего не изменилось.
> Вынесением суждений без наличия информации, ты банально выносишь > недоверие чужому мнению. Прчем аргументировать это недоверие ты не > хочешь. Тебе достаточно того, что "ты не веришь". Так вот это не > конструктивно и в общем-то оскорбительно.
Оскорбительно? Ой какие мы нежные!
Ты попобуй поискать мои возражения в стиле "не верю" в ответах Vermicious Knid или Oyster-у. Поскольку люди разработали себе репутацию говорящих по существу. А вот у тебя подобной репутации в моих глазах нет. Уж извини. Слишком часто я убеждался, что принимать твои слова на веру просто так нельзя. Даже в этой теме ты не корректно высказался по поводу OCaml-а. Недавно ты еще утверждал, что GC рвет всех и вся, хотя даже простые тесты это опровергают. Можно еще вспомнить твой рассказ о вреде преждевременных оптимизаций... Так что в твоем случае срабатывает принцип "'поверьте мне как министру' не верю именно как министру" ((C) Жванецкий) срабатывает на 100%.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, WolfHound, Вы писали:
VD>>Другое дело, что использование констатн в качестве параметров типов довольно бессмысленно на мой взгляд. И в следствии этого данный код тоже бессмысленнен. WH>На текущем уровне развития оптимизаторов это бывает весьма полезно.
Ну, оптимизаторы, на мой взгляд, должны работать без костылей. Но все же интересно о чем ты говоришь. Поясни, плиз.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Ну, оптимизаторы, на мой взгляд, должны работать без костылей. Но все же интересно о чем ты говоришь. Поясни, плиз.
Например в STL есть такая штука как std::valarray.
Эту штуку использовали в boost::math::quaternion вот таким образом:
Тут создаются два valarray которые внутри выделяют динамическую память. Такм образом идет обращение к динамической, создаются обработчики исключений плюс у оптимизитора связаны руки.
Если сделать так:
То никакой динамической памяти не понадобится. Болие того оптимизатор может это все разложить по регистрам.
Эта замена при компиляции на VC++8 разагнала boost::math::quaternion в 15 раз.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Другое дело, что использование констатн в качестве параметров типов довольно бессмысленно на мой взгляд.
Foreword
by Scott Meyers
. . .
... a column by John Barton and Lee Nackman in the
January 1995 C++ Report that described how templates could be used to perform typesafe dimensional
analysis with zero runtime cost. This was a problem I'd spent some time on myself, and I knew that many
had searched for a solution, but none had succeeded. Barton and Nackman's revolutionary approach made
me realize that templates were good for a lot more than just creating containers of T.
As an example of their design, consider this code for multiplying two physical quantities of arbitrary
dimensional type:
template<int m1, int l1, int t1, int m2, int l2, int t2>
Physical<m1+m2, l1+l2, t1+t2> operator*(Physical<m1, l1, t1> lhs,
Physical<m2, l2, t2> rhs)
{
return Physical<m1+m2, l1+l2, t1+t2>::unit*lhs.value()*rhs.value();
}
Even without the context of the column to clarify this code, it's clear that this function template takes six
parameters, none of which represents a type!
. . .
(Modern C++ Design: Generic Programming and Design Patterns Applied, Andrei Alexandrescu)
Здравствуйте, igna, Вы писали:
VD>>Другое дело, что использование констатн в качестве параметров типов довольно бессмысленно на мой взгляд.
I>
I>by Scott Meyers
I>. . .
I>
I>template<int m1, int l1, int t1, int m2, int l2, int t2>
I>Physical<m1+m2, l1+l2, t1+t2> operator*(Physical<m1, l1, t1> lhs,
I> Physical<m2, l2, t2> rhs)
I>{
I> return Physical<m1+m2, l1+l2, t1+t2>::unit*lhs.value()*rhs.value();
I>}
I>
Эту химию настклько трудно понять, что я бы бил линейкой по рукам всем тем кто пытается писать код так. К тому же не трудно придставить диагностику ошибок выдаваемую компилятором. Нормальная система типов в хорошо расширяемом языке не должна требовать каких-то подпорок.
Например, в Немерле можно делать операторы макросами. При этом во время компиляции доступны любые проверки типов. То есть мы можем контролировать любые аспекты поведения оператора явно, используя те же возможности языка, что и в прикладных программах. По-моему, это намного более простой, понятный и гибкий подход.
Ну, а вот такие примеры — это восхищение тем, что проблема решается хоть как-то хотя совершенно не очевидными средствами.
Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него? Боюсь, что еденицы.
И еще один вопрос. Склько программистов используют подобные приколы в своем коде?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>... Нормальная система типов в хорошо расширяемом языке не должна требовать каких-то подпорок.
Как можно ли реализовать размерности на C#? А на Nemerle?
Чтобы при умножении типа размерности кг^n1*м^m1*сек^l1 на тип размерности кг^n2*м^m2*сек^l2 получался тип размерности кг^(n1+n2)*м^(m1+m2)*сек^(l1+l2).
Здравствуйте, igna, Вы писали:
I>Как можно ли реализовать размерности на C#? А на Nemerle?
Я не привык когда мне отвечают вопросом на вопрос. Так что если хочешь получить ответ на свои вопросы, то потрудись сначала ответить на чужие вопросы заданные ранее. Глядишь и желание отвечать отпадет. Напоминаю вопросы:
Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него?
Склько программистов используют подобные приколы в своем коде?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, igna, Вы писали:
I>Как можно ли реализовать размерности на C#? А на Nemerle?
Если такие же как на C++, т.е. compile-time, то на C# никак. На Nemerle это возможно, но слишком сложно чтобы этим заниматься без крайней необходимости. Проблема тут скорее в .NET, а не в Nemerle. Идеология дженериков слишком далека от идеологии шаблонов C++, т.е. они тут совершенно не помогут и придется придумывать что-то очень хитрое и не побоюсь этого слова извращенное.
Макросы Nemerle в общем-то и не проектировались как замена шаблонам, это нечто совершенно другое и решает зачастую совсем другие задачи. Вот реализовать compile-time движок шаблонов а-ля C++ это задача для макросов, а "реализовать размерности" скорее всего нет. Т.е. макросы это в первую очередь для расширения языка, а не для написания библиотек/програм.
А вообще ни C#, ни Nemerle не конкуренты C++ в том классе задач, где нужны подобные возможности. Ни "zero runtime cost", ни "производительность любой ценой", ни тем более "optimize prematurely!" пожалуй не является девизом ни первого, ни второго языка.
Из "новых" языков пожалуй только D сможет соперничать с C++ в этом вопросе. Сейчас правда в D только-только появилась такая фича как implicit template instantiation и она пока еще слишком сырая. Конечно и сейчас реализовать аналогичную функциональность можно, но придется использовать статические шаблонные функции вместо операторов и есть пара других нюансов. А вот когда она станет полностью юзабельной(как минимум к релизу 1.0), то C++ останется в пролете. Вот как это будет примерно выглядеть:
import std.stdio;
abstract class aPhysical {}
class physical(int M, int L, int T) : aPhysical
{
enum { M = M, L = L, T = T }
public double value;
public this(double value)
{
this.value = value;
}
template opMulT(P) { alias physical!(M+P.M, L+P.L, T+P.T) opMulT; }
public template opMul(P : aPhysical)
{
opMulT!(P) opMul(P rhs)
{
return new opMulT!(P)(value * rhs.value);
}
}
override char[] toString()
{
return std.string.format("%.2f kg^%d * m^%d * sec^%d", value, M, L, T);
}
}
void main()
{
auto value1 = new physical!(1,1,1)(2.0);
auto value2 = new physical!(3,2,1)(3.0);
auto result = value1 * value2;
// 6.00 kg^4 * m^3 * sec^2
writef("%s\n", result.toString());
}
Еще есть язык Fortress, пока только в виде спецификации. Вроде бы там подобные типы планируется поддерживать на уровне языка, так как язык ориентирован на разного рода "научные" вычисления, правда по поводу compile-time не уверен.
у меня была реализована подобная система. Сейчас работаю над следующей версией, в которой будут устранены некоторые недостатки текущей версии (например, типизированные константы для работы с системами единиц без взаимнооднозначного соответствия).
[/offtopic]
Здравствуйте, eao197, Вы писали:
BLA>>Причем макросы в немерле — это вообще говоря антифункциональная вещь.
E>Во как? Прэлесно!
а мне тоже интересно, почему это вдруг "антифункциональная вещь"
BLA>> их нельзя передавать куда-то или возвращать, хотя со стороны они выглядят как функции. Удачи E>маленьким любителям функциональных языков.
Ну а в Лиспе вообще всё "выглядит как функция". И что, Лисп — это антифункциональный язык?
и вообще, зачем их куда-то передавать или возвращать?
E>Подобным образом со мной общались, когда я пытался выяснить, есть ли потенциальные проблемы с синтаксическими макросами в Nemerle. Так что, как я вижу, ничего не изменилось.
твои проблемы — надуманные. Даже если они и станут актуальными для кого-то, то эти проблемы решаются за пару дней работы над компилятором, с помощью введения алиасов или полностью квалифицированных имен для макросов (если их еще нет)
Если тебя это так сильно заботит, почему бы не спросить на форуме разработчиков?
E>Можно еще вспомнить твой рассказ о вреде преждевременных оптимизаций...
Здравствуйте, VladD2, Вы писали:
VD>Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него?
VD>Склько программистов используют подобные приколы в своем коде?
И еще актуальнее — сколько программистов сможет понять, как это работает и вообще зачем это нужно, без недельного копания в литературе?
IT,
IT>Кстати, мне ужасно не нравится его название. Давай обсудим это
Прошу прощения за оффтоп.
What does "Nemerle" mean?
It is inspired by a name of mage Nemmerle from book of Ursula K. Le Guin "A Wizard of Earthsea" (spelling with a single 'm' is a design decision )
А этот маг, был молодцом, например оживил ученика:
...Коснувшись серебристым наконечником посоха сначала груди Геда, потом его губ, Неммерле что-то прошептал. Гед вздрогнул и глубоко вздохнул. Старый маг поднял свой посох, затем поставил его на землю, сложил на рукояти руки и опустил на них голову. У него не осталось сил стоять прямо.
...при этом пожертвовав собой:
...Он лежал неподвижно. Его ястребиный нос, высокий лоб и седые
волосы, залитые лунным светом, были цвета китовой кости. Неммерле истратил
всю свою силу на то, чтобы остановить действие заклинания и прогнать Тень
от Геда, а вместе с силой из его тела ушла и жизнь. Он умирал. Но смерть
Верховного Мага, еще при жизни не раз ступавшего по крутым иссушенным
тропам царства мертвых, не похожа на смерть обычного человека — он уходит
уверенно, хорошо зная дорогу...
А птичка на эмблеме, как я понимаю, это ворон мага:
В это время, ступая по камням и траве, к ним подошел ворон с острова
Осскил — огромная черная птица. Ворон приблизился к Верховному Магу и
встал рядом с ним, черный, как ночь, с кинжалообразным клювом и глазами,
похожими на прибрежную гальку...
Вроде бы с названием всё в порядке... А в остальном поживём-увидим
E>C++ программисты стремяться программировать на отдельных островках языка, т.е. очень искусно использует некоторые возможности, избегая множества других. Хотя код более-менее переносим с компилятора на компилятор может быть очень тяжело перенести его от программиста к программисту. Великая сила C++ в том, что он поддерживат много совершенно разных стилей программирования, но при длительном использовании перекрывающиеся и несовместимые стили программирования становятся преградой.
E>Не страшно, что подобная мультипарадигменность в Nemerle приведет к таким же последствиям, как в C++?
Мультипарадигменность вряд ли, а вот макросы приведут, зуб даю. История произошедшая в пятницу.
Конец рабочей недели, работать естественно уже припарило. Завязался разговор в котором в один прекрасный момент обсуждение перешло на всевозможные ЯП в том числе и на Немерле. Так как всем отделом пишем на C#, простенький код на Nemerle почти ни у кого затруднения не вызвал и уже через 10-20 минут исследований макросов одним из коллег, по ICQ полетел пример программы:
Здравствуйте, igna, Вы писали:
I>Здравствуйте, VladD2, Вы писали:
VD>>Другое дело, что использование констатн в качестве параметров типов довольно бессмысленно на мой взгляд.
I>
I>
I>template<int m1, int l1, int t1, int m2, int l2, int t2>
I>Physical<m1+m2, l1+l2, t1+t2> operator*(Physical<m1, l1, t1> lhs,
I> Physical<m2, l2, t2> rhs)
I>{
I> return Physical<m1+m2, l1+l2, t1+t2>::unit*lhs.value()*rhs.value();
I>}
I>
Здравствуйте, Дарней, Вы писали:
VD>>Склько программистов используют подобные приколы в своем коде?
Д>И еще актуальнее — сколько программистов сможет понять, как это работает и вообще зачем это нужно, без недельного копания в литературе?
Думаю, что не так уж и мало. Может это не проблема языка (здесь, кстати, не так уж и много подводных камней C++а), а тех, кто пытается программировать на C++ не зная языка?
И встречный вопрос: предложи запись на каком-нибудь языке этой конструкции, чтобы она была более понятна, обрабатывалась в compile-time и, в результате, работала с такой же скоростью, как в C++. А в том, что такие вещи нужны и используются можешь не сомневаться.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Дарней, Вы писали:
Д>И еще актуальнее — сколько программистов сможет понять, как это работает и вообще зачем это нужно, без недельного копания в литературе?
Я думаю что больше чем программистов понимающих например функциональные языки.
Сложные вещи в C++ легко запрятываются в библиотеки и понимать все трюки чтобы ими пользоватся необходимости нет.
Здравствуйте, eao197, Вы писали:
E>Думаю, что не так уж и мало. Может это не проблема языка (здесь, кстати, не так уж и много подводных камней C++а), а тех, кто пытается программировать на C++ не зная языка?
Проблема вообще очень проста — язык усложнен сверх всякой необходимости.
E>И встречный вопрос: предложи запись на каком-нибудь языке этой конструкции, чтобы она была более понятна, обрабатывалась в compile-time и, в результате, работала с такой же скоростью, как в C++. А в том, что такие вещи нужны и используются можешь не сомневаться.
Ну во первых, первый критерий исключаем — никакой понятности здесь и близко не было. А во вторых — насколько много таких задач, где оба этих критерия жизненно необходимы?
Здравствуйте, FR, Вы писали:
FR>Я думаю что больше чем программистов понимающих например функциональные языки.
ну во первых — далеко не факт
во вторых, это (пока что) более востребовано
FR>Сложные вещи в C++ легко запрятываются в библиотеки и понимать все трюки чтобы ими пользоватся необходимости нет.
Ага. А потом кодеры сидят и тихо офигевают, глядя на сообщение об ошибке длиной в 5 килобайт. Знаем, видели.
Здравствуйте, Дарней, Вы писали:
E>>И встречный вопрос: предложи запись на каком-нибудь языке этой конструкции, чтобы она была более понятна, обрабатывалась в compile-time и, в результате, работала с такой же скоростью, как в C++. А в том, что такие вещи нужны и используются можешь не сомневаться.
Д>Ну во первых, первый критерий исключаем — никакой понятности здесь и близко не было. А во вторых — насколько много таких задач, где оба этих критерия жизненно необходимы?
Ты уходишь от проблемы. Сколько бы ни была задача маловероятна и редка на практике, если лично тебе или лично мне придется ее решать (это будет нам выгодно), то решать ее придется. И областей, где важна скорость и эффективность не так уж мало: вычисления (предсказания погоды, расчет прочности и износостойкости, моделирование тектонических и геологических процессов, статистика), системы реального времени с необходимостью проведения больших вычислений (радиолокация), системное ПО (СУБД, web-сервера), телекоммуникации (высокоскоростные каналы) и много еще о чем я не знаю...
И понятность там, кстати, была вполне достаточная. Трехэтажного шаблонного метапрограммирования там уж точно не было.
Еще раз: приведи более понятную запись, которая бы не давала overhead-а в run-time (т.е. compile-time обработка) и генерировала бы высокоэффективный код.
Здравствуйте, Vermicious Knid, Вы писали:
VK>А вообще ни C#, ни Nemerle не конкуренты C++ в том классе задач, где нужны подобные возможности. Ни "zero runtime cost", ни "производительность любой ценой", ни тем более "optimize prematurely!" пожалуй не является девизом ни первого, ни второго языка.
Compile-time проверка размерностей не только производительней чем run-time, но и удобнее.
VK>Из "новых" языков пожалуй только D сможет соперничать с C++ в этом вопросе.
Здравствуйте, Дарней, Вы писали:
Д>И еще актуальнее — сколько программистов сможет понять, как это работает и вообще зачем это нужно, без недельного копания в литературе?
Искренне, не преувеличивая скажу, что приблизительно 100% тех, кому проверка размерностей может быть полезной.
Здравствуйте, eao197, Вы писали:
E>Ты уходишь от проблемы. Сколько бы ни была задача маловероятна и редка на практике, если лично тебе или лично мне придется ее решать (это будет нам выгодно), то решать ее придется. И областей, где важна скорость и эффективность не так уж мало: вычисления (предсказания погоды, расчет прочности и износостойкости, моделирование тектонических и геологических процессов, статистика),
Фортран
E>системы реального времени с необходимостью проведения больших вычислений (радиолокация), системное ПО (СУБД, web-сервера), телекоммуникации (высокоскоростные каналы) и много еще о чем я не знаю...
С, ассемблер, С++ (редко)
Напомню еще раз — не бывает универсальных инструментов. А если кто-то говорит, что некий инструмент решает все проблемы одинаково хорошо — значит, на самом деле он решает все эти проблемы одинаково плохо.
Если передо мной возникнет такая задача, как ты описал — я буду решать ее тем инструментом, который окажется удобнее всего. Может быть, в определенных случаях таковым даже окажется С++
Здравствуйте, Дарней, Вы писали:
Д>Напомню еще раз — не бывает универсальных инструментов. А если кто-то говорит, что некий инструмент решает все проблемы одинаково хорошо — значит, на самом деле он решает все эти проблемы одинаково плохо.
Нужно эти слова к Nemerle для очень горячих голов отнести.
Д>Если передо мной возникнет такая задача, как ты описал — я буду решать ее тем инструментом, который окажется удобнее всего. Может быть, в определенных случаях таковым даже окажется С++
Т.е., в данный момент ты не можешь привести более понятной и эффективной записи этого выражения на языке, отличном от C++?
Пока аналог был приведен только для D. Но D, к сожалению, пока столь же экзотичен, как и Nemerle. Будь это не так, я бы с радостью на него перешел из C++
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
Д>>Напомню еще раз — не бывает универсальных инструментов. А если кто-то говорит, что некий инструмент решает все проблемы одинаково хорошо — значит, на самом деле он решает все эти проблемы одинаково плохо.
E>Нужно эти слова к Nemerle для очень горячих голов отнести.
а никто такого и не говорил. Вполне очевидно например, что немерле не приспособлен для программирования на низком уровне, равно как и для RTS. Ты можешь привести примеры, где кто-то утверждал обратное?
E>Т.е., в данный момент ты не можешь привести более понятной и эффективной записи этого выражения на языке, отличном от C++?
Конкретно этой задачей я не интересовался, поэтому не скажу.
Здравствуйте, Дарней, Вы писали:
E>>... областей, где важна скорость и эффективность не так уж мало: вычисления (предсказания погоды, расчет прочности и износостойкости, моделирование тектонических и геологических процессов, статистика),
Д>Фортран
Проверка размерностей в Фортране?
Напомню: В ответ не утверждение "использование констант в качестве параметров типов довольно бессмысленно", я привел пример, как при помощи "констант в качестве параметров типов" можно реализовать проверку размерностей. Далее последовало:
Д>... сколько программистов сможет понять, как это работает и вообще зачем это нужно, без недельного копания в литературе?
Д>... насколько много таких задач, где оба этих критерия жизненно необходимы?
Теперь правда имеем:
Д>Напомню еще раз — не бывает универсальных инструментов. Д> . . . Д>Если передо мной возникнет такая задача, как ты описал — я буду решать ее тем инструментом, который окажется удобнее всего. Может быть, в определенных случаях таковым даже окажется С++
Здравствуйте, Дарней, Вы писали:
Д>>>Напомню еще раз — не бывает универсальных инструментов. А если кто-то говорит, что некий инструмент решает все проблемы одинаково хорошо — значит, на самом деле он решает все эти проблемы одинаково плохо.
E>>Нужно эти слова к Nemerle для очень горячих голов отнести.
Д>а никто такого и не говорил. Вполне очевидно например, что немерле не приспособлен для программирования на низком уровне, равно как и для RTS. Ты можешь привести примеры, где кто-то утверждал обратное?
VD>Неперле банально проектировался с учетом опыта ML-подобных языков и Хаскеля. Так что функциональная парадигма для него радная. Вот только Немерле — это не чистый ФЯ, и даже не ФЯ с прикрученным к нему императивом и ООП. Немрле — это попытка сделать язык одинаково хорошо поддерживающий множество парадигм.
Одинакого хорошо -- это, очень вероятно, на одинаково сером уровне.
E>Одинакого хорошо -- это, очень вероятно, на одинаково сером уровне.
Дело в том, что Немерле — это не мечтания на тему, а готовый язык с компилятором.
Я его уже попробовал, и смею заверить тебя реализовано все очень достойно. И уши оной парадигмы не мешают другой.
Ты конечно, можешь мне возразить, что там речи не было ни о низком уровне, ни о RTS. Но смысла это не изменит. К тому же обсуждавшийся фрагмент кода на C++ со скалярными параметрами шаблонов ни относился ни к низкому уровню, ни к RealTime.
E>>Т.е., в данный момент ты не можешь привести более понятной и эффективной записи этого выражения на языке, отличном от C++?
Д>Конкретно этой задачей я не интересовался, поэтому не скажу.
Так вот, мало кто скажет. Потому, что когда нужно решать реальные задачи, все разговоры о красиво/не красиво, отрывать/пришивать что-нибудь и пр. остаются в курилке. Поскольку нужно либо написать работающую программу и получить за это деньги, либо провалить проект. И выясняется, что на C++ коряво написать можно, и работать будет. А вот альтернативу найти -- еще попробуй.
Не на Фортране же программировать в 21-м веке, ей богу.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Дарней, Вы писали:
Д>Вполне очевидно например, что немерле не приспособлен для программирования на низком уровне,
+ Д> равно как и для RTS.
А вот здесь поспорю. Пока не подходит. Это ограничение текущей реализации платформы, причём явно временное. Ни сам язык, ни спецификация .NET таких ограничений, вроде, не содержит.
Здравствуйте, eao197, Вы писали:
E>К тому же обсуждавшийся фрагмент кода на C++ со скалярными параметрами шаблонов ни относился ни к низкому уровню, ни к RealTime.
Я не вижу принципиальных проблем в том, чтобы реализовать эту функциональность на макросах Nemerle (ради пресловутого compile-time) — это сделать будет непросто, но и решение на шаблонах непростое. Естественно, это будут не скалярные параметры generic-ов (так делать просто нельзя), а нечто иное.
Я сам думал (ещё до того, как начались все эти обсуждения про физические величины) заимплементать этот код на Nemerle (понравился мне вариант на C++, чего уж там) чисто ради спортивного интереса, но времени нету...
Здравствуйте, Oyster, Вы писали:
O>Я не вижу принципиальных проблем в том, чтобы реализовать эту функциональность на макросах Nemerle (ради пресловутого compile-time) — это сделать будет непросто, но и решение на шаблонах непростое. Естественно, это будут не скалярные параметры generic-ов (так делать просто нельзя), а нечто иное.
говорил.
В общем-то я с вами согласен, смущает меня только то, что в C++ в одном выражении можно будет сочетать operator*() (и другие) для разных типов данных. Например, Physic<A,B,C> еще и на скаляр умножить можно будет -- в самом выражении с использованием операторов это никак не будет явно подчеркиваться. В Nemerle для таких ситуаций, вероятно, еще что-то додумывать придется.
Но поинт здесь был в другом. Хоть на C++ решение и не тривиальное на первый взгляд, но самое сложное в нем -- это додуматься до него. Сама же реализация отнюдь не сложная. Бывают гораздо более сложные навороты (например, проверка чисел на простоту в compile-time). И, возвращаясь к первоначальному замечанию VladD2 о скалярных параметрах шаблонах, вполне себе востребованный и жизнеспособный код.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Одинакого хорошо -- это, очень вероятно, на одинаково сером уровне.
парадигмы — это не задачи. Это разные подходы к решению одной конкретной задачи.
E>Ты конечно, можешь мне возразить, что там речи не было ни о низком уровне, ни о RTS. Но смысла это не изменит. К тому же обсуждавшийся фрагмент кода на C++ со скалярными параметрами шаблонов ни относился ни к низкому уровню, ни к RealTime.
единственная проблема с этим кодом — это требования к быстродействию. Если его отбросить, то задача решается на Немерле без малейших проблем. Но там и вообще с быстродействием пока не очень хорошо. Версия 0.9, всё-таки, да еще pure managed code. Ты это хотел услышать?
E>Так вот, мало кто скажет. Потому, что когда нужно решать реальные задачи, все разговоры о красиво/не красиво, отрывать/пришивать что-нибудь и пр. остаются в курилке. Поскольку нужно либо написать работающую программу и получить за это деньги, либо провалить проект. И выясняется, что на C++ коряво написать можно, и работать будет. А вот альтернативу найти -- еще попробуй.
Программа, которая вся целиком состоит из задачи контроля размерностей?
Здравствуйте, Дарней, Вы писали:
Д>единственная проблема с этим кодом — это требования к быстродействию. Если его отбросить, то задача решается на Немерле без малейших проблем. Но там и вообще с быстродействием пока не очень хорошо. Версия 0.9, всё-таки, да еще pure managed code. Ты это хотел услышать?
Нет. Давай отбросим требования к скорости. Реши ее на Nemerle.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, SilverCloud, Вы писали:
SC>А вот здесь поспорю. Пока не подходит. Это ограничение текущей реализации платформы, причём явно временное. Ни сам язык, ни спецификация .NET таких ограничений, вроде, не содержит.
а я не буду спорить Я говорил именно про текущую реализацию. Что там да как будет потом — это можно только догадываться.
Здравствуйте, eao197, Вы писали:
E>Нет. Давай отбросим требования к скорости. Реши ее на Nemerle.
У меня нет времени заниматься решением умозрительных задач. Если тебя это так сильно интересует, попробуй сам изучить таки язык, который ты критикуешь. А потом рассказать всем, какие принципиальные препятствия, не дающие решить эту задачу, там есть.
Для меня же хватает того факта, что макросы Немерле достаточно мощны, чтобы эмулировать шаблоны С++ один-в-один . Значит, задача так или иначе решается.
Здравствуйте, eao197, Вы писали:
E>В общем-то я с вами согласен, смущает меня только то, что в C++ в одном выражении можно будет сочетать operator*() (и другие) для разных типов данных. Например, Physic<A,B,C> еще и на скаляр умножить можно будет -- в самом выражении с использованием операторов это никак не будет явно подчеркиваться. В Nemerle для таких ситуаций, вероятно, еще что-то додумывать придется.
Насколько я понимаю, оператор * можно сделать макросом и тогда получится оставить "прозрачный" синтаксис.
E>Но поинт здесь был в другом. Хоть на C++ решение и не тривиальное на первый взгляд, но самое сложное в нем -- это додуматься до него. Сама же реализация отнюдь не сложная. Бывают гораздо более сложные навороты (например, проверка чисел на простоту в compile-time). И, возвращаясь к первоначальному замечанию VladD2 о скалярных параметрах шаблонах, вполне себе востребованный и жизнеспособный код.
На самом деле, макросы Nemerle позволяют делать compile-time вычисления проще, потому что — сам понимаешь — в них можно выполнять любой код.
Сейчас дам ма-аленький такой пример. Будем считать факториал в compile-time:
namespace Oyster
{
public module Math
{
// Просто метод, который просто считает факториал в рантаймеstatic public Fact(x : int) : int
{
| 1 => 1
| _ => x * Fact(x - 1)
}
}
}
namespace Oyster.Macro
{
// Макрос
macro Fact(expr)
{
match (expr) {
| <[ $(x : int) ]> => <[ $(Oyster.Math.Fact(x) : int) ]>
| _ => <[ Oyster.Math.Fact($expr) ]>
}
}
}
Макрос Fact или вернёт константу (если передана константа) или вставит вызов Math.Fact (в противном случае). При этом вызов макроса ничем не отличается от вызова функции и оба варианта из примера ниже отработают:
using System.Console;
using Oyster;
// Выведет 720, посчитает в compile-time
WriteLine(Macro.Fact(6));
// Выведет 720, но посчитает в рантайме
def x = 6;
WriteLine(Macro.Fact(x))
Здравствуйте, Дарней, Вы писали:
E>>Нет. Давай отбросим требования к скорости. Реши ее на Nemerle.
Д>У меня нет времени заниматься решением умозрительных задач.
Вот так всегда. На C++ работающий код есть и не в одном экземпляре. Хотя кто-то еще думает, что скаляры в шаблонах не нужны. Поэтому C++ код можно материть и кричать C++ must die (утрируя). Привести пример реально существующей альтернативы имеющий такие же возможности (в данном случае по быстродействию) -- умозрительные задачи.
Д>Если тебя это так сильно интересует, попробуй сам изучить таки язык, который ты критикуешь.
А ты сам его изучил? А то фраза "Для меня же хватает того факта, что макросы Немерле достаточно мощны, чтобы эмулировать шаблоны С++ один-в-один . Значит, задача так или иначе решается" оставляет двойственные впечатления.
И еще, в данной ветке я не критиковал Nemerle. Ни разу.
Я вполне лояльно отношусь к нему. Но хочу, чтобы рассказы о Nemerle были более адекватные, чем "Nemerle рулит!" или "В Nemerle все продумано и уши не торчат", или "поверьте мои словам". А посему хочется, чтобы Nemerle корректно сравнивался с другими языками (моя придирка к OCaml) и чтобы другие языки не обоснованно не критиковались (особенно, если нет понимания необходимости конкретной фичи языка).
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>В общем-то я с вами согласен, смущает меня только то, что в C++ в одном выражении можно будет сочетать operator*() (и другие) для разных типов данных. Например, Physic<A,B,C> еще и на скаляр умножить можно будет -- в самом выражении с использованием операторов это никак не будет явно подчеркиваться. В Nemerle для таких ситуаций, вероятно, еще что-то додумывать придется.
Насчёт этого — можно будет оставить прозрачный синтаксис и без * как макрос, потому что, в конце концов, никто нам не мешает сконструировать новый тип для конкретной физической величины в compile-time в Nemerle с таким вот оператором (собственно, это и происходит в C++ — с помощью шаблонов создаётся куча конкретных типов при компиляции).
Здравствуйте, eao197, Вы писали:
E>Так вот не придется ли тебе в макросе проверять типы выражений и в зависимости от типа левого/правого операнда производить генерацию разного кода?
Здравствуйте, Oyster, Вы писали:
E>>)
O>Не придирайся Забыл написать, что писал на скорую руку Главное ж принцип...
Я не придираюсь, просто показываю, что самые жестокие ошибки чаще всего делаются не столько из-за особенностей языка, сколько из-за человеческого фактора.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Я не придираюсь, просто показываю, что самые жестокие ошибки чаще всего делаются не столько из-за особенностей языка, сколько из-за человеческого фактора.
В таком случае сообщу, что я написал намеренно упрощённый код. Эту ошибку я сделал сознательно для упрощения примера. Вот как
Это дело привычки, на самом-то деле. Люди вон к Lisp-овой нотации привыкают
O>или что-то такое. А что самое главное — можно использовать макрос как с константами, так и с переменными — внутри само разберётся.
+1
А вот это да. Полностью согласен.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Oyster, Вы писали:
O>В таком случае сообщу, что я написал намеренно упрощённый код. Эту ошибку я сделал сознательно для упрощения примера. Вот как
Ты часом к науке не имел отношения? А то я наблюдал, как при передачи статей в журнал некоторые научные деятели намеренно в сложных формулах мелкие ошибки делали (например, кое-где плюсик на минус поменяют). Чтобы никто просто так результатами трудов не воспользовался
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Вот так всегда. На C++ работающий код есть и не в одном экземпляре. Хотя кто-то еще думает, что скаляры в шаблонах не нужны. Поэтому C++ код можно материть и кричать C++ must die (утрируя). Привести пример реально существующей альтернативы имеющий такие же возможности (в данном случае по быстродействию) -- умозрительные задачи.
Для меня сама эта задача — умозрительная, а не детали ее реализации. Потому что я никогда с ней не сталкивался, не сталкиваюсь сейчас и вряд ли когда-нибудь столкнусь в обозримом будущем.
Я вообще не вижу ни малейшего смысла доказывать общее утверждение, доказывая частные случаи. Потому что таким образом всё равно невозможно что-то доказать. Давай будем конструктивнее?
Д>>Если тебя это так сильно интересует, попробуй сам изучить таки язык, который ты критикуешь.
E>А ты сам его изучил? А то фраза "Для меня же хватает того факта, что макросы Немерле достаточно мощны, чтобы эмулировать шаблоны С++ один-в-один . Значит, задача так или иначе решается" оставляет двойственные впечатления.
Знание общих принципов избавляет от необходимости помнить множество деталей (С) Конфуций, если не ошибаюсь.
Того, что я знаю, достаточно, чтобы делать предположения. Но — обоснованные предположения. Если ты считаешь, что в данном случае задача не решается — ты хотя бы объясни для начала, почему?
E>И еще, в данной ветке я не критиковал Nemerle. Ни разу. E>Я вполне лояльно отношусь к нему. Но хочу, чтобы рассказы о Nemerle были более адекватные, чем "Nemerle рулит!" или "В Nemerle все продумано и уши не торчат", или "поверьте мои словам".
Так почему бы не выяснить самому, и не рассказать другим?
Здравствуйте, Дарней, Вы писали:
Д>Так почему бы не выяснить самому, и не рассказать другим?
Очень просто. Я изучаю C++ и рассказываю о нем (точне об инструментах для него). Изучаю Ruby и рассказываю о нем. Все, больше времени нет.
Поэтому о Немерле хотелось бы узнать из чужих рук.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Ты часом к науке не имел отношения?
Нет.
E>А то я наблюдал, как при передачи статей в журнал некоторые научные деятели намеренно в сложных формулах мелкие ошибки делали (например, кое-где плюсик на минус поменяют). Чтобы никто просто так результатами трудов не воспользовался
namespace Oyster
{
public module Math
{
// Просто метод, который просто считает факториал в рантаймеstatic public Fact(x : int) : int
{
| 1 => 1
| _ =>
if (x > 1)
x * Fact(x - 1)
else
throw ArgumentException("x")
}
}
}
Дарней wrote: > тогда расскажи хотя бы, какие принципиальные проблемы ты видишь в > реализации данной задачи на Немерле > очень просто, правда?
1. Интероперабельность с остальным кодом на C#.
2. Куда будет записываться информация о размерности типа?
O>namespace Oyster
O>{
O> public module Math
O> {
O> // Просто метод, который просто считает факториал в рантайме
O> static public Fact(x : int) : int
O> {
O> | 1 => 1
O> | _ =>
O> if (x > 1)
O> x * Fact(x - 1)
O> else
O> throw ArgumentException("x")
O> }
O> }
O>}
O>
Кстати, если сравнить реализацию compile-time вычисления факториала на C++:
template< int N >
struct Factorial {
enum { value = N * Factorial< N-1 >::value };
};
template<>
struct Factorial< 1 > {
enum { value = 1 };
};
template<>
struct Factorial< 0 > {};
то мне кажется, что она получается в более функциональном стиле, что ли И не на много длиннее в реализации.
Вот только синтаксический оверхэд в виде template<> struct под ногами путается
Зато компилятор не дает вычислять факториал нуля
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Кстати, если сравнить реализацию compile-time вычисления факториала на C++:
...
E>то мне кажется, что она получается в более функциональном стиле, что ли
Думаешь? В Nemerle я тоже заюзал матчинг, на самом деле. И какая разница, выглядит матчинг так:
fun(x)
{
| 0 => ...
| 1 => ...
| _ => ...
}
Или так:
fun(0) = ...
fun(1) = ...
fun(x) = ...
E>И не на много длиннее в реализации. E>Вот только синтаксический оверхэд в виде template<> struct под ногами путается E>Зато компилятор не дает вычислять факториал нуля
На Nemerle тоже не даст, естественно, — посмотри, что случится при вызове Oyster.Macro.Fact(0)
В общем-то, главное преимущество Nemerle тут в том, что можно проворачивать более сложные вычисления в compile-time, чем на шаблонах.
Ну и ещё преимущество _имхо_ в том, что фактически пишется тот же код на Nemerle, а не на каком-то другом подъязыке, — просто он выполнится во время компиляции.
Здравствуйте, eao197, Вы писали:
E>Вот только синтаксический оверхэд в виде template<> struct под ногами путается
А теперь вариант на D. Как говорится почувствуйте разницу.
import std.stdio;
// можно и специализацию использовать(или вообще тернарный оператор ? : )
// но я намеренно выбрал самый непохожий на C++ вариантtemplate fact(uint n)
{
static if (n <= 1)
const ulong fact = 1;
else
const ulong fact = n * fact!(n - 1);
}
void main()
{
auto x = fact!(6);
auto y = fact!(50);
// 720 15188249005818642432
writef("%d %d\n", x, y);
}
Правда и D, и C++ не позволяют достичь той же функциональности, что и Nemerle. Хотя D в принципе к этому чуть ближе, т.к. позволяет шаблонам принимать идентификаторы в качестве параметров(а вот выражения к сожалению нет).
E>Зато компилятор не дает вычислять факториал нуля
Это неправильно с точки зрения математики.
Самый близкий к истине вариант привел xbit. А вот полностью идеологически правильный и грамотный(имхо) вариант:
Здравствуйте, Oyster, Вы писали:
O>На Nemerle тоже не даст, естественно, — посмотри, что случится при вызове Oyster.Macro.Fact(0)
Какой именно из вариантов?
O>В общем-то, главное преимущество Nemerle тут в том, что можно проворачивать более сложные вычисления в compile-time, чем на шаблонах.
Ну дык это в Nemerle и подкупает. Т.к. в сложных случаях compile-time вычисления на шаблонах C++, имхо, лучше элементарной кодогенерацией заменять.
O>Ну и ещё преимущество _имхо_ в том, что фактически пишется тот же код на Nemerle, а не на каком-то другом подъязыке, — просто он выполнится во время компиляции.
Ну с виду так не скажешь Из-за <[, ]> и $(). При этом нужно помнить, к переменной из какого контекста ты обращаещься и что следует возвращать как результат макроса.
Кстати, я забыл, в результате работы макроса можно ли сгенерировать код, который внутри к другому макросу будет обращаться? Т.е. обращение к макросу не внутри тела макроса, в том коде который макрос производит? Что-то на эту тему было, но уже не помню где
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
O>>На Nemerle тоже не даст, естественно, — посмотри, что случится при вызове Oyster.Macro.Fact(0)
E>Какой именно из вариантов?
?
Ты сказал, что шаблон выдаст ошибку компиляции, если ноль. Так вот Nemerle сделает то же самое.
O>>Ну и ещё преимущество _имхо_ в том, что фактически пишется тот же код на Nemerle, а не на каком-то другом подъязыке, — просто он выполнится во время компиляции.
E>Ну с виду так не скажешь Из-за <[, ]> и $(). При этом нужно помнить, к переменной из какого контекста ты обращаещься и что следует возвращать как результат макроса.
Поэтому _имхо_ — не хочется об этом дискутировать.
E>Кстати, я забыл, в результате работы макроса можно ли сгенерировать код, который внутри к другому макросу будет обращаться? Т.е. обращение к макросу не внутри тела макроса, в том коде который макрос производит? Что-то на эту тему было, но уже не помню где
Макрос всегда развернётся внутри. А зачем такое надо? Ведь макрос всё равно развернётся в итоге — какая разница, внутри или снаружи это произойдёт?
Здравствуйте, WolfHound, Вы писали:
WH>...То никакой динамической памяти не понадобится. Болие того оптимизатор может это все разложить по регистрам. WH>Эта замена при компиляции на VC++8 разагнала boost::math::quaternion в 15 раз.
А нельзя ли просто воспользоваться отдельными переменными вместо массива?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
VD>>Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него?
FR>Достаточно того что он допер. Остальные могут использовать.
Это не ответ на мой вопрос.
VD>>Склько программистов используют подобные приколы в своем коде?
FR>Обычно подобный код сидит в библиотеках, а тот же boost уже достаточно массово используется.
Примеры, именно такого использования приведи, плиз.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Ты сказал, что шаблон выдаст ошибку компиляции, если ноль. Так вот Nemerle сделает то же самое.
По-моему, твой первый вариант выдал бы 0, но после длительных вычислений в compile-time. Не так?
E>>Кстати, я забыл, в результате работы макроса можно ли сгенерировать код, который внутри к другому макросу будет обращаться? Т.е. обращение к макросу не внутри тела макроса, в том коде который макрос производит? Что-то на эту тему было, но уже не помню где
O>Макрос всегда развернётся внутри. А зачем такое надо? Ведь макрос всё равно развернётся в итоге — какая разница, внутри или снаружи это произойдёт?
Да просто задумался о глубине вложенных в друг-друга макросов, из которых вызываются функции, из которых вызываются другие макросы и т.д. Но, собственно, не важно. Просто хотел уточнить.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Vermicious Knid, Вы писали:
VK>А теперь вариант на D. Как говорится почувствуйте разницу.
Ну очень мне нравится D. Вот только библиотеками он обеспечен пока очень мало
В этом плане у Nemerle очень выигрышная позиция -- он то предоставляет доступ к .NET Framework.
E>>Зато компилятор не дает вычислять факториал нуля VK>Это неправильно с точки зрения математики.
Да, действительно. Но это легко исправляется. Код даже меньше получится:
template< int N >
struct Factorial {
enum { value = N * Factorial< N-1 >::value };
};
Oyster wrote: > C>1. Интероперабельность с остальным кодом на C#. > А как насчёт интероперабельности решения на C++ с остальным кодом на Си?
В С++ с интероперабельностью все нормально.
> Всё-таки Nemerle — это не C#, это совсем другой язык.
Тем не менее, интероперабельность нужна.
> C>2. Куда будет записываться информация о размерности типа? > В код — куда же ещё?
Я понял. А где оно в скомпилированом виде будет храниться? Или как с
template'ами в С++ — при компиляции нужен исходный код?
Здравствуйте, eao197, Вы писали:
E>Кстати, я забыл, в результате работы макроса можно ли сгенерировать код, который внутри к другому макросу будет обращаться? Т.е. обращение к макросу не внутри тела макроса, в том коде который макрос производит? Что-то на эту тему было, но уже не помню где
Как ни странно — легко. Вот вариация на тему макроса Oyster'а:
kan_izh wrote:
> Зачем тут valarray?
Хотя да, понял, для красоты. fixed_valarray ещё есть смысл использовать ради этого, но valarray — действительно странно.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Cyberax, Вы писали:
>> C>1. Интероперабельность с остальным кодом на C#. >> А как насчёт интероперабельности решения на C++ с остальным кодом на Си? C>В С++ с интероперабельностью все нормально.
В Nemerle тоже, пока код, который использует "физические величины", будет на Nemerle. Т.е. тут как и с C++.
>> Всё-таки Nemerle — это не C#, это совсем другой язык. C>Тем не менее, интероперабельность нужна.
Она есть
>> В код — куда же ещё? C>Я понял. А где оно в скомпилированом виде будет храниться?
В макробиблиотеке — просто подключаемая сборка.
C>Или как с C>template'ами в С++ — при компиляции нужен исходный код?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
VD>>>Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него?
FR>>Достаточно того что он допер. Остальные могут использовать.
VD>Это не ответ на мой вопрос.
многие, после того как прочитали Александреску и Со, или просто немного понимают функцианольное программирование.
VD>>>Склько программистов используют подобные приколы в своем коде?
FR>>Обычно подобный код сидит в библиотеках, а тот же boost уже достаточно массово используется.
VD>Примеры, именно такого использования приведи, плиз.
Примеры использования boost?
Это уже почти тоже что просить показать примеры использования FCL
VK>А теперь вариант на D. Как говорится почувствуйте разницу. VK>[ccode] VK>import std.stdio;
VK>// можно и специализацию использовать(или вообще тернарный оператор ? : ) VK>// но я намеренно выбрал самый непохожий на C++ вариант VK>template fact(uint n) VK>{ VK> static if (n <= 1) VK> const ulong fact = 1; VK> else VK> const ulong fact = n * fact!(n — 1); VK>}
Это с какой версии он начал такое переваривать?
У меня v0.122 не понимает, вообще интересно что там еще нового есть?
Здравствуйте, eao197, Вы писали:
E>Да просто задумался о глубине вложенных в друг-друга макросов
Глубина произвольная. Компилятор не ставит никаких ограничений. Пример с макросом FactRec правда вызывает ошибку компиляции на больших константах, но это из-за переполнения вычисляемой константы, а не из-за проблем с глубиной вложенных выражений. Он собственно так и пишет:
the operation overflows at compile-time during constants folding in checked mode
За что кстати ему большое спасибо, так как D не удосуживается такое написать скажем при вычислении факториала от 50.
E>из которых вызываются функции, из которых вызываются другие макросы и т.д. Но, собственно, не важно. Просто хотел уточнить.
Напомню, что даже элементарные синтаксические конструкции типа if, while, for, foreach это макросы. Макросы на самом деле это очень масштабируемая штука. Компилятор Nemerle только стартует не очень быстро(скорее всего из-за проблем которые сейчас есть со стандартной библиотекой и global assembly cache, а еще правда какое-то время тратиться на поиск макросов по сборкам), а работает он весьма шустро. И использование сложных макросов практически не замедляет работу, все таки макросы это скомпилированный код.
А по поводу функций из которых вызываются другие макросы — они же не вызываются каждый раз при вызове этих функций. Достаточно и одного раза.
Это уже пошел злостный оффтопик.
FR>Это с какой версии он начал такое переваривать?
У меня версия 0.150.
FR>У меня v0.122 не понимает,
В версии 0.122 это можно было сделать, просто без static if.
FR>вообще интересно что там еще нового есть?
По changelog и документации можно попытаться отследить. Самые большие изменения конечно в шаблонах, по этому поводу можно почитать вот это.
Здравствуйте, Cyberax, Вы писали:
C>В С++ с интероперабельностью все нормально.
и для шаблонов тоже?
конкретно тот код, который здесь обсуждается — ты сможешь использовать его в любом языке, кроме плюсов?
Да ты его даже не на каждом компиляторе С++ использовать сможешь
Здравствуйте, Oyster, Вы писали:
O>Попробуй скомпилить — скажет, что не все ветки возвращают значения. Для того, чтобы это понять, Nemerle знать не надо — достаточно знать тот же C++
Вообще-то match в Немерле просто неявно дописывает возбуждение исключения для не перекрытого диапазона значений и выдается предупрждение компилятора. Но вот if без else недопустим.
Наверно самая разумная запись будет:
def Fact(x : int) : int
{ | 0
| 1 => 1
| x when x > 0 => x * Fact(x - 1)
| _ => throw ArgumentException("x")
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Самый близкий к истине вариант привел xbit. А вот полностью идеологически правильный и грамотный(имхо) вариант: VK>
А вообще, когда я вижу примеры факториала с Фибоначи, то понимаю, что начилась функциональная пенесометрия.
Главное, что по жизни подобный код невозможно встретить днем с огнем. Но как только появляется функциональный язык, то в примерах раз за разом появляются Финбоначи и факториалы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Ты уходишь от проблемы. Сколько бы ни была задача маловероятна и редка на практике, если лично тебе или лично мне придется ее решать (это будет нам выгодно), то решать ее придется.
Ключевое слово здесь "если". В качестве примеров приводятся крайне радкие на практике и в общем-то решаемые другими средствами задачи, но при этом на них делается такой акцент, что может показаться, что именно из-за этого программисты выбирают С++.
Что же мы видим? Мы видим дизайнерское решение языкостроителей довольно редко дающее реальный бенефит на практике (так как обычно есть множество других, более эффективных, методов решения проблем) которое (обычно в сочетании с ручной специализацией шаблонов) дает эффект который позволяет использовать данное средство не по назначеню.
Результаты этого решения...
Сначала позитивные:
1. Возможность упростить решение очень узкого класса задач.
2. Возможность метапрограммирования.
Теперь негативные:
1. Усложнение языка и (в особенности) компиляторов.
2. Море малопонятного, трудного в отладке, выдающего ужасные диагностические сообщения, медленно компилируемого, порождающего огромные количества ненужных временных типов кода.
3. Ограниченность решения связанная с тем, что типы можно параметризовать только целочисленными константами которые к тому же не могут получаться компилятором извне.
Косвенные эффекты:
1. В язык не встраивают нужное программистам конструкции обосновывая это решение, что данные конструкции можно с горем (нехилым) попалам организовать в виде библиотеки.
2. В язык не вводится штатная система метапрограммирования на том основании, что она как бы есть (вернее появилась сама собой).
Альтернатива в лице Немерла предлагает полноценную систему метапрограммирования позволяющую решать бошьший класс задач, предоставляя удобную отладку, возможность использовать основной язык в метакоде, возможность обращаться к внешним источникам информации, порождать дополнительные данные (не только код).
Плюсы подхода очевидны. Минус только один. Конкретная задача на которой заострено внимание решается менее элегантно (с большими трудозатратами).
Теперь собственно вопрос. Какова цель таких примеров?
Мне кажется это всего лишь хорошо придуманный прием защиты далеко не лучшего решения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Дарней, Вы писали:
E>>Нужно эти слова к Nemerle для очень горячих голов отнести.
Д>а никто такого и не говорил. Вполне очевидно например, что немерле не приспособлен для программирования на низком уровне,
+1
В нем вообще нет небезопастных конструкций.
Д> равно как и для RTS.
А вот это не факт. В самом языке нет никаких ораничений в поддержке СРВ. Ограничения есть в реализации дотната. Но это не языковая проблема.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Я не вижу принципиальных проблем в том, чтобы реализовать эту функциональность на макросах Nemerle (ради пресловутого compile-time) — это сделать будет непросто, но и решение на шаблонах непростое. Естественно, это будут не скалярные параметры generic-ов (так делать просто нельзя), а нечто иное.
+1
O>Я сам думал (ещё до того, как начались все эти обсуждения про физические величины) заимплементать этот код на Nemerle (понравился мне вариант на C++, чего уж там) чисто ради спортивного интереса, но времени нету...
Откровенно говоря мне подобные узкоспецифические задачи не интересны. Но можно сделать ход конем и предложить решить задачку авторов языка. Думаю, что им это может быть интересно, так как они в принципе люди науки.
Кто у нас может хорошо сформулировать вопрос на английском?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Но поинт здесь был в другом. Хоть на C++ решение и не тривиальное на первый взгляд, но самое сложное в нем -- это додуматься до него. Сама же реализация отнюдь не сложная. Бывают гораздо более сложные навороты (например, проверка чисел на простоту в compile-time). И, возвращаясь к первоначальному замечанию VladD2 о скалярных параметрах шаблонах, вполне себе востребованный и жизнеспособный код.
Вот, вот, вот. Замечательный пример!
Он как раз демонстрирует как примитивная задача будучи решенная через задницу становится "гораздо более сложным наворотом".
Вот проверить число на то является ли оно простым примитивнейшая задача для Немерла (если конечно знать алгоритм проверки/иметь готовый список), так как его макросы это просто код выполняемый во время компиляции.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Сейчас дам ма-аленький такой пример. Будем считать факториал в compile-time:...
Еще про частичные вычисления нужно не забывать (http://nemerle.org/Partial_evaluation), так как порой можно если не вычислить все заранее, то хотя бы ускорить вычисления предварительными рассчетами. Хорой пример здесь парсинг чего угодно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Учитывая не нениальный оптимизатор данный код окажется самым шустрым, так как он использует концевую рекурсию. Компилятор развернет концевую рекурсии и подставить вычисление прямо по месту. Думаю процентов 20% на этом можно выиграть.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Кстати, раз уж мы говорим о функциональном языке, то факториалы лучше тоже в функциональном стиле описывать:
Код который ты привел крайне похож на то, что генерирует макрос for. Уж проще воспользоваться им. Ну его к черту, этот функциональный стиль. В этой задаче он ни к чему, особенно если он не способствует улучшению читабельности.
Здравствуйте, VladD2, Вы писали:
VD>Думаю, что им это может быть интересно, так как они в принципе люди науки. VD>Кто у нас может хорошо сформулировать вопрос на английском?
Я как-то задавал подобные вопросы авторам языка. Судя по ответам их подобные задачи совсем не интересуют. Это было достаточно давно и вопросы были о проблемах и упрощении реализации аналога expression templates на Nemerle.
Мой подход был как раз заключался в использовании макро-операторов и проверке типов. Тогда честно говоря возникали серьезные проблемы с таким подходом. Сейчас ситуация возможно изменилась, но я думаю не сильно.
Зато мои собственные взгляды на программирование с тех пор сильно изменились и подобные вещи мне теперь даром не нужны. Если кто-то такое заимплементирует, то никаких положительных эмоций лично у меня не возникнет. Тем более если это будут разработчики языка. Больше пользы будет если они потратят это время на фиксинг багов.
Здравствуйте, VladD2, Вы писали:
VD>Не понял этого шаманства. Соственно вот так будет достаточно:
Извини, но у меня сейчас настроение препаршивое. Я бы с радостью его еще кому-нибудь бы испортил, но делать в отличие от тебя этого не буду.
Скажу лишь, что даже такой маленький кусочек кода можно улучшать хоть до бесконечности. Почему-то каждый умник, включая меня, считает что хорошо бы если самую лучшую и последнюю ревизию написал бы именно он. Мне в подобных соревнованиях учавствовать не интересно, но иногда к сожалению поддаюсь на провокации.
VD>Главное, что по жизни подобный код невозможно встретить днем с огнем.
А вот с этим соглашусь.
А слабо во время компиляции посчитать нечто типа double, стоку или скажем дату?
Например, посчитай во время компиляции сколько будет 1.234 + 123.23232.
Ну, и еще было бы интересно поглядеть на то как можно вызвать некий библиотечный метод.
Например, сделай просешую вещь. Сгенерируй код функции который при ее вызове выведет время и дату компиляции.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Кстати, если сравнить реализацию compile-time вычисления факториала на C++: E>
E>template< int N >
E>struct Factorial {
E> enum { value = N * Factorial< N-1 >::value };
E>};
E>template<>
E>struct Factorial< 1 > {
E> enum { value = 1 };
E>};
E>template<>
E>struct Factorial< 0 > {};
E>
E>то мне кажется, что она получается в более функциональном стиле, что ли
Не, она получается запутанной и корявой.
Почему вычисление во время компиляции должно отличаться от того же самого в рантайме?
На Немерле тоже самое будет выглядить естественно, и просто так как будет просто использовать туже версию функции, что и при рантайм вычисления.
Вот код библиотеки содержащей макрос CompileTimeFactorial() и функцию Factorial().
using System;
macro CompileTimeFactorial(x : uint)
{
// Приведение типов (второй : ulong) требуется из-за ошибки в компиляторе :(
<[ ($(Math.Factorial(x) : ulong) : ulong) ]>
}
public module Math
{
public static Factorial(x : uint) : ulong
{
def Loop(acc : ulong, x : uint)
{
if (x <= 1) acc else Loop(acc * x, x - 1)
}
Loop (1UL, x)
}
}
А вот применение того и другого:
using System.Console;
WriteLine(Math.Factorial(20));
WriteLine(Math.Factorial(0));
WriteLine(CompileTimeFactorial(0));
WriteLine(CompileTimeFactorial(1));
WriteLine(CompileTimeFactorial(7));
WriteLine(CompileTimeFactorial(20));
Если попытаться подставить в макрос или функцию отрицательное число:
using System.Console;
WriteLine(Math.Factorial(-1));
WriteLine(CompileTimeFactorial(-1));
то компилятор корректно сообщит об ошибке:
test-014.n:3:11:3:25: error: in argument #1 (x), needed a System.UInt32, got int: System.Int32 is not a subtype of System.UInt32 [simple require]
test-014.n:3:11:3:25: error: typing error in call
test-014.n:4:11:4:31: error: macro `CompileTimeFactorial' expects following list of arguments: (uint) got some 1 parameters [-1]
Жаль, правда, что по разному.
Попытка подсунуть в макрос динамическое значение тоже не пройдет:
using System.Console;
def x = 7;
WriteLine(CompileTimeFactorial(7));
выдаст:
test-014.n:4:11:4:31: error: macro `CompileTimeFactorial' expects following list of arguments: (uint) got some 1 parameters [x]
Можно написать макрос чуть сложнее. Тогда можно будет научить его вынимать константные значения.
ЗЫ
В общем-то оптимизация факториала смысла не имеет из-за малого объема вычислений (при больших значениях параметра он просто вызовет переполнение, а при малых количество итераций мизерно), но этот пример хорошо демонстрирует идеологию вычислений во время компиляции. А именно, то что во время вычислений во время компиляции можно использовать обычные фукнции используемые в рантайме.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vermicious Knid, Вы писали:
VD>>Не понял этого шаманства. Соственно вот так будет достаточно: VK>Извини, но у меня сейчас настроение препаршивое.
Хм. Похоже на то.
VK>Я бы с радостью его еще кому-нибудь бы испортил, но делать в отличие от тебя этого не буду.
Похоже именно это ты и сделал. Ладно, развивать разговор в подобном ключе мне не хочется.
Что до "Почему-то каждый умник, включая меня, считает что хорошо бы если самую лучшую и последнюю ревизию написал бы именно он", то глупо соревноваться в том, что давно написано в учебниках на все лады. Я написал свое сообщение исключительно с одной целью, чтобы у тех кто не знает языка не сложилось впечатление, что в нем нужно писать загадочные лишние кострукции.
Извини если тебя это задело.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vermicious Knid, Вы писали:
VD>>Кстати, раз уж мы говорим о функциональном языке, то факториалы лучше тоже в функциональном стиле описывать:
VK>Код который ты привел крайне похож на то, что генерирует макрос for.
Естественно.
VK> Уж проще воспользоваться им. Ну его к черту, этот функциональный стиль. В этой задаче он ни к чему, особенно если он не способствует улучшению читабельности.
Откровенно говоря не вижу в данном случае особой разницы.
def Fact(x : uint) : ulong
{
mutable acc = 1UL;
for (mutable i = x; i > 0; i--)
acc = acc * i;
acc
}
Немерле мне тем и нравится, что можно выбирать стиль под задачу, отталкиваясь от того как она тебе видится. Например, когда я думаю о древесных задачях, то мне они видятся как рекурсивные и преобрзование их в итерацию приводит к ступору.
Однако если уж используется рекурсия, то глупо отакзываться от концевой рекурсии. Ведь это точно даст выигрыш в скорости. А ввести внутреннюю функцию и акумулятор не проблема.
ЗЫ
Похоже у тебя и правда плохое настроение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Я как-то задавал подобные вопросы авторам языка. Судя по ответам их подобные задачи совсем не интересуют. Это было достаточно давно и вопросы были о проблемах и упрощении реализации аналога expression templates на Nemerle.
В общем, разумно.
VK>Если кто-то такое заимплементирует, то никаких положительных эмоций лично у меня не возникнет. Тем более если это будут разработчики языка.
Тут ты не прав. Авторы языка могут подсказать решение которое для нас не очевидно. Ведь они скорее всего зудумывались над подобными вопросами.
VK>Больше пользы будет если они потратят это время на фиксинг багов.
Согласен. Я собственно и сам говорю, что это балоство. Но все же мнение авторов языка интересно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
FR>многие, после того как прочитали Александреску и Со, или просто немного понимают функцианольное программирование.
Данный вопрос ни к ФП, ни к Александреску отношения не имеет. Это именно что прямое использование возможности параметризовать тип константами и получить эффект от того, что компилятор генерирует уникальные типы для разных значений констант.
VD>>Примеры, именно такого использования приведи, плиз.
FR>Примеры использования boost?
Примеры из буста, раз уж в прикладном коде подобное встретить невозможно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
E>Это дело привычки, на самом-то деле. Люди вон к Lisp-овой нотации привыкают
Привыкание к грязи не является достижением. Но в случае С++ можно воспользоваться родными макросами и убрать эту грязь. Так что не так смертельно.
Проблема тут в другом. Метапрограммирование на макросах сильно ограничено по возможнсотям, очень неудобно в отладке, страшно в восприятии. Одинм словом, криво.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Дарней, Вы писали:
SC>>А вот здесь поспорю. Пока не подходит. Это ограничение текущей реализации платформы, причём явно временное. Ни сам язык, ни спецификация .NET таких ограничений, вроде, не содержит.
Д>а я не буду спорить Я говорил именно про текущую реализацию. Что там да как будет потом — это можно только догадываться.
Не, ты говорил про язык. Эдак можно и про С++ это сказать. Ведь есть же МС++?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
>> тогда расскажи хотя бы, какие принципиальные проблемы ты видишь в >> реализации данной задачи на Немерле >> очень просто, правда? C>1. Интероперабельность с остальным кодом на C#.
C# то тут причем? Или проблем с интероперабельностью между решением на С++ и C# нет?
C>2. Куда будет записываться информация о размерности типа?
Например, в параметры атрибута.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>многие, после того как прочитали Александреску и Со, или просто немного понимают функцианольное программирование.
VD>Данный вопрос ни к ФП, ни к Александреску отношения не имеет. Это именно что прямое использование возможности параметризовать тип константами и получить эффект от того, что компилятор генерирует уникальные типы для разных значений констант.
Прямого отношения не имеет, но замечал тот кто любит ковырятся в шаблонах намного легче осваивает функциональщину (принимает не всегда, но во всяком случае понимает быстро, а то я тут уже и с клиническими случаями встречался )
VD>>>Примеры, именно такого использования приведи, плиз.
FR>>Примеры использования boost?
VD>Примеры из буста, раз уж в прикладном коде подобное встретить невозможно.
Так мое мнение: такой код и не должен быть прикладным, он должен лежать в библиотеках.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, eao197, Вы писали:
VD>А слабо во время компиляции посчитать нечто типа double, стоку или скажем дату?
double легко и даже без шаблонов.
VD>Например, посчитай во время компиляции сколько будет 1.234 + 123.23232.
1.234 + 123.23232. такое даже компиляторы восьмилетней давности без проблем считали. Современные целые цепочки вызвов функции умеют в одну ассемблерную инструкцию превращать.
VladD2 wrote: > C>В С++ с интероперабельностью все нормально. > Знашь какой один из самых часто задаваемых вопросов в форуме .NET? > Как передать в программу на C# класс из неуправляемого С++.
Я говорил про интероперабельность с С.
Здравствуйте, VladD2, Вы писали:
VD>А нельзя ли просто воспользоваться отдельными переменными вместо массива?
Можно. Но ты же сам за абстракции. Причем если valarray дает нехилый abstraction penalty то код с fixed_valarray свободен от этого недостатка.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Cyberax, Вы писали:
>> C>В С++ с интероперабельностью все нормально. >> Знашь какой один из самых часто задаваемых вопросов в форуме .NET? >> Как передать в программу на C# класс из неуправляемого С++. C>Я говорил про интероперабельность с С.
Интероперабельность Nemerle с C# присутствует как минимум в том же виде, что и интероперабельность C++ с Си.
Здравствуйте, FR, Вы писали:
FR>1.234 + 123.23232. такое даже компиляторы восьмилетней давности без проблем считали. Современные целые цепочки вызвов функции умеют в одну ассемблерную инструкцию превращать.
Ты путаешь оптимизацию и вычисления во время компиляции. Это хоть и близкие но всетки разные вещи.
Вот это вычисления во время компиляции
template< int N >
struct Factorial {
enum { value = N * Factorial< N-1 >::value };
};
template<>
struct Factorial< 0 > {
enum { value = 1 };
};
...
int i = Factorial< 0 >::value;
VladD2 wrote: > C# то тут причем? Или проблем с интероперабельностью между решением на > С++ и C# нет?
Немерль — это расширение C#, так же как С++ — это расширение С.
Вот мне и интересно узнать как реализован interop.
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, FR, Вы писали:
FR>>1.234 + 123.23232. такое даже компиляторы восьмилетней давности без проблем считали. Современные целые цепочки вызвов функции умеют в одну ассемблерную инструкцию превращать. WH>Ты путаешь оптимизацию и вычисления во время компиляции. Это хоть и близкие но всетки разные вещи. WH>Вот это вычисления во время компиляции
Так и то другое все-таки вычисления во время компиляции(что и просил Влад). Кстати прописано ли в стандарте что вариант с шаблонами обязан раскрыватся имено во время компиляции или это тоже результат оптимизации?
Здравствуйте, Cyberax, Вы писали:
C>Немерль — это расширение C#, так же как С++ — это расширение С. C>Вот мне и интересно узнать как реализован interop.
О как! Немерле это не расширение C#. Откуда ты это вобще взял? Немерле это еще один язык для .NET. И интероп между немерле, C#, F#, VB.NET и тп идет через .NET.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
WolfHound wrote: > C>Немерль — это расширение C#, так же как С++ — это расширение С. > C>Вот мне и интересно узнать как реализован interop. > О как! Немерле это не расширение C#. Откуда ты это вобще взял? Немерле > это еще один язык для .NET. И интероп между немерле, C#, F#, VB.NET и тп > идет через .NET.
Прекрасно, заменим на политкорректное: "А как Немерь интероперирует с
остальными языками .NET?"
Здравствуйте, Cyberax, Вы писали:
C>Прекрасно, заменим на политкорректное:
Это не политкорректность, а элементарное знание предметной обласити.
C>"А как Немерь интероперирует с остальными языками .NET?"
Точно также как C++/CLI и C#. В чем проблема то? Проблем с интеропом между языками .NET нет вобще.
Ессно вещи которые не поддержывает .NET на прямую интеропнуть нельзя. Те например нельзя шаблон из C++/CLI использовать в C#. Но результат работы этого шаблоны вполне.
Точно также как нельзя использовать шаблоны из С++ в С. Но если спрятать шаблоны за С интерфейсом то результатом этого шаблона можно воспользоваться.
С немерле и его макросами таже петрушка. Сами макросы можно использовать только в программах на намерле. А вот сборку которая получилась можно использовать из любого языка .NET.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
WolfHound wrote: > C>Прекрасно, заменим на политкорректное: > Это не политкорректность, а элементарное знание предметной обласити.
Вы еще скажите, что остальные языки .NET кардинально отличаются от C#...
> C>"А как Немерь интероперирует с остальными языками .NET?" > Точно также как C++/CLI и C#. В чем проблема то? Проблем с интеропом > между языками .NET нет вобще.
Угу. Передайте граф объектов из IronPython в Ruby.NET, к некоторым
объектам в графе добавьте по несколько новых методов, затем распечатайте
этот граф из Nemerle.
И как там с интероперабельностью?
> Точно также как нельзя использовать шаблоны из С++ в С. Но если спрятать > шаблоны за С интерфейсом то результатом этого шаблона можно воспользоваться. > С немерле и его макросами таже петрушка. Сами макросы можно использовать > только в программах на намерле. А вот сборку которая получилась можно > использовать из любого языка .NET.
В результате работы получаются сборка. Информация о размерностях величин
хранится в каких-то атрибутах — было бы неплохо уметь с ними работать
через какой-то внешний интерфейс. Чего-то типа Foreign Nemerle Interface.
Здравствуйте, Cyberax, Вы писали:
C>Вы еще скажите, что остальные языки .NET кардинально отличаются от C#...
Следует переформулировать: у всех .NET-языков есть т.н. CLS (Common Language Subset) — некая общая часть, которую они все должны поддерживать. Так что можно вообще сказать, что все языки .NET не отличаются друг от друга.
C>Угу. Передайте граф объектов из IronPython в Ruby.NET, к некоторым C>объектам в графе добавьте по несколько новых методов, затем распечатайте C>этот граф из Nemerle.
C>И как там с интероперабельностью?
А теперь сделайте то же самое с C++ и Си: передайте граф объектов из C++ в Си, к некоторым объектам добавьте по несколько новых методов, затем распечатайте этот граф из Objective-C.
Естественно, что language-specific фичи вроде макросов или рантайм-геренации методов как в Ruby так и остаются language-specific — выходят за рамки CLS. С этим никто и не спорит.
C>В результате работы получаются сборка. Информация о размерностях величин C>хранится в каких-то атрибутах — было бы неплохо уметь с ними работать C>через какой-то внешний интерфейс. Чего-то типа Foreign Nemerle Interface.
Зачем? Макросы Nemerle — это макросы Nemerle и никого другого. Кроме того, если к классу применяются макросы-атрибуты, то Nemerle на классе оставит специальный атрибут MacroAttribute, из которого можно будет извлечь некоторую инфу о макросе (имя, часть параметров, возможно) впоследствии (с помощью reflection, например).
Кроме того, никто нам не мешает в таком макросе самим делать всё, что угодно, чтобы предоставить какую-то дополнительную информацию коду на том же C#.
Здравствуйте, Cyberax, Вы писали:
C>Угу. Передайте граф объектов из IronPython в Ruby.NET, к некоторым объектам в графе добавьте по несколько новых методов, затем распечатайте этот граф из Nemerle.
Только после того как ты воспользуешься макросами Nemerle в C#, шаболоном из C++/CLI в VB.NET и шаблоном С++ в С.
C>В результате работы получаются сборка. Информация о размерностях величин хранится в каких-то атрибутах — было бы неплохо уметь с ними работать через какой-то внешний интерфейс. Чего-то типа Foreign Nemerle Interface.
В результате работы получается сборка с таким классом
public class СуперСчитатель
{
public Результат Посчитать(Параметры параметры)
{
...
}
}
Этот класс можно использовать из любого языка .NET
И никаких атрибутов и никакой Foreign Nemerle Interface не нужен.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Проблема тут в другом. Метапрограммирование на макросах сильно ограничено по возможнсотям, очень неудобно в отладке, страшно в восприятии. Одинм словом, криво.
Конкретно в этом месте речь шла не о метапрограммировании на шаблонах, а о compile-time вычислениях на шаблонах. Имхо, это все же разные вещи. А применительно к compile-time вычислениям я не вижу принципиальной разницы между записями:
fact<6>::value
и
Macro.Fact(6)
смысл одного и другого для человека, разбирающегося в C++ и Nemerle понятен.
Что же касается моего мнения по поводу сложных compile-time вычислений в C++, то ты его можешь прочитать здесь
Здравствуйте, VladD2, Вы писали:
VD>Почему вычисление во время компиляции должно отличаться от того же самого в рантайме?
Ну, например, потому, что в коде инициировать compile-time вычисления ты все равно будешь явно. Ты же пишешь CompileTimeFactorial. Если же вспомнить пример Oyster-а, где не видно по записи, какое именно вычисление будет использоваться, то его реализация так же разбита на две разные части.
Если же ты о том, что для реализации compile-time вычислений приходиться писать свой код вместо библиотечного, то у меня на этот счет совсем другое мнение -- я думаю, что кодогенерация здесь может быть выгоднее. Зачем при каждой компиляции повторно перевычислять то, что можно вычислить один раз, сохранить в файле и все.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
VD>Например, посчитай во время компиляции сколько будет 1.234 + 123.23232. VD>Например, сделай просешую вещь. Сгенерируй код функции который при ее вызове выведет время и дату компиляции.
Экзаменатор и студент.
Э: Вы будете отвечать на один сложный вопрос или на три простых?
С: На один сложный.
Э: Хорошо. Сколько байт в мегабайте?
С: Много!
Э: Сколько "много"?
С: Это уже второй вопрос!
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Cyberax, Вы писали:
C>Немерль — это расширение C#, так же как С++ — это расширение С. C>Вот мне и интересно узнать как реализован interop.
Немерле — это гибрид C#-а, ML-я, и макросов Схемы. Расширением C# он не является.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>Прекрасно, заменим на политкорректное: "А как Немерь интероперирует с C>остальными языками .NET?"
Отлично. Немерле являеся CLI-провайдером и потребителем. Так что на нем ожно писать библиотеки для других языков и из него можно использовать чужие библиотеки.
Кстати, макросы можно писать даже на C#. Ведь макрос — это просто класс реализующий некоторый интерфейс. Проблема только в том, что без псевдоцитирования и сопоставления с образцом это будет делать крайне неудобно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>WolfHound wrote: >> C>Прекрасно, заменим на политкорректное: >> Это не политкорректность, а элементарное знание предметной обласити. C>Вы еще скажите, что остальные языки .NET кардинально отличаются от C#...
Еще как скажу. Сравни, например, F# (Caml), Лисп или Питон. Неужели они копии C#-а?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Следует переформулировать: у всех .NET-языков есть т.н. CLS (Common Language Subset) — некая общая часть, которую они все должны поддерживать. Так что можно вообще сказать, что все языки .NET не отличаются друг от друга.
Все несколько сложнее. Есть понятие CLS consumer (потребитель) и CLS producer. Языки которые могут только потреблять типы из других языков должны реализовывать требования CLS-потребителя. А языки которые хотят сами экспотрировать типы для других языков должны реализовывать требования CLS-провайдера.
Потеницально язык может жить на дотнете и не реализовывать целиком обе спецификации. Но по жизни большинство языков реализуют требования CLS-потребителя. Немерле реализует требования обоих спецификаций CLS consumer и CLS producer.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Ну, например, потому, что в коде инициировать compile-time вычисления ты все равно будешь явно. Ты же пишешь CompileTimeFactorial. Если же вспомнить пример Oyster-а, где не видно по записи, какое именно вычисление будет использоваться, то его реализация так же разбита на две разные части.
Ну понятно, что в реализации надо уже явно указывать, что вычисление на этапе компиляции производится — куда уж тут деться. По-моему, Nemerle тут хорош хотя бы уже тем, что можно как явно указывать что вычисление производится на этапе компиляции, так и проводить его неявно. Что нравится, то и делаешь.
Кстати, можно написать макрос, который будет пытаться вычислить результат любой функции на этапе компиляции или, если не получится, вставлять её вызов Естественно, такой макрос можно будет использовать только для детерминированных функций (разумное требование для любых compile-time вычислений).
E>Если же ты о том, что для реализации compile-time вычислений приходиться писать свой код вместо библиотечного, то у меня на этот счет совсем другое мнение -- я думаю, что кодогенерация здесь может быть выгоднее. Зачем при каждой компиляции повторно перевычислять то, что можно вычислить один раз, сохранить в файле и все.
Полностью согласен с тобой — давай экономить время на этапе компиляции! Миллисекунды на дороге не валяются!! Про удобство использования такой схемы скромно умолчу...
Здравствуйте, eao197, Вы писали:
E>Disclaimer: насколько я помню, об удобстве вычисления факториала заговорил Oyster
Факториал — это шелуха, как ты сам понимаешь. То, почему на Nemerle может быть удобнее делать compile-time вычисления, уже звучало неоднократно...
Видимо, надо было привести пример compile-time оптимизации, которую на C++ просто невозможно осуществить. Такой, например, как Влад приводил: Re[25]: Вопрос к Vlad2: Nemerle & R#
Здравствуйте, Vermicious Knid, Вы писали:
VK>Не только скомпилируется, но еще и константу выдаст в качестве результата, т.к. в Nemerle есть constant folding.
Кстати, вопрос к гуру — а можно ли в макросе определить новый макрос?
Здравствуйте, Oyster, Вы писали:
O> Полностью согласен с тобой — давай экономить время на этапе компиляции! Миллисекунды на дороге не валяются!! Про удобство использования такой схемы скромно умолчу...
Про отладку compile-time вычислений, которую можно делать только отладочными печатями, доступными только при запуске компилятора, я тоже не буду распространяться...
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Про отладку compile-time вычислений, которую можно делать только отладочными печатями, доступными только при запуске компилятора, я тоже не буду распространяться...
E>)
В таком случае использовать compile-time computations на шаблонах C++ с целыми как параметрами тоже нехорошо (по тем же причинам)? В общем, мы пришли к тому, что всё есть зло, только CodeSmith рулит
Здравствуйте, Oyster, Вы писали:
O>В таком случае использовать compile-time computations на шаблонах C++ с целыми как параметрами тоже нехорошо (по тем же причинам)?
Да, применительно C++ я считаю что в большинстве случаев так оно и есть (бо к C++ кодогенерация прикручивается без проблем). За исключением самых простых случаев и когда для выжимания скорости прибегают к технике expression templates.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Да, применительно C++ я считаю что в большинстве случаев так оно и есть (бо к C++ кодогенерация прикручивается без проблем). За исключением самых простых случаев и когда для выжимания скорости прибегают к технике expression templates.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, eao197, Вы писали:
E>>Disclaimer: насколько я помню, об удобстве вычисления факториала заговорил Oyster
O>Факториал — это шелуха, как ты сам понимаешь. То, почему на Nemerle может быть удобнее делать compile-time вычисления, уже звучало неоднократно...
А кому они нужны compile-time вычисления? Вы бы еще число ПИ в компайл тайме вычислили.
Реально делается все проще: вставляется константа или таблица констант и все.
У меня в проекте например юзается предварительно посчитанная таблица биномиальных коэффициентов. За пять секунд была написана программка которая считает и выводит эти коэффициенты в виде обьявления сишного массива который затем был вставлен в сырец.
VladD2 wrote: > C>Вы еще скажите, что остальные языки .NET кардинально отличаются от C#... > Еще как скажу. Сравни, например, F# (Caml), Лисп или Питон. Неужели они > копии C#-а?
.NET-языки это: J#, C#, VB.NET. Все. Ну еще можно туда добавить F#.
Всякие Iron.Python'ы и Ruby.NET — это интерпретаторы, написаные на .NET
Здравствуйте, Cyberax, Вы писали:
C>Всякие Iron.Python'ы и Ruby.NET — это интерпретаторы, написаные на .NET
Да ну?
Optionally static — IronPython also supports static compilation of Python code to produce static executables (.exe's) that can be run directly or static libraries (.dll's) that can be called from other CLR languages including C#, VB, managed C++ and many more. Note: static compilation is only partially implemented in the 0.6 public release. This will need further development before being useful.
Our goal is to create a compiler for the Ruby language that targets the .NET CLR. We aim to support 100% of Ruby language semantics, including all dynamic constructs such as closures and continuations. We plan to generate 100% managed and verifiable CIL code.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, Cyberax, Вы писали:
C>>Всякие Iron.Python'ы и Ruby.NET — это интерпретаторы, написаные на .NET
O>Да ну?
O>
O>Optionally static — IronPython also supports static compilation of Python code to produce static executables (.exe's) that can be run directly or static libraries (.dll's) that can be called from other CLR languages including C#, VB, managed C++ and many more. Note: static compilation is only partially implemented in the 0.6 public release. This will need further development before being useful.
Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для обычного питона такое делает py2exe). Судя по скорости работы точно. Кстати java реализация питона тоже делает class файлы, но интерпретатор внутри остается. Настоящий компилятор питона (нативный) делают тут: http://codespeak.net/pypy/dist/pypy/doc/getting-started.html
Здравствуйте, FR, Вы писали:
FR>Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для обычного питона такое делает py2exe).
Ну а как же тогда
... or static libraries (.dll's) that can be called from other CLR languages including C#, VB, managed C++ and many more.
? Получается, при вызове каждого метода происходит, грубо говоря, интерпретация некой строки?
Кстати, он у тебя стоит (судя по словам "судя по скорости работы точно")? Можно попробовать скомпилить какую-нить сборку, а потом посмотреть Reflector-ом.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, FR, Вы писали:
FR>>Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для обычного питона такое делает py2exe).
O>Ну а как же тогда
O>
O>... or static libraries (.dll's) that can be called from other CLR languages including C#, VB, managed C++ and many more.
O>? Получается, при вызове каждого метода происходит, грубо говоря, интерпретация некой строки?
А какая в этом проблема?
Реально в нативном питоне каждый раз интерпретации не происходит, выполняется байт код.
O>Кстати, он у тебя стоит (судя по словам "судя по скорости работы точно")? Можно попробовать скомпилить какую-нить сборку, а потом посмотреть Reflector-ом.
Стоит но там вроде ничего кроме интерпретатора нет.
Oyster wrote: > Получается, при вызове каждого метода происходит, грубо говоря, > интерпретация некой строки?
В общем случае — да. В некоторых случаях, когда точно известен тип —
вызов можно заинлайнить.
Сам подумай, в Python'е и Ruby можно к объекту динамически подключать и
удалять методы. Как ты себе это представляешь в CLR без интерпретатора?
> Кстати, он у тебя стоит (судя по словам "судя по скорости работы > точно")? Можно попробовать скомпилить какую-нить сборку, а потом > посмотреть Reflector-ом.
Проще сделать RTFS.
Здравствуйте, Cyberax, Вы писали:
C>Oyster wrote: >> Получается, при вызове каждого метода происходит, грубо говоря, >> интерпретация некой строки? C>В общем случае — да. В некоторых случаях, когда точно известен тип — C>вызов можно заинлайнить.
C>Сам подумай, в Python'е и Ruby можно к объекту динамически подключать и C>удалять методы. Как ты себе это представляешь в CLR без интерпретатора?
Тут http://codespeak.net/pypy/dist/pypy/doc/dynamic-language-translation.html люди пытаются приблизить интерпретаторы к компиляторам, но там и интерпретатор используется и вообще сплошной jit. В IronPython а раних версиях тоже вроде про компилятор говорилось, а что сейчас по документации идущей с ним не понял (никаких упоминаний о компиляции ни нашел), а сайт висит.
У них статический JIT происходит с большими ограничениями, фактически
запрещены все фичи динамических языков — нельзя изменять наборы методов
и типы переменных, например.
А вообще, цель PyPy — сделать динамически оптимизирующий JIT-транслятор.
Нечто типа Java HotSpot, но для динамических языков.
Еще интересен проект Parrot VM — они примерно такое же хотят сделать. У
них своя bytecode VM с поддержкой мультиметодов, множественного
наследования, динамических вызовов и т.п. прямо в самой VM.
Здравствуйте, eao197, Вы писали:
E>Анекдот в тему: E>
E>Экзаменатор и студент.
E>Э: Вы будете отвечать на один сложный вопрос или на три простых?
E>С: На один сложный.
E>Э: Хорошо. Сколько байт в мегабайте?
E>С: Много!
E>Э: Сколько "много"?
E>С: Это уже второй вопрос!
E>)
Смешно. Но твой ответ ровно как в этом анекдоте. Так же точен как и бессмысленнен.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Если же ты о том, что для реализации compile-time вычислений приходиться писать свой код вместо библиотечного, то у меня на этот счет совсем другое мнение -- я думаю, что кодогенерация здесь может быть выгоднее. Зачем при каждой компиляции повторно перевычислять то, что можно вычислить один раз, сохранить в файле и все.
В общем, это уже не смешно. Софистика меня не интересует.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
E>>Если же ты о том, что для реализации compile-time вычислений приходиться писать свой код вместо библиотечного, то у меня на этот счет совсем другое мнение -- я думаю, что кодогенерация здесь может быть выгоднее. Зачем при каждой компиляции повторно перевычислять то, что можно вычислить один раз, сохранить в файле и все.
O> Полностью согласен с тобой — давай экономить время на этапе компиляции! Миллисекунды на дороге не валяются!! Про удобство использования такой схемы скромно умолчу...
Странный способ экономить время. Большие прокты на С++ компилирются часами, а у Немерла даже есть интерпретатор работающий в реальном времени.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Про отладку compile-time вычислений, которую можно делать только отладочными печатями, доступными только при запуске компилятора, я тоже не буду распространяться...
Действительно. Зачем позориться и говорить откровенную фигню. Тут ты прав. То ли дело в С++? Нет отладки и нет проблем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>Сам подумай, в Python'е и Ruby можно к объекту динамически подключать и удалять методы. Как ты себе это представляешь в CLR без интерпретатора?
А в чем проблема? Во втором фрэймворке для этого даже отдельный класс сделали — DynamicMethod. Да и мало лич, что можно нахимичить?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Эту химию настклько трудно понять, что я бы бил линейкой по рукам всем тем кто пытается писать код так.
На самом деле, это были исходники этой химии, но их понимать необязательно. Суть в том, что создаются типизированные аналоги простым типам, т.е. типизированные синонимы int, float, double и т.д., соответственно синтаксис использовани аналогичен использованию этих встроенных типов. В прикладном коде будет не за что бить линейкой...
VD>К тому же не трудно придставить диагностику ошибок выдаваемую компилятором. Нормальная система типов в хорошо расширяемом языке не должна требовать каких-то подпорок.
Да, с диагностикой ошибок в этих случаях сложнее... Вернее, сложнее с сообщениями об ошибках. Слава богу, что компилятор VC7.х выдает "свернутые" сообщения, т.е. суть понятна в первой же строчке: "не могу привести один тип к другому".
VD>Например, в Немерле можно делать операторы макросами. При этом во время компиляции доступны любые проверки типов. То есть мы можем контролировать любые аспекты поведения оператора явно, используя те же возможности языка, что и в прикладных программах. По-моему, это намного более простой, понятный и гибкий подход.
Нет, на Немерле ты не сможешь спроектировать подобную систему для произвольной получаемой размерности и их произвольных комбинаций.
VD>Ну, а вот такие примеры — это восхищение тем, что проблема решается хоть как-то хотя совершенно не очевидными средствами.
Она решается очень чудесно на С++, в том плане, что оба, как пользовательский код, так и итоговый бинарник аналогичен использованию встроенных типов. А вся "химия" работает только в compile-time.
VD>Мне вот интересно если Мэерс не описал этот прикол, то сколько бы программистов доперли до него? Боюсь, что еденицы. VD>И еще один вопрос. Склько программистов используют подобные приколы в своем коде?
Более упрощенные варианты используют практически ВСЕ (без комбинаторики, просто различные заменители целевым типам, очень часто такие типы называют с приставкой tagged_).
Т.е. выделение домена — это как бы естественно при проектировании прикладного кода.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>Реально в нативном питоне каждый раз интерпретации не происходит, выполняется байт код.
VD>Вообще-то выполнение байт-кода и есть интерпретация. В компилируемом коде выполняется машинный код.
В общем да, но с другой стороны фаза компиляции (в байт код) тоже присутствует.
FR,
FR>Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для обычного питона такое делает py2exe). Судя по скорости работы точно. Кстати java реализация питона тоже делает class файлы, но интерпретатор внутри остается. Настоящий компилятор питона (нативный) делают тут: http://codespeak.net/pypy/dist/pypy/doc/getting-started.html
Lazy Cjow Rhrr wrote: > FR>Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для > обычного питона такое делает py2exe). Судя по скорости работы точно. > Кстати java реализация питона тоже делает class файлы, но интерпретатор > внутри остается. Настоящий компилятор питона (нативный) делают тут: > http://codespeak.net/pypy/dist/pypy/doc/getting-started.html > А Python Psycho это тоже jit компилятор?
Это хак, а не jit-компилятор
Здравствуйте, VladD2, Вы писали:
E>>Про отладку compile-time вычислений, которую можно делать только отладочными печатями, доступными только при запуске компилятора, я тоже не буду распространяться...
VD>Действительно. Зачем позориться и говорить откровенную фигню. Тут ты прав.
А где написано про отладчик Nemerle, который запускается при компиляции Nemerle-кода и позволяет отлаживать раскрытие макросов и прочего?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
VladD2 wrote: > C>Сам подумай, в Python'е и Ruby можно к объекту динамически подключать > и удалять методы. Как ты себе это представляешь в CLR без интерпретатора? > А в чем проблема? Во втором фрэймворке для этого даже отдельный класс > сделали — DynamicMethod. Да и мало лич, что можно нахимичить?
В .NET CLR _НЕТ_ стандарта на динамические объекты. Ну создам я пару
динамических методов, но как их передать другому несвязаному коду?
И я уж не говорю, что семантика объектов в .NET всего лишь немного
беднее языка Эллы-людоедочки. И различные нетривиальные фичи типа
мультиметодов и динамического вызова отображаются на него только с
большими приседаниями.
Здравствуйте, Lazy Cjow Rhrr, Вы писали:
LCR>FR,
FR>>Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для обычного питона такое делает py2exe). Судя по скорости работы точно. Кстати java реализация питона тоже делает class файлы, но интерпретатор внутри остается. Настоящий компилятор питона (нативный) делают тут: http://codespeak.net/pypy/dist/pypy/doc/getting-started.html
LCR>А Python Psycho это тоже jit компилятор?
Угу, PyPy как раз его продолжение, делают теже люди что psyco
Здравствуйте, Cyberax, Вы писали:
C>Lazy Cjow Rhrr wrote: >> FR>Скорее всего псевдо exe, то есть exe c интерпретатором внутри (для >> обычного питона такое делает py2exe). Судя по скорости работы точно. >> Кстати java реализация питона тоже делает class файлы, но интерпретатор >> внутри остается. Настоящий компилятор питона (нативный) делают тут: >> http://codespeak.net/pypy/dist/pypy/doc/getting-started.html >> А Python Psycho это тоже jit компилятор? C>Это хак, а не jit-компилятор
FR wrote: > LCR>А Python Psycho это тоже jit компилятор? > Угу, PyPy как раз его продолжение, делают теже люди что psyco
Даже близко не продолжение. PyPy — это динамический JIT-транслятор для
Питона, написаный на Питоне.
Psycho — это патч к CPython, который компилирует несколько версий кода,
в надежде попасть на нужный тип.
Здравствуйте, Cyberax, Вы писали:
C>FR wrote: >> LCR>А Python Psycho это тоже jit компилятор? >> Угу, PyPy как раз его продолжение, делают теже люди что psyco C>Даже близко не продолжение. PyPy — это динамический JIT-транслятор для C>Питона, написаный на Питоне.
C>Psycho — это патч к CPython, который компилирует несколько версий кода, C>в надежде попасть на нужный тип.
Насколько я понял из чтения их документации, PyPy во многом для трансляции будет использовать теже методы что и psyco, хотя конечно это разные вещи, psyco просто тупо пытается угадать что имели в виду, а Pypy сначала пробует превратить большую часть динамики в статику, ну а то что не получится так сделать, отдает psyco подобному механизму.
FR wrote: > C>Psycho — это патч к CPython, который компилирует несколько версий кода, > C>в надежде попасть на нужный тип. > Насколько я понял из чтения их документации, PyPy во многом для > трансляции будет использовать теже методы что и psyco
В том смысле, что все JIT-компиляторы похожи
> разные вещи, psyco просто тупо пытается угадать что имели в виду, а Pypy > сначала пробует превратить большую часть динамики в статику, ну а то что > не получится так сделать, отдает psyco подобному механизму.
Более того, код интерпертатора и JITера в PyPy тоже будет JITиться из
питоновского кода.
Здравствуйте, eao197, Вы писали:
E>А где написано про отладчик Nemerle, который запускается при компиляции Nemerle-кода и позволяет отлаживать раскрытие макросов и прочего?
Запускаешь компилятор из под студии и хоть оботлаживайся.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
VladD2 wrote: > C>.NET-языки это: J#, C#, VB.NET. Все. Ну еще можно туда добавить F#. > http://www.dotnetpowered.com/languages.aspx
Да, много интерпретаторов на .NET написали, не спорю.
Здравствуйте, VladD2, Вы писали:
O>> Полностью согласен с тобой — давай экономить время на этапе компиляции! Миллисекунды на дороге не валяются!! Про удобство использования такой схемы скромно умолчу...
VD>Странный способ экономить время. Большие прокты на С++ компилирются часами, а у Немерла даже есть интерпретатор работающий в реальном времени.
Здравствуйте, Cyberax, Вы писали:
C>В .NET CLR _НЕТ_ стандарта на динамические объекты. Ну создам я пару C>динамических методов, но как их передать другому несвязаному коду?
Инстанс делегата отдашь.
C>И я уж не говорю, что семантика объектов в .NET всего лишь немного C>беднее языка Эллы-людоедочки. И различные нетривиальные фичи типа C>мультиметодов и динамического вызова отображаются на него только с C>большими приседаниями.
Мультиметоды — reflection и атрибуты тебе помогут, если надо красиво. Динамический вызов — тот же reflection. Или VB.NET, где можно делать ad-hoc вызовы прям используя основной синтаксис языка (оно потом скомпилится в вызов через reflection). Так что всё есть.
Здравствуйте, Cyberax, Вы писали:
C>В общем случае — да. В некоторых случаях, когда точно известен тип — C>вызов можно заинлайнить.
C>Сам подумай, в Python'е и Ruby можно к объекту динамически подключать и C>удалять методы. Как ты себе это представляешь в CLR без интерпретатора?
Эти методы просто не будет видно другим языкам (или будет какое-нить хранилице делегатов у каждого объекта). Ну а остальные будет видно.
>> Кстати, он у тебя стоит (судя по словам "судя по скорости работы >> точно")? Можно попробовать скомпилить какую-нить сборку, а потом >> посмотреть Reflector-ом. C>Проще сделать RTFS.
Здравствуйте, vdimas, Вы писали:
V>Нет, на Немерле ты не сможешь спроектировать подобную систему для произвольной получаемой размерности и их произвольных комбинаций.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, FR, Вы писали:
FR>>В общем да, но с другой стороны фаза компиляции (в байт код) тоже присутствует.
O>Ну так, значит, IronPython не явзяется просто интерпретатором, раз он генерит CIL-код?...
Так обычный питон тоже тогда не просто интерпретатор
C IronPython я пока не разобрался в документации ничего нет, на сайте написано что динамический компилятор, на простейших тестах чуть быстрее (%10 — 20) чем cpython, но на порядок медленее чем psyco (jit компилятор питона)
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, eao197, Вы писали:
E>>Да уж... E>>И какое именно? Инкапсуляция? Полиморфизм? Не о наследовании же говорить?
O>Например, инкапсуляция предполагает, что код будет выделен в отдельные процедуры, вызывающие друг друга.
E>>Тем не менее, ты мне не ответил.
O>Дизайнеры C++ не думали о том, что C++ будут использовать для метапрограммирования. Дизайнеры Nemerle постулировали это с самого начала.
O>Это, конечно, не отменяет возможности использования Nemerle для чего-то совершенно третьего, о чём ни мы ни разработчики Nemerle не догадываются (чего они не планируют, точнее). И вот это-то и приведёт к проблеме использования неподходящих средств (средств, которые предполагалось использовать иначе) для решения проблемы. Но разговор сейчас о метапрограммировании, я так понимаю
E>>Вообще Nemerle славословят, но не используют. Я припоминаю только одного участника обсуждений, который использовал Nemerle вместо Delphi.
O>Дык он же только-только становится известным. Потерпи чуток
Ну известным я врядли стану... (если это всетаки я имелся в виду)
да и программки которые я пишу в основном использую только я, да еще пяток людей — не больше...
А еще в связи со всеми этими обсуждения разных языков, мне вспомнилась одна вещь...
Не помню где это было.. давно... винда, так которая 95, кажеться только появилась...
возможно, что в одном из множества форумов, или даже в какой-то книге было написано...
Короче, шло обсуждение как сделать на таком-то языке одно, на таком-то другое, здесь лучше подходит третье...
Зашел разговор про Форт...
Сколько было слов про его синтаксис, про его низкоуровневость... про его привязку к стеку и т.д.
про отсутствие IDE тоже говорили...
Ну с IDE в конце концов разобрались — Были IDE для форта — например ПараФорт...
Шла жаркая дисскуссия, было написано немерянное количество слов и буковок...
И вот один из пользователей ПараФорта написал:
=> Мне в ПараФорте нехватает:
=> 1...
=> 2...
порядка 10 пунктов написал...
а в конце добавил...
=> А вообще я тихо счастлив...
Так вот и я с Nemerle? ну пусть не счастлив — но тихо доволен...
Здравствуйте, Mckey, Вы писали:
M> M>Ну известным я врядли стану... (если это всетаки я имелся в виду)
Я о Nemerle говорил Но если о тебе — почему нет?
M>да и программки которые я пишу в основном использую только я, да еще пяток людей — не больше...
Всё равно — ты его реально используешь. Это уже больше, чем мои текущие отношения с Nemerle, например.
M>Так вот и я с Nemerle? ну пусть не счастлив — но тихо доволен...
От себя добавлю, что реального кода, к сожалению, я на нём не пишу. Зато когда пишу примеры — душа радуется
Oyster wrote: > C>Сам подумай, в Python'е и Ruby можно к объекту динамически подключать и > C>удалять методы. Как ты себе это представляешь в CLR без интерпретатора? > Эти методы просто не будет видно другим языкам (или будет какое-нить > хранилице делегатов у каждого объекта). Ну а остальные будет видно.
А как хранилище передавать параллельно с объектом? Хранить глобальный
hash_map из weak-ссылок — не катит.
И что там с мультиметодами, например?
В общем, пока не будет стандартного формата динамических объектов — то
.NET не сильно ушел дальше обычного С в плане интероперабельности.
>> > Кстати, он у тебя стоит (судя по словам "судя по скорости работы >> > точно")? Можно попробовать скомпилить какую-нить сборку, а потом >> > посмотреть Reflector-ом. > C>Проще сделать RTFS. > Стандарт на Python.NET? Или Ruby.NET?
Исходники реализаций
Oyster wrote: > C>В .NET CLR _НЕТ_ стандарта на динамические объекты. Ну создам я пару > C>динамических методов, но как их передать другому несвязаному коду? > Инстанс делегата отдашь.
Как мне передать цельный объект?
Создавать делегаты для интеропа очень напоминает создание 'extern "C"'
функций по удобству использования и разработки.
> C>И я уж не говорю, что семантика объектов в .NET всего лишь немного > C>беднее языка Эллы-людоедочки. И различные нетривиальные фичи типа > C>мультиметодов и динамического вызова отображаются на него только с > C>большими приседаниями. > Мультиметоды — reflection и атрибуты тебе помогут, если надо красиво.
Чем? Мультиметод относится к нескольким классам — чего рефлектить?
Можно эмулировать мультиметоды (типа создавать классы
String_Int_Methods), но нет никакого стандарта на это. И шансы что два
языка будут использовать один и тот же метод кодирования — близки к нулю.
Здравствуйте, Cyberax, Вы писали:
C>Как мне передать цельный объект?
Если ты его передал динамически, то, естественно, никак. Правда, можно в рантайме сгенерить код и передать ссылку типа object, а дальше reflection и вперёд. Я говорил о том, что даже те же компиляторы Питона под .NET всё-таки компиляторы — они умеют генерировать полноценный IL.
C>Чем? Мультиметод относится к нескольким классам
Ну и что?
C>- чего рефлектить?
Reflection будет использоваться в реализации, неявно. Тебе написать какой-нить мультиметод на C#?
C>Можно эмулировать мультиметоды (типа создавать классы C>String_Int_Methods), но нет никакого стандарта на это. И шансы что два C>языка будут использовать один и тот же метод кодирования — близки к нулю.
А.. ты всё про interop. Ясно, что как только начинают юзаться language-specific фичи, все идут в сад — об этом уже говорилось.
Здравствуйте, Cyberax, Вы писали:
C>А как хранилище передавать параллельно с объектом? Хранить глобальный C>hash_map из weak-ссылок — не катит.
Да базовый класс соорудить и юзать вместо object.
C>И что там с мультиметодами, например?
От прицепился ты к этим мультиметодам Видно, часто их используешь
А если серьёзно, то не буду повторяться про language-specific фичи, которые не входят в CLS, и о том, куда они идут при интеропе.
C>В общем, пока не будет стандартного формата динамических объектов — то C>.NET не сильно ушел дальше обычного С в плане интероперабельности.
Т.е. пока такое не будет включено в CLS? Потому что только включение в CLS гарантирует, что все CLS consumers смогут такой код использовать.
>> C>Проще сделать RTFS. >> Стандарт на Python.NET? Или Ruby.NET? C>Исходники реализаций
А... Source, а не Standard... Так бы и сказал. И всё равно натурный эксперимент поставить быстрее.
Oyster wrote: > C>А как хранилище передавать параллельно с объектом? Хранить глобальный > C>hash_map из weak-ссылок — не катит. > Да базовый класс соорудить и юзать вместо object.
В пределах всех языков?
> C>И что там с мультиметодами, например? > От прицепился ты к этим мультиметодам Видно, часто их используешь
Ага. Причем на С++.
> А если серьёзно, то не буду повторяться про language-specific фичи, > которые не входят в CLS, и о том, куда они идут при интеропе.
Проблема в том, что в CLS почти ничего и не входит. Только самая базовая
функциональность, которой соответствуют C#/VB.NET.
Unsafe не учитываем — тут CLR не лучше обычного машинного кода.
> C>В общем, пока не будет стандартного формата динамических объектов — то > C>.NET не сильно ушел дальше обычного С в плане интероперабельности. > Т.е. пока такое не будет включено в CLS? Потому что только включение в > CLS гарантирует, что все CLS consumers смогут такой код использовать.
Да. Как вариант — нужен стандарт на эмуляцию нужных фич.
Здравствуйте, Cyberax, Вы писали:
>> Да базовый класс соорудить и юзать вместо object. C>В пределах всех языков?
Нет, конечно. С каждым языком интеропить по своему — я только об этом говорю.
>> От прицепился ты к этим мультиметодам Видно, часто их используешь C>Ага. Причем на С++.
Тю. Так и на C# их юзать проще простого. Мы-то вроде говорим об интеропе с языками, где мультиметоды first-class citizens.
C>Проблема в том, что в CLS почти ничего и не входит. Только самая базовая C>функциональность, которой соответствуют C#/VB.NET.
Ну да.
C>Unsafe не учитываем — тут CLR не лучше обычного машинного кода.
Да.
>> C>В общем, пока не будет стандартного формата динамических объектов — то >> C>.NET не сильно ушел дальше обычного С в плане интероперабельности. >> Т.е. пока такое не будет включено в CLS? Потому что только включение в >> CLS гарантирует, что все CLS consumers смогут такой код использовать. C>Да. Как вариант — нужен стандарт на эмуляцию нужных фич.
Стандарт распухнет — это раз. Никому на самом деле это не нужно — это два
Здравствуйте, Oyster, Вы писали:
E>>Т.е. из-под студии запускается отладка компилятора, который компилирует твой код?
O>Скорее отладка макроса, который используется компилятором для того, чтобы сгенерировать кусок кода.
Ну, например. Есть у меня кусок моего кода:
...
Oyster.Macro.Fact(12)
...
и у меня закрадываются подозрения, что именно в этом моем коде Fact(12) дает неправильный результа. Могу ли я установить в студии точку прерывания на эту строку и войти в отладку вызова Fact(12) из моего кода при компиляции моего кода?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Могу ли я установить в студии точку прерывания на эту строку и войти в отладку вызова Fact(12) из моего кода при компиляции моего кода?
Здравствуйте, Oyster, Вы писали:
E>>Могу ли я установить в студии точку прерывания на эту строку и войти в отладку вызова Fact(12) из моего кода при компиляции моего кода?
O>Ну да.
Если это правда, то круто!
Вот только не могу понять, как же это делается...
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Вот только не могу понять, как же это делается...
А чего сложного-то? Не забывай, что на этом этапе макрос уже скомпилирован и лежит себе в сборочке. Если он собирался с отладочной информацией, то что нам стоит подключиться к процессу компилятора, который сейчас использует этот макрос, и делать самый что ни на есть обычный дебаг?
Здравствуйте, Oyster, Вы писали:
O>А чего сложного-то? Не забывай, что на этом этапе макрос уже скомпилирован и лежит себе в сборочке. Если он собирался с отладочной информацией, то что нам стоит подключиться к процессу компилятора, который сейчас использует этот макрос, и делать самый что ни на есть обычный дебаг?
Он немножко другое имел в виду: может ли он поставить брейкпоинт не в теле макроса, а на строчке в исходном коде, где он вызывается.
Здравствуйте, Oyster, Вы писали:
V>>Нет, на Немерле ты не сможешь спроектировать подобную систему для произвольной получаемой размерности и их произвольных комбинаций.
O>Почему нет? Ты знаешь что-то, чего не знаю я?
Ага
Предлагаю попробовать.
В С++ каждая операция м/у этими типизированными величинами описывается только 1 раз. В дотнет необходимо будет описать всевозможные сочетания величин для каждой операции. Это очень большое число. Т.е., даже если автоматизировать эту задачу, и сгенерить автоматом все перестановкой, то ее решение потеряет смысл.
O>Потому что мне кажется, что смогу.
Здравствуйте, Oyster, Вы писали:
O>А чего сложного-то? Не забывай, что на этом этапе макрос уже скомпилирован и лежит себе в сборочке. Если он собирался с отладочной информацией, то что нам стоит подключиться к процессу компилятора, который сейчас использует этот макрос, и делать самый что ни на есть обычный дебаг?
Погоди, ты это сам реально проделывал?
Процесс компилятора он что, постоянно в памяти висит что ли? Я так понимаю, что он запускается на весьма короткое время. Просто так не подключишься.
Значит, нужно стартовать его под отладкой отдельно. Если так, то как узнать, в какой момент времени компилятор начнет вызывать не просто макрос Fact, а максрос Fact из нужного мне места программы, которая еще не скомпилировалась?
Или же я чего-то не помнимаю? Можно на пальцах объяснить?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, vdimas, Вы писали:
V>В С++ каждая операция м/у этими типизированными величинами описывается только 1 раз. В дотнет необходимо будет описать всевозможные сочетания величин для каждой операции.
Зачем? Не забывай, что у нас есть макросы. Например, такой макрос можно писать:
macro plus(x1, x2)
{
<[ $x1 + $x2 ]>
}
И он будет работать. Не сможет скомпилить — ругнётся (причём разумно ругнётся). Сможет — прохавает.
O>>Потому что мне кажется, что смогу.
V>Попробуй.
Дарней wrote: >> > От прицепился ты к этим мультиметодам Видно, часто их используешь > C>Ага. Причем на С++. > из сишного клиентского кода, вероятно?
Хуже. Из VBAшного.
Здравствуйте, Lloyd, Вы писали:
L>Он немножко другое имел в виду: может ли он поставить брейкпоинт не в теле макроса, а на строчке в исходном коде, где он вызывается.
Здравствуйте, eao197, Вы писали:
E>Погоди, ты это сам реально проделывал?
Да. Но извратно — я в макросе поставил System.Diagnostics.Debugger.Launch()...
E>Процесс компилятора он что, постоянно в памяти висит что ли? Я так понимаю, что он запускается на весьма короткое время. Просто так не подключишься. E>Значит, нужно стартовать его под отладкой отдельно. Если так, то как узнать, в какой момент времени компилятор начнет вызывать не просто макрос Fact, а максрос Fact из нужного мне места программы, которая еще не скомпилировалась?
Этого (по крайней мере сейчас и мне) узнать не получается...
E>Или же я чего-то не помнимаю? Можно на пальцах объяснить?
Здравствуйте, eao197, Вы писали:
E>Или же я чего-то не помнимаю? Можно на пальцах объяснить?
Принцип тот же что и при отладке любой dll. В струдии прописывается путь к программе, которую нужно стартовать при отладке. В данном случае это компилятор со всеми нужными параметрами. То же самое, что при запуске юнит тестов или отладки дизайнера студии, когда нужно отлаживать саму студию.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, eao197, Вы писали:
E>>Или же я чего-то не помнимаю? Можно на пальцах объяснить?
IT>Принцип тот же что и при отладке любой dll. В струдии прописывается путь к программе, которую нужно стартовать при отладке. В данном случае это компилятор со всеми нужными параметрами. То же самое, что при запуске юнит тестов или отладки дизайнера студии, когда нужно отлаживать саму студию.
Обалдеть.
Интересно на сколько таких отладочных сессий хватит терпения (у рядового программера) прежде чем макросы пойдут фтопку? В свое время имено из-за гемора с отладкой я перестал юзать циклы с итераторами и вещи типа for_each и перешел на классический for(int i = 0;...). Писанины не намного больше, зато хорошо видно на каких i,j,k произошел превед, и ситуацию легко снова повторить в дебаггере.
Здравствуйте, Kluev, Вы писали:
K>Интересно на сколько таких отладочных сессий хватит терпения (у рядового программера) прежде чем макросы пойдут фтопку?
Это один раз вбивается в проект dll'ки с макросами и потом всю жизнь используется. Как я уже говорил, точно так же как и с юнит тестами. А как ты думаешь писатели дизайнеров для студии живут? Отладка процессов в самой студии — обычное дело.
Впрочем, рядового программера это не будет вообще касаться.
K>В свое время имено из-за гемора с отладкой я перестал юзать циклы с итераторами и вещи типа for_each и перешел на классический for(int i = 0;...). Писанины не намного больше, зато хорошо видно на каких i,j,k произошел превед, и ситуацию легко снова повторить в дебаггере.
Никогда не испытывал проблем
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Это один раз вбивается в проект dll'ки с макросами и потом всю жизнь используется. Как я уже говорил, точно так же как и с юнит тестами. А как ты думаешь писатели дизайнеров для студии живут? Отладка процессов в самой студии — обычное дело.
Вот лично ты это дело с Nemerle в студии проделывал?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
O>И он будет работать. Не сможет скомпилить — ругнётся (причём разумно ругнётся). Сможет — прохавает.
хе, ну ты орел, ты мне приведи умножения и деления многократно номинированных/деноминированных величин.
Т.к. в дотнет невозможно инициировать генерики целыми числами, тебе придется решать эту задачу в явном виде, т.е. в параметрах типа должна храниться информация о комбинациях номинантов/деноминантов. При умножении/делении эти списки увеличиваются либо же сокращаются, причем, независимо от порядка операций, разумеется. Я немного поломал голову над этим, но не нашел иного способа как указать всевозможные комбинации для конечного числа интересующих размерностей, и с конечным "погружением" (т.е., скажем, до t^5).
Грубо говоря, надо кодировать нечто типа так:
структура простейшего типа:
public struct Val<T, N, D> { public T value; }
T — целевой тип числа,
N/D — списки типов-тагов, указывающих размерность.
//список типов
public class TypeList {
public class Node<T> : TypeList { }
}
использовать так:
TypeList.Node<T1>.Node<T2>.Node<T3>.Node...
Ну и всякие классы — таги:
public class Tags {
public class Mass {}
public class Distance {}
public class Time {}
// ...
}
сами физ-величины объявляются через using:
using velocity_int = Val<int, TypeList.Node<Tags.Distance>, TypeList.Node<Tags.Time>>;
using acceleration_double = Val<double, TypeList.Node<Tags.Distance>, TypeList.Node<Tags.Time>.Node<Tags.Time>>;
// ...
Хотя... Может быть в Nemerle и возможно будет написать кодогенератор для операций над Val<T, N, D>...
Здравствуйте, vdimas, Вы писали:
V>хе, ну ты орел, ты мне приведи умножения и деления многократно номинированных/деноминированных величин.
...
Присутствие средства для полноценного метапрограммирования сильно облегчает жизнь и помогает по другому смотреть на многие вещи. Ты, например, сейчас смотришь с позиции скалярных параметров генериков и C#. Я ничего утверждать не могу, но подозреваю, что метакод будет довольно простым, ибо сгенерить мы можем что угодно (Влад говорит, что вон даже макрос можно сгенерить в макросе).
Опять же — я попробую написать этот код (не люблю быть голословным), но не в ближайшие пару дней.
И давай умерим спесь и не будем кидаться друг в друга словечками вроде "орёл"
Здравствуйте, vdimas, Вы писали:
V>Предлагаю попробовать.
Не охота. Это чистая пенисометрия. Время убьется, а толку никакого.
V>В С++ каждая операция м/у этими типизированными величинами описывается только 1 раз. В дотнет необходимо будет описать всевозможные сочетания величин для каждой операции. Это очень большое число. Т.е., даже если автоматизировать эту задачу, и сгенерить автоматом все перестановкой, то ее решение потеряет смысл.
Макросы могут порождать новые типы. Так что реализовать эту байду точно можно. Вопрос в трудозатратах.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Kluev, Вы писали:
IT>>Принцип тот же что и при отладке любой dll. В струдии прописывается путь к программе, которую нужно стартовать при отладке. В данном случае это компилятор со всеми нужными параметрами. То же самое, что при запуске юнит тестов или отладки дизайнера студии, когда нужно отлаживать саму студию. K>Обалдеть. K>Интересно на сколько таких отладочных сессий хватит терпения (у рядового программера) прежде чем макросы пойдут фтопку? В свое время имено из-за гемора с отладкой я перестал юзать циклы с итераторами и вещи типа for_each и перешел на классический for(int i = 0;...). Писанины не намного больше, зато хорошо видно на каких i,j,k произошел превед, и ситуацию легко снова повторить в дебаггере.
Ничего особенного. После прописывания одной строчки в свойствах проекта отладка студии ничем не отличается от отладки обычного приложения. Все тот же F5 и вперед с песней.
Единственное неудобство это то что у студии нет исходиков. Но в случае с Nemerle и этой проблемы нет. Собираем компилятор с отладочной информацией и видим не только то что делает макрос но и все потроха компилятора.
Настоятельно рекомендую воздержатся от употребления падонковской лексики. Иначе в бан.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, VladD2, Вы писали:
VD>Не охота. Это чистая пенисометрия. Время убьется, а толку никакого.
Не скажи. Для меня эта задача имеет интерес, но чисто спортивный. Повод потренироваться и показать другим, что может делать Nemerle. Осталось только найти немного времени...
Ну а с точки зрения последующего использования... да, private members measuring в чистом виде.
Дарней wrote: > C>Хуже. Из VBAшного. > а приведи ка примеры, как ты это делаешь
Примерно так:
dim obj as Object
set obj = Application.ActiveChart
dim obj2 as Object
set obj2 = Aplication.ActiveSample
reactor.Process2 obj,obj2,param1,param2,param3
В реакторе происходит двойная (или тройная) диспетчеризация. Писать
таблицы уже достало.
Здравствуйте, Oyster, Вы писали:
O>Почему же? Имхо смысл есть
Смысла особого нет, так как после генерации тела макроса его нужно отдельно компилровать.
O>Я просто пробовал это сделать, и у меня как-то не получилось...
Видимо забыл о том, что макросы нужно компилировать перед использованием.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>А где написано про отладчик Nemerle, который запускается при компиляции Nemerle-кода и позволяет отлаживать раскрытие макросов и прочего?
Нда. Случай просто таки уникальный. Столько времени провести в разговорах о Немерле и не понять базовых веще.
Говорю последний раз, ибо надоело.
Макросы Немерла — это такой же код как и тот, что исполняется в рантайме. Все остальное легко выводится из этого утверждения. Нет разницы отлаживать макрос или прикладной код помещенный в DLL. Макрос — это DLL которую поднимает компилятор. Так что достаточно скомпилировать макрос в отладочном режиме и запустить компилятор из под отладчика, или банально влепить Debugging.Break()/Debug.Assert(false) и запустить компиляцию.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Если это правда, то круто!
Блин, ну, ты своими подозрениями просто убивашь на повал.
Да, мы тебя тут все развоидм. Сговорились и вешаем тебе на уши лапшу.
E>Вот только не могу понять, как же это делается...
Скачай Немерле. Скачай Сцинтилу и описанную мной поддержку для нее или Студию и поддержку для нее. Далее возьми любой из приводившихся примеров макросов. Скомпилируй его. Поставь точку останова в студии или CLR Debuger на нужной строке. Пропиши в качестве запускаемого ехе-шника ncc.exe. В качестве его командной строки файл вызвающий макрос и импорт сборки макросов (тоже описывалось не раз, хотя бы мной). Нажми F5... и вуаля.
Вместо точки останова можно влепить в коде вызов Debugger.Assert(false). Эффект будет тот же.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Lloyd, Вы писали:
L>Он немножко другое имел в виду: может ли он поставить брейкпоинт не в теле макроса, а на строчке в исходном коде, где он вызывается.
Тогда он полностью не умеет формулировать мысли.
Да и это вообще не вопрос. Это же просто код программы. Макрос в нем выглядит как функция или атрибут. На макросе в коде поставить точку останова нет проблем. А на атрибуте конечно нельзя, так как конструкция деларативная. Но и отлаживать там нечего. Отлаживать нужно код макроса.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Oyster wrote: >> > Да базовый класс соорудить и юзать вместо object. > C>В пределах всех языков? > Нет, конечно. С каждым языком интеропить по своему — я только об этом > говорю.
Вот с этим и проблемы. .NET претендует на универсальную платформу, а
полноценный интероп обеспечивает только в своих языках.
> C>Да. Как вариант — нужен стандарт на эмуляцию нужных фич. > Стандарт распухнет — это раз. Никому на самом деле это не нужно — это два
Стандарт может быть совершенно отдельным. Но он все равно нужен.
Дарней wrote: > C>В реакторе происходит двойная (или тройная) диспетчеризация. Писать > C>таблицы уже достало. > а что есть реактор по своей сути? Уж не ком-объект ли?
Да.
В нем по CLSID объектов происходит диспетчеризация.
Здравствуйте, Cyberax, Вы писали:
C>Вот с этим и проблемы. .NET претендует на универсальную платформу, а C>полноценный интероп обеспечивает только в своих языках.
Есть CLS. Хочешь стать "своим" — соответствуй CLS.
C>Стандарт может быть совершенно отдельным. Но он все равно нужен.
Дык и начинай активные действия в этом направлении
Здравствуйте, VladD2, Вы писали:
L>>Он немножко другое имел в виду: может ли он поставить брейкпоинт не в теле макроса, а на строчке в исходном коде, где он вызывается.
VD>Тогда он полностью не умеет формулировать мысли.
Или внимательнее читать нужно. А не выдавать собственные мысли за чужие слова.
VD>Да и это вообще не вопрос. Это же просто код программы. Макрос в нем выглядит как функция или атрибут. На макросе в коде поставить точку останова нет проблем. А на атрибуте конечно нельзя, так как конструкция деларативная. Но и отлаживать там нечего. Отлаживать нужно код макроса.
Ага, конечно. У тебя, наверное, никогда наведенных ошибок не было. Когда код проходит все unit-тесты, но в одном из двадцати реальных прогонов почему-то ломается.
А вставлять в код макроса Assert(false) -- это вариант. Про него я не знал. Только вот насколько он удобен, если макрос раз 50-100 вызывается за время компиляции.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Значит, нужно стартовать его под отладкой отдельно. Если так, то как узнать, в какой момент времени компилятор начнет вызывать не просто макрос Fact, а максрос Fact из нужного мне места программы, которая еще не скомпилировалась?
А зачем ждать когда тебя вызовут из нужного места? Если ты отлаживашь конктретную проблему, то проще сэмулировать ее на коротком примере.
Если же проблема не ясна, то прийдется трассировать выполнение программы или ориентироваться на параметры.
ЗЫ
Вообще, явно видно, что ты не понимашь сути макросов. От того и непонимание. Макрос — это не функция вызываемая из кода. Макрос — это метапрограмма меняющуая или генерирующая код. Код объектной прогрммы (т.е. программы где макрос применяется) для макроса не более чем входные данные.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Kluev, Вы писали:
K>Интересно на сколько таких отладочных сессий хватит терпения (у рядового программера) прежде чем макросы пойдут фтопку?
Нескажу за рядовых, но если человек хоть раз отлаживал DLL-сборку или просто Win-DLL, то проблем не возникает вообще.
Зато отладка макроса может очень многое сказать о самой подсистеме макросов.
K> В свое время имено из-за гемора с отладкой я перестал юзать циклы с итераторами и вещи типа for_each и перешел на классический for(int i = 0;...).
А я пересат использовать С++. Помогает значительно лучше. При этом проблем с foreach-ем и т.п. нет в принципе.
K> Писанины не намного больше,
Писанины намного больше. Да и for не эквиалентен foreach-у. Попробуй, анпример, через for перебрать элементы хэш-таблицы или связанного списка. А через foreach легко.
K> зато хорошо видно на каких i,j,k произошел превед, и ситуацию легко снова повторить в дебаггере.
А зачем видить внутреннюю реализацию паттерна? Мне достаточно видеть то, что код перебирает элементы коллекции. Остальное не важно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Здравствуйте, FR, Вы писали:
FR>>В общем да, но с другой стороны фаза компиляции (в байт код) тоже присутствует.
O>Ну так, значит, IronPython не явзяется просто интерпретатором, раз он генерит CIL-код?...
Лично я не могу судить о IronPython. Если он генерирует именно MSIL, то несомненно он компилятор. Если же генерируется ней свой байткод который потом интерпретируется, а что-то еще, и это что-то потом интерпретируется, то это интерпретатор.
Вообще-то отделение компилятора от интерпетатора может быть очень непрстым. Часть кода может выполняться непосредственн, а часть интерпретироваться. Или может порождаться код который будет зниматься неким рантайм-анализом и по сути мало чем отличаться от интерпретации. Напирмер, VB6 имел компилятор, но при работе с вариантами тот вместо полноценного машинного влеплял некие процедуры интерпретирующие значения варинтов. Это конечно все завязано на реализацию варинтов, но все же характиристики кода скорее уже получались как у интерпретатора.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>В .NET CLR _НЕТ_ стандарта на динамические объекты.
Чё?
C> Ну создам я пару C>динамических методов, но как их передать другому несвязаному коду?
Очевидно другой од тоже должен быть динамическим, работать через заранее известный интерфейс или вызвать порождаемый код через рефлексию.
C>И я уж не говорю, что семантика объектов в .NET всего лишь немного C>беднее языка Эллы-людоедочки.
С Эллочкой сранвивать не буду. Но где-то в ЯП есть лучше?
C> И различные нетривиальные фичи типа C>мультиметодов и динамического вызова отображаются на него только с C>большими приседаниями.
С динамическими вызовами никаких проблем нет. Что касается мултиметодов, то это фича языка, а не рантайма. Деспечиризация — это, ведь, алогоритм.
Забавно, что вызов метода через рефлекшон как раз имеет поведение как у мультиметода, так как производится диспечерезация по нескольким аргументам.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
VD>>Данный вопрос ни к ФП, ни к Александреску отношения не имеет. Это именно что прямое использование возможности параметризовать тип константами и получить эффект от того, что компилятор генерирует уникальные типы для разных значений констант.
FR>Прямого отношения не имеет, но замечал тот кто любит ковырятся в шаблонах намного легче осваивает функциональщину (принимает не всегда, но во всяком случае понимает быстро, а то я тут уже и с клиническими случаями встречался )
Это уже к делу не относится. Эдак можно и про шахматистов сказать, например.
VD>>Примеры из буста, раз уж в прикладном коде подобное встретить невозможно.
FR>Так мое мнение: такой код и не должен быть прикладным, он должен лежать в библиотеках.
Я просил пример. Просто интересно для чего кроме надуманного примера (приведенного выше по теме) и метапрограммирования можно использовать параметризацию константами.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>На самом деле, это были исходники этой химии, но их понимать необязательно. Суть в том, что создаются типизированные аналоги простым типам, т.е. типизированные синонимы int, float, double и т.д., соответственно синтаксис использовани аналогичен использованию этих встроенных типов. В прикладном коде будет не за что бить линейкой...
А какова цель этого?
Пойми, ведь если есть цель, то очень вероятно, что ее можно достигнуть разными средствами.
Например, если мы ведем речь о операциях над некими физическими величинами, то можно описать эту величину как просую структуру содержащую нужну информацию, а в макросах контролировать правильность операций и если он прошел удачно заменять структуры на простые типы.
В общем, приведи осмысленный пример применения данного изврата и можно будет подумать как добиться того же эффекта.
VD>>Например, в Немерле можно делать операторы макросами. При этом во время компиляции доступны любые проверки типов. То есть мы можем контролировать любые аспекты поведения оператора явно, используя те же возможности языка, что и в прикладных программах. По-моему, это намного более простой, понятный и гибкий подход.
V>Нет, на Немерле ты не сможешь спроектировать подобную систему для произвольной получаемой размерности и их произвольных комбинаций.
Что же мне помешает?
V>Она решается очень чудесно на С++, в том плане, что оба, как пользовательский код, так и итоговый бинарник аналогичен использованию встроенных типов. А вся "химия" работает только в compile-time.
Ну, и в Немерле это можно сделать. Вот только соменваюсь, что это будет просто. Ведь на С++ это просто только потому, что все что нужно уже встроено в язык/компилятор.
V>Более упрощенные варианты используют практически ВСЕ (без комбинаторики, просто различные заменители целевым типам, очень часто такие типы называют с приставкой tagged_).
Хм. А не лучше (а главное логичнее) было бы ввести в язык алиасы (что-то вроде typedef, но порождающий новый тип)?
V>Т.е. выделение домена — это как бы естественно при проектировании прикладного кода.
Ага. Не естественнен способ которым это делается.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Не скажи. Для меня эта задача имеет интерес, но чисто спортивный.
Пенесометрия и есть спорт. Но я уж лчше пойду в спортзал.
O> Повод потренироваться и показать другим, что может делать Nemerle. Осталось только найти немного времени...
Хм. Потренироваться — это дело. Но ведь можно тренироваться на куда более полезных кошках! Например, мне хочется доработать напильником макрос $ (тот, что используется в строке $" ... $(...) "), так чтобы он делал отсупы и форматировние. Ну, так чтобы использовать его вместо SreingTemplate.
O>Ну а с точки зрения последующего использования... да, private members measuring в чистом виде.
Не понял.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>Да. Особенно в прикладном коде. Особенно там, где сложность формул преттендует на write-only... хоть какая-то проверка на "здравый смысл".
Ну, привел бы пример из своего кода. И статистику сколько их таких.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
FR>Так и то другое все-таки вычисления во время компиляции(что и просил Влад).
Такие вычисления может делать почти любой компилятор почти любого языка.
Речь же шла о вычислениях во время компиляции. Вычислениях которые могут дать нечто более полезное для программиста нежели просто сложение двух констант.
И тот кто отвечал прекрасно знает ответ на данный вопрос. А данная шутка юмора родилась только потму, что ему очень нехочется честно озвучить этот ответ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
FR>Вот мне интересно эти трудозатраты будут сопоставимы с затратами на C++?
Это сопоставление неализованной возможности и ее реализации универсальными средствами. Подобное сравнение имеет такой же смысл, как сравение вызова функции и ее реализации.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Или внимательнее читать нужно. А не выдавать собственные мысли за чужие слова.
Куда уж внимательнее. Просто с твоего восприятия офигеть можно. Ты уж извини.
Лучше бы чем разводить пустые споры и распросы взял бы и попробовал сам.
Только будь окуратен. Видишь, многие попробовавшие и оценившие подсаживаются на иглу.
E>Ага, конечно. У тебя, наверное, никогда наведенных ошибок не было.
Бывали. В основном когда писал на С/С++ и скриптах разных. На Шарпе что-то наведенки крайне мало, и она легко отлавливается. С Немерлом пока тоже вроде все понятно в отладке.
E> Когда код проходит все unit-тесты, но в одном из двадцати реальных прогонов почему-то ломается.
Я на скриптах не пишу. Так что техники безопасного секса не так актуальны. Нет у меня обычно юнит-тестов... Обычно все и так неплохо работает.
E>А вставлять в код макроса Assert(false) -- это вариант. Про него я не знал. Только вот насколько он удобен, если макрос раз 50-100 вызывается за время компиляции.
Теперь ты эту фразу будешь повторять 10 раз полностью закрывая глаза на то, что тебе два дня назад сказали, что можно просто поставить точку останова в отладчике.
Право... надоело.
Обясняю последний раз и закроем тему.
Сначла терминалогия. Объектный код — это код компилируемой программы. Именно он содержит обращения к макросам. И именно он после компиляции и раскрытия макросов превращается в исполняемый модуль.
Макросы не вызваются из объектного кода. Они раскрываются в объектном коде заменяясь реальным кодом. Так что после того как код использующий макросы был скомпилирован ловить в нем уже нечего! Если в рантайме поставить точку останова в объектном коде в месте "вызова" макроса, то ты "увидишь" не вызов, а сгенерированный код. А точка останова будет находиться в его начале. "Увидишь" взято в ковычки, так как фактически не предпринимая специльных действий, ты вообще ничего не увидишь. Ведь генерируемый код не виден взору.
Так что идея поставить точку останова на "вызове" макроса — это нелепица вызванная не пониманием приципа действия макросов.
Теперь, что касается отлова нужного места.
1. Место не должно влиять на результат, если макрос написан грамотно. Надо стараться делать так, чтобы разные обращения к макросам с одинаковыми параметрами приодили к одинаковому результату. Побочные эффекты иногда конечно полезны, но нужно четко осознавать их опасность. Это ничем не отличается от создания прикладного кода.
Это позволит отлаживать макросы просто передавая им на вход набор тестовых данных.
2. Для отлова места, если поведение макроса зависит от порядка вызова или того где он исползуется, если это очень нужно можно использовать другой, отладочный, макрос который взведет некую переменную которую можно проверить в основном макросе и отловить точкой останова.
3. Если нужно отловить n-ый вызов макроса, можно поставить точку останова с условием или просто навести отладочную переменную в макросе которая будет увеличиваться при кождом следующем вызове макроса. Остальное дело техники.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>Вот мне интересно эти трудозатраты будут сопоставимы с затратами на C++?
VD>Это сопоставление неализованной возможности и ее реализации универсальными средствами. Подобное сравнение имеет такой же смысл, как сравение вызова функции и ее реализации.
Пусть так но мне хочется понять насколько велики возможности немерли. Просто если реализация очень сложна то практически можно сказать что этой возможности нет.
Здравствуйте, VladD2, Вы писали:
E>>Ага, конечно. У тебя, наверное, никогда наведенных ошибок не было.
VD>Бывали. В основном когда писал на С/С++ и скриптах разных. На Шарпе что-то наведенки крайне мало, и она легко отлавливается. С Немерлом пока тоже вроде все понятно в отладке.
E>> Когда код проходит все unit-тесты, но в одном из двадцати реальных прогонов почему-то ломается.
VD>Я на скриптах не пишу. Так что техники безопасного секса не так актуальны. Нет у меня обычно юнит-тестов... Обычно все и так неплохо работает.
Ну-ну. Работает и пусть работает. Ты мне еще расскажи, что статическая типизация на 99% устраняет необходимость тестирования приложений. Что после успешной компиляции нужно проверить всего две вещи -- что программа успешно стартует и столь же успешно завершается. Если эти условия выполняются, значит все работает корректно.
Увольте, батенька. Рассказывай эти сказки начинающим программистам, которые кроме окошек в WinForms ничего не программируют.
VD>Обясняю последний раз и закроем тему.
Не нужно считать окружающих тупее себя. То, что ты излагаешь ниже я и без тебя прекрасно понимаю, благо разные преобразователи исходных текстов писать приходилось.
Я просто хотел понять, что делать в случае, когда я вижу, что некий макрос, производящий compile-time вычисления подставляет мне в код явно не правильную константу. Причем делает это он не всегда, а один раз в некотором месте исходного кода.
То, что нельзя зайти в код макроса из обычной отладки моего кода я и без вас с IT прекрасно понимал.
Я не понимал, как войти в отладку кода макроса, когда этот код работает в отдельном параллельном процессе ncc. Оказалось, что провоцируется отладка процесса компилятора путем подстановки в код макроса специальных провоцирующих отладку инструкций (вроде Assert(false)). После этого стало понятно. Напомнило, как некоторые товарищи в C/C++ код вставляли asm { int 3h; } (вроде так).
Только для этого способа, как я понимаю, нужно иметь компилируемый исходный код макроса чтобы вставить в него Assert(false) и перекомпилироваться.
VD>1. Место не должно влиять на результат, если макрос написан грамотно. Надо стараться делать так, чтобы разные обращения к макросам с одинаковыми параметрами приодили к одинаковому результату. Побочные эффекты иногда конечно полезны, но нужно четко осознавать их опасность. Это ничем не отличается от создания прикладного кода.
Прописная истина. Если бы программы писались так просто, необходимости в отладке вообще бы не было.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
VD>Пенесометрия и есть спорт. Но я уж лчше пойду в спортзал.
Я и туда хожу Люблю спорт, панимаишь
VD>Хм. Потренироваться — это дело. Но ведь можно тренироваться на куда более полезных кошках! Например, мне хочется доработать напильником макрос $ (тот, что используется в строке $" ... $(...) "), так чтобы он делал отсупы и форматировние. Ну, так чтобы использовать его вместо SreingTemplate.
Понимаешь, Влад, у меня пока нет реальных проектов, на которых я могу применить Nemerle. Скоро один такой появится, если я проявлю достаточно настойчивости. До этого момента большие проекты я начинать не хочу и тренируюсь эпизодически на хомячках
И вот как-то эта (простенькая, на самом деле) задача про физические величины мне, что называется, "впилась". Реализация на C++ мне понравилась с точки зрения ценителя настоящих извращений и захотелось просто написать то же самое, но на Nemerle. Вот и всё.
O>>Ну а с точки зрения последующего использования... да, private members measuring в чистом виде.
VD>Не понял.
Ну эта... private, member, а дальше пусть каждый думает в меру своей распущенности
У кого-то на форуме даже подпись про C++ на эту тему пробегала
Здравствуйте, IT, Вы писали:
> Да, лучше перестраховаться и объявить Nemerle и его создателей врагами > народа, дизертирами и вредителями колхозных колосков.
Можешь показать цитаты, хотя бы близкие по смыслу к этому?
> ЗЫ. Мне, кстати, тоже интересно, доколе народ будет заниматься охотой на > ведьм? Я так понимаю, что удовольствие получается уже от самого процесса >
А вот я применительно к отладке макросов во время компиляции другого не понимаю. Почему этого нельзя сделать путем установки точки прерывания в IDE на месте обращения к макросу в моем коде? Нет, про разные этапы компиляции и отладки, про то, что макросы это уже объектный код и прочие прописные истины ... все это я уже слышал. Это все попытка доказать всем, что так делать нельзя потому, что сейчас это невозможно.
Ну а если чуть-чуть подумать. Преставим, что в IDE на строке своего исходника я устанавливаю точку прерывания. Запускаю компиляцию, IDE подгружает внутри себя процесс компилятора и передает ему дополнительную информацию: имя файла и номер строки с точкой прерывания. Когда компилятор доходит до этого места в процессе компиляции, он сообщает IDE об этом и позволяет IDE войти в режим отладки.
Компонентная, в конце-концов .NET среда или так просто, погулять вышла? Компилятор может быть таким компонентом, который IDE подгружает в себя. IDE получает от компилятора интерфейс для управления компиляцией. IDE передает компилятору свой callback интерфейс. IDE дергает метод компилятора для начала компиляции с перечислением точек прерываний. Когда компилятор добирается до одной из них, он дергает callback интерфейс IDE и говорит, где и как нужно начать отладку.
Получается нормальная IDE для полноценного использования и отладки средств метапрограммирования Nemerle.
Или такое все же принципиально невозможно?
AFAIK, IDE для Smalltalk-а давно так работают. Чуть ли не с рождения.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
K>>Интересно на сколько таких отладочных сессий хватит терпения (у рядового программера) прежде чем макросы пойдут фтопку?
VD>Нескажу за рядовых, но если человек хоть раз отлаживал DLL-сборку или просто Win-DLL, то проблем не возникает вообще.
Просто потом это надоедает и начинаешь юзать более простые вещи.
K>> В свое время имено из-за гемора с отладкой я перестал юзать циклы с итераторами и вещи типа for_each и перешел на классический for(int i = 0;...). K>> Писанины не намного больше,
VD>Писанины намного больше. Да и for не эквиалентен foreach-у. Попробуй, анпример, через for перебрать элементы хэш-таблицы или связанного списка. А через foreach легко.
А через for трудно?
// связный список. код из реального проекта
FB_Curve *c, *c2;
// split poly-curves if need:for ( c = curves.first(); c; c = c2 )
{
c2 = curves.next(c);
c->split(); // может добавить элементы в список поэтому сначала делаем next()
}
// tessfor ( c = curves.first(); c; c = curves.next(c) )
c->tess();
Хэш таблица — аналогично, только там массив списков, не вижу никаких трудностей. Кому трудно может написать макрос для среды который заготовки циклов в редактор вставляет. Хотя мне и руками не трудно написать, на обдумывание все равно времени гораздо больше уходит.
VD>А зачем видить внутреннюю реализацию паттерна? Мне достаточно видеть то, что код перебирает элементы коллекции. Остальное не важно.
А мне важно знать номер итерации на которой произошла ошибка (или ID обьекта, если он есть), циклы большие обьем входных данных тоже не мальнький, а корректность никто не гарантирует. Как отлаживатся то?
В каждый обьект уникальный ID пихать?
Здравствуйте, eao197, Вы писали:
E>А вот я применительно к отладке макросов во время компиляции другого не понимаю. Почему этого нельзя сделать путем установки точки прерывания в IDE на месте обращения к макросу в моем коде? Нет, про разные этапы компиляции и отладки, про то, что макросы это уже объектный код и прочие прописные истины ... все это я уже слышал. Это все попытка доказать всем, что так делать нельзя потому, что сейчас это невозможно.
если очень хочется — возьми и сделай, благо исходники доступны
E>AFAIK, IDE для Smalltalk-а давно так работают. Чуть ли не с рождения.
рассказать тебе снова, в чем принципиальная разница между Немерле и Смоллтоком?
Здравствуйте, Дарней, Вы писали:
Д>если очень хочется — возьми и сделай, благо исходники доступны
Я вот одного не пойму -- то о чем я написал для Nemerle принципиально не нужно? Ну т.е. совсем. Даже в светлом будущем, когда толпы народу Nemerle использовать будут?
E>>AFAIK, IDE для Smalltalk-а давно так работают. Чуть ли не с рождения.
Д>рассказать тебе снова, в чем принципиальная разница между Немерле и Смоллтоком?
Извини за грубость, но встречный вопрос: а ты сам-то знаешь?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Я вот одного не пойму -- то о чем я написал для Nemerle принципиально не нужно? Ну т.е. совсем. Даже в светлом будущем, когда толпы народу Nemerle использовать будут?
Нужно. Но сейчас есть вопросы намного более актуальные.
В С++ вообще никакой отладки для хитрых рекурсивных шаблонов нет, даже трассировки. И ничего, живут же люди. Или тебе просто раздуть очередного слона из мухи?
Д>>рассказать тебе снова, в чем принципиальная разница между Немерле и Смоллтоком?
E>Извини за грубость, но встречный вопрос: а ты сам-то знаешь?
В контексте нашего обсуждения, разница очень проста. В Смоллтоке компилятор выполняет минимальную работу, основной упор делается на рантайм. А в Немерле — наоборот.
Дарней wrote: > C>В нем по CLSID объектов происходит диспетчеризация. > и эти люди запрещают мне ковыряться в носу (С) > такой же диспатч под CLI делается без проблем и намного проще
В чистом С++ оно тоже делается намного проще. Но нужен именно VBA.
VladD2 wrote: > Лично я не могу судить о IronPython. Если он генерирует именно MSIL, то > несомненно он компилятор. Если же генерируется ней свой байткод который > потом интерпретируется, а что-то еще, и это что-то потом > интерпретируется, то это интерпретатор.
Iron.Python (как и Jython до этого) пытается производить вывод типов,
в тех случаях когда это удается — вставляет готовый IL. В остальных
случаях использует интерпретатор.
VladD2 wrote: > C> Ну создам я пару > C>динамических методов, но как их передать другому несвязаному коду? > Очевидно другой од тоже должен быть динамическим, работать через > заранее известный > интерфейс или вызвать порождаемый код через рефлексию.
Откуда он "заранее известен"? У нас есть на него стандарт?
> C>И я уж не говорю, что семантика объектов в .NET всего лишь немного > C>беднее языка Эллы-людоедочки. > С Эллочкой сранвивать не буду. Но где-то в ЯП есть лучше?
В той же ParrotVM, например.
> C> И различные нетривиальные фичи типа > C>мультиметодов и динамического вызова отображаются на него только с > C>большими приседаниями. > С динамическими вызовами никаких проблем нет.
Есть. В .NET нет проблем только с рефлексивными вызовами.
> Что касается мултиметодов, то это фича языка, а не рантайма. > Деспечиризация — это, ведь, алогоритм.
А вы попробуйте совместить диспетчеризацию и модульность. То есть мы
подключаем новый модуль — и старые мультиметоды могут начать по-другому
работать. Да и не надо забывать, что в некоторых языках отсутствует
понятие "компиляция".
Здравствуйте, Cyberax, Вы писали:
>> такой же диспатч под CLI делается без проблем и намного проще C>В чистом С++ оно тоже делается намного проще. Но нужен именно VBA.
а что, по твоему "чистый С++" эквивалентно CLI по возможностям интеропа?
Oyster wrote: > C>reactor.Process2 obj,obj2,param1,param2,param3 > Кстати, на C# тоже без проблем можно сделать так, чтобы для вызывающей > стороны вызов мультиметода был абсолютно прозрачным...
И выглядеть будет изоморфно коду моей реализации.
Oyster wrote: > C>Вот с этим и проблемы. .NET претендует на универсальную платформу, а > C>полноценный интероп обеспечивает только в своих языках. > Есть CLS. Хочешь стать "своим" — соответствуй CLS.
Вот только букву "C" в CLS следует читать как "C#".
> C>Стандарт может быть совершенно отдельным. Но он все равно нужен. > Дык и начинай активные действия в этом направлении
Нафиг. CLR мне не дает практически никаких дополнительных преимуществ в
интеропе кроме общего GC по сравнению со старым добрым COM.
Дарней wrote: >> > такой же диспатч под CLI делается без проблем и намного проще > C>В чистом С++ оно тоже делается намного проще. Но нужен именно VBA. > а что, по твоему "чистый С++" эквивалентно CLI по возможностям интеропа?
Примерно. В .NET большим преимуществом является только общий GC.
Здравствуйте, Cyberax, Вы писали:
C>Примерно. В .NET большим преимуществом является только общий GC.
если забыть про проблемы с классами, исключениями, массивами и строками, то ты совершенно прав Есть еще конечно проблема с написанием оберток, но эта мелочь даже не заслуживает внимания
Здравствуйте, Kluev, Вы писали:
VD>>Нескажу за рядовых, но если человек хоть раз отлаживал DLL-сборку или просто Win-DLL, то проблем не возникает вообще. K>Просто потом это надоедает
Что надоедает? Ты вобще хоть раз DLL отлаживал?
K>и начинаешь юзать более простые вещи.
Какие?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, IT, Вы писали:
IT>ЗЫ. Мне, кстати, тоже интересно, доколе народ будет заниматься охотой на ведьм? Я так понимаю, что удовольствие получается уже от самого процесса
Точно.
Возможно это такой вид аутотренинга. Веловек ищет себе причины почему это ему не нужно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
>> Да, лучше перестраховаться и объявить Nemerle и его создателей врагами >> народа, дизертирами и вредителями колхозных колосков.
E>Можешь показать цитаты, хотя бы близкие по смыслу к этому?
Прийдется показать всю твою переписку на этом форуме за исключением тех мест где ты хвалил Руби или защищал С++.
>> ЗЫ. Мне, кстати, тоже интересно, доколе народ будет заниматься охотой на >> ведьм? Я так понимаю, что удовольствие получается уже от самого процесса >>
E>А вот я применительно к отладке макросов во время компиляции другого не понимаю.
Хм. Осмысленный ответ на замечание ИТ.
E> Почему этого нельзя сделать путем установки точки прерывания в IDE на месте обращения к макросу в моем коде?
Опиши, пожалуйста, сценарий того как будет отрабатвать этота точка останова. Причем как можно подоробнее.
E>Ну а если чуть-чуть подумать. Преставим, что в IDE на строке своего исходника я устанавливаю точку прерывания. Запускаю компиляцию, IDE подгружает внутри себя процесс компилятора и передает ему дополнительную информацию: имя файла и номер строки с точкой прерывания. Когда компилятор доходит до этого места в процессе компиляции, он сообщает IDE об этом и позволяет IDE войти в режим отладки.
Для этого не нужно изменять комилятор. Достаточно просто создать еще один отладочный макрос который будет взводить некий флаг:
и поставить точку останова внутрь if-а. Далее остается вписать вызов BreakMyCacro() в нужном месте объектного кода (перед не верно работающим вызовом MyCacro).
E>Компонентная, в конце-концов .NET среда или так просто, погулять вышла?
Ты тут придерашся по мелочам к Немерлу в то время как к Руби вообще нормальной ИДЕ нет. Поддержки IDE вообще очень нехватает. И уж если говорить о первоочередных фичах, то сначало нужно кмплит-ворд сделать. А такие изысканные извращения как точки отсанова времени компиляции точно можно пережит.
E> Компилятор может быть таким компонентом, который IDE подгружает в себя. IDE получает от компилятора интерфейс для управления компиляцией.
Да, в общем-то достаточно даже передать компилятору имя файла и позицию в нем. Возможно когда-то так и сделают. Только и биз этого особых проблем нет.
Так что это очередной пример охоты на ведьм. Попытка найти соринку в чежом глазу не видя бревна в собственной заднице.
E> IDE передает компилятору свой callback интерфейс. IDE дергает метод компилятора для начала компиляции с перечислением точек прерываний. Когда компилятор добирается до одной из них, он дергает callback интерфейс IDE и говорит, где и как нужно начать отладку.
Вот только незадача. Точка останова получается в прикладном коде, а ходить можно будет только по метакоду. У многих может поехать крыша.
E>Получается нормальная IDE для полноценного использования и отладки средств метапрограммирования Nemerle.
Возможно. Более того. Я тебе еще 200 фич могу напридумывать в области поддержки IDE и вообще. Но как ты понимашь, сейчас поддержка IDE вообще на уровне плинтуса (есть только подсветка кода, управление проектом и отладка). Так что кул-фичах пока что мечтать не приходится.
Кстати, из кул-фич IDE в области макросов мне бы очень хотелось бы видеть следующее:
1. При наведении курсора мыши на имя макроса (внутри выражения), чтобы о IDE показывала большой хинт с раскрытым кодом макроса. И чтобы каждый вложенный макрос был подсвечен и при наведении мышки на него чтобы можно было увидить как раскроется он.
2. При отладке чтобы можно было нажать некую пимпочку (например, выбрать пункт контекстного меню когда курсор установлен на макросе) и чтобы в редакторе появился раскрытый код макроса. При этом должно быть возможно поставить точку останова на одной из строк сгенерированной макросом.
Вот это действительно силно упростило бы разработку макросов.
E>Или такое все же принципиально невозможно?
Принципиально, возможно. Но приципиально такое возможно и без супер IDE. А нет этого потому, что нет супер IDE. Ты же спрашивал о возможностях отладки. Тебе о них и говорили.
E> E>AFAIK, IDE для Smalltalk-а давно так работают. Чуть ли не с рождения.
Ага. Только вот меня от Смолтоковских IDE тошнит. Все что я видил ужасно неудобно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
Д>>если очень хочется — возьми и сделай, благо исходники доступны
E>Я вот одного не пойму -- то о чем я написал для Nemerle принципиально не нужно?
Не принципиально. Но необходимости явно нет. Пока что я не испытывал проблем с отладкой макросов. Имеющихся средств достаточно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Дарней, Вы писали:
Д>В С++ вообще никакой отладки для хитрых рекурсивных шаблонов нет, даже трассировки. И ничего, живут же люди. Или тебе просто раздуть очередного слона из мухи?
Вот именно! Мне вооще нравится ход дисскусси.
Оппонент:
— В С++ вообще нет средств отладки.
— Ага. А единственное средство отладки макросов Немерла — это печать в косоль!...
— Позвольте, макрос тот же код и его можно отлаживать просто отладчиком.
— А как же начать отладку?
— Поставить точку останова в макросе или влепить в код ассерт.
— (даже не пробуя) Это не удобно!!! Убого!!!...
— Да все ОК.
— Неужели IDE не может упростить отладку?
— Может. Но ее нет.
— А вот Смолтоке.
В общем, поиск фатальных недостатков.
Вывод просто потрясающий. Немерле это хреново, так как нет супер-кул-фич вроде точек останова времени компиляции. То ли дело Смолток. Так что будем пока что использовать С++ в котром вообще невозможна отладка метакода и Руби для которого вообще отладчика нет.
Изумительно!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Kluev, Вы писали:
K>Просто потом это надоедает и начинаешь юзать более простые вещи.
Нет. Все с точностью до наоборот. Когда надоедает юзать "простые вещи" человек обращается к макросам. Так как они способны один раз сложным образом решить проблему устранив необходимость раз за разом юзать просые вещи.
K>А через for трудно? K>
K>// связный список. код из реального проекта
K> FB_Curve *c, *c2;
K>// split poly-curves if need:
K> for ( c = curves.first(); c; c = c2 )
K> {
K> c2 = curves.next(c);
c->>split(); // может добавить элементы в список поэтому сначала делаем next()
K> }
K>// tess
K> for ( c = curves.first(); c; c = curves.next(c) )
c->>tess();
K>
Сравни:
foreach (item in collection)
DoWork(item);
причем вместо collection может выступать массив, коллекция, хэш-таблица, связанный список... в общем, что угодно допускющее перебор. Код всегда будет единым, понятным и кратким.
У тебя же будет каша. И это только в простом случае с foreach. А таких случаев масса. В итоге твой код бует похож на мусорную яму, а мой понятен и прост настолкь насколько это возможно.
K>Хэш таблица — аналогично, только там массив списков, не вижу никаких трудностей.
Что аналогично? Я ете показал пример кода который будет един для любого типа коллекций. С for код будет разный и громоздкий.
Неужели тут еще что-то нужно объяснять?
K> Кому трудно может написать макрос для среды который заготовки циклов в редактор вставляет. Хотя мне и руками не трудно написать, на обдумывание все равно времени гораздо больше уходит.
Ну, конечно! Как я забыл. Главно ведь по быстрее надоблить код. А там хоть трава не расти.
VD>>А зачем видить внутреннюю реализацию паттерна? Мне достаточно видеть то, что код перебирает элементы коллекции. Остальное не важно.
K>А мне важно знать номер итерации на которой произошла ошибка
Зачем? А если элементы изменят порядок? Например, в хэш-таблице порядок не детерминирован.
K>(или ID обьекта, если он есть), циклы большие обьем входных данных тоже не мальнький, а корректность никто не гарантирует. Как отлаживатся то?
Твои фобии может и имели бы смысл если бы на C# или Nemerlr было бы сложнее олаживаться чем на С++. Но все как раз наоборот. foreach не только не мешают отладке, но и упрощают ее. Ты просто гарантированно не ошибелся с индексом используя foreach. А значит и отлаживать будет нечго. Если же при переборе возникла ошибка, то она целиком и полностью зависит от состояния в этом есте и ее не трудно воспроизвести по этому состоянию.
Ну, и в конце концов никто не мешает вставить в код временный отдалчный индекс.
K>В каждый обьект уникальный ID пихать?
Каждый объект и так должен быть уникален или одинаковые объекты не должны различаться вообще. Обратное практически на 100% является ошибкой.
Короче, приведи пример и я его прокоментирую.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>Iron.Python (как и Jython до этого) пытается производить вывод типов, C>в тех случаях когда это удается — вставляет готовый IL. В остальных C>случаях использует интерпретатор.
Так проблема в том, что сам язык не очень подходит для вывода типов. Отсюда и трудности. Проще сразу ввести в язык нужные ограничения. Тогда вывод типов из шаманста становится четким алгоритмом.
А так первый же ввод/вывод и ты приплыл. Ведь никто не знает, что ты там введешь строку или число.
Изменение типов во время работы тоже приводит к проблемам. Ну, добавить метод еще моно, а удалить или изменить что-то в классе — это уже приплызд.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
FR>Пусть так но мне хочется понять насколько велики возможности немерли. Просто если реализация очень сложна то практически можно сказать что этой возможности нет.
Что значит очень? Она достаточно сложна, чтобы не заниматься ею ради пенисометрии. Будет надо — сделаю.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Ну-ну. Работает и пусть работает. Ты мне еще расскажи, что статическая типизация на 99% устраняет необходимость тестирования приложений. Что после успешной компиляции нужно проверить всего две вещи -- что программа успешно стартует и столь же успешно завершается. Если эти условия выполняются, значит все работает корректно.
Ты можешь не верить но когда я пишу на C# все примерно так и происходит. Я могу несколько дней долбить код без компиляции. После компиляции (как правило все компилируется сразу ибо ReSharper рулит) и устранении пары исключений (причем на C#2 и этого скорей всего не понадобится ибо генерики) все действительно работает как надо.
Чего не скажешь про С++ в котором наведенку можно ловить произвольное колличество времени.
E>Я просто хотел понять, что делать в случае, когда я вижу, что некий макрос, производящий compile-time вычисления подставляет мне в код явно не правильную константу. Причем делает это он не всегда, а один раз в некотором месте исходного кода.
Теоритически это возможно. Просто этим никто не занимался в виду того что эта возможность мягко говоря мало актуальна.
В данном случае гораздо проще создать маленькую программу и на ней отлаживатся.
Я тебе больше скажу я так отлаживал куски здорового сервера приложений. Поднимать эту дуру которая стартует черт знает сколько ради того чтобы отладить маленький кусочек у меня небыло никакого жилания. Вот я и написал маленькое консольное приложение которое цепляет только то что нужно и стартует доли секунды.
E>Я не понимал, как войти в отладку кода макроса, когда этот код работает в отдельном параллельном процессе ncc. Оказалось, что провоцируется отладка процесса компилятора путем подстановки в код макроса специальных провоцирующих отладку инструкций (вроде Assert(false)). После этого стало понятно. Напомнило, как некоторые товарищи в C/C++ код вставляли asm { int 3h; } (вроде так).
Тебе уже раз 10 сказали что это один из способов причем не самый удобный.
E>Только для этого способа, как я понимаю, нужно иметь компилируемый исходный код макроса чтобы вставить в него Assert(false) и перекомпилироваться.
А что ты без исходного кода отлаживать то будешь? Я конечно понимаю что можно отлаживать и исполняемый код... я и сам этим занимался но это такой геморой что лучше с этим не связываться.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Cyberax, Вы писали:
C>Вот только букву "C" в CLS следует читать как "C#".
Я не спорю с тем фактом, что C# позиционировался как основной язык для платформы .NET. Тем не менее, я бы не сказал, что CLS делали с оглядкой только на него. Например, сам MS также поддерживает VB.NET и C++/CLI — в них, кстати, есть фичи, отсутствующие в C#. Опять же, есть другие замечательные языки — вроде Nemerle — которые также следуют спеке CLS, но, тем не менее, предоставляют свои (и очень удобные) фичи.
C>Нафиг. CLR мне не дает практически никаких дополнительных преимуществ в C>интеропе кроме общего GC по сравнению со старым добрым COM.
Дальше в реализации на .NET есть как минимум три варианта:
Тупые if по типу и вызов нужного метода внутри. Так писать неудобно и никто, естественно, как правило так не пишет.
Декларативное описание реализации для данных двух типов. Тут атрибуты и reflection, так что всё в рантайме. Зато никакого хардкодинга и максималоно упрощено добавление новой реализации.
То же, что и в п.2, но без reflection в рантайме — этот этап перенесён в compile-time. Тут можно использовать Nemerle и тоже всё будет пучком. Кстати, я думаю что тут хватит и сопоставления по образцу.
Для примеру вот простенькая реализация такого метода на Nemerle с использованием pattern-matching:
using System;
using System.Console;
public module Worker
{
public Process(obj1 : object, obj2 : object, n : int) : void
{
match ((obj1, obj2)) {
| (_ is int, _ is string) => WriteLine($"For int and string n = $n")
| (_ is double, _ is string) => WriteLine($"For double and string n = $n")
| (_ is string, _ is DateTime) => WriteLine($"For string and DateTime n = $n")
}
}
}
Worker.Process(1, "a", 2);
Worker.Process(1.1, "a", 3);
Worker.Process("a", DateTime.Now, 4);
Такой код выведет в консоль:
For int and string n = 2
For double and string n = 3
For string and DateTime n = 4
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Kluev, Вы писали:
VD>>>Нескажу за рядовых, но если человек хоть раз отлаживал DLL-сборку или просто Win-DLL, то проблем не возникает вообще. K>>Просто потом это надоедает WH>Что надоедает? Ты вобще хоть раз DLL отлаживал?
Неоднократно.
K>>и начинаешь юзать более простые вещи. WH>Какие?
Обычные средства ООП, без метапрограммирования, написания собственных DSL и т.п.
Простые и хорошо обкатанные вещи не требуют танцев с бубном, и позволяют писать достаточно быстро и эфективно. т.к. все ходы и сайд эффекты хорошо изучены.
Дарней wrote: > C>Примерно. В .NET большим преимуществом является только общий GC. > если забыть про проблемы с классами, исключениями, массивами и строками, > то ты совершенно прав Есть еще конечно проблема с написанием оберток, но > эта мелочь даже не заслуживает внимания
Классы — элементарно заменяются COM-интерфейсами. Массивы, строки —
SAFEARRAY, BSTR. Исключения — HRESULT+IErrorInfo.
плавали, знаем, что это за трах. Рядом с CLI даже и близко не валялось.
Вот и превратилась вся твоя крутейшая C++ интероперабельность в один сплошной COM.
VD>foreach (item in collection)
VD> DoWork(item);
VD>
VD>причем вместо collection может выступать массив, коллекция, хэш-таблица, связанный список... в общем, что угодно допускющее перебор. Код всегда будет единым, понятным и кратким.
А если в цикле в этот же контейнер элементы добавляются/удаляются? Или нужна пара или тройка соседних элементов. К примеру есть массив точек и хотим посчитать длины сегментов. Для этого нужен i и i+1 элемент. Если углы то i-1,i,i+1. foreach подходит отнюдь не везде, а написать for у меня нет трудностей.
VD>У тебя же будет каша. И это только в простом случае с foreach. А таких случаев масса. В итоге твой код бует похож на мусорную яму, а мой понятен и прост настолкь насколько это возможно.
Давай с помощью forach ты напишешь простой и понятный код который вычисляет разность между соседними точками в массиве.
VD>Твои фобии может и имели бы смысл если бы на C# или Nemerlr было бы сложнее олаживаться чем на С++. Но все как раз наоборот. foreach не только не мешают отладке, но и упрощают ее. Ты просто гарантированно не ошибелся с индексом используя foreach. А значит и отлаживать будет нечго. Если же при переборе возникла ошибка, то она целиком и полностью зависит от состояния в этом есте и ее не трудно воспроизвести по этому состоянию.
Давай без наездов. Пример из жизни: на 1024 итерации программа падает потому, что имеет место быть самопрересечение поверхности. Что мне даст контекст? вообщем-то ничего, т.к. контекст будет находится в тех подпрограммах которые были вызваны из главного цикла. Не зная номера или индекса отлаживатся будет песня. Плавали знаем. поэтому я никогда не связываюсь с вещами типа forach, себе дороже.
VD>Каждый объект и так должен быть уникален или одинаковые объекты не должны различаться вообще. Обратное практически на 100% является ошибкой.
И что мне от этой уникальности? Если это к примеру точка из трех даблов то мне как условие в брейкпоинте ставить? p.x == 3.1414534546576576 && p.y == 5656.7878799898989 давай не будем смешить людей. i == 123 гораздо проще и лучше.
Здравствуйте, VladD2, Вы писали:
E>>Можешь показать цитаты, хотя бы близкие по смыслу к этому?
VD>Прийдется показать всю твою переписку на этом форуме за исключением тех мест где ты хвалил Руби или защищал С++.
А ты все же поищи. Может и найдешь. А то ведь придумывать придется.
E>> Почему этого нельзя сделать путем установки точки прерывания в IDE на месте обращения к макросу в моем коде?
VD>Опиши, пожалуйста, сценарий того как будет отрабатвать этота точка останова. Причем как можно подоробнее.
У меня сложилось впечатление, что ты увидел мой пост, сразу начал отвечать не него поабзацно, не прочитав всего сообщения целиком.
VD>Для этого не нужно изменять комилятор. Достаточно просто создать еще один отладочный макрос который будет взводить некий флаг: VD>и поставить точку останова внутрь if-а. Далее остается вписать вызов BreakMyCacro() в нужном месте объектного кода (перед не верно работающим вызовом MyCacro).
И тебе кажется, что это не костыли?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Дарней wrote: > C>Классы — элементарно заменяются COM-интерфейсами. Массивы, строки — > C>SAFEARRAY, BSTR. Исключения — HRESULT+IErrorInfo. > плавали, знаем, что это за трах. Рядом с CLI даже и близко не валялось.
COM со встроеной языковой поддержкой (Delphi, VB, VBA) чрезвычайно
удобен для использования. Вы вот попробуйте C# через PInvoke
использовать из кода на С.
> Вот и превратилась вся твоя крутейшая C++ интероперабельность в один > сплошной COM.
Так я вроде ничего другого и не утверждал. Обидно то, что CLI недалеко
от всего этого ушел.
Здравствуйте, VladD2, Вы писали:
VD>Оппонент: VD>- В С++ вообще нет средств отладки. VD>- Ага. А единственное средство отладки макросов Немерла — это печать в косоль!... VD>- Позвольте, макрос тот же код и его можно отлаживать просто отладчиком. VD>- А как же начать отладку? VD>- Поставить точку останова в макросе или влепить в код ассерт. VD>- (даже не пробуя) Это не удобно!!! Убого!!!... VD>- Да все ОК.
Ага, за не именеем лучшего сойдет и то, что есть.
VD>- Неужели IDE не может упростить отладку? VD>- Может. Но ее нет. VD>- А вот Смолтоке.
А вот на Смолтолк не мешало бы посмотреть. Чтобы знать, к чему стремиться.
VD>В общем, поиск фатальных недостатков.
Вот именно. Достоинств в Nemerle и без меня нашли бесчетное множество.
VD>Вывод просто потрясающий. Немерле это хреново, так как нет супер-кул-фич вроде точек останова времени компиляции.
Покажи, где я озвучивал такой вывод.
VD>Так что будем пока что использовать С++ в котром вообще невозможна отладка метакода и Руби для которого вообще отладчика нет.
Откуда дровишки про отсутствие отладчика в Ruby?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, WolfHound, Вы писали:
WH>Ты можешь не верить но когда я пишу на C# все примерно так и происходит. Я могу несколько дней долбить код без компиляции. После компиляции (как правило все компилируется сразу ибо ReSharper рулит) и устранении пары исключений (причем на C#2 и этого скорей всего не понадобится ибо генерики) все действительно работает как надо.
Ты прав. Не поверю. Даже если нет ошибок в коде, решающем задачу, есть ошибки в понимании самой задачи и, как следствие, неправильное поведение программы в реальных условиях.
WH>Чего не скажешь про С++ в котором наведенку можно ловить произвольное колличество времени.
Ты можешь мне не верить, но наведенки в C++ у меня встречаются всего пару раз за год.
WH>Я тебе больше скажу я так отлаживал куски здорового сервера приложений. Поднимать эту дуру которая стартует черт знает сколько ради того чтобы отладить маленький кусочек у меня небыло никакого жилания. Вот я и написал маленькое консольное приложение которое цепляет только то что нужно и стартует доли секунды.
Когда я пишу большие программы я тоже так делаю. Но бывают ошибки, которые являются следствием не предусмотренного поведения нескольких компонентов и стечения обстоятельств. К счастью, редко.
WH>Тебе уже раз 10 сказали что это один из способов причем не самый удобный.
Я понял это с первого раза. Сказали, однако, не сразу. А потом стали повторять как попугаии.
WH>А что ты без исходного кода отлаживать то будешь? Я конечно понимаю что можно отлаживать и исполняемый код... я и сам этим занимался но это такой геморой что лучше с этим не связываться.
Собственно я о том, что при работе со сторонней библиотекой макросов у тебя может не быть ее исходных кодов. А всего два варианта библиотеки -- release (без отладочной информации) и debug (с отладочной информацией). Хотя входить отладчиком в чужой код... Тот еще геморой, я согласен.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>А вот я применительно к отладке макросов во время компиляции другого не понимаю. Почему этого нельзя сделать путем установки точки прерывания в IDE на месте обращения к макросу в моем коде?
То что ты предлагаешь называется отладка текущей сессии программы самой же текущей сессией программы. И дело здесь не в Немерле, а в самой студии. Эта возможность была бы крайне полезна для писателей плагинов к студии и всевозможных дизайнеров. Да даже и в обычных ситуациях немного побаловавшись с наследованием форм можно получить баги, которые без запуска копии студии выловить невозможно.
Почему это до сих пор не сделано — вопрос к MS. Им это как раз нужно больше всего. Видимо на то есть какие-то технические причины.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Oyster wrote: > Ну и интерфейс у метода можно сделать такой же, как тот, что видит VBA, > естественно (а что ещё нужно вызывающей стороне?...):
Ничего, в общем-то.
> void Process(object obj1, object obj2, [собственно параметры метода]) > { > //... > }
Чуть по-другому:
В С++ это делаю с помощью BOOST_PP
> Дальше в реализации на .NET есть как минимум три варианта:
Точно так же, как и в реализации С++.
> 2. Декларативное описание реализации для данных двух типов. Тут > атрибуты и reflection, так что всё в рантайме. Зато никакого > хардкодинга и максималоно упрощено добавление новой реализации.
Аналогично для С++, только в compile-time на шаблонах. Можно и в runtime
через IDispatch.
Здравствуйте, WolfHound, Вы писали:
WH>Ты можешь не верить но когда я пишу на C# все примерно так и происходит. Я могу несколько дней долбить код без компиляции. После компиляции (как правило все компилируется сразу ибо ReSharper рулит) и устранении пары исключений (причем на C#2 и этого скорей всего не понадобится ибо генерики) все действительно работает как надо.
Я запускаю компиляцию после каждого небольшого написанного или исправленного блока кода. Иногда по нескольку раз в минуту. Фактически, кнопка F7 у меня служит заменой Ctrl+Shift+S
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Kluev, Вы писали:
K>Обычные средства ООП, без метапрограммирования, написания собственных DSL и т.п. K>Простые и хорошо обкатанные вещи не требуют танцев с бубном, и позволяют писать достаточно быстро и эфективно. т.к. все ходы и сайд эффекты хорошо изучены.
Структурное программирование ещё проще. Вот только насчёт простоты и эффективности Метапрограммирование — это возможность повторно использовать целые паттерны. Обрати внимание здесь на класс PersonAccessor. Для прикладного программиста куда уж проще, вообще никакого кода писать не надо. Для писателей макросов надо, но это того стоит.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Kluev, Вы писали:
K>А если в цикле в этот же контейнер элементы добавляются/удаляются?
Тогда используй for. Вот только таких случаев существенно меньше, чем простой перебор. Соотношение примерно как в C было между необходимостью использвовать while и do while.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Дарней wrote: > C>Есть другие предложения? > не использовать C# из С
Как можно, ведь CLI на световые годы лучше COMа (который с С
замечательно работает, причем элементарно переносится на другие платформы).
Здравствуйте, Cyberax, Вы писали:
C>Как можно, ведь CLI на световые годы лучше COMа (который с С C>замечательно работает, причем элементарно переносится на другие платформы).
он лучше для тех задач, для которых предназначался. Нативный саппорт допотопных языков в число этих задач не входит
Здравствуйте, eao197, Вы писали:
E>Ну-ну. Работает и пусть работает. Ты мне еще расскажи, что статическая типизация на 99% устраняет необходимость тестирования приложений. Что после успешной компиляции нужно проверить всего две вещи -- что программа успешно стартует и столь же успешно завершается. Если эти условия выполняются, значит все работает корректно.
Ненадо говорить за других. Все свои домыслы держи при себе.
Я не говорю, что не нужна отладка. Я говорю, что юнит-тесты становятся не так актуальны и можно обойтись банальным тестированием изменяемой/добавляемой вещи.
Почему-то у меня в программах ошибки таковы, что юнит-тесты их вряд ли бы нашили. Обычно ошибки связанны с чем-то непредусмотренным. Проблем с модификацией кода я тоже как-то не испытваю.
E>Увольте, батенька. Рассказывай эти сказки начинающим программистам, которые кроме окошек в WinForms ничего не программируют.
Кто-там у нас постоянно рассуждал как другие неумеют воспринимать чужое мнение?
VD>>Обясняю последний раз и закроем тему.
E>Не нужно считать окружающих тупее себя. То, что ты излагаешь ниже я и без тебя прекрасно понимаю, благо разные преобразователи исходных текстов писать приходилось.
Ты прочти тсвои сообщения вверх по ветке. Потом поговорим о степени твоего понимания.
E>Я просто хотел понять, что делать в случае, когда я вижу, что некий макрос, производящий compile-time вычисления подставляет мне в код явно не правильную константу. Причем делает это он не всегда, а один раз в некотором месте исходного кода.
Слушай, ты задолбал. Поставь себе Немерле и повозить с ним пару дней. Вопросы уйдут сами собой. Или будут хотя бы более осмысленны.
Путей отладить этот макрос масса:
1. Поставь точку останова на этом месте в объектном коде и погляди какие параметры передаются в макрос, а потом сэмулируй тоже поведение в тесте.
2. Создать еще один отладочный макрос который будет взводить некий флаг:
и поставить точку останова внутрь if-а. Далее остается вписать вызов BreakMyCacro() в нужном месте объектного кода.
3. Воспользоваться макросом выводящим окончательный код пораждаемый макросом и разобраться что в нем не так.
4. Декомпилировать получаемую сборку с помощью Рефлектора и полядеть на получаемый код.
E>То, что нельзя зайти в код макроса из обычной отладки моего кода я и без вас с IT прекрасно понимал.
Да? Тогда к чему столь бесмысленные вопросы? Крышу рвет от метауровенй, что ли? Это бывает.
E>Я не понимал, как войти в отладку кода макроса, когда этот код работает в отдельном параллельном процессе ncc.
Отдельном от чего? От только в нем и работает.
E> Оказалось, что провоцируется отладка процесса компилятора путем подстановки в код макроса специальных провоцирующих отладку инструкций (вроде Assert(false)).
Тебе уже не один человек сказал, что это один из способв. Можно просто поставить точку останова в нужном месте макроса.
Это уже чистейшая клиника. Я устал повторять одно и тоже. Макрос выполняется при компиляции. Точка! Нет никаких параллельных процессов. Процесс один ncc.exe. Порождаемая (объектаная) программа в этот момент еще скопилирована и говорить ней бессмысленно.
E> После этого стало понятно. Напомнило, как некоторые товарищи в C/C++ код вставляли asm { int 3h; } (вроде так).
Нда, маразм крепчал (с). Какие на фиг "asm { int 3h; }"? Где их ставить? В метакоде? Ну, ды в нем можно и просто точку останова поставить. А asm { int 3h; } в прикладном коде будет просто набором AST-веток, то есть данных. Остановиться на этих данных невозможно.
Попробуй поставить asm { int 3h; } где-нибудь внутри макроса С++ или в метакоде на основе шаблонов. Будет смешно.
E>Только для этого способа, как я понимаю, нужно иметь компилируемый исходный код макроса чтобы вставить в него Assert(false) и перекомпилироваться.
Здрасте. Приехали. А что ты собрался отлаживать тогда? Если у тебя нет исходника макроса, то единственное что ты можешь сделать — это зафиксировать его некорректное поведение. Если вспомнить, что метакод — это такой же код как и обычный. То сравнение с отладкой программы без исходников даже аналогией то назвать нельзя. Это одно и тоже.
Нет, ты конечно можешь отлаживаться на уровене ассемблера. Более того, ты даже сможешь декомпилировать код макроса. Но откровенно говря это уже от безвыходности.
С тем же успехом можно сетовать на то, что исходники многих компиляторов недоступны.
В общем, к макросам нужно подходить как к плагинам компилятора. Тогда и крышу рвать не будет.
VD>>1. Место не должно влиять на результат, если макрос написан грамотно. Надо стараться делать так, чтобы разные обращения к макросам с одинаковыми параметрами приодили к одинаковому результату. Побочные эффекты иногда конечно полезны, но нужно четко осознавать их опасность. Это ничем не отличается от создания прикладного кода.
E>Прописная истина. Если бы программы писались так просто, необходимости в отладке вообще бы не было.
Не скажи. Ошибки бывют логическими или от недопонимания чужого АПИ. У меня почему-то именно такие и встречаются.
ЗЫ
Вообще сильно задолбало. Ты задал все вопросы снова и поскипал ответы на них. Дальнешую дискуссию с тобой лично по поводу отладки макросов счтаю пустой тратой времени. Если ктому-то еще кроме тебя не понятно то как это делается, то пусть он вопросы и задает. Тебя же попрошу просто перестать повторять одни ти теже вопросы снова и снова.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Дарней wrote: > C>Как можно, ведь CLI на световые годы лучше COMа (который с С > C>замечательно работает, причем элементарно переносится на другие > платформы). > он лучше для тех задач, для которых предназначался. Нативный саппорт > допотопных языков в число этих задач не входит
Вот в Java, например, есть вполне так адекватный JNI.
VladD2 wrote: > Нда, маразм крепчал (с). Какие на фиг "asm { int 3h; }"? Где их ставить? > В метакоде? Ну, ды в нем можно и просто точку останова поставить. А asm > { int 3h; } в прикладном коде будет просто набором AST-веток, то есть
Ну давайте объяснять медленно.
Вот у нас есть макросы С — это простейший метаязык, который исполняется
на этапе компиляции. Точки прерывания отладчика в нем ставить некуда.
Однако, в Boost'е есть утилита, которая позволяет интерактивно с консоли
выполнять макросы (в том числе и по шагам) и смотреть за результатом их
работы. Чем не отладчик?
Представим тоже самое для Nemerle — мы пишем код, вставляем макрос и
нажимаем кнопку "отладка". Тут же мы видим во что этот макрос
развертывается, можем по шагам проследить Nemerle'вский код и т.п.
Все это давно уже есть в Smalltalk'е, как уже говорилось много раз. И
метапрограммирование в Smalltalk'е тоже есть, кстати.
VladD2 wrote: > Так проблема в том, что сам язык не очень подходит для вывода типов. > Отсюда и трудности. Проще сразу ввести в язык нужные ограничения. Тогда > вывод типов из шаманста становится четким алгоритмом.
Просто вывод типов нужно делать постоянно.
> Изменение типов во время работы тоже приводит к проблемам. Ну, добавить > метод еще моно, а удалить или изменить что-то в классе — это уже приплызд.
А вот почитатели динамических языков так не считают. И примеры
Ruby'шного кода, которые приводит eao197 показывают, что это вполне полезно.
Дарней wrote: > C>Вот в Java, например, есть вполне так адекватный JNI. > а его адекватность заключается в чем?
Нормальный интерфейс к Java-коду. В том числе есть быстрый доступ к
массивам, поддержка нативных буфферов (распределяем буффер в нативном
коде и используем из Java) и т.п.
Здравствуйте, VladD2, Вы писали:
VD>Я не говорю, что не нужна отладка. Я говорю, что юнит-тесты становятся не так актуальны и можно обойтись банальным тестированием изменяемой/добавляемой вещи.
VD>Почему-то у меня в программах ошибки таковы, что юнит-тесты их вряд ли бы нашили. Обычно ошибки связанны с чем-то непредусмотренным. Проблем с модификацией кода я тоже как-то не испытваю.
Видишь ли, unit-тесты приобретают большое значение не тогда, когда ты их написал. А тогда, когда ты про них забыл уже. Они тебе показывают, что после внесенных в одном месте изменений, что-то в другом месте перестало работать.
Понимание это, однако, не сразу приходит. Для этого нужно некоторое время заставлять себя писать unit-тесты, даже при том, что текущие изменения прекрасно и без unit-тестов отлаживаются.
E>>Увольте, батенька. Рассказывай эти сказки начинающим программистам, которые кроме окошек в WinForms ничего не программируют.
VD>Кто-там у нас постоянно рассуждал как другие неумеют воспринимать чужое мнение?
Я. О тебе. И постоянно в этом убеждаюсь.
E>>То, что нельзя зайти в код макроса из обычной отладки моего кода я и без вас с IT прекрасно понимал.
VD>Да? Тогда к чему столь бесмысленные вопросы?
Да к тому, что про способ установить в теле макроса Assert(false), который прервет работу ncc и выдаст макрос в отладчик, я элементарно не знал. Первым про этот способ мне сказал Oyster. А ты с IT затем его вставляешь в каждое сообщение. Хотя я давно уже про него узнал.
VD>Крышу рвет от метауровенй, что ли? Это бывает.
E>>Я не понимал, как войти в отладку кода макроса, когда этот код работает в отдельном параллельном процессе ncc.
VD>Отдельном от чего? От только в нем и работает.
Процесс ncc работает отдельно от процесса Visual Studio и отдельно от процесса, в который превратиться моя программа при отладке после компиляции.
E>> После этого стало понятно. Напомнило, как некоторые товарищи в C/C++ код вставляли asm { int 3h; } (вроде так).
VD>Нда, маразм крепчал (с). Какие на фиг "asm { int 3h; }"? Где их ставить?
Прочти внимательно выделенное. В свое время это был популярный способ заставить C++ программу в каком-то месте под нагрузкой вывалиться в отладку. Вставка Assert(false) напомнила мне этот способ. Только и всего. Никуда я не предлагал его вставлять. Это еще раз к восприятию чужого мнения.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Cyberax, Вы писали:
C>Нормальный интерфейс к Java-коду. В том числе есть быстрый доступ к C>массивам, поддержка нативных буфферов (распределяем буффер в нативном C>коде и используем из Java) и т.п.
на то есть C++/CLI
если тебе лично хочется использовать plain C, и обязательно в роли клиента — это твоя сугубо личная интимная проблема.
Здравствуйте, Cyberax, Вы писали:
C>Аналогично для С++, только в compile-time на шаблонах. Можно и в runtime C>через IDispatch.
Ну значит изоморфно
Всё-таки хотелось бы глянуть на реализацию на C++, чтобы сравнить с тем же матчингом на Nemerle, например. Чисто интересно. Помню, видел только реализацию в Loki — эффективную, но громоздкую.
Здравствуйте, Дарней, Вы писали:
Д>на то есть C++/CLI Д>если тебе лично хочется использовать plain C, и обязательно в роли клиента — это твоя сугубо личная интимная проблема.
Если вы не в курсе, то С++/CIL не дает гарантии интероперабельности с нативным кодом (в Mono и PNet ее нет). Так что единственный реальный кроссплатформенный метод — PInvoke.
Oyster wrote: > Всё-таки хотелось бы глянуть на реализацию на C++, чтобы сравнить с тем > же матчингом на Nemerle, например. Чисто интересно. Помню, видел только > реализацию в Loki — эффективную, но громоздкую.
Использую модифицированый http://www.codeproject.com/cpp/mmvdd.asp
Здравствуйте, Cyberax, Вы писали:
C>Если вы не в курсе, то С++/CIL не дает гарантии интероперабельности с нативным кодом (в Mono и PNet ее нет). Так что единственный реальный кроссплатформенный метод — PInvoke.
ну во первых, про кроссплатформенность ты не говорил.
Во вторых — не беда, что с PInvoke придется попрыгать, чтобы получить кроссплатформенность. С С++ всё равно придется прыгать намного больше.
Здравствуйте, eao197, Вы писали:
WH>>Ты можешь не верить но когда я пишу на C# все примерно так и происходит. Я могу несколько дней долбить код без компиляции. После компиляции (как правило все компилируется сразу ибо ReSharper рулит) и устранении пары исключений (причем на C#2 и этого скорей всего не понадобится ибо генерики) все действительно работает как надо.
E>Ты прав. Не поверю. Даже если нет ошибок в коде, решающем задачу, есть ошибки в понимании самой задачи и, как следствие, неправильное поведение программы в реальных условиях.
Хмм. А как тут помогут юнит тесты? Их ведь как правило сам программист со своими "ошибками в понимании самой задачи" и делает.
WH>>А что ты без исходного кода отлаживать то будешь? Я конечно понимаю что можно отлаживать и исполняемый код... я и сам этим занимался но это такой геморой что лучше с этим не связываться.
E>Собственно я о том, что при работе со сторонней библиотекой макросов у тебя может не быть ее исходных кодов. А всего два варианта библиотеки -- release (без отладочной информации) и debug (с отладочной информацией). Хотя входить отладчиком в чужой код... Тот еще геморой, я согласен.
Здравствуйте, ie, Вы писали:
E>>Ты прав. Не поверю. Даже если нет ошибок в коде, решающем задачу, есть ошибки в понимании самой задачи и, как следствие, неправильное поведение программы в реальных условиях.
ie>Хмм. А как тут помогут юнит тесты? Их ведь как правило сам программист со своими "ошибками в понимании самой задачи" и делает.
Они могут помочь в случаях:
-- если их готовит кто-то другой, например, коллега за соседним столом
-- если их начинать писать до написания кода;
-- если их пишут исходя не из написанного кода, а исходя из имеющейся спецификации.
Они точно помогают, когда программа модифицируется через некоторое время. Когда про некоторые тонкие моменты забываешь, а старые unit-тесты про это помнят.
E>>Собственно я о том, что при работе со сторонней библиотекой макросов у тебя может не быть ее исходных кодов. А всего два варианта библиотеки -- release (без отладочной информации) и debug (с отладочной информацией). Хотя входить отладчиком в чужой код... Тот еще геморой, я согласен.
ie>+1
Вот, кстати, пример вспомнился. В состав VC++ всегда входил MFC в виде библиотек и в виде исходников. И при отладке MFC приложений временами доводилось входить отладчиком в код MFC. Но вот кто-нибудь изменял код MFC, перекопилировал его и заменял штатные MFC библиотеки компилятора на собственные? Думаю, что таких не много.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>>>Ты прав. Не поверю. Даже если нет ошибок в коде, решающем задачу, есть ошибки в понимании самой задачи и, как следствие, неправильное поведение программы в реальных условиях.
ie>>Хмм. А как тут помогут юнит тесты? Их ведь как правило сам программист со своими "ошибками в понимании самой задачи" и делает.
E>Они могут помочь в случаях: E>-- если их готовит кто-то другой, например, коллега за соседним столом
+1, но эта ситуация, по крайней мере в наших проектах, редка
E>-- если их начинать писать до написания кода; E>-- если их пишут исходя не из написанного кода, а исходя из имеющейся спецификации.
Как правило так и делается, НО вами описана ситуация когда "есть ошибки в понимании самой задачи". Если задача понята неправильно, то тестироваться "правильная" задача не будет.
E>Они точно помогают, когда программа модифицируется через некоторое время. Когда про некоторые тонкие моменты забываешь, а старые unit-тесты про это помнят.
+1
Здравствуйте, eao197, Вы писали:
E>Вот, кстати, пример вспомнился. В состав VC++ всегда входил MFC в виде библиотек и в виде исходников. И при отладке MFC приложений временами доводилось входить отладчиком в код MFC. Но вот кто-нибудь изменял код MFC, перекопилировал его и заменял штатные MFC библиотеки компилятора на собственные? Думаю, что таких не много.
таких много. Слишком много, я бы сказал. Некоторые, особо "продвинутые" даже залезают в бинарники студии и правят
Здравствуйте, vdimas, Вы писали:
V>боже упаси, при чем тут спесь
Не люблю такие словечки
V>просто привести пример сложения — это было на грани прикола
Ну.. значит, ты не понял то, что я пытался сказать. А я пытался сказать то, что в Nemerle мы можем генерировать достаточно сложный код, используя единожды написанный метакод (если только этот код имеет регулярную структуру, как в обсуждаемом случае).
Задумайся, например, над тем, как бы я смог написать что-то подобное приведённому мной примеру "на грани прикола" на C#...
Дарней wrote: > ну во первых, про кроссплатформенность ты не говорил.
Сказал. Точнее намекнул.
> Во вторых — не беда, что с PInvoke придется попрыгать, чтобы получить > кроссплатформенность. С С++ всё равно придется прыгать намного больше.
Ага, конечно.
Здравствуйте, Cyberax, Вы писали:
C>Однако, в Boost'е есть утилита, которая позволяет интерактивно с консоли C>выполнять макросы (в том числе и по шагам) и смотреть за результатом их C>работы. Чем не отладчик?
Ни фига не смешно. Вом уже 21-ый раз повторяют, что макросы Немерла == коду находящемуся в ДЛЛ. И что этот код можно без кмких либо проблем отлаживать статным отладчиком. При этом в отличии от макросов С у макросов немерла нет кучи проблем (вроде не гигееничности) и есть полнота по Тьюрингу. То есть на них можно сделать хоть черта лысого и при этом не иметь тех проблем что есть в С.
C>Представим тоже самое для Nemerle — мы пишем код, вставляем макрос и C>нажимаем кнопку "отладка". Тут же мы видим во что этот макрос C>развертывается, можем по шагам проследить Nemerle'вский код и т.п.
Для этого нужно просто поставить точку останова и запустить компилятор под отладкой. Если хочется тольоко посмотреть результат, так вообще можно использовать макрос печатающий результат раскрытия другого макроса.
C>Все это давно уже есть в Smalltalk'е, как уже говорилось много раз. И C>метапрограммирование в Smalltalk'е тоже есть, кстати.
Рад за Смолток. Что же ты личнь не выкинишь плюся и не сядишь на него?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Видишь ли, unit-тесты приобретают большое значение не тогда, когда ты их написал. А тогда, когда ты про них забыл уже. Они тебе показывают, что после внесенных в одном месте изменений, что-то в другом месте перестало работать.
Видил ли, я и бен них делаю огромные изменения в коде не испытаывая после этого проблем. Для этого просто вместь Руби и VIM нужно использовать C# и VS2005.
E>Понимание это, однако, не сразу приходит. Для этого нужно некоторое время заставлять себя писать unit-тесты, даже при том, что текущие изменения прекрасно и без unit-тестов отлаживаются.
Я ничего не имею против юнит-тестов. В некоторых задачах они полезны. Но я не хочу жить на юнит тестах и писать их ко всем задачам.
Вот для маросов может юнит тесты и будут полезны, так как они являются порождающими сущьностями. А к примеру, для формы ввода они на фиг не упали.
E>>>Увольте, батенька. Рассказывай эти сказки начинающим программистам, которые кроме окошек в WinForms ничего не программируют.
VD>>Кто-там у нас постоянно рассуждал как другие неумеют воспринимать чужое мнение?
E>Я. О тебе. И постоянно в этом убеждаюсь.
Ну, вот к зеркалу подойди...
E>Да к тому, что про способ установить в теле макроса Assert(false), который прервет работу ncc и выдаст макрос в отладчик, я элементарно не знал.
А ничего, что ты уже 22 раз повторил про ассерты и продолжашь повторять. И это при том, что в первый раз тебе ответили про банальную точку останова?
E>Процесс ncc работает отдельно от процесса Visual Studio
Скажу тебе по сикрету, что Студии на машине вообще может не быть.
E> и отдельно от процесса, в который превратиться моя программа при отладке после компиляции.
Естественно. На то NCC и отдельный процесс. Только как это может помешать его отладке?
E>>> После этого стало понятно. Напомнило, как некоторые товарищи в C/C++ код вставляли asm { int 3h; } (вроде так).
VD>>Нда, маразм крепчал (с). Какие на фиг "asm { int 3h; }"? Где их ставить?
E>Прочти внимательно выделенное.
Прочел. Смысла в словах не обнаружил.
E> В свое время это был популярный способ заставить C++ программу в каком-то месте под нагрузкой вывалиться в отладку.
Для тех кто не знал, что есть assert-ы. А asm в С++ в общем-то и нет. Это расширение некоторых компиляторов. К С++ имеет такое же отношение как, например, поддержка COM-а.
E> Вставка Assert(false) напомнила мне этот способ. Только и всего. Никуда я не предлагал его вставлять. Это еще раз к восприятию чужого мнения.
В С++ нельзя вставить ни Assert(false), ни int 3 в код макроса или шаблонный метакод. Причем просто потому, что этот код не компилируется, а интерпретируется компилятором.
Так что о чем ты говоришь я все равно не понимаю.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
VD>>и поставить точку останова внутрь if-а. Далее остается вписать вызов BreakMyCacro() в нужном месте объектного кода (перед не верно работающим вызовом MyCacro).
E>И тебе кажется, что это не костыли?
Хм. Я подобными способами пользовался 15 лет в совершенно разных языках и разных местах. Это общие проблемы отладки. Какие тут костыли? Конечно всегда можно создать IDE которая возьмет на себя еще одну возможность. Но пока такой нет приходится применять банальные паттерны отладки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Kluev, Вы писали:
K>А если в цикле в этот же контейнер элементы добавляются/удаляются? Или нужна пара или тройка соседних элементов. К примеру есть массив точек и хотим посчитать длины сегментов. Для этого нужен i и i+1 элемент. Если углы то i-1,i,i+1. foreach подходит отнюдь не везде, а написать for у меня нет трудностей.
Вот если тебе нужны индексы, то нет проблем воспользоваться for-ом. А если тебе нужно просто перебрать элементы, то for — это перебор.
В коне намного чаще встречается тупой перебор нежели хитрый доступ к индексам. Если это не так, то скорее всего вместо перебора используется более сложный for.
Я тебе даже больше скажу. Зачастую и перебор то и тот лишний. Ведь перебор он не самоцель. В рельном случае нужно или найти что-то или преобразовать оду последовательность в дугую. Для этого и forech слишком низкоуровневое средсво. Лучше делать функции вроде IndefOf(), Filter/FindAll и т.п. Тогда код будет еще проще и понятнее. А вероятность ошибки еще ниже.
K>Давай с помощью forach ты напишешь простой и понятный код который вычисляет разность между соседними точками в массиве.
А давай ты с помощью for-а будешь условия прверять (вместо if-а). Слабо? Ну, вот и не нужо foreach использовать там где ему не место.
K>Давай без наездов. Пример из жизни: на 1024 итерации программа падает потому, что имеет место быть самопрересечение поверхности. Что мне даст контекст? вообщем-то ничего, т.к. контекст будет находится в тех подпрограммах которые были вызваны из главного цикла. Не зная номера или индекса отлаживатся будет песня. Плавали знаем. поэтому я никогда не связываюсь с вещами типа forach, себе дороже.
Поверо на слово, если не хочешь проверять... высокоуровневый код сам по себе предотвращает ошибки. Вернее он предотвращает возможность их появления.
K>И что мне от этой уникальности?
Индекс смысла не имеет если логика на уровне экземпляров строется.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>VladD2 wrote: >> Так проблема в том, что сам язык не очень подходит для вывода типов. >> Отсюда и трудности. Проще сразу ввести в язык нужные ограничения. Тогда >> вывод типов из шаманста становится четким алгоритмом. C>Просто вывод типов нужно делать постоянно.
В рантайме? Ну, так это и будет интерпретацией.
C>А вот почитатели динамических языков так не считают. И примеры C>Ruby'шного кода, которые приводит eao197 показывают, что это вполне полезно.
Ну, вот я как-то не вижу особой разницы в коде при том, что вижу разницу в контроле, надежности и скорости.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>Откуда он "заранее известен"? У нас есть на него стандарт?
Это один из способов. Собственно он подразумевает наличие такого стандарта. Ты воодишь интерфейс который реализуется динамическим объектом. Очень частый случай. Интежфейс может быть как интерфейсом в полном смысле этого слова, так и неким делегатом/фанктором.
>> С Эллочкой сранвивать не буду. Но где-то в ЯП есть лучше? C>В той же ParrotVM, например.
Осталось только доказать это утверждение. Без этого с тем же успехом его можно назвать полным отстоем.
C>Есть. В .NET нет проблем только с рефлексивными вызовами.
Это тоже пустые слова.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
E>>Понимание это, однако, не сразу приходит. Для этого нужно некоторое время заставлять себя писать unit-тесты, даже при том, что текущие изменения прекрасно и без unit-тестов отлаживаются.
VD>Я ничего не имею против юнит-тестов. В некоторых задачах они полезны. Но я не хочу жить на юнит тестах и писать их ко всем задачам.
VD>Вот для маросов может юнит тесты и будут полезны, так как они являются порождающими сущьностями. А к примеру, для формы ввода они на фиг не упали.
А кто говорил, что unit-тесты должны быть всегда?
К тому же формы, имхо, не unit-тестами проверяют, а функциональными.
VD>А ничего, что ты уже 22 раз повторил про ассерты и продолжашь повторять. И это при том, что в первый раз тебе ответили про банальную точку останова?
Я повторяю ровно столько, сколько мне об этом напоминают.
VD>Естественно. На то NCC и отдельный процесс. Только как это может помешать его отладке?
Отсутствие Visual Studio на машине, например, как ты только что сказал по секрету.
Для тех, кто в танке: я не мог сообразить сначала, что отладка compile-time макроса должна осуществляться как отладка отдельного процесса ncc. Вот и все. Может ты уже при работе с Nemerle к таким заморочкам привык, но для других это может быть чем-то новым.
E>> В свое время это был популярный способ заставить C++ программу в каком-то месте под нагрузкой вывалиться в отладку.
VD>Для тех кто не знал, что есть assert-ы.
assert-ы банально вырубаются при NDEBUG. А вот asm { int 3h; } так не выключишь. Не говоря про то, что assert-ов может быть сотни по коду, а вот asm{} сразу в глаза бросаются.
VD> А asm в С++ в общем-то и нет. Это расширение некоторых компиляторов. К С++ имеет такое же отношение как, например, поддержка COM-а.
Не расписывайся в очередной раз в незнании C++:
7.4 The asm declaration [dcl.asm]
An asm declaration has the form
asm-definition:
asm ( string-literal ) ;
The meaning of an asm declaration is implementation-defined. [Note: Typically it is used to pass informa-
tion through the implementation to an assembler. ]
Т.е. ключевое слово asm -- это часть языка. А вот то, что внутри asm -- это уже зависит от компилятора.
VD>В С++ нельзя вставить ни Assert(false), ни int 3 в код макроса или шаблонный метакод. Причем просто потому, что этот код не компилируется, а интерпретируется компилятором.
VD>Так что о чем ты говоришь я все равно не понимаю.
Я говорил о том, что вставка Assert(false) в текст макроса Nemerle для того, чтобы ncc вывалился в нужном месте в отладчик, очень напоминает вставку int 3 в код C/C++ программы для того, чтобы программа вывалилась в нужном месте. Не макрос C/C++, не шаблон C++, а программа C/C++.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
VladD2 wrote: >> > Так проблема в том, что сам язык не очень подходит для вывода типов. >> > Отсюда и трудности. Проще сразу ввести в язык нужные ограничения. Тогда >> > вывод типов из шаманста становится четким алгоритмом. > C>Просто вывод типов нужно делать постоянно. > В рантайме? Ну, так это и будет интерпретацией.
Да. Интерпретацией это не будет, так как деревья тут же будут JITится.
> C>А вот почитатели динамических языков так не считают. И примеры > C>Ruby'шного кода, которые приводит eao197 показывают, что это вполне > полезно. > Ну, вот я как-то не вижу особой разницы в коде при том, что вижу разницу > в контроле, надежности и скорости.
Динамические языки с их возможностью автоморфинга кода дают некоторые
уникальные возможности. И естественно, отбирают некоторые ценные
возможности статической типизации. В общем, trade-off'ы как всегда.
Здравствуйте, VladD2, Вы писали:
VD>Хм. А не лучше (а главное логичнее) было бы ввести в язык алиасы (что-то вроде typedef, но порождающий новый тип)?
Да, почти об этом речь, но только не для этой задачи.
Ведь прикол этой задачи в том, чтобы мы делили дистанцию на время и в результате получали скорость. Для .Net либо же языка с предложенными алиасами сложность заключается в том, что невозможно описать всевозможные комбинации номинаторов/деноминаторов для всевозможных физических величин, которые получаются как промежуточный результат в формулах, например. Иными словами, красота решения на С++ в том, что это решение через одноразовую запись для каждой операции (+-*/) выражает в абстракной форме ЗАВИСИМОСТЬ м/у типами. Если в дотнет ввести в параметр генерика интегральную величину (а технических трудностей вроде не видно), то можно будет решить эту задачу (а заодно и еще многие другие).
V>>Т.е. выделение домена — это как бы естественно при проектировании прикладного кода.
VD>Ага. Не естественнен способ которым это делается.
Ты все время забываешь, что для С++ подобное шаблонное решение делается лишь однажды, а затем в десятках проектах используется.
Здравствуйте, VladD2, Вы писали:
V>>Да. Особенно в прикладном коде. Особенно там, где сложность формул преттендует на write-only... хоть какая-то проверка на "здравый смысл".
VD>Ну, привел бы пример из своего кода. И статистику сколько их таких.
Сколько их — зависит от от характера задач. Когда я писал прогу для расчета импульсных трансфоматоров — это километры расчетов всевозможных параметров по сходящимся алгоритмам. Статистика была под 99% Жаль, что на тот момент (99-й год) мне не пришло в голову использовать подобные трюки, поэтому отладка была болезненной.
А вот кусок из недавнего (прога — решетка фильтров и преобразователей спектра):
Заметь, подобный код дополнительно самодокументируем.
А на самом деле речь идет о том, что в идеале, если код скомпилировался, то охота верить, что в 99% случаев он верен... это нормально для сильной статической типизации.
FR>>Пусть так но мне хочется понять насколько велики возможности немерли. Просто если реализация очень сложна то практически можно сказать что этой возможности нет.
VD>Что значит очень? Она достаточно сложна, чтобы не заниматься ею ради пенисометрии. Будет надо — сделаю.
И все из-за невозможности в дотнет использовать интегральных констант в качестве параметров генериков. Тогда бы решалась в лет и можно было бы сделать не пенисонометрии ради, а спокойствия за код для.
Здравствуйте, eao197, Вы писали:
E>А кто говорил, что unit-тесты должны быть всегда?
Те кто призывает программировать на нанамически типизированных языках.
E>К тому же формы, имхо, не unit-тестами проверяют, а функциональными.
Формы это один пример из множества. Я часто встречал задачи в кторых юнит тесты не дают осбобого толку.
VD>>Естественно. На то NCC и отдельный процесс. Только как это может помешать его отладке?
E>Отсутствие Visual Studio на машине, например, как ты только что сказал по секрету.
Очередная фобия? В .NET SDK входит отладчик. Не хуже студщии.
E>Для тех, кто в танке:
Это ты сам с собой?
E> я не мог сообразить сначала, что отладка compile-time макроса должна осуществляться как отладка отдельного процесса ncc. Вот и все.
Заметь, пришлось повторить объяснение минимум 10 раз пока дошло до танкистов.
E> Может ты уже при работе с Nemerle к таким заморочкам привык, но для других это может быть чем-то новым.
Я к таким вещам привых уже давно. Любая компонентная технология приводит к этому. Чтобы, например, отладить контрол (АктивыкС, дотнетынй и т.п.) приходится грузить IDE как хост-процесс. Собственно при отладки мидл-вари происходит тоже самое.
E>assert-ы банально вырубаются при NDEBUG.
Что обычно хорошо. К тому же ассерты всегда используют внутри функции которые не вырубаются в релизе.
E> А вот asm { int 3h; } так не выключишь.
Что обычно как раз фигово.
VD>> А asm в С++ в общем-то и нет. Это расширение некоторых компиляторов. К С++ имеет такое же отношение как, например, поддержка COM-а.
E>Не расписывайся в очередной раз в незнании C++: E>
E>7.4 The asm declaration [dcl.asm]
E>An asm declaration has the form
E>
E> asm-definition:
E> asm ( string-literal ) ;
E>
E>The meaning of an asm declaration is implementation-defined. [Note: Typically it is used to pass informa-
E>tion through the implementation to an assembler. ]
E>Т.е. ключевое слово asm -- это часть языка. А вот то, что внутри asm -- это уже зависит от компилятора.
Зашибись. Теперь сравни с тем, что реализовано в VC? Там вместо крублых скобок используются фигурные. Не наводит на мысли?
Да, и какая разница? Один хрен стандарта на ассемблер нет. А int 3 есть вообще только на PC.
E>Я говорил о том, что вставка Assert(false) в текст макроса Nemerle для того, чтобы ncc вывалился в нужном месте в отладчик, очень напоминает вставку int 3 в код C/C++ программы для того, чтобы программа вывалилась в нужном месте. Не макрос C/C++, не шаблон C++, а программа C/C++.
Вообще-то скорее напоминает всавку ASSERT(FALSE), но опять же это если проводить аналогии с рантаймом. В С++-макрокоде твои инты и ASSERT(FALSE)-ы не сработают.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>Да. Интерпретацией это не будет, так как деревья тут же будут JITится.
Понимаш ли в чем дело? Смысла знаниматься компиляцией и распознованием одновремнно нет. Тормоза от распознований съедят основную часть выигрыша от компиляции. А то что язык позволяет изменить определения на лету приводит к необходимости постоянно контролировать что код не был изменен.
В общем, если в языке не будет аннотации типов и четгого его вывода в случае если они не указаны. И если в добавок язык позвляет изменить все что угодно в любой момент, то хороший результат от компиляции получить будет очень сложно.
Даже у относительно статичной Явы и дотнета есть определенные трудности с оптимизацией в следствии того, что типы могут подгружаться динамически. А уж у Питонов и Рубей с этим просто задница. Между тем потребонсть в полной и постоянно динамике нет. Так что лично я склоняюсь к тому, что идея оптимизации скриптов — тупиковая идея.
C>Динамические языки с их возможностью автоморфинга кода дают некоторые C>уникальные возможности. И естественно, отбирают некоторые ценные C>возможности статической типизации. В общем, trade-off'ы как всегда.
Динамическая самомодицикация кода причиняет вред который давно поисан многими исследователями. И как раз макросы являются отличной заменой самомодицикации кода.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>И все из-за невозможности в дотнет использовать интегральных констант в качестве параметров генериков. Тогда бы решалась в лет и можно было бы сделать не пенисонометрии ради, а спокойствия за код для.
Проблема в том, что сама задача придумана ради пенисометрии. На практике что-то не часто увидишь потребонсть в этом. Зато потиребность метапрограммирования порождающего код видна очень часто. Так зачем усложнять среду и языки не очень нужной вещи вместо того, чтобы сосредоточиться на реализации и отладке куда более важных и нужных вещей?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
WH>>Ты можешь не верить но когда я пишу на C# все примерно так и происходит. Я могу несколько дней долбить код без компиляции. После компиляции (как правило все компилируется сразу ибо ReSharper рулит) и устранении пары исключений (причем на C#2 и этого скорей всего не понадобится ибо генерики) все действительно работает как надо.
E>Ты прав. Не поверю.
Ну, так попробуй. Блин, живешь в своем мире и ходишь на форум чтобы не верить остальным. Какой смысл вообще о чем-то говорить, если верить ты не веришь, а пробовать не хочешь.
E>Ты можешь мне не верить, но наведенки в C++ у меня встречаются всего пару раз за год.
Да, уж не поверю. Причем потому, что сам пробовал и могу в отличии от тебя сравнивать. А уж Вольфхаунд точно может сравнивать. Он недвано был готов любого порвать за любимый С++. Но раз мнение изменяться, причем у далего не средненького С++-ника, значит все же в этом есть что-то большее чем реклама.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Дарней, Вы писали:
Д>если забыть про проблемы с классами, исключениями, массивами и строками, то ты совершенно прав Есть еще конечно проблема с написанием оберток, но эта мелочь даже не заслуживает внимания
Проблем куда больше. У того же С++ даже библиотеки от разных компиляторов не совместимы. А уж динамическая подгркзука модулей созданных на других языках вообще превращается в шаманство если там есть довольно сложные типы.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2 wrote: > C>Да. Интерпретацией это не будет, так как деревья тут же будут JITится. > Понимаш ли в чем дело? Смысла знаниматься компиляцией и распознованием > одновремнно нет. Тормоза от распознований съедят основную часть выигрыша > от компиляции.
Скажите это товарищам из Sun'а. HotSpot JVM этим уже 8 лет занимается —
отслеживается CFG (Control Flow Graph) для инлайнинга вызовов
виртуальных функций. Причем динамически в рантайме.
Конечно, для инлайнинга name-based полиморфных функций придется сделать
намного больше работы. Но надо же чем-то занять более мощные процессоры?
> Так что лично я склоняюсь к тому, что идея оптимизации скриптов — тупиковая идея.
По крайней мере это поинтереснее очередного JITа для C#.
> C>Динамические языки с их возможностью автоморфинга кода дают некоторые > C>уникальные возможности. И естественно, отбирают некоторые ценные > C>возможности статической типизации. В общем, trade-off'ы как всегда. > Динамическая самомодицикация кода причиняет вред который давно поисан > многими исследователями. И как раз макросы являются отличной заменой > самомодицикации кода.
Я тут за все время так и не заметил полезных примеров применения
макросов на Немерле. А вот eao197 приводил вполне полезные примеры из
своей build-системы.
VladD2 wrote: > C>Классы — элементарно заменяются COM-интерфейсами. Массивы, строки — > C>SAFEARRAY, BSTR. Исключения — HRESULT+IErrorInfo. > Неужели так охота иметь секс с этим убожеством вместо нормальной бабы?
Нет, так как с "нормальной бабой" в комплекте обязательно идет сифилис
(Microsoft), триппер (GC) и СПИД (тормоза).
VladD2 wrote: > C>Откуда он "заранее известен"? У нас есть на него стандарт? > Это один из способов. Собственно он подразумевает наличие такого > стандарта. Ты воодишь интерфейс который реализуется динамическим > объектом. Очень частый случай. Интежфейс может быть как интерфейсом в > полном смысле этого слова, так и неким делегатом/фанктором.
Вот это давно пора сделать.
>> > С Эллочкой сранвивать не буду. Но где-то в ЯП есть лучше? > C>В той же ParrotVM, например. > Осталось только доказать это утверждение. Без этого с тем же успехом его > можно назвать полным отстоем.
ParrotVM поддерживает множественное наследование, замыкания,
мультиметоды, динамические вызовы, больше встроеных типов данных.
> C>Есть. В .NET нет проблем только с рефлексивными вызовами. > Это тоже пустые слова.
Ну так покажите пример интеропа нескольких разных динамических языков.
Здравствуйте, Cyberax, Вы писали:
C>Скажите это товарищам из Sun'а. HotSpot JVM этим уже 8 лет занимается — C>отслеживается CFG (Control Flow Graph) для инлайнинга вызовов C>виртуальных функций. Причем динамически в рантайме.
Сказки не рассказывай. Есть исследовательские работы. Приемуществнно IBM-овские. Но в ХотСпоте пока что таких оптимизаций нет. Да и анализ там не постоянный, а при подгрузке типов. Слава богу ява не позволяет изменять загруженные классы.
C>Конечно, для инлайнинга name-based полиморфных функций придется сделать C>намного больше работы.
Ага. А судя по том, что коропрации вроде MS, Sun и IBM не сделали это пока для Явы с Шарпом, можно сделать вывод, что задача крайне сложная если нужны не научные звания, а действительно быстрый код.
C>Но надо же чем-то занять более мощные процессоры?
О. С этим проблем нет.
В общем, я не вижу предмета дискусси. Мое мнение не изменилос. Я считаю, что таратить время на оптимизация динамически типизируемых языков, при наличии компонентных языков с выводом типов дающих практически те же возсожности что и скриптовые, нет никакого смысла. Лучше направить силы на разработку строготипизрованных компонентных клонов Руби и Питона, раз уж эти языки многим наравятся.
>> Так что лично я склоняюсь к тому, что идея оптимизации скриптов — тупиковая идея. C>По крайней мере это поинтереснее очередного JITа для C#.
Интерес и полезность для общества разные вещи. Многие исследователи с упоением занимаются разной фигней. Лично мне намного интереснее исследования в области управляемых ОС (кстати, вот перевод статьи о Сингулярити) и метапрограммирования (рефлексии времени компиляции, макросов...).
C>Я тут за все время так и не заметил полезных примеров применения C>макросов на Немерле.
Пол Немерла — это полезное применение макросов. А у тебя не в одном глазу. Тут дело не в Немерле, а в глазах.
C> А вот eao197 приводил вполне полезные примеры из C>своей build-системы.
Скорее, бесполезные. На Немерле можно создать подобную систему и она даже будет куда более строго контролировать формат выдавая понятные сообщения об ошибках. Но зачем это делать кода есть Ant и MSBuild?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Огласите весь список, пожалуйста
В сети с ходу не нашел. Об этом много писалось в книжках исторической направленности, так как на заре компьютеризации самомдификация кода была очень распространенной, но потом ее признали очень опасной, так как они усложняет отладку программы и соотвественно делает ее очень непредсказуемой. Собственно об этом у нас даже Зверек как-то говорил http://rsdn.ru/article/philosophy/languages.xml
Здравствуйте, Cyberax, Вы писали:
C>Вот это давно пора сделать.
Это давно сделано. Проблема в самой динамической генераци. В дотнете пока что приходится для иэтого пользоватьс Эмитом. Или довольно медленными средствами компиляции из исходников на лету.
C>ParrotVM поддерживает множественное наследование,
Говорить о вреде МН я не намерен. Придерживался и придерживюсь этой точки зрения. Так что для меня этот пункт минус, а не плюс.
C> замыкания,
Для них не нужна подержка VM. Это языковая конструкция. Немерле отлично поддерживает замыкания на уровне методов (да и Шарп поддерживает). Да и любой класс по сути является заымканием.
C>мультиметоды,
То же самое. Да и мультиметоды никакого отношения к ООП не имеют.
C> динамические вызовы,
Есть в чем проблема с динамическими вызовами в дотнете?
C> больше встроеных типов данных.
1. Это только слова.
2. "Больше" не значит "лучше". Ты докажи, что они нужны, вот тогда и поговрим.
Итак, твои заявления о более широкой поддержке ООП пока что меня не убедили. Скорее наоборот.
C>Ну так покажите пример интеропа нескольких разных динамических языков.
Все языки реализующие CLS-потребительль/CLS-производитель совместимы друг с другом без интеропа. Показывать тут просто нечего. Лечите свои фобии.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Лучше направить силы на разработку строготипизрованных компонентных клонов Руби и Питона, раз уж эти языки многим наравятся.
Они нравятся именно тем, что не являются статически типизированными и динамическими. Добавь туда статическую типизацию и все преимущества испарятся.
C>> А вот eao197 приводил вполне полезные примеры из C>>своей build-системы.
VD>Скорее, бесполезные. На Немерле можно создать подобную систему и она даже будет куда более строго контролировать формат выдавая понятные сообщения об ошибках. Но зачем это делать кода есть Ant и MSBuild?
На Немерле Ну попробуй. И чей формат эта система будет контролировать? XML-ного описания?
И кстати, зачем MSBuild, если давно был Ant? И зачем Ant, если давно был Make?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Они нравятся именно тем, что не являются статически типизированными и динамическими. Добавь туда статическую типизацию и все преимущества испарятся.
Очепятался... Языки вроде Ruby и Python нравятся именно потому, что они динамически типизированные, а не статичести. А типизация там, кстати, строгая.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Cyberax, Вы писали:
C>Нет, так как с "нормальной бабой" в комплекте обязательно идет сифилис C>(Microsoft), триппер (GC) и СПИД (тормоза).
VladD2 wrote: > C>ParrotVM поддерживает множественное наследование, > Говорить о вреде МН я не намерен. Придерживался и придерживюсь этой > точки зрения. Так что для меня этот пункт минус, а не плюс.
А давайте запретим футбол? Я его не смотрю, значит он плохой.
> C> замыкания, > Для них не нужна подержка VM.
Нужна. Для _полноценной_ поддержки замыканий+continuation'ов.
> C>мультиметоды, > То же самое. Да и мультиметоды никакого отношения к ООП не имеют.
Как и просто методы, классы и интерфейсы
> C> динамические вызовы, > Есть в чем проблема с динамическими вызовами в дотнете?
Нет их.
> C> больше встроеных типов данных. > 1. Это только слова. > 2. "Больше" не значит "лучше". Ты докажи, что они нужны, вот тогда и > поговрим.
Где числа неограниченой точности? Где встроенные quad-char'ы?
> Итак, твои заявления о более широкой поддержке ООП пока что меня не > убедили. Скорее наоборот.
Не надо говорить слова "поддержка ООП", пожалуйста. Это абсолютно
бессмысленная фраза.
> C>Ну так покажите пример интеропа нескольких разных динамических языков. > Все языки реализующие CLS-потребительль/CLS-производитель совместимы > друг с другом без интеропа. Показывать тут просто нечего. Лечите свои фобии.
Ну да, а все С-программы тоже совместимы. Я ведь могу экспортировать и
импортировать Сшные функции!
Здравствуйте, VladD2, Вы писали:
VD>Как выглядит SoundDeviceImpl? И зачем вообще все эти изыски?
Абстрактные блоки должны собираться в графы (для обработки сигналов) произвольным образом в более сложные девайсы, получившиеся девайсы используются как очередные строительные блоки и т.д. Плюс к этому их десткрипторы для визуального редактирования графов/блоков.
В приведеном коде изысков — ноль. Простая задача генерирования синуса при заданной частоте дискретизации обернута в очередной строительный кирпичик.
Здравствуйте, VladD2, Вы писали:
VD>Я ничего не имею против юнит-тестов. В некоторых задачах они полезны. Но я не хочу жить на юнит тестах и писать их ко всем задачам.
VD>Вот для маросов может юнит тесты и будут полезны, так как они являются порождающими сущьностями. А к примеру, для формы ввода они на фиг не упали.
Для формы ввода они тоже полезны, но пока именно для формы ввода их не придумали.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, vdimas, Вы писали:
V>Абстрактные блоки должны собираться в графы (для обработки сигналов) произвольным образом в более сложные девайсы, получившиеся девайсы используются как очередные строительные блоки и т.д. Плюс к этому их десткрипторы для визуального редактирования графов/блоков.
V>В приведеном коде изысков — ноль. Простая задача генерирования синуса при заданной частоте дискретизации обернута в очередной строительный кирпичик.
Откровенно говоря из этого рассказа и отрывков кода идеи уловить я не смог.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Они нравятся именно тем, что не являются статически типизированными и динамическими. Добавь туда статическую типизацию и все преимущества испарятся.
Тешь себя этой мыслью. Очень помогат дальше писать на С++. А я как-то не вижу приемуществ у динамических языков. Вернее их недостатки сильно перекрывают приемущества.
E>На Немерле Ну попробуй.
Зачем? У меня еще все дома. Заниматься бессмыслеенным велосипедостроением мне не интересно.
E> И чей формат эта система будет контролировать? XML-ного описания?
Ничей, так как ее не будет. Но потенциально ей было бы пофигу.
E>И кстати, зачем MSBuild, если давно был Ant?
Спроси МС.
E> И зачем Ant, если давно был Make?
Дерьмо потому что этот мэйк. Возможностей мало. Все расширение за счет платформно зависимых утилит. Возможности расширения на полноценном ЯП вроде Явы или Шарпа нет вообще. Есть куча полностью не совместимых форматов, а конвертеров нет. Для того же Анта и МСБильда уже есть конверторы. Да и делать их просто, так как это просто ХМЛ-преобразование.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Очепятался... Языки вроде Ruby и Python нравятся именно потому, что они динамически типизированные, а не статичести. А типизация там, кстати, строгая.
Кому как.
Вот блоки кода, работа со списками, континюэйшоны и т.п. мне в Руби нравятся. А тормоза и ненедежность нет.
Самое смешное, что тебе тоже все это не нравится, так как основной код ты на С++ пишешь.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
>> C>ParrotVM поддерживает множественное наследование, >> Говорить о вреде МН я не намерен. Придерживался и придерживюсь этой >> точки зрения. Так что для меня этот пункт минус, а не плюс. C>А давайте запретим футбол? Я его не смотрю, значит он плохой.
Давай лучше футбольных хулиганов запретим. Хоть аналогия будет по прямее.
МН — это багодром. Далее см. выделенное жирным выше.
>> C> замыкания, >> Для них не нужна подержка VM. C>Нужна. Для _полноценной_ поддержки замыканий+continuation'ов.
Объясни как F#, Немерле и C# 2.0 обеспечивают эти самые замыкания и продолжения без подержки среды?
Продолжения вообще алгоритмическая сущьность. Что тут будет поддерживать VM? Сохранение полного своего состояния что ли?
>> То же самое. Да и мультиметоды никакого отношения к ООП не имеют. C>Как и просто методы, классы и интерфейсы
Потрясающая аргументация. Почитай любые работы по ООП. Методы там всюду. А вот про мультиметоды я даже и упоминания не видел.
Мультиметоды — это вариант решения задачи множественной диспечеризации. В принципе заменяется банальными if-ами. Так что не надо мешать горячее с мягким. То же сопоставление с образцом прекрасно заменяет мультиметоды на рактике. Ну, а проблемы... есть у любого решения. Те же мультиметоды не ясно как связывать с вновь загруженными типами.
>> C> динамические вызовы, >> Есть в чем проблема с динамическими вызовами в дотнете? C>Нет их.
Да? Ну, ты, былин, эксперт. Жаль что ты мне раньше не сказал. А то я уже 4 года их использую.
C>Где числа неограниченой точности? Где встроенные quad-char'ы?
В больном воображении. На фиг не упали такие типы. Если что их не трудо будет оформить в виде класса. Если конечно компилятор полноценный.
>> Итак, твои заявления о более широкой поддержке ООП пока что меня не >> убедили. Скорее наоборот. C>Не надо говорить слова "поддержка ООП", пожалуйста. Это абсолютно C>бессмысленная фраза.
Дык, не говори. Это же твои слова.
C>Ну да, а все С-программы тоже совместимы. Я ведь могу экспортировать и C>импортировать Сшные функции!
Попробуй импортировать в Borland C++ 3.1 функцию из библиотеки созданной GCC, к примеру.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вот блоки кода, работа со списками, континюэйшоны и т.п. мне в Руби нравятся. А тормоза и ненедежность нет.
Тормоза действительно есть. Но ведь не математическими расчетами же на Ruby в его нынешнем состоянии заниматься.
А вот надежность повыше C++ ной будет, имхо.
VD>Самое смешное, что тебе тоже все это не нравится, так как основной код ты на С++ пишешь.
Самое смешное, что за последние 1.5-2 месяца я больше программировал на Ruby, чем на C++.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
E>> И чей формат эта система будет контролировать? XML-ного описания?
VD>Ничей, так как ее не будет. Но потенциально ей было бы пофигу.
Ну вот давай попробуем подумать потенциально. Предположим, что ты бы использовал Nemerle для создания Internal DSL. Делал бы на макросах такие же описания, как у меня на Ruby. Ну а дальше что? Ведь сначала бы пользователю пришлось скомпилировать свое описание из Nemerle DSL в исполняемый код, затем этот код бы запустился для управления компиляцией моего проекта. Так что ли?
Когда-то ты уже пытался доказывать, что C# можно в качестве скриптового языка применять. Теперь на эту роль Nemerle предендует.
E>>И кстати, зачем MSBuild, если давно был Ant?
VD>Спроси МС.
E>> И зачем Ant, если давно был Make?
VD>Дерьмо потому что этот мэйк. Возможностей мало. Все расширение за счет платформно зависимых утилит. Возможности расширения на полноценном ЯП вроде Явы или Шарпа нет вообще. Есть куча полностью не совместимых форматов, а конвертеров нет. Для того же Анта и МСБильда уже есть конверторы. Да и делать их просто, так как это просто ХМЛ-преобразование.
Так видишь, в каждом инструменте есть свой набор фатальных (для кого-то) недостатков. И для их преодоления кто-то создает свой инструмент. Если бы это было не так, мы бы сейчас про Nemerle не разговаривали.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
VladD2 wrote: > Давай лучше футбольных хулиганов запретим. Хоть аналогия будет по прямее. > МН — это багодром. Далее см. выделенное жирным выше.
Ага, а GC — это костыль для тех, кто не умеет с памятью работать
Я изначально говорил про большие языковые возможности ParrotVM. MH — это
одна из таких возможностей, которых нет в CLI.
> C>Нужна. Для _полноценной_ поддержки замыканий+continuation'ов. > Объясни как F#, Немерле и C# 2.0 обеспечивают эти самые замыкания и > продолжения без подержки среды?
Прекрасно знаю, еще со времен Java — просто переменные кладутся не в
стек а в поля служебного объекта.
А вот где continuation'ы? Настоящие, а не в виде сгенерированых конечных
автоматов?
> Продолжения вообще алгоритмическая сущьность. Что тут будет поддерживать > VM? Сохранение полного своего состояния что ли?
"Легкие" потоки, например. Чтобы можно было нормально представлять
веб-навигацию, например (см. http://www.seaside.st).
>> > То же самое. Да и мультиметоды никакого отношения к ООП не имеют. > C>Как и просто методы, классы и интерфейсы > Потрясающая аргументация. Почитай любые работы по ООП. Методы там всюду. > А вот про мультиметоды я даже и упоминания не видел.
Определения ООП — "объекты, обменивающиеся сообщениями". В LSP тоже
ничего не говорится о методах.
Ну и такую деталь, что методы являются частным случаем мультиметодов я
уж вообще говорить не буду.
> Мультиметоды — это вариант решения задачи множественной диспечеризации. > В принципе заменяется банальными if-ами.
Ну да, а наследование с полиморфизмом — банальным switch'ем. Что дальше?
> Те же мультиметоды не ясно как связывать с вновь загруженными типами.
В ParrotVM — совершенно ясно, так как код динамический. В .NET —
действительно ничего нормального не получится (о чем я говорил уже раза
три).
> C>Нет их. > Да? Ну, ты, былин, эксперт. Жаль что ты мне раньше не сказал. А то я уже > 4 года их использую.
Еще раз говорю — это _рефлексивные_ вызовы, а не динамические. Динамику
можно эмулировать с помощью словарей делегатов и рефлексии, но в CLI ее нет.
> C>Где числа неограниченой точности? Где встроенные quad-char'ы? > В больном воображении. На фиг не упали такие типы.
Опять же _тебе_ они нафиг не упали, а вот мне они очень даже нужны.
> Если что их не трудо > будет оформить в виде класса. Если конечно компилятор полноценный.
Оформите quadchar (32-битный символ) в виде класса на C#, пожалуйста.
Чтобы с ним работать было не хуже чем с обычным char'ом, JIT его понимал
и использовал оптимизации типа SSE2/AltiVec и т.п.
> C>Не надо говорить слова "поддержка ООП", пожалуйста. Это абсолютно > C>бессмысленная фраза. > Дык, не говори. Это же твои слова.
Где я это сказал? Вроде я ничего такого в последнее время не пил...
> C>Ну да, а все С-программы тоже совместимы. Я ведь могу экспортировать и > C>импортировать Сшные функции! > Попробуй импортировать в Borland C++ 3.1 функцию из библиотеки созданной > GCC, к примеру.
В BC3.1 не получится. А вот в Watcom — элементарно.
Здравствуйте, eao197, Вы писали:
E>Тормоза действительно есть. Но ведь не математическими расчетами же на Ruby в его нынешнем состоянии заниматься.
А что мешает и рассчеты делать на более удобном языке?
E>А вот надежность повыше C++ ной будет, имхо.
Ну, вот и подумай зачем тогда вообще нужен С++ если вполне сравнимую производительность можно полуить на Шарпе или Немерле.
E>Самое смешное, что за последние 1.5-2 месяца я больше программировал на Ruby, чем на C++.
У меня почти тоже самое, за исключением того, что я вообще в последнее время к С++ обращаюсь только для тестов.
И Руби мне тоже особо не нужен. Так как Шарп и Немрле дают большу надежность и больше возможностей (хотя бы в следствии размеров библиотек и количества стороннего кода).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
E>Ну вот давай попробуем подумать потенциально. Предположим, что ты бы использовал Nemerle для создания Internal DSL.
Я уже говорил, что смысла ведосипедить нет. Ну, да ладно... предположим.
E>Делал бы на макросах такие же описания, как у меня на Ruby. Ну а дальше что? Ведь сначала бы пользователю пришлось скомпилировать свое описание из Nemerle DSL в исполняемый код, затем этот код бы запустился для управления компиляцией моего проекта. Так что ли?
В общем-то это не проблема. Ведь нет особых проблем автоматически компилировать "скрипт" перед использованием. Если это делать с умом (т.е. кэшировать сборку если ничего не изменилось в проекте).
Другое дело, что вообще не разумно применять внутренний ДСЛ для описания проекта, так как этим самым мы даем слишком большой набор возможностей потенциальному пользовател.
Если бы передо мной стала бы такая задача, то я скорее всего сделал бы свой вариант Ант-а/МСБилд-а. То есть в качестве языка описания взял бы текстовый форат, и сделал бы расуширяемую за счет компонентного подхода утилиту, которая читала бы и интерпретировла бы этот формат.
Совершенно естествнно, что в качестве инструмент я выбрал бы не Руби или С++ а управляемый язык.
E>Когда-то ты уже пытался доказывать, что C# можно в качестве скриптового языка применять. Теперь на эту роль Nemerle предендует.
Не, я не пытался доказывать. Я использовал C# в качестве скриптового языка. С большим, надо признать, успехом.
VD>>Дерьмо потому что этот мэйк. Возможностей мало. Все расширение за счет платформно зависимых утилит. Возможности расширения на полноценном ЯП вроде Явы или Шарпа нет вообще. Есть куча полностью не совместимых форматов, а конвертеров нет. Для того же Анта и МСБильда уже есть конверторы. Да и делать их просто, так как это просто ХМЛ-преобразование.
E>Так видишь, в каждом инструменте есть свой набор фатальных (для кого-то) недостатков.
Что-то я измоих слов этого не вижу.
E> И для их преодоления кто-то создает свой инструмент. Если бы это было не так, мы бы сейчас про Nemerle не разговаривали.
Про Nemerle я говорю только потому-что увидил что-то что можно реально назвать шагом вперед в области мэйнстрим-языков общего назначения. Появится что-то новое, будем говорить о нем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
>> Давай лучше футбольных хулиганов запретим. Хоть аналогия будет по прямее. >> МН — это багодром. Далее см. выделенное жирным выше. C>Ага, а GC — это костыль для тех, кто не умеет с памятью работать
Ты сам с собой что ли разговр ведешь?
Причем тут костыли, ЖЦ?
C>Я изначально говорил про большие языковые возможности ParrotVM. MH — это C>одна из таких возможностей, которых нет в CLI.
Проделай простешое размышление. Ответь на вопрос. Если МС имевший код компилятора С++ поддерживающего МС делвая виртуальную машину для Явы и Дотнет не решил включать эту возможность, значи все же это было архитектурное решение, а не недостаток знаний или умений?
На сегодня есть ряд решений заменяющих МН и они вводятся в язык без именения виртуальной машины. Так что встраивание МН в ВМ не очень разумное решение.
Кстати, Эфил и С++ таки поддерживают МН не смотря на его отсуствие в ВМ дотнета.
C>Прекрасно знаю, еще со времен Java — просто переменные кладутся не в C>стек а в поля служебного объекта.
И зачем тогда поддержка в рантайме? Ты не понимашь того что чем проще рантайм, тем проще его перенос?
Лучше потратить время на оптимизации устраняющие котокоживущие локальные объекты заменя их где можно стэковыми переменными.
C>А вот где continuation'ы? Настоящие, а не в виде сгенерированых конечных C>автоматов?
continuation-ы — это алгоритмические сущьности. Их можно реализоывать разными путями. В том числе и на конечных автоаматах. Так что прежде чем продолжать обсуждение "настоящих" continuation-ов потрудись объяснить чем плохи решения на базе переписывания кода с использованием те хе КА.
>> Продолжения вообще алгоритмическая сущьность. Что тут будет поддерживать >> VM? Сохранение полного своего состояния что ли? C>"Легкие" потоки, например.
Легкие потоки уже есть в чистом виде. Эмулировать их на базе continuation-ов смысла нет.
C> Чтобы можно было нормально представлять C>веб-навигацию, например (см. http://www.seaside.st).
Это можно сделть даже на базе итераторов, которые являются одним из вариантов реализации continuation-ов (хотя и ограниченым). Вот, напиример, очень похожая задача решенная с использованием итераторов Михаликом http://blogs.gotdotnet.ru/personal/mihailik/PermaLink.aspx?guid=cb5f993a-2371-4365-80cf-0605461a49c4
C>Ну и такую деталь, что методы являются частным случаем мультиметодов я C>уж вообще говорить не буду.
Спорный вопрос. Эдак и глобальные функции можно считать частным случаем методов.
Мултиметоды могжно реализовать в языках вообще к ООП отношения не имеющим. Так что это именно алгоритмическая фича. К тому же заменяемая другими решениями.
>> Те же мультиметоды не ясно как связывать с вновь загруженными типами. C>В ParrotVM — совершенно ясно, так как код динамический.
Дык а смысл тогда что-то было делать?
C> В .NET — C>действительно ничего нормального не получится (о чем я говорил уже раза C>три).
Сделать то можно все что угодно. Вопрос только в скоросте полученного решения и в востребованности возможности. То что востребованость нулевая и так видно. А вот с производительностью... Почти уверен, что она будет низкой.
>> C>Нет их. >> Да? Ну, ты, былин, эксперт. Жаль что ты мне раньше не сказал. А то я уже >> 4 года их использую. C>Еще раз говорю — это _рефлексивные_ вызовы, а не динамические.
Сеньезно? И делегаты? Ну, ты действительно эксперт. К тому же поведуй мне разницу между "рефлективными" и "динамическими" вызовами.
C> Динамику C>можно эмулировать с помощью словарей делегатов и рефлексии, но в CLI ее нет.
Кого "её"?
C>Опять же _тебе_ они нафиг не упали, а вот мне они очень даже нужны.
Воспользуешся классом, если что. В нормальном языке разнины ты не заметишь.
>> Если что их не трудо >> будет оформить в виде класса. Если конечно компилятор полноценный. C>Оформите quadchar (32-битный символ) в виде класса на C#, пожалуйста.
Зачем? Проще и разумнее строку. Только опять же смысла нет. С поддержкой юникода и так все ОК.
C>Чтобы с ним работать было не хуже чем с обычным char'ом, JIT его понимал C>и использовал оптимизации типа SSE2/AltiVec и т.п.
Оптимизации — это проблемы джита. А символы всегда хоаняться в базовых типах. char в дотнете это просто UInt16. Нет проблем использовать вместо него хоть UInt64. Бросто как всегда на фиг не упало. Для возни с юникодом есть соотвествющий API.
>> C>Не надо говорить слова "поддержка ООП", пожалуйста. Это абсолютно >> C>бессмысленная фраза. >> Дык, не говори. Это же твои слова. C>Где я это сказал? Вроде я ничего такого в последнее время не пил...
Ну, ты эта... следи за тем, что говоришь. А говорил ты это выше по теме. Ты же начал обсуждение поддржки ООП ВМ-мами.
>> C>Ну да, а все С-программы тоже совместимы. Я ведь могу экспортировать и >> C>импортировать Сшные функции! >> Попробуй импортировать в Borland C++ 3.1 функцию из библиотеки созданной >> GCC, к примеру. C>В BC3.1 не получится. А вот в Watcom — элементарно.
Неполучится? А что так? А вот между Моно и Дотнетам полная бинарная совместимось. Забавно правда?
Выходит, что у С++ хреново даже в совместимости между собственными компиляторам. О чем тогда говорить на междязыковом и межплатформном уровне?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А что мешает и рассчеты делать на более удобном языке?
Давно я не занимался расчетами, но кажется мне, что ни на одном управляемом языке не хватит скорости для действительно больших расчетов. Даже элементарные проверки на выход за пределы массивов на больших объемах информации будут давать существенный оверхед.
Да и кажется мне, что в C++ есть много возможностей по выжиманию скорости. Хотябы возможность переопределения new/delete, переопределение операторов, expression templates.
VD>Ну, вот и подумай зачем тогда вообще нужен С++ если вполне сравнимую производительность можно полуить на Шарпе или Немерле.
Нужен хотя бы для сопровождения унаследованных проектов.
У Nemerle, несмотря на его достоинства, есть один большой недостаток: привязанность к .NET.
Так что, если смотреть, куда бы сдернуть с C++, то мне больше нравится D или Scala. Только у D с библиотеками хуже, т.к. у Scala, насколько я понимаю, полная интероперабильность с JDK. Да и развивается Scala, уже 2.0 вышла.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Давно я не занимался расчетами, но кажется мне, что ни на одном управляемом языке не хватит скорости для действительно больших расчетов.
Ясно. Фобии.
E>Даже элементарные проверки на выход за пределы массивов на больших объемах информации будут давать существенный оверхед.
В курсе, что во многих случаях компилятор их устраняет. И то что это одна ассемблерная инструция на цикл?
В общем, ясно. Импытываем фобии к управляемому коду и в это время пользуемся одним из самых медленных интерпретаторов в мире.
E>Да и кажется мне, что в C++ есть много возможностей по выжиманию скорости. Хотябы возможность переопределения new/delete, переопределение операторов, expression templates.
VD>>Ну, вот и подумай зачем тогда вообще нужен С++ если вполне сравнимую производительность можно полуить на Шарпе или Немерле.
E>Нужен хотя бы для сопровождения унаследованных проектов.
Рано или поздно ты начнешь писать новый проект. А учитывая, что уже сейчас кучу кода (по твоим словам) пишешь на Руби, у тебя и сейчас много слабо связанных задач.
E>У Nemerle, несмотря на его достоинства, есть один большой недостаток: привязанность к .NET. E>Так что, если смотреть, куда бы сдернуть с C++, то мне больше нравится D или Scala. Только у D с библиотеками хуже, т.к. у Scala, насколько я понимаю, полная интероперабильность с JDK. Да и развивается Scala, уже 2.0 вышла.
Scala тоже очень красивый язык. Если ориентироваться на Яву, то он наверно лучший выбор. Но Ди по-моему — это плохой выбор. Он имеет раяд просчетов и уступок вроде нетипобезопасных инструций. Да и с библиотеками у него явно плохо.
Что до Немелра, то на Моно он работает и вроде как ребята считают поддержку Моно очень важной. Похоже сами (возможно часть) сидят в Линуксе. Другое дело, что Моно пока что сильно уступает по скорости кода.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>И все из-за невозможности в дотнет использовать интегральных констант в качестве параметров генериков. Тогда бы решалась в лет и можно было бы сделать не пенисонометрии ради, а спокойствия за код для.
Да нет же Отсутствие возможности использования скаляров как параметров генериков никоим образом не помешает решить задачу на Nemerle, в котором есть гораздо более развитые средства метапрограммирования. Не надо смотреть на решение задачи под углом C++ — лучше поближе ознакомиться с Nemerle для начала.
Здравствуйте, VladD2, Вы писали:
E>>Даже элементарные проверки на выход за пределы массивов на больших объемах информации будут давать существенный оверхед.
VD>В курсе, что во многих случаях компилятор их устраняет. И то что это одна ассемблерная инструция на цикл?
Сомневаюсь, что компилятор способен убрать эти проверки для векторов и массивов, чья размерность во время компиляции неизвестна. А в большинстве случаев размерности как раз в run-time определяются, и память для них динамически выделяется.
VD>В общем, ясно. Импытываем фобии к управляемому коду и в это время пользуемся одним из самых медленных интерпретаторов в мире.
Так я же Ruby не для числодробительных задач применяю
VD>Scala тоже очень красивый язык. Если ориентироваться на Яву, то он наверно лучший выбор.
Видимо у меня другие понятия о красоте, или еще недостаточно Scala покурил.
VD>Но Ди по-моему — это плохой выбор. Он имеет раяд просчетов и уступок вроде нетипобезопасных инструций. Да и с библиотеками у него явно плохо.
У D есть отличная фишка -- поддержка RAII.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
VladD2 wrote: > Сказки не рассказывай. Есть исследовательские работы. Приемуществнно > IBM-овские. Но в ХотСпоте пока что таких оптимизаций нет. Да и анализ > там не постоянный, а при подгрузке типов.
Спорим?
> Слава богу ява не позволяет изменять загруженные классы.
Анализ кода нужен для спекулятивного инлайнинга обычных виртуальных вызовов.
> C>Конечно, для инлайнинга name-based полиморфных функций придется сделать > C>намного больше работы. > Ага. А судя по том, что коропрации вроде MS, Sun и IBM не сделали это > пока для Явы с Шарпом, можно сделать вывод, что задача крайне сложная > если нужны не научные звания, а действительно быстрый код.
Нет, просто сильный интерес к динамическим языкам только недавно
появился. В конце концов, сколько лет прошло от первого JITа до Java JVM
и Strongalk?
> Пол Немерла — это полезное применение макросов. А у тебя не в одном > глазу. Тут дело не в Немерле, а в глазах.
Ну так давайте примеры прикладного кода. Я пока что видел, в основном,
один и тот же пример с байндингом SQL-запроса.
> C> А вот eao197 приводил вполне полезные примеры из > C>своей build-системы. > Скорее, бесполезные. На Немерле можно создать подобную систему и она > даже будет куда более строго контролировать формат выдавая понятные > сообщения об ошибках.
Ну так покажите класс.
Хотя... Можно создать билд-систему на ассемблере, которая будет круче
всех существующих.
> Но зачем это делать кода есть Ant и MSBuild?
А зачем нужен был ant, когда был make?
Здравствуйте, Oyster, Вы писали:
V>>И все из-за невозможности в дотнет использовать интегральных констант в качестве параметров генериков. Тогда бы решалась в лет и можно было бы сделать не пенисонометрии ради, а спокойствия за код для.
O>Да нет же Отсутствие возможности использования скаляров как параметров генериков никоим образом не помешает решить задачу на Nemerle, в котором есть гораздо более развитые средства метапрограммирования. Не надо смотреть на решение задачи под углом C++ — лучше поближе ознакомиться с Nemerle для начала.
Я не про Nemerle, а про дотнет вообще. Эту задачу и на C# можно было бы решить.
Здравствуйте, eao197, Вы писали:
E>Сомневаюсь, что компилятор способен убрать эти проверки для векторов и массивов, чья размерность во время компиляции неизвестна.
Это не вопрос сомнений. Это доказанный факт. Джит распознает паттерн индексации и выносит проверки индекса за пределы цикла.
Проблема только в том, что пока что это делается довольно примитивно. Любые манипуляции с индексом обычно делают оптимизацию недостпной. Но ничто не помешает усложнить алгоритм в будещем.
E> А в большинстве случаев размерности как раз в run-time определяются, и память для них динамически выделяется.
В дотнет и Ява в 100 процентах, так как массивы — это объекты. А все объекты создаются динамически. Правда не загорами оптимизация когда локальные объекты будут создаваться в стеки и инлайниться. Но это уже частности.
VD>>В общем, ясно. Импытываем фобии к управляемому коду и в это время пользуемся одним из самых медленных интерпретаторов в мире.
E>Так я же Ruby не для числодробительных задач применяю
Дык ты и С++ не для них используешь.
E>Видимо у меня другие понятия о красоте, или еще недостаточно Scala покурил.
Думаю, второе.
E>У D есть отличная фишка -- поддержка RAII.
Когда нибудь ты поймешь, что эта фича не столь замечательна чтобы компенсировать остальные просчеты. Заметь все кто на практике пробовал using+IDispose обычно через некоторое время перестают уделять этой фиче огромное значение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
>> IBM-овские. Но в ХотСпоте пока что таких оптимизаций нет. Да и анализ там не постоянный, а при подгрузке типов. C>Спорим?
Спорь. А лучше ссылку приведи.
>> Слава богу ява не позволяет изменять загруженные классы. C>Анализ кода нужен для спекулятивного инлайнинга обычных виртуальных вызовов.
Еще раз. Это пока только в планах.
C>Нет, просто сильный интерес к динамическим языкам только недавно появился.
Он не больше чем во времена QBaisic/Turbo Baisic. А про Лисп я вообще молчу.
C> В конце концов, сколько лет прошло от первого JITа до Java JVM и Strongalk?
А столько лет прошло от появления первого скрипта?
C>Ну так давайте примеры прикладного кода. Я пока что видел, в основном, один и тот же пример с байндингом SQL-запроса.
Скачай Немерле и погляди его деректории с исходниками. Там тонны прикладного кода.
C>Ну так покажите класс.
Я не больной на спор делать совершенно не нужные вещи.
C>Хотя... Можно создать билд-систему на ассемблере, которая будет круче всех существующих.
Можно, но сложно.
>> Но зачем это делать кода есть Ant и MSBuild? C>А зачем нужен был ant, когда был make?
По пользуйся обоими — узнашь. Особно прикольно пользоваться make-ом на разных ОС. Знашь почему Цигвин ташит за собой сотни метров утилит?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2 wrote: >> > IBM-овские. Но в ХотСпоте пока что таких оптимизаций нет. Да и анализ > там не постоянный, а при подгрузке типов. > C>Спорим? > Спорь. А лучше ссылку приведи.
Начнем с Wikipedia:
Its name derives from the fact that as it runs Java byte-code, it continually analyzes the program's performance for "hot spots"
which are frequently or repeatedly executed. These are then targeted for
optimization, leading to high performance execution with a minimum of
overhead for less performance-critical code.
The Hotspot VM begins by interpreting all code, but it monitors
the execution of that code. As mentioned earlier, most programs spend 80
to 90 percent of their time executing 10 to 20 percent of the code. By
monitoring the program execution, the Hotspot VM can figure out which
methods represent the program's "hot spot" -- the 10 to 20 percent of
the code that is executed 80 to 90 percent of the time.
When the Hotspot VM decides that a particular method is in the hot spot,
it fires off a background thread that compiles those bytecodes to
native and heavily optimizes the native code. Meanwhile, the program
can still execute that method by interpreting its bytecodes. Because the
program isn't held up and because the Hotspot VM is only compiling and
optimizing the "hot spot" (perhaps 10 to 20 percent of the code), the
Hotspot VM has more time than a traditional JIT to perform optimizations.
...
The Hotspot VM keeps the old bytecodes around in case a method moves
out of the hot spot. (The hot spot may move somewhat as the program
executes.) If a method moves out of the hot spot, the VM can discard
the compiled code and revert back to interpreting that method's
bytecodes.
Вот статья с тестом, демонстрирующим эффекты HotSpot'а: http://www.javaworld.com/javaworld/javaqa/2003-04/01-qa-0411-hotspot.html
>> > Слава богу ява не позволяет изменять загруженные классы. > C>Анализ кода нужен для спекулятивного инлайнинга обычных виртуальных > вызовов. > Еще раз. Это пока только в планах.
Так, теперь про инлайнинг:
One advantage Hotspot's adaptive optimization approach has over static
compilation is that, because it is happening at runtime, it can use
information not available to a static compiler. For example, even though
there may be 30 possible implementations that may get called for a
particular method invocation, at run-time perhaps only two of them are
ever called. The Hotspot approach enables only those two to be inlined,
thereby reducing the exploding size problem.
> Скачай Немерле и погляди его деректории с исходниками. Там тонны > прикладного кода.
Мне не сэмплы нужны. Нужно реальное приложение, с сильным использованием
макросов.
> По пользуйся обоими — узнашь. Особно прикольно пользоваться make-ом на > разных ОС. Знашь почему Цигвин ташит за собой сотни метров утилит?
Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас,
правда, я пользуюсь Boost.Build v2, которая еще удобнее.
Здравствуйте, Cyberax, Вы писали:
>> По пользуйся обоими — узнашь. Особно прикольно пользоваться make-ом на >> разных ОС. Знашь почему Цигвин ташит за собой сотни метров утилит? C>Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас, C>правда, я пользуюсь Boost.Build v2, которая еще удобнее.
Спасибо за добрые слова
Сейчас на rubyforge делается версия 1.1, которая стала еще чуть-чуть удобнее, да и поддержка манифестов VC++8.0 добавилась. Так что, если было что-то, что тебе в mxx_ru не понравилось, то отпиши туда в форум -- попробуем улучшить
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Cyberax, Вы писали:
C>VladD2 wrote: >>> > IBM-овские. Но в ХотСпоте пока что таких оптимизаций нет. Да и анализ >> там не постоянный, а при подгрузке типов. >> C>Спорим? >> Спорь. А лучше ссылку приведи. C>Начнем с Wikipedia:
Неотносящаяся к делу фигня поскипана.
C>Так, теперь про инлайнинг: C>
C>One advantage Hotspot's adaptive optimization approach has over static
C>compilation is that, because it is happening at runtime, it can use
C>information not available to a static compiler. For example, even though
C>there may be 30 possible implementations that may get called for a
C>particular method invocation, at run-time perhaps only two of them are
C>ever called. The Hotspot approach enables only those two to be inlined,
C>thereby reducing the exploding size problem.
Где здесь говорится о том, что ХотСпот делает спекулятивный инлайнинг?
>> Скачай Немерле и погляди его деректории с исходниками. Там тонны >> прикладного кода. C>Мне не сэмплы нужны. Нужно реальное приложение, с сильным использованием C>макросов.
Вот компилятор и есть такое приложение. Он сам на себе создается и использует море макросов.
>> По пользуйся обоими — узнашь. Особно прикольно пользоваться make-ом на >> разных ОС. Знашь почему Цигвин ташит за собой сотни метров утилит? C>Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас, C>правда, я пользуюсь Boost.Build v2, которая еще удобнее.
Серьезно? А ведь "билд-система eao197 для С++ намного удобнее ant'а"! Что же ты пользуешся чем попало?
А мэйком почему не пользуешся?
Вообще забавный разговор выходит. Мэйк форевар, мэйк крут. Но один велосипед на тему мэйка изобретает, а другой испльзует нестандарткую приблуду из библиотеки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, eao197, Вы писали:
C>>Сейчас, C>>правда, я пользуюсь Boost.Build v2, которая еще удобнее.
E>Спасибо за добрые слова E>Сейчас на rubyforge делается версия 1.1, которая стала еще чуть-чуть удобнее, да и поддержка манифестов VC++8.0 добавилась. Так что, если было что-то, что тебе в mxx_ru не понравилось, то отпиши туда в форум -- попробуем улучшить
Прими и от меня добрые слова. Маладец! Я тоже пользуюсь не твоей системой, а МСБилдом.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
V>>Я не про Nemerle, а про дотнет вообще. Эту задачу и на C# можно было бы решить.
O>А смысл говорить про .NET вообще, если речь идёт о Nemerle? Эту задачу и на VB можно было бы решить, если б там были шаблоны со скалярными параметрами
Блин, епрст... Ну ты бы хоть предположил самостоятельно, лучше это было бы или хуже для дотнета... Вернись на пару постов назад и посмотри к чему и как это было сказано...
Здравствуйте, VladD2, Вы писали:
VD>Прими и от меня добрые слова. Маладец! Я тоже пользуюсь не твоей системой, а МСБилдом.
Подтасовкой фактов занимаетесь, правдоречивый вы наш. В исходном сообщении было так:
C>Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас,
C>правда, я пользуюсь Boost.Build v2, которая еще удобнее.
Спасибо за добрые слова
Спасибо относилось к признанию того факта, что mxx_ru для C++ удобнее ant-а. А так же, запоздалое спасибо за то, что Cyberax в свое время предлагал boost-оводом mxx_ru в качестве build-системы.
То, что лично Cyberax пользуется не mxx_ru, а Boost.Build v2 меня не обижает. Лично ему удобнее. Значит есть что в mxx_ru улучшать.
Ты же пользуйся хоть чем -- твои сексуальный проблемы меня абсолютно не волнуют.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, vdimas, Вы писали:
V>Блин, епрст... Ну ты бы хоть предположил самостоятельно, лучше это было бы или хуже для дотнета... Вернись на пару постов назад и посмотри к чему и как это было сказано...
Шестое чувство мне подсказывает, что решение не позволять использовать целочисленные константы как параметры генериков было сделано неспроста. Конкретно — в MS испугались, что это превратит C# (и VB.NET) в сложный язык, как C++. MS как раз пытается сохранить C# простым. При этом я не говорю, что это правильное решение (возможно, я даже не считаю так). Но я и не считаю, что скалярные параметры генериков это лучшее средство для метапрограммирования. Скорее, наоборот — подход Nemerle (подход Лиспа или Схемы, на самом деле, насколько я понимаю) мне нравится больше.
Кто-то может сказать, что за неимением другого и скалярные параметры генериков прокатят. Но другое-то как раз имеется...
Здравствуйте, Oyster, Вы писали:
O>Шестое чувство мне подсказывает, что решение не позволять использовать целочисленные константы как параметры генериков было сделано неспроста. Конкретно — в MS испугались, что это превратит C# (и VB.NET) в сложный язык, как C++.
Нет, сложность шаблонов в С++ никак не от целочисленных констант, а от:
— возможности полной либо частичной специализации, т.е. иногда НЕОЧЕВИДНО, во что же именно выливается применение шаблона, ибо надо единовременно рассматривать ВСЕ полные либо частичные специализации
— система зависимых типов, т.е. очень много шаблонов (чуть ли не 90%) работает с зависимыми типами, либо вводимыми как typedef т.е. тип-член другого типа, либо выводимыми из namespace используемых аргументов.
Введение целочисленного параметра никак не повлияет на ОЧЕВИДНОСТЬ генерик-кода (очевидность — основное отличие генериков .Net от шаблонов C++)
O>MS как раз пытается сохранить C# простым. При этом я не говорю, что это правильное решение (возможно, я даже не считаю так). Но я и не считаю, что скалярные параметры генериков это лучшее средство для метапрограммирования. Скорее, наоборот — подход Nemerle (подход Лиспа или Схемы, на самом деле, насколько я понимаю) мне нравится больше.
А мне не очень нравится . Сам дотнет не поддерживает функциональные типы как первоклассные значения. Делегаты — это адаптер, но не представляет из себя функциональный тип. (т.е. создать экземпляр делегата — не значит создать экземпляр ф-ии).
Более того, ситуация, при которой делегаты разного типа, но имеющие одинаковую сигнатуру Invoke не совместимы — это вообще нонсенс на уровне грубой ошибки проектирования (!!!). Пусть устранят эти баги, тогда функциональная часть программисткого направления станет более естественной для дотнета, и Nemerle в т.ч.
--------
Говорю неспроста. У самого есть черновик интерпретатора Схемы под дотнет, и исследовал более десятка вариантов имплементаций Схемы/Лиспа под Яву и дотнет. В общем, кое-какие ограничения не позволяют делать результирующий код достаточно эффективным. Тоже самое относитя к Форту. Несмотря на то, что байт-машина дотнет по своей вычислительной модели представляет из себя именно Форт-машину, написать компилятор Форта "напрямую" — никак, ибо верификатор дотнета не пропускает код, у которого указатель стека на входе и на выходе метода не совпадает . Поэтому единственная удачная реализаци Форта для дотнет использует эмуляцию обоих стеков Форта.
Здравствуйте, vdimas, Вы писали:
V>Введение целочисленного параметра никак не повлияет на ОЧЕВИДНОСТЬ генерик-кода (очевидность — основное отличие генериков .Net от шаблонов C++)
Ну не знаю. Сравни, например, код для решения одной и той же задачи на C++
. Имхо на Nemerle всё-таки понятнее малость. Но на вкус и цвет... кому-то, наверное, нагромождение угловых скобочек понравится больше...
V>А мне не очень нравится . Сам дотнет не поддерживает функциональные типы как первоклассные значения. Делегаты — это адаптер, но не представляет из себя функциональный тип. (т.е. создать экземпляр делегата — не значит создать экземпляр ф-ии).
V>Более того, ситуация, при которой делегаты разного типа, но имеющие одинаковую сигнатуру Invoke не совместимы — это вообще нонсенс на уровне грубой ошибки проектирования (!!!). Пусть устранят эти баги, тогда функциональная часть программисткого направления станет более естественной для дотнета, и Nemerle в т.ч.
Ну в Nemerle чуть иначе. Ты можешь посмотреть — они не используют делегаты для лямбд. У них для етого специальные классы есть.Поэтому для них, например, проблема несовместимости, описанная тобой, не стоит. Плюс в итоге конкретный экземпляр функционального типа сам содержит код функции (то, о чём ты тоже говорил).
eao197 wrote: > C>Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас, > C>правда, я пользуюсь Boost.Build v2, которая еще удобнее. > Спасибо за добрые слова > Сейчас на rubyforge <http://rubyforge.org/projects/mxx-ru> делается > версия 1.1, которая стала еще чуть-чуть удобнее, да и поддержка > манифестов VC++8.0 добавилась. Так что, если было что-то, что тебе в > mxx_ru не понравилось, то отпиши туда в форум -- попробуем улучшить
Мне, в принципе, все понравилось.
Просто в BBv2 сейчас намного больше функциональности: variant builds,
больше переносимых настроек компилятора, лучшая поддержка unit-тестов,
да и Буст он напрямую поддерживает.
The Java HotSpot dynamic compiler uses runtime analysis to perform
inlining aggressively, yet safely. Once the Java HotSpot profiler
has collected runtime information about program hot spots, it not only
compiles the hot spot into native code, but performs extensive method
inlining on that code. The Java HotSpot compiler can afford to be
aggressive in the way it inlines because it can always back out an
inlining optimization if it determines that the method inheritance
structure has changed during runtime due to dynamic class loading.
...
Furthermore, method inlining is synergistic with other optimizations.
Inlining produces large blocks of code which make additional
optimizations easier for the compiler to perform. The ability of the
Java HotSpot Server VM to do aggressive inlining is a key factor in
making HotSpot faster than current JIT and static compilers.
Что, мне из исходников JVM цитаты приводить?
> C>Мне не сэмплы нужны. Нужно реальное приложение, с сильным использованием > C>макросов. > Вот компилятор и есть такое приложение. Он сам на себе создается и > использует море макросов.
Компилятор языка прикладным приложением не является по определению.
> C>Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас, > C>правда, я пользуюсь Boost.Build v2, которая еще удобнее. > Серьезно? А ведь "билд-система eao197 для С++ намного удобнее ant'а"!
Вы понимаете, операция сравнения транзитивна. То есть из выражения
BootBuild.v2 > mxx_ru > ant > make
(где знак ">" следует читать как "лучше")
вытекает, что:
BootBuild.v2 > ant
и
BootBuild.v2 > mxx_ru
?
> Вообще забавный разговор выходит. Мэйк форевар, мэйк крут. Но один > велосипед на тему мэйка изобретает, а другой испльзует нестандарткую > приблуду из библиотеки.
Кстати, make пока по скорости еще никто не превзошел. Так что он в своем
роде лучший.
А насчет "приблуды из библиотеки" — посмотрите хоть на BBv2.
ЗЫ: а если бы никто не изобретал велосипедов, то Ant'а сейчас не было бы...
Здравствуйте, Cyberax, Вы писали:
C>VladD2 wrote: >> Неотносящаяся к делу фигня поскипана. C>???
>> Где здесь говорится о том, что ХотСпот делает спекулятивный инлайнинг? C>http://java.sun.com/products/hotspot/docs/general/hs2.html C>
C>The Java HotSpot dynamic compiler uses runtime analysis to perform
C>inlining aggressively, yet safely. Once the Java HotSpot profiler
C>has collected runtime information about program hot spots, it not only
C>compiles the hot spot into native code, but performs extensive method
C>inlining on that code. The Java HotSpot compiler can afford to be
C>aggressive in the way it inlines because it can always back out an
C>inlining optimization if it determines that the method inheritance
C>structure has changed during runtime due to dynamic class loading.
C>...
C>
C>Furthermore, method inlining is synergistic with other optimizations.
C>Inlining produces large blocks of code which make additional
C>optimizations easier for the compiler to perform. The ability of the
C>Java HotSpot Server VM to do aggressive inlining is a key factor in
C>making HotSpot faster than current JIT and static compilers.
C>
C>Что, мне из исходников JVM цитаты приводить?
Ты читай внимательно. Там везде слова "возможно", "может быть"...
>> C>Мне не сэмплы нужны. Нужно реальное приложение, с сильным использованием >> C>макросов. >> Вот компилятор и есть такое приложение. Он сам на себе создается и >> использует море макросов. C>Компилятор языка прикладным приложением не является по определению.
А как его по-твоему назад?
И вообще, тебе нужно на код поглядеть или порассуждать об этимологии слов?
То есть, тебе "шашечки" или ехать?
>> C>Ну вот, билд-система eao197 для С++ намного удобнее ant'а. Сейчас, >> C>правда, я пользуюсь Boost.Build v2, которая еще удобнее. >> Серьезно? А ведь "билд-система eao197 для С++ намного удобнее ant'а"! C>Вы понимаете, операция сравнения транзитивна.
Ну, то есть все же "билд-система eao197 для С++" реально не нужна?
>> Вообще забавный разговор выходит. Мэйк форевар, мэйк крут. Но один >> велосипед на тему мэйка изобретает, а другой испльзует нестандарткую >> приблуду из библиотеки. C>Кстати, make пока по скорости еще никто не превзошел. Так что он в своем C>роде лучший.
По чему? По скорости? Это изумительная характеристика для утилиты жапускающей другие экзешники. Да и глупость это, так как запуск процесса это еще те тормоза. А уж компилятора и подавно. Те же Ант и МСБилд умеют занружать утилиты как объекты и кешировать их.
C>А насчет "приблуды из библиотеки" — посмотрите хоть на BBv2.
Меня на 100% устраивает связка MSBuild + VS2005.
Зачем мне снова в каменный век?
C>ЗЫ: а если бы никто не изобретал велосипедов, то Ant'а сейчас не было бы...
Велосипеды изобретают отнюдь не всегда по необходимости. И этот случай тому подтверждение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>А мне не очень нравится . Сам дотнет не поддерживает функциональные типы как первоклассные значения. Делегаты — это адаптер, но не представляет из себя функциональный тип. (т.е. создать экземпляр делегата — не значит создать экземпляр ф-ии).
Ошибочное мнение навеянное мышлением в фунциональном стиле. Вункцию нельзя создать. Вункция — это ее код (т.е. выражения).
Манипуляции функциями в ФЯ — это редставление для программиста. На самом деле компилятор обязан использовать некоторую технику. Вариантов тут не много. Или переписывание кода, или создание неких объектов инкамсулирующих нужные данные (в том числе ссылки на функции).
Все это не требует никакой поддержки от фрэймворка. Более того. Даже делегаты не обязательно было реализовывать средствами рантайма. В принципе можно было просто генерировать классы вместо них.
V>Более того, ситуация, при которой делегаты разного типа, но имеющие одинаковую сигнатуру Invoke не совместимы — это вообще нонсенс на уровне грубой ошибки проектирования (!!!). Пусть устранят эти баги, тогда функциональная часть программисткого направления станет более естественной для дотнета, и Nemerle в т.ч.
Это не нонсенс и не ошибка. Делегат != функциональный тип. Это тип представляющий указатель на функцию. Но от части тут можно согласиться, так как разумно было бы реализовывать делегаты поверх функционального типа. Оданко опять же можно все устроить без поддержки рантайма. В том же Немерле есть функциональный тип и есть делегат. При этом функциональный тип автоматом приводится к делегату.
V>-------- V>Говорю неспроста. У самого есть черновик интерпретатора Схемы под дотнет, и исследовал более десятка вариантов имплементаций Схемы/Лиспа под Яву и дотнет. В общем, кое-какие ограничения не позволяют делать результирующий код достаточно эффективным.
Ага. Ограничения времени и мозга.
Физических ограничений нет. Погляди как делается в Немерле и в C# 3.0. Ну, а переписывание кода и инлайнинг вообще решают массу проблем.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
E>>Это кто такое про make сказал?
VD>Напомню фразу породившую эту ветку: VD>
C>А зачем нужен был ant, когда был make?
Ну и где здесь было сказано, что make крут и make forever?
На момент появления ant был make. Был давно и был успешно. Для него (make) было много документации, примеров использования, приблуд разных и пр. Короче, это был на 100% стандарт de-facto. А на Unix-ах в среде C-разработчиков таким и остается.
Да вот только кому-то показалось, что не так уж все хорошо и удобно с make, как хотелось бы. Думаю, что казалось так многим, но не многие пытались это дело изменить (ну еще бы, против стандарта-то идем). И не у многих, кто взялся, реально успешные результаты получились. Вот и разработчиков ant получилось.
Теперь что мы имеем с ant. Он есть давно и есть успешно. Для него (ant) много документации, примеров использования, приблуд разных и пр. Короче, на 100% стандарт de-facto... Но, стандарт для Java community. Т.к. создавался на Java и для Java.
Соответственно, кому-то показалось, что это не так уж хорошо и удобно. И некоторые попытались это дело изменить. MS, к примеру.
Так что на примере make и ant я пытался показать тебе, что новое начинает создаваться там, что существующий инструмент кого-то очень сильно не устроил. Меня не устраивал make (как и разработчиков ant) и не утраивал ant для C++ проектов. Поэтому появился mxx_ru.
Разработчиков Scala что-то в Java не устраивало. Разработчиков Nemerle так же что-то не устраивало, поэтому они свой инструмент и сделали. Хотя, я думаю, многие Lisp-оведы спросят, а нафига Nemerle со своими маросами нужен-то был?
Затем в Nemerle кого-то что-то еще не устроит. И появится что-то другое.
Это нормальный процесс развития. Для того, чтобы этот процесс шел нужно, чтобы появлялось много нового. 99% этого, вероятно, вообще не выживет, зато оставшийся 1% сделает шаг в перед. Если mxx_ru не выживет, значит судьба такая. По крайней мере затраты на свое появление и развитие он уже оправдал.
Да и не факт, что Nemerle выживет. Но затраты на свое появление, имхо, он уже оправдал.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, VladD2, Вы писали:
V>>У самого есть черновик интерпретатора Схемы под дотнет, и исследовал более десятка вариантов имплементаций Схемы/Лиспа под Яву и дотнет. В общем, кое-какие ограничения не позволяют делать результирующий код достаточно эффективным.
VD>Ага. Ограничения времени и мозга.
При реализации интерпретатора Схемы невозможно использовать value-типы, ну никак. Ломал голову — так и не придумал. Большинство реализаций Лиспа и Схемы под дотнет имею кеш боксированных char-ов и некоего диапазона int, дабы не засорять память боксированными величинами. Т.е. боксинг там ручной, типа:
Однако, реально все гораздо печальнее. Чтобы обеспечить хоть какую-то эффективность, базовый класс должен быть не System.Object, а некий свой, с виртуальными ф-иями, типа IsAtom, IsPair, IsNumber и т.д., соотв. для простых чисел надо писать свои аналоги.
А учитывая, что в Схеме числа представляются по всякому, и точно и приблизительно и вообще без ограничений, в общем, только реализаций числовых типов штук 5.
VD>Физических ограничений нет. Погляди как делается в Немерле и в C# 3.0. Ну, а переписывание кода и инлайнинг вообще решают массу проблем.
Согласен, для компилятора вообще никаких ограничений быть не может, и даже на самой скудной модели вычисления можно выразить много чего. Но мне требовался именно интерпретатор.
VladD2 wrote: > Ты читай внимательно. Там везде слова "возможно", "может быть"...
Во-первых, используется сильный модальный глагол "can", означающий в
этом случае, что HotSpot имеет физическую возможность это делать.
Если бы стоял "may" — было бы другое дело.
Честно говоря, мне лень искать большую красивую статью на Sun'овском
сайте, где в картинках показывается как HotSpot отслеживает логику
переходов и разбивает код на inline-домены. Может поверишь мне на слово?
> > C>Компилятор языка прикладным приложением не является по определению. > А как его по-твоему назад?
"Назад"?
А назвать его можно инструментальным средством.
> C>Вы понимаете, операция сравнения транзитивна. > Ну, то есть все же "билд-система eao197 для С++" реально не нужна?
Ну почему же, конкуренция всегда полезна (что бы ни думала по этому
поводу MS ).
Вот товарищи из SCons (http://www.scons.org) портируют из BBv2 систему
тулсетов, а люди из BBv2 добавляют поддержку Питона в свою систему.
> C>Кстати, make пока по скорости еще никто не превзошел. Так что он в своем > C>роде лучший. > По чему? По скорости? Это изумительная характеристика для утилиты > жапускающей другие экзешники.
Нда... RTFM про BBv2, SCon и VS.
http://www.gamesfromwithin.com/articles/0506/000092.html
> C>А насчет "приблуды из библиотеки" — посмотрите хоть на BBv2. > Меня на 100% устраивает связка MSBuild + VS2005. > Зачем мне снова в каменный век?
Мне после BBv2 проекты Студии кажутся каменным веком. Попробуйте,
например, поддерживать систему, которая строится в ANSI/Unicode*4
конфигурации (итого 8 конфигураций в целом).
Я уж не говорю про эстонскую скорость сканирования зависимостей.