7

Szukam języka programowania, dla którego istnieje kompilator i który obsługuje kod modyfikujący. Słyszałem, że Lisp obsługuje te funkcje, ale zastanawiałem się, czy jest więcej języków C/C++/D-Like z tymi funkcjami.Skompilowany język dynamiczny

Aby wyjaśnić, co mam na myśli:

Chcę mieć możliwość w jakiś sposób dostępu do kodu Programms w czasie wykonywania i stosowania jakichkolwiek zmian do niej, czyli usuwanie poleceń, dodając polecenia, zmieniając im. Jakbym miał AstTree mojego programu. Oczywiście nie mogę mieć tego drzewa w skompilowanym języku, więc musi być zrobione inaczej. Kompilacja musiałaby tłumaczyć komendy samo-modyfikujące na ich binarne równoważne modyfikacje, aby działały w środowisku wykonawczym ze skompilowanym kodem.

ja nie chce być uzależniony od VM, to jest to o co mi chodzi z skompilowany :)

+0

http: //en.wikipedia.org/wiki/Self-modifying_code # High_level_languages ​​ –

+0

Co masz na myśli "samodefiniujący się kod", a co do tego "dynamiczny"? Te dwa nie są zwykle uważane za synonimy. Jeśli możesz wyjaśnić, czego chcesz, prawdopodobnie pomożemy ci lepiej. –

+0

Tak, wcześniej oglądałem stronę wiki, ale liczyłem na inne języki, bardziej podobne do c/C++. – Marenz

Odpowiedz

10

Prawdopodobnie istnieje powód, dla którego Lisp jest taki, jaki jest? Lisp został zaprojektowany do programowania innych języków i do obliczeń z symbolicznymi reprezentacjami kodu i danych. Granica między kodem i danymi już nie istnieje. Wpływa to na projektowanie i wdrażanie języka programowania.

Lisp ma swoje funkcje syntaktyczne do generowania nowego kodu, tłumaczenia tego kodu i jego wykonania. W ten sposób wstępnie przeanalizowany kod wykorzystuje również te same struktury danych (symbole, listy, liczby, znaki, ...), które są używane również w innych programach.

Lisp zna swoje dane w czasie wykonywania - możesz zapytać o wszystko dla swojego typu lub klasy. Klasy to same obiekty, podobnie jak funkcje. Zatem te elementy języka programowania i programów są również pierwszorzędnymi obiektami, mogą być nimi manipulowane. Język dynamiczny nie ma nic wspólnego z "dynamicznym pisaniem".

"Język dynamiczny" oznacza, że ​​elementy języka programowania (na przykład poprzez klasy meta i protokół metaobiektu) oraz program (jego klasy, funkcje, metody, szczeliny, dziedziczenie, ...) mogą być przeglądanym w środowisku wykonawczym i można go modyfikować w czasie wykonywania.

Prawdopodobnie im więcej tych funkcji dodasz do języka, tym bardziej będzie wyglądać jak Lisp. Ponieważ Lisp jest prawie lokalnym maksimum prostego, dynamicznego, programowalnego języka programowania. Jeśli chcesz korzystać z tych funkcji, możesz pomyśleć, jakie cechy Twojego innego języka programowania musisz poddać lub chcesz zrezygnować. Na przykład dla prostego języka kod-jako-danych, cały model składni C może nie być praktyczny.

C-like i "dynamiczny język" może nie być dobrym rozwiązaniem - składnia jest częścią całości obrazu. Ale nawet model składni C ogranicza nas, jak łatwo możemy pracować z dynamicznym językiem.

+0

Dzięki za opracowanie odpowiedzi. Znałem już niektóre jego części, ale wciąż zastanawiałem się, czy byłoby to możliwe z bardziej podobnym do c, i czy ktoś to zrobił. Chyba będę miał dokładniejsze spojrzenie na seplenienie. – Marenz

0

„dynamicznego języka” to szerokie pojęcie, które obejmuje szeroki zakres pojęć. Dynamiczne pisanie jest obsługiwane przez C# 4.0, który jest językiem skompilowanym. Objective-C obsługuje również niektóre funkcje języków dynamicznych. Jednak żadna z nich nie jest nawet bliska Lispowi pod względem wspierania kodu samoczynnie modyfikującego.

Aby wesprzeć taki stopień dynamiki i kod samoczynnie modyfikujący, powinieneś mieć w pełni funkcjonalny kompilator do wywoływania w czasie wykonywania; to właściwie tak naprawdę jest tłumacz.

+0

Niektóre implementacje Lisp nie mają interpreterów jako takich, ale symulują je przez kompilację w locie. Przypuszczam, że to pomaga, gdy masz kod w analizowanym formularzu. –

+0

David: Rzeczywiście. To właśnie miałem na myśli od "... powinieneś mieć w pełni funkcjonalny kompilator do wywoływania w czasie wykonywania". Tłumacz bez problemu udostępnia tę funkcję, podczas gdy w skompilowanym środowisku powinieneś zasadniczo skompilować rzeczy w czasie wykonywania. Niemniej jednak nie przypomina to statycznie skompilowanego kodu. –

1

Możesz rozważyć użycie C++ z LLVM do (głównie) przenośnego generowania kodu. Możesz nawet wciągnąć clang również do pracy w drzewach C (pamiętaj, że clang ma niepełne wsparcie dla C++, ale jest napisane w samym C++)

Na przykład, możesz napisać rdzeń samo-modyfikacji w C++ do interfejs z clang i LLVM, a reszta programu w C. Przechowuj drzewo parse dla głównego programu obok kodu auto-modyfikacji, a następnie manipuluj nim z klangiem w czasie wykonywania. Clang pozwoli ci bezpośrednio manipulować drzewem AST w dowolny sposób, a następnie skompilować go aż do kodu maszynowego.

Należy pamiętać, że manipulowanie AST w skompilowanym języku zawsze będzie oznaczało włączenie kompilatora (lub interpretera) do programu. LLVM jest po prostu łatwą opcją.

+0

Tak, dużo czytałem o LLVM. To bardzo fajny projekt, ale nie to, czego potrzebuję w tym konkretnym pytaniu :) – Marenz

+0

Właściwie to brzmi jak dokładnie to, czego potrzebujesz. W mojej odpowiedzi wyjaśniłem jedno możliwe użycie. – bdonlan

+0

Gdzieś w moim umyśle liczyłem na jakiś sposób bezpośredniego zastosowania takich modyfikacji, bez konieczności ich kompilacji - bezpośrednia manipulacja binarnym kodem. Ale wydaje się to prawie niemożliwe bez powrotu do asemblera. – Marenz

2

C# zawsze pozwalał na samodzielną modyfikację kodu.

  • C# 1 pozwoliło ci w zasadzie tworzyć i kompilować kod w locie.
  • C# 3 dodano "drzewa wyrażeń", które oferowały ograniczony sposób dynamicznego generowania kodu przy użyciu modelu obiektowego i drzewek składni abstrakcyjnej.
  • C# 4 opiera się na tym przez włączenie obsługi "Dynamic Language Runtime". Jest to prawdopodobnie tak bliskie, jak przejście do funkcji podobnych do LISP na platformie .NET w skompilowanym języku.
+1

Reflection.Emit –

+1

, ale nie jest natywnie skompilowany (działa wewnątrz clr). OP nie było jednak jasne. –

+0

To nie musi być prawda. C# kompiluje się do natywnego kodu na niektórych platformach, takich jak iPhone i XBox 360. Jednak nie można używać Reflection.Emit na tych platformach. –

0

Spróbuj groovy. Jest to dynamiczny język oparty na Java-JVM, który jest kompilowany w środowisku wykonawczym. Powinien być w stanie wykonać swój własny kod.

http://groovy.codehaus.org/

przeciwnym razie zawsze dostał Perl, PHP, itp ... ale to nie są, jak sugerujesz, C/C++/D- jak językach.

+0

Perl lub PHP byłoby wystarczające c/C++/d jak, bardziej próbowałem wykluczyć rzeczy takie jak cobol, seplenienie i podobne. Ale nie chcę JIT, naprawdę chcę, żeby był kompletnie skompilowany i wykonał się niezależnie – Marenz

+0

W takim razie zdecydowanie idź z Perlem ... nigdy nie wrócisz. – Lincoln

0

JavaScirpt + V8 (kompilator Chrome JavaScript)

JavaScript jest

  • dynamiczny
  • self-modyfikacji (self-oceny) (no, coś w rodzaju, w zależności od definicji)
  • ma składnię podobną do C (ponownie, w pewnym sensie, najlepiej można uzyskać dynamiczne)

Teraz możesz go skompilować z V8: http://code.google.com/p/v8/

+1

V8 jest skompilowany jako "Just In Time", ale nadal działa na maszynie wirtualnej, a osoba pytająca nie chce tego. –

+1

Oczywiście język samooceny musi działać na kompilatorze JIT lub interpretorze, w przeciwnym razie w jaki sposób może uruchomić dane jako kod? Nie ma czegoś takiego jak 100% prekompilowany język samooceny. –

0

ja nie chce być uzależniony od VM, to jest to o co mi chodzi z skompilowany :)

Jeśli to wszystko którego szukasz, polecam Python lub Ruby. Obydwa mogą działać na własnych maszynach wirtualnych, JVM i .NET CLR. W ten sposób możesz wybrać dowolne środowisko uruchomieniowe. Z tych dwóch, Ruby wydaje się mieć więcej możliwości meta-programowania, ale wydaje się, że Python ma bardziej dojrzałe implementacje na innych platformach.

+0

Miałem na myśli, że nie chcę mieć takiego VMa tego rodzaju. Ruby, java, wszystko to, nie jest skompilowane. Nie chcę tego – Marenz