Traits ve Fortranu

Coati

Traits ve Fortranu
« kdy: 09. 09. 2022, 09:09:11 »
Doufám, že tu jsou nějací fortranisti :) Má moderní Fortran něco jak trait v Rustu? Podle dokumentace k F2018 jsem to v jeho OO vlastnostech nenašel, ale vzhledem k rozsahu se to dá snadno přehlédnout.


uetoyo

  • ***
  • 202
    • Zobrazit profil
Re:Traits ve Fortranu
« Odpověď #1 kdy: 09. 09. 2022, 09:15:48 »
Ne nemá, ale tady je proposal a konverzace dvou zasvěcených Fortranistů. https://github.com/j3-fortran/fortran_proposals/issues/125

Idris

  • *****
  • 2 255
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #2 kdy: 09. 09. 2022, 10:18:59 »
Ne nemá, ale tady je proposal a konverzace dvou zasvěcených Fortranistů. https://github.com/j3-fortran/fortran_proposals/issues/125
Nějak se jim ta diskuse zvrtla, jeden o voze, druhý o koze. Ale ten původní návrh je dobrý. A ten druhý se statickým polymorfismem taky, hezky se doplňuje. Jsou velice blízko k objevení (typového systému) Go :)

mikrom

  • ***
  • 178
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #3 kdy: 09. 09. 2022, 10:31:48 »
Fortran ma moduly. Funkcie z jedneho modulu sa mozu vzajomne volat. Jeden modul moze pouzivat ine moduly a volat z nich funkcie.



mikrom

  • ***
  • 178
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #4 kdy: 09. 09. 2022, 10:42:21 »
S pouzitim modulov som to myslel takto:

modules.f95
Kód: [Vybrat]
module tmp_mod1
contains
  subroutine t11
    write(*, *) "t11"
  end subroutine
  subroutine t12
    write(*, *) "t12 calls:"
    call t11
  end subroutine
end module tmp_mod1

module tmp_mod2
contains
  subroutine t2
    write(*, *) "t2"
  end subroutine
end module tmp_mod2

module my_mod
use tmp_mod1
use tmp_mod2
contains
  subroutine s
    write(*, *) "s calls:"
    call t11
    call t12
    call t2
  end subroutine
end module my_mod

program main
    use my_mod
    write(*, *) "main calls:"
    call t11
    call t12
    call t2
    call s
end program main

Output:
Kód: [Vybrat]
$ gfortran modules.f95 -o modules

$ modules
 main calls:
 t11
 t12 calls:
 t11
 t2
 s calls:
 t11
 t12 calls:
 t11
 t2


Idris

  • *****
  • 2 255
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #5 kdy: 09. 09. 2022, 12:26:27 »
S pouzitim modulov som to myslel takto:

modules.f95
Kód: [Vybrat]
module tmp_mod1
contains
  subroutine t11
    write(*, *) "t11"
  end subroutine
  subroutine t12
    write(*, *) "t12 calls:"
    call t11
  end subroutine
end module tmp_mod1

module tmp_mod2
contains
  subroutine t2
    write(*, *) "t2"
  end subroutine
end module tmp_mod2

module my_mod
use tmp_mod1
use tmp_mod2
contains
  subroutine s
    write(*, *) "s calls:"
    call t11
    call t12
    call t2
  end subroutine
end module my_mod

program main
    use my_mod
    write(*, *) "main calls:"
    call t11
    call t12
    call t2
    call s
end program main

Output:
Kód: [Vybrat]
$ gfortran modules.f95 -o modules

$ modules
 main calls:
 t11
 t12 calls:
 t11
 t2
 s calls:
 t11
 t12 calls:
 t11
 t2
Jak to souvisí s traity?

Idris

  • *****
  • 2 255
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #6 kdy: 09. 09. 2022, 16:31:41 »
něco jak trait v Rustu
Fortran má INTERFACE pro statický ad-hoc polymorfismus, rozhraní jako typ s dynamickým dispatchem ne. Ten výše odkazovaný navrh je pěkný. Ono to jde ve Fortranu s jeho OOP jednoduše obejít, ale je to hnusný kód navíc. Ve Fortranu se naštěstí “populární” OOP nijak moc nepoužívá, případy dědičnosti by člověk spočítal na prstech jedné stonožky. Hezčí řešení přinesou šablony s restrikcemi, k tomu už existuje oficiální návrh.

mikrom

  • ***
  • 178
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #7 kdy: 09. 09. 2022, 18:21:54 »
S pouzitim modulov som to myslel takto:

modules.f95
Kód: [Vybrat]
module tmp_mod1
contains
  subroutine t11
    write(*, *) "t11"
  end subroutine
  subroutine t12
    write(*, *) "t12 calls:"
    call t11
  end subroutine
end module tmp_mod1

module tmp_mod2
contains
  subroutine t2
    write(*, *) "t2"
  end subroutine
end module tmp_mod2

module my_mod
use tmp_mod1
use tmp_mod2
contains
  subroutine s
    write(*, *) "s calls:"
    call t11
    call t12
    call t2
  end subroutine
end module my_mod

program main
    use my_mod
    write(*, *) "main calls:"
    call t11
    call t12
    call t2
    call s
end program main

Output:
Kód: [Vybrat]
$ gfortran modules.f95 -o modules

$ modules
 main calls:
 t11
 t12 calls:
 t11
 t2
 s calls:
 t11
 t12 calls:
 t11
 t2
Jak to souvisí s traity?
Moduly vo fortrane (90+) maju podobny ucel ako traity v inych jazykoch. Sluzia na organizaciu a znovupouzitie kodu.

Ink

  • *****
  • 584
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #8 kdy: 09. 09. 2022, 18:48:03 »
Moduly vo fortrane (90+) maju podobny ucel ako traity v inych jazykoch. Sluzia na organizaciu a znovupouzitie kodu.

Možná jsem něco nepochopil, ale co jsi demonstroval ve svém příkladu, jsou funkce uspořádané do nějakých namespaces. Traity slouží k implementaci nějakého rozhraní napříč různými typy (třídami). Možná tam někde nějaký průnik vidíš, ale nepřijde mi, že by tam byla nějaká zásadní podobnost nebo zastupitelnost.

mikrom

  • ***
  • 178
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #9 kdy: 09. 09. 2022, 19:03:41 »
Moduly vo fortrane (90+) maju podobny ucel ako traity v inych jazykoch. Sluzia na organizaciu a znovupouzitie kodu.

Možná jsem něco nepochopil, ale co jsi demonstroval ve svém příkladu, jsou funkce uspořádané do nějakých namespaces. Traity slouží k implementaci nějakého rozhraní napříč různými typy (třídami). Možná tam někde nějaký průnik vidíš, ale nepřijde mi, že by tam byla nějaká zásadní podobnost nebo zastupitelnost.

No ano, OP sa pytal ci Má moderní Fortran něco jak trait v Rustu, ale nepovedal nam na co to vlastne potrebuje, co potrebuje docielit. Fortran nie moc OOP, takze take veci zatial nema ale myslim si, ze na docielenie podobnych veci ako sa robia s pouzitim traitu v inych jazykoch by mohol vo fortrane pouzit akurat tak tie moduly.

Idris

  • *****
  • 2 255
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #10 kdy: 10. 09. 2022, 00:05:46 »
Moduly vo fortrane (90+) maju podobny ucel ako traity v inych jazykoch. Sluzia na organizaciu a znovupouzitie kodu.

Možná jsem něco nepochopil, ale co jsi demonstroval ve svém příkladu, jsou funkce uspořádané do nějakých namespaces. Traity slouží k implementaci nějakého rozhraní napříč různými typy (třídami). Možná tam někde nějaký průnik vidíš, ale nepřijde mi, že by tam byla nějaká zásadní podobnost nebo zastupitelnost.
Žádný průnik tam není.

Idris

  • *****
  • 2 255
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #11 kdy: 10. 09. 2022, 00:11:04 »
Fortran nie moc OOP
Fortran je naopak až moc OOP, včetně abstraktních typů a dědičnosti, což třeba Rust nebo Go nemají. Ty traity se dají udělat syntaktickou omáčkou (pokud nestačí INTERFACE), Rust (a Go) je implementují naprosto stejně jako tlusté ukazatele, akorát to dělá transparentně překladač, takže je kód čitelnější.

Idris

  • *****
  • 2 255
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #12 kdy: 10. 09. 2022, 00:35:12 »
Pokud někdo chce vidět pseudo-OOP prasokód ve Fortranu, tak tady je ukázková otřesnost: https://github.com/LadaF/Fortran-RefCount

mikrom

  • ***
  • 178
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #13 kdy: 10. 09. 2022, 12:06:11 »
Ty traity se dají udělat syntaktickou omáčkou
Tak preco neurobis syntaktickou omáčkou male demo traitu vo fortrane ?
Nech je to funkcne, da sa skompilovat v gfortrane a ma zmysluplne pouzitie ..

a6b

  • ***
  • 119
    • Zobrazit profil
    • E-mail
Re:Traits ve Fortranu
« Odpověď #14 kdy: 10. 09. 2022, 12:44:20 »
nechapu proc to cpou do fortranu, ten jsem pouzival jen na vypocty a stacily realna cisla, na co dalsi typy.