Języki skryptowe, interpretatory, Java i C#

0

Witam.
Chciałbym się dowiedzieć jakie różnice wyczuwacie (widzicie) pomiędzy językami skryptowymi, językami interpretowanymi, i językami hmmm... kompilowanymi "just in time". Nie chodzi mi tutaj o jakieś regułki czy inne tego typu opinie. Chodzi mi o wasze odczucie. Czy nie mozna by ich "zaszufladkować" pod jedną nazwą np. języków interpretowanych ? Jeśli chodzi o mnie to wydaje mi się że języki z tych trzech kategori różnią się jedynie "inteligencją" ich interpretatorów (już widze jak zwolennicy Javy czy C# krzyczą że głupoty mówie - no może). Co wy sądzicie na ten temat ?

0

Nie no, JIT ma roznego rodzaju cacheowanie i inne tego typu bajery i jest na prawde o wiele szybszy od maszyn wirtualnych, kolejna rzec to taka, ze latwiej (szybciej) zainterpretowac np bytekod Javy (kiedy jeszcze Java smigala na typowym VMie) niz typowy skryptowy jezyk jak PHP. Wiec nie powiedzialbym, ze to to samo.

Moze i to sa "regulki" ale nikt nie napisal jeszcze dwoch identycznych, duzych programow w roznych jezykach wiec ciezko tu mowic o odczuciach, mozna oczywiscie zaimplementowac jakies klasyczne algorytmy ale jednak to nie to samo co normalny, funkcjonalny program okienkowy (tj taki ktorego uzywamy na codzien).

Jakby nie patrzec to te technologie sie troche roznia, wiec po co ta roznice zacierac?

0
  1. Interpretery, nie "interpretatory".
  2. Ponieważ ostatnio dużo robię w pythonie, to na jego przykładzie mogę się trochę wypowiedzieć.

W przekonaniu wielu Python to język skryptowy. Zastępuje różne skrypty powłoki systemowej w zadaniach administracyjnych, tak jak Perl.

Inni patrzą na Pythona jak na odpowiednik Javy. W końcu kompiluje się do wykonywalnego bajtkodu i wykorzystywany jest w podobnych zastosowaniach.

Do Pythona jest też moduł zapewniający JIT - psyco. Więc i pod tą kategorię podpada. Co więcej zastosowanie psyco można ograniczyć tylko do wybranych funkcji/metod, podczas gdy pozostała cześć będzie chodzić "normalnie".

Jak więc widać, różnica jest dosyć mglista.

Jeżeli przyjąć, że języki skryptowe to te, które przetwarzają "od razu" kod, czyli nie budują drzewa wywodu a później kodu pośredniego tylko operują od razu po odczytaniu instrukcji to... takich języków próżno by szukać. PHP z tego co wiem również jest analizowany i powstaje język pośredni. On dopiero jest interpretowany. To "prawie" to samo co bajtkod Javy.
Nie jestem, czy nawet języki typu bash są od razu wykonywane, czy jednak jakieś sprawdzanie składni i generowanie kodu pośredniego występuje.

Różnica pomiędzy "zwykłym" interpretowanym a JIT też jak na przykładzie Pythona pokazałem, jest dosyć niejasna, oprócz oczywiście szybkości wykonywania. Zwłaszcza, że często nie ma w ogóle sensu kompilacji niektórych fragmentów kodu. Lepiej mieć mieszankę.

Moim zdaniem takie rozróżnienie jest teraz sztuczne. Zresztą rozróżnienie na język kompilowany a interpretowany jest również sztuczny, choć może bardziej utrwalony przez historię. Bo czy taki BASIC jest językiem interpretowanym, jeżeli istnieje jego kompilator?

0

dorzuce swoje 3 grosze - PHP jest kompilowany w momencie pierwszego otwarcia danego pliku i poki nie wykryje sie zmiany, poty jest wynik kompilacji uzywany :) natomaist co do kategoryzacji, to to jest tak samo jak z budynkami.. masz budynki jedno, dwu, trzypietrowe.. niekt nie mowi ze jedne sa gorsze, inne lepsze. tak wiec masz 'jezyki' (a raczej hm.. platformy) interpretowane, interpretowane z prekompilacja, kompilowane podwojnie (prekompilacja+JIT), i kompilowane.. tak jak budynki - w konkretnych przypadkach uzywa sie danego typu, bo sie bardziej nadaje, ale w innym przypadku bedzie do bani i trzeba wziac inny

0
Dryobates napisał(a)

Nie jestem, czy nawet języki typu bash są od razu wykonywane, czy jednak jakieś sprawdzanie składni i generowanie kodu pośredniego występuje.

Chyba nie bardzo. Tzn. sprawdzana jest chyba składnia aktualnie przetwarzanej linii. Mam np. taki skrypt:

echo "Hello World"
/usr/bin/jakis_program_ktory_wykonuje_sie_kilka_minut
rm -rf /

Uruchamiam go, echo przechodzi szybko, drugie polecenie trwa dlugo (jak wskazuje nazwa). W międzyczasie otwieram ten plik i zmieniam ostatnią linię na: ls -lah /. Po kilku minutach kończy się jakis_program... i widzę listing katalogu /, a nie efakty jego "utylizacji". Gdyby najpierw skrypt był w całości przetwarzany i "kompilowany", po wywołaniu tego skryptu jedyne co mógłbym zrobić to poszukać płytki z ostatnim backupem systemu :), tak mi się przynajmniej wydaje.

0
quetzalcoatl napisał(a)

dorzuce swoje 3 grosze - PHP jest kompilowany w momencie pierwszego otwarcia danego pliku i poki nie wykryje sie zmiany, poty jest wynik kompilacji uzywany :)

ciekawe.. a gdzie zapisuje te pliki ?

0

Domyślnie w TEMP, a jak brak praw to nigdzie, ale istnieje cała gama narzędzi klasy PHP accelerator ze standardowym APC na czele, które umożliwiają konfigurację ścieżek i ustawień oraz dodatkowe mechanizmy optymalizacji cache'owania. Szczegółów nie znam, nie używam takich dodatków.

0

Moze ja jestem za glupi na ta dyskusje ale wszelkie stwierdzenia ,ze nie rozroznienia jezykow na interpretowane i wykonywane sa sztuczne troche do mnie nie dociera. Podam dwa skrajne przyklady : pierwszy do assmebler ,drugi bash. oba jezyki laczy chyba jedynie to ,ze mozna zakodowac je w vi. Asembler najpierw trakwowany jest przez kompilator ,ktory sprawdza skladnie i poprawnosc wywolywania argumantow (szczescie ,ze nie preprocesor) ,a wynikowy program moze byc w formacie .com ,ktory jest praktycznie identyczny z obszarem pamieci ,w ktorej zostaje uruchomiony. Bash z kolei nie tworzy nic, co mozna by bylo przyrownac do kodu maszynowego. jest przenosny ale wolniejszy (sparc,x86,ia64 itp.) mozna uruchamiac programy systemowe ,tak jakbysmy wpisywali do konsoli polecenia. Roznica nie jest historyczna ,a jest najlogiczniejszym podzialem jaki mozna wymyslic. Po prostu (z mojego punktu widzenia: kompilowane kody zrodlowe daja rozkazy zakodowane maszynowo ,a interpretowane sa w biegu ,co doprowadza do sytuacji ,gdzie mozemy zmieniac program ,w trakcie jego dzialania) oczywiscie jezyki typu java ,czy python zacieraja troche granice miedzy przykladami ,ktore ja podalem ale czy np.
wprowadzenie minivanow oznacza ,ze nie mozemy dzielic samochodow na osobowe i ciezarowe?
Moze gadam glupoty ale mnie ubodlo ,ze coraz wiecejprogramistow zajmuje sie narzedziami najnowszymi i nie pamieta jak sie uzywalo asemblera i c++ na skrzyz. Pozdrawiam

0

hmpf tylko ze jezyk kompilowany(taki jak np. C) po skompilowaniu do binarki zawiera rozkazy wykonywane od razu przez procesor, natomiast interpretowany jest tlumaczony do bajtokodu*, ktory nastepnie jest wykonywany przez interpreter, ktory nastepnie zmusza do pracy procesor tak a tak, przy czym bajtokod nie jest jeszcze w pelni zrozumialy dla procesora.

*bledy celowe

0
duce74gosc napisał(a)

kompilowane kody zrodlowe daja rozkazy zakodowane maszynowo ,a interpretowane sa w biegu ,co doprowadza do sytuacji ,gdzie mozemy zmieniac program ,w trakcie jego dzialania)

Assembler też jest interpretowany 'w biegu' przez procesor i również możemy zmieniać program w trakcie jego działania ;]
Trochę zły przykład dałeś.

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