Пользовательский язык программирования: как? - PullRequest
9 голосов
/ 20 апреля 2011

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

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

Немного предыстории: мы надеемся, что созданный язык будет использован для реализации многопользовательского текстового MUD-сервера. Следовательно, для этого требуется простая встроенная функциональность для создания / поддержки клиентских TCP / IP-соединений, неблокирующего ввода-вывода, доступа к базе данных через SQL или аналогичного. Я также заинтересован в безопасности, поскольку не хочу, чтобы код, написанный для этого языка, мог быть украден и использован широкой публикой без специального программного обеспечения. Это, вероятно, означает, что он должен компилироваться в объектный код

Итак, каковы мои лучшие варианты создания языка, который соответствует этим спецификациям

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

  1. Для безопасности кода мне нужен язык, который компилируется и запускается на виртуальной машине. Если я сделаю это, у меня будет чертовски много работы, не так ли? Напишите виртуальную машину, язык ассемблера на низкоуровневом, а затем на высокоуровневом уровне, библиотеки кода для работы с IO, сокетами и т. Д., А не с использованием существующих модулей?

  2. Я просто в замешательстве.

  3. Я не уверен, правильно ли я понимаю.

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

Ответы [ 6 ]

10 голосов
/ 20 апреля 2011

Разработка пользовательского предметно-ориентированного языка программирования - правильный подход к проблеме. На самом деле, почти все проблемы лучше решать с помощью DSL. Условия, которые вы, вероятно, хотели бы Google: domain specific languages и language-oriented programming.

Кто-то скажет, что разработка и реализация компилятора - сложная задача. Это совсем не так. Реализация компиляторов - тривиальная вещь. Доступно множество высококачественных компиляторов, и все, что вам нужно сделать, это определить простое преобразование из вашего собственного языка в другой или в комбинацию других языков. Вам понадобится парсер - в наше время это не так уж и страшно, с Antlr и тоннами самодельных PEG-генераторов. Вам нужно что-то, чтобы определить семантику вашего языка - современные языки функционального программирования сияют в этой области, все, что вам нужно, это что-то с поддержкой ADT и сопоставлением с образцом. Вам нужна целевая платформа. Существует множество возможностей: JVM и .NET, C, C ++, LLVM, Common Lisp, Scheme, Python и все остальное, что сделано из текстовых строк.

Есть готовые фреймворки для создания ваших собственных языков. Буквально любая реализация Common Lisp или Scheme может быть использована в качестве такой платформы. У LLVM есть все, что вам нужно. .NET toolbox в порядке - есть много вариантов генерации кода. Существуют специализированные фреймворки, такие как эта для построения языков со сложной семантикой.

Выбирай как хочешь. Это легко. Гораздо проще, чем вы можете себе представить.

3 голосов
/ 20 апреля 2011

Поскольку вы мало что знаете о компиляторах и создании компьютерных языков: не надо.В мире около пяти человек, которые хороши в этом.

Если вы все еще хотите попробовать: Создание хорошего языка общего назначения занимает не менее 3 лет.На постоянной основе.Это огромное обязательство.

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

Вот два варианта:

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

  2. Java.С новой Xtext framework вы можете создавать свои собственные языки за пару минут.Это не значит, что вы можете создать хороший язык за несколько минут.Просто a язык.

Python поставляется с большим количеством библиотек, но если вам нужно что-то еще, воздух быстро истощается.С другой стороны, вы можете написать много хорошего и надежного кода за короткое время.Одна строка Python обычно равна 10 строкам Java.

Java не имеет много излишеств, но есть буквально миллионы фреймворков, которые делают все, что вы можете изобразить ... и многовещей, которые вы не можете.

Это говорит: зачем ограничиваться одним языком?С Jython вы можете запускать исходный код Python на виртуальной машине Java.Таким образом, вы можете написать ядро ​​(веб-сервер, SQL и т. Д.) На Java, а гибкие части пользовательского интерфейса, приключения и прочее - на Python.

3 голосов
/ 20 апреля 2011

Написание собственного языка и цепочки инструментов для решения стандартной проблемы звучит как неправильный путь.В итоге вы разработаете еще один язык, а не будете писать свой MUD.

Многие разработчики игр используют подход сценариев для описания своего игрового мира, например: http://www.gamasutra.com/view/feature/1570/reflections_on_building_three_.php

Также см .: https://stackoverflow.com/questions/356160/which-game-scripting-language-is-better-to-use-lua-or-python для использования существующих языков (Pythong и LUA) в этом случае для внутриигровых сценариев.

2 голосов
/ 15 ноября 2011

Если вы действительно хотите создать свой собственный маленький язык, более простое и зачастую более быстрое решение состоит в том, чтобы взглянуть на такие инструменты, как lex и yacc и аналогичные системы ( ANTLR - это популярная альтернатива), и затем вы можете сгенерировать код либо для существующей виртуальной машины, либо сделать простую самостоятельно.

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

0 голосов
/ 01 сентября 2017

Из того, что я могу понять из этого, вы хотите знать, как разрабатывать свой собственный язык программирования.

Если это так, вы можете сделать это различными способами.Я только что закончил свою собственную пару минут назад, и я использовал HTML и Javascript (и DOM), чтобы разработать свою собственную.Я использовал много x.split и x.indexOf («код здесь»)! = - 1, чтобы сделать это ... У меня не так много времени, чтобы привести пример, но если вы используете W3schools и ищите «indexOf»и «расколоть», я уверен, что вы найдете то, что вам может понадобиться.Я действительно хотел бы показать вам, что я сделал и прошёл код ниже, но я не могу из-за возможной кражи и требования моей работы.

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

0 голосов
/ 22 декабря 2011

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

...