Wątek przeniesiony 2020-05-05 13:49 z Inżynieria oprogramowania przez Shalom.

Mercury - mój projekt nowego języka programowania

6

Ostatnio rozpocząłem prace nad całkiem nowym językiem programowania, o nazwie Mercury. Program Hello, world. jest w już stanie działać na aktualnej wersji interpretatora, i wygląda on następująco:

ECHO Hello, world.

Stałych, używa się w ten sposób:

CONST X IS 10
ECHO X=%X

Zmienne wypisuje się trochę inaczej:

SET Y TO 20
ECHO Y=$Y

Komentarze wyglądają dokładnie tak jak w Pythonie:

#a comment

Jest jeszcze komenda zatrzymująca program:

STOP

Operacje matematyczne:

SET A TO 1
CONST B IS 7
ADD 30 TO A
SUBTRACT %B FROM A
MULTIPLE A BY 8
DIVIDE A BY 4

Instrukcje warunkowe:

CONST A IS 4
IF %A EQU 4
ECHO Okay.
ENDI

Pętle:

REPEAT 5
ECHO ....5 times...
ENDR
#albo:
WHILE $N NEQ 5
ECHO only one time
SET N TO 5
ENDW

Inkrementacja/dekrementacja:
screenshot-20200507103747.png

Nowy przykład współdziałania aktualnych instrukcji:

REPEAT 10
 SET X TO $.
 #zmienna $. jest licznikiem pętli
 INC X
 ECHO $X
 IF $X EQU 5
  #dostępne są jeszcze NEQ, LSS, GTR, LEQ, GEQ i NOT (negacja wyrażenia). Reszta operatorów logicznych będzie zaimplementowana do jutra.
  ECHO Halfway done!
 ENDI
ENDR
STOP

Screenshot:
screenshot-20200508110034.png
Przykład Hello world nadal zostaje
screenshot-20200505125922.png

1

Jak to działa pod spodem?

2

Proponuję zmienić nazwę, bo jest już jeden Mercury. Kiedy wersja na Linuksa?

3

Mercury kojarzy mi się z rtęcią, czyli zabójczą substancją używaną w klasycznych termometrach. A także z dość nieprzyjazną planetą Temperatura powierzchni waha się od −173 °C do 427 °C https://pl.wikipedia.org/wiki/Merkury

2

Ciekawy pomysł, życzę powodzenia w projekcie. A można wiedzieć skąd nabyta taka wiedza? :)

8

Instrukcje pisane dużymi literami przypominają dziadka BASICA, a sama konstrukcja wyrażeń z kolei pradziadka COBOLA. To w dzisiejszych czasach raczej dobrze się nie kojarzy. Nie musisz przecież używać dużych liter.

Pisanie „interpretatora” to dobre ćwiczenie, szczególnie, jeśli wybiera się taką drogę, która pozwala nauczyć się wielu nowych rzeczy. Tak więc plus za chęci, ale pasowałoby pochwalić się kodem źródłowym, jeśli już mamy cokolwiek oceniać.

2

Nie wybrałbym języka w którym przypisanie jest takie verbose, tzn 5 znaków "Set to" zamiast =. Najczęstsze operacje powinny być najszybsze.
. I nie podoba mi się że printowanie na ekran (echo) to słowo kluczowe albo jakąś operacja, jak w php. Czemu interpreter powinien widzieć o czymś takim? Dużo lepiej jakby to była funkcja (jak print() w Pythonie albo gdybyś dostał std out, jak System.out w Javie).

Printowanie na std out to nie jest cobtrol statement jak return/throw.

Swoją drogą, pomyśl o wyjątkach i przestrzeniach nazw.

Pisanie wielkimi literami kojarzy mi się z takimi językami jak cobol. W nowoczesnych językach nie trzeba oddzielać elementów języka od konstrukcji usera wielkością liter bo programiści już dawno nauczyili się to rozróżniać.

2

Pisanie pełnymi słowami jeszcze jest ok, tylko mam spostrzeżenie.
ENDR, ENDI, ENDW - skoro już piszemy pełnymi słowami, to ja bym wolał napisać dokładnie co kończy END:

FOR cośtam
LOOP
END LOOP

albo

FOR cośtam
END FOR

Albo w ogóle można zostawić samo END. W takim języku szybko wyjdą tasiemce wychodzące poza ekran, więc i tak nie będę widział jaką pętlę kończy ENDR.

7

Wygląda mocno COBOLowo. Jeśli to COBOL done right to proponuję nazwę COBOL#, a jeśli to ma być tylko COBOL with classes to wystarczy COBOL++ .
:)

0

A implementujesz to na pałke ifo-drabinkowo, czy generujesz parser w C jak powinno sie robić ;p ? Może dlatego nie chcesz skomplikowanej składni?

2
somedev napisał(a):

A implementujesz to na pałke ifo-drabinkowo, czy generujesz parser w C jak powinno sie robić ;p ? Może dlatego nie chcesz skomplikowanej składni?

Między tymi rozwiązaniami jest jeszcze wiele dróg pośrednich jak Parser combinator używane w Haskellu i Scali

BTW najprostszą możliwą składnię ma Scheme, więc jak chcesz coś prostego to polecam ten język zaimplementować

1

Też polecam np. Write Yourself a Scheme in 48 Hours. Bob Nystrom skonczyl tez niedawno calkiem ciekawa ksiazeczke/tutorial Crafting Interpreters
A tak bardziej przyszłościowo to LLVM lub MPS jeśli coś trzeba dowieźć na szybko.

Generalnie fajny temat powodzenia

4

Dobrym pomysłem jest wymyślenie własnego, prostego języka programowania i napisanie dla niego interpretera. IMO lepszym, niż pisanie takiego narzędzia dla istniejącego języka. Głównie dlatego, że można zrealizować własne pomysły, a także – co ważne – przy okazji można się o nie potknąć. To pozwoli nauczyć się jeszcze więcej. ;)

1

Autorowi Gratuluję zapału i chęci bo podczas tego projektu wiele się nauczy ale tylko pod warunkiem że rzeczywiście zaimplementuje działające:

  • instrukcje przypisania ;
  • in/out
  • pętle
  • skoku
  • skoku warunkowego
    wtedy wyjdzie z tego taki ubogi ale działający assembler "tylko inaczej".

Obawiam się, jednak że aby ten projekt nabrał cech języka programowania poziomu przynajmniej BASICA z pierwszych 8-bitowców to bez ONP(lub alternatywnego rozwiązania) się nie obejdzie - a to może źle wróżyć temu projektowi :-)

1

Z okazji sukcesu, jakim jest wprowadzenie już połowy operacji matematycznych (dodawania i odejmowania) w Mercury, prezentuję program wypisujący 10 liczb Fibonacciego:

SET A TO 1
SET B TO 0
#tego drugiego przypisania właściwie nie musiało być, bo nieistniejące zmienne zwracają zero, lecz wtedy kod byłby bardzo nieczytelny
REPEAT 10
 SET C TO $A
 ADD $B TO C
 ECHO $C
 SET A TO $B
 SET B TO $C
ENDR

Screenshot:
screenshot-20200509193620.png
To już bardziej zaawansowany program, i pojawia się mieszanka zmiennych ze znakiem dolara lub bez. Aby to wytłumaczyć weźmy za przykład ADD $B TO C. Zmienna B posiada znak dolara, aby było wiadomo, że chodzi o zmienną, a nie stałą (znak procenta) albo wartość natychmiastową (bez żadnych dodatkowych znaków). Natomiast do C odwołujemy się bez znaku dolara, bo wiadomo, że chodzi o zmienną, bo nie dodamy nic do stałej, ani do wartości natychmiastowej.

4

@Manna5: A nie rozważałeś żeby rozszerzenie pliku w Twoim języku to było *.hg? Bo "Mercury" to element chemiczny (po angielsku "rtęć") którego skrótem jest własnie Hg.

1

Sztuka dla sztuki.
Nigdy nie chciałoby mi się tego używać

3
OnePunchMan napisał(a):

Sztuka dla sztuki.

Zabawne określenie, tak jakby istniała sztuka "nie dla" sztuki.

5
OnePunchMan napisał(a):

Sztuka dla sztuki.
Nigdy nie chciałoby mi się tego używać

Sztuka dla sztuki, ale co się przy tym nauczy to jego

0

Mnożenie i Dzielenie pomyślnie wylądowali na Merkurym!
Wszystkie operacje matematyczne są już pomyślnie zaimplementowane (obsługa błędów dziurawa, poprawię na pewno w wersji 1B, ale to potem, jak już 1A będzie kompletna).

REPEAT 10
 SET A TO $.
 INC A
 SET B TO $A
 MULTIPLE B BY $B
 ECHO $A^2=$B
ENDR

Program powyżej wyświetla oczywiście kwadraty liczb od 1 do 10:
screenshot-20200511163400.png

3

Personalnie usunąłbym ten wstęp z Mercury language interpreter - zaszumia to jedynie konsolę oraz uniemożliwia chainowanie komend (dlatego też np. Python nie wyświetla listy wszystkich autorów na starcie).

No i, przede wszystkim: gdzie kod źródłowy? :-)

0

@Manna5: wykorzystujesz ONP czy drabinkę ifów? W ogóle jest opcja używania złożonych wyrażeń, czy wszystko trzeba upraszczać do pojedynczych operacji arytmetycznych i przypisań do zmiennych tymczasowych?

1

Mercury 1A jest gotowy!
Nareszcie udostępniam Mercury 1A, wraz z kodem źródłowym interpretera i przykładami skryptów. Obsługa błędów jest dziurawa, brakuje obsługi zagnieżdżonych pętli - oby dwie usterki będą naprawione w wersji 1B.
Alternatywny download: https://files.catbox.moe/831xqa.zip

0
Manna5 napisał(a):

Mercury 1A jest gotowy!
Nareszcie udostępniam Mercury 1A, wraz z kodem źródłowym interpretera i przykładami skryptów. Obsługa błędów jest dziurawa, brakuje obsługi zagnieżdżonych pętli - oby dwie usterki będą naprawione w wersji 1B.
Alternatywny download: https://files.catbox.moe/831xqa.zip

Spodziewałem się, że kodu C będzie więcej, niej est źle :) .

2

@Manna5: A wiesz ze są narzędzia do robienia własnych języków? Np https://www.jetbrains.com/mps/

0
Manna5 napisał(a):

Mercury 1A jest gotowy!
Nareszcie udostępniam Mercury 1A, wraz z kodem źródłowym interpretera i przykładami skryptów. Obsługa błędów jest dziurawa, brakuje obsługi zagnieżdżonych pętli - oby dwie usterki będą naprawione w wersji 1B.
Alternatywny download: https://files.catbox.moe/831xqa.zip

Widzę, że dalej uparcie nie używasz GitHuba ani BitBucketa :)

1

Mercury dla UNIXa/Linuxa jest juz dostepny
Dosylam Mercury 1A dla systemow UNIX/Linux kompilowane przez gcc pod LinuxMintem.
Przepraszam za brak polskich znakow, na Linuxie nie moge ich wstawiac.

3

Mercury na GitHubie
Gdy opublikowałem archiwum ZIP z pierwszą wersją Mercurego dla Windows, wiele osób bało się to archiwum pobierać.
Wobec tego, umieściłem projekt na GitHubie: https://github.com/Manna5/Mercury-Interpreter

1

@Manna5: z ilu systemów operacyjnych i języków programowania korzystałeś, żeby się wziąć za coś takiego? Bo jeśli znasz tylko Windows/Unix, i c/c++ to to trochę za mało.

Może gdybyś nauczył się np 10-15 języków programowania, może miałbyś większe pole manewru i zrobiłbyś coś co ktoś włączy chociaż raz.

Manna5 napisał(a):

Mercury na GitHubie

Gdy opublikowałem archiwum ZIP z pierwszą wersją Mercurego dla Windows, wiele osób bało się to archiwum pobierać.
Wobec tego, umieściłem projekt na GitHubie: https://github.com/Manna5/Mercury-Interpreter

Ciągle masz exe na tym githubie? -.- Nikt tego nie włączy.

1
Manna5 napisał(a):

Przepraszam za brak polskich znakow, na Linuxie nie moge ich wstawiac.

Trzeba sobie pozmieniać ustawienia, ewentualnie dociągnąć paczki. Jednak po instalacji obrazów różnych dystrybucji nie zdarzyło mi się, aby nie było możliwości ustawienia języka polskiego klawiatury.

Znam C (nie znam C++), PHP, Assembler, Python, JavaScript, CSS i HTML (nie wiem czy się liczy), Java, Awk, Pascal, XML, trochę Perla.

Przejrzałem kod Pythona i C z githuba i mam takie wrażenie, że znasz składnie + podstawowe operacje jak pętle, wyrażenia warunkowe itp. Na przykład tej drabinie przydałaby się solidna refaktoryzacja. Piszesz, że znasz Java, natomiast w Twoich grach w ogóle nie implementujesz obiektowości (pomijając, że wszystko w Pythonie jest obiektem).

To jest trochę tak, jakbyś uczył się języka obcego, nauczył się go na poziomie B1 i chciał pisać wiersze. Zwykle to będzie zlepek słów, które będą przypominać wiersz, ale jak ktoś to będzie czytał, to zauważy, że brakuje finezji. Ale spokojnie, każdy tak zaczynał. Skoro masz już podstawy, to teraz czas, by przed napisaniem kodu usiąść sobie i zaprojektować jakąś mini-architekturę na kartce, powiązania między funkcjami/klasami, porozbijanie kodu na jak najmniejsze kawałki. Może napisać jakieś proste unit testy. W każdym razie, powodzenia :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1