Czy praktyczna byłaby statycznie wpisana alternatywa dla JavaScript na stronach internetowych?

9

Preferowanie dynamicznego i statycznego pisania jest w dużej mierze kwestią gustu, a różni ludzie uważają, że są mniej lub bardziej odpowiednie w różnych sytuacjach.

Moje pytanie brzmi: czy technicznie możliwe byłoby posiadanie statycznie wpisanej alternatywy dla JavaScript do rozszerzania strony internetowej po stronie klienta itp.?

Armand
źródło
3
Dlaczego nie?
Josh K
2
Czy mówisz o hipotetycznym, statycznie typowanym języku, który każda przeglądarka musiałaby wdrożyć, lub o już istniejących możliwościach?
user281377,
2
Przypuszczam, że można użyć apletów Java.
David Thornley,
@ammoQ ten, o którym wspomniałeś, Hipotetyczny
Armand
@Josh Nie wiem. @David LOL, dzięki za to!
Armand

Odpowiedzi:

22

Z pewnością nie ma technicznego powodu, aby coś takiego nie istniało. Nie ma nic szczególnego w kodzie po stronie klienta, który nakazuje stosowanie dynamicznie pisanych języków.

Grandmaster B.
źródło
1
Dart ma opcjonalne pisanie statyczne, ale kompiluje się do zwykłego Javascript. www.dartlang.com
Nishant George Agrwal
16

Ponieważ jest bardzo mało prawdopodobne, że inny język znajdzie szerokie zastosowanie, najlepszym rozwiązaniem byłoby utworzenie statycznie typowanej wersji JavaScript (tj. Języka zbliżonego do java) i preprocesora, który konwertuje to na normalny JavaScript.

Na przykład skrypt wygląda następująco:

<script type="text/staticjavascript">
   String foobar(int foo, String bar) {
      String result="";
      for (int i=0; i<foo; i++) {
         result += bar;
      }
      return result;
   }
</script>

a preprocesor sprawdza, czy każda zmienna, funkcja, obiekt itp. jest używany poprawnie zgodnie ze swoim typem, i zmienia skrypt na

<script type="text/javascript">
   function foobar(foo, bar) {
      var result="";
      for (var i=0; i<foo; i++) {
         result += bar;
      }
      return result;
   }
</script>

które każda przeglądarka może obsłużyć.

użytkownik 281377
źródło
5
+1 za podejście pragmatyczne
Gary Rowe
Naprawdę to pytanie nie dotyczy pragmatyzmu - dotyczy teorii. Zaktualizuję.
Armand
2
Sugerowałbym również użycie wnioskowania typu.
Oliver Weiler,
Metoda pomocnicza: Bardzo dobra sugestia, ale nie zmieniam teraz mojego przykładu, ponieważ wnioskowanie typu sprawiłoby, że wersja statyczna byłaby bardzo podobna do wersji dynamicznej, ponieważ przykład jest tak prosty.
user281377,
4
Nie sądzę, że statycznie wpisany javascript byłby bardzo zbliżony do java, inny niż składniowy. JavaScript i Java mają wiele różnic poza typowaniem statycznym vs. dynamicznym - na przykład oparte na klasach vs. prototypowe OO. Ponieważ twój przykładowy kod wydaje się być oparty na klasach, twierdzę, że „staticjavascript” jest mylącą nazwą tego języka i raczej należy go nazwać „java po stronie klienta”. +1 za kompilację do javascript (przy okazji Google Web Toolkit kompiluje java do javascript).
sepp2k
8

Moje pytanie brzmi: czy technicznie możliwe byłoby posiadanie statycznie wpisanej alternatywy dla JavaScript do rozszerzania strony internetowej po stronie klienta itp.?

Pewnie. Google Web Toolkit kompiluje statycznie wpisane Javy do JavaScriptu ... Pomyślcie o tym: wszystko piękno i elastyczność Java, z całą wydajność maszyny generowane JavaScript!

Poważnie, możesz to zrobić dla różnych języków, a wiele próbowało (istnieją lub były kompilatory dla C i C #). To, czy wynik końcowy jest praktyczny, czy nie, zależy od tego, co próbujesz osiągnąć: Google szuka spójnej platformy do tworzenia bardzo dużych aplikacji po stronie klienta i ma własny silnik JavaScript do uruchomienia; może się okazać, że przyjęcie takiej bestii do efektów zawisu i dziwne wywołanie AJAX wprowadza znacznie więcej bólu niż po prostu nauka życia z odrobiną niepisanego kodu ...

Shog9
źródło
3
Nie mogę całkowicie powiedzieć, czy żartujesz z „zalet” GWT. Jeśli tak, brawo. Praca z GWT była jednym z najbardziej irytujących doświadczeń w moim życiu.
Nicole,
@Reneesis: Jakby praca z Javascriptem i kompatybilnością przeglądarki nie była już denerwująca? Ale ma zręczne funkcje, takie jak pobieranie wielu obrazów na jednym obrazie, a następnie cięcie ich na kliencie.
Macneil
1
@Macneil Być może już to naprawili, ale kiedy pracowałem ze Spritesem, prawie zanegowało wszystkie korzyści, ponieważ automatycznie zapisało inne właściwości tła CSS, których być może nie chciałeś, więc musiałeś zaśmiecać swój CSS za każdym razem, aby go zastąpić .
Nicole,
6

Większość zalet języków o typie statycznym jest realizowana w czasie kompilacji. Jeśli język będzie interpretowany na kliencie, wówczas wiele z tych korzyści zostanie utraconych. Jeśli skompilujesz je na serwerze, musisz dowiedzieć się, jak je załadować i uruchomić na kliencie (pomyśl formanty ActiveX). Możesz przejść na podejście hybrydowe (skompilować do jakiejś pośredniej postaci tokenizowanej), ale w zasadzie wracasz do apletów Java.

TMN
źródło
2
+1 za wyjaśnienie możliwego powodu, dlaczego nie , a nie tylko odpowiedź, jeśli to możliwe.
4

Już istnieje.

ActionScript 3 (język skryptowy Flasha i Flexa) to dialekt ECMAScript, który implementuje silne typy, i możesz go używać w mniej więcej taki sam sposób po stronie klienta jak JavaScript (z tą różnicą, że AS3 wymaga wtyczki flash, i jest skompilowany). Obecnie osobiście staram się od niego unikać, ale jeśli jesteś w „statycznym” obozie, daj mu wir.

To odpowiada na zasadnicze pytanie, a teraz, kiedy już je mamy, drugie pytanie brzmi: „Czy Flash jest praktyczny?” Odpowiedź brzmi „tak”, z kilkoma „jeśli” i „ale”

  • ... jeśli chcesz ukryć kod z jakiegokolwiek powodu.
  • ... jeśli chcesz mieć bardzo, bardzo (wcześniejszy poziom jQuery) wysoki poziom interaktywności
  • ... ale nawet bez HTML5, kompatybilność między przeglądarkami staje się ostatnio znacznie lepsza.
  • ... ale wkrótce pojawi się HTML5.
  • ... ale jednym z głównych rysunków pisania statycznego / kompilacji (w przeciwieństwie do interpretacji) jest dodatkowa prędkość, na jaką pozwala poprzez optymalizacje (a Flash tak naprawdę nie ma bardzo dobrej prędkości, pomimo systemu typów)
Inaimathi
źródło
AS3 oparty jest na porzuconym ES4.
gsnedders,
3

Teoretycznie możesz umieścić dowolne skrypty na wybranej stronie. W końcu <script>tag ma typeatrybut.

Jedyną barierą jest uzyskanie wystarczającego udziału w rynku pod względem wdrożenia w różnych przeglądarkach, aby warto było z niego korzystać.


Tak, w tym momencie jest to mało prawdopodobne.

Zaraz.
źródło
Więc nie ma problemu z pisaniem statycznym? Nie przejmuję się zbytnio praktycznością tego nadrabiania.
Armand
1
@Aison: Możesz umieścić dowolną treść tekstową w znaczniku skryptu (z jednym wyjątkiem - nie może zawierać sekwencji znaków </script>). Możesz tam wstawić kod Brainf * ck, jeśli naprawdę chcesz. Następnie wystarczy zaimplementować tłumacza dla wybranego języka w przeglądarce, której chcesz używać.
Anon.
@Zaraz. dzięki, bardzo interesujące. Jeśli to takie proste, prawdopodobnie zostało to gdzieś zrobione. Pamiętam <script type="vbscript">dawno temu ...
Armand
Alison: vbscript był przeznaczony tylko dla IE, a niektórzy używali go, gdy udział IE w rynku wynosił> 90%. Dzisiaj, z udziałem IE w rynku wynoszącym około 50%, prawdopodobnie mniej w niektórych częściach świata, jest to poważny zakaz; i dopóki żadna przeglądarka nie uzyska ponownie takiego udziału w rynku, nie spodziewaj się, że wydarzy się nowy język skryptowy po stronie klienta.
user281377,
@Alison: Internet Explorer nadal obsługuje VBScript jako język skryptowy ... Powinienem wiedzieć, że mamy tutaj strony intranetowe, które go używają (i dlatego wymagają Internet Explorera - ugh!)
Dean Harding
2

Czy byłoby to praktyczne? Nie.

Czy to możliwe? Tak!

Opracowanie własnej statycznie wpisanej alternatywy dla JavaScript byłoby w najlepszym razie czasochłonne. W najgorszym przypadku nie byłbyś w stanie przekonać istniejących przeglądarek do wdrożenia języka skryptowego klienta i musiałbyś napisać własny.

Marcie
źródło
Chcesz to wyjaśnić?
back2dos,
Dodano akapit uzupełniający.
Marcie
Dodam tylko, że jedynym powodem, dla którego może to nie być praktyczne, jest obecna sytuacja. Gdybyśmy wrócili do punktu tuż przed wydaniem Javascript, wszystko wyglądałoby inaczej.
yakiv
1

Możesz używać języków takich jak haXe do pisania kodu w sposób statyczny i eksportowania go do javascript. JavaScript staje się bardzo szybki, więc wystarcza jako język wyjściowy. Próba wprowadzenia statycznie wpisanego języka jako standardu internetowego jest prawie niemożliwa. Próby wprowadzenia statycznego pisania do JavaScript nie powiodły się z powodów, dla których warto dyskutować.

back2dos
źródło
1

Czy byłoby to technicznie możliwe? Jeśli ma zostać zaimplementowany w Javie, powiedziałbym „bardzo, bardzo trudny, ale możliwy” bez znaczącej utraty wydajności.

Właściwie piszę teraz statycznie wpisaną DSL w Javie, a jedynym sposobem, w jaki udało mi się uniknąć sprawdzania typu środowiska wykonawczego, jest użycie ogólnych i pomijanie „niesprawdzonych” ostrzeżeń… to znaczy, dopóki nie nadszedł czas na wdrożenie tablice wielowymiarowe (parametry klasy muszą być znane w czasie kompilacji i dlatego są z natury skończone, podczas gdy tablice wielowymiarowe reprezentują nieskończoną liczbę typów ...) Wciąż próbuję to rozgryźć, niestety - jestem pewien, że ja napotkam podobne problemy z klasami zdefiniowanymi przez użytkownika.

Rzecz w tym, że wciąż napotykam tego rodzaju problemy, ale po dłuższym siedzeniu wymyślam dobre rozwiązanie. Tak więc, aby to zrobić i mieć korzyści płynące z wydajności pisania statycznego (bez sprawdzania typu środowiska wykonawczego), powiedziałbym, że jest to niezwykle trudne, ale nie niemożliwe. Pomijając wydajność, powiedziałbym, że trudne, ale bardzo możliwe.

Wiem, że to stare pytanie, pomyślałem, że moje doświadczenie może być dla kogoś cenne.

Philip Guin
źródło
0

Technicznie możliwe jest pisanie skryptów po stronie klienta w dowolnym języku skryptowym obsługiwanym przez klienta użytkownika (przeglądarkę). W praktyce jedynym szeroko obsługiwanym językiem jest JavaScript / ECMAScript. Przekonanie twórców przeglądarek do wdrożenia i obsługi nowego języka na tym etapie raczej nie odniesie sukcesu; dlatego jeśli chcesz użyć nowego statycznie wpisanego języka po stronie klienta, musisz przetłumaczyć nowy język na JavaScript lub zaimplementować dla niego interpreter w JavaScript.

Istnieje kilka projektów, które już robią coś takiego; na przykład Google Web Toolkit , jak wspomniano w jednej z pozostałych odpowiedzi.

mithrandi
źródło
0

Biorąc pod uwagę, że nie masz nadziei, że wszystkie przeglądarki używane w prawdziwym świecie będą obsługiwały nowy język; język będzie musiał się skompilować do jscript.

Ponieważ wszystkie przykłady sieci są w jscript, język powinien wyglądać jak jscript.

Myślę, że istnieje zakres z „podzestawem” jscript, który jest sprawdzany przez statyczny moduł sprawdzający, ale jest także prawidłowym jscript. Na przykład:

  • Wszystkie zmienne muszą mieć komentarz, który mówi, że istnieją typy przed pierwszym użyciem.
  • Wszystkie zastosowania zmiennych muszą być zgodne z powyższym.
  • Funkcje / klasa nie mogą być używane, jeśli nie zostały zadeklarowane w komentarzu #
  • Komentarz na górze pliku js musi zawierać listę wszystkich innych plików js, od których zależy.
Ian
źródło