dlaczego nie połączyć najlepszych cech wszystkich istniejących języków programowania i dopasować do uniwersalnego języka programowania?
dlaczego nie połączyć najlepszych cech wszystkich istniejących języków programowania i dopasować do uniwersalnego języka programowania?
Odpowiedzi:
Z tego samego powodu nie używasz szwajcarskiego noża wojskowego do rzeźbienia kurczaka ...
Szwajcarski scyzoryk ma na ogół ostrze, a także różne narzędzia, takie jak śrubokręty, otwieracze do puszek i wiele innych. Te przystawki są schowane w rękojeści noża poprzez mechanizm punktu obrotu ...
Konstrukcja noża i jego elastyczność doprowadziły do światowego uznania ...
Dlatego
To, co masz w programowaniu, to bardzo duża dziedzina problemowa. Ta domena rozciąga się niezwykle i w wielu kierunkach.
Właśnie dlatego wbudowane kontrolery lotu są napisane w języku C, a strony internetowe w języku PHP, Java, Rails, .NET i wielu innych.
W przypadku wbudowanego kontrolera lotu mam około 128 tys. Pamięci do pracy, a ponadto, jeśli mój kod otrzyma nieobsługiwany wyjątek, samolot ulegnie awarii, 200 osób zginie, a ja dostanę skargę o dostrojenie 1 mld USD i muszę wysłać inżynierów do każdego lotnisko na świecie, aby naprawić samoloty, które są uziemione, tracąc moich klientów 10 mln USD dziennie. Muszę pracować z językiem, który jest bardzo napięty i ma niewielką liczbę ruchomych części, które mogą się nie udać.
W mojej aplikacji internetowej mam kilka GB pamięci do pracy, ale prędkość sieci jest ograniczona (w mniejszym stopniu codziennie, ale to prawdopodobnie największy limit w sieci). Będę patrzył na język, który daje mi mnóstwo funkcji i produkuje dane, które można przesyłać tak szybko, jak to możliwe. Naprawdę nie dbam o to, czy moja strona ulegnie awarii, może stracę kilka sprzedaży (100 USD) i będę musiał załatać przypadek użycia, który zbombardował, nic wielkiego.
Strony internetowe nie były pisane w języku C przez ponad 15 lat (ktoś robi jakieś skrypty cgi?) I o ile wiem, kontrolery lotów dopiero teraz zaczynają patrzeć na C ++, ale nawet wtedy w bardzo ograniczony sposób.
Jeśli nie masz skrzynki na narzędzia lub masz tylko jeden z tych małych młotków z końcówkami śrubokręta w wydrążonym uchwycie, to mam dla ciebie wielką sympatię.
Poważnie. Jeśli pójdziesz do warsztatu samochodowego, czy twój mechanik ma tylko jedno narzędzie typu „zrób to wszystko” w swoim zestawie narzędzi? On (lub ona) jest profesjonalistą, z profesjonalnymi narzędziami specjalnie zaprojektowanymi do wykonywania różnych zadań naprawy samochodów.
Podobnie profesjonalni programiści powinni posiadać wystarczający zestaw narzędzi do wykonywania swoich transakcji. Jeśli otworzysz swój zestaw narzędzi i zobaczysz tylko [oprogramowanie równoważne] śrubokręt Philips, nie możesz uważać się za profesjonalistę.
Możesz obrócić śrubę za pomocą klucza płaskiego, klucza płaskiego, klucza zapadkowego lub klucza nastawnego. Możesz nawet przekręcić śrubę szczypcami za pomocą szczypiec do połączeń przesuwnych, niezgrabnie, z niewielkimi lub poważnymi uszkodzeniami. Ale dość trudno jest przekręcić śrubę młotem.
Inny rodzaj odpowiedzi na inne - myślę, że istnieje potencjał, aby język stał się „uniwersalny”, pozwalając na cechy i paradygmaty wielu innych języków, choć może nie jest to ściśle zaprojektowany język, o którym myślisz.
Aby użyć powyższej analogii brettmjohnsona , idea, że każdy język programowania jest narzędziem wewnątrz pudełka (lub szwajcarskiego noża wojskowego), jest założeniem, które wszyscy przyjmują, ale tak naprawdę jest błędnym założeniem.
Co jeśli językiem programowania był zestaw narzędzi?
Mam na myśli, co jeśli możesz dodawać i usuwać funkcje z języka, jak chcesz, i mieć własny zestaw narzędzi z potrzebnymi w nim narzędziami - nawet jeśli narzędzia są do różnych celów.
Koncepcja istnieje już częściowo. Na przykład języki takie jak Nemerle pozwalają na dodawanie składni do języka i jako takie możesz wziąć „najlepszą funkcję z języka X” i dodać ją do Nemerle (lub własnego). Nie musi to oznaczać ciągłego pisania własnych makr - każdy język (lub paradygmat) można zdefiniować w makrze w standardowej bibliotece - tak, jak można import Haskell; import Prolog;
, i zacząć pisać dwa języki tak, jakby były częścią Twój język?
Pytanie zatem brzmi - w jaki sposób można współpracować ze sobą w różnych językach / paradygmatach? Chociaż nie mogę odpowiedzieć na to pytanie, frameworki takie jak .Net i JVM oferują niektóre rozwiązania - języki są przynajmniej częściowo kompatybilne ze względu na sposób ich kompilacji. Możesz wziąć dowolny kod napisany na przykład w C # i używać go z F # bez reklamacji.
„Problem” w obecnym rozwiązaniu polega na tym, że używanie tych języków razem wymaga utworzenia ich jako osobnych projektów, które nie mogą się nawzajem odnosić - możesz mieć tylko odniesienie 1-stronne. Bariera językowa polega na tym, że każdy projekt kompiluje wszystkie swoje pliki osobno w języku Common Intermediate Language, zanim jakikolwiek inny projekt będzie miał do niego dostęp.
Krokiem w kierunku usunięcia tej bariery byłoby umożliwienie kompilacji kodu różnych języków (np. C # i F #) w tym samym projekcie. Teoretycznie możesz skompilować każdy plik osobno (lub w grupach - jeśli mają typy częściowe lub odwołania cykliczne), a następnie skompilować pliki w innym języku, które mogą uzyskać dostęp do już skompilowanych obiektów (CIL). Aby to zadziałało, musisz ściśle zdefiniować kolejność kompilacji - ale kolejność kompilacji jest już wymagana w przypadku F #.
W każdym razie nie mówię „zdecydowanie może istnieć uniwersalny język”. Sugeruję, że istnieje potencjał znacznie lepszej interoperacyjności między językami niż obecnie. W rzeczywistości raczej nie poprawi się to bardzo szybko, tylko z powodu ogromnej ilości pracy, jaką jest wdrożenie języka i bibliotek, narzędzi itp. Potrzebnych do jego użycia.
Najlepsze funkcje niektórych języków są sprzeczne z najlepszymi funkcjami innych.
Na przykład: Odbicia uwzględniające pisanie na klawiaturze to naprawdę fajna funkcja, ale nie byłaby bardzo warta w luźno pisanym języku, ale luźne pisanie może czasami być prawdziwą korzyścią.
Nawet w jednym języku nie zawsze możesz korzystać ze wszystkich najlepszych funkcji jednocześnie, ponieważ są one ze sobą sprzeczne.
„Jack of all trade - master of none”. przychodzi mi na myśl.
Niektóre programy wymagają szybkości, inne dużych ilości pamięci lub szybkiego dostępu do dysku. Niektóre języki są dobre w jednym, ale złe w innym - nie sądzę, żebyś otrzymał język, który byłby w ogóle dobry.
Tak więc, chociaż możesz napisać praktycznie dowolny program w dowolnym języku, nie masz gwarancji, że to „najlepszy” program, jaki możesz napisać, aby rozwiązać ten problem.
Jest. Żadne narzędzie jest najlepszy do wszystkiego, ale niektóre narzędzia, takie jak wielu języków programowania służą do wszystkich celów, nie najlepiej dla wszystkich.
Możesz wybrać najlepsze narzędzie do pracy, ale istnieją języki programowania, które można wykorzystać do wszystkich celów i możesz je wybrać. Nie polecam, ale jest to możliwe.
Z powodu czegoś nazywam „paradoksem uogólnienia / specjalizacji”, który prawdopodobnie ma inną nazwę i tak naprawdę nie jest paradoksem
Im bardziej ogólny język programowania, tym więcej kodu potrzeba, aby coś osiągnąć. Im bardziej specjalistyczny język, tym mniej możesz go osiągnąć.
Języki kształtują sposób myślenia. Dotyczy to języków naturalnych. Jeśli dziecko zna tylko jeden język z cyframi „jeden, dwa, wiele”, nauczanie tego dziecka matematyki jest… trudne. (Przepraszam, nie mam linku) W języku angielskim rozmawiamy o różnych czasach, jakby były miejscami - stąd można sobie wyobrazić koncepcję podróży w czasie. W niektórych innych językach pomysł podróży w czasie nigdy nie pojawiłby się wśród jego użytkowników.
Dotyczy to również języków programowania.
Dlatego jeśli mamy jeden język programowania, wszyscy pomyślą o wszystkich zadaniach obliczeniowych dokładnie tak samo. Dlatego nie będziemy badać alternatyw, a najlepszy sposób na zrobienie czegoś pozostanie nieodkryty.
Najbardziej zbliżoną rzeczą do uniwersalnego języka jest C. C bardzo dokładnie odwzorowuje podstawowe pojęcia sprzętowe (jak to się dzieje w sprzęcie), a programy w każdym * języku można konwertować na C. (Zobacz, jak CFront używał kompilatorów C do asemblera zadania) Problem z C polega na tym, że wyżej wymienione konwersje nie miałyby sensu z perspektywy programistów C.
„Lambdas” były zawsze możliwe w C. Składnia jest wyłączona, w tym kod rozłożony na cały projekt / plik, dlatego nie było to preferowane rozwiązanie. W wersji bez przechwytywania / aktualizacji / etc zdefiniuj funkcję gdzieś indziej i przekaż wskaźnik do funkcji. (patrz qsort () ) Aby użyć lambd z przechwyconymi wartościami, ilość i złożoność kodu, który musisz napisać, znacznie wzrasta - o ile mi wiadomo, że nikt nigdy nie napisał kodu używającego tej metody programowania w C. W przeciwieństwie do języków, w których lambdy są częścią języka i są używane wszędzie.
Główna różnica między C i C ++ jest to, jak można prosić C ++, aby dbać o rzeczy dla ciebie; ale z jednego wiersza kodu nie można już zobaczyć, jak bardzo o to prosisz. Odpowiedź brzmi: to zależy (od całego tego innego kodu).
Niektóre języki programowania doskonale nadają się do określonych zadań, ale tam, gdzie większość obecnych programów na całym świecie po prostu nie miałaby sensu, gdyby zostały zaprogramowane w tym języku. To znaczy, jeśli język mógłby zostać użyty do wdrożenia tego programu na początku, co nie jest dane.
Niemożność posiadania uniwersalnego języka z technicznego punktu widzenia? To totalny nonsens. Państwo moglimieć uniwersalny język, który obejmuje wszystkie podstawy. Problem jest głównie historyczny: różne języki zostały wymyślone, aby robić różne rzeczy i być używane w różnych społecznościach. Wielu z nich utknęło. Dodaj do tych preferencji (vi! Emacs! Czekaj, miałem na myśli Java! C #, czekaj miałem na myśli Microsoft, Open Source, itp. Itd. Itp.) I ogólne osadzanie historycznych wypadków ... Spójrz na naturalne języki w małym kraju jak niektóre kraje europejskie, aby zobaczyć, jak szalony może stać się ten temat. Niektóre miasta mają swoją dumę i radość, mały dialekt, że tylko oni mówią. Narody i społeczności programistów nie różnią się tak bardzo, ani społeczności programistyczne nie są bardziej racjonalne. Gdyby tak było, wszyscy mówilibyśmy esperanto i programowali w Universal coś, coś ...
Błędem jest myśleć, że „łączenie wszystkich funkcji” poprawi język.
Bardziej prawdopodobne jest, że skończysz z rozdętym, złożonym, nieczytelnym bałaganem.
Dobry projekt językowy wymaga wyboru i kompromisów. Prawdopodobnie najlepszymi / najbardziej rewolucyjnymi / odnoszącymi największe sukcesy językami są te, które wyjmują coś i zapewniają lepszą alternatywę niż dodawanie nowych rzeczy. Np.
Na górze jest świetna rozmowa wuja Boba Martina - The Last Programming Language
goto
. Ale podoba mi się reszta odpowiedzi. Najważniejsze, że C pozwala ci nie dbać o to, gdzie dokładnie w pamięci jest wszystko i co znajduje się w jakim rejestrze, o której godzinie, i ukrywa licznik programu (pod względem dokładnego adresu, na którym on siedzi, ponownie. Możesz go przenieść prawie na poziomie precyzji montażu z goto).
Nie ma żadnego narzędzia, które ma wszystkie najlepsze funkcje. Na przykład fajną funkcją Javascript i Scheme jest to, że są małe, więc jeśli zaczniesz pakować funkcje, już na tym straciłeś.
Wciąż Cobra wygląda obiecująco w kierunku posiadania wszystkich fajnych funkcji z innych języków. :-)
Ponieważ jeśli stworzysz taki język, będzie to kolejny nowy język. Możesz mieć dużą rzeszę fanów, ale wszystkie pozostałe języki nadal będą istnieć.
C wciąż istnieje, mimo że od tego czasu wymyślono wiele nowych języków.
Można powiedzieć, że python jest tak uniwersalnym językiem, ale jest też rubin.
Powodem istnienia wielu języków jest po prostu to, że jest wielu programistów, a niektórzy z nich lubią tworzyć nowe języki.
Powodem, dla którego nie ma jednego uniwersalnego języka, na który wszyscy się zgadzają, jest to, że programowanie jako rzemiosło nie jest podyktowane żadną instytucją, która podejmuje całą decyzję. Każdy może robić, co chce.
To dobra rzecz.
Przy tym wszystkim, co napisano do tej pory, trudno jest dodać wiele nowych uzasadnień, ale dodam kilka.
Ewolucja: nie tylko systemy biologiczne są wprowadzane, mutowane i poddawane najsilniejszej konkurencji o zasoby i niszę, którą można nazwać własną. Konkurs jest dobry i przyspiesza.
Dojrzałość: Tworzymy języki komputerowe prawdopodobnie przez mniej niż sto lat. Nie możemy jeszcze uzyskać odpowiedzi, ponieważ nie znamy jeszcze wszystkich pytań.
Osobna geneza: Nie jestem pewien, czy to właściwe słowo, ale na świecie istnieje wiele systemów pisania, które zaczęły się w wielu regionach geograficznych. Pomyśl o klinie, który był częściowo podyktowany wymogami rzeźbienia w glinianych tabliczkach. Pomyśl o sanskrycie, alfabecie greckim, hebrajskim, rzymskim, arabskim. Hieroglify, chińska metoda pięknego pisania z ponad 6000 symbolami, która jest wspólna w wielu krajach Azji Wschodniej. Pomyśl o bardziej współczesnych mieszanych alfabetach o podłożu fonetycznym, takich jak cyrylica, katakana i Hirigana. Nie jestem lingwistą, więc nie rozpalajcie zbyt surowo nieścisłości, ale kiedy kultury na całym świecie czegoś potrzebują, stworzą to i zrobią to z konieczności. Języki komputerowe pojawiły się, gdy było dużo komunikacji na całym świecie i podobnie jak systemy Imperial i Metric, pochodzi z miejsc o silnym przywództwie pomysłowym. Ale języki programowania służą wielu różnym kulturom (niektóre są kulturami korporacyjnymi), więc odzwierciedlają ludzi, którzy je stworzyli. Języki komputerowe mają dziedzictwo kulturowe, które ukształtowało ich design i zastosowanie. W kulturze jądra systemu operacyjnego C i C ++ raczej nie będą wkrótce przestarzałe dla Javy (lub na odwrót), ponieważ umożliwiają generowanie natywnego kodu, bliskie / wydajne sprzężenie ze sprzętem do tworzenia warstw abstrakcji sprzętowej, a także mają znaczną liczbę zainstalowanych.
Projektowanie projektu: Języki programowania powstają przy użyciu różnych paradygmatów organizacyjnych. COBOL i Ada pochodziły z komitetów wchodzących w skład DOD, które miały dużą hierarchię. Jeśli dobrze pamiętam, C, C ++, Java i prawdopodobnie wiele innych pochodzi od jednego lub małej liczby projektantów. Fred Brooks porównuje wyniki komitetu z podejściem opartym na wizji w swoim artykule Design of Design (http://www.youtube.com/watch?v=pC-DlX-PaF4). Gdybyśmy dzisiaj usiedli, aby wybrać Da Vinci lub komitet do zdefiniowania uniwersalnego języka programowania, czy wiedzielibyśmy, kto lub jaką metodą powinien być zaprojektowany?
Może to trochę inaczej:
Co to jest język Mówiąc wprost, jest to słownictwo, składnia i semantyka.
Jaka jest Twoja pierwsza rzecz w języku programowania?
Ty definiujesz rzeczy - klasy, zmienne, metody - poszerzasz słownictwo i semantykę.
Dlaczego? Więc teraz możesz powiedzieć w nim rzeczy, których wcześniej nie mogłeś powiedzieć.
Czy ci się to podoba, czy nie, stworzyłeś nowy język specjalnego przeznaczenia.
IMHO, rzeczą, której należy szukać w języku ogólnego przeznaczenia, jest to, czy ułatwia tworzenie języków specjalnego przeznaczenia.
Oprócz argumentu szwajcarskiego noża wojskowego (który ma rację - trudniej jest zaprojektować dobry język o szerokim spektrum niż specyficzny dla domeny - ale to nie znaczy, że taki język nie byłby jednocześnie jednym i drugim. możliwy i dobry pomysł), występują problemy z „łączeniem najlepszych funkcji”:
Krótko mówiąc, projektowanie języka jest trudniejsze i bardziej skomplikowane. Chociaż możesz rzucić okiem na Scalę .
Visual Batch to próba dostosowania języka programowania. Poniższy link pokazuje, w jaki sposób interfejs programowania można dostosować do potrzeb uniwersalnego języka programowania.
http://sourceforge.net/apps/phpbb/visualbatch/viewtopic.php?f=4&t=4
Istnieje uniwersalny język programowania. Nazywa się to „językiem maszynowym” i wszystko w innym języku komputerowym jest ostatecznie wykonywane jako język maszynowy.
Jak to wygląda? Ciąg 0–9 i AF.
Ale to dziwka w użyciu. Dlatego Alan wymyśla język, który można przetłumaczyć na język maszynowy i jest bardziej odpowiedni do tego, co Alan chce robić. Bill wymyśla inny język dla tego, co Bill chce zrobić. Wkrótce masz Cobol i Fortran, Lisp i Java. Wszystkie są po prostu uproszczoną wersją języka maszynowego, łatwiejszą do pisania niektórych rodzajów programów, ale trudniejszą lub niemożliwą do napisania innych rodzajów programów. Jeden jest dobry do rozliczania, drugi jest dobry do kontrolowania promu kosmicznego.
Większość odpowiedzi tutaj koncentruje się na użyciu najlepszego narzędzia dla każdego problemu. Nie wierzę, że to wystarczający powód.
Jeśli spojrzysz na duże firmy, zwykle firma będzie miała tendencję do używania jednego (lub niewielkiej liczby) języków i technologii, nawet jeśli dla konkretnego projektu istnieje jakiś lepszy język.
Dzieje się tak, ponieważ korzyści wynikające z ulepszonej standaryzacji, łatwiejszego wsparcia, udostępniania kodu itp. Są (w większości przypadków) większe niż wartość dodana określonego języka.
Myślę, że wszystkie odpowiedzi „ponieważ nie rzeźbicie rzeźb ołówkiem” nie mają sensu.
Kto tutaj, PRAWDZIWY wybiera język przed każdym nowym projektem?
Prawda jest taka, musimy tylko kilka języków programowania, a świat programowania byłoby lepiej ten sposób: ludzie koncentrują się na tworzeniu się języka skryptowego lepiej zamiast być rozproszone w python / ruby / perl / younameit na przykład.
C # jest programowany na / dla Windows (w porządku, jest Mono, ktoś tutaj codziennie uruchamia C # pod aplikacją Mono?), Co powoduje, że użytkownicy kupują Windows7 / 8 i to zarabia dla Microsoftu.
Inne firmy robią to samo, a następnie Open Source wie lepiej, a także pan geniusz ... i mamy wiele podobnych języków, to po prostu egocentryczna natura ludzkości.
Musimy spojrzeć na ekonomię, aby odpowiedzieć na to pytanie. Gdyby zaoszczędzić pieniądze na biznes tylko w jednym języku, to byśmy go mieli. Ujednoliciliby go i wymagaliby od niego wszystkich. Inne języki marnieją w zakurzonych budynkach akademickich i piwnicach entuzjastów o dzikich oczach. Tak się nie stało, więc nie mogą one stanowić zachęty do generowania zysków w uniwersalnym języku programowania, ponieważ w przeciwnym razie ewoluowałby naturalnie.