Próby ulepszenia C#

17 Lipca 2018

Planując semantykę Great# zacząłem szukać jak inni podeszli w swoich implementacjach do problemów z którymi się borykam. Na CLR zostało napisanych wiele języków. Poniżej kilka wartych poznania.

Enhanced C#

EC# to rozszerzenie C# stworzone przez Davida Piepgrassa jako jeden z elementów inicjatywy Language of your choice. EC# zawierał fajne feature’y C# takie jak operator ?. lub interpolacja stringów $"" zanim weszły one do C# 6.0. W obecnym stanie projekt ten głównie opiera sie na LISPowym systemie makr i dodatkach syntaktycznych, które mają za zadanie uprościć niektóre bardziej żmudne elementy C# (np. słynne INotifyPropertyChanged).

W EC# został również zaimplementowany LLLPG, czyli Loyc LL(k) Parser Generator, mający na celu zastąpienie ANTLR, jeśli parsujemy kod taki jak C#. Generalnie do Loyc należy również LES, czyli ogólny system parsowania języków z rodziny C do postaci zunifikowanego drzewa wyrażeń, który następnie można przekształcić na swoje własne AST. Pobierznie patrząc nie jest to coś co chciałbym wykorzystać do parsowania Great#, którego składnia odbiega znacznie od tej rodziny C.

Ogólnym założeniem projektu Loyc jest stworzenie systemu, gdzie programy napisane w różnych językach będą w stanie ze sobą współpracować. Na ten moment są dwie platformy, które to osiągnęły JVM i .NET, a jak wiemy .NET jest architekturalnie lepszą platformą.

Nemerle

Nemerle ma bardzo podobne założenia co Great#. Na stronie ich wiki można przeczytać różnice z C#.

Przejrzałem co w tym Nemerle siedzi i muszę przyznać, wygląda bardzo spoko i zawiera jakieś 80-90% tego co ja planuję. Także jeśli mój język nie wypali to mam alternatywę, której mógłbym używać.

Przy czym nie podoba mi się trochę składnia Nemerle i niektóre decyzje jakie podjęli tworząc ten język, więc nadal mam pole do popisu. Przede wszystkim zależy mi bardzo na kilku rzeczach: składni bez klamer (wcięcia), typach wyższych rodzajów (higher kinded types), statycznych interfejsach (ala type classy) i dynamicznych interfejsach (duck typing). Przede mną długa droga do sukcesu, ale istnienie Nemerle potwierdza istnienie zapotrzebowania na tego typu języki.

Cobra

Cobra ma co nieco wspólnego z Great#, głównie to że wymaga wcięć, ale generalnie zbyt piękny język to to nie jest. Jeśli dobrze rozumiem, to typy są domyślnie nie-nullowalne (także klasy) i jeśli mamy pozwolić na null to trzeba to zadeklarować znakiem ?. Typy trzeba podawać, nie ma inferencji. Co jest na plusie to wbudowane w język użycie kontraktów, czyli warunków odnośnie parametrów wejściowych i wyników.

Warte wspomnienia

  • Boo - bazowany na Pythonie
  • Eiffel - deklaratywny, pierwsza wersja z 1986
  • Oxygene - komercyjny!, rozdziela interfejsy klas od implementacji, wzorowany na Delphim (Pascal)