Widziałem wiele programów CS i sugestii dotyczących uczenia się dla nowych programistów, którzy wzywają początkującego programistę do studiowania interpretera lisp, który jest specjalnie napisany w lisp. Wszystkie te witryny mówią coś podobnego do „to intelektualna rewelacja”, „jest to oświecenie, które powinien mieć każdy poważny programista” lub „pokazuje relacje sprzętowe / programowe” i inne niejasne stwierdzenia, szczególnie z tego artykułu zaczerpniętego z ten renomowany poradnik .
Ogólne zdanie mojego pytania brzmi: w jaki sposób seplenienie osiąga powyższe cele i dlaczego seplenienie? Dlaczego nie jakiś inny język?
Pytam o to, ponieważ właśnie skończyłem pisać interpreter schematów w schemacie (wzięty z SICP http://mitpress.mit.edu/sicp/ ), a teraz piszę interpretera schematów w schemacie i walczę o to, by legendarne objawienie który ma pochodzić konkretnie z tego pierwszego. Szukam konkretnych szczegółów technicznych między dwoma językami, które mogę wykorzystać w swoich tłumaczach schematów, aby uzyskać zrozumienie na temat działania programów.
Dokładniej:
Dlaczego akcentowanie nauki tłumacza napisanego w języku, który interpretuje, jest tak podkreślone - czy to tylko świetne ćwiczenie umysłowe, aby zachować oryginalny język i język zbudowany, czy też istnieją konkretne problemy, których rozwiązania można znaleźć tylko w naturze Oryginalny język?
W jaki sposób tłumacze lisp demonstrują dobre koncepcje architektury dla przyszłego projektowania oprogramowania?
Czego bym przegapił, gdybym wykonał to ćwiczenie w innym języku, takim jak C ++ lub Java?
Jakie jest najczęściej używane na wynos lub „narzędzie mentalne” z tego ćwiczenia? **
** Wybrałem odpowiedź zrobiłem, bo nie zauważyłem, że zyskały więcej od tego ćwiczenia umiejętności w projektowaniu narzędzi analizowania w głowie niż jakikolwiek inny jednym narzędziu i chciałbym znaleźć różne metody przetwarzania, które mogą działać lepiej dla programu interpreter niż interpreter python.
Odpowiedzi:
Ryzykując odpowiedź „ja też”, jeśli spróbujesz, zobaczysz ...
Jeśli uczysz się języków komputerowych, możesz odnieść wrażenie, że przynajmniej w połowie chodzi o analizę. Jeśli nauczysz się Lisp, zdasz sobie sprawę, że analiza składni powierzchni jest niczym więcej niż wygodą dla ludzi (jak większość z nas), którzy nie lubią wielu irytujących pojedynczych nawiasów.
Wtedy możesz zdać sobie sprawę, że za tę wygodę zapłacono wysoką cenę. W Lisp tworzenie programu i uruchamianie go jest trywialne. W innych językach jest to technika zaawansowana, np. Mnożenie cyframi rzymskimi.
Oczywiście prawie wszyscy pytają „kto musi to zrobić?” Cóż, bardzo dobrze widać, że otwiera całą perspektywę rzeczy, o których nigdy nawet nie zdawałeś sobie sprawy, że nie możesz tego zrobić wcześniej. Możesz to zrobić w innych językach, ale nie tak łatwo.
WSTAWIONO, aby odpowiedzieć na komentarz Izkaty:
... to tylko kilka ...
Wtedy zdajesz sobie sprawę, że niektóre rzeczy, które są dziś uważane za „nowoczesne”, były w Lisp od 40 lat. Jak programowanie funkcjonalne. Jak śmieci. Jak zamknięcia.
Nie oznacza to, że współczesne języki nie mają nowych dobrych pomysłów, takich jak OOP itp. Ale jeśli nauczysz się Lisp, poszerzy to twoją perspektywę.
źródło
You can do it in other languages, but not nearly so easily.
- Lubić? (Wydaje mi się, że pytanie jest takie, ponieważ takie wypowiedzi są często wypowiadane, ale prawie nigdy nie są bardziej szczegółowe)Prostą odpowiedzią na twoje pytanie jest wypróbowanie Lisp, najlepiej w połączeniu z SICP . Wtedy zostaniecie oświeceni.
To mówi...
Kod to dane
Większość języków dokonuje wyraźnego rozróżnienia między kodem a danymi; Lisp nie. Umożliwia to na przykład trywialne pisanie parsera Lisp w Lisp i manipulowanie kodem Lisp w Lisp. Najlepszy opis tego oświecenia, jaki znalazłem, to Natura Lisp .
Jest to częściowo prawdą, ponieważ składnia języka jest tak prosta. Umożliwia Lisp (np. Metaprogramowanie) rzeczy, które w innych językach są niepraktyczne, ponieważ przeszkadza w tym składnia.
Dalsza lektura
Pokonywanie średnich
źródło
Ogólnie rzecz biorąc, studiowanie tłumacza daje wgląd w jego język i funkcje. Ogólnie rzecz biorąc, nauka kodu w języku programowania jest jak ćwiczenie języka mówionego poprzez słuchanie i czytanie: zapoznaje cię z tym, co potrafi ten język, jak jest używany i jakie są typowe „idiomy”. Mówiąc dokładniej, Lisp jest językiem homoiconic, co oznacza, że jego składnia wyrażeń jest taka sama jak składnia danych. Pisanie kodu w Lisp wygląda okropnie, jakbyś spisywał listę i odwrotnie. Zatem interpretacja kodu Lisp za pomocą kodu Lisp jest tak prosta, jak przeglądanie list za pomocą
car
icdr
.Pomyśl o tym, jak interpreter interpretuje siebie - w wielu meta-kołowych implementacjach interpretera (w których interpretuje się język homoiconic) może po prostu „przejść” przez funkcję. Na przykład Aby wdrożyć
car
, wystarczy wziąćcar
argument. Odciąża to mechanizmy przechowywania danych i skupia się na funkcjonalności.Tłumacze ustni mogą być bardzo skomplikowani, co zachęca do dobrej architektury przy ich projektowaniu. Mając to na uwadze, ten jest bardziej zależny od indywidualnego tłumacza.
Te języki nie są homoikoniczne, więc nie korzystają z wdzięku i prostoty meta-okólnego tłumacza Lisp. To sprawia, że ćwiczenie jest trudniejsze i być może mniej powszechne, ale nie powiedziałbym, że jest tak naprawdę mniej korzystne.
Nie jestem pewien, czy mam na to dobrą odpowiedź; po prostu to, że pomaga zobaczyć, jak działa tłumacz, i, co ważniejsze, majstrować przy nim, aby zobaczyć, jak można łatwo wprowadzić niewielkie zmiany w języku.
źródło
Sam LISP ma taką strukturę, że bardzo łatwo go analizować. Jeśli spróbujesz napisać kompilator, zauważysz, że o wiele łatwiej jest, jeśli wszystko w twoim języku jest wyrażeniem i ma niski poziom dwuznaczności. LISP wymusza wszędzie nawiasy, aby wyeliminować dwuznaczności i nie ma żadnych instrukcji, tylko wyrażenia.
Sam fakt, że LISP jest bardzo łatwy do parsowania, zachęca użytkowników do parsowania własnego kodu źródłowego i wykonywania z nim magicznych sztuczek. Granica między danymi a kodem zaciera się i możesz łatwo robić rzeczy, które normalnie wymagają sporo wysiłku, takie jak odbicie, dynamiczne przepisywanie kodu, wtyczki i serializacja.
To jest sedno tego. Ćwiczenie prawdopodobnie ma na celu dać ci wgląd w to, co jest możliwe, gdy kod można łatwo oddzielić od siebie.
źródło
Nie jestem pewien, czy to naprawdę ważne dla wszystkich. Możesz odnieść sukces jako programista, nie wiedząc, jak działa interpreter Lisp. Studiując informatykę, należy jednak nauczyć się podstawowych pomysłów Lisp.
Tłumacze Lisp są ważni dla programistów Lisp. Muszą zrozumieć, jak działa Interpreter ([i kompilator] 1 ), aby w pełni zrozumieć, jak używać języka.
Tłumacz języka Lisp jest często używany jako narzędzie w informatyce, aby nauczyć uczniów kilku rzeczy:
rozumienie zwartej i minimalnej definicji języka poprzez implementację: Alan Kay nazwał to Równaniami oprogramowania Maxwella .
rozumienie programowania na poziomie językowym poprzez zmianę i rozszerzenie tłumacza
rozumienie programowania na poziomie meta i jego wpływu na projekt i użycie języka programowania. Na przykład zrozumienie, co oznacza „cytowanie” i dlaczego jest konieczne
rozumienie interpretacji języka programowania Lisp i jego związku z Rachunkiem Lambda
Jako narzędzie do nauczania pomocny jest tłumacz Lisp, ponieważ można się go nauczyć i zrozumieć w krótkim czasie. Ponieważ niewielu uczniów już wie o Lisp, uczniowie są na poziomie, jeśli chodzi o naukę ponad koncepcjami.
źródło