Język programowania + środowisko 3D/2D

Od dawna mi chodzi po głowie, żeby zrobić język programowania. Nawet prototypy robiłem. Ale jednak czuję, że jest ten moment, kiedy chcę zrobić coś, co naprawdę będę w stanie wrzucić do sieci i żeby działało.

No cóż. Mój język programowania będzie przeznaczony do tego, żeby móc skryptować środowisko-edytor do gier, które również zrobię.

Język będzie miał prostą składnię:

  • wyrażenia, czyli coś, co byście oczekiwali od takiego języka, np. żeby umiał liczyć 2 + 2 * 2, czy inne bardziej skomplikowane wyrażenia, z nawiasami, operatorami potęgowania, możliwością odwoływania się do zmiennych, wywołania funkcji itp. np. foo(10) + foo(bar)**2
  • silne typowanie zmiennych.
  • możliwość przeładowania (overloading) własnych operatorów (żeby móc np. dodawać wektory za pomocą plusa: vec2(10, 20) + vec2(20, 30)
  • ograniczone klamerkami ({}) bloki kodu. Tak zaimplementuję ify, pętle, funkcje itp. Każdy blok będzie mógł zwracać wartość (w Rust jest podobnie).
  • wsparcie out of the box dla asynchroniczności i reaktywności
  • makra albo inna forma metaprogramowania
  • być może pattern matching
Przykład jakby ten język mógłby wyglądać (co się pewnie zmieni jeszcze):

  let player = Sprite('player.jpg')
  let label = Label(200, 20)
  :label.text = player.position
  while true {
	  wait(keyboard, 'space')  	
	  player.position += vec2(10, 10)
  }

Zwróćcie uwagę na dwukropek przed label.text. W ten sposób chcę zaznaczyć, że jest to przypisanie reaktywne. Nie wiem, czy za pomocą dwukropka będę to robić. Może lepsze będzie @? np. player.@position Nie wiem. W każdym razie to ma robić to, że nie tylko przypisuje raz wartość do jakiejś zmiennej, ale robi takiego reaktywnego watcha, cały czas patrzy, czy coś się nie zmieniło.

W tym kontekście będzie to oznaczać, że dana etykieta tekstowa (utworzona poprzez wywołanie konstruktora Label()), będzie pokazywać cały czas aktualną właściwość player.position, nawet jak ta się będzie zmieniać. Czyli będzie to reaktywność, jaką znamy z frameworków typu Vue

Druga rzecz, na którą zwróccie uwagę, to `wait(keyboard, 'space')`, to w zasadzie będzie czekanie na event. Czyli "czekaj aż użytkownik naciśnie spację" (coś na zasadzie `await somePromise` w JS).

Trzecia rzecz, że używamy znaku += do dodania wektora do właściwości position (też wektorowej)

Co do samej implementacji, to jeszcze nie zdecydowałem, czy będzie to język transpilowany do JSa, czy może napisać interpreter i całą taką minimaszynę wirtualną działającą w przeglądarce. Ale pewnie jedno i drugie.

No i oprócz języka trzeba będzie zrobić do niego jakiś edytor/IDE/debugger, coś takiego. No i później jakoś rozreklamować, żeby inni wiedzieli, że mają używać ;)

Komentarze

Popularne posty z tego bloga

Ściemy z ogłoszeń o pracę

Jak nie sprawdzać wiedzy technicznej: platformy online

Jak zrobić prostą grę w JavaScript?