Jak zaprojektować i wdrożyć język programowania? [zamknięte]

To pytanie jest związane z

Przez ostatnie kilka lat myślałem o rzeczach, które lubię, a których nie lubię w językach, których używam. Zawsze chciałem pisać w swoim języku, ale nigdy tego nie robiłem.

Posiadam również Lego RCX i NXT, ale przez większość czasu nigdy nie zmuszam moich robotów do robienia czegokolwiek ze względu na ich restrykcyjne programowanie wizualne środowisk.

Myślę, że zaprojektuję mój język programowania dla NXT, ponieważ istnieje już mnóstwo języków ogólnego przeznaczenia, a NXT daje mi konkretny zestaw problemów i celów i mam nadzieję, że fajny sandbox do zabawy.

Co teraz? Od czego zacząć? Co muszę wiedzieć?

Jeśli to możliwe, napisałbym kompilator w Pythonie lub Clojure. Istnieje SDK dla NXT, ale także język Asemblacji . Co byłoby najlepsze/najłatwiejsze trasa?

[1]}Lego NXT ma mały ekran, USB i Bluetooth, posiada 4 porty czujników cyfrowych i analogowych, 3 porty wyjściowe i 2 procesory ARM, jeden główny procesor i jeden współpro-procesor. http://mindstormsnxt.blogspot.com/2006/08/whats-inside-nxt-brick.html

Programowanie NXT będzie dotyczyło obsługi danych i zdarzeń, więc jakiś monoikoniczny styl przepływu danych/reakcji wydaje się odpowiedni. Powinien również dobrze obsługiwać równoległe zadania, więc myślę, że funkcjonalne. Obecnie myślę również o stosie.

W mojej głowie już próbuję ujednolicić te pojęcia i myśleć o przykładowym kodzie. Myślę raczej o drzewie niż o stosie, gdzie funkcjonalne gałęzie mogą działać równolegle. Przykład:

# 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 ...]

Oczywiście nadal są dziury w rozumowaniu, ale i tak zamieszczam ten szkic, aby wywołać pomocne odpowiedzi i dyskusję.

Author: Community, 2010-10-25

4 answers

Co teraz? Od czego zacząć? Co muszę wiedzieć?

Zacznij od nauki języków programowania.

Po nauczeniu się kilku języków, Kup książkę o kompilatorach. Jest ich wielu. Google pomoże. Nieważne, który kupisz. Będziesz potrzebował kilku. Można czytać wiele książek.

Gdy nauczysz się języków i przeczytasz Kompilatory, wykonaj następujące czynności.

  1. Zbuduj biblioteki czasu pracy, których potrzebujesz. Wdrożyć je w niektórych odpowiedni język jak C lub Python lub cokolwiek innego.

  2. Po uruchomieniu bibliotek, które naprawdę działają. Naprawdę działa. Całkowicie. Możesz myśleć o składni i leksykalnym skanowaniu i kompilowaniu. To są trudne problemy, ale nie w połowie tak trudne, jak uruchomienie bibliotek w czasie rzeczywistym.

Wygłupianie się ze składnią (tzn. językiem specyficznym dla danej domeny) jest atrakcyjnym uciążliwością. Wiele osób ma" ulepszoną " składnię, ale nie ma użytecznego czasu uruchamiania biblioteki. Więc ich "język" jest niekompletny, ponieważ nie robi[17]}niczego.

Naucz się najpierw czegoś języka.

 22
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 12:07:35

Nie bój się pisać kompilatora, który kompiluje do istniejącego języka, a nie do kodu obiektowego. Na przykład, Lightweight C++ to kompilator C++ -> C oparty jest na tym pomyśle (poza tym C++ wykonuje gdzieś to samo zadanie): http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

Jeśli masz mały, ale mądry pomysł, jak poprawić programowanie, jest to szybki sposób na wygraną.

Jest podobna sytuacja z wyszukiwarkami. Jeśli powiem, że mogę zrobić coś lepszego niż Google, może uda mi się to zrobić z Google mashup, który reorganizuje zestaw wyników Google, i nie muszę kupować 343 Zygabajtów pamięci, aby skonfigurować drugiego Google tylko po to, aby zmienić liczbę wyników z 10 na 15. (Niestety, to nie działa, jeśli mam inny ranking lub raczkowanie pomysłów.)

Może Twitter jest lepszym przykładem. Napisz swój własny Twitter za pomocą Twitter API. (Oczywiście tylko wtedy, gdy twój pomysł pasuje do podstawowego modelu Twittera.)

Obecnie pracujemy nad silnik przepływu danych (patrz Wikipedia: programowanie flow-based, programowanie dataflow). Opracowaliśmy bardzo lekki nowy język, który ma 3 typy instrukcji (tworzenie komponentów, ustawianie parametrów, deklaracja wiadomości) i 2 typy bloków (deklaracja komponentów i implementacja). Jest skompilowany do kodu C++, więc kompilator jest prosty, a wynik jest optymalny szybko. Jest też kilka przypadków, gdy nasz skrypt językowy jest generowany z konfiguracji lub, bardziej elegancko, obsługuje metaprogramowanie.

Powinniśmy zerwać języki 1-step (source->executable) i 0-step (skrypt źródłowy jest wykonywalny) ; poziom 3-4 jest łatwy do przejrzenia i-jeśli zrobimy to dobrze - może sprawić, że rozwój będzie bardziej efektywny.

 5
Author: ern0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 22:42:22

Najprostszą drogą jest użycie konkatenatywnego języka programowania , Jak Forth, Factor , czyli Twój własny projekt.

Interpreter Forth jest bardzo łatwy w implementacji i nie musi zajmować więcej niż kilka KB; ważne dla urządzenia Lego. Musisz zrozumieć, jak działa Tłumacz Forth. Jest to omówione, na przykład, w Rozdział 9 z począwszy od.

 4
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 19:33:39

Przeczytaj Zabawne książki o projektowaniu języka!

Autor Clojure polecił książkę" lisp in small Pieces " Christiana Queinneca. Lista lektur Clojure obejmuje wiele książek, które zawierają projekt języka Clojure.

 4
Author: Arthur Ulfeldt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 18:42:15