Jeśli coś można wygenerować, to chodzi o dane, a nie kod.
Ponieważ później określasz, że kodem są dane, twoja propozycja ogranicza się do „Jeśli coś można wygenerować, to nie jest to kod”. Czy powiedziałbyś zatem, że kod asemblera wygenerowany przez kompilator C nie jest kodem? Co się stanie, jeśli zdarzy się, że dokładnie pokrywa się z kodem asemblera, który piszę ręcznie? Możesz tam pójść, jeśli chcesz, ale nie przyjdę z tobą.
Zamiast tego zacznijmy od definicji „kodu”. Nie wymagając zbyt technicznej wiedzy, całkiem dobrą definicją do celów tej dyskusji byłyby „instrukcje uruchamiane maszynowo do wykonywania obliczeń”.
Biorąc to pod uwagę, czy ten cały pomysł generowania kodu źródłowego nie jest nieporozumieniem?
Cóż, twoja początkowa propozycja jest taka, że kodu nie można wygenerować, ale odrzucam tę propozycję. Jeśli zaakceptujesz moją definicję „kodu”, nie powinno być problemu koncepcyjnego z generowaniem kodu w ogóle.
To znaczy, jeśli istnieje jakiś generator kodu, to dlaczego nie uczynić tego czymś właściwym, które może otrzymać wymagane parametry i wykonać właściwe działanie, które wykonałby kod „wygenerowany”?
Cóż, to zupełnie inne pytanie o powód zastosowania generowania kodu, a nie o jego naturze. Proponujesz alternatywę, w której zamiast pisać lub używać generatora kodu, pisze się funkcję, która oblicza wynik bezpośrednio. Ale w jakim języku? Dawno minęły czasy, kiedy ktoś pisał bezpośrednio w kodzie maszynowym, a jeśli piszesz swój kod w innym języku, polegasz na generatorze kodu w postaci kompilatora i / lub asemblera, aby stworzyć program, który faktycznie działa.
Dlaczego więc wolisz pisać w Javie, C, Lisp lub czymkolwiek innym? Nawet asembler? Twierdzę, że przynajmniej częściowo dlatego, że te języki zapewniają abstrakcje danych i operacji, które ułatwiają wyrażenie szczegółów obliczeń, które chcesz wykonać.
To samo dotyczy większości generatorów kodu wyższego poziomu. Prototypowe przypadki to prawdopodobnie generatory skanerów i analizatorów składni, takie jak lex
i yacc
. Tak, możesz napisać skaner i analizator składni bezpośrednio w C lub w innym wybranym przez siebie języku programowania (nawet w surowym kodzie maszynowym), a czasem tak jest. Jednak w przypadku problemu o znacznej złożoności użycie języka specjalnego, wyższego poziomu, takiego jak lex lub yacc, ułatwia pisanie, czytanie i utrzymywanie odręcznego kodu. Zwykle też znacznie mniejszy.
Powinieneś także rozważyć, co dokładnie rozumiesz przez „generator kodu”. Rozważałbym wstępne przetwarzanie C i tworzenie szablonów C ++ jako ćwiczenia w generowaniu kodu; sprzeciwiasz się tym? Jeśli nie, to myślę, że musisz wykonać gimnastykę umysłową, aby zracjonalizować akceptację tych, ale odrzucając inne smaki generowania kodu.
Jeśli robi się to ze względu na wydajność, brzmi to jak wada kompilatora.
Dlaczego? Zasadniczo zakładasz, że należy mieć uniwersalny program, do którego użytkownik podaje dane, niektóre sklasyfikowane jako „instrukcje”, a inne jako „dane wejściowe”, i które kontynuują obliczenia i emitują więcej danych, które nazywamy „danymi wyjściowymi”. (Z pewnego punktu widzenia taki uniwersalny program można nazwać „systemem operacyjnym”.) Ale dlaczego przypuszczasz, że kompilator powinien być tak samo skuteczny w optymalizacji takiego programu ogólnego, jak w optymalizacji bardziej wyspecjalizowanego programu? program? Oba programy mają różne cechy i różne możliwości.
Jeśli robi się to w celu połączenia dwóch języków, brzmi to jak brak biblioteki interfejsów.
Mówisz, że tak jakby posiadanie uniwersalnej do pewnego stopnia biblioteki interfejsu byłoby z pewnością dobrą rzeczą. Być może tak, ale w wielu przypadkach taka biblioteka byłaby duża i trudna do napisania i utrzymania, a może nawet powolna. A jeśli taka bestia w rzeczywistości nie istnieje, aby obsłużyć konkretny problem, to kim jesteś, aby nalegać, aby została stworzona, gdy podejście do generowania kodu może rozwiązać problem znacznie szybciej i łatwiej?
Czy coś mi umyka?
Myślę, że kilka rzeczy.
Wiem, że kod to także dane. Nie rozumiem tylko, po co generować kod źródłowy? Dlaczego nie przekształcić go w funkcję, która akceptuje parametry i działa na nie?
Generatory kodu przekształcają kod napisany w jednym języku na kod w innym, zwykle niższym poziomie. Pytasz zatem, dlaczego ludzie chcieliby pisać programy w wielu językach, a zwłaszcza dlaczego mogliby mieszać języki subiektywnie różnych poziomów.
Ale już tego dotknąłem. Wybiera się język dla konkretnego zadania, częściowo po to, by był on klarowny i wyrazisty dla tego zadania. Ponieważ mniejszy kod ma średnio mniej błędów i jest łatwiejszy w utrzymaniu, istnieje również tendencja do języków wyższego poziomu, przynajmniej w przypadku pracy na dużą skalę. Ale złożony program obejmuje wiele zadań i często niektóre z nich można skuteczniej rozwiązać w jednym języku, podczas gdy inne można skuteczniej lub bardziej zwięźle rozwiązać w innym języku. Użycie odpowiedniego narzędzia do pracy czasami oznacza zastosowanie generowania kodu.