Предложение по Учебному Проекту № 3
Предлагаю создать Учебный Проект по созданию языка программирования (ЯП). Тут можно будет рассмотреть разные инструменты типа bison, можно будет обсуждать всякие парадигмы ЯП, виртуальных машин и т.д.
Какие тут плюсы? Первый: такая практика (создание ЯП) интересна мне самому. Второе: теоретически, у проекта могут быть кураторы, раз тема интересна. Третье: возможно, на форуме есть другие люди, которым такая практика может пригодится.
Потенциальные минусы. У меня уже есть некоторое представление о том, какой ЯП буду создавать. Это не будет ещё один клон Хаскеля или Лиспа. Скорее, что-то похожее на классические компилируемые языки, типа C++ или Паскаля, но с некоторыми принципиальными отличиями. Соответственно, и ТЗ напишу я.
Кроме того, если не будет веских аргументов против, то буду использовать именно bison или какие-то другие клоны yacc, ибо классика.
Есть у кого-нибудь идеи, предложения, пожелания?
Новый Год прошёл...
За подготовительный период я ознакомился с лексическими и синтаксическими анализаторами, с некоторыми подходами к реализации семантического анализа (последнее больше в теории).
Сейчас могу наклепать простейший интерпретатор с переменными и встроенными функциями. Есть некоторое смутное понимание, как сделать интерпретатор с циклами, пользовательскими функциями. Но тут я пока не совсем осознал, как красиво связать синтаксический анализатор с частью, отвечающую за семантику (пока пытаюсь использовать тут машину со стековой организацией). Как сделать компилятор - представляю совсем слабо, хотя делал простейший транслятор, приведённый в "книге Дракона".
Книгу читал, но пока не всю осилил. Не совсем согласен, что в ней "много ненужной математики", но согласен, что там много того, что мне сейчас не нужно. Например, там долго и нудно объясняется как преобразовать НКА в ДКА. Оно может и пригодится при каких-то оптимизациях, или при создании анализаторов, но это не то, что мне требуется в первую очередь для этого проекта.
Не совсем выбраны и инструменты. Я ознакомился с bison и PLY. Пока мало что могу сказать. Есть ощущение, что с PLY легче сделать всё в привычном ООП-шном стиле. Посматриваю в книжонку про OCaml, но использовать не рискую, ибо если уж его принять, то придётся вначале вдумчиво изучать сам язык, на что может уйти год и более.
Если сейчас начинать коллективную работу, то получится как в случае, когда один слепой вел другого и оба упали в яму. Тут желающим действительно лучше присоединиться к разработке Nemerle...
В принципе, можно пересмотреть формат проекта. Например, реализовывать интерпретаторы языка hoc, используя разные инструменты. Кто-то будет разрабатывать на F#, кто-то на C#, кто-то на Java, я на Python... Потом можно будет сравнивать версии по разным параметрам.
Я поигрался с использованием FsLex и FsYacc - принципы их работы понятны и не особо сложны. Остановился на том, что пытаюсь понять, как правильно самостоятельно строить грамматики и переводить их в код для Yacc (хочется именно вкурить как это делается, а не копировать уже существующие грамматики). Причём для освоение FsLex, FsYacc использовал статьи по OCamlLex, OCamlYacc, т.к. это копии этого лексера и парсера.
Ну это преувеличенно, имхо. У меня ушло 1.5-2 недели на то, чтобы понять как писать на F#, после этого я только шлифую свои навыки и изучаю возможности библиотек F# и .Net, с Ocaml думаю будет аналогично (особенно если учесть, что есть перевод одной книги на русский по OCaml, а для F# у меня был только русский MSDN).
Тут проблема вот в чём. Когда я начинал изучать Python, то первые полгода программы сложнее хелловорлда я писал на Python как на C++. Cинтаксис был питоновский, а вся логика соответствовала C++. Во многом и сейчас это осталось. Я почти не сомневаюсь, что и на OCaml я быстро научусь писать программы в духе C++. Но есть ли смысл?
Но спорить можно долго. Тут лучшим показателем был бы некий турнир по реализации определённого языка с помощью различных технологий. Потому я всё-таки прошу потенциальных участников рассмотреть вот этот язык для реализации:
http://en.wikipedia.org/wiki/Hoc_(programming_language)
Реализация версии на bison, с проектом для Code::Blocks - в прикреплённом архиве. Основана на этой версии для yacc:
http://netlib.bell-labs.com/~bwk/hoc.sh
Могу сказать из своего опыта - F#, в некотором смысле, сопротивлялся императивному стилю и только сейчас (где-то через полгода использования F# я начинаю использовать эл-ты императивного стиля в тех местах, где это оправданно и необходимо). Но спорить не буду, на вкус и цвет фломастеры разные))