Пользовательский язык программирования: как?

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

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

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

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

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

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

  2. Я просто смущен.

  3. Я не уверен, что понимаю.

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

6 ответов

Решение

Разработка пользовательского предметно-ориентированного языка программирования - правильный подход к проблеме. На самом деле, почти все проблемы лучше решать с помощью 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-инструментарий в порядке - есть много вариантов генерации кода. Существуют специализированные фреймворки, подобные этой, для построения языков со сложной семантикой.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам