W 2014 roku powiedziałbym, że Python. W 2017 roku całym sercem wierzę, że językiem nauczania studentów jest Julia.
Nauczanie zawsze dotyczy kompromisu. Z jednej strony chcesz wybrać coś, co jest na tyle proste, że łatwo je uchwycić. Ale po drugie, chcesz nauczyć czegoś, co pozostanie mocą, tj. Czegoś, co może rosnąć razem z tobą. Wspólne języki dynamiczne (Python / MATLAB / R) z łatwością mieszczą się w kategorii 1 ze względu na ich nieistniejący kod na płycie głównej oraz łatwość otwierania interpretera i wyrzucania kodu, podczas gdy C / C ++ / Fortran należą do drugiej kategorii jako języki, w których napisano podstawowe, wysoce wydajne oprogramowanie dzisiejszego świata.
Ale są problemy z używaniem języka, który nie w pełni uwzględnia drugą kategorię. Korzystając z języka takiego jak Python, dobrze oddziela rzeczy takie jak przepełnienie typów i liczb całkowitych. Przydaje się to w nauczaniu informatyki w pierwszym semestrze, ale ponieważ chcesz głębiej i głębiej zrozumieć, jak rzeczy naprawdę działają, język Pythona jest zbyt daleko od abstrakcji od podstawowego metalu, aby być dobrym narzędziem do nauczania. Ale C / C ++ / Fortran (lub Java ... Najpierw nauczyłem się Java ...) wszystkie mają tak duży koszt uruchomienia, że najtrudniejszą rzeczą do nauczenia jest po prostu konfigurowanie i main
kompilowanie nagłówków , co odwraca uwagę od faktycznej nauki programowania .
Wejdź do Julii. Kiedy po raz pierwszy używasz Julii, możesz wyodrębnić całą ideę typów i używać jej tak jak MATLAB lub Python. Ale jeśli chcesz dowiedzieć się więcej, w języku znajduje się „królicza dziura”. Ponieważ tak naprawdę jest to warstwa abstrakcji oparta na systemie typów + wielokrotne wysyłanie w LLVM, jest to w zasadzie „łatwy sposób na pisanie statycznie skompilowanego kodu” (a funkcje stabilne na typ można faktycznie skompilować statycznie). Oznacza to, że szczegóły C / C ++ są również dostępne. Możesz nauczyć się, jak pisać proste pętle i funkcje bez kodu bojlera, a następnie zagłębiać się we wskaźniki funkcji. Funkcje metaprogramowania Julii umożliwiają bezpośredni dostęp do AST, a istnieją makra, które pokazują każdą część łańcucha kompilacji. Ponadto, jako Lisp, jest podatny na funkcjonalne style programowania. I ma wiele możliwości przetwarzania równoległego. Pomysły takie jak pisanie parametryczne i stabilność tekstu są dość wyjątkowe i głęboko zakorzenione w Julii.
Jeśli chcesz samodzielnie uczyć się języków programowania, możesz nauczyć się, jak działa kompilacja, używając, @code_lowered
aby zobaczyć, co to jest obniżanie, zobaczyć typ-AST z @code_typed
, zobaczyć LLVM IR z @code_llvm
, a na końcu natywny kod asemblera z @code_native
. Można to wykorzystać, aby pokazać, jaki jest koszt zmiennych dynamicznych i dokładnie, jak działa „boksowanie zmiennych”, a ten post na blogu pokazuje, w jaki sposób można wykorzystać te narzędzia introspekcji do nauczenia, jak mogą / nie mogą wystąpić optymalizacje kompilatora.
Do odkrycia są nie tylko pomysły z zakresu informatyki i inżynierii oprogramowania, ale także bogate pomysły matematyczne. Ponieważ główne biblioteki Julii są pisane z myślą o typowym pisaniu, trywialne jest tworzenie operatorów bez macierzy i używanie IterativeSolvers.jl do wykonywania GMRES przy ich użyciu. Możesz użyć narzędzi introspekcji, takich jak @which
pokazanie, w jaki sposób wszystko zostało zaimplementowane. Na przykład, jak \
działa?
@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805
To prowadzi mnie prosto do definicji \ . Jest zaimplementowany w Julii, więc ktoś, kto zna Julię, może następnie nauczyć się algorytmu i jego działania poprzez identyfikację podtypów macierzy i specjalizację, gdy to możliwe (wracając do eliminacji Gaussa). Ponieważ kod Julii ma licencję MIT (a prawie wszystkie pakiety mają licencję MIT), uczniowie mogą swobodnie korzystać z tych pomysłów we własnym kodzie (z atrybutami) (gdy kod ma licencję GPL, jak ma to miejsce w przypadku większości pakietów MATLAB i R, muszą uważać na problemy z licencjonowaniem!).
Ponieważ rdzeń językowy jest zbudowany z bardzo aktywnej społeczności open source, istnieje również bogate źródło informacji o historii rozwoju języka: jego problemy z Github . Zrozumienie pytań językowych, np. Czym tak naprawdę jest transpozycja macierzy? może być bardzo pouczające dla bardziej szczegółowego zrozumienia tych obiektów matematycznych.
Ale w końcu chcesz nauczyć swoich uczniów, jak tworzyć. Niestety, nauka języka Python lub R niekoniecznie oznacza, że masz wszystko, czego potrzeba, aby „opracować język Python / R”, ponieważ większość szeroko używanych i dobrze zoptymalizowanych pakietów zawiera znaczną ilość kodu C / C ++ / Fortran w kolejności uzyskać wydajność. Tak więc, aby ci uczniowie mogli wnieść wkład w ekosystemy naukowe dla tych języków, w końcu będą musieli nauczyć się innego języka w pewnym momencie. Chociaż nie jest to do końca okropne, jest już nieoptymalne, skoro Julia istnieje. Ponieważ Julia ze stabilną czcionką jest w stanie osiągnąć prędkość C / Fortran, większość pakietów w ekosystemie Julii to czysty kod Julii. Uczenie się Julii oznacza, że nauczyłeś się rozwijać Julię. A ponieważ Base Julia to także głównie kod Julii (tylko kilka prymitywów, a parser nie jest),
To powiedziawszy, istnieją pewne wady wyboru Julii. Po pierwsze, jest znacznie nowszy niż te inne języki, a więc jest nieco mniej zasobów. Będziesz musiał wymyślić wiele narzędzi do nauczania na własną rękę lub skorzystać z zasobów internetowych wymienionych na stronie internetowej Julii . Ponadto szczegóły dotyczące języka nie są do końca ustalone, chociaż wkrótce pojawi się 1.0 (do końca 2017 r.). Jest również całkiem prawdopodobne, że Ty, potencjalny nauczyciel kursu w Julii, sam nie będziesz miał tak dużego doświadczenia z językiem. Są to jednak problemy, które z czasem ustępują, podczas gdy korzyści Julii, o których wspomniałem powyżej, są znacznie bardziej istotne dla samych języków.