Ostatnio musiałem zrozumieć projekt małego programu napisanego w języku, o którym nie miałem pojęcia ( ABAP , jeśli musisz wiedzieć). Mogłem to rozgryźć bez większych trudności.
Zdaję sobie sprawę, że opanowanie nowego języka to zupełnie inna gra w piłkę, ale samo zrozumienie zamiaru kodu (w szczególności standardowego kodu produkcyjnego, który niekoniecznie jest skomplikowany) w dowolnym języku jest proste, jeśli znasz już kilka języków (najlepiej jeden procesowy / OO i jeden funkcjonalny).
Czy to na ogół prawda? Czy wszystkie języki programowania składają się z podobnych konstrukcji, takich jak pętle, instrukcje warunkowe i przekazywanie komunikatów między funkcjami? Czy istnieją języki inne niż ezoteryczne, których typowy programista Java / Ruby / Haskell nie byłby w stanie zrozumieć? Czy wszystkie języki mają wspólne pochodzenie?
źródło
Odpowiedzi:
Podstawy większości języków proceduralnych są prawie takie same.
Oni oferują:
Jeśli to zrozumiesz, dobrze znasz 90% języków na naszej planecie. To, co sprawia, że te języki są nieco trudniejsze do zrozumienia, to niesamowita różnorodność dziwnej składni, której ludzie używają, by mówić te same podstawowe rzeczy. Niektórzy używają notacji zwięzłej z nieparzystą interpunkcją (APL to ekstremum). Niektóre używają wielu słów kluczowych (COBOL jest doskonałym przedstawicielem). To nie ma większego znaczenia. Liczy się to, że język jest wystarczająco kompletny, aby wykonywać złożone zadania bez powodowania odrywania włosów. (Spróbuj zakodować poważne hakowanie ciągów w skrypcie powłoki systemu Windows DOS: jest on zdolny do Turinga, ale jest naprawdę zły we wszystkim).
Bardziej interesująca oferta języków proceduralnych
Choć technicznie nie jest to właściwość języka, ale właściwość ekosystemu, w którym żyją takie języki, są to biblioteki, które są łatwo dostępne lub wyposażone w język jako część narzędzia programistycznego. Posiadanie szerokiej gamy udogodnień bibliotecznych upraszcza / przyspiesza pisanie aplikacji po prostu dlatego, że nie trzeba wymyślać na nowo tego, co robią biblioteki. Podczas gdy Java i C # są powszechnie uważane za dobre języki same w sobie, tym, co czyni je naprawdę przydatnymi, są ogromne biblioteki, które się z nimi wiążą, i łatwo dostępne biblioteki rozszerzeń.
Trudniej zrozumieć języki, które nie są proceduralne:
Istnieją dwa główne style reprezentacji języków:
Języki graficzne często dopuszczają podsieci tekstowe jako adnotacje w węzłach i na łukach. Języki graficzne Odera rekurencyjnie dopuszczają wykresy (z tekstem :) w węzłach i na łukach. Naprawdę dziwne języki graficzne pozwalają, aby wykresy adnotacyjne wskazywały na adnotowane wykresy.
Większość tych języków opiera się na bardzo małej liczbie modeli obliczeniowych:
Biorąc pod uwagę fakt, że większość branży koncentruje się na językach proceduralnych i złożonych strukturach kontrolnych, możesz dobrze skorzystać, jeśli nauczysz się jednego z bardziej interesujących języków w tej kategorii, zwłaszcza jeśli zawiera on pewien rodzaj orientacji obiektowej.
Bardzo polecam naukę Schematu, w szczególności z naprawdę wspaniałej książki: Struktura i interpretacja programów komputerowych . Opisuje wszystkie te podstawowe pojęcia. Jeśli znasz te rzeczy, inne języki będą wydawać się proste, z wyjątkiem głupiej składni.
źródło
Języki opisu sprzętu są językami programowania, ale pod względem koncepcyjnym są bardzo różne. Spróbuj VHDL lub Verilog dla rozmiaru. Są wspólne dla programowania układów FPGA. (Ok, więc nie są to procesory, ale są to urządzenia obliczeniowe ogólnego przeznaczenia. I takie powinny być uważane za prawidłowy sprzęt do zagadnień informatycznych.) Musisz jawnie sprawić, by coś wystąpiło szeregowo. To zupełnie inny model. Pomyśleliście o rzeczach występujących równolegle jako reguła, a nie wyjątek. Pętle w Verilog rozwijają się w sprzęt równoległy. Zatem „oczekiwane” zachowanie może nie być zgodne z oczekiwaniami.
źródło
Zależy, co rozumiesz przez „w zasadzie”. Wszystkie języki o dowolnej elastyczności są kompletne. W tym sensie: tak, wszystkie są zasadniczo takie same.
Na niskim poziomie wszystkie wykonują podobne sekwencje operacji, a wszystkie elementy systemu Windows, Linux i (najnowszego) OS X działają na procesorach zgodnych z Intelem przy użyciu tych samych zestawów instrukcji. W ten sposób są one w zasadzie takie same.
Zdaję sobie sprawę z tego, że zdefiniowałeś „zasadniczo” w swoim pytaniu, ale aby naprawdę na nie odpowiedzieć, ta definicja będzie musiała być znacznie bardziej dopracowana. Pod wieloma względami wszystkie są do siebie podobne. Pod wieloma względami są różne. Zbyt łatwo jest powiedzieć „to zależy”. Jeśli przyjmiesz skrajność, pytanie prawdopodobnie nie odpowie na to, na co masz zamiar, więc to, gdzie ta linia jest narysowana, ma kluczowe znaczenie dla udzielenia odpowiedzi na twoje pytanie tak, jak chcesz.
źródło
Powiedziałbym, że język koduje znaczenie. Jeśli znaczenie ma jakiś sens w jakimś kontekście, wówczas wszystkie języki, które mogłyby je wyrazić, można uznać za równoważne, ograniczone przez znaczenie i kontekst.
Jeśli ograniczysz ten kontekst do standardowej maszyny von Neumanna, to można by powiedzieć, że źródłem obliczeń zmiany pamięci i obliczeń w jednostce centralnej jest pochodzenie - i być może jedyne znaczenie, które mają wszystkie języki. Wszystkie inne rzeczy są na nich zbudowane abstrakcją.
źródło
Języki programowania są również narzędziami do myślenia. Z innej perspektywy myślenia niektóre problemy znikają lub są przekształcane w inny, łatwiejszy w zarządzaniu (na przykład wiele wzorców projektowych w stylu C ++ po prostu znika, gdy myślisz w Lisp (patrz na przykład prezentacja Petera Norvika ), a Erlang uwalnia cię od myślenia niektórych niskopoziomowych współbieżnych lub rozproszonych konstrukcji obliczeniowych i pozwala skoncentrować się na logice aplikacji).
Zauważ jednak, że czasami „nowe” paradygmaty można częściowo zastosować do „starszych” języków programowania, co wyjaśnia, dlaczego na przykład mamy książki uczące programowania funkcjonalnego dla programistów Java . Ale natywne wspieranie i integrowanie silniejszego paradygmatu na poziomie językowym umożliwia bardziej naturalne zastosowanie paradygmatu (i w konsekwencji uniemożliwia zrozumienie programów w języku obsługującym nieznany paradygmat, jak sugerują inne odpowiedzi - @Ira Baxter wymienia języki nieprocesowe i @kwatford w odniesieniu do Paula Grahama ).
źródło
Na najniższym poziomie każdy język programowania jest „taki sam”, ale to nie znaczy, że są one takie same na poziomie, na którym faktycznie się komunikujesz. Są dla ciebie abstrakcyjnymi problemami; to nie znaczy, że abstrakcyjnie te same problemy lub że każdy problem w ten sam sposób.
źródło
Dojrzałe języki mają zazwyczaj kilka celów i dokonują kompromisów, w których poświęcają jedną rzecz dla drugiej. Języka ogólnego przeznaczenia można używać do wszystkiego, ale żaden język nie może przodować w każdej dziedzinie. Kilka przykładów:
C stara się być idealnym językiem programowania systemów. W tym celu poświęca czytelność i bezpieczeństwo kontroli niskiego poziomu i prędkości.
Python ma być idealnym językiem skryptowym. W tym celu poświęca szybkość i weryfikowalność dla produktywności i przenośności.
Haskell stara się być bezpiecznym, matematycznie czystym językiem. W tym celu poświęca możliwość uczenia się i konwencję w celu weryfikacji i wiarygodności.
Te poświęcenia i korzyści mają ogromną różnicę w języku. Tak, większość języków programowania może być używana do wszystkiego, co może być wykonane przez komputer, ale żaden z tych samych języków nie powinien być używany do wszystkiego. Wszystkie powyższe języki to te, które wybrałbym do niektórych zadań, ale nie do innych. Gdybym programował system operacyjny, wybrałbym C. Gdybym pisał backend dla strony internetowej, użyłbym Pythona. A gdybym pisał system finansowy, użyłbym Haskell.
Ostatecznie wybór programisty jest tym, co jest właściwym narzędziem do pracy.
źródło