Czy istnieje język, który transponuje się do C, z lepszą składnią? [Zamknięte]
19
CoffeeScript to język, który transponuje się na JavaScript, z czystą składnią, inspirowaną Ruby. Czy istnieje podobny język, który transponuje się do C, pozwalając na bardziej czytelny kod bez obniżania wydajności? Jeśli nic takiego nie istnieje, czy istnieje dobry powód, aby go nie tworzyć?
Zauważ jednak, że „kompilacja do C” nie jest synonimem „tak szybkiego jak oryginalne programy w C”. Gdy coś kompiluje się w C, często generuje kod raczej (lub całkowicie) odmienny od tego, co normalna osoba napisałaby w C. Może być łatwo znacznie wolniejszy (lub czasem szybszy) niż to, co normalnie piszesz ręcznie.
Jerry Coffin
4
W żadnej z tych odpowiedzi nie podoba mi się to, że proponują zupełnie inne języki, takie jak Vala. Rzeczą w CoffeeScript jest to, że JEST JavaScript, ale z inną składnią.
Naprawdę chciałbym, żeby „transkompilacja” (słowo) po prostu umarła. To „kompiluj” i „kompilator”. Nie potrzebujesz nowego słowa tylko dlatego, że językiem wyjściowym nie jest x86 (a jeśli tak uważasz, nie rozumiesz kompilatorów).
Leushenko
2
Słowo transpile oznacza (lub ostatnio zaczęło oznaczać) tłumaczenie kodu na kod źródłowy innego języka z tą samą semantyką , zwykle instrukcja dla równoważnej instrukcji (umożliwiająca także utworzenie mapy źródłowej). Nikt nie twierdzi, że transpilatory robią coś innego niż kompilatory. Transpilery to specyficzny typ kompilatora.
Carl Smith
Odpowiedzi:
23
CoffeeScript kompiluje się w JavaScript z bardzo prostego powodu, JavaScript jest de facto językiem po stronie klienta i nie byłoby uzasadnione oczekiwać, że dostawcy przeglądarki natywnie obsługują CoffeeScript, gdy wszystko, co oferuje, jest alternatywną składnią.
W bardzo podobny sposób, głównym punktem języka wysokiego poziomu dla tłumaczy C jest natychmiastowa przenośność, ponieważ istnieje kompilator C dla prawie każdej platformy i mnóstwo bibliotek C. Na przykład Vala została zaprojektowana w celu :
budować natywne pliki wykonywalne (za pomocą kompilatora C maszyny),
zautomatyzować liczenie referencji, oraz
wciąż będą dostępne dla programistów GNOME C.
GNOME jest tradycyjnie zorientowanym na C projektem, a GObject jest napisany w języku C, Vala prawdopodobnie nie znalazłaby wiele miłości wśród programistów GNOME, gdyby skompilowała się do kodu maszynowego, bez względu na jego przyjazną naturę (i składnię). Nie wszystkim wydawało się, że ta składnia się podoba, do tego stopnia, że inny język, Genie , został zbudowany, aby go poprawić.
Na przykład w C ++ Facebook opracował HipHop , tłumacz z PHP na C ++. Próbowali rozwiązać bardzo konkretny problem, użycie procesora, bez konieczności wymiany całego kodu PHP i ponownego szkolenia inżynierów (lub, co najgorsze, zastąpienia ich). Jest to o wiele bardziej konkretny przykład, ponieważ problemy ze skalowalnością Facebooka są, cóż, unikalne, i znowu dostęp do pośredniego kodu C ++ może być przydatny, ponieważ rozszerzenia PHP są napisane w C i C ++.
Tłumacz z języka wysokiego poziomu na inny jest dobrym pomysłem, głównie gdy wymagany jest dostęp do kodu pośredniego. W przypadku CoffeeScript kod JavaScript jest konieczny ze względu na szerokie zastosowanie przeglądarki, a w przypadku Vala, Genie i HipHop ze względu na istniejącą bazę kodów. Oczywiście dostęp do kodu pośredniego oznacza, że możesz go dalej optymalizować, jeśli zajdzie taka potrzeba.
Ale ogólnie rzecz biorąc, nie byłoby dobrym pomysłem zbudowanie języka, który tłumaczy się na C lub inny język, jeśli nie używałbyś wynikowego kodu. Jest tak wiele języków, jeśli nie możesz poradzić sobie z C, wybierz inny. Przypadkowo pierwszy kompilator C ++ napisany przez Bjarne Stroustrup, CFront, był C z tłumaczem klas na C, ale było tak głównie dlatego, że jako nowy język nie można było uruchomić C z klasami.
Tak, istnieje wiele języków. C jest częstym celem back-endów kompilatora, ponieważ jest niesamowicie przenośny i mocno zoptymalizowany, chociaż w LLVM nie ma większego sensu.
Kilka implementacji, które znam to:
C ++ (przynajmniej na początku)
GHC Haskell (chociaż głównym generatorem kodu jest C--)
Nie, tylko dlatego, że używa C jako języka pośredniego, nie oznacza, że osiągniesz jego szybkość. Powodem, dla którego C jest szybki, jest metoda pisania kodu, która jest oczywiście inna dla innych języków. To tylko przenośny zestaw, nic specjalnego.
Niektórzy uważają C za „asembler wysokiego poziomu”. Jest dość blisko maszyny, ale oczywiście nie jest to zbiór kodów.
dstromberg,
6
Rock to kompilator ooc, który generuje źródło C99. OOC-lang jest językiem programowania z obiektami, funkcje pierwszej klasy, i różowe jednorożce. OOC jest dynamiczny język i idzie tak daleko. Generuje grubsze i wolniejsze kody c. musisz zmodyfikować więcej, aby spełnić Twoje wymagania. Ale to dobry punkt wyjścia.
czy mógłbyś rozwinąć nieco treść każdego z tych zasobów i dlaczego polecasz je jako odpowiedź na zadane pytanie? „Tylko odpowiedzi” nie są mile widziane na Stack Exchange
gnat
4
OCaml można skompilować do kodu bajtowego, do natywnego kodu, można interpretować wprost, czy można skompilować do C .
czy mógłbyś wyjaśnić więcej na temat tego, co robi i dlaczego polecasz to jako odpowiedź na zadane pytanie? „Tylko odpowiedzi” nie są mile widziane na Stack Exchange
gnat
3
Nie widzę, jak moja odpowiedź jest „odpowiedzią tylko na link”. Właściwie mógłbym usunąć link i nadal byłaby to prawidłowa odpowiedź. Pytanie brzmi: „Czy istnieje język, który robi X”, a moja odpowiedź brzmi: „język Y robi X”. Ten komentarz dotyczy również odpowiedzi Bilijk.
barjak
3
Oryginalny kompilator C ++ Bjarne Stroustropa, „cfront”, skompilował C ++ do C, po czym opcjonalnie uruchomiłby kompilator C w celu wygenerowania kodu obiektowego. C ++ jest tak „nie teoretyczny”, jak to tylko możliwe :-)
Kompilatory-kompilatory uniksowe „yacc” i GNU „Bison” tłumaczą swoje języki wejściowe na C. Napisano z nimi wiele wyrafinowanych systemów.
Odpowiedzi:
CoffeeScript kompiluje się w JavaScript z bardzo prostego powodu, JavaScript jest de facto językiem po stronie klienta i nie byłoby uzasadnione oczekiwać, że dostawcy przeglądarki natywnie obsługują CoffeeScript, gdy wszystko, co oferuje, jest alternatywną składnią.
W bardzo podobny sposób, głównym punktem języka wysokiego poziomu dla tłumaczy C jest natychmiastowa przenośność, ponieważ istnieje kompilator C dla prawie każdej platformy i mnóstwo bibliotek C. Na przykład Vala została zaprojektowana w celu :
GNOME jest tradycyjnie zorientowanym na C projektem, a GObject jest napisany w języku C, Vala prawdopodobnie nie znalazłaby wiele miłości wśród programistów GNOME, gdyby skompilowała się do kodu maszynowego, bez względu na jego przyjazną naturę (i składnię). Nie wszystkim wydawało się, że ta składnia się podoba, do tego stopnia, że inny język, Genie , został zbudowany, aby go poprawić.
Na przykład w C ++ Facebook opracował HipHop , tłumacz z PHP na C ++. Próbowali rozwiązać bardzo konkretny problem, użycie procesora, bez konieczności wymiany całego kodu PHP i ponownego szkolenia inżynierów (lub, co najgorsze, zastąpienia ich). Jest to o wiele bardziej konkretny przykład, ponieważ problemy ze skalowalnością Facebooka są, cóż, unikalne, i znowu dostęp do pośredniego kodu C ++ może być przydatny, ponieważ rozszerzenia PHP są napisane w C i C ++.
Tłumacz z języka wysokiego poziomu na inny jest dobrym pomysłem, głównie gdy wymagany jest dostęp do kodu pośredniego. W przypadku CoffeeScript kod JavaScript jest konieczny ze względu na szerokie zastosowanie przeglądarki, a w przypadku Vala, Genie i HipHop ze względu na istniejącą bazę kodów. Oczywiście dostęp do kodu pośredniego oznacza, że możesz go dalej optymalizować, jeśli zajdzie taka potrzeba.
Ale ogólnie rzecz biorąc, nie byłoby dobrym pomysłem zbudowanie języka, który tłumaczy się na C lub inny język, jeśli nie używałbyś wynikowego kodu. Jest tak wiele języków, jeśli nie możesz poradzić sobie z C, wybierz inny. Przypadkowo pierwszy kompilator C ++ napisany przez Bjarne Stroustrup, CFront, był C z tłumaczem klas na C, ale było tak głównie dlatego, że jako nowy język nie można było uruchomić C z klasami.
źródło
Omówię kilka kwestii, których Yannis Rizos nie udzielił w swojej świetnej odpowiedzi.
Tak, istnieje wiele języków. C jest częstym celem back-endów kompilatora, ponieważ jest niesamowicie przenośny i mocno zoptymalizowany, chociaż w LLVM nie ma większego sensu.
Kilka implementacji, które znam to:
Nie, tylko dlatego, że używa C jako języka pośredniego, nie oznacza, że osiągniesz jego szybkość. Powodem, dla którego C jest szybki, jest metoda pisania kodu, która jest oczywiście inna dla innych języków. To tylko przenośny zestaw, nic specjalnego.
źródło
Rock to kompilator ooc, który generuje źródło C99. OOC-lang jest językiem programowania z obiektami, funkcje pierwszej klasy, i różowe jednorożce. OOC jest dynamiczny język i idzie tak daleko. Generuje grubsze i wolniejsze kody c. musisz zmodyfikować więcej, aby spełnić Twoje wymagania. Ale to dobry punkt wyjścia.
źródło
Vala i Genie to języki, które kompilują się w C. haxe kompilują się w C ++, ale nie jestem pewien, czy tego właśnie chcesz.
źródło
OCaml można skompilować do kodu bajtowego, do natywnego kodu, można interpretować wprost, czy można skompilować do C .
źródło
źródło