На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Проект транслятора или интерпретатора на C++ , Ищу единомышленника для совместной работы
    Всем привет!

    Недавно я понял, что мне очень интересна тема разработки транслятора/интерпретатора/другой подобной программы. Летом я "для души" писал интерпретатор JavaScript-подобного языка и добился некоторых успехов. Например, смог на нем протестировать некоторые алгоритмы из книги по алгоритмам, все отработало успешно. Помимо основ, этот интерперетатор поддерживал работу с массивами, конструкциями if, switch, for, while, do-while.

    Уже не так давно я помог двум студентам, им уже требовались трансляторы, один - из C++-подобного языка в язык ассемблера, другой - из подмножества Fortran в набор тетрад. Причем в первой программе я закодировал также генерацию дерева трансляции. Обе работы успешно сданы.

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

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

    Итак, тематика возможного проекта - написание транслятора, компилятора или интерпретатора промышленного уровня. Средство реализации - C+++, среда MSVC++ 2010 (без .NET и MFC).

    Жду ваших откликов!

    P.S. Готов рассмотреть также варианты, где другой участник проекта будет не так много копаться в коде, но больше будет в роли тестировщика, а также генератора идей.

    P.P.S. С++ Builder тоже могу рассмотреть как вариант. Может быть, если будет писаться что-то вроде IDE, это даже будет лучшим решением.

    P.P.P.S. Да даже могу рассмотреть и вариант с .NET как платформой для интерактивного приложения, только тогда задача написания .NET-специфичного кода встанет на Вас (так как у меня нет опыта с .NET совершенно)!
    Сообщение отредактировано: Homez -
      Цитата Homez @
      один - из C++-подобного языка в язык ассемблера

      Может всё таки C-подобного языка? :D С++ на много сложнее C.
        Цитата Homez @
        хотелось бы написать что-нибудь уже промышленного уровня, что бы пошло в массы, а возможно, могло бы и приносить доход с продаж копий.
        IMHO, утопическая идея.

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

        К тому же, судя по всему, скрипт будет работать только под Win. Пользователи Win, в основной массе своей знать не знают что такое скрипты.
        Сообщение отредактировано: evlan -
          2 DEADHUNT: Ну это собственно уже детали... Код транслирумеой программы лолжын был быть написан в теле функции - члена класса. Хотя ни вызова функций, ни тем более работы с объектами там уже не предполагалось. И к этой теме это уже мало отношения имеет.

          2 evlan: Ну а с чего Вы решили, что речь идет именно о скриптовом языке? Если это будет транслятор или компилятор, то входным языком может быть что угодно, равно как и результат может быть сформирован в каком угодно виде. Наприимер, это может оказаться транслятор какого-нибудь популярного языка в язык ассемблера какого-нибудь промышленного микроконтроллера. Тем более Ваше последнее замечание не имеет отношения к теме.

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

          2 trainer: Ага, благодарю Вас за то, что перенесли тему в более подходящий раздел. Если бы я знал о его существовании, я бы сразу разместил тему здесь.

          2 All: Продолжаю ждать Ваших всевозможных идей и предложений.
            Прежде всего нужно не слушать всяких скептегоф, которые найдут стопицот причин, почему заявленный проект провалится. Но грусть в том, что не нужно ничего обсуждать и искать единомышленников на форуме. На форумах сидят одни неудачнеге, которые в основном могут родить пост типа "не взлетит". Нужно просто реализовывать и молча выпускать первую версию. Писать на форуме анонс, из критических отзывов брать ценное, а дальше класть на всех болт, ни в коем случае не отвечать критикующим - с ними разговор бесконечен и бесплоден.
              Я уже несколько лет работаю над интерпретатором с си-подобного языка, использующийся в составе программы, которая красуется в моей подписи. Проект многообещающий и перспективный, на мой взгляд.
                Программу скачал, жаль, что документация недоступна, не понял в целом, какие задачи выполняет программа. А где интерпретатор используется? Для каких-то скриптов автоматизации, которые недоступны пользователю для просмотра и редактирования?

                Добавлено
                Покопался в файлах программы, нашел-таки эти скрипты. Странный у Вас формат для циклов for. После to, ИМХО, по логике должно стоять верхнее значение переменной, которая работает как счетчик, а не условие цикла. И инкремент почему-то записывается в самом конце цикла. Так, несомненно, проще несколько обрабатывать циклы, например, в моем трансляторе (а может и в интерпретаторе, уже точно не помню) чтобы корректно все работало, нужно было в промежуточную программу добавить несколько безусловных переходов (чтобы наращение счетчика происходило строго раньше проверки условия и чтобы перед первым проходом счетчик не наращивался). Там у меня форма записи цикла for была аналогична той, что в C или Java. По-моему, запись инкрементирования после тела цикла понижает читаемость программы. Ну хотя, эти ж скрипты не предназначены для конечного пользователя, чтобы тот их мог просматривать и править по необходимости, или я ошибаюсь?

                А кстати, break и continue вы реализовали? В моем интерпретаторе эти инструкции были, причем в форме, характерной для Java, с метками, то есть из внутреннего цикла можно было перейти на новый проход даже и внешнего цикла по continue или выйти уже за пределы внешнего цикла по break с его меткой .

                Добавлено
                Ну в общем, использование интерпретатора как компонента приложения для автоматизации некоторых действий - тоже вариант.

                Добавлено
                Да, AZote, еще странность в этих Ваших скриптах - то, что где-то перед именем переменной надо ставить знак доллара, а где-то не надо. Чем это обусловлено?
                  Цитата Homez @
                  Для каких-то скриптов автоматизации, которые недоступны пользователю для просмотра и редактирования?

                  Как раз наоборот. Программа в целом представляет собой сборщик и контейнер различного рода информации. А интерпретатор используется для её форматированного вывода в виде конечного текста. Разумеется, не каждый пользователь сможет создавать так называемые скриптовые шаблоны для вывода информации, а только продвинутый и имеющий хотя бы начальные навыки в программировании. Но здесь нет проблемы - всегда можно заказать шаблон у разработчика! :D

                  Цитата Homez @
                  Странный у Вас формат для циклов for. После to, ИМХО, по логике должно стоять верхнее значение переменной, которая работает как счетчик, а не условие цикла.

                  Вы правильно проследили причинно-следственную связь введения такой конструкции цикла. Она проще в реализации. Но тут есть еще один фактор - мои давние увлечения basic'ом. :rolleyes: Что касается выражения после to, то "верхнее значение" превратило бы цикл в неудобнуюю и узкоприменимую конструкцию.

                  Цитата Homez @
                  А кстати, break и continue вы реализовали?

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

                  Цитата Homez @
                  Да, AZote, еще странность в этих Ваших скриптах - то, что где-то перед именем переменной надо ставить знак доллара, а где-то не надо. Чем это обусловлено?

                  Знак доллара $ - это оператор явного приведения в cтроковый тип.
                  Есть еще два подобных оператора: % - приведение к целому, ~ - приведение к реальному.

                  ExpandedWrap disabled
                    str = "2011 year!";
                     
                    year = % str; // year = 2011


                  В общем же, язык обладает динамической типизацией.
                    Ваши ответы понял. Что касается break и continue, если интересно, то могу дать уже в личном общении советы, как сделать их поддержку, в том числе и с метками, как в Java. Все-таки иногда эти операторы бывают очень полезны.
                      Цитата Bulkoed @
                      ни в коем случае не отвечать критикующим - с ними разговор бесконечен и бесплоден.
                      IMHO - по моему скромному мнению
                      Не обращать внимания на критику в принципе, верный способ профукать что-нибудь важное. Бывает и полезная, конструктивная критика.


                      Цитата Homez @
                      Ну а с чего Вы решили, что речь идет именно о скриптовом языке?
                      Предположил исходя из того, что "для себя" был написан именно скрипт.
                      Я так понимаю со своей колокольни - Вам хочется написать что-то промышленное и масштабное, причём нечто привлекающее внимание масс, к тому же платное. Для этого есть необходимые условия:
                      своевременность
                      востребованность
                      оригинальность
                      профессиональная команда

                      Лично мне интересно, вы работаете по профилю?
                      Сообщение отредактировано: evlan -
                        Что значит - работаю по профилю?

                        Добавлено
                        Насчет того, что игнорировать критику или хотя бы не отвечать на нее - это неразумный подход, я с Вами согласен.

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

                        Добавлено
                        Насчет же моего образования, да, образование у меня не программистское, хотя компьютерным технологиям внимания в вузе было уделено много. Но я не считаю, что профильное образование - это обязательный ключ к успеху, многого можно добиться и самообразованием, что и есть в моем случае.
                          Цитата Homez @
                          то значит - работаю по профилю?
                          Предположил что у Вас есть постоянное место работы в качестве программиста.
                            ну сейчас я работаю как фрилансер, но сути это не меняет.
                              Homez, очень хотелось бы поучаствовать в проекте. Но к сожалению у меня нет таких знаний по С++. Я только ООП начинаю учить)

                              Добавлено
                              Но идеями помочь могу :)
                                Приятно это слышать, Snej. Но опыт какой-то в программировании вообще имеется?
                                  Homez, да. Преимущественно веб. Вполне хорошо знаю php и js, чуть хуже питон 3.2, ну и ещё хуже С++ :D
                                    Цитата Snej @
                                    хорошо знаю php
                                    Цитата Snej @
                                    ещё хуже С++


                                    Мда, не стого конца ты начал! :D
                                      AZote
                                      С того) Я начал от "лучшего к худшему". :)
                                        Гм, я могу оскорбиться. Это C++ хуже, чем PHP?
                                          Цитата Homez @
                                          Гм, я могу оскорбиться. Это C++ хуже, чем PHP?

                                          Не принимай близко к сердцу. :D Он ишо неопытный! :crazy:
                                            Homez, AZote
                                            нееет))) :D Я про мой уровень знаний относительно этих япов. :) Пхп и жс я знаю лучше чем С++. А если сравнивать пхп и С++, то С++ канешн круче будет)
                                              а, ну ясно, я спокоен тогда:)
                                                Не заглох ли ещё проект?
                                                Очень интересно.
                                                Отпугивает, однако, желание коммерческой выгоды и отсутствие кроссплатформенности.
                                                В моих проектах иногда требуется написание плагина, который позволял бы пользователю составлять простенький сценарий работы. Т. к. пользователи зачастую нубы, язык сценария должен быть максимально простым. Поэтому в каждом проекте язык свой, в семантику языка вносятся только необходимые именно для данного проекта конструкции.
                                                Отсюда появляется прямое следствие. Требуется библиотека C++, позволяющая:
                                                *) максимально просто задавать семантику любого языка;
                                                *) загружать скрипт пользователя на соответствующем языке;
                                                *) транслировать скрипт в объектный или ассемблерный код (не в exe);
                                                *) выполнять полученный код.
                                                Нигде ничего подходящего (ещё одно моё условие - совместимость с C++ Builder) я не нашёл, поэтому пишу такую библиотеку сам.
                                                Транслирую скрипт в объектный код своего формата, т. к. трансляция в ассемблерный код кажется слишком заморочной. К тому же не понятно, можно ли в оперативную память скопировать код функции, а затем сделать прыжок "CALL" в этот участок памяти. По идее ради безопасности такая махинация должна быть запрещена.
                                                  Zaytsev Artem, а где я в этой теме писал про коммерческую выгоду? Может быть, Вас смутило словосочетания "промышленный уровень"? Так вот, этот гипотетический промышленный уровень совсем не означает, что программа планируется к продажам, а что хотелось бы написать тулзу, которой бы для решения своих профессиональных задач (возможно, специализированных) могло бы реально пользоваться не самое маленькое количество людей.

                                                  Потом, на то, что это обязательно будет под Win32, я сейчас упора не делаю, просто привык работать и программировать в этой системе. Например, можно было бы реализовать проект на Java - а тогда спектр конечных платформ очень широк, вплоть до мобильных устройств.

                                                  Кстати, Ваше условие для интерпретатора сценариев, который нужен Вам в Ваших проектах - обязательная совместимость с C++ Builder - разве не противоречит Вашим словам, что отсутствие кроссплатформенности в моем проекте Вас отпугнуло?

                                                  Проекта как такового еще и нет, поэтому и глохнуть пока еще нечему:) Но идея еще жива. Кстати, тут вэтом же разделе у меня есть другая схожая тема, Вы ее видели?

                                                  Цитата Zaytsev Artem @
                                                  Транслирую скрипт в объектный код своего формата, т. к. трансляция в ассемблерный код кажется слишком заморочной.

                                                  ИМХО, не очень удачная, а потому могущая запутать терминология. То, что Вы назвали объектным кодом своего формата, лучше бы называть байт-кодом, как в случае Java, возможно, таким же образом именуют выходной код для .NET (здесь уже я не могу быть уверене на все сто). То, что Вы назвали ассемблерным кодом, лучше бы называть просто машинным кодом, не имели же Вы в виду код на языке ассемблер? А я последний и называю ассемблерным кодом, думаю, как и многие.

                                                  Цитата Zaytsev Artem @
                                                  К тому же не понятно, можно ли в оперативную память скопировать код функции, а затем сделать прыжок "CALL" в этот участок памяти. По идее ради безопасности такая махинация должна быть запрещена.

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

                                                  В Вашем случае, конечно, немного сложнее, но решаемо. Формирование машинного кода прямо в процессе работы программы, с последующим его выполнением, называется JIT-компиляцией (Just In-Time). На сегодняшний день это используется в таких средах, как Java и .NET, что решило проблему быстродействия в этих системах - оно теперь такого же порядка, как и у программ, сразу компилмруемых в машинный код (так, решая вычислительные задачки с Project Euler, я обнаружид, что порой равнозначный код на Java выпоняется быстрее, чем на C++ в релиз-конфигурации). Тут просто нужно выделять память для машинного кода, получающегося в результате трансляции, для это блока памяти поставить нужные разрешения - и можно запускать. Но конечно, транслировать в байт-код для собственной виртуальной машины намного проще, потом тут можно эффективно решить многие проблемы, связанный с возможными ошибками выполнения (например, выход за пределы блока памяти и т.д. Тем более это существенно, если Вы говорите, что большинство пользователей этих продуктов будут заметно низкой квалификации в программировании.

                                                  Добавлено
                                                  Цитата Homez @
                                                  Отсюда появляется прямое следствие. Требуется библиотека C++, позволяющая:
                                                  *) максимально просто задавать семантику любого языка;


                                                  Насколько я понял, то не только семантику, но и синтасис, так? То есть, с помощью такой библиотеки можно бы было для одной программы сделать один язык для пользовательских скриптов, а для другой - совершенно другой язык? С таким я дела не имел. Может быть, Вам есть смысл посмотреть в сторону генераторов лексических и синтаксических анализаторов, думаю, что в виде библиотек таковые имеются - я как-то не интересовался этим вопросом, в моих интерпретаторах-трансляторах и синтаксис, и семантика были жестко заданы.

                                                  Добавлено
                                                  Это по сути уже получается интерпретатор интерпретатора:) Гораздо более сложная задача, нежели написание интерпретатора фиксированного языка.
                                                  Сообщение отредактировано: Homez -
                                                    Цитата Homez @
                                                    где я в этой теме писал про коммерческую выгоду?
                                                    Меня смутила фраза:
                                                    Цитата Homez @
                                                    могло бы и приносить доход с продаж копий
                                                    Я понимаю, что это гипотетически. Но из текста я сделал вывод о том, что возможность коммерческой выгоды допускается, т. е. желание присутствует.
                                                    Цитата Homez @
                                                    Проекта как такового еще и нет
                                                    Ну, по аналогии с "интерпретатором интерпретатора", будем считать Вашу задумку "проектом проекта")))
                                                    Цитата Homez @
                                                    что это обязательно будет под Win32
                                                    Под "кроссплатформенностью" я подразумевал не Win32 (Вы ведь напрямую об этом и не писали). Меня смутило то, что Вы написали про MSVC и про Builder, но при этом не упомянули возможность поддержки и того, и другого одновременно.
                                                    Цитата Homez @
                                                    обязательная совместимость с C++ Builder - разве не противоречит Вашим словам
                                                    Здесь ключевое слово "совместимость". Это значит, что библиотека может работать под любую C++ IDE, но лично мне требуется, чтобы и в Builder-е работала.
                                                    Цитата Homez @
                                                    То, что Вы назвали объектным кодом своего формата, лучше бы называть байт-кодом
                                                    Не знаю, я в вопросе данной терминологии не компетентен. Наверное Вы правы, "байт-код" звучит менее странно.
                                                    Цитата Homez @
                                                    То, что Вы назвали ассемблерным кодом, лучше бы называть просто машинным кодом
                                                    Вы, конечно, правы, я оговорился.
                                                    Цитата Homez @
                                                    нет пермишена на запись. Но его очень легко получить, вроде бы за один вызов одной функции
                                                    Это обнадёживает. Однако в свете общей итоговой сложности задачи, всё же, проще будет не заморачиваться на машинный код.
                                                    Цитата Homez @
                                                    Насколько я понял, то не только семантику, но и синтасис, так?...
                                                    Честно говоря, слабо представляю, что такое синтаксис, а ещё слабее, как его можно задавать.
                                                    Правильно ли я понимаю, что различная семантика - это когда в одном языке "begin" а в другом "{", а различный синтаксис - это когда в одном языке "for (i = 0; i < iMax; ++i)", а в другом "for i := 0 to iMax - 1 do"?
                                                    Если так, то у меня синтаксис задан жёстко. Иначе было бы слишком сложно. А в общем случае, конечно, да, было бы здорово.
                                                    Цитата Homez @
                                                    В сторону генераторов лексических и синтаксических анализаторов
                                                    Я глядел, но ничего пригодного для использования "из коробки" не нашёл.
                                                    Цитата Homez @
                                                    интерпретатор интерпретатора
                                                    Забавно)))
                                                    Цитата Homez @
                                                    Гораздо более сложная задача
                                                    Я стараюсь не разбрасываться на большой универсализм и реализую только то, что требуется для моих задач.
                                                      Цитата Zaytsev Artem @
                                                      Я понимаю, что это гипотетически. Но из текста я сделал вывод о том, что возможность коммерческой выгоды допускается, т. е. желание присутствует.

                                                      Да, я когда сегодня перечитывал тему, как-то не пропутил ту фразу про возможный доход с продаж копий:) Хотя совсем рядом вычитал про промышленный уровень:) Да, я такой возможности не исключаю, но не ставлю во главу угла? Чего плохого в таком желании?

                                                      Цитата Zaytsev Artem @
                                                      Ну, по аналогии с "интерпретатором интерпретатора", будем считать Вашу задумку "проектом проекта")))

                                                      За фразу респект:) Проект проекта - как звучит-то:)

                                                      Цитата Zaytsev Artem @
                                                      Меня смутило то, что Вы написали про MSVC и про Builder, но при этом не упомянули возможность поддержки и того, и другого одновременно.

                                                      Гм, а зачем это в моем проекте проекта? Если бы я принялся, я бы всяко стал программировать в какой-то одной среде. Ну возможно, если б это был чистый проект Win32, его можно было бы клепать и там, и там, но я бы не колебаясь остановился на Visual Studio, в билдере я и не пробовал что-то делать без VCL. Я же вел речь именно об отдельном приложении-трансляторе, но не о библиотеке какой-нибудь, что начали разрабатывать Вы.

                                                      Цитата Zaytsev Artem @
                                                      Это обнадёживает. Однако в свете общей итоговой сложности задачи, всё же, проще будет не заморачиваться на машинный код.

                                                      Я Вам в PM, кажется, еще добавил своих мыслей на эту тему.

                                                      Цитата Zaytsev Artem @
                                                      Честно говоря, слабо представляю, что такое синтаксис, а ещё слабее, как его можно задавать.
                                                      Правильно ли я понимаю, что различная семантика - это когда в одном языке "begin" а в другом "{", а различный синтаксис - это когда в одном языке "for (i = 0; i < iMax; ++i)", а в другом "for i := 0 to iMax - 1 do"?

                                                      Нет, Вы неправильно понимаете. begin в одном языке, а { в другом - это разный синтаксис. При этом cемантически { в C++ равносильно begin в Delphi. По поводу же Вашего примера двух циклов for, тут, конечно, синтаксис разный. Да и семантика равнозначна только для данных двух примеров циклов. Например, в C++ можно внутри круглых скобок приращения цикла и не делать, либо поставить туда совершенно любое выражение, которое имело бы какой-то побочный эффект.

                                                      Цитата Zaytsev Artem @
                                                      Если так, то у меня синтаксис задан жёстко. Иначе было бы слишком сложно.

                                                      В свете вышесказанного можно совершенно неправильно понять эти Ваши слова. Правильно ли я понял, что Ваш анализатор имеет жесткие правила синтаксического разбора, просто, например, ему можно как-то указать, что ему считать за начало составной инструкции, какое ключевое слово обозначает оператор цикла и т.д.? Если так, то не вижу особых преимуществ. Это все равно что с помощью дефайнов заставить компилятор C++ считать begin за {, а { порождал бы какой-нибудь нераспознанный токен, с той только целью, чтобы генерировать ошибку, ведь у нас должны быть begin вместо {. Но язык-то при этом остается тем же самым, а только будут плодиться разночтения среди конечных пользователей.

                                                      Цитата Zaytsev Artem @
                                                      А в общем случае, конечно, да, было бы здорово.

                                                      Хотел сказать безоговорочное "да", но сейчас уже начал сомневаться. Я подобного никогда не делал и даже не планировал. А продумывая некоторые свои слова выше, к данному моменту я уже несколько запутался:) Семантику как раз-таки придется подгонять под один костюмчик, иначе получится "поди туда, не знаю куда, принеси то, не знаю что". Библиотека же будет одна? Следовательно, надо четко продумать виртуальную машину, операции, которые в ней разрешены. Просто совершенно разные и порой совсем не похожие конструкции в двух разных транслируемых языках могут приводить к аналогичному по сути байт-коду, который будет выполняться на этой виртуальной машине.

                                                      Цитата Zaytsev Artem @
                                                      В сторону генераторов лексических и синтаксических анализаторов
                                                      Я глядел, но ничего пригодного для использования "из коробки" не нашёл.

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

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

                                                      Добавлено
                                                      Кстати, Артем, уже чего-то добились? Или пока что все на стадии идей?

                                                      Добавлено
                                                      Гм, прочитал про Lex и Yacc - генераторы, соответственно, лексчических и синтаксических анализаторов. Они генерируют код на C, который уже можно включить в свою программу, то есть на лету уже не получится. Попробую поискать еще, выкроил немного времени перед сном.

                                                      Добавлено
                                                      Гм, а по ходу, таких тулов, которые могли бы генерировать анализаторы, которые тут же на ходу можно бы было и применять, и нету... Есть возможность сказать свое первое слово:) Кстати, за такой бы проект с удовольствием взялся. Понятно, однако, что получающийся в итоге, допустим, объект, который будет производить синтаксический или лексический анализ, будет работать дольше медленнее специально написанного аналога, так как по сути это будет интерпретатор.

                                                      Добавлено
                                                      Но ха, что мешает тут сделать JIT-компиляцию этого генерируемого анализатора:) Понятно, что это еще на порядок сложнее, но тогда получится совсем мощная система, аналогов которой в мире может и вовсе не быть!
                                                        Здесь задача как раз для внешнего генератора синтаксических анализаторов и для внешнего же генератора синтаксического анализатора (например пара flex+bison), надо только научиться ими пользоваться. Они сгенерируют несколько файлов, которые, будучи подключенными к программе, будут производить компиляцию (часть функций, естественно, придется написать вручную) скрипта в байт-код. Интерпретация байт-кода производится достаточно быстро, чтобы не обращать на нее слишком много времени.

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

                                                        Добавлено
                                                        Генерировать анализаторы на лету - изврат. Не думаю, что автор хочет учить пользователей еще и программированию компиляторов (учитывая, что он и сам в них еще не разбирается).
                                                          amk, согласен с Вами, ведь для одного конкретного проекта, куда будет встроен такой модуль для интерпретации сценариев, вряд ли язык этих сценариев будет меняться на лету, значит, и формировать/изменять логику анализаторов на лету - это блажь, лишнее. А ради каждого конкретного проекта можно немного потрудиться и дописать свой код для моста между анализаторами и ВМ. Не конвейер же у автора будет по производству этих программ, в каждой из которых был бы свой язык сценариев.
                                                            Для новой программы придется скорее всего дописать лишь несколько встроенных функций.
                                                            Ну и обнаруженные в старом варианте ошибки/недоделки исправить.
                                                            Новый вариант можно старым программам прилинковать.
                                                              Цитата Homez @
                                                              Чего плохого в таком желании?
                                                              Для Вас ничего плохого, даже наоборот)
                                                              Цитата Homez @
                                                              Гм, а зачем это в моем проекте проекта?
                                                              Значит я неправильно выразился. Тогда отпугивает отсутствие "библиотечности")
                                                              Цитата Homez @
                                                              В свете вышесказанного можно совершенно неправильно понять эти Ваши слова.
                                                              Тогда отречёмся от слишком "умного" слова "Семантика". Попробуем по-другому. Требуется библиотека C++, позволяющая:
                                                              *) задавать функции и операторы скриптового языка из базового набора библиотеки (блок, условие, цикл, и т. п.), а также дополнительный набор функций, создаваемых разработчиком.
                                                              Цитата Homez @
                                                              Правильно ли я понял,
                                                              Правильно. Только требуется не столько определить названия конструкций (хотя и их тоже), сколько включить эти конструкции в язык. Т. е. язык может быть настолько простым, что там может, например, не нужны блоки, а нужно только указать последовательность действий, у которых при этом специфические наименования и параметры.
                                                              Цитата Homez @
                                                              Это все равно что с помощью дефайнов...
                                                              Верно, но эта возможность должна быть заявлена (т. е. её следует упомянуть в числе требований). Кстати, #define - это разве по сути не интерпретатор интерпретатора?
                                                              Цитата Homez @
                                                              Советую подправить вашу терминологию
                                                              Каюсь, есть такая проблема.
                                                              Цитата Homez @
                                                              Кстати, Артем, уже чего-то добились? Или пока что все на стадии идей?
                                                              На стадии разработки. Сделал общий каркас библиотеки. Делаю парсер. Затем останется сделать виртуальную машину.
                                                              Цитата amk @
                                                              Они сгенерируют несколько файлов
                                                              А какого формата файлы они генерируют?
                                                                Цитата Zaytsev Artem @
                                                                А какого формата файлы они генерируют?
                                                                Исходники на C (lex/yacc) или C++ (flex/byson). Содержат набор таблиц описывающих лексику/синтаксис языка и интерпретаторы этих таблиц, которые вместе с написанным тобой функциями и производят компиляцию.

                                                                flex/bison могут работать вместо первой пары.

                                                                Есть варианты, генерирующие все это на паскале или других языках.
                                                                  Цитата Zaytsev Artem @
                                                                  А какого формата файлы они генерируют?

                                                                  На сколько я понял из описания (руками эти тулзы не трогал), на выходе получаются файлы с исходным кодом для лексического/синтаксического анализаторов в виде отдельных функций, которые можно включить в свой проект. На входе должно быть формальное описание языка в заданном формате. Советую подобными инструментами воспользоваться, коли нет опыта написания своего транслятора, тем более Вы хотите для разных своих продуктов скриптовые языки делать разными. Тогда просто для каждого своего языка скриптов Вам нужно будет задавать свою грамматику в формате, принимаемом тулзой, запускать тулзу, получать файли с исходнимком анализатора, добавлять этот исходник в проект. Если какие-то языки будут не сильно друг от друга отличаться, Вам просто будет достаточно сделать несколько правок в формальном описании грамматики языка.
                                                                    Homez, тема давняя, но если ещё актуально, могу предложить написать интерпретатор C++ подобного языка для использования его на серверах, как и вместо PHP.
                                                                    "Подобного" - потому, что оставив мощь C++, следует взять возможности PHP по обработке текста HTML, скажем, сам C++ код обрамляется тегами <?c++ ... ?>, вне которых - HTML код, добавить API работы с GET и POST параметрами CGI приложения, некоторое число твиков.
                                                                    Идея родилась после написания своей системы управления содержимым на C++: http://maasoftware.ru, на C++ писалось лучше и привычнее, чем на PHP, но возможности микширования кода PHP и HTML не хватало, также возможности вставки значений переменных языка в HTML, возможно, eval(), `` и т.д.
                                                                    У PHP, в свою очередь, плохо с перегрузкой функций, отсутствует строгая типизация, да и синтаксис после C++ не привычен.
                                                                    Соответственно, есть наработки для работы с CGI параметрами, и вообще, кросс-платформенная библиотека-замена STL: ToolsLib

                                                                    PS: В простейшем виде, C++ файл можно скомпилировать и запустить на Linux сервере, например, так:
                                                                    /home/user/cpp_c.sh:
                                                                    ExpandedWrap disabled
                                                                      #!/bin/sh
                                                                       
                                                                      if [ "x$1" = "x" ]; then
                                                                          exit 1
                                                                      fi
                                                                       
                                                                      s=/tmp/1.cpp
                                                                      fn=/tmp/1.out
                                                                      cat "$1" | sed "1d" >$s
                                                                      g++ -lstdc++ -o $fn $s 2>&1 >/dev/null && $fn
                                                                      r=$?
                                                                      rm $s $fn
                                                                      exit $r


                                                                    и сам файл скрипта на C++ в каталоге web-сервера, скажем, sample.cgi:
                                                                    ExpandedWrap disabled
                                                                      #!/home/user/cpp_c.sh
                                                                       
                                                                      #include <stdio.h>
                                                                       
                                                                      int main()
                                                                      {
                                                                          printf("Content-Type: text/plain\n");
                                                                          printf("Cache-control: no-cache\n");
                                                                          printf("\n");
                                                                          printf("C++ output !\n");
                                                                          return 0;
                                                                      }
                                                                    Сообщение отредактировано: maa -
                                                                        maa, тема давняя и уже не актуальная. Я больше не горю идей какого-то глобального проекта компилятора или транслятора.

                                                                        По поводу вашей идеи проекта. А как использовать существующую кодовую базу на C++? Может быть, Вы предполагаете написание что-то типа транслятора, который будет обрабатывать код с <?c++ ... ?>, чтобы на выходе получалась программа на C++?

                                                                        Про себя могу сказать, что мои наработки по трансляции пригодились мне относительно недавно. Я заинтересовался проектированием микропроцессоров, послушал несколько соответствующих курсов на coursera.org и возникла идея сделать свой дизайн микропроцессора. Понятно, что это учебный проект и для собственного удовольствия. Мне не удалось найти какую-то удобную среду для проектирования своего дизайна на HDL (Hardware Definition Language), такую, чтобы можно было производить валидацию и тестирование чипов, поэтому решил написать свою, на Java. И вот как раз свои знания по написанию компиляторов я использовал в этой своей среде: я написал транслятор собственного HDL, описал несколько чипов на нем, чипы парсятся и представляются программно, проверочные выражения успешно проходят валидацию. К сожалению, еще предстоит много работы, а времени уделить удается мало, давно не садился за этот проект.
                                                                          Homez
                                                                          Неплохо бы посмотреть. А визарды ака генераторы как в qartuse есть? А в чём основная трудность, над чем работаете?
                                                                            Цитата
                                                                            Неплохо бы посмотреть.

                                                                            Я подумал о том, чтобы выложить проект, например, на GitHub, но предвкушаю, что, в нынешнем состоянии, могут грянуть кардинальные перемены всего внутреннего API, поэтому пока не тороплюсь.

                                                                            Цитата
                                                                            А визарды ака генераторы как в qartuse есть?

                                                                            Не знаю, что такое qartuse. Мой проект в текущем состоянии - это пока консольное приложение, которые вычитывает описания чипов из файлов ресурсов, проводит их валидацию и тесты.

                                                                            Цитата
                                                                            А в чём основная трудность, над чем работаете?

                                                                            Сейчас остановился на многобитных входах/выходах и проверочных выражениях для них. С однобитными входами/выходами всё ок.

                                                                            Добавлено
                                                                            Ну вот, например, описание мультиплексора:

                                                                            chip mux
                                                                            {
                                                                            in a, b, sel;
                                                                            out out;
                                                                            parts not(in=sel,out=notSel),nand(a=notSel,b=a,out=selA),nand(a=sel,b=b,out=selB),nand(a=selA,b=selB,out=out);
                                                                            test out=sel?b:a;
                                                                            }

                                                                            not - другой описанный чип, nand - базовый чип. Делается проверка, что нет циклической рекурсии при описании чипов, делается проверка, что нет цикличности в сигналах внутри чипов, это я делаю с помощью графов.

                                                                            Добавлено
                                                                            Основным источником вдохновения был вот этот курс: http://www.nand2tetris.org/. Но я послушал и другие, намерен пойти дальше и попробовать сделать хотя бы простенький конвейер a-la классический конвейер MIPS.

                                                                            Сообщения были разделены в тему "spam"
                                                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                            0 пользователей:


                                                                            Рейтинг@Mail.ru
                                                                            [ Script execution time: 0,1018 ]   [ 15 queries used ]   [ Generated: 19.03.24, 11:21 GMT ]