Co sprawia, że ​​język jest „zoptymalizowany” do określonego zadania?


15

Często istnieją języki programowania, które specjalizują się w określonych zadaniach. Niektóre języki programowania doskonale sprawdzają się w arytmetyce tablic (takie jak macierze i użycie tablic wielowymiarowych), ale niektóre są znacznie lepsze w matematyce wyższego poziomu, która jest trudna do odtworzenia w innych językach (ale nadal jest taka sama).

A co z językiem, który lepiej nadaje się do określonego zadania lub celu końcowego niż inne języki, biorąc pod uwagę, że i tak po prostu kompiluje się w asemblerze?

Mówię o kompletnych językach Turinga, które są odpowiednikami Turinga.


1
To pytanie encyklopedyczne. Sugeruję, abyś go w jakiś sposób rozbił, uściślając.
André Souza Lemos

5
Czy błędem byłoby mówić „marketing”?
corsiKa

2
@corsiKa Tak, myślę, że to coś więcej niż kwestia marketingu.
Jeremy West

Odpowiedzi:


18

Jest kilka rzeczy do rozważenia:

  • Abstrakcja: co język traktuje jako „specjalny”? Czy macierze są pierwszorzędnymi wartościami, jak w Matlabie, czy koduje się je za pomocą prostszych typów, takich jak tablice, jak w C? C sprawia, że ​​myślisz o tym, jak implementowane są macierze, a Matlab nie.

    Podobnie, jeśli masz skomplikowany system komunikacji asynchronicznej, prawdopodobnie potrzebujesz pierwszorzędnych funkcji, aby móc wykonywać oddzwanianie.

    Im więcej dodanych funkcji, tym bardziej złożony staje się język. Tak więc, chociaż istnieją języki „wieloparadygmatyczne”, takie jak C ++ i D, większość języków wybiera niszę, wybiera rzeczy, które są ważne dla tej niszy, i traktuje je priorytetowo jako ich główne abstrakcje.

  • Wydajność: cała abstrakcja wiąże się z pewnym kosztem, niezależnie od tego, czy jest to czas kompilacji, czy czas wykonywania. Niektóre języki ograniczają się w sposób, który czyni je mniej abstrakcyjnymi, ale bardziej wydajnymi.

    Wczesny Fortran nie pozwalał na korzystanie ze wskaźników ani rekurencji, więc świetnie sprawdzał się w chrupaniu liczb, szybciej niż język taki jak C, w którym działało wiele pętli. Ale okropnie było kodować duże struktury danych, takie jak drzewa, gdzie potrzebne były wskaźniki do pośrednictwa. (Pamiętaj, że niewiele wiem o nowoczesnym Fortranie).

Zasadniczo zawsze występują kompromisy. Bardziej abstrakcyjne oznacza wolniejsze działanie lub większą złożoność w czasie kompilacji. Więcej funkcji oznacza bardziej złożony język. Niektóre funkcje przyspieszają niektóre czynności, a inne spowalniają, takie jak wskaźniki i rekurencja. Nie ma idealnego języka, więc każdy język osiągnie rodzaj lokalnego maksimum w przestrzeni cech językowych.


8

Ograniczenia niektórych języków ułatwiają implementację szybszego kodu (np. Fortran vs C i aliasing wskaźników), co stanowi kompromis między gotową wydajnością a możliwościami).

Język nie jest „zoptymalizowany” do konkretnych zadań, ale sprawia to implementacja, kompilatory i ograniczenia, które ułatwiają zrozumienie kodu przez kompilator. Prawdziwa sprawa dotyczy określonych bibliotek, algorytmy zaimplementowane w celu przyspieszenia procesu z przełącznikami w zależności od długości problemu sprawiają, że jest to optymalne.

Na przykład mnożenie wykorzystuje różne przypadki (patrz Mnożenie GMP .

Gdy język określa operacje matematyczne na wyższym poziomie, jego implementacja jest optymalna (w tym przypadku wydajna), ale nie jest to częścią specyfikacji języka.

Proszę spojrzeć na obliczenia rang macierzowych w Matlabie, Mathematice i Klonie (nie mogę teraz samodzielnie wykonać wszystkich testów, ale są one zgodne z moimi testami). Wszystkie te języki (środowiska) implementują tę samą operację wyższego poziomu, ale szczegóły implementacji różnią się, co daje różne czasy.

Kiedy niektóre zadania specyficzne dla domeny (tutaj również język specyficzny dla domeny) są ukierunkowane na określone obliczenia, są one ulepszane i optymalizowane (z biegiem lat) dla docelowych odbiorców. Jednak optymalizacja nie zawsze tak jest. Na przykład Perl ma długą historię obsługi ciągów, ale PCRE (tutaj po prostu wyrażenia regularne Perla) nie są najszybszymi (i używają dużo pamięci), ale są niezwykle ekspresyjne i potężne.

Ograniczenia języka mają znaczenie w procesie kompilacji, wspomniany aliasing wskaźnika zapobiega możliwości zmiany kolejności kodu i wymusza przeładowanie zmiennych.


9
Większość języków jest kompletna według specyfikacji Turinga, ponieważ nie wszystkie z nich określają stały rozmiar adresu w specyfikacji. Ograniczenie rozróżnienia między rzeczami takimi jak C, które są wielkością modulo adresu Turing Complete, jest dość ograniczające, a takimi, jak Coq, Agda lub System F, które wcale nie są Turing Complete.
jmite

1
@jmite dziękuję. Mam nadzieję, że to już nie zacienia różnic
Zły

@Evil: Cóż, myślę, że twoje stwierdzenie o językach, które nie mogą być zoptymalizowane pod kątem zadań, jest błędne. widzisz słowo optymalizuj z punktu widzenia komputera. Ale niektóre języki zostały zaprojektowane tak, aby ułatwić programistom i pozwolić implementatorom dowiedzieć się, jak to zrobić.
theDoctor

Wynika to z kąta wydajności, więc nie jest źle, właśnie wziąłem ten kąt, możesz rozważyć inny (zoptymalizowany, co oznacza, że ​​łatwiej jest napisać w nim określone zadania). „Co do języka, który lepiej nadaje się do określonego zadania lub celu końcowego niż inne języki [...]”, jestem bardzo pewny, że: „łatwiejsze do pisania, szybsze, tańsze itp. Mogą być zawarte w„ lepszym ”. Autor ani nie przyjął odpowiedzi, ani nie wyjaśnił ani nie skomentował, że żadna z udzielonych odpowiedzi nie dotyczy tego, o co pytano. Poza tym jest to jeden z czynników, dla niektórych osób ważniejszych niż dla innych
Zły

5

Moim zdaniem można to właściwie sformułować dość precyzyjnie: narzędzie (na przykład język programowania wraz ze standardowymi bibliotekami) jest optymalnym narzędziem dla określonej klasy problemów, gdy minimalizuje, w stosunku do wszystkich możliwych narzędzi, które można zastosować, oczekiwany koszt uzyskania wystarczająco poprawnego i wydajnego rozwiązania, w którym oczekiwane jest przejęcie określonego rozkładu prawdopodobieństwa dla wszystkich problemów w klasie problemów. Przeważnie ten koszt ma postać czasu programisty i obejmuje przewidywany czas projektowania, przewidywany czas debugowania, przewidywany czas potrzebny na edukację osoby, która nie zna jeszcze narzędzia, itp.

W praktyce prawie żadnej z tych wielkości nie da się zmierzyć. Mimo to uważam, że to właściwy sposób myślenia o problemie.


4

To doskonałe pytanie, na które nie można łatwo odpowiedzieć. Czy jest coś w języku Erlang, który czyni go odpowiednim do aplikacji telekomunikacyjnych w czasie rzeczywistym? A może chodzi o kompilator Erlang? A może chodzi o społeczność i ekosystem Erlang? Być może ludzie, którzy wiedzą, jak pisać aplikacje telekomunikacyjne, są ekspertami w Erlang, a ludzie, którzy znają Erlang, są ekspertami w aplikacjach telekomunikacyjnych? Podejrzewam, że wszystkie te czynniki odgrywają pewną rolę.

Erlang ma prawdopodobnie dwie funkcje, które sprawiają, że jest on dostosowany do takich aplikacji (uwaga: sam nigdy nie używałem tego języka) - ma dobrą obsługę współbieżności i dynamiczną aktualizację oprogramowania. Te funkcje byłyby przydatne również w wielu innych obszarach, ale inżynierowie telekomunikacji są fanatyczni w kwestii dostępności. Być może, gdyby osoby budujące strony internetowe były tak samo zaniepokojone wysoką dostępnością, jak osoby budujące centrale telefoniczne, Erlang również byłby tam popularny.


3

W innych odpowiedziach nie ma sensu optymalizowania języka do określonego zadania - nie chodzi tylko o to, co przyspiesza działanie kodu na danym sprzęcie; chodzi o to, jak wyraźnie i zwięźle konkretny język pozwala wyrazić rozwiązanie problemu. To bardzo zależy od dziedziny problemów i (wraz z szumem marketingowym, ignorancją istniejących rozwiązań i ego tripem pisania nowego języka) mamy wiele języków - celem jest, aby programista napisał mniej kodu, co jest mniej podatny na błędy i łatwiejszy do odczytania / zrozumienia / naprawy / ulepszenia dla następnego programisty.

Na przykład zarówno C, jak i C ++ mogą być używane do programowania obiektowego - i rzeczywiście, biblioteka GObject jest dobrym przykładem OO C. Struktura AC zawierająca wskaźniki funkcji może służyć do tego samego celu, co metody wirtualne w klasie C ++, i może wykonywać lepszy; karą programistyczną jest kod kleju do alokacji pamięci, inicjalizacji wskaźników funkcji i wyboru strategii wywoływania metod „macierzystych”. W większości przypadków pisanie jest łatwiejsze / bezpieczniejsze Class klass * = new class()niż struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....


Cóż, odpowiedź jmite zawiera punktor, którego brakuje w napisanych przez ciebie rzeczach. Napisałem o zadaniach specyficznych dla domeny, które są zoptymalizowane pod tym kątem. Lubię C, znam takie rzeczy jak OCC, ale nie sprawia, że ​​C jest zorientowany obiektowo (kompilator nie pomaga w tym i wielu optymalizacjom można zapobiec, nie ma śmieciarza itp.). Nie możesz przeciążać funkcji C jak w C ++, ale oczywiście możesz emulować dowolne zachowanie (jmite też o tym pisał). Nie rozumiem, w jaki sposób odpowiada to postawione pytanie.
Zły

2
@Evil: Programowanie obiektowe i język programowania obiektowego to dwie różne koncepcje. Programowanie obiektowe nie wymaga języka obiektowego. Prawdopodobnie wymaga tylko istnienia papieru lub tablic, abyś mógł zaprojektować UML.
slebetman

@slebetman Nie widziałem, żeby to nadchodziło. Prawdopodobnie nie potrzebujesz papieru i tablicy, możesz po prostu wyobrazić sobie przedmioty, a według niektórych osób tak myślimy, ale nie zbliża się to do obsługi języka przez koncepcje OOP. Przykro mi, ale to spór, którego nie chcę wybierać.
Zły

@Evil: Nie jestem taki pewien będąc w stanie śledzić to wszystko psychicznie bez jakiejś abstrakcji pomóc. Moja pierwsza praca otrzymywała dużą część kodu C, który wyglądał jak wszystkie tablice ze wskaźnikami funkcji (zajęło mi trochę czasu, aby zrozumieć, co oznacza ta dziwna składnia - wtedy nie było google) i walczyłem z tym, dopóki nie zobaczyłem wzoru i zdali sobie sprawę, że te tablice były obiektami, a wskaźniki funkcji były metodami. Kupiłem sobie małą tablicę i
zużyłem

1
@slebetman Biorąc pod uwagę, że programowanie obiektowe wyprzedza UML o co najmniej 20 lat, twoje twierdzenie, że projekty UML są niezbędne do orientacji obiektowej, wydaje się całkowicie fałszywe.
David Richerby,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.