Od pewnego czasu chodzi mi po głowie następujący pomysł: stworzenie języka wysokiego poziomu, który kompilowałby się do PHP. Można sobie to wyobrazić jako PHP z podrasowaną składnią.
Wyobrażam sobie to w następujący sposób: Programista pisze swój program w owym rozszerzonym języku (który, w swej naturze, jest obdarzony interoperacyjnością z PHP). Następnie kompiluje go i wrzuca kod wynikowy na serwer.
Możliwości ulepszenia składni języka:
- Dostęp do elementów tablicy zwracanej przez funkcjęKodfunction getarray() { return {1,2,3}; }
print getarray()[2]; - W powyższym przykładzie widać zastosowanie {1,2,3} jako skrócenie dla array(1,2,3) - jest to przykładowy lukier składniowy
- Dostęp do przedziałów tablicy (ang. array slicing), co występuje np. w pythonie: getarray()[1:2] zwraca tablicę {2,3}, a getarray()[:-2] zwraca {1,2}.
- Możliwość łańcuchowania wyrażenia konstrukcji obiektu: rzecz pokroju (new Query())->foo()->execute(); w obecnym PHP nie jest możliwa
- Szybkie pakowanie zmiennych w styluKoda, b = b, a
jako alias dla list(). - Aliasy dla całych grup funkcji:Kodzmienna = "foo"
zmienna = string.replace(zmienna, "foo", "bar")
albo nawet
zmienna = zmienna.replace("foo","bar")
Celem takiego zabiegu jest zlikwidowanie nieścisłości w nazewnictwie oraz w kolejności parametrów w PHP.
- Wyrażenia lambda (to akurat pojawi się w PHP 5.3, ale można uprościć nieco składnię)
- Tzw. array comprehensions - ciekawa rzecz występująca w JavaScript/Pythonie:Kodtablica = *tablica jakichś liczb rzeczywistych z przedziału 0-100
{round(x) for x in tablica} // zwraca tablicę z zaokrąglonymi wartościami z tablica
{round(x) for x in tablica if x > 50} // to samo co wyżej, ale teraz filtruje elementy pod kątem wartości - Jakiś prostszy sposób na callbacki (nad tym wogóle się jeszcze nie zastanawiałem, możliwe, że dość kłopotliwe z implementacji)
- Z racji, że taka kompilacja nie jest wykonywana przy każdym uruchomieniu skryptu, można pozwolić sobie na bardziej agresywną optymalizację, jak np. inline'owanie funkcji, korzystanie z trace trees i innych technik optymalizacji stosowanych przez kompilatory.
- Tworzenie 'amalgamacji', czyli łączenie (w wersji 'release') plików danego projektu w celu uniknięcia narzutu związanego z otwieraniem i parsowaniem plików
Traz myślę, aby to bardziej ustrukturyzować, czyli napisać design doc, aby to wszystko miało ręce i nogi. Tworzenie parserów to nie jest jednak robota prosta i przyjemna, zmienianie podstawowych założeń/interfejsów w środku prac jest straszną męczarnią, dlatego wpierw chcę to dobrze zaprojektować.
Teraz kieruję pytanie do Was: Co o tym sądzicie? Co wam się nie podoba w tych planach, a jakie cechy byście dodali? Ktoś ma podobne wrażenia/próbował czegoś takiego w przeszłości? A może wskazówki od doświadczonych w temacie? Liczę na konstruktywną dyskusję.