2009-11-13 20 views
64

Chcę zacząć czytać kod źródłowy Pythona.Chcę rozpocząć czytanie kodu źródłowego Pythona. Gdzie powinienem zacząć

Moje doświadczenie,

Wiem, Python i Java bardzo dobrze. Znam kilka innych języków na różnych poziomach zaawansowania, ale ani C/C +/szczególnie dobrze. Studiowałem C na studiach, ale nigdy w życiu nie zaprogramowałem go profesjonalnie.

Moje powody, dla których warto przeczytać ten kod.

  1. Dowiedz się, jak Python działa pod maską.
  2. Ucz się C lepiej.

1 jest dla mnie ważniejsze niż 2.

jak mam iść na ten temat?

+8

Świetne pytanie! Nie mogę pomóc, bo tego nie zrobiłem, ale naprawdę będę zwracał uwagę na odpowiedzi :) – AntonioMO

+3

Okropne pytanie! Nie mogę zrozumieć, dlaczego po prostu nie zacząłem czytać źródła Pythona. Czy potrzebujesz linku do źródła? Jakie jest pytanie? –

+4

Np .: Jeśli ktoś zapytał mnie, jak powinienem czytać projekt Django, moja odpowiedź brzmiałaby: Zacznij od urls.py, zobacz, na jakie adresy odpowiada aplikacja/projekt. Następnie spójrz na model, aby zorientować się, jaka jest domena problemu. Teraz spójrz na widoki odpowiadające każdemu adresowi URL ... Chcę uzyskać podobną odpowiedź na jej strukturę. – agiliq

Odpowiedz

34

Zacznij od poznania API Pythona C. Jest to duży i bogaty API, a źródło Python używa go w naturalny sposób wszędzie. Nie dostaniesz się zbyt daleko w kodzie źródłowym Pythona, zanim będziesz musiał zrozumieć, co rozumiemy przez Py_INCREF i tak dalej.

Dałem prezentacji w Pycon wyjaśniając API: A Whirlwind Excursion through Python C Extensions, które mogą okazać się pomocne. Rozszerzenia C używają tego samego API co sam kod Pythona.

+2

+1 dla C API: jest tak wiele możliwości dodania baterii do Pythona, nie jest to zabawne. –

+1

Świetna prezentacja, bardzo pouczające. – mjgpy3

+0

Podany link był bardzo użyteczny. Dzięki. – Neil

5

Pytanie jest dość szerokie, więc myślę, że najlepszą odpowiedzią jest po prostu pobranie python source i odejść. Wybierz moduł lub sekcję pytona, którą dobrze znasz i sprawdź, co jest pod maską.

+1

+1 - LOL na "and go nuts" .. :) – Thiyagaraj

+0

Dodałem komentarz do oryginalnego pytania, które pomoże mi "odejść" .. – agiliq

+0

Porównujesz swoją sytuację z kimś, kto chce dostać się do źródła django, oświadczasz, że należy zacząć od spojrzenia na "urls.py". Czemu? Bo to jest najważniejsze? Nie zgadzam się, myślę, że powinieneś zacząć od modułu, który dobrze znasz, aby lepiej wyciągnąć wnioski o tym, jaki wynik (i jak) generują algorytmy pod maską. – Mizipzor

19

Po pierwsze, jeśli interesujesz się głównie 1, zacznę od czytania źródła różnych modułów Pythona (i nie przeskakuję bezpośrednio do C). Kiedy tylko odkryłem, że czytam źródło niektórych modułów, zawsze nauczyłem się nowych rzeczy o programowaniu w Pythonie.

Po drugie, jeśli starasz się lepiej nauczyć C, osobiście zaproponowałbym coś zupełnie innego: zaprogramuj w nim. Po prostu statyczne odczytanie kodu źródłowego to , a nie sprawi, że lepiej zrozumiesz C (a przynajmniej jest to ograniczone podejście, może ci to trochę poprawić, ale jest tylko tyle, że źródło czytania cię przyniesie).

Po zaprogramowaniu co najmniej średniej wielkości projektu w C, , następnie, zacznę szukać źródła Pythona. To naprawdę jedyny sposób, aby lepiej poznać C, i naprawdę myślę, że czytanie źródła C Pythona bez znajomości C nie da ci daleko.

Pomysł na projekt C

W rzeczywistości, oto pomysł na projekt C: napisać interpreter Pythona w C. Oczywiście nie będzie nawet blisko zakończenia, a to jest dość ciężki projekt, ale jeśli skupisz się tylko na niektórych częściach języka, myślę, że to dobry pomysł.

Nie tylko to pomoże Ci nauczyć C, to pomoże Ci zrozumieć Python dużo lepiej nawet przed patrząc na źródła: musisz mieć głębsze rozumienie partii rzeczy w Pythonie, zrozumiesz kompromisy projektowe w działaniu Pythona, itp.

Kiedy wreszcie przeczytasz kod Pythona, nie tylko zrozumiesz, dlaczego niektóre rzeczy działają w ten sposób, ale prawdopodobnie nauczysz się bardzo fajnie C technik, które rozwiązują problemy, które miałeś.

13

1) Najpierw upewnij się, że możesz zbudować własny Python i uruchomić go w debugerze. Dzięki temu można nie tylko dodawać wyrażenia drukowania, ale także łamać je w punktach i śledzić przepływ kodu. Jeśli masz narzędzia, które umożliwiają śledzenie wywołań funkcji, są idealne, będziesz go potrzebować.

2) Zacznij od pliku implementującego typy danych. Są bardzo łatwe do zrozumienia i poprawiają umiejętności językowe w języku C podczas czytania kodu.

3) Twórz schematy UML - pomocne mogą być proste narzędzia pomocnicze do rysowania, takie jak Argo UML lub MS Visio. Zapisz przepływ kodu.

4) Przeczytaj kod startowy dla Pythona. Zobacz, jak i jak inicjowana jest podstawowa infrastruktura.

6) Ty zrozumieć stronę w języku Python 100% - nawet trudniejsze szczegóły implementacji, co to jest AST i jakie są powiązane i niezwiązane metody i jak je wdrożyć. Kiedy masz na myśli model, w jaki sposób napisałbyś interpretera python, możesz przejść do ostatniego etapu mistrzowskiego.

7) Napisz rozszerzenie debuggera za pomocą dostarczonego szybkiego interfejsu API C debuggera. Pomaga to poprawić umiejętności C.

8) Wykonaj ostatni krok główny i zanurkuj w samo serce kodu tłumacza. Jest to nawet trudne do odczytania i zrozumiałe dla dobrze wyszkolonego programisty C. Przeczytaj, w jaki sposób wyrażeń są oceny i metoda wyszukiwania są buforowane, ramki są skonfigurowane dla zasad ustalania zakresu itp. Jest to trudne i złożone - pod względem złożoności i linii kodu.

9) Uruchom Adobe Photoshop i stwórz ładny "Master of Python" i umieść go na ścianie biura.

+1

Czy możesz mi powiedzieć, jak uruchomić go w debugerze? – satoru

10

Pobierz source ze strony internetowej Python. Powiedzmy, że rozpakowałeś źródło do katalogu o nazwie Python-3.1.1. Proponuję ci dwa punkty startowe kodem źródłowym Pythona, które pomogą zbadać jak Python pracuje pod maską:

  • zbadać, w jaki sposób Python Virtual Machine wykonuje kodu bajtowego wygenerowany z interperter. Maszyna wirtualna Python znajduje się w pliku o nazwie Python-3.1.1/Python/ceval.c. Rdzeniem VM jest pętla eval, która zaczyna się od funkcji PyEval_EvalFrameEx in ceval.c. Przeczytaj komentarze źródłowe i wbudowane. Jestem pewien, że ci się spodoba.

  • Inną opcją jest sprawdzenie, w jaki sposób wbudowane są typy danych python, takie jak listy, słowniki i zestawy. Na przykład zestawy są implementowane w Python-3.1.1/Objects/setobject.c. Katalog Objects zawiera również implementacje innych typów danych.

+0

Wszelkie informacje są przydatnymi informacjami. Dzięki, czy możesz podać więcej wskazówek, aby zacząć? – Neil

Powiązane problemy