На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Коротко о разделе:
Здесь разрешается создавать темы, относящиеся к любому языку программирования, для которого не существует раздела на форуме (например, Lisp, Tcl/Tk, FORTRAN и т.д.). Если раздел для нужного Вам языка есть, большая просьба создавать тему в нем.
Вопросы, связанные с JScript, Perl, PHP обсуждаются в разделе WWW Masters.

Обратите внимание:
1. Прежде чем задать вопрос, воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали.
2. Если Ваш вопрос связан с конкретным языком программирования, обязательно укажите название языка в имени темы.
3. Постарайтесь давать темам информативные названия. Темы с названиями типа "Помогите, горю" будут удалены.
4. Помните, чем грамотней будет задан Ваш вопрос, тем больше будет у Вас шансов получить на него ответ. Как правильно задавать вопросы
5. Ипользуйте тег [ code ] ...текст программы... [ /code ] для выделения текста программы.

Просьбы выполнить какую-либо работу за автора в этом разделе не обсуждаются. Темы с подобными просьбами будут перемещены или удалены. Для заказов у нас существуют специальные разделы: Разовые заказы и подработка, ПОМОЩЬ СТУДЕНТАМ.

Если кто не понял (а такие есть) — чтобы за вас решали ваши задачки, идите на другие ресурсы.

Полезные ссылки:
Есть. ;)
Наши Исходники | GPSS (en), GPSS (ru) (!) | Common Lisp | Tcl/Tk | Haskell | Lua
Модераторы: B.V.
  
> Выбор языка для программ, анализирующих и меняющих свой же собственный код.
    Посоветуйте язык программирования сверхвысокого уровня (ЯПСВУ), программа на котором могла бы в COMPILE TIME обрабатывать и изменять свой же собственный код

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

    К примеру, чтобы язык,к примеру, поддерживал конструкции типа "если вызов метода Tarl::MySleep(int, double) присутствует в коде программы более 3-х раз - то определить тип MyType как long double".

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

    Вообщем нужен ЯПСВУ, который "искоропки" имел бы конструкции, которые позволяли бы писать программы, анализирующие и меняющие свой же собственный код во время компиляции. Т.е. чтобы программа являлась одновременно как бы пользовательским расширением компилятора и языка.

    Добавлено
    Соответственно, получается, что когда пишешь программу на таком языке, и меняешь ТЕКСТ какой-то её части, то ТЕКСТ других частей программы может при компиляции автоматом измениться {что есть такая штука как "препроцессор" я в курсе - но нужны более серьёзные и радикальные ВСТРОЕННЫЕ в язык средства}.

    Т.е. в ЯПСВУ должны быть операторы, операндами которых служат текстовые объекты в самом исходнике.

    Почему я назвал такой язык языком СВЕРХ высокого уровня?

    Ну потому что на нем пишут не исходник, а "исходник исходника" если можно так выразиться.
    Сообщение отредактировано: Исмаил Прокопенко -
      Прочитал в вики про существование парадигмы "рефлексия/отражение"
      Ну то, про что я писал выше, не совсем "просто отражение".
      Там как-то примитивно все понимается считая что это всего лишь небольшое расширение ООП.
      Тогда как это совершенно особая парадигма.
      И там речь идет больше про модификацию исходника в run time.
      А я говорил в корневом посте про модификацию исходника в COMPILE TIME.
      Т.е. получается, что программа как бы является по совместительству ещё и частью кода своего же компилятора, которым она компилируется.
      Препроцессорные макросы с параметрами - это самые примитивные средства данной парадигмы


      В препроцессорах есть #IFDEF-ы
      Но они позволяют задавать очень примитивные условия.
      А нужны более навороченные средства анализа своего же собственного кода.
      Например "если в программе код A, имеющий след. структуру <описывается структура с помощью REGEX или грамматики более высокого уровня иерархии Хомкого>, то код B должен иметь такую структуру <описывается структура B и её связи с компонентами структуры A>"

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

      Добавлено
      Чтобы код исходника и код его компилятора образовывали единый неделимый гибрид
        Цитата
        Когда компилятор С++ обрабатывает единицу трансляции, у него есть доступ к большому количеству полезных метаданных. Но, к сожалению, программисту эти данные практически не доступны. Сейчас комитет по стандартизации С++ рассматривает предложения N4111, которое призывает расширить возможности рефлексии на этапе компиляции уже в следующем обновлении языка (С++17). А до той поры с решением нашей задачи на С++ лучше повременить.

        ©
          Есть опасность, что с использованием рефлексии C++, оставшись достаточно сложным языком (а с рефлексией он скорее всего ещё усложнится), лишится своих преимуществ в плане скорости работы.
          кроме того, рефлексия всё равно не позволяет менять код программы. В C/C++ для этого используется динамическая компиляция.
            У C++ достаточно средств для решения рефлексивных задач другими средствами. А если очень надо, рефлексия реализуется библиотеками. COM в WinAPI тому яркий пример, причём языконезависимый.
              Я уже понял, что С++ не подходит.
              Что реализовать на нем программу, которая кроме основной задачи могла бы ещё анализировать свой код и при необходимости менять его, без "костылей" не получится.

              Нужны специализированные языки.

              Кроме предположений "может ЛИСП?" и препроцессора m4 в рунете мне ничего не посоветовали.
              Видно это тема очень узкая и экзотическая и ей мало кто интересовался.

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

              Ты фактически учишь компилятор находить ошибки, которые никакой компилятор обнаружить не может.

              Самый примитивный пример.
              Написал в коде метода TLAstTrim.send(), что вызов метода TLAstTrim.send() может встречаться в любом блоке, но только после вызова методов Tysh.reply(int) или Uydf.rev(double), и компилятор возьмет это на контроль.
              Средствами С++ такой контроль, как я понимаю, сделать невозможно или крайне геморно
                Цитата Исмаил Прокопенко @
                Видно это тема очень узкая и экзотическая и ей мало кто интересовался.
                Она просто никому не нужная. Теоретически любой скриптовый язык реализует это без труда, но нет спроса на сию фичу.

                Добавлено
                Цитата Исмаил Прокопенко @
                Средствами С++ такой контроль, как я понимаю, сделать невозможно или крайне геморно
                Безбожно легко. Найдёшь несинтестический пример, когда подобное нужно, любой третьекурсник тебе за пять минут код напишет.
                  Цитата Исмаил Прокопенко @
                  Кроме предположений "может ЛИСП?" и препроцессора m4 в рунете мне ничего не посоветовали.

                  Предложу немножко Perl'а :)

                  ExpandedWrap disabled
                    #!/usr/bin/perl
                     
                    $Loc = 1;
                    $Code = "print \"\$Loc\\n\"; exit if (\$Loc>3); \$Loc++; eval \$Code;";
                    eval $Code;

                  Саму модификацию кода не показывал. Показывал как код вызывает на выполнение сам себя четыре раза. Если фантазии для модификации в процессе вызовов хватит - нет преграды патриотам.
                    Цитата Исмаил Прокопенко @
                    программа на котором могла бы в COMPILE TIME

                    А, сорри, неусмотрел условие. Если на С/C++, то теоретически проще пареной репы:

                    1) Пишется программа-парсер, которая по каким-то условиям может изменять исходный C/C++ код
                    2) Компилируется и линкуется в исполняемый модуль
                    3) Далее пишется элементарный пакетный файл сборки

                    * вызывается парсер из п.2 который обрабатывает свой же код
                    * обработанный код компилируется и линкуется, заменяя себя же (программу парсер из п.2)

                    Таким образом, при каждом вызове процесса сборки получается модифицированный код.
                    Но, как правильно заметили коллеги, а нафига такой баян? :-?
                      Помнится, кто-то рассказывал, что поставит проштрафившемуся студенту зачёт только тогда, когда он напишет программу, которая будет способна неограниченно модифицировать свой функционал без перезапуска.
                        Сейчас компиляторы "ловят" в лучшем случае синтаксические ошибки и некоторые "сомнительные места".
                        А с предлагаемой мной парадигмой/идиомой программа будет обнаруживать не только логические ошибки в себе, но даже ИДЕОЛОГИЧЕСКИЕ.

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


                        Что компилятор должен состоять из двух частей:
                        1) Фиксированная ("традиционная") часть, которую пользователь менять не может
                        2) "Размазанная" по всему коду создаваемой программы часть, которую пишет пользователь.

                        2-я часть служит расширением компилятора и грамматики языка для соответствующей прикладной области/задачи и задает контролируемые зависимости в коде, правила преобразования и парсинга/анализа исходника и генерации исполняемого кода
                          Мне на стек овер флов ру посоветовали присмотреться в языку Nemerle.
                          Кто-нибудь на нем кодил?
                          На нем реально сделать то, что мне нужно?
                            Исмаил Прокопенко, бери пример с разработчиков Qt - напиши свой moc++ и не парься.
                              Roslyn ?
                                D вполне умеет подобное.
                                  Цитата applegame @
                                  D вполне умеет подобное.

                                  А "F" наверное и подавно? :D
                                    Цитата Исмаил Прокопенко @
                                    которая кроме основной задачи могла бы ещё анализировать свой код и при необходимости менять его, без "костылей" не получится.

                                    Вложи в свою программу компилятор и меняй на здоровье. Python, грубо говоря, так и работает.
                                      Цитата shm @
                                      Python, грубо говоря, так и работает.

                                      Фитон - это не компилятор. Это интерпретатор
                                        Цитата Исмаил Прокопенко @
                                        Фитон - это не компилятор. Это интерпретатор

                                        Так я и говорю "грубо говоря". В твоем случаешь компилируешь, загружаешь и запускаешь.
                                          Цитата Исмаил Прокопенко @
                                          Фитон - это не компилятор. Это интерпретатор
                                          Интерпретатор, компилятор… Сейчас любой уважающий себя интерпретатор перед выполнением программу компилирует. Просто компилирует не в машинные коды, а в байт-код.
                                            Цитата amk @
                                            Цитата Исмаил Прокопенко @
                                            Фитон - это не компилятор. Это интерпретатор
                                            Интерпретатор, компилятор… Сейчас любой уважающий себя интерпретатор перед выполнением программу компилирует. Просто компилирует не в машинные коды, а в байт-код.

                                            А надо-то (по теме) наоборот. Чтобы "каждый уважающий себя компилятор мог интерпретировать свой код"
                                              Как насчет языка Erlang ?, сам на него посматриваю.
                                              Цитата
                                              Горячая замена кода
                                              Для систем, которые не могут быть остановлены для обновления кода, Erlang предлагает горячую замену кода (англ. hot code upgrade). При этом в приложении могут одновременно работать старая и новая версии кода. Таким способом программное обеспечение на Erlang может быть модернизировано без простоев, а выявленные ошибки исправлены[8][33].
                                                Цитата Исмаил Прокопенко @
                                                Чтобы "каждый уважающий себя компилятор мог интерпретировать свой код"
                                                В таком случае он просто превратится в интерпретатор.
                                                Существует такая штука, как динамическая компиляция. Но в таком случае придётся всюду таскать компилятор языка.
                                                  Пришла еще мысль, а ведь программа совершенно не обязательно должны иметь архитектуру "один исполнительный файл с кучей кода", можно использовать динамические библиотеки в работе. Вы можете программно править исходник, собирать библиотеку, отключать старую, подключать новую.
                                                  Это реализуемо тем же С++ и еще рядом языков.
                                                  Правда, придется таскать с собой какой-нить компактный компилятор :)
                                                  Ну и конечно же можно на сам крайняк менять код отраженный в озу, патчить страницы, занятие веселое, в общем-то :D , при высоких требованиях ко времени совершения операции замены кода имеет смысл.

                                                  Добавлено
                                                  К слову об интерпретаторах, код, написанный на асме тоже интерпретируется, правда уже самим процессором. Тоже вариант, если хотите. Правда, к языкам высокого уровня и сверх-высокого уровня не относится.
                                                    Цитата simsergey @
                                                    К слову об интерпретаторах, код, написанный на асме тоже интерпретируется, правда уже самим процессором.

                                                    Вы ошибаетесь. Код на АСМ-е ещё достаточно высокоуровневый.
                                                    Там есть описания сложнейших структур данных, параметрических (причем вложенных) макросов и т.п.

                                                    Код на АСМ-е КОМПИЛИРУЕТ специальная программа. Называется "ассемблер".

                                                    А вот "машинный код" (т.е. просто набор ноликов и единичек) интерпретирует уже сам процессор
                                                      Исмаил Прокопенко, ты так уныло троллишь, что даже отвечать лень.
                                                        shm Вы не в курсе какой код выполняет процессор?
                                                          Цитата Исмаил Прокопенко @
                                                          shm Вы не в курсе какой код выполняет процессор?
                                                          :facepalm:
                                                              Цитата Исмаил Прокопенко @
                                                              Вообщем нужен ЯПСВУ, который "искоропки" имел бы конструкции, которые позволяли бы писать программы, анализирующие и меняющие свой же собственный код во время компиляции. Т.е. чтобы программа являлась одновременно как бы пользовательским расширением компилятора и языка.

                                                              Это ты как-бы про Форт рассказываешь. В Форте написание программы - это расширение языка в сторону задачи.

                                                              Добавлено
                                                              Цитата Исмаил Прокопенко @
                                                              Вообщем нужен ЯПСВУ, который "искоропки" имел бы конструкции, которые позволяли бы писать программы, анализирующие и меняющие свой же собственный код во время компиляции.
                                                              Цитата Исмаил Прокопенко @
                                                              Почему я назвал такой язык языком СВЕРХ высокого уровня?


                                                              Ну потому что на нем пишут не исходник, а "исходник исходника" если можно так выразиться.
                                                              Вот вот. В Форте если тебе надо создать исполняемую программу, то ты пишешь программу, которая интерпретируясь и на лету переключая режимы интерпретации и компиляцми создаст исполняемую.

                                                              Только Форт не язык сверхвысокого уровня. Он мета-язык, но насчет уровней он покрывает их все сразу. Им можно пользоваться на низком уровне, используя его как продвинутый макроассемблер, а можно на сколь угодно высоком, потому-что изюминка Форта - механизм порождения понятий. Такого нет в других языках. Из-за этого механизма в Форте из коробки нет, к примеру, массивов или записей. Просто потому, что и то и другое понятие порождается в нем в одну строчку. К примеру, массивы я привычно создаю так
                                                              : ARRAY CREATE CELLS ALLOT DOES> SWAP CELLS + ;
                                                              а записи так
                                                              : -- CREATE OVER C, + DOES> C@ + ;
                                                              а можно создать любые абстракции. Сколь высокого уровня. Все внутренности Форта программно доступны. Все что угодно можно в нем перекрыть и динамически и статически. Можно как угодно на лету изменить его синтаксис. Можно налепить на нем такое, что и опытный фортер никогда не узнает в нем Форта. Ну и к тому-же самая рекордно короткая реализация Форта влезла в 512 байт. И в 2 килобайта если без фанатизма. Из-за этого половина фортеров пишут на собственных Фортах. И я тоже. Но резьбу в мозгу для освоения Форта придется перенарезать.

                                                              Добавлено
                                                              Не туда прилетело что-ли ?

                                                              Добавлено
                                                              как-то криво сообщение вышло и не отредактировать и не удалить, чтобы перенабрать.
                                                              Сообщение отредактировано: B.V. -
                                                                Ethereal
                                                                Тяжёлые наркотики принимаете?
                                                                Почему проблем с цитированием?

                                                                Добавлено
                                                                Цитата Ethereal @
                                                                Это ты как-бы про Форт рассказываешь.

                                                                Нет. Читай внимательней.
                                                                И потом, форт - мёртвый язык. Уже лет 20 как.
                                                                И то что отдельные фанатики еще пытаются его продвигать - это не опровергает факта: язык мёртв и хоть какого-то значения на рынке не имеет

                                                                Добавлено
                                                                Цитата Ethereal @

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

                                                                И тем не менее я не знаю ни одной фирмы, которая б вела коммерческую разработку софта на Форте

                                                                Добавлено
                                                                Может чтоб написать программку в пару сотен строк форт и годиться, а вот для реализации крупных проектов, где гигабайт сурцов, форт не годится
                                                                  В первом сообщении топика не было ни звука про попсовость и востребованность языка и про рынок. Там были другие критерии. А если тебе нужен язык, востребованный в каких-то фирмах, то на форуме-то зачем его искать ? В этих фирмах и спроси, что у них там востребовано.
                                                                  Сообщение отредактировано: Ethereal -
                                                                    Цитата Ethereal @
                                                                    В первом сообщении топика не было ни звука про попсовость и востребованность языка

                                                                    Если бы Форт реально рульный язык был - все б бросили плюсЫ и пиашпи и перешли бы на него.

                                                                    А раз этого нет и НЕ В КАКИХ серьёзных коммерческих разработках он не используется, значит язык неудачный
                                                                      Цитата Исмаил Прокопенко @
                                                                      Если бы Форт реально рульный язык был - все б бросили плюсЫ и пиашпи и перешли бы на него.
                                                                      Ошибки в рассуждениях.
                                                                      Все - это стадо. Куда их Борланд, Сан или Майкрософт тащат, туда и идут.
                                                                      Будут колоться, но все равно будут жрать их кактусы. Даже явно неудачные кактусы.
                                                                      А что этим компаниям нужно ? Деньги. Чтобы их продукты покупали и подороже.
                                                                      Поэтому их продукты сложные, порой неоправданно сложные. Вот на C++ хоть посмотри.
                                                                      А Форт невозможно продавать. Никак. Потому-что фортеры часто используют не чужие, а пишут свои Форты и их используют. Я вот когда захотел понять Форт до конца, начал писать свой, за неделю написал и, пока писал, понял.
                                                                      А Оберон нельзя сделать сложным. Он тоже язык явно не для продажи.
                                                                      Ну вот Борланд когда-то сознательно отказалась от продаж уже созданного компилятора Турбо-Модула.
                                                                      Чтобы не убивать курицу, которая несет золотые яйца, а курицей той был Турбо-Паскаль.
                                                                      Так-что коммерческие критерии оценки языка - совсем не те, что академические.

                                                                      Короче, я ни за что не агитировал. Ты задал вопрос - я ответил. Просто Форт под твой вопрос из начала топика полностью подошел.
                                                                      Сообщение отредактировано: Ethereal -
                                                                        Цитата Исмаил Прокопенко @
                                                                        Может чтоб написать программку в пару сотен строк форт и годиться, а вот для реализации крупных проектов, где гигабайт сурцов, форт не годится

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

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

                                                                        P.S. http://xfmap.ru/ Картографическая программа сделанная на Forth (SPF4) с исходниками.

                                                                        Литература по Форт изданная и на русском языке https://archive.org/search.php?query=subjec...+language%29%22

                                                                        немного "устаревшая" т.к. был и стандарт на язык 94года но не потерявшая актуальности.

                                                                        Начать можно с прочтения
                                                                        https://archive.org/details/Broudie2 Л.Броуди Мышление - Форт
                                                                        https://archive.org/details/broudi_l_nachal..._na_yazyke_fort Л.Броуди "Начальный курс программирования на языке Форт"
                                                                        https://archive.org/details/Baranov.Forth.l....implementation
                                                                        texts
                                                                        С.Н.БАРАНОВ Н.Р. НОЗДРУНОВ ЯЗЫК ФОРТ И ЕГО РЕАЛИЗАЦИИ
                                                                        ...

                                                                        Сейчас, конечно, Форт в большей степени можно встретить на Github в применении во встроенных системах, но есть и системы для программирования для ПО компьютеров.

                                                                        Интересно,что на местном сайте информации по Форт вообщем то не представлено,
                                                                        но показательно есть и русскоязычный форум по Форт действующий с 2006г http://fforum.winglion.ru/


                                                                        user posted image

                                                                        http://www.compiler.su/pochemu-obrechyon-yazyk-fort.php Почему обречён язык Форт

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

                                                                        Не хочу показаться "маньяком", но все мои акки переведены Read-Only на Хабр. :)
                                                                        Комментарии в акках Read-Only на Хабр в основном касающихся реалий Форт

                                                                        Диалога с админами Хабр так и не получилось как за "один" неосторожный комментарий сливают на раз карму,
                                                                        а удаление комментариев это уже полный зашквар.

                                                                        Upd: После обращения в службу поддержки комментарии восстановили, сославшись на обновление сломавших это.
                                                                        Сообщение отредактировано: Kopa -
                                                                          Цитата
                                                                          Выбор языка для программ, анализирующих и меняющих свой же собственный код

                                                                          C++
                                                                            Программы, анализирующие и меняющие свой же собственный код.
                                                                            Где это может пригодиться ?
                                                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                            0 пользователей:


                                                                            Рейтинг@Mail.ru
                                                                            [ Script execution time: 0,0841 ]   [ 16 queries used ]   [ Generated: 28.03.24, 08:19 GMT ]