Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.
Post
#1
|
|
|
Admin Techniczny Grupa: Administratorzy Postów: 2 072 Pomógł: 93 Dołączył: 5.07.2005 |
Na prośbę empathon'a zakładam niniejszy temat (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 634 Pomógł: 14 Dołączył: 27.05.2006 Skąd: Berlin Ostrzeżenie: (0%)
|
Z tego co zauważyłem, nie do końca wszyscy się zgadzają na temat tego co to jest meta-programowanie. Zacznę możne, wiec od przedstawienia mojego rozumowania tego terminu.
Otóż, metaprogramming bierze się z słowa metadata. Wg. wikipedia, metadata to jest "data about data" czyli dane opisujące czym są jakieś dane. Najprostszym przykładem (możne nie tak oczywistym) jest tabela danych w bazie danych. Faktyczne dane są zapisywane w tej tabeli w wierszach i kolumnach, ale dodatkowo dla kazdej tabeli jest opisywane kodowanie znaków, silnik obsługujący te dane, informacje te tak naprawdę w żaden logiczny sposób nie są powiązane z faktycznymi danymi, bo np. jaki się nazywa tabela, jakie jest kodowanie znaków tak naprawdę z logicznego punktu widzenia nie ma nic wspólnego z nazwa użytkownika, z nazwa/ilością produktów itd... ale informacje te są niezbędne do działania systemy gdyż, np. pozwalają dobrać odpowiedni algorytm sortowania, czy np. bez informacji o silniku obsługiwania tej tabeli nie jesteśmy w stanie obsłużyć tych danych. Metaprogramowanie imo, jest to dodawanie dodatkowych informacji o już istniejących strukturach danych, blokach kodu, klasach i/lub innych obiektach (nie chodzi mi o znaczenia tego słowa z perspektywy programowania obiektowego). Przekładając to na programowanie obiektowe (bo nie spotkałem się z pojęciem metaprogramowania w przypadku programowania strukturalnego), jest to dodawanie nowej funkcjonalności, badz tez "wstrzykiwania" jej do już istniejącego kodu bez ingerencji w sama jego strukturę czy tez ciało. ta nowa funkcjonalność to przede wszystkim informacje o przeznaczeniu oraz sposobie obsługi tej klasy/interfejsu itd... tak jak to się ma do tabeli w bazie danych; rodzaj kodowania czy silnik w żaden sposób nie ingerują w sama tabele (mam na myśli to ze nie zmieniają już istniejące dane) ale pomocne są w sytuacji gdy te dane muszą być obsłużone. Osobiście uważam ze metaprogramowanie (dodawanie metadanych do obiektów języka) nie jest osiągalna w 100% tak jak to ma miejsce w językach które maja ta charakterystykę wbudowana w siebie. Przykładem którym się posłużę tutaj jako język obsługujący metadane jest C#. Tam metadane są ucieleśniane poprzez Atrybuty. Atrybuty w języku C# są to klasy którymi można oznaczyć inne klasy i tak naprawdę one są czytane tylko w przypadku kiedy oznaczane klasy sa czytane przez inna część systemu. W większości przypadków jest tak ze te atrybuty oznaczają takie rzeczy jak czy dana klasa jest serializowalna itd... Dam może obszerniejszy przykład stosowania atrybutów w C# i na tym przykładzie pokaże czemu w PHP jest to nieosiągalne. Tworząc nowy web service w C# (WCF) robimy tak: Kod [ServiceContract( Name = "CalculatorService", Namespace = "http://microsoft.wcf.documentation", CallbackContract = typeof(IHelloCallbackContract), SessionMode = SessionMode.Required )] public interface ICalculator { [OperationContractAttribute(IsOneWay=true)] void Add(double n1, double n2); [OperationContract(ProtectionLevel=ProtectionLevel.EncryptAndSign)] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } public class CalculatorService : ICalculator { public void Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } Jak widzimy w tym przykładzie, ta klasa działa w 100% bez załączonych atrybutów (to co jest miedzy [ ]) ale te dodatkowe dane pozwalają na wygenerowanie WSDL tej usługi oraz pozwala usługom hostingowym na doczytanie się dodatkowych informacji niezbędnych do eksponowania tej klasy jako usługę. (jakbym usuną jakiś atrybut OperationContract z powiedzmy metody "multiply" to hostowana usługa by była o ta jedna operacje mniejsza). To co w php nie jest osiągalne to jest parsowanie tych komentarzy i przekładanie ich na już utworzone obiekty/enumeracje (php nie zna enumeracji (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ). Aby moc takowa funkcjonalność zaimplementować w PHP trzeba by było zrobić coś co by parsowało te komentarze i moglo to przekładać na "żywe" obiekty z kodu takie jak klasy, enumeracje itd... mam na myśli obsługę coś w stylu: Kod CallbackContract = typeof(IHelloCallbackContract), SessionMode = SessionMode.Required bo to: Kod Name = "CalculatorService", Namespace = "http://microsoft.wcf.documentation" jest jak najbardziej osiagalne w PHP. Trochę się rozpisałem tak może i bez sensu bo to wszystko jest w necie, ale liczę na to ze ktoś skomentuje to co napisałem i wywiąże sie z tego ciekawa dyskusja (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Czekam i Pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował nasty 9.08.2008, 23:05:51 |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 5 Dołączył: 28.08.2008 Ostrzeżenie: (0%)
|
Z tego co zauważyłem, nie do końca wszyscy się zgadzają na temat tego co to jest meta-programowanie. Zacznę możne, wiec od przedstawienia mojego rozumowania tego terminu. (...) (bo nie spotkałem się z pojęciem metaprogramowania w przypadku programowania strukturalnego) http://wazniak.mimuw.edu.pl/index.php?titl...taprogramowanie -- C++ ale jak najbardziej strukturalnie. Nawet w takim języku (deklaratywnym) jak SQL można używac metaprogramowania, np. łącząc procedury składowane i Dynamic SQL (pierwszy z brzegu przykład: databasejournal/3657506). I nie jest to to samo, co dane (metadane) opisujące tą procedurę składowaną. jest to dodawanie nowej funkcjonalności, badz tez "wstrzykiwania" jej do już istniejącego kodu bez ingerencji w sama jego strukturę czy tez ciało. ta nowa funkcjonalność to przede wszystkim informacje o przeznaczeniu oraz sposobie obsługi tej klasy/interfejsu itd... tak jak to się ma do tabeli w bazie danych; rodzaj kodowania czy silnik w żaden sposób nie ingerują w sama tabele (mam na myśli to ze nie zmieniają już istniejące dane) ale pomocne są w sytuacji gdy te dane muszą być obsłużone. Nie do końca się zgodzę. Skoro metadane to sa "dane opisujące dane" to analogicznie metaprogramowanie powinno byćrozumiane jako "kod (a nie dane!) opisujący (tworzący) kod". Tak samo jak jest logika i metalogika. Osobiście uważam ze metaprogramowanie (dodawanie metadanych do obiektów języka) Właśnie -- czy dodawanie danych (metadanych?) do kodu można nazwać metaprogramowaniem? IMHO -- nie, metaprogramowanie to jest coś więcej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) nie jest osiągalna w 100% tak jak to ma miejsce w językach które maja ta charakterystykę wbudowana w siebie. Przykładem którym się posłużę tutaj jako język obsługujący metadane jest C#. Tam metadane są ucieleśniane poprzez Atrybuty. C++ nie ma wbudowanej obsługi metaprogramowania (w moim rozumieniu) a całkiem dobrze sobie z tym radzi. Jeśli zaś chodzi o atrybuty... zawsze można je emulować za pomocą jakiegoś preprocesora. Tak to jest robione w samym PHP, przy pisaniu rozszerzeń. Dam może obszerniejszy przykład stosowania atrybutów w C# i na tym przykładzie pokaże czemu w PHP jest to nieosiągalne. Tworząc nowy web service w C# (WCF) robimy tak: Przepraszam za mały offtop, ale zawsze mnieśmieszyły te trzyliterowe, dotnetowe akronimy. WPF, WCF, WGF... szkoda, że nie ma WTF (i wcale nie chodzi mi tu o Wielkie Twierdzenie Fermata) (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Apropos kodu wklejonego przez wrzasq... nie wiem jak wydajnościowo, ale może tak lepiej by było?
Pozdrawiam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował szopen 30.08.2008, 12:38:41 |
|
|
|
kwiateusz Metaprogramowanie w PHP 21.05.2008, 16:56:51
LoPMX Czegos takiego nie ma
Zapraszam na http://www.ru... 24.06.2008, 19:04:47
radex_p http://pl.wikipedia.org/wiki/Metaprogramowanie
... 24.06.2008, 19:06:20 
orglee No ja właśnie nie mam pojęcia co to... 25.07.2008, 21:10:00
LoPMX Tzn. ze uwazasz
[PHP] pobierz, plaintext <?ph... 24.06.2008, 19:37:20
Cysiaczek @LoPMX - nie, to jest wykorzystanie możliwości skł... 24.06.2008, 19:42:21
LoPMX @ Cysiaczek : Ale po co podsylasz oczywiste linki?... 24.06.2008, 20:06:48 
Sedziwoj Cytat(LoPMX @ 24.06.2008, 21:06:48 ) ... 30.06.2008, 08:56:19 
michalkjp Cytat(LoPMX @ 24.06.2008, 21:06:48 ) ... 17.10.2008, 11:14:00 
Sedziwoj Cytat(michalkjp @ 17.10.2008, 12:14:0... 17.10.2008, 12:30:47
mike W PHP można bardzo dobrze symulować meta... 24.06.2008, 20:08:33
splatch Jakiś czas temu pisałem o adnotacjach w PHP. Jest ... 2.07.2008, 07:22:11
wrzasq a ja sie zgadzam z LoPMX (nie tylko w tym, ze PHP ... 3.07.2008, 11:41:43
mike ~wrzasq a może zamiast pisać posty w odp... 3.07.2008, 11:48:28
Kocurro Pozwolicie drodzy koledzy, że włączę się w tą dysk... 25.07.2008, 10:37:59
Tubis IMHO Metaprogramowanie jest to uzupełnianie aplika... 26.07.2008, 11:29:42
MajareQ Przepraszam, że nie przeczytałem wszystk... 14.10.2008, 21:07:50
Sedziwoj @MajareQ
Skoro wszytko jest tak proste dla Ciebie,... 15.10.2008, 00:05:17
MajareQ Sedziwoj, nie zrozumiałeś chyba mojej prośby.
Pro... 15.10.2008, 10:38:49
Kocurro Z tego co rozumie to metaprogramowanie to pisanie ... 15.10.2008, 14:06:46
skowron-line @MajareQ tu poczytaj.
http://wazniak.mimuw.edu.pl/... 15.10.2008, 15:05:40
Cysiaczek @ 2 powyższe posty - Proszę nie robić offtopów 17.10.2008, 13:30:03
michalkjp @Cysiaczek
Ok, już nie będę (n... 17.10.2008, 14:16:15
pawkow PHP Jak najbardziej pozwala na metaprogramowanie, ... 20.10.2008, 23:05:13
Sh4dow Nie wiem czy dobrze zrozumiałem dość obszerny post... 21.10.2008, 14:38:22
Spawnm http://pl.wikipedia.org/wiki/Metaprogramowanie
Met... 21.10.2008, 14:48:24
Sedziwoj @Spawnm
Nie do końca o ten sens chodzi w tym temac... 21.10.2008, 15:52:34
bigZbig Jeśli pod pojęciem metaprogramowanie rozumiemy ... 21.10.2008, 17:43:02
bregovic Jako ciekawostka, dzięki funkcjom lambda, od PHP5.... 3.11.2008, 00:52:46 
tuner Cytat(bregovic @ 2.11.2008, 23:52:46 ... 3.11.2008, 12:32:38
bigZbig Wzbogacanie klas o dodatkowe metody jest od dawna ... 19.02.2009, 15:34:40
erix CytatNie moge sie doczekac PHP 5.3 i pierwszego pr... 11.04.2009, 19:42:50
erix Cytatpowiedz mi jak na hostingu umiescic cos poza ... 15.04.2009, 17:15:39
bigZbig Prawdą jest, że porządny hosting udostępnia katalo... 15.04.2009, 20:40:31
Nattfarinn Nie chcę specjalne marudzić, ale czy temat nie tyc... 11.05.2009, 16:16:09
metadetron Nie wiem czy to już metaprogramowanie czy tylko ge... 10.05.2010, 10:47:25
dariuszp Metaprogramowanie. Temat na tyle obszerny i dla mn... 9.09.2010, 23:07:35 ![]() ![]() |
|
Aktualny czas: 4.12.2025 - 15:12 |