LINUX.ORG.RU

как быстро создать свой ЯП?

 ,


2

3

Сабж. Есть идеи, хочу их попробовать. Если ли, скажем, какие-то тулкиты для эээ автоматизации этого? Ну, например, набор примитивов (структуры, списки, массивы ...), плюс какие-нить парсеры итд итп. Я не про yacc/bison+llvm, а про что-нить более высокоуровневое и лузер-френдли.

Чтобы по-быстрому, можешь попробовать написать транслятор в какой-нибудь другой язык. А то и препроцессор.

PolarFox ★★★★★ ()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

anonymous ()

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

anonymous ()

и лузер-френдли.

http://www.math.spbu.ru/user/mbk/PDF/Ch-3.pdf [PDF] Глава 3 КОНЕЧНЫЕ АВТОМАТЫ И РЕГУЛЯРНЫЕ ГРАММАТИКИ ...
http://is.ifmo.ru/progeny/mobdev/ [HTML] Применение конечных автоматов при программировании мобильных устройств
http://www.unn.ru/books/met_files/metodich.doc [DOC] Конечный автомат удобно задавать диаграммой его ... - ННГУ

- то есть, что-нибудь про конечные автоматы, про алгорифмы Маркова и про схемы программ.

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

возьми common lisp и напиши на нём

Lugovsky luser-friendly advice? =)

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

Я так и знал, что сейчас набигут теоретики со ссылками на автоматы. Отличный ответ на вопрос о _тулкитах_.

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

А что там с Nemerle/n2?
В каком состоянии?

Nemerle - Был. Есть.
N2 - в никаком состоянии.

d_Artagnan ★★ ()

Есть идеи, хочу их попробовать.

ТруАдмин, бери GOLD Parser Builder / ANTLR и не дури людям головы пробуй свои идеи.

PS Не забудь потом удивить рассказать о выхлопе.

d_Artagnan ★★ ()

Посмотреть lua, он маленький, и сделай свой.

frozenix ★★★ ()
Последнее исправление: frozenix (всего исправлений: 1)

в эрланге flex/bison есть встроеный, т.е. из коробки. в с++ есть boost::spirit, но он не особенно сильно лузерфрендли.

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

теоретики со ссылками на автоматы.

Я просто знаю опыт серьезных программистов. Они все начинали с теории, с LL/LR-грамматик, общей топологии, Кнута и прочего. Сейчас в Microsoft что-то пилят.

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

Круто!

Печально это, скорее.
Много, много мозгов утекло в США, в Москву.

В регионах - совсем глухо с образованием.
У нас вот, в городе, собираются три университета-академии объединять в один «ВятГУ». Типа, оптимизация и всё такое ... много людей пойдёт под сокращение.
С одной стороны хорошо - что дармоедов будто бы меньше будет ...
Но с другой - потенциал-то науки сокращается. Меньше народу - меньше талантов.
Да и таланты-то нынче ставятся не там, где надо «производство поднимать». А там, где деньги можно качать.
Начинающие преподаватели и учителя получают копейки - что-то около 4-6 тыс руб в месяц.
Понятно, что ни о каких леворекурсивных грамматиках здесь никто и не слышал.
Максимум - сваять табличку в Excel + прогу на C++ Builder/Delphi.

pacify ★★★★★ ()

Лисп. В нем максимально быстро можно превратить один Лисп в другой Лисп.

vertexua ★★★★☆ ()

а про что-нить более высокоуровневое и лузер-френдли.

Нет такого. Берётся лексер/парсер в виде lex/yacc, parsec и т.п. (то есть библиотеки), код генерируется llvm или проще - printf (!), pretty printer для какого-то языка (haskell, js, си - тоже есть библиотеки), а между этим - куча своих пассов, так что тут проще взять язык попроще и знакомый.

Книжки - http://stackoverflow.com/q/1669/1337941, в частности, Modern Compiler Implementation in ML (С / Java). Примеры - в той же книжке, http://min-caml.sourceforge.net/index-e.html.

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

или проще - printf (!)

Вот этого не понял, что ты имеешь в виду?

true_admin ★★★★★ ()

ммм, кажется я начинаю понимать прелесть лиспа...

true_admin ★★★★★ ()

мда, что-то я переоценил свои скилы. Тему можно закрывать.

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

Вот этого не понял, что ты имеешь в виду?

Это на тему распечатывания target, то есть конечного представления (дерево для AST генерируемого языка, список инструкций - смотря что там), в простейшем случае его можно просто свернуть непосредственно в IO используя функции вроде printf и прочее буферезированное IO (выше по ссылке min-caml так и делает), короче, если просто печатать, то может получиться неплохо и за O(n). Но если сначала отображать target в текстовое представление в памяти, то использование разных операций вроде конкатенации строк (O(n)) может привести к более плохой общей сложности - получится проседание в скорости трансляции. Поэтому делаются разные pretty printerы - string builderы в которых конкатенации & ко работают лениво, а строка собирается в последнюю очередь за что-то около O(n).

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

Ну и, конечно, Java умеет это из коробки :) Haskell с [] - нет.

quasimoto ★★★★ ()

haskell + parsec

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

http://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours (частичный перевод http://ru.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours)

adzeitor ()
Последнее исправление: adzeitor (всего исправлений: 1)
Ответ на: комментарий от pacify

я как слышавший о леворекурсивных грамматиках скажу тебе

ты не различаеш знания как молитву и знание как инструмент.

qulinxao ★★☆ ()

есть.

найм квалифицированных компиляторописателей.

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

посмотри чем сейчас занет Алан Кей ( компактные самоописывающиеся языки)

qulinxao ★★☆ ()
#define begin {
#define end }

Усё, у тебя другой язык.

Miguel ★★★★★ ()

А по синтаксису там чего? Тоже свой? Если не сильно свой, то питонячий exec (с предв. преобразованием строки) + читерство с контекстом выполнения позволяет быстро организовывать некоторые чудеса... ;-)

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

Вот-вот. В свободное время наваял компилятор из паскаля в си (правда, сильно узкоспециализированный), используя хаскелевские parsec и pretty.

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

Он тебе предлагает генерировать сразу исходный текст на каком то другом языке и его конпелироваьт/запускать.

zz ★★★★ ()

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

Не надо LLVM и AST, не понимаю зачем это советуют. Современный, э-э, мейнстрим - синтаксически управляемая трансляция.

Выглядит это все так: лексер (сканер) читает входные символы и пытается в них распознать токены. Обычно это задается регекспами. То есть мы пишем что-то типа такого (у разных сканеров разный синтаксис):

struct   ::= "struct" { return STRUCT; }
function ::= "function"  { return FUNCTION; }
identifier ::= (letter|"_") (letter | digit | "_")* { return ID; }
...

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

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

Если надо по-простому, то просто выполняем код. Например, встретилось правило «+», мы и делаем сложение. Встретилось правило «структура» - парсим ее, получаем имя, поля и добавляем к списку структур.

Если хочется производительности - в этом месте делают байт-код, потом этот байт-код запускают. Или генерируют код на каком-то другом ЯП (С/С++, например)

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

Современный, э-э, мейнстрим - синтаксически управляемая трансляция.

Тормозные интерпретаторы уже давно никто не делает.

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

boost::spirit,

Ты им хоть раз пользовался? Ошибки видел? Эта хрень годится только перед друзьями похвастать.

anonymous ()

Какие новые идеи твой язык может предложить? Нафига он нужен, короче?

anonymous ()

racket. Они там всех себя посвятили тому, чтобы пользователи могли создавать свои язычки, с редактором с под светкой, с дебаггером. Технология проста, твой язык разворачивается в plt схемку и она уже банально джитится, исполняется. http://shmat-razum.blogspot.hu/2011/11/racket.html

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

А приличную контору они не смогли найти? Просто я периодически сталкиваюсь с багрепортами и вообще с «качеством» их софта - это ппц. Одни только проблемы с двубуквенными доменами в IE чего стоят...

Но вот ресёч у них хороший, если там работают, то действительно круто=)

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

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

Когда typed racket станет «нутром», а не «нахлобучкой компилятора» - может это и будет иметь смысл.

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

Если для перформанса, нутром там можно использовать unsafe операции. И можно делать свой язык типизированным.

Чето вот не помню почему я typed отборсил. Вроде на какой-то операции он не умеет double double -> double, ему хочется double double -> real.

asvil ()

Я не про yacc/bison+llvm, а про что-нить более высокоуровневое и лузер-френдли.

Куда уж более? Свой язык — значит свой фронтэнд. А вот на бекэнде можно сэкономить, например взять GCC, LLVM, ну или просто генерировать код на другом языке, а его, в свою очередь, собирать системным компилятором.

Или еще проще — делать не компилятор, а интерпретатор. Для обкатки идей скорее всего и так пойдет.

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

Современный, э-э, мейнстрим - синтаксически управляемая трансляция.

Тормозные интерпретаторы уже давно никто не делает.

А что тогда мейнстрим?

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

А что тогда мейнстрим?

Компиляция в байткод jvm/clr. Просто, удобно, а на выходе эффективно + доступ к плюшкам платформы.

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

Компиляция в байткод jvm/clr

Так я же написал:

Если хочется производительности - в этом месте делают байт-код

Cинтаксически управляемая трансляция - это просто связывание синтаксического анализатора с «действиями». Действия могут быть какими угодно: непосредственное выполнение, генерация кода для выполнения позже, еще что-нибудь

Вариантов особо и нет, строить AST, как предлагали раньше и из него генерировать код оказалось слишком сложно, сейчас вроде бы никто так и не делает

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