atarionline.pl C++ na komodę, może też na atarkę? - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1:
         
        CommentAuthorpirx
      • CommentTime7 Oct 2020 12:10
       
      • 2:
         
        CommentAuthorlaoo
      • CommentTime7 Oct 2020 13:10
       
      Oglądałem to. Facet jest łebski, ale to co tu zrobił jest bardzo słabe.

      Więcej nadziei pokładam w tym projekcie: ->link<-
      • 3: CommentAuthorastrofor
      • CommentTime7 Oct 2020 13:10
       
      Patrząc jak obiektowość działa w mad pascalu, a z tego co widziałem to wymagało to bardzo dużo czasu i wysiłku aby podstawowe obiektowe rzeczy były stosunkowo stabilne i wydajne, to ten projekt wydaje mi się nierealny. Bardziej sensowna wydaje się dyskusja czy używać pure assemblera, czy jakieś nakładki nieco wyższego poziomu, jak mad pascal, action! itd.
      • 4: CommentAuthorilmenit
      • CommentTime7 Oct 2020 15:10 zmieniony
       
      Wszystko zależy od kompilatora. Współczesne GCC czy LLVM potrafią bardzo dobrze optymalizować kod - na tyle, że narzut np. na funkcje wirtualne jest bliski zeru. Ale niezależnie od tego jak dobry będzie optymalizator, niektórych rzeczy na 6502 się nie przeskoczy - np. wskaźniki gdy mają adresować przestrzeń 16bit będą wolne, dostęp do pamięci alokowanej dynamicznie będzie wolny). Nawet w silnie optymalizowanym C++ trzeba by pisać w stylu Action!, aby kod był szybki. Dla mnie istotne, aby pisany tak "niskopoziomowo" kod był szybki - tu Mad Pascal ostatnio mocno się poprawił i przeskoczył CC65. Ale na horyzoncie jest też sporo nowych języków, które testuje teraz na AtariAge Zbyti.
      • 5: CommentAuthorastrofor
      • CommentTime7 Oct 2020 16:10
       
      Szkoda że jest tak mało przykładów, obiektów z otwartym kodem pokazujących obiektowe możliwości c albo mad pascala, ja osobiście znam tylko gitlaba Bociana gdzie pare projektów faktycznie ma obiekty.

      Inna sprawa, dla kogo jest to ułatwienie, bo mi się wydaję że to nie działą tak że słabo znam architekture atari, więc jezyk wysokopoziomowy mi w tym pomoże, ale bardziej tak że świetnie znam architekture atari, świetnie znam kompilator języka w którym piszę i wtedy ten wysokopoziomowyjęzyk jest bardzo pomocny. Oczywiście to nie jestżaden zarzut, tylko smutne wyznanie trudnej prawdy.
      • 6: CommentAuthor0xF
      • CommentTime7 Oct 2020 17:10
       
      C:\0\src>cat hello.cpp
      #include <iostream>

      int main()
      {
      std::cout << "Hello, world!" << std::endl;
      }

      C:\0\src>clang++ -s -O2 -Wall -static hello.cpp -o hello.exe

      C:\0\src>ls -l hello.exe
      -rwxr-xr-x 1 fox None 933888 Oct 7 17:06 hello.exe


      Program wypisujący "Hello, world!" ma prawie megabajt na Intelu. Na 6502 to będzie dużo więcej. Na pewno tego chcecie?

      ilmenit:

      Wszystko zależy od kompilatora. Współczesne GCC czy LLVM potrafią bardzo dobrze optymalizować kod - na tyle, że narzut np. na funkcje wirtualne jest bliski zeru.

      Ciekawe. Jakieś szczegóły lub link?
    1.  
      Tydzień temu robiłem podobną prezentację dot. Rusta i Atari :D

      Nagrania jeszcze nie widzę, ale to dobrze, bo daleko mi do takiego szołmena jak Jason. Ciężko mi się gada jak nie ma ludzi tylko kamerka :P

      Zgadzam się z laoo, że jedyna prawilna droga to dobry backend do LLVM, ale do tego to niestety trzeba:
      * poświęcić za dużo cennych heartbeatów
      * znać się :D
      • 8:
         
        CommentAuthorCOR/ira4
      • CommentTime7 Oct 2020 20:10
       
      @ mgr_inz_rafal
      Wytnij z kartonu publikę,żarówę skieruj na twarz i poczuj się jak na przesłuchaniu-kamerki nie będzie widać,cień publiki owszem(jak ją lekko od tyłu podświetlisz i klimat będziesz miał ;)
    2.  
      Mądrego to aż miło posłuchać ;-)
      • 10: CommentAuthorilmenit
      • CommentTime7 Oct 2020 21:10 zmieniony
       
      @0xF - Zakładam, że w Twoim przykładzie dołączana jest gigantyczna biblioteka standardowa. W przypadku kompilatorów dla 6502 każda platforma zwykle ma ręcznie napisaną w asmie bibliotekę standardową, która w przypadku Atari by musiała być mała. Ale i tak strumienie z C++ to byłaby przesada, bo użyte <iostreams> jest napisane na szablonach oraz zawiera masę symboli. Jeżeli się użyje innej części biblioteki standardowej <cstdio> to wynik jest zdecydowanie lepszy ->link<- czy ->link<-
      O tym właśnie pisałem "Nawet w silnie optymalizowanym C++ trzeba by pisać w stylu Action!" - przykłady dla CC65 wrzuciłem jakiś czas temu tu ->link<- . Nawet w przypadku biblioteki napisanej w asm trzeba wybierać sensownie czego użyć np. w CC65 użycie printf powoduje dołączenie kilku kilobajtów kodu do pliku wykonywalnego, bo funkcja jest gigantyczna (jedna funkcja robi masę rzeczy ->link<- ) i w generowanym kodzie nie może się równać pisaniu po pamięci ekranu.
      O ile można mówić, że biblioteka standardowa to część języka, "branżowym standardem" (np. w AAA lub mobile gaming, databases, interpreters, drivers, security, real-time systems) jest to, że nie używa się biblioteki standardowej C++, ale własnych implementacji. Takie implementacje np. nie używają dynamicznych alokatorów w kontenerach (object pools, przeciw fragmentacji pamięci) lub wyjątków (narzut, nie działanie w ramach jądra systemu). Standard języka sobie, praktyka sobie ;-)
      A odnośnie optymalizacji wirtualizacji ->link<- lub ->link<-
      Ogólnie, współczesne kompilatory robią cuda przy optymalizacjach np. bardzo polecam zobaczyć ten fragment
      albo
      • 11:
         
        CommentAuthorlaoo
      • CommentTime8 Oct 2020 07:10
       
      @ilmenit Można rozróżniać bibliotekę standardową od runtime'u. Bardzo duży kawałek biblioteki standardowej C++ to szablony w nagłówkach i one się bardzo ładnie potrafią skompilować. Wszystkie kontenery z STL przyjmują opcjonalne alokatory. Więc nie używanie tego dla jakiejś zasady jest po prostu głupie. Co najwyżej sensowne jest mieć własną implementację niskopoziomowych odwołań do systemu.
      • 12: CommentAuthorilmenit
      • CommentTime8 Oct 2020 09:10
       
      @laoo - tak, runtime i biblioteka standardowa to nie to samo, szczególnie jak się idzie do współczesnego C++. Odnośnie STL - są alokatory dla trzymanych w kontenerach obiektów, ale oprócz danych są jeszcze wewnętrzne struktury danych dla konkretnych algorytmów, które nie są pod kontrolą piszącego. Ale w pełni się zgadzam - współcześnie STL się na tyle poprawił ze względu na szybkość (i jest wiele różnych alternatyw) że pisanie własnego ma coraz mniejszy sens. Może hedynie, gdy są ograniczenia platformy np. w obsłudze wyjątków. Cały STL bazuje na wyjątkach i choć można w kompilatorach wyłączyć rzucanie wyjątków, to przy problemach np. z alokacją funkcja wywala program, zamiast zwrócić NULLa.
      • 13: CommentAuthor0xF
      • CommentTime8 Oct 2020 09:10
       

      ilmenit:

      <iostreams> jest napisane na szablonach oraz zawiera masę symboli.


      Zauważ, że symbole wyciąłem. Z symbolami ten exe ma prawie 3 MB. :)

      ilmenit:

      A odnośnie optymalizacji wirtualizacji ->link<- lub ->link<-
      Ogólnie, współczesne kompilatory robią cuda przy optymalizacjach np. bardzo polecam zobaczyć ten fragment ->link<- albo ->link<-


      To mój chleb powszedni. :)

      Wcześniej pisałeś "narzut np. na funkcje wirtualne jest bliski zeru", a chodzi o dewirtualizację. cito też ją robi przy generowaniu kodu C.

      ilmenit:

      to przy problemach np. z alokacją funkcja wywala program, zamiast zwrócić NULLa.


      Gdy skończyła się pamięć, zakończenie procesu jest dobrym pomysłem. Jest bardzo prawdopodobne, że nie starczy już pamięci na np. otwarcie pliku logu i zapisanie tam informacji o błędzie.
      • 14: CommentAuthorilmenit
      • CommentTime8 Oct 2020 10:10 zmieniony
       
      "Gdy skończyła się pamięć, zakończenie procesu jest dobrym pomysłem."
      to racja, ale to mało przyjazne gdy aplikacja jest krytyczna z punktu widzenia continuity np. silnie zintegrowana z systemem operacyjnym czy na gwarancji jej działania bazują jakieś urządzenia. Można oczywiście pytać przed alokacją o ilość dostępnej pamięci, ale takie funkcje zwykle nie zwracają max. ilości dostępnej do alokacji przy fragmentacji pamięci (rozmiaru maksymalnego przydzielanego obszaru na stercie).
      O ile może nie wystarczyć pamięci na otwarcie pliku i zapisanie tam, to dobrą praktyką jest mieć plik logowania otwarty od początku działania programu :-)
      • 15: CommentAuthortebe
      • CommentTime8 Oct 2020 11:10 zmieniony
       
      Szkoda że jest tak mało przykładów, obiektów z otwartym kodem pokazujących obiektowe możliwości c albo mad pascala, ja osobiście znam tylko gitlaba Bociana gdzie pare projektów faktycznie ma obiekty.

      lib\graphics.pas
      lib\objects.pas
      lib\cmc.pas
      lib\mpt.pas
      lib\rmt.pas
      lib\highmem.pas

      przykłady użycia
      txtout.pas ->link<-
      cmc, mpt, rmt ->link<-
      TMemoryStream ->link<-
      • 16:
         
        CommentAuthorpirx
      • CommentTime8 Oct 2020 13:10
       
      rozpocząłem najciekawszy wątek na aol od lat :] brawo ja
      • 17: CommentAuthor0xF
      • CommentTime8 Oct 2020 17:10
       
      Brawo Pirx!
      • 18: CommentAuthornome
      • CommentTime9 Oct 2020 21:10 zmieniony
       
      @0XF
      Gdzieś Ty testował ten program, to chyba z DEBUG INFO?

      nome@asx-comp:~/cpp$ cat hello.cpp
      #include <iostream>

      int main()
      {
      std::cout << "Hello, world!" << std::endl;
      }
      nome@asx-comp:~/cpp$ g++ -o hello hello.cpp
      nome@asx-comp:~/cpp$ ls -l hello
      -rwxr-xr-x 1 nome nome 17256 paź 9 21:28 hello
      nome@asx-comp:~/cpp$

      Poza tym plik wykonywalny zawiera różne sekcje i jego rozmiar nie świadczy o wielkości wygenerowanego kodu

      W tym przypadku rozmiar sekcji .text to 0x01e1 a sekcji .rodata to 0x0013

      Oczywiście pozostają jeszcze biblioteki dynamiczne - ale to jako ROM w ATARI

      A przy statycznym linkowaniu tak jak u Ciebie cały niepotrzbny bagaż się wlecze. Ale mogę tak opisać bibliotekę, że zlinkują się tylko potrzebne funkcje. i kdo będzie dużo mniejszy.
      Tak na marginesie pierwsze implementacje C++ to był preprocesor języka C.