Как разработать и реализовать язык программирования? [закрытый]
Этот вопрос связан с
Последние пару лет я думал о том, что мне нравится и не нравится в языках, которые я использую. Я всегда хотел писать на своем языке, но так и не сделал этого.Я также владею Lego RCX и NXT, но большую часть времени я никогда не заставляю своих роботов делать что-либо из-за их ограниченного визуального программирования окружающая среда.
Я думаю, что разработаю свой язык программирования для NXT, потому что уже есть тонны языков общего назначения, и NXT дает мне конкретный набор проблем и целей и, надеюсь, хорошую песочницу, чтобы играть.
Что теперь? С чего мне начать? Что мне нужно знать?
Если возможно, я бы написал компилятор на Python или Clojure. СуществуетSDK для NXT , но также и язык ассемблера . Что было бы лучше/проще всего маршрут?
Lego NXT имеет небольшой экран, USB и Bluetooth, он имеет 4 сенсорных порта, как цифровых, так и аналоговых, 3 выходных порта и 2 ARM-процессора, один главный процессор и один сопроцессор. http://mindstormsnxt.blogspot.com/2006/08/whats-inside-nxt-brick.htmlПрограммирование NXT связано с обработкой данных и событий, поэтому какой-то моноиконический стиль потока данных/реактивного стиля кажется подходящим. Он также должен хорошо справляться с параллельными задачами, поэтому я думаю, что он функциональный. В настоящее время я думаю о стеке, основанном также.
В моей голове я уже пытаюсь объединить эти понятия и подумать о примере кода. Я имею в виду дерево, а не стек, где функциональные ветви могут работать параллельно. Пример:
# implicit main stack
5 5 +
# 10
# quoted branch or list
[1 -]
# 10 [1 -]
# eval list and recur until false
loop
# [9 8 7 6 5 4 3 2 1 0]
# define stack as a function
[1 = [1 8 motor] [1 0 motor] if] fn
# [9 8 7 6 5 4 3 2 1 0] <function>
# define function as a symbol
"handle-press" def
# [9 8 7 6 5 4 3 2 1 0]
# reactively loop over infinite lazy stack returned by sensor
# in a parallel branch
|4 sensor handle-press for|
# [9 8 7 6 5 4 3 2 1 0] [8 nil nil nil 8 ...]
Очевидно, что в рассуждениях, стоящих за этим, все еще есть зияющие дыры, но я все равно публикую этот грубый набросок, чтобы вызвать некоторые полезные ответы и обсуждение.4 ответа:
Начните с изучения большего количества языков программирования. После изучения нескольких языков купите книгу о компиляторах. Есть много. Google поможет. Не имеет значения, какой из них вы покупаете. Вам понадобится несколько штук. Это нормально-читать много книг. После того, как вы изучили языки и прочитали о компиляторах, сделайте следующее.Что теперь? С чего мне начать? Что мне нужно знать?
Создайте необходимые библиотеки времени выполнения. Реализуйте их в некоторых подходящий язык, как C или Python или что-то еще.
После того, как у вас есть библиотеки времени выполнения, которые действительно работают. действительно полностью работают. Полностью. Вы можете подумать о синтаксисе и лексическом сканировании и компиляции. Это трудные задачи, но и вполовину не такие трудные, как заставить работать библиотеки времени выполнения.
Дурачиться с синтаксисом (то есть с доменным языком) - привлекательная неприятность. Многие люди "улучшили" синтаксис, но не используют время выполнения библиотеки. Так что их "язык" является неполным, поскольку он не делать ничего.
Сначала Заставьте свой язык что-то сделать.
Не бойтесь писать компилятор, который компилируется на существующий язык, а не на объектный код. Например, Lightweight C++ - это компилятор C++ - > C, основанный на этой идее (хотя где-то C++ выполняет ту же работу): http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414
Если у вас есть небольшая, но умная идея о том, как улучшить программирование, это быстрый способ выиграть.
Аналогичная ситуация и с поисковыми системами. Если я скажу, что я могу сделать лучше, чем Google, возможно, я смогу сделать это с помощью Google mashup, который реорганизует набор результатов Google, и мне не нужно покупать 343 Зигабайта памяти, чтобы настроить второй Google только для изменения количества результатов с 10 до 15. (К сожалению, это не работает, если у меня есть другой рейтинг или ползающие идеи.)
Возможно, Twitter-лучший пример. Напишите свой собственный Twitter с помощью Twitter API. (Конечно, только если ваша идея вписывается в базовую модель Twitter.)
Сейчас мы работаем над движок потока данных (см. Wikipedia: flow-based programming, dataflow programming). Мы разработали очень легкий новый язык, который имеет 3 типа команд (создание компонентов, настройка параметров, объявление сообщений) и 2 типа блоков (объявление и реализация компонентов). Он компилируется в код C++, поэтому компилятор прост, а результат оптимален быстро. Кроме того, есть несколько случаев, когда наш языковой скрипт генерируется из конфигураций, или, что более элегантно, он поддерживает метапрограммирование.
Мы должны разорвать языки компилирования 1-step (source->executable) и 0-step (source script is the executable); 3-4 - й уровень еще прост для обзора, и - если мы сделаем это правильно-это может сделать разработку более эффективной.
Самый простой путь-это использование конкатенативного языка программирования , например Forth, Фактор, или ваша собственная конструкция одного.
Четвертый интерпретатор очень прост в реализации и не должен занимать больше нескольких КБ; это важно для устройства Lego. Вам нужно понять, как работает четвертый переводчик. Это рассматривается, например, в главе 9из , начиная с.
Читайте веселые книги о языковом дизайне!
Автор книги "Clojure" рекомендовал следовать книге Кристиана Квиннека" lisp in small Pieces". Список чтенияClojure охватывает множество книг, которые включали в себя дизайн языка Clojure.