Подтвердить что ты не робот

Как я проектирую и внедряю язык программирования?

Этот вопрос связан с

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

Я также владею как 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 ...]

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

4b9b3361

Ответ 1

Теперь что? С чего начать? Что мне нужно знать?

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

Изучив несколько языков, купите книгу о компиляторах. Здесь очень много. Google поможет. Неважно, какой из них вы покупаете. Вам понадобятся несколько. Хорошо читать много книг.

Как только вы изучите языки и прочитаете компиляторы, сделайте следующее.

  • Создайте необходимые библиотеки времени выполнения. Реализуйте их на подходящем языке, таком как C или Python, или что-то еще.

  • Как только у вас есть библиотеки времени выполнения, которые действительно работают. Действительно полностью работает. Полностью. Вы можете подумать о синтаксисе и лексическом сканировании и компиляции. Это тяжелые проблемы, но не вдвое сложнее, чем работать с вашими библиотеками времени выполнения.

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

Получите свой язык, чтобы сделать что-то в первую очередь.

Ответ 2

Не бойтесь писать компилятор, который компилируется на существующий язык, а не на объектный код. Например, Lightweight С++ - это компилятор С++ → C, основанный на этой идее (по крайней мере, С++ выполняет ту же работу где-то): http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

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

Там похожая ситуация с поисковыми системами. Если я скажу, что я могу сделать лучше, чем Google, возможно, я смогу сделать это с помощью Google mashup, который реорганизует набор результатов Google, и мне не нужно покупать 343 Zigabytes хранилища, чтобы настроить второй Google только для изменения количество результатов от 10 до 15. (К сожалению, это не работает, если у меня разные оценки или обходные идеи.)

Может быть, Twitter - лучший пример. Напишите свой Twitter, используя API Twitter. (Конечно, только если ваша идея вписывается в базовую модель Twitter.)

Теперь мы работаем над механизмом обработки данных (см. Википедию: потоковое программирование, программирование потока данных). Мы разработали очень легкий новый язык, который имеет 3 типа команд (создание компонентов, настройка параметров, объявление сообщений) и 2 типа блоков (декларация и реализация компонентов). Он скомпилирован для кода на С++, поэтому компилятор прост, и результат является оптимальным быстро. Кроме того, существует несколько случаев, когда наш язык script генерируется из конфигураций или, более элегантный, поддерживает метапрограммирование.

Мы должны разорвать 1-ступенчатый (исходный- > исполняемый) и 0-шаг (исходный язык script является исполняемым) языки компиляции; 3-4 уровень прост, но для обзора, и - если мы сделаем это правильно - это может сделать развитие более эффективным.

Ответ 3

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

Интерпретатор Forth очень прост в реализации и не должен занимать больше нескольких килобайт; важно для устройства Lego. Вам нужно понять, как работает интерпретатор Forth. Это описано, например, в глава 9 Запуск Forth.

Ответ 4

Прочитайте книги fun о дизайне языка!

автор Clojure рекомендовал Кристиан Квиннек в соответствии с книгой "lisp в маленьких пьесах". Clojure Список чтения охватывает многие книги, которые влияют на дизайн языка Clojure.