Jakich języków programowania powinien uczyć każdy student informatyki?

13

Jakich języków (lub klas (jak w paradygmatach) języków programowania oraz zalecanego języka tej klasy) powinien uczyć każdy student informatyki na studiach według ciebie? Motywuj swoje odpowiedzi; dlaczego ten język Jakie będzie z tego zastosowanie? Jakie pojęcia uczy (lepiej niż język X)?

Uwaga / objaśnienie : To pytanie dotyczy informatyki z naciskiem na inżynierię oprogramowania, a nie czysto informatyki. Nadal skupia się na edukacji informatycznej, a nie na inżynierii oprogramowania.

Anto
źródło
13
Kod Psuedo powinien wystarczyć dla CS.
Jé Queue
12
@Xepoch - nie zgadzam się. Nie jest szczególnie naturalne wyrażanie chętnej kontra leniwej semantyki oceny, kowariancji / kontrawariancji w podpisach typów, teorii kategorii itp. Za pomocą pseudokodu. Pseudo-kod świetnie nadaje się do opisywania algorytmów i struktur danych, ale CS ma o wiele więcej do zaoferowania.
Aidan Cully
6
Co więcej, zdecydowana większość studentów CS ma nadzieję, że po ukończeniu studiów dostanie pracę nieakademicką. Pseudokod nie będzie wiele wart na konkurencyjnym rynku pracy. Nie sądzę, że dyplom z CS powinien być przede wszystkim szkoleniem zawodowym, ale musi zapewnić pewne zakwaterowanie w tym kierunku.
Adam Crossland
2
Z NIMI . Jeśli czas jest ograniczony, zacznij od liter alfabetu. A +, B, C, C #, D, E, F #, J, K, Q, R, T ... Właściwie to nie jest zła lista.
Jesse Millikan
6
Gratulujemy odkrycia kolejnej wersji „Jaki język?” pytanie. Nie mogę się doczekać, aby przeczytać wszystkie opinie. Nie zapomnij odniesienia do SICP. Och, czekaj, oto jest.
Corbin Marzec

Odpowiedzi:

21

Przedstawię listę:

  • Asemblacja (stosunkowo prosty dialekt): Ważne jest, aby zrozumieć przynajmniej trochę podstaw
  • C: Język proceduralny, używany w wielu miejscach. Nie obciąża jednocześnie nowych studentów, takich jak OOD.
  • Java / C # / Eiffel / C ++: Coś zorientowanego obiektowo jest dobre, każdy z nich osiągnąłby cel nauczania uczniów OOD, a kiedy zrozumie jeden z tych języków, powinien umieć uczyć się innych. Jest ich wiele dobrych języków, wymieniłem Eiffla, ponieważ ma on również projekt zgodnie z umową.
  • LISP i Prolog: Uczą studentów zupełnie nowego sposobu myślenia, który jest ważny, nawet jeśli nigdy nie używają żadnego z nich „w prawdziwym świecie”.
  • SQL i XML: wprowadza nowe sposoby myślenia o danych oraz sposobu ich odzyskiwania i zarządzania.

Studenci powinni być narażeni co najmniej na wszystkie te paradygmaty . Nie tylko jeden czy dwa.

Podejrzewam, że wiele osób sugeruje Pythonowi pokrycie stylu proceduralnego, stylu OOP i może innych, ale nie mam wystarczającego osobistego doświadczenia z Pythonem, aby móc go pewnie polecić.

FrustratedWithFormsDesigner
źródło
Naprawdę chciałbym, żeby moja szkoła bardziej szczegółowo opisała XML i SQL, mieliśmy jedną klasę, która była w obu i była to terribad.
dodałbym nowoczesne dynamiczne języki, takie jak Lua, Python, JavaScript itp.
Javier
4
ah, również niektóre hardcorowe funkcje, takie jak haskell i erlang, są bardzo edukacyjne
Javier
1
+1 za wystawienie SQL. Przynajmniej myślisz o algebrze relacyjnej.
Jé Queue
1
Oddzieliłbym także zarządzany od niezarządzanego OO, C ++ i Java. Chociaż nigdy nie używałem C ++ od czasu uni bez wiedzy o malloc, stercie i stosie, nigdy nie będziesz tak dobrze rozumieć OO.
markmnl
45

Osobiście wydaje mi się trochę smutne, że języków funkcjonalnych nie uczy się tak często, jak kiedyś. Uważam, że przynajmniej studenci nauk ścisłych powinni być narażeni na język ze wszystkich głównych paradygmatów: proceduralnego, obiektowego, funkcjonalnego i dynamicznego.

Michael Brown
źródło
2
+1 Moja klasa języków programowania była z pewnością najcenniejszą klasą, jaką wziąłem.
HappyCodeMonkey
1
Jako student informatyki zdecydowanie się zgadzam. Mam tę zaletę, że pracuję w pełnym wymiarze czasu w prawdziwym świecie, kiedy chodzę do szkoły jako programista aplikacji internetowych na poziomie młodszym, ale wydaje mi się, że nawet gdybym poszedł z pełnym dyplomem CS, brakowałoby mi dużo informacji o różnych paradygmaty.
Ken
1
Nieco powiązane: youtube.com/watch?v=Ps8jOj7diA0 Stanford ma na YouTube swoje pełne wykłady dotyczące paradygmatów programowania 2008.
Inaimathi
4
Dodaj deklaratywny do listy (Prolog). Również niektóre języki są jawnie równoległe (Occam). Uczenie studentów, jak działa paralelizm, byłoby dobre (nikt nie rozumie tego poprawnie).
Martin York
1
@Martin York: Prolog to logiczny język programowania, który jest rodzajem języka deklaratywnego. (Wspominam o tym, ponieważ funkcjonalne języki programowania są również deklaratywne, ogólnie mówiąc.)
mipadi
33

Myślę, że dobrze wyważony student CS powinien nauczyć się języka w każdym z 4 typów języków programowania:

Funkcjonalny - Lisp / Haskell / PostScript. Nie mam dużego doświadczenia z Haskellem, ale słyszałem innych programistów, którzy się tym zachwycają. Zrozumienie konstrukcji programowania funkcjonalnego i tego, dlaczego są przydatne w wielu sytuacjach, pomoże programiście lepiej organizować algorytmy również w innych językach.

Zorientowany obiektowo - wybierz coś dla siebie. C # / Java / Python / Ruby / yadda yadda yadda. Tego typu należy nauczyć tylko dlatego, że tego właśnie chce współczesny biznes.

Tryb rozkazujący - C / Fortran / Pascal. Są one obecnie mniej powszechne, ale nadal należy się ich uczyć z praktycznej / historycznej perspektywy. Stosowane przez nich metody są nadal praktyczne, ponieważ w każdym języku wszystko sprowadza się do instrukcji. Języki rozkazujące są bardzo dobre w sporządzaniu list i przestrzeganiu instrukcji.

Logiczne - ProLog. Nigdy nie znalazłem dobrego praktycznego zastosowania dla żadnego z tych języków, ale znalazłem kilka koncepcji kryjących się za językami logicznymi, gdy próbowałem wymyślić, jak napisać niektóre z moich metod w językach bardziej zorientowanych obiektowo. Podczas studiów nie byłem w stanie skupić się zbyt długo na logicznych językach i myślę, że silniejsze skupienie się na tym mogło mi w tym pomóc.

Joel Etherton
źródło
6
Możesz dodać prototypowy do tej listy - na przykład JavaScript.
stusmith
@stusmith - Prototypical jest wart wzmianki, ale tak naprawdę jest podzbiorem języków zorientowanych obiektowo, a javascript jest w najlepszym wypadku ograniczonym przykładem. Uważałbym to za zadanie domowe na kursie języków programowania, ale nie na specjalizację.
Joel Etherton
1
+1 dla Prologu. Widziałem jego praktyczne zastosowanie i regularnie używam do prototypowania algorytmów.
Fred Foo
@larsmans - Chciałbym usłyszeć o twoim użyciu. Nie dotknąłem tego od kilku lat, więc jestem rozmyślany o dobrych praktycznych zastosowaniach. Czy masz linki do oficjalnych artykułów lub podobnych artykułów?
Joel Etherton
Sprawdź ECLiPSe ( eclipseclp.org ), dialekt Prolog open source używany przemysłowo przez kilka dużych europejskich firm (np. Francuska firma kolejowa SNCF, jeśli dobrze pamiętam; spróbuję znaleźć referencję).
Fred Foo
6

Najważniejszym językiem, który powinien znać każdy absolwent CS-dur, jest ten, który maksymalizuje potencjał do znalezienia świetnej pracy. Z czasem to się zmieni, zmieni się na podstawie indywidualnej definicji świetnej pracy i będzie się różnić w zależności od regionu geograficznego.

Na razie powiem, że angielski jest językiem nr 1, który powinien znać każdy kierowca CS (to oczywiście zależy od regionu).

oosterwal
źródło
Świetna robota to efekt uboczny stopnia CS. Stopień CS jest właśnie do tego, znajomość teorii obliczeniowej. Mogłem z łatwością uzyskać lepszą pracę w szkolnictwie zawodowym, niż walić się z matematyką i CS przez te wszystkie lata.
Jé Queue
2
+1 za angielski. Języki komputerowe są szczegółami implementacji.
Wyatt Barnett,
+1. Jeśli ktoś może nauczyć się angielskiego dobrze, może dobrze nauczyć się instrukcji. Znałem dobrze angielski. Nie miałem problemu z nauką jakiegokolwiek języka.
Shiplu Mokaddim
4

Myślę, że to zmienia się z czasem, ale idealnie - 3 języki z 3 bardzo różnych perspektyw. Za moich czasów było to proceduralne, OO i funkcjonalne - Pascal, C ++ i LISP. Nie jestem aż tak sprzedany, szczególnie tym trzem. Ale kiedy przeprowadzam wywiad, szukam:

  • Pewien poziom doświadczenia z językiem, w którym musisz zwracać uwagę na zarządzanie pamięcią (C / C ++ i wiele innych)
  • Pewien poziom doświadczenia z językiem zorientowanym obiektowo, z oczekiwaniami dotyczącymi użycia API i różnych dostępnych abstrakcji (C ++ / Java)
  • Język „rozciągliwy” - coś dziwnego, trudnego i wymagającego. Nie zamierzam zatrudnić, ponieważ ktoś zna LISP, asembler lub jakiś inny trudny język, ale chcę zobaczyć, że inżynier stanął przed jakimś wyzwaniem, które wiązało się z poważnym rozwiązywaniem problemów i mnóstwem „co to do cholery jest?” chwile.

Jako kolejna branża - myślę, że programy CS muszą szkolić studentów w zakresie znanych języków na rynku. Myślę, że w każdym momencie 2-3 języki mają poważne znaczenie dla większości miejsc pracy. Myślę, że szkoła jest winna uczniom zapewnienie możliwości uczenia się 2 z 3 tych języków wraz z dogłębnym szkoleniem w co najmniej jednym.

bethlakshmi
źródło
4

Dla studentów CS poszukaj języków programowania, które są ściśle odwzorowane na omawiane koncepcje CS. Sugerowałbym:

  • Schemat, aby lepiej zrozumieć rachunek lambda
  • Erlang, aby zrozumieć model aktora
  • Prolog, dla logiki predykatów i systemów sprawdzających
  • Haskell, dla teorii typów / kategorii, a ponieważ leniwa ocena jest tak w pełni wyrażona w języku
  • co najmniej jeden język asemblera - jeśli chcesz policzyć go pod tym sztandarem, wrzuciłbym również kod bajtowy, taki jak kod bajtowy Java lub CLR oraz LLVM IR
  • prawdopodobnie język definicji sprzętu, taki jak Verilog lub VHDL
  • Bison dla klasy kompilatora
  • coś z dynamicznym systemem typów (przychodzi na myśl Ruby) ...

Lista może trwać w ten sposób, ale podstawowa idea jest dość prosta: Naucz uczniów języka programowania, który będzie najlepiej pasował do sposobu, w jaki chcesz uczyć pojęć.

Aidan Cully
źródło
3

Yacc

aby dowiedzieć się, co dzieje się za kulisami, niezależnie od używanego języka programowania. pomaga uchwycić podstawowe pojęcia, takie jak martwy kod i różne rodzaje optymalizacji, które (dobry) kompilator będzie w stanie dla Ciebie zrobić.

mariotomo
źródło
2

Lisp (z CLOS dla OOP) i Haskell. To pytanie nie jest ograniczone do studentów. Nowe fantazyjne języki programowania pożyczyły (skopiowane, skradzione? ... nie, nieźle) wiele funkcji z tych dwóch. Możesz przygotować się na przyszłość. Programowanie funkcjonalne (styl) jest dziś ważniejsze i jest wprowadzane w imperatywnych językach programowania, takich jak C # (LINQ) lub C ++ (lambda) i wiele innych. Szkoda, że ​​niektórzy studenci uczą się tylko języka Java.

nożem
źródło
1
Chociaż zgadzam się z obojgiem, możesz podać pewne uzasadnienie (zauważę również, że znajomość ich jako jedynych języków nie byłaby szczególnie przydatna).
Inaimathi
2

Myślę, że język nie jest tak ważny, jak ludzie wierzą.

Tak, musisz wiedzieć, jak programować itp., Ale wielu wspaniałych programistów uczy się na własnych doświadczeniach, które pomagają im w rozwoju.

Uczniowie mogliby skorzystać z lekcji na temat programowania w świecie rzeczywistym, a nie tylko metod książkowych, dzięki czemu byliby bardziej „zaokrągleni”, a moim zdaniem lepsi programiści / absolwenci.

Dowiedziałem się więcej o programowaniu i tworzeniu oprogramowania po ukończeniu studiów i rozpoczęciu pracy!

user18041
źródło
2

CZY TO NAPRAWDĘ MA ZNACZENIE ?

Zwykle świąd kryjący się za tym pytaniem brzmi: „Jakie modne słowa mogę umieścić w moim życiorysie, które zapewnią mi najbardziej intratne / interesujące / wymagające / łatwe prace?”. Chociaż pytanie ma sens, ponieważ większość CV jest najpierw sprawdzana przez ludzi HR, którzy nie rozumieją, czego szukają. ale jest bardzo płytka, ponieważ po minięciu bram trzeba dostarczyć towary.

Nie to, jakie znasz języki, które czynią cię dobrym lub złym programistą, to sposób, w jaki możesz go używać. W tym celu są zasadniczo dwie kategorie programistów:

  1. Te, które koncentrują się na nauce języka do jego rdzenia. Najważniejszy jest język i jak go używać. W skrajnych sytuacjach mają tendencję do superoptymalizowania każdego drobnego fragmentu kodu i często używają niejasnych funkcji tylko dlatego, że mogą.

  2. Są też tacy, którzy chcą poznać techniki i paradygmaty. Język, którego używają, nie ma tak naprawdę znaczenia, o ile może elegancko wyrazić swój obraz mentalny. W skrajnych przypadkach będą one zwykle używać UML lub innych takich systemów, mając nadzieję, że inni zrobią cholerną robotę, aby go kodować.

Moim zdaniem potrzebujesz obu. # 1 zapewni umiejętności krótkoterminowe, a gdy zostanie mądrze wybrany, pomoże ci przejść przez bramki HR, ale # 2 pozostanie z tobą przez całą karierę i określi cię jako programistę.

# 2 zapewni wskazówki i zorganizuje swój tok myślenia w kierunku skutecznego rozwiązania problemu, ale bez 1 pozostaje pomysłem, na zawsze unoszącym się w limbosach nieba vaporware (lub piekła, w zależności od tego, z którego na niego spojrzysz).

# 1 da ci środki do wdrożenia pomysłów w prawdziwe działające systemy, ale bez 2 twoje systemy będą miały tendencję do rakowych bezkształtnych potworów.

Newtopian
źródło
Tak, to ma znaczenie. Pierwszy język, którego się uczysz, kształtuje mózg pod względem sposobu patrzenia na przyszłe języki.
1

Wierzę, że częściowo odpowiedziałeś na swoje pytanie.

Prawdziwe znaczenie ma umożliwienie uczniom kontaktu z kilkoma paradygmatami, faktyczne języki nie powinny mieć znaczenia.

Oczywiście ważne jest, aby przede wszystkim uczyć tych paradygmatów, które dają najwięcej możliwości pracy (prawdopodobnie w tej chwili OOP). W związku z tym lepiej jest uczyć szeroko używanego języka dla tego paradygmatu, ponieważ jest to bardziej przydatne niż uczenie się czegoś, czego prawdopodobnie nigdy nie będziesz używać. Dlatego też nienawidziłem pisania pseudo kodu na egzaminach. Pseudokod jest w porządku, o ile nie ma „poprawionej” składni. Powinieneś po prostu być w stanie przenieść koncepcje.

Konkretnie:

OOP: .NET lub Java

Co najmniej 1 dodatkowy paradygmat programowania, aby uświadomić uczniowi inne podejścia.

Funkcjonalne: Lisp?

Steven Jeuris
źródło
funkcjonalny, nie, proszę, nie LISP. raczej: haskell.
mariotomo
1

Język asemblera i mikrokodu. Student CS powinien zrozumieć wszystkie podstawowe warstwy abstrakcji między maszynami stanu logicznego a najnowszym funkcjonalnym / OOP / etc wysokiego poziomu. paradygmat języka programowania.

Basic, Logo lub Squeak (i ​​in.), Jeśli kiedykolwiek chcą zrozumieć, jak uczyć małe dzieci umiejętności obsługi komputera.

Fortran, Cobol i Lisp, jeśli chcą zrozumieć historię języków programowania i jakie rzeczywiste problemy rozwiązują współczesne praktyki.

hotpaw2
źródło
I C, więc rozumiesz 90% całego kodu open source, którego możesz się uczyć.
prawej stronie
1

Wybór 3 lub więcej języków z różnych paradygmatów nie jest trudny, podano wiele dobrych odpowiedzi. Ale gdybym musiał wybrać tylko jeden język, wybrałbym Scalę, ponieważ jest on zarówno funkcjonalny, jak i obiektowy. Możesz wyjaśnić i porównać różne podejścia w tym samym języku.

Sean Patrick Floyd
źródło
1

Nie zapomnij o językach zorientowanych na stos / konkatenatywnych! Mogą być prawdziwymi zagorzałymi umysłami. Podkreślają złożoność budynków przy użyciu małych, łatwych do zrozumienia prymitywów. Możesz ich użyć do napisania bezcelowego (lub milczącego) kodu, który wydaje się cholernie czysty.

Klasycznym językiem jest Forth , ale obecnie chodzę do Factor . Warto również sprawdzić Radość i Kot . Nie przegap wiki w języku konkatenatywnym . To więcej zabawy niż worek pełen młotków!

Scant Roger
źródło
0

Coś funkcjonalnego, Haskell lub Lisp byłoby moim pierwszym wyborem, ale może Erlang. Języki funkcjonalne naprawdę uczą, jak budować abstrakcje w bardzo potężny sposób.

Zachary K.
źródło
Ale czy studenci powinni ograniczać się do jednego paradygmatu? Co z funkcjonalnymi językami OOP, takimi jak Scala?
Anto
1
Nie, oczywiście, że nie, zakładałem, że inni ludzie się do nich przyłączą!
Zachary K
0

Pomimo braku głównego nurtu uważam, że D, a konkretnie wersja 2, zapewnia kilka interesujących lekcji, których nie można łatwo nauczyć się gdzie indziej. Podejmuje bardziej poważną próbę niż jakikolwiek inny język, jaki mogę wymyślić, aby uzyskać imperatywne / proceduralne, obiektowe i funkcjonalne programowanie, aby dobrze ze sobą grać i umożliwić programowanie na bardzo niskim poziomie (wskaźniki, ręczne zarządzanie pamięcią, wbudowane język asemblera) i bardzo wysoki poziom (programowanie generyczne i generatywne) w tym samym języku.

Jest to cenne, ponieważ zamiast widzieć paradygmaty w izolacji, jakby istniały w różnych wszechświatach, można zobaczyć las przez drzewa. Zobaczysz mocne i słabe strony każdego paradygmatu na drobnoziarnistym poziomie, łącząc je z programami. Zobaczysz, jak główne aspekty paradygmatów mogą być zaimplementowane w bibliotekach pod względem kodu niższego poziomu. Standardowy moduł biblioteki std. Algorytm implementuje ważne funkcjonalne prymitywy programowania, ale jest prostym, prostym kodem D bez magii. Podobnie, zasięg standardowyimplementuje leniwą ocenę, ale znowu jest to dość prosty kod D. Zrozumiesz koszty związane z prymitywami każdego paradygmatu, ponieważ zbliżone do metalu cechy D sprawiają, że to, co naprawdę dzieje się pod maską, jest stosunkowo przejrzyste. Możesz nawet napisać coś niskiego poziomu, który wygląda jak C, a następnie stworzyć ładny interfejs wysokiego poziomu, w tym samym języku, bez przeszkadzania magicznym warstwom kleju.

dsimcha
źródło
0

Pseudo kod.

Ludzie w tej dziedzinie powinni być w stanie wyjaśnić swoje pomysły w spójny, uporządkowany sposób bez żargonu specyficznego dla ram lub składni. Nie powinienem znać różnicy między nawiasami kwadratowymi a nawiasami klamrowymi, aby zrozumieć twój algorytm. Nie powinienem wiedzieć, co to ??znaczy ani jakie grepsą przełączniki.

Pisz prostym językiem, ale ułóż go i sformatuj jak kod. Każdy może następnie wdrożyć go w dowolnym języku, który mu się podoba.

edycja: Ta odpowiedź jest częściowo uzasadniona niezdolnością niektórych programistów do napisania pseudokodu.

„Po prostu napisz algorytm w pseudokodzie”

"Co to jest?"

Zaletą pseudokodu jest to, że interesariusze niebędący programistami mogą go zrozumieć. Nie sugeruję, że chcesz licencjobiorców i użytkowników sprawdzających twój kod, jednak może to pomóc, gdy nieprogramiści rozumieją wymagany algorytm. Psuedocode eliminuje potrzebę wyjaśniania for (int i = 0; i < j; i++)i, co jest w istocie żargonem na płycie.

Kirk Broadhurst
źródło
Wiele języków programowania jest na tyle potężnych, że istnieje niewielka różnica między rzeczywistym kodem a pseudokodem. Które elementy składniowe rzeczywistych języków programowania są przeciwne?
kevin cline
@kevin cline - Czuję się swobodnie z elementami składni, o których wiem - to te, o których nie wiem, czemu mógłbym się sprzeciwić. Oczywiście jestem w stanie je odszyfrować, ale chodzi o to, że pseudokod nie powinien mieć tych problemów (jeszcze nie widzę języka programowania, który naprawdę wygląda jak pseudokod)
Kirk Broadhurst
0

DO.

  • Przede wszystkim jest nadal używany (szeroko stosowany!), I nie tylko w jądrach. Obecnie utrzymuję aplikację biznesową zakodowaną w C. Więc nawet z czystym i prostym C wciąż możesz znaleźć pracę. W dużych firmach, w przemyśle, prawie wszędzie (ale w web dev).
  • Jeśli zamierzasz pracować w środowisku Unix / Linux, nieznajomość przynajmniej C jest trochę jak zakupy i niemożność odczytania cen na tagach.
  • Wskaźniki! Wszyscy powinni rozumieć wskazówki (por. Joel Spolsky ). Ponadto, gdy już złapiesz koncepcję malloc, wiesz dokładnie, co się dzieje, gdy beztrosko wpisujesz „nowy” w języku OOP.
  • Większość składni „popularnych języków” pochodzi z C.
  • Tak, nie zawsze jest jasne. Tak, trudno się nauczyć. Tak, struny są trochę koszmarem dla początkujących. Ale programowanie nie zawsze jest jasne i trudne do nauczenia, a naprawdę zrozumiesz, co jest wspaniałego w OOP, gdy po studiach w C spróbujesz C ++ i odkryjesz std :: string.

Oczywiście należy znać więcej niż jeden język, a nie tylko stary język proceduralny. Ale gdybym musiał iść na bezludną wyspę z tylko jednym kompilatorem, wybrałbym mój stary dobry gcc. Możesz zrozumieć programowanie na wysokim poziomie, jeśli wiesz o programowaniu na niskim poziomie. Myślę, że to nieprawda na odwrót.

Raveline
źródło
0

Niektóre języki programowania stosowane do zdobywania ogólnych umiejętności rozwiązywania problemów, a koncepcje programowania to Logo i Karel, należy ich uczyć przed C / C ++ / Java / Lisp / PERL / Assembly / cokolwiek paradygmatem programowania.

Studenci otrzymują bardzo praktyczne wprowadzenie do programowania.

umlcat
źródło
-1

Wszystko z przedmiotami. Upewnij się tylko, że dobrze się uczą.

W każdej chwili wynająłbym świetnego programistę Java dla c #, ale miałbym wiele wątpliwości, zatrudniając kogoś, kto nigdy nie napisał prawdziwego kodu

Eric
źródło