Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Po co są implementacje języka w innym języku?

szymon1051 24 Jun 2020 01:20 288 3
  • #1
    szymon1051
    Level 13  
    Jeżeli dobrze rozumiem język programowania to taki zbiór funkcji które kompilator lub maszyny wirtualna ma przełożyć na asemblera lub prosto na kod maszynowy.

    Teraz na przykładzie Python.
    Python jest domyślnie wykonywany w CPython który jest napisany w C.
    Przez to że jest to napisane w C i autor dodał taką możliwość można w Pythonie użyć składni C.
    Potem maszyna wirtualna Pythona przekłada na kod zrozumiały dla CPU?

    Jak jest różnica między CPython i Cython?



    W czym jest napisana JAVA i C#? Chodzi mi bardziej o te maszyny wirtualne czy kod pośredni. Kod pośredni a maszyna wirtualna to chyba to samo.


    To powiedzmy jeszcze rozumiem ale są takie wynalazki ja Jython czy Ironpython.
    Jak dobrze rozumiem zadaniem Jython jest przełożenie kodu wykonywanego przez maszynę wirtualną Pythona na Jave, a potem przez Jave na jej maszynę wirtualną i dopiero na kod zrozumiały dla CPU.
    W Ironpython jest za to na C# a potem na przez maszynę wirtualną C# na kod dla CPU.

    Dobrze to rozumiem?

    Po co nakładać jeden język na drugi?
    Jak czegoś brakuje w danym języku to się nie dodaje tego albo jak niektórzy tworzy się własny język?

    Jeżeli dobrze rozumiem do kodu wygenerowanego np przez Jython mogę dodać jak potrzebuje kod Java?
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    JacekCz
    Level 39  
    Uffff ...

    Miejscami dobrze gadasz, miejscami się ślizgasz.

    > Jeżeli dobrze rozumiem język programowania to taki zbiór funkcji które kompilator lub maszyny wirtualna ma przełożyć na asemblera lub prosto na kod maszynowy.

    No nie. To nie jest definicja języka programowania, i domysł o warunkach wykonania też nie jest śćisły.

    Tu jest pora pomedytować, co to znaczy "implementacja języka". Można mówić chyba o trzech istotnych / częstych elementach: kompilator (lub coś podobnego), środowisko wykonania (fizyczny procesor lub formy interpretera/maszyny wirtualnej), i biblioteka standardowa. Chyba stosunkowo najczęściej te trzy elementy wykonane są w dwóch językach. To w czym jest "zaimplementowany język" ... ?

    > Przez to że jest to napisane w C i autor dodał taką możliwość można w Pythonie użyć składni C.
    No nie. Akurat SKŁADNIA tych jezyków jest bardzo odległa.

    > a potem przez Jave na jej maszynę wirtualną i dopiero na kod zrozumiały dla CPU

    I tak, i nie. JVM to MOŻE ale NIE MUSI przekładać na maszynowy, i robi to tylko dla najważniejszych fragmentów kodu. Nawet może się z takiej decyzji wycofać. Taka obecnie ejst tendencja. Były/są realizacje JVM, które były czystym interpreterem.

    > Po co nakładać jeden język na drugi?
    > Jak czegoś brakuje w danym języku to się nie dodaje tego albo jak niektórzy tworzy się własny język?

    No nie.
    Nie tak powstaje decyzja o powołaniu nowego języka.
    Motywacja to byłby temat na kawał wykładu z historii języków programowania.

    Maszyny wirtulane/interpretery stosunkowo często tworzy się w C++, C a nawet ze wstawkami assemblera, żeby działały szybko.
    A kompilatory już niekoniecznie. Język wysokiego poziomu MOŻE dać lepsze warunki do developmentu kompilatora, systemy budowania itd, a milisekundy czasu kompilacji nie są najważniejsze na świecie

    > Jak czegoś brakuje w danym języku to się nie dodaje tego albo jak niektórzy tworzy się własny język?

    np w C brakuje bezpieczeństwa i zabezpieczeń przed błędami. Nie da się tego "dołożyć", bo to już nie będzie C. Miliardy linii kodu posiadane przez ludzką cywilizację staną się niekompatybilne.

    https://pl.wikipedia.org/wiki/Interpreter_(program_komputerowy)
    https://pl.wikipedia.org/wiki/Kompilator
    https://pl.wikipedia.org/wiki/Maszyna_wirtualna
    https://pl.wikipedia.org/wiki/Kod_bajtowy
    https://pl.wikipedia.org/wiki/J%C4%99zyk_maszynowy
  • #3
    szymon1051
    Level 13  
    >np w C brakuje bezpieczeństwa i zabezpieczeń przed błędami. Nie da się tego "dołożyć", bo to już nie będzie C. Miliardy linii kodu posiadane przez ludzką cywilizację staną się niekompatybilne.

    Ale masz chyba wersje samego C, C90, C99 itp
    Przed C był chyba B https://pl.wikipedia.org/wiki/B_(j%C4%99zyk_programowania) , to teraz czas na D https://pl.wikipedia.org/wiki/D_(j%C4%99zyk_programowania) :)

    >> Przez to że jest to napisane w C i autor dodał taką możliwość można w Pythonie użyć składni C.
    >No nie. Akurat SKŁADNIA tych języków jest bardzo odległa.

    Z tego co mi wiadomo Python jest tak zaprojektowany by można było tam gdzie trzeba szybkość dodać kod z C

    >> a potem przez Jave na jej maszynę wirtualną i dopiero na kod zrozumiały dla CPU
    >I tak, i nie. JVM to MOŻE ale NIE MUSI przekładać na maszynowy, i robi to tylko dla najważniejszych fragmentów kodu. Nawet może się z takiej decyzji wycofać. Taka obecnie ejst tendencja. Były/są realizacje JVM, które były czystym interpreterem.

    Ale żeby wykonać program musi przełożyć na kod zrozumiały dla CPU, na te kody procesora jak dobrze pamiętam. Bo JMP, AND itp to już asemblery.

    Kod pośredni przydaje się jak się robi wersje na kilka systemów bo np wchodzą różne przerwania systemowe i inne "pierdoły".
    Te "pierdoły" sprawiają że języki które się kompiluje trzeba oddzielnie kompilować dla różnych systemów.


    Zacznę pisać jakieś większe programy to może samo przyjdzie, zrozumienie tego :).
  • #4
    JacekCz
    Level 39  
    szymon1051 wrote:
    >> Przez to że jest to napisane w C i autor dodał taką możliwość można w Pythonie użyć składni C.
    >No nie. Akurat SKŁADNIA tych języków jest bardzo odległa.

    Z tego co mi wiadomo Python jest tak zaprojektowany by można było tam gdzie trzeba szybkość dodać kod z C


    Tak.
    osobiście bardzo lubię C-API Pythona, jest dobrze zaprojektowane i logiczne. Kiedyś byłem w tym dobry.

    Ale nie SYNTAX, czyli budowa syntaktyczna źródeł programu. Mam wrażenie, ze słowa użyłeś, bo fruwa w powietrzu, nie czając go w pełni

    Dodano po 1 [minuty]:

    szymon1051 wrote:
    Ale żeby wykonać program musi przełożyć na kod zrozumiały dla CPU, na te kody procesora jak dobrze pamiętam. Bo JMP, AND itp to już asemblery.


    Nie musi zachodzi taka translacja. Moze być wykonane (na prawdziwym CPU) przez interpreter, który jest napisany (ostatecznie) w kodzie maszynowym

    Dodano po 3 [minuty]:

    szymon1051 wrote:
    Kod pośredni przydaje się jak się robi wersje na kilka systemów bo np wchodzą różne przerwania systemowe i inne "pierdoły".
    Te "pierdoły" sprawiają że języki które się kompiluje trzeba oddzielnie kompilować dla różnych systemów.


    Prawda. Compile once, run everywhere

    W podsumowaniu, dobrze wspominam romans z interpreterami języków C-Python i Lua, integracja, pisanie rozszerzeń itd. O ile Python z latami rozwoju bardzo przytył, to Lua jest zwinna, dobry programista C szybko się w tym rozejrzy.