На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania 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.
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Выбор языка для программ, анализирующих и меняющих свой же собственный код.
    Посоветуйте язык программирования сверхвысокого уровня (ЯПСВУ), программа на котором могла бы в 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;

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

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

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

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

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

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


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

                        2-я часть служит расширением компилятора и грамматики языка для соответствующей прикладной области/задачи и задает контролируемые зависимости в коде, правила преобразования и парсинга/анализа исходника и генерации исполняемого кода
                        Написать код, понятный машине, и дурак сможет. И только хороший программист сможет написать код, понятный людям
                          Мне на стек овер флов ру посоветовали присмотреться в языку Nemerle.
                          Кто-нибудь на нем кодил?
                          На нем реально сделать то, что мне нужно?
                          Написать код, понятный машине, и дурак сможет. И только хороший программист сможет написать код, понятный людям
                            Исмаил Прокопенко, бери пример с разработчиков Qt - напиши свой moc++ и не парься.
                            Мои программные ништякиhttp://majestio.info
                              Roslyn ?
                              Intel Core i7 2600K, 16Gb
                              Windows 7 Максимальная Service Pack 1
                              Индекс производительности: 7,7-VIDEO, 7,8-CPU&RAM, 7,9-HDD
                                D вполне умеет подобное.
                                error: 'long long long' is too long for GCC
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,3053 ]   [ 16 queries used ]   [ Generated: 23.05.19, 05:41 GMT ]