LINUX.ORG.RU

Зачем нужно метапрограммирование?

 ,


2

1

Имеются ввиду возможности, встроенные в сам язык. Что имеем:

  • сильное усложнение языка(с т. з. кодера)
  • большая свобода действий для кодера, что, как известно, губительно в коммерческих(да и не только) проектах
  • ресурсы на сборку приложения превышают таковые для его запуска(иногда многократно)
  • сложность реализации компилятора, приводящая к ошибкам

Зачем нужна такая фича, когда можно генерировать код внешней утилитой?

Ответ на: комментарий от chkalov

будут потреблять больше, особенно, если для кодогена надо вытащить инфу из основного кода, например для дженериков

SR_team ★★★★★
()

Зачем нужна такая фича, когда можно генерировать код внешней утилитой?

В лиспе, например, кодогенерация внешней утилитой на нём же особо от макр не отличается. Есть даже байка про то, что сначала макры писали внешними под программу одного кодера.

anonymous
()

Зачем нужна такая фича, когда можно генерировать код внешней утилитой?

От того, делать это внутренней или внешней утилитой ничего не изменится - то что ты записал в минусы никуда не денется.

slovazap ★★★★★
()
Ответ на: комментарий от cppsektant

Сложность уйдёт.

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

Фишка размазывания сложности в том, что сложность воспринимается «дискретно»: до некоторого порога не замечается, а после - уже слишком сложно. Если размазать и спрятать за как_бы несложными конструкциями, можно обмануть восприятие сложности. И да, восприятие сложности индивидуально - кто-то легко стихи рифмует, кто-то легко интегралы берет.

anonymous
()

cppsektant

Тебе надо из CPP переходить в Go, там именно такой подход к метапрограммированию.

proud_anon ★★★★★
()
Ответ на: комментарий от anonymous

C/C++ является лучшим языком для системного программирования.

Уже Торвальдс вангова модули на Расте в ядре. Настолько Си/++ хороши.

Мнение Торвальдса о плюсах оставим за кадром пока, хе-хе.

anonymous
()
Ответ на: комментарий от anonymous

Как только сцарь начинает критиковать какой-то язык - это верный знак, что язык достоин пристального внимания лоревцев

Лол. Ну так зацени у него в бложике пару ушатов известной субстанции вылитых на Си++.

anonymous
()
Ответ на: комментарий от anonymous

Мнение Торвальдса о плюсах оставим за кадром пока, хе-хе

Хе-хе, в ядре C++ не нужно использовать.
Остальная ваша «критика» уровня «хе-хе».

anonymous
()
Ответ на: комментарий от waker

метапрограммирование в разных проявлениях есть много где

В паскале нет, в Си нет, в C++ нет, в Rust нет, в Java нет. Где есть?

Einstok_Fair ★★☆
()
Ответ на: комментарий от Einstok_Fair

В паскале нет, в Си нет, в C++ нет, в Rust нет, в Java нет. Где есть?

У меня есть и в Си и C++ /интроспекция, …/.
И много более …
Не ждать же 776 стандарт?

Одна из проблем многих программистов в том, что любят из «мухи» «слона» делают и думают, что они

Крутые

И забывают о том

Где просто  - там ангелов со ста.  
Где мудрено - там ни одного.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Отвечу как в C/C++ реализовал интроспекцию.

Парсим 100 обычных #include и используем AST в run-time.
Все!

Что касается объектной метадата базы и …, …, … там своя «песня».

Владимир

anonymous
()

патаму што метапрог.

anonymous
()
Ответ на: комментарий от anonymous

… Что касается объектной метадата базы и …, …, … там своя «песня».

Сторонние парсеры, …, …, … не использовал потому, как много в них «Горе от ума».

Владимир

anonymous
()
Ответ на: комментарий от cppsektant

Полноценное метапрограммирование - это когда язык и метаязык сильно взаимосвязаны. То есть можно с помощью слабого-простого языка и слабого-простого метаязыка описать очень сложные взаимосвязи. По сравнению с однозначной трансляцией с одного (мета)языка в другой язык, когда сложность нельзя увеличить.

Можно небольшой пример?

man Теорема Тарского о невыразимости истины (арифметической, а не философической)

также см. прочие теоремы Тарского.

ну то есть если истина невыразима в объектном базовом языке (о котором рассуждаем), то может быть она будет таки выразима на метаязыке (посредством которого об этом базовом рассуждаем) ???

pdf страница 47

далее прочие системы типов и зависимые типы как попытка мемоизации времени компиляции этой CTFE зерокост абстракшн.

anonymous
()
Ответ на: комментарий от anonymous

Шутка

В планах @metaprog, реализовать kernel Linux с использованием Метапрог.
Может быть он это и сделает …
Но какой длины будут все эти диаграммы если их расположить одна за другой?

ИМХО километров сто.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Их можно располагать по кругу, мы сократим это расстояние такой оптимизацией радиус будет меньше.

Визуальное программирование - выбор прогрессивного человека!

Владимир

anonymous
()
Ответ на: комментарий от anonymous
ЧЕТКО И ЛАКОНИЧНО скажи оппоненту - СКРИПТУХА!

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Об очевидном и невероятном.

Имеется у меня некое API /сишные исходники на девять мегабайт/.
Пакуются они в 506KB.
Сегодня из текстов убрал исходников где-то 800KB /так как разработал API, которое много упрощает разработку кода/.
Но вот те на - 7z тот же набор исходников, который стал на 800KB меньше пакует в 538KB.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Кара господня, не иначе

Владимир

anonymous
()
Ответ на: комментарий от anonymous

на интуите – доказательство от противного + перечислимость + арифметичность + гёделева нумерация + арифметичность одной конкретной вычислимой функции

курс с начала

anonymous
()
Ответ на: комментарий от anonymous

man Теорема Тарского о невыразимости истины

Языки программирования - это не формальные системы, тем более, первого порядка. Они (яп) выяснение истины спрячут где-нибудь поглубже: за неопределенным поведением, за деталями реализации, например.

Программисту приходится прятать сложность выяснения истины. И хорошо, что есть куда прятать, особенно в блобах на 20ГБ.

anonymous
()
Ответ на: комментарий от anonymous

ещё здесь есть такое же доказательство

отсюда :

Повторим это доказательство неформально. Определение главной универсальной функции требует, чтобы для любого другого языка программирования, для которого имеется вычислимый интерпретатор V, существовал бы вычислимый транслятор s программ этого языка в программы языка U.

то есть, метапрог

далее оно может быть метаинтерпретатором или метакомпилятором.

отсюда:

интерпретатор вычисляет программы. интерпретатор языка, идентичного или похожего (в смысле расширения, метаязыка) на язык собственной реализации интерпретатора называется метаинтерпретатором. интерпретатор, который может интерпретировать сам себя – метациклическим интерпретаторором (см. SICP).

написанный сам на себе – словно истинный метапрог

в отличие от метапрога не истинного, то есть не метациклического – такая реализация проста и наглядна.

из-за таких свойств объектного языка как гомоиконность, например. и составимость. относительно теоремы Кнастера-Тарского – такое отображение (метаинтерпретатор) имеет неподвижные точки.

которые в терминах тела рекурсии и хвоста рекурсии соответствуют расширениям метаязыка и базовому языку, не расширенному.

anonymous
()
Ответ на: комментарий от anonymous

Языки программирования - это не формальные системы, тем более, первого порядка.

это не те дроиды, которых вы ищите. проходите мимонеистинный метапрог ;-)

anonymous
()
Ответ на: комментарий от anonymous

теорема Клини:

Другими словами, нельзя найти алгоритма, преобразующего программы, который бы по каждой программе давал другую (не эквивалентную ей). Эту теорему называют теоремой Клини о неподвижной точке или теоремой о рекурсии.

далее quine как пример одной из неподвижных точек:

Y(текст_программы)=текст_программы

интерпретатор, метаинтерпретатор или метациклический при этом выполняет не просто вывод, а побочный эффект – вычисление.

метакомпилятор – трансляцию.

то есть, тут комбинаторы над функторами, композиция отображений неподвижных точек. и побочных эффектов.

anonymous
()
Ответ на: комментарий от anonymous

Зачем нужна такая фича, когда можно генерировать код внешней утилитой?

возвращаясь к вопросу из ОП топика:

Зачем нужна такая фича, когда можно генерировать код внешней утилитой?

нельзя. не универсально во всех случаях. нельзя написать такую универсальную программу, транслятор, универсальную функцию (не главную, скорее всего).

автомагически.

но можно интуитивно, эвристически – исходя из некоторых соображений (см. выше).

с какой-то качественной оценкой эвристик.

anonymous
()

Сделав еще один шаг, можно получить и доказательство теоремы о неподвижной точке. Пусть h некоторое преобразование паскаль-программ, у которого мы хотим найти неподвижную точку. Тогда напишем программу наподобие только что приведенной, которая будет записывать свой текст в строку p, затем применять h к p, получая некоторую другую строку q, а затем запускать интерпретатор Паскаля на строке q (используя в качестве входа программы q вход исходной программы). Конечно, эта программа уже не будет такой короткой, так как будет включать в себя (и даже два раза первый раз просто так, а второй раз в кавычках) интерпретатор паскаля, написанный на паскале.

или шаблоны цепепе с концептами и констэкспрами (нечитаемо).

или CTFE D с typeinfo и template mixin (читаемо).

теоретически из квайна затем возможно раскрутить какой-то метаинтерпретатор/метакомпилятор. метациклически.

anonymous
()
Ответ на: комментарий от anonymous

истинный метапрог

«Истинный метапрог» случайно или преднамеренно не нарвётся на какой-нибудь аналог парадокса Рассела из-за попытки объяснения себя-истины через себя-истину.

Например, проблема останова - это «как бы» аналог парадокса Рассела.

anonymous
()
Ответ на: комментарий от anonymous

и ему потребуется какая-то металогика для самореферентных метаобъяснений. в рамках которой код=данные, неподвижные точки (фокусы) = аттракторы и какая-то амальгама в категориях.

философически, в которых утверждения и парадоксы, противоречия – выражаются единообразно. гомоиконно.

например, в cyc есть микротеории. если полная теория может быть парадоксальна и неполна/противоречива – микротеория не может. далее из таких вот кусочком микротеорий составляются какие-то composable преобразования, сохраняющие какие-то свойства, какую-то меру на свойствах.

это «как бы» аналог парадокса Рассела.

например в гипермножествах самореферентное остаётся парадоксальным ли?

anonymous
()
Ответ на: комментарий от anonymous

диалектическая металогика

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

anonymous
()
Ответ на: комментарий от anonymous

если полная теория может быть парадоксальна и неполна/противоречива – микротеория не может. далее из таких вот кусочком микротеорий составляются какие-то composable преобразования, сохраняющие какие-то свойства, какую-то меру на свойствах.

Чувак, ты крут. Ничего не понятно, но очень интересно. :)

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

anonymous
()
Ответ на: комментарий от anonymous

да, так что формализация неформализуемого – процесс неформализуемый :))

то есть проще что-то полезное качественно нащупать чем чуть более чем полностью формализовать этот процесс на метауровне :))

anonymous
()
Ответ на: комментарий от anonymous

То есть, истиный метапрог не совсем истинный?! ))

«Хотели как лучше, но получилось как всегда» (с) Черномырдин, вроде

anonymous
()

В Scala for impatient разделы про метапрограммирование адресованы разработчикам библиотек. В прикладном коде оно не особенно приветствуется.

anon1984
()
Ответ на: комментарий от anonymous

настоящий дзен не истинный дзен, ога.

anonymous
()
Ответ на: комментарий от anonymous

@metaprog объяснял что означает «Мета». В переводе с Украинского это - «цель». Жаль конечно, что его комментарий нет в этом треде … /«Скучно господа»/. Это был бы БОЛЬШОЙ ПРАЗДНИК «МЕТАПРОГРУММУВАННЯ»

да тю!! оце жъ телеология пополамъ съ энтелехией.

на самом себе.

anonymous
()
Ответ на: комментарий от Virtuos86

окончательно разьяснить

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

то есть: суперкомпиляция не обязательно преобразование программ. но обязательно преобразование системы вычислений.

там где пишут про суперкомпиляцию графов или dataflow или суперкомпиляцию функциональных языков программирования, с функциями высшего порядка – там супер выражается физически через мета.

в исходной формулировке Турчина – супер это надмножество мета. супер в смысле супервизор, поднадзорные контролируемые вычисления.

классический пример суперкомпиляции – программист с отладчиком. вместе они образуют (по отдельности – не образуют) систему, открытую, синергетическую. не замкнутую, кибернетическую, классическую.

где программист должен думать, а компьютер – делать. думать, какие гипотезы выдвинуть. как проверить. какой эксперимент с отладчиком провести. например, delta debugging или назад прокрутить. или по граничным областям, крайним значениям на стыке областей.

тестирование – то же самое. поднадзорные вычисления. но не обязательно у тебя есть полное понимание преобразований самой программы в виде рефакторинга – например если тестовое покрытие неполное и методом тыка + срочное/неважное/критичное. преобразуем опять машину вычислений (человекомашинную, человек-тестер, человек-с-отладчиком, тесты, тестовая система, отладчик) – а не обязательно саму программу.

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

кибернетическая теория эволюции по Турчину – это процесс развития метасистем, выделения таких метасистемных переходов.

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

тогда имеет смысл в рамках ареала говорить уже о синергетической теории коэволюции бутстрап систем, вроде систем Берталанфи, или системы магов Бена Герцеля.

где уже открытые системы, взаимодействующие – и выделение метасистем и метасистемного перехода на границе таких систем-систем, на границе в фазовом пространстве хаотическом, с нелинейной динамикой – каких-то фокусов, циклов, странных аттракторов, и прочей хаотической динамики.

anonymous
()
Ответ на: комментарий от Virtuos86

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

которые перестают работать в новой ситуации. потому что динамическое объяснение, новая интерпретация должна быть расширена. чтобы такое расширенное объяснение продолжало работать.

творчески, качественно, осознанно. ога.

anonymous
()
Ответ на: комментарий от anonymous

эволюционирующий

У эволюции есть направление, так сказать, есть (частичный) порядок. Надо всего лишь вычислить (математически тыкнуть пальцем) это отношение (частичного) порядка. :)

anonymous
()
Ответ на: окончательно разьяснить от anonymous

окончательно разьяснить

разьяснить

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

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

А регулярка будет примерно такой Метапрог-прототип 19 + API на СУВТ + ускорение трансляции (комментарий)

Регулярные выражения похожи на разработчика, который

Слышал звон, да не знает где он.

Давно пора на смену им разработать readable синтаксис поискового выражения /и с много большей функциональностью/.

Владимир

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.