LINUX.ORG.RU

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

 ,


3

2

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

★★★★★

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

racket. Они там всех себя посвятили тому, чтобы пользователи могли создавать свои язычки

лучше взять решение под JVM (уже оказывается и не только JVM):

http://www.jetbrains.com/mps/

а еще лучше сделать фронтэнд к llvm

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

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

ORLY?

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

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

O_O

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

Чем лучше?

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

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

На самом деле это просто. На yacc пишется описание грамматики которео даст тебе на выходе синтаксическое дерево. В интернете можно найти готовую грамматику для языка Си например.

Синтаксическое дерево это структура данных напоминающая лисп ;) Т.е 2 * 3 + 6 выглядит как (+ (* 2, 3), 6) - перевый элемент списка представлет собой функцию каторая принимает список аргументов.

Это дерево уже можно исполнять - начиная с вершины рекурсивно заменяешь все аргументы на значения функций. В моем примере, напрмиер последовательность вызовов будет выглядеть как-то так -f_add(_mul(2,3), 6)

Тут возникнут вопросы с реализацией циклов ;)

Ну для начала эттого хватит. Если в функциях f_add и f_mul не делать сложение-умножение, а напечатать «байт код» соотвествующей операции, то ты получишь скомпилированную программу которую можно исполнять.

Стековая машина для этого кода совсем просто пишется. Если что - спрашивай ;)

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

Да, то как будет выглядеть синтаксическое дерево ты определяешь сам ( полсностью сам определяешь структуру данных) . На этом этапе можно разворачивать «синтаксический сахар», т.е по сути преобразовывать «реальное дерево» в другое.

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

Ага, я прочитал «Design of CPython’s Compiler». У них же раньше проще было? Зачем эта жесть с AST?

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

PHP вон без AST обходится, и ничего

Deleted
()

Тред не читал. Forth уже предлагали?

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

Я например ввел свои скобки (% %), {% %}, [% %], |% %|, <% %>.

В общем легко вводится любая конструкция, с синтаксисом кардинально отличающимся от питона - потом просто она меняется на какую нить питонячью ф-ю;-)

AIv ★★★★★
()

Не припомню другого языка, чтобы так быстро можно было добраться до его спецификации: golang -> References -> The Go Programming Language Specification. (Хотя, может быть, меня сейчас поправят. Тогда было бы неплохо собрать список ссылок в шапке и посмотреть, где лаконичней.)

Вот можно обдумать подобные пункты для своего языка.

gag ★★★★★
()

я за yacc. у нас на кафедре даже лабораторки были такие ;)

aol ★★★★★
()

двачую сообщения про racket.

там это делается весьма просто.

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

Например, Objective-C представлял (представляет?) собой препроцессор для Pure C.

LongLiveUbuntu ★★★★★
()

Если ли, скажем, какие-то тулкиты для эээ автоматизации этого?

Есть. Для того, чтобы скачать тулкит, заполните форму.

anonymous
()

Не понимаю, в чём проблема?

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

anonymous
()

Можно написать набор команд для Tcl (в т.ч. расширяющие язык). Хороший пример - expect. Освоить пользователю особенности синтаксиса tcl не сложнее, чем sh.

gv
()

тред не читал
antlr3 очень удобная библиотека, позволяет писать на яве / питоне / сях и ещё на чемто. там простой язык для описания граматик и есть даже кое-какая IDE. Если будет нужно, могу помочь

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

Что-то ты херню несешь. И scala и f# и nemerle и python с ruby, да и вообще любой язык с доступной реализацией так делает.

Собственно, что предлагается взамен?

anonymous
()

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

LISP тебе поможет.

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

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

Анон, братело, я уже покаялся, несу херню, AST используют везде, это опять модно и трендово. Но во имя справедливости: python начал их использовать начиная с версии 2.5, ruby и php не используют до сих пор.

В небольших парсерах, типа SQL (по крайней мере MySQL, SQLite и PostgreSQL) или PL/pgSQL их тоже не используют.

AST в классическом виде легко построить, но что с ним делать дальше? Оптимизировать? И сколько ты выиграешь на этом? Проще в один проход нагенерировать байт-код и отдать его VM, пусть она оптимизирует, не факт что у тебя получится лучше. Упростится написание интерпретатора? Но добавится как минимум генерация и последующий разбор AST.

Собственно, что предлагается взамен?

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

Для написания нового простого языка использовать сразу AST это как-то слишком инновационно. Их же часто используют для галочки, типа вот мы потенциально можем тут наоптимизировать, так учат на спецкурсах по CS, и вообще кто без AST тот несет херню.

И если язык простой, а AST нужно только для каких-то внешних утилит, ну можно где-то сбоку сделать его генератор

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

во имя справедливости: python начал их использовать начиная с версии 2.5

Ты точно не в себе. AST использовался как минимум в 1.5, и я уверен, что компиляция Python с самого начала была через AST.

AST в классическом виде легко построить, но что с ним делать дальше? Оптимизировать?

Анализировать.

Проще в один проход нагенерировать байт-код и отдать его VM, пусть она оптимизирует

Начинает брезжить тусклый свет понимания... ты похапешник? жабщик?

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

AST использовался как минимум в 1.5, и я уверен, что компиляция Python с самого начала была через AST.

Вот тут врут что AST в интерпретаторе используют «Starting with Python 2.5»:

http://docs.python.org/devguide/compiler.html

Анализировать

Снаружи? Ну я же написал:

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

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

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

Вот тут врут что AST в интерпретаторе используют «Starting with Python 2.5»:

«Parse the source code into a parse tree» - parse tree еще называется CST, Concrete Syntax Tree, и принципиально не отличается от AST.

И http://docs.python.org/release/1.5/lib/node41.html#SECTION0041300000000000000000

Анализировать

Снаружи?

Что значит «снаружи»? Анализ (и последующая трансформация) AST - одна из стадий любого серьезного компилятора.

Ну я показываю, что даже здоровенные проекты кладут на эти каноны

А можно еще раз список этих проектов?

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

«Parse the source code into a parse tree» - parse tree еще называется CST, Concrete Syntax Tree, и принципиально не отличается от AST.

Зачем эти верчения? Вот же они пишут: «2. Transform parse tree into an Abstract Syntax Tree (Python/ast.c)». То есть авторы «Design of CPython’s Compiler» все-таки различают parse tree и AST.

Что значит «снаружи»?

(устало) это значит что мы из внешней утилиты отдаем интерпретатору кусок кода, а потом просим его отдать AST этого куска. При этом в интерпретации AST может не использоваться, его (AST) можно построить из того же CST.

Анализ (и последующая трансформация) AST - одна из стадий любого серьезного компилятора

Какая конечная цель этого анализа и трансформации? Оптимизация? Я же написал:

И сколько ты выиграешь на этом? Проще в один проход нагенерировать байт-код и отдать его VM, пусть она оптимизирует, не факт что у тебя получится лучше

А можно еще раз список этих проектов?

Можно, почему же нельзя. Мне же делать нечего, можно и по 3 раза одно и то же писать.

python начал их использовать начиная с версии 2.5, ruby и php не используют до сих пор.

В небольших парсерах, типа SQL (по крайней мере MySQL, SQLite и PostgreSQL) или PL/pgSQL их тоже не используют.

Да, в интерпретаторе перла тоже AST не видно. Но я бегло посмотрел, может быть и не увидел.

Давай определимся с целью этого, м-м, спора. Человек спрашивает о том как написать свой язык программирования. Я пишу что это можно сделать без LLVM, AST и прочих страшных слов. У меня было устойчивое мнение что AST используются все реже, какое-то время назад это было трендом - оптимизировать в CST, в промежуточном байт-коде или тупо отдавать в VM/JIT, пусть оно там думает. Да судя по тому что пишут сейчас, для многих языков это так и осталось - минимум оптимизаций, все просто. Ну хорошо, питон и другие языки обросли (или изначально были с) AST и оптимизаторами в нем, здорово.

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

Давай я солью, ты прав, идеальный интерпретатор нужно писать сразу с генерацией AST, оптимизацией и т.п.

Deleted
()

Писал небольшой пакетный языг конвеерной обработки изображений как интерфейс к MagickWand. Полноценным ЯП его не назовёшь (ибо тьюринг-полноты там нет и быть не может), но с задачей справляется.

Зы. поэтому первое, что пришло в голову - сделай свой мод брейнфака с MMIO.

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

Вот же они пишут: «2. Transform parse tree into an Abstract Syntax Tree (Python/ast.c)». То есть авторы «Design of CPython’s Compiler» все-таки различают parse tree и AST.

Они да, но многие используют термины parse tree и AST как взаимозаменяемые. Я признаю, что AST в ранних Питонах нет, но вместо них там другое, близкое внутреннее представление - CST.

python начал их использовать начиная с версии 2.5,

Об этом уже поговорили...

ruby и php не используют до сих пор.

PHP был написан ПТУшником на коленке, а Ruby до 1.9 использовал AST-based интерпретатор, так что AST там точно есть.

http://blog.grayproductions.net/articles/the_ruby_vm_episode_i

«Old interpreter (matzruby) *traverses* abstract syntax tree (AST) naively.»

Да, и трансляторы Python, Ruby, PHP уж точно не «здоровенные проекты».

Давай я солью, ты прав, идеальный интерпретатор нужно писать сразу с генерацией AST, оптимизацией и т.п.

Непонятно, причем тут интерпретаторы, но как знаешь.

tailgunner ★★★★★
()

Styx - простая и удобная альтернатива связки lex/yacc

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

Я пишу что это можно сделать без LLVM, AST и прочих страшных слов.

ммм, можно, но я решил попробовать llvm и AST :). Если хоть немного получится освоить llvm то примусь городить ast-парсер. Благо, ссылок хватает.

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

Реализуй свои идеи в рамках существующего языка

Не видел вменяемого гибрида ООП и функциональщины. Собстно, ты же понимаешь что 99% что я зафейлю. Но я попытаюсь для успокоения души.

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

а, на вопрос не ответил. Слишком много костылей потребуется чтобы прокачать питон. Поэтому хочу перебраться на руби. Но всё же хочется попробовать свои силы.

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

Не видел вменяемого гибрида ООП и функциональщины.

Еще раз: попробуй сделать это средствами языка, который тебе нравится. В случае успеха получится полезная для кучи народа бибилотека, а не еще один никому не нужный $languagename

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

AST в ранних Питонах нет

Опять же, во имя справедливости - Питон появился и жил без использования AST с 1991 по 2006 год, 15 лет

Ruby до 1.9 использовал AST-based интерпретатор

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

«Old interpreter (matzruby) *traverses* abstract syntax tree (AST) naively.»

Там же дальше самая мякотка:

«Obviously it's slow. YARV compile that AST to YARV bytecode and run it.»

То есть они сделали генерацию в AST(или что там у них), а байткод асилели только после 1.9. Ну и зачем им нужен был этот ST, они же его наверняка и не оптимизировали, прямо вот по сгенерированному и выполняли?

Непонятно, причем тут интерпретаторы

Мы же все еще о том как проще написать свой новый язык? ТС не рассказал деталей, но с большой вероятностью его можно сделать (или прототипировать) интерпретатором

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

Если хоть немного получится освоить llvm то примусь городить ast-парсер. Благо, ссылок хватает.

Многие статьи по этому поводу - это такие рассуждения диванных теоретиков. Если нужно просто и быстро сделать прототип, можно смело все что связано с оптимизацией и какими-то красотами кода пропускать. С другой стороны, если хочется еще и прокачать LLVM скилл и помучиться с оптимизацией на AST - ну да, наверное, надо идти сложным путем

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

Питон появился и жил без использования AST с 1991 по 2006 год, 15 лет

Да. У него был CST, а это отнюдь не однопроходный компилятор (aka syntax-directed translation).

То есть они сделали генерацию в AST(или что там у них)

Именно - они ее сделали. Причем сделали давно.

Ну я глазами и грепом посмотрел trunk, там нет слова ast

  node.c - ruby node tree

AST это или CST - лень разбираться, но больше похоже именно на AST.

Непонятно, причем тут интерпретаторы

Мы же все еще о том как проще написать свой новый язык?

AST не имеет отношения к интерпретации. Если ТС хочет статическую типизацию (сильно подозреваю, что он хочет), ему нужно представление гораздо более высокого уровня, чем байткод. ПМСМ, AST ему вполне подойдет.

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

Если хоть немного получится освоить llvm то примусь городить ast-парсер. Благо, ссылок хватает.

«Удачи» (ц) Заложница

Слишком много костылей потребуется чтобы прокачать питон. Поэтому хочу перебраться на руби

O_o

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

Не видел вменяемого гибрида ООП и функциональщины.

Scala?

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