Klasy wbudowane w kompilator

0

O dawna chodziła mi po głowie wspólna z wami analiza, jakie klasy i intefejsy są wbudowane w kompilator "na twardo".

String. Ma literały, ma specyficzny operator +, i literał już jest obiektem. Generalnie w każdym języku oprócz asemblera jest "jakiś string".

Tablica implementuje to i owo, nie wiem ściśle co. Można sprawdzić długość itd, wziąć z niej iteratory.

Metoda Main() raczej jest to atrybut programu wykonawczego java, a nie kompilatora javac

Typy arytmetyczne, logiczny i boxingi

Wielki nieobecny: nawet nie BigDecimal, ale bardzo (mi) brakuje jakiegoś NormalDecimal wbudowanego w język. W pewnej mojej prywatnej klasyfikacji Java jest bliska PHP, w kategorii "języki nie mające decimala", tu ratuje silnie zestandaryzowana biblioteka standardowa.

Iterable jest konieczny do pętli for each

java.lang.AutoCloseable i java.io.Closeable bo try with resources

lambdy pewnie czegoś wymagają? Ale nie byłbym zdziwiony, jesli było by to zrobione jawnie (bez twardego patchowania kompilatora), przez klasy i metody.

liczne featuresy wersji > 9

Kolejny wielki nieobecny: Optonal, @NotNull & Company gdyby były silnie egzekwowane (była tu dyskusja)

pamiętam jak Kubuś Puchatek, że coś zapomniałem, jakich ?

Generalnie z masakrowaniem kompilatora nie jest chyba źle. Moje największe przerażenie to Borland C++, ale i np standardowy C/C++ masakruje return z main'a

0

Co rozumiesz przez O dawna chodziła mi po głowie wspólna z wami analiza, jakie klasy sa wbudowane w kompilator "na twardo".?
Klasy te które wymieniłeś poniżej są wbudowane w maszynę wirtualną a nie kompilator. (chociaż po wejściu modułów i odchudzeniu biblioteki standardowej w wersji 9 to już pewności nie mam gdzie co jest)
Jednak kompilator javac o nich wie (i to często dużo) dzięki czemu może zrobić wiele optymalizacji i przekształceń. Ale czy to że wie można nazwać są wbudowane? Chyba nie?

Generalnie z masakrowaniem kompilatora nie jest chyba źle. Już w ogóle nie rozumiem :(

0

Zapomniałeś jeszcze o autoboxingu. A więc int <-> Integer na przykład.

0

Np try with resurces jest ciekawe do omówienia, można podać "mniej więcej" analogię w C++.

Więc C++ ma destruktory, i destruktory zapewniają "sprzątanie" zasobów, jakie by nie były. Można powiedzieć, że bardziej generyczne, niż w Javie.
W Javie obiekt, który by podlegał sprzątaniu musi implementować interfejs. Automagiczne sprzątanie nie zachodzi dla dowolnej metody Close, tylko wywiedzionej z interfejsu, i nie w każdym rodzaju bloku (jak C++) a tylko w szczególnym.

Zarazem nie ma ŻADNEGO sposobu w języku Java, aby napisać swoje takie szczególne rozwiązanie - musi być "fabryczny" interfejs.

na marginesie: Python wydrukuje cokolwiek, co ma metodę print, ale to jest w spójne z jego obiektowością "duck quacking" . No ale ta metoda jest "ważniejsza" od innych :)

0

Z tym sprzątaniem to chodzi bardziej o to, że potrzebowałbyś zaingerować w etap kompilacji, tzn. z drzewa AST wygenerować odpowiedni bytecode. Z tego co pamietam dla try-with-resources nie ma nowych instrukcji w bytecode, podobnie jak dla Enuma na Stringach. To jest po prostu lukier syntaktyczny, który rozumie nowa wersja kompilatora.

Poczytaj jak działa Lombok i annotation processing, jest pare sposobów („legalnych” i nie), które umożliwiają dodawanie nowych transformacji bez konieczności rozszerzania słownika instrukcji bytecode.

1
  1. Czym NormalDecimal różni się od BigDecimala - jesteś pewny, że jest potrzebny (na tyle często, żeby wsadzać do platformy).
    W których popularnych językach masz ten NormalDecimal? (COBOL to na pewno, bazy danych.. i co jeszcze?)
  2. masz różne sposoby specjalnego traktowania:
  • na poziomie składni języka (tak jak ten AutoCloseable) , String też (automatyczne toString() itp.)
  • na poziomie javac w celu optymalizacji (przezroczyste) - String
  • na poziomie jvm - głównie w celu optymalizacji np. https://gist.github.com/apangin/7a9b7062a4bd0cd41fcc
0

A i oczywiście cała maszyneria związana z invokedynamic (https://docs.oracle.com/javase/8/docs/api/java/lang/invoke/LambdaMetafactory.html i MethodHandle).

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