Jakie są sposoby implementowania generyków?

0

Jednym ze sposobów na obsługę generyków jaki widziałem jest JIT, ale w sumie jak to jest zrealizowane w językach (uproszczenie) bez JITa? nie wiem może w Ruscie lub Go (dodali tam już? chyba coś długo im szło)? bo CPPowe templatki to jeszcze coś innego

2

To taki test, który mod wywali to pierwszy, czy chcesz sprawdzić, czy powodem będzie szczątkowy opis problemu czy autorowi po prostu nie da się pomóc?

0
nalik napisał(a):

Nawiązujesz do tego https://www.artima.com/intv/generics.html ?

https://softwareengineering.stackexchange.com/a/334193

Ale właściwie to tak, do tamtego też pasuje.

1

Nie potrzebujesz jita, ale wtedy dla typów obsługiwanych przez wartość możesz nie móc zrobić reifikowanego generyka (ze względu na nieznajomość rozmiaru instancji typu).

Przykładowo generyki w javie używają erasure'a i nie potrzebują jita do tego w teorii. Generyki w dotnecie są reifikowane, więc nie zadziała to dla typów wartościowych, ale powinno dla referencyjnych (tu nie mam pewności, ale jak pamiętam implementację tych dwóch typów pod spodem, to powinno zadziałać nawet przy dynamicznym ładowaniu bibliotek).

4

Trzy sposoby:

  1. Generowanie na poziomie kodu źródłowego (np. template w C++) - zaleta: szybkość w runtime'ie wada: większy rozmiar plików wykonywalnych, nie ma kontra- i kowariancji
  2. Generyki widoczne z poziomu języka ale pod spodem kompilowane do Object (Java) - zaleta: brak (ok ok proste w implementacji, nie trzeba zmieniać maszyny wirtualnej) wada: powolne działanie
  3. Generyki generowane w locie (C#) - zalety: szybkość wada: program zajmuję trochę więcej pamięci i trochę wolniej się uruchamia (należy zaznaczyć że wszystkie typy referencyjne będą współdzielić kod)
0

A wie ktoś może jak są zaimplementowane generyki (typy parametryczne) w Haskellu i OCamlu? Z jednej strony po kompilacji dostajemy kod wykonywalny (bez żadnej maszyny wirtualnej). Z drugiej typy parametryczne są tam niesamowicie rozbudowane

3

A wie ktoś może jak są zaimplementowane generyki (typy parametryczne) w Haskellu

W komentarzu podałem już trochę informacji:
https://news.ycombinator.com/item?id=17947083
https://www.reddit.com/r/haskell/comments/46lux3/monomorphization_good_or_bad_idea/

Znalazłem jeszcze dodatkowy artykuł: https://reasonablypolymorphic.com/blog/specialization/
Wychodzi na to, że w Haskellu jest takie trochę pomieszanie między Javą, a C++. Proste generyki podlegają specjalizacji (jak w C++, Ruście, C#, etc), a im bardziej skomplikowane tym więcej jest boxingu czy warstw pośredniości.

Skoro już mowa o Javie to przytoczę artykuł architekta języka Java:
http://cr.openjdk.java.net/~briangoetz/valhalla/erasure.html

Background: how we got the generics we have
(Or, how I learned to stop worrying and love erasure)
Brian Goetz, June 2020

Ciekawym przypadkiem jest ekosystem JavaScriptu. Są dwa języki kompilujące się do JSa, które mają wsparcie dużych firm:

  • TypeScript autorstwa Andersa Hejlsberga (autora Turbo Pascala, architekta Delphiego i języka C#), stworzony w Microsofcie i tam rozwijany
  • Dart stworzony przez Google'a

TypeScript ma wymazywanie typów mniej więcej takie samo jak w Javie, natomiast Dart ma reified generics. Mimo tego Dart przegrał z TS z kretesem. TS bardzo często pojawia się w ofertach pracy, a Dart został już w dużej mierze zapomniany. Jak widać reified generics (oferowane przez Darta) przegrało z naciskiem na kompatybilność wsteczną z JSem (oferowaną przez TypeScript) na programistycznym rynku. Podobny dylemat był w Javie - w momencie dodawania generyków do Javy było zbyt dużo kodu napisanego w Javie bez generyków, by wprowadzać generyki niekompatybilne z nim. Z rynkowego punktu widzenia było to nieopłacalne (dodatkowe argumenty są w artykule od Briana Goetza powyżej).

Java, za sprawą https://openjdk.java.net/projects/valhalla/ , pójdzie w trochę podobnym kierunku co Haskell, a więc część generyków będzie wymazywana jak teraz, a część będzie specjalizowana (ogólnie będzie to wymagać pewnym zmian w kodzie). Project Valhalla jest nastawiony zarówno na kompatybilność wsteczną jak i wydajność, ale (raczej) nie na pełną reifikację.

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