Nie rozumiem programowania

0

Cześć,

nie wiem czy to temat na off-topic, ale spróbuję tutaj.

Zajmuję się programowaniem od kilkunastu lat i w sumie stwierdzam, że nie rozumiem wielu ważnych kwestii. Przede wszystkim nie rozumiem priorytetów przy projektowaniu języków. Weźmy na przykład taki JavaScript. Jest to język prototypowany i całymi latami myślałem, że za tą filozofią stoją solidne argumenty. Aż tu nagle dodali klasy jako syntax sugar i pojawiły się pogłoski, że typowanie i prywatne właściwości też trafiają niedługo do JavaScriptu. Języki robią się do siebie coraz bardziej podobne, pewne rozwiązania albo się sprawdzają, albo nie.

Miałem ochotę pouczyć się języka Go, ale jak zobaczyłem jego składnię, to się złapałem za głowę. Moim zdaniem jest po prostu brzydka i nieczytelna, m.in.:

  • operator :=
  • słowo kluczowe "type" - po co to? Myślałem, że kod ma być krótki, a przecież nazwa struktury chyba oznacza, że dodajemy typ?
  • nagłówek deklaracji funkcji np. "func fib() func() int {...}" - co to ma być? Przez brak separatora zwracanego typu mózg szuka nazwy funkcji w tym gąszczu.

Jak to się dzieje, że każdy język ma takie dziwactwa? Najładniejszym językiem jaki widziałem do dnia dzisiejszego jest Swift, tam prawie wszystko wydaje się sensowne. Czy to jest tylko kwestia gustu?

No i najważniejsze pytanie, dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia? Wolny może być ich parser, a nie język sam w sobie. No i dlaczego świat programowania nie dąży do tego, żeby jeden język dostosowywać do potrzeb i dostosowywać jego wersje do potrzeb, tylko uczymy się całego nowego języka tylko dlatego, że tworzymy coś innego? Dlaczego jedyny przeglądarkowy język skryptowy jest akurat prototypowany? Dlaczego zastosowanie wrzuca nas w paradygmat tworzenia? Nie rozumiem tego, przecież to nie ma sensu. Jak widać języki są coraz bardziej podobne i w praniu wychodzi, że zagorzali obrońcy i przeciwnicy różnych paradygmatów się po prostu mylili i gadali dla gadania. To jest kolejna ciekawa sprawa - ile w tym wszystkim jest ślepego fanbojstwa i nietrafnej argumentacji na rzecz ulubionych języków.

Wybaczcie tak chaotyczny temat, ale musiałem to z siebie wydusić. Dziękuję z góry za dyskusję <3

1

A dlaczego np nie istnieje jeden samochód do wszystkiego i dla wszystkich? No przecież są do siebie takie podobne.

0
mr_jaro napisał(a):

A dlaczego np nie istnieje jeden samochód do wszystkiego i dla wszystkich? No przecież są do siebie takie podobne.

Uważam, że to jest bardzo nietrafne porównanie.

4

Jest bardzo trafne. Języki kopiują od siebie co najlepsze i co pasuje do ich filozofii to samo w autach. Każdym samochodem dojedziesz w dane miejsce tak samo jak wykonasz dany algorytm.

Języki ewoluują dostosowując się do rynku, powstają nowe rozwiązania, nowe potrzeby, nowe sposoby na szybsze rozwiązanie problemu. Popatrz sobie chociażby na tę skróconą ewolucję:
asm -> c -> c++ -> java - czy mógłbyś powiedzieć, że wystarczyłby tylko jeden z nich? No nie sądzę.

Napisałeś tez o js, że łoo nagle klasy się pojawią... tak pojawiają się bo ludzie mają inne potrzeby wykorzystania tego języka niż było to 10 lat temu a prościej jest ulepszyć js niż dodawać zupełnie nowy język do wszystkich przeglądarek i kazać się nauczyć go devom.

A tutaj wrzucam drzewko genealogiczne języków, może ci to coś uświadomi https://github.com/stereobooster/programming-languages-genealogical-tree

1

No i najważniejsze pytanie, dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia? Wolny może być ich parser, a nie język sam w sobie.

To jest typowy skrót myślowy. Gdybyś zaczął się czepiać wszystkich tego typu nieścisłości używanych na co dzień i próbował je zmieniać, to mowa stałaby się dużo mniej praktyczna.

0

Jest nietrafne, bo po pierwsze samochody mają jeden prosty cel - jechać, a po drugie są produktami rynkowymi, podlegającymi kapitalistycznej konkurencji.

Języki programowania to wytwory społeczności, służące naszemu programistycznemu dobru. Zastanawia mnie po prostu ta szamotanina, która jak widać kończy się prędzej czy później pewnym konsensusem i łataniem dziur.

Nie rozumiem dlaczego język jest tak bardzo związany ze swoim parserem. Dlaczego języki nie są po prostu zestawem reguł składniowych, do których tworzy się parsery? Tak się głośno zastanawiam. Przecież język to tylko zbiór zasad leksykalnych i pewna filozofia modelowania rzeczywistości. To nie powinno iść w parze z zastosowaniem tak blisko jak to się dzieje dziś. Byłoby pięknie, gdyby języki różniły się od siebie paradygmatami, a my jako programiści wybierali sobie nasze ulubione, by pisać w nich cokolwiek. Oczywiście na podobnym poziomie abstrakcji, bo wiadomo, że Asemblera nie zastąpimy Swiftem.

C.mind napisał(a):

No i najważniejsze pytanie, dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia? Wolny może być ich parser, a nie język sam w sobie.

To jest typowy skrót myślowy. Gdybyś zaczął się czepiać wszystkich tego typu nieścisłości używanych na co dzień i próbował je zmieniać, to mowa stałaby się dużo mniej praktyczna.

Nie o to mi chodziło. Mówię o tym, że język jako składnia nie może być szybki lub wolny, więc te argumenty nie mają sensu. A skoro parser np. Pythona jest powolny, to dlaczego nie podejmuje się prób dodawania do języka np. alternatywnej obsługi odśmiecania? Czy jest potrzebny do tego całkowicie odrębny język? Po co?

Temat jest dość abstrakcyjny i być może nikt nie zrozumie o co mi chodzi (póki co nikt nie rozumie), ale zaryzykuję.

0

A skoro parser np. Pythona jest powolny, to dlaczego nie podejmuje się prób dodawania do języka np. alternatywnej obsługi odśmiecania?

Przecież na "szybkość języka" nie wpływają tylko takie cechy jak obsługa odśmiecania.
Samo to, czy jakiś język jest statycznie czy dynamicznie typowany już bardzo dużo zmienia jeśli chodzi o to, co możesz z takim kodem robić i jak szybkie to będą operacje.

1
Bear Town napisał(a):

kolejna ciekawa sprawa - ile w tym wszystkim jest ślepego fanbojstwa i nietrafnej argumentacji na rzecz ulubionych języków.

Jak masz młotek, to wszystko wygląda jak gwóźdź. To trochę prawda.
Inna prawda jest taka, że do różnych zastosowań przydatne są różne języki.
Nie rozumiem też jakiegoś wielkiego lęku przed różnorodnością języków. Ja mam poczucie, że między ES5, a ES6+ potrafią być większe różnice niż między javą, a c#. Czasem nawet nowy framework w tym samym języku potrafi być trudniejszy do nauczenia niż nowy język podobnego typu. Nigdy np. nie pisałem mobilek w oparciu o xamarin, a z c# mam sporo lat doświadczenia. Jak odpaliłem dla zabawy projekt w xamarin, to był to większy kosmos niż pisanie natywki w swifcie bez znajomości swifta, czy w android studio+kotlin. Język to tylko język, składnie opanowuje się w góra miesiąc, ale nauczenie się danego środowiska to dużo dłużej, nawet jak zna się już język.

0

No i dlaczego świat programowania nie dąży do tego, żeby jeden język dostosowywać do potrzeb i dostosowywać jego wersje do potrzeb, tylko uczymy się całego nowego języka tylko dlatego, że tworzymy coś innego

Do opracowania nowego języka, wystarczy kilku osobowa grupa dobrze wyszkolonych ludzi i racjonał liczba roboczo godzin- w przypadku js wystarczyła jedna osoba. Wiec jest to relatywnie tanie i proste. Wiec jeśli wyspecjalizowany język zwiększy efektywność programistów o np. 200% i będzie choćby kilkanaście osób używających go. To jest to zasadne ekonomicznie. Hajs się zgadza, są zasoby czemu nie.

Języki robią się do siebie coraz bardziej podobne, pewne rozwiązania albo się sprawdzają, albo nie.

Nauka języka programowania czy pragdymatu to czasochłonne zajecie, które MUSI być wykonane przez każdego programistę z osobna. Programistów sa miliony, wiec to absurdalnie drogi, proces. Ponieważ stworzenie jezyka 'relatywnie proste' w porównaniu do przeszkolenia miliona ludzi, jezyk żeby był popularny musi być maksymalnie zbliżony do czegoś co istnienie, aby ten drogi proces zredukować do minimum. Hajs musi się zgadzać. Dlatego wszystkie(ed. wiekszość) języki bazują na składni języka C.

dlaczego jAvAsCrIpT

Dlatego że napisała go jeden koleś, tak o z czapki i stwierdził tak bedzie fajnie. A że wszystko inne na rynku wtamtej chwili było gorsze od jego intuicji to teraz jest jak jest, i nikt nie przepisze wszystkich stron internetowych bo tak.

0
renderme napisał(a):
Bear Town napisał(a):

kolejna ciekawa sprawa - ile w tym wszystkim jest ślepego fanbojstwa i nietrafnej argumentacji na rzecz ulubionych języków.

Jak masz młotek, to wszystko wygląda jak gwóźdź. To trochę prawda.
Inna prawda jest taka, że do różnych zastosowań przydatne są różne języki.
Nie rozumiem też jakiegoś wielkiego lęku przed różnorodnością języków. Ja mam poczucie, że między ES5, a ES6+ potrafią być większe różnice niż między javą, a c#. Czasem nawet nowy framework w tym samym języku potrafi być trudniejszy do nauczenia niż nowy język podobnego typu. Nigdy np. nie pisałem mobilek w oparciu o xamarin, a z c# mam sporo lat doświadczenia. Jak odpaliłem dla zabawy projekt w xamarin, to był to większy kosmos niż pisanie natywki w swifcie bez znajomości swifta, czy w android studio+kotlin. Język to tylko język, składnie opanowuje się w góra miesiąc, ale nauczenie się danego środowiska to dużo dłużej, nawet jak zna się już język.

Dzięki za sensowną odpowiedź (nareszcie). A co sądzisz o tym, że języki są tak ściśle związane z ich zastosowaniem? Kultura programistyczna zwykle utożsamia język programowania z konkretnym zastosowaniem i szybkością, języki ewoluują jedynie w swojej piaskownicy. Wyjątkiem okazał się JavaScript, który zaczął być też językiem backendowym.

_flamingAccount napisał(a):

Dlatego wszystkie języki bazują na składni języka C.

Chyba jednak nie :)

1

Poczytaj Types and Programming Languages, Theory of Objects, Advanced Topics in Types and Programming Languages, Category Theory for Programmers, to zrozumiesz, po co ludzie wymyślają języki.

0
Afish napisał(a):

Poczytaj Types and Programming Languages, Theory of Objects, Advanced Topics in Types and Programming Languages, Category Theory for Programmers, to zrozumiesz, po co ludzie wymyślają języki.

Nie zrozumiałeś tematu.

1

Bym powiedział, że to nie to, że nie rozumiesz programowania tylko programistów. Bo widzisz, ci się dzielą na dwie kategorię. Zdecydowaną większość inżynieżów (sic), którzy zwalają brak dyscypliny i racjonalności na to, że są inżynierami, a nie naukowcami, więc oczekuje się od nich działania, a nie poprawności (wystarczy przyrównać do innych zawodów inżynieryjnych, żeby poczuć ile w tym prawdy) i mniejszość, która przywiązuje wagę do warsztatu pracy i metodyki. W związku z tym języki programowania dzielą się na wymyślone: C, Java, Javascript; i języki odkryte (tj. wynikające z kompletnego modelu problemu): np. Lisp, Haskell, Idris. Pierwsze mają tendencję do bycia zlepkiem hacków, a drugie są bardziej spójne i przemyślane. Te drugie są mało popularne, bo mało programistów dorosło do ich używania, a menedżerów już w ogóle.Biznes jest bezlitosny i tylko w nielicznych zastosowaniach metodyka i dyscyplina są cenione. Po popularnych językach nie spodziewałbym się wiele, choć niektóre cechy, o których piszesz mogą rzeczywiście być kwestią arbitralną, a czasem są efektem Blub (to chyba Graham wymyślił). :)

0

No i najważniejsze pytanie, dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia?

oj nie, język to nie jest tylko składnia.

Język to składnia, kompilatory, frameworki, standard library / base class library, community (tutoriale, książki, prelegenci, blogi, itd), environment/tooling (IDE, Package managers), problemy, rozwiązania oraz konwencję.

0
WeiXiao napisał(a):

No i najważniejsze pytanie, dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia?

oj nie, język to nie jest tylko składnia.

Język to składnia, kompilatory, frameworki, standard library / base class library, community (tutoriale, książki, prelegenci, blogi, itd), environment/tooling (IDE, Package managers), problemy oraz konwencję.

Frameworki to nie język, tylko jego zastosowanie. Kompilatory jako język to właśnie to, o czym mówię.

1
Bear Town napisał(a):
mr_jaro napisał(a):

A dlaczego np nie istnieje jeden samochód do wszystkiego i dla wszystkich? No przecież są do siebie takie podobne.

Uważam, że to jest bardzo nietrafne porównanie.

Dlaczego?

Np. kombajnem nie przewozisz towarów do spożywczaka. A osobowym samochodem nie orzesz pola...

Wszystkie te samochody jeżdżą, ale oprócz tego robią inne rzeczy.

0
elwis napisał(a):

W związku z tym języki programowania dzielą się na wymyślone: C, Java, Javascript; i języki odkryte (tj. wynikające z kompletnego modelu problemu): np. Lisp, Haskell, Idris. Pierwsze mają tendencję do bycia zlepkiem hacków, a drugie są bardziej spójne i przemyślane.

Czy mógłbyś to rozwinąć, bo w sumie nie poparłeś tego żadnym mocnym argumentem? Dosłownie wszystko co się chce można nazwać "zlepkiem hacków", tak samo jak wszystko co się chce można nazwać "spójnym i przemyślanym". Co masz przez to na myśli? Często rzeczywistość samą w sobie można określić jako "zlepek hacków", więc wtedy można by było nawet powiedzieć, że jest kompletnie odwrotnie - Twoja pierwsza grupa byłaby odkryta, a druga byłaby wymyślona (skoro ta druga jest według Ciebie bardziej spójna i przemyślana).
Nie staram się tu zacząć z Tobą wojny, po prostu zastanawiam się czy to bardziej Twoje własne preferencje/upodobania, czy może jest w tym jakieś większe odzwierciedlenie rzeczywistości. Zastanawiam się też nad stopniem sztuczności takich podziałów.

1
Spine napisał(a):

A osobowym samochodem nie orzesz pola...

Jesteś pewien? ;)

2
Bear Town napisał(a):

Jest nietrafne, bo po pierwsze samochody mają jeden prosty cel - jechać, a po drugie są produktami rynkowymi, podlegającymi kapitalistycznej konkurencji.

Wrecz przeciwnie.
Samochody sluza do wielu rzeczy a ten rynek jest bardzo skoncentrowany i trudno mowic w nim o konkurencji.

Samochod moze sluzyc do transportu, autoprezentacji, podrywu, podrozowania, odreagowania stresu na innych, egzekucji prawa, oswietlenia garazu i do kilku jeszcze innych rzeczy.

Samochody sa produkowane przez raptem kilka duzych koncernow i w konkurencje m. nimi wierza juz chyba tylko przedszkolaki.

Języki programowania to wytwory społeczności, służące naszemu programistycznemu dobru.

Jakiej spolecznosci??? Chodzi Ci o JavaScript?
C, Pascal, Cobol, Java, C++ powstaly jako twory pojedynczych osob.

Zastanawia mnie po prostu ta szamotanina, która jak widać kończy się prędzej czy później pewnym konsensusem i łataniem dziur.

Jezyk ktory nie jest rozwijany umiera. Chyba ze nazywa sie na C i konczy na L.

Nie rozumiem dlaczego język jest tak bardzo związany ze swoim parserem. Dlaczego języki nie są po prostu zestawem reguł składniowych, do których tworzy się parsery? Tak się głośno zastanawiam. Przecież język to tylko zbiór zasad leksykalnych i pewna filozofia modelowania rzeczywistości. To nie powinno iść w parze z zastosowaniem tak blisko jak to się dzieje dziś. Byłoby pięknie, gdyby języki różniły się od siebie paradygmatami, a my jako programiści wybierali sobie nasze ulubione, by pisać w nich cokolwiek.

Tak sie dzieje tylko w wybranych przypadkach (np Pascal). Nikt nie pisze oprogramowania w calosci od A do Z tylko korzysta z gotowych bibliotek. Jak ich nie ma w danym srodowisku to albo je musi pisac sam albo zmienia srodowisko.

C.mind napisał(a):

No i najważniejsze pytanie, dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia? Wolny może być ich parser, a nie język sam w sobie.

To jest typowy skrót myślowy. Gdybyś zaczął się czepiać wszystkich tego typu nieścisłości używanych na co dzień i próbował je zmieniać, to mowa stałaby się dużo mniej praktyczna.

Nie o to mi chodziło. Mówię o tym, że język jako składnia nie może być szybki lub wolny, więc te argumenty nie mają sensu. A skoro parser np. Pythona jest powolny, to dlaczego nie podejmuje się prób dodawania do języka np. alternatywnej obsługi odśmiecania? Czy jest potrzebny do tego całkowicie odrębny język? Po co?

Jezyk moze byc wolny lub szybki ze wzgledu na abstrakcje ktorymi operuje. To ze matematycznie mozna udowodnic ze to to samo nie znaczy ze na swiecie jest wystarczajaco duzo fanow danego jezyka zeby wsrod nich sie znalazl taki ktory wszystko zoptymalizuje do odpowiedniego poziomu. Sa jezyki w ktorych szybkosc wykonania nie jest priorytetem ze wzgledu na operacje ktore wykonuja. Przykladem moga byc PHP czy PL/SQL. W tych jezykach nikt sie nie spodziewa ze beda super szybkie np. w dodawaniu liczb..

Temat jest dość abstrakcyjny i być może nikt nie zrozumie o co mi chodzi (póki co nikt nie rozumie), ale zaryzykuję.

Ja nie rozumiem.

0

Co wy się tak tego PHP uczepiliście? XD PHP jest kilkukrotnie szybszy od Pythona, ale ma (w większości) niezasłużenie złą opinię i osoby nieznające go się wypowiadają. Znam i lubię oba, żeby nie było, że faworyzuję. Python jest lepiej zaprojektowany, ale powinno się więcej mówić o jego kiepskiej wydajności.

Co do samochodów to powtórzę: one tylko jadą. To, że samochód jest ładniejszy, brzydszy itd. to są cechy dodatkowe. To nie wnosi nic do tematu i ma się nijak do języków programowania.

Co z tego, że język był tworzony przez jedną osobę? Większość ewoluowała w projekty tworzone przez wielu ludzi, gdzie społeczność też ma prawo głosu.

0
vpiotr napisał(a):

Temat jest dość abstrakcyjny i być może nikt nie zrozumie o co mi chodzi (póki co nikt nie rozumie), ale zaryzykuję.

Ja nie rozumiem.

Jak nie rozumiesz to po co się wypowiadasz?

1
Bear Town napisał(a):

Python jest lepiej zaprojektowany, ale powinno się więcej mówić o jego kiepskiej wydajności.

W czystym Pythonie robi się rzeczy, które nie wymagają wydajnego interpretera.
Do rzeczy wymagających wydajności wykorzystujemy moduły napisane np. w C++.
Wywołanie funkcji z biblioteki napisanej w C+ nie kosztuje za wiele :]

2
Bear Town napisał(a):

PHP jest kilkukrotnie szybszy od Pythona

Zależy od zastosowań, użytej maszyny wirtualnej, etc.

ale ma (w większości) niezasłużenie złą opinię i osoby nieznające go się wypowiadają.

Ja bym powiedział, że zasłużenie. Poprawia się, to na pewno, ale jeśli nie zerwą kompatybilności wstecznej to będzie dla mnie miał równie złą opinię co C++.

Znam i lubię oba, żeby nie było, że faworyzuję. Python jest lepiej zaprojektowany, ale powinno się więcej mówić o jego kiepskiej wydajności.

Masz inne implementacje z inną wydajnością. Dodatkowo masz mnóstwo bibliotek to obliczeń numerycznych, które pracę cedują na C/FORTRANa i przestaje to być jakimkolwiek problemem dla większości zastosowań gdzie potrzeba wydajności.

Co do samochodów to powtórzę: one tylko jadą. To, że samochód jest ładniejszy, brzydszy itd. to są cechy dodatkowe. To nie wnosi nic do tematu i ma się nijak do języków programowania.

Wszystkie języki programowania są pewną abstrakcją nad maszyną Turinga/rachunkiem lambda (które są równoważne, jeśli założymy prawdziwość hipotezy Churcha-Turinga). To czy język jest ładniejszy, brzydszy, itp. to są cechy dodatkowe. Widzisz zależność?

Co z tego, że język był tworzony przez jedną osobę? Większość ewoluowała w projekty tworzone przez wielu ludzi, gdzie społeczność też ma prawo głosu.

Dalej języki programowania to w większości katedry (za Katedra i Bazar) gdzie społeczność może oglądać i używać, może zgłaszać propozycje, ale to od "budowniczych" zależy czy uwzględnią te sugestie. Chyba tylko PHP powstawał w formie bazaru gdzie każdy mógł dorzucić swoją "cegiełkę", widać to "trochę" w bibliotece standardowej.

1
C.mind napisał(a):
elwis napisał(a):

W związku z tym języki programowania dzielą się na wymyślone: C, Java, Javascript; i języki odkryte (tj. wynikające z kompletnego modelu problemu): np. Lisp, Haskell, Idris. Pierwsze mają tendencję do bycia zlepkiem hacków, a drugie są bardziej spójne i przemyślane.

Czy mógłbyś to rozwinąć, bo w sumie nie poparłeś tego żadnym mocnym argumentem? Dosłownie wszystko co się chce można nazwać "zlepkiem hacków", tak samo jak wszystko co się chce można nazwać "spójnym i przemyślanym". Co masz przez to na myśli? Często rzeczywistość samą w sobie można określić jako "zlepek hacków", więc wtedy można by było nawet powiedzieć, że jest kompletnie odwrotnie - Twoja pierwsza grupa byłaby odkryta, a druga byłaby wymyślona (skoro ta druga jest według Ciebie bardziej spójna i przemyślana).

To bardzo proste rozróżnienie. Weźmy C, to prosta abstrakcja wynikająca z uciążliwości assemblera, jest bezpośrednią odpowiedzią na problemy programowania w assemblerze. Podobnie C++ jest odpowiedzią na słabości C. Java, C#, itd są naturalnymi rozwinięciami C++, znów poprzez eliminowanie błędów poprzednika. Równolegle możemy rozpocząć łańcuch od eda i Basha, przez awk i perla, z którego wywodzą się PHP, (może w trochę mniejszym stopniu) Python i Ruby.
Zupełnie inaczej jest z Haskellem, bo ten jest zwyczajnie odzwierciedleniem teorii kategorii. Został stworzony żeby programować, a nie uciekać od problemów poprzednika.
W przypadku Lispu, można się kłócić że próbuje naprawić rachunek lambda. Z drugiej strony, pierwotnie miał być wyłącznie notacją matematyczną, pomysł zaimlementowania go w kodzie przyszedł później. Stąd jego duża elastyczność, operacje na symbolach i charakter przyrostowy, w którym cały język wywodzi się z kilku prostych części z których zbudowana jest cała reszta. Nawet pętlę nie są w tym języku elementami pierwotnymi. Dzięki temu, przez 60 lat historii tego języka z łatwością przyswaja on nowe koncepcje i paradygmaty.

0
elwis napisał(a):

Weźmy C, to prosta abstrakcja wynikająca z uciążliwości assemblera, jest bezpośrednią odpowiedzią na problemy programowania w assemblerze.
Podobnie C++ jest odpowiedzią na słabości C. Java, C#, itd są naturalnymi rozwinięciami C++, znów poprzez eliminowanie błędów poprzednika.

Ok, tylko dlaczego zatrzymujesz się na assemblerze? Na tej samej zasadzie można powiedzieć, że każdy język programowania jest któregoś szczebla odpowiedzią na uciążliwości programowania w języku maszynowym. Assembly languages były dokładnie takimi odpowiedziami. Jeśli za kryterium przynależenia do grupy o nazwie "zlepki hacków" przyjmujesz naprawianie błędów poprzednika, to w jednej grupie miałbyś właśnie język maszynowy, a w drugiej miałbyś całą resztę.

Może tłumacząc trochę jaśniej - mój "problem" z tym co napisałeś jest taki, że w podanym przez siebie wcześniej podziale w pewien sposób implikujesz, że skoro dany język miał niedoskonałych poprzedników, to automatycznie oznacza, że nie da się go zaklasyfikować jako spójnego i przemyślanego. Cała ludzka cywilizacja opiera się na budowaniu na fundamentach postawionych przez naszych poprzedników i doskonaleniu tego, co oni już wykonali. To nie powoduje, że to co tworzymy jest z miejsca mało spójne. Właśnie dlatego zapytałem na ile taki podział to są tylko Twoje preferencje odnośnie konkretnych języków, a na ile to jest faktyczne odzwierciedlenie rzeczywistości.

Zupełnie inaczej jest z Haskellem, bo ten jest zwyczajnie odzwierciedleniem teorii kategorii. Został stworzony żeby programować, a nie uciekać od problemów poprzednika.

Haskell też nie jest żadnym oryginalnym tworem. Został stworzony głównie dlatego, że Miranda była płatnym produktem i stwierdzono, że chcą mieć otwartą wersję tego języka. Mało tego - chcieli nawet, żeby był w dużej mierze robiony przez twórcę Mirandy, ale tamten odmówił. Mimo to, Haskell w bardzo dużym stopniu opiera się o rozwiązania Mirandy i też stanowi odpowiedź na jej problemy.

7
Bear Town napisał(a):

dlaczego mówi się np. "Python jest wolny", "Język <nazwa> jest szybki", skoro to tylko składnia? Wolny może być ich parser, a nie język

Bear Town napisał(a):

Co wy się tak tego PHP uczepiliście? XD PHP jest kilkukrotnie szybszy od Pythona

;)

1
C.mind napisał(a):

Na tej samej zasadzie można powiedzieć, że każdy język programowania jest któregoś szczebla odpowiedzią na uciążliwości programowania w języku maszynowym.

Każdy język koncepcyjnie oparty o maszynę Turinga tak, ale jest masa języków wychodzących od koncepcji rachunku lambd. Chodzi o inne spojrzenie na teorię obliczeń, nie o szczegóły implementacyjne.

Haskell też nie jest żadnym oryginalnym tworem. Został stworzony głównie dlatego, że Miranda była płatnym produktem i stwierdzono, że chcą mieć otwartą wersję tego języka. Mało tego - chcieli nawet, żeby był w dużej mierze robiony przez twórcę Mirandy, ale tamten odmówił. Mimo to, Haskell w bardzo dużym stopniu opiera się o rozwiązania Mirandy i też stanowi odpowiedź na jej problemy.

Historia powstania Haskella nie jest istotna, chodzi o koncept, na którym się opiera. Od razu zaznaczę, że nie chodzi tu o programowanie funkcyjne vs programowanie obiektowe, tylko o sposób dotarcia do rozwiązania.

0
Afish napisał(a):
C.mind napisał(a):

Na tej samej zasadzie można powiedzieć, że każdy język programowania jest któregoś szczebla odpowiedzią na uciążliwości programowania w języku maszynowym.

Każdy język koncepcyjnie oparty o maszynę Turinga tak, ale jest masa języków wychodzących od koncepcji rachunku lambd. Chodzi o inne spojrzenie na teorię obliczeń, nie o szczegóły implementacyjne.

Ja rozumiem, że są bardzo fundamentalne różnice między podejściem tych języków do rozwiązania problemu. Natomiast nadal nie rozumiem z jakiego powodu jedna grupa miałaby być zaklasyfikowana jako bardziej spójna od drugiej. Zresztą może jest - sam nie mam na ten temat zdania bo ja nawet jeszcze nie używam języków opartych o rachunek lambd. Jestem po prostu ciekaw opinii osób z większym doświadczeniem.

Haskell też nie jest żadnym oryginalnym tworem. Został stworzony głównie dlatego, że Miranda była płatnym produktem i stwierdzono, że chcą mieć otwartą wersję tego języka. Mało tego - chcieli nawet, żeby był w dużej mierze robiony przez twórcę Mirandy, ale tamten odmówił. Mimo to, Haskell w bardzo dużym stopniu opiera się o rozwiązania Mirandy i też stanowi odpowiedź na jej problemy.

Historia powstania Haskella nie jest istotna, chodzi o koncept, na którym się opiera. Od razu zaznaczę, że nie chodzi tu o programowanie funkcyjne vs programowanie obiektowe, tylko o sposób dotarcia do rozwiązania.

Dla mnie historia Haskella też nie jest istotna w tym kontekście. Napisałem o tym dlatego, że odniosłem wrażenie, że w klasyfikacji @elwis naprawianie błędów poprzedników miało jakieś znaczenie.

6

Ten post jest luźnym przemyśleniem i swego rodzaju opinią.

C.mind napisał(a):

Ja rozumiem, że są bardzo fundamentalne różnice między podejściem tych języków do rozwiązania problemu. Natomiast nadal nie rozumiem z jakiego powodu jedna grupa miałaby być bardziej zaklasyfikowana jako bardziej spójna od drugiej.

Tu można przerzucać się argumentami i wiele zależy od preferencji/światopoglądu, więc nie ma co tego traktować jako wyrocznię, a bardziej jako temat do przemyśleń.

W matematyce wszystko musi być zdefiniowane, a potem budujemy dowody wychodząc od aksjomatów. Stosując to podejście możemy wykazać, że coś działa, że coś nie działa, albo możemy stwierdzić, że nic nie wiemy (tu jeszcze dochodzi możliwość dowodzenia, że nie da się czegoś udowodnić, ale to pominiemy). Teraz chcemy wyjść od jakiegoś prostego modelu i pokazać, że wszystko w nim działa. Na przykład możemy chcieć udowodnić, że jeżeli kompilator zaakceptuje kod programu (i wygeneruje binarkę), to ten program zawsze będzie działał (zawsze = z dokładnością to jakichś tragicznych sytuacji w stylu odcięcie zasilania, ale po prostu w programie nie ma buga). Możemy też dowodzić czegoś prostszego, na przykład, że typy zmiennych się zgadzają i nigdy nie dostaniemy InvalidCastException, lub że pole w jakimś typie istnieje. Stąd biorą się różne języki, zaczynami od algebry lambda, dokładamy liczby naturalne i typy, potem subtyping, dochodzimy do systemu F, F omega, F z podtypami itp, możemy tworzyć obiekty, badać, czy wszystko ładnie działa, ale kluczowe jest to, że możemy udowodnić, że to jest poprawne.

Teraz możemy wyjść od innego podejścia, po prostu weźmy architekturę von Neumanna (+- maszynę Turinga), dorzućmy kilka instrukcji, a potem rozwijajmy wedle potrzeb. Na początku mamy jakieś integery i wskaźniki, potem implementujemy na tym rekordy, potem dokładamy dziedziczenie i tak dalej. Trudność polega na tym, że to podejście jest łatwe do zrozumienia, ale trudne do dowodzenia poprawności, bo nie ma tam żadnego formalizmu. Ponadto nie ma wprowadzonej klasyfikacji/taksonomii, więc trudniej jest generalizować rzeczy i mieć całościowe spojrzenie. Z tego powodu łatwiej o popełnienie błędu, na przykład kowariantne tablice w Javie. Oczywiście to nie znaczy, że jak ktoś zaprojektuje język w ten sposób, to zawsze będą błędy, ale poleganie na wyczuciu bez dowodów często prowadzi do problemów.

Do tego dochodzi kwestia kompatybilności wstecznej. Architektura x86 ma już kilkadziesiąt lat, wiele rzeczy w procesorach jest skopane, bo muszą wspierać stare oprogramowanie, a to nie pozwala na posprzątanie i uproszczenie. Przykładowo teraz system operacyjny musi przejść przez kilka trybów przy starcie komputera, najpierw rzeczywisty, potem chroniony, potem wreszcie 64-bitowy, skonfigurować segmentację (której w 32-bitach prawie nikt nie używał, a w 64-bitach została bardzo ograniczona), a to tylko dlatego, że ludzie ciągle używają starych aplikacji. Nawet jak za x lat wszyscy będą na 64-bitach, to i tak ta zgodność zostanie, bo nie da się ot tak zmienić świata (przykład IPv4 i IPv6 fajnie to teraz pokazuje). Z tego powodu dużo rzeczy jest tak naprawdę hakami i łatami dookoła czegoś, a instrukcja MOV na x86 jest Turing complete.

I teraz dochodzimy do kwestii dodania nowego ficzera do języka. Jeżeli jest to język oparty o matematykę, to nowy ficzer nie może zepsuć już istniejących i musimy być w stanie udowodnić, że ładnie wszystko pasuje. Ale w językach wychodzących od architektury jest to trudne, więc często dowiadujemy się o jakichś problemach dopiero po jakimś czasie, a potem zaczyna się łatanie. To trochę jak z dynamicznym i statycznym typowaniem. W tym pierwszym możemy mieć dobry program, ale jak popełnimy błąd, to dowiemy się o tym dużo później, niż w tym drugim.

0

Kolejny temat z cyklu "słaba zarzutka", gdyby nie ilość poważnych odpowiedzi...

1 użytkowników online, w tym zalogowanych: 0, gości: 1