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

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

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

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

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

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

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

  2. Я просто сбита с толку.

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

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


person Sam    schedule 20.04.2011    source источник
comment
Это было бы отличным мероприятием. Почему бы вместо этого не использовать интерпретатор, добавить безопасность и использовать существующий язык программирования?   -  person Manny    schedule 20.04.2011
comment
Для безопасности кода мне нужен язык, который компилируется и запускается на виртуальной машине. Как виртуальная машина поможет с безопасностью?   -  person Albireo    schedule 20.04.2011
comment
@ Альбирео, прости его. @Sam Чтобы немного объяснить, вы можете поучиться у Java: он легко декомпилируется, поскольку использует виртуальную машину.   -  person Manny    schedule 20.04.2011
comment
Скажите, если я ошибаюсь! Это просто вывод, который я сделал, и сейчас я немного сбит с толку, хех. Я понимаю, что если я использую интерпретатор и интерпретирую, скажем, C, то любой может просто убежать с любыми файлами, которые я создаю для этой игры (после того, как они интерпретируются в C), и у них будет полезная копия моя игра. Однако, если у меня есть файлы, которые работают только в виртуальной машине / среде выполнения, эти файлы и код будут бесполезны для кого-либо без программного обеспечения.   -  person Sam    schedule 20.04.2011
comment
Ладно, конечно, я понимаю, что сам код будет легко читать ... Но вам будет сложно запустить файл исходного кода Java без виртуальной машины, не так ли? Это скорее то, что я имел в виду под безопасностью, чем просмотр фактического исходного кода.   -  person Sam    schedule 20.04.2011
comment
Сэм, поскольку вам нужно предоставить пользователю виртуальную машину, он может просто вмешаться в виртуальную машину и получить тот же результат. Для обеспечения безопасности вы должны проверять каждое действие, чтобы проверить, законно оно или нет, на стороне сервера, а не на стороне клиента. Кстати, не передавать информацию, которая не нужна клиенту (например, позиции других игроков, если они их не видят) - это еще одна вещь, которую вы должны сделать.   -  person Albireo    schedule 20.04.2011
comment
@Sam: Если ваша игра не будет отличной, никто ее не украдет. Если он отличный, вы сможете позволить себе привлечь экспертов, которые помогут вам усложнить кражу. А если вы просто предложите доступ к игре через веб-сервер, никто не сможет украсть код, если вы не разрешите его загрузить. HTML-страницы, которые отображает ваш код! = Ваш код.   -  person Aaron Digulla    schedule 20.04.2011
comment
Вы пытаетесь достичь безопасности через неизвестность, которая (не если, но когда ) приводит к fsckup. Постройте свою систему таким образом, чтобы даже если пользователь вмешивается в работу клиента, пользователь не сможет получить никакой выгоды.   -  person Albireo    schedule 20.04.2011
comment
Я бы рекомендовал поставить безопасность в саму игру. Поскольку у большинства людей уже есть Интернет, лучший способ, который я могу придумать, - это использовать ключ, который проверен онлайн, и больше сосредоточиться на обеспечении безопасности вашей онлайн-проверки.   -  person Manny    schedule 20.04.2011
comment
Я думаю, что реальный вопрос, который должны задаваться комментарии, заключается в том, что вы хотите от пользовательского языка, чего вы не можете получить от ЛЮБОГО другого существующего языка?   -  person codykochmann    schedule 01.09.2017


Ответы (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 в порядке - доступно множество вариантов генерации кода. Существуют специализированные фреймворки, такие как this, для создания языков со сложной семантикой.

Выбирайте так, как вам нравится. Это легко. Намного проще, чем вы можете себе представить.

person SK-logic    schedule 20.04.2011
comment
Интересный. В настоящее время я часто развиваюсь в мире .net, но для этого, я думаю, сначала проверю LLVM. Я добавлю больше после создания сначала своего языка :) - person QMaster; 09.04.2019
comment
@QMaster, если важны требования к производительности или задержке, вам обязательно нужно сначала взглянуть на LLVM - даже до того, как рассматривать создание C.Если вам нужны включенные батареи (например, GC), .net или jvm будет немного легче иметь дело. - person SK-logic; 10.04.2019
comment
Я работаю с Delphi и .net годами и продолжаю заниматься по сей день. Для меня важны именно производительность, понятное кодирование, управляемость и кроссплатформенность. На втором уровне я посмотрю на GC и т. Д. Спасибо за ваши гайды. - person QMaster; 11.04.2019

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

person Guy    schedule 20.04.2011

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

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

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

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

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

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

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

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

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

person Aaron Digulla    schedule 20.04.2011
comment
Типичные студенты CS могут взяться за компиляцию после однонедельного вводного курса. В этом буквально ничего нет сложного. Некоторые сложные вещи могут возникнуть, если вы выполните действительно жесткую оптимизацию или реализуете языки с необычной семантикой. Все остальное - просто товар. Нет необходимости реализовывать собственный сборщик мусора, собственную стандартную библиотеку, думать о реализации FFI и т. Д. Все это доступно бесплатно. Вам просто нужно объединить существующее. - person SK-logic; 20.04.2011
comment
Буквально ничего сложного в том же смысле, что и исчисление. Если вы изучите его, детали станут ясны. Большинство людей этого не сделали, поэтому подробностей нет. Да, там валяется куча оборудования, часть бесплатного, часть коммерческого. Но знание того, как спроектировать хороший язык, зависит только от знания того, как реализовать его. А знание того, как сделать хорошую реализацию, - это не то, что может сделать выпускник CS с 1 неделей Ахо / Уллмана. Прости. - person Ira Baxter; 20.04.2011
comment
Если OP хочет сделать это для развлечения, ничего страшного. Он должен знать, что потребуются огромные усилия, чтобы получить что-то, что может запускать то, что другие люди сочтут настоящей программой. - person Ira Baxter; 20.04.2011
comment
3 года кажутся немного преувеличенными. Мне удалось создать язык JVM с множеством функций (пользовательские операторы, лямбда-выражения, сопоставление с образцом и т. Д.) Менее чем за год самостоятельно, пока я ходил в школу. Так что создание компилятора не составляет большого труда (даже если вы не используете какие-либо фреймворки, кроме ASM). - person Clashsoft; 02.04.2015
comment
@Clashsoft: Сколько людей используют ваш язык? У тебя есть хороший отладчик? Сколько частей вашего языка могло бы быть лучше или что бы вы сделали по-другому, если бы начали заново? Я разработал много простых языков, потом многие люди начали их использовать, и возникли всевозможные удивительные проблемы. Я стою 3 года для настоящего языка уровня Java / Python / C #, которым пользуются тысячи людей по всему миру. - person Aaron Digulla; 06.04.2015
comment
Я никогда не заявлял, что он закончен, только то, что в настоящее время он имеет много полезных функций :). github.com/Clashsoft/Dyvil - person Clashsoft; 06.04.2015

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

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

person Some programmer dude    schedule 15.11.2011

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

person kallisti    schedule 22.12.2011

Насколько я понимаю, вы хотите знать, как разработать свой собственный язык программирования.

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

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

person Warmaster_Prime    schedule 01.09.2017