Powiedziano mi, że HTML to język znaczników, C ++ to język programowania, co może mieć na to wpływ?


22

Moi znajomi od programowania zawsze mówią mi, że HTML to język znaczników, a C ++ to język programowania. Kiedy pytam, jaka jest różnica, nigdy nie dają mi rozsądnej odpowiedzi.

Co może sprawić, że można wywołać C ++ jako język programowania, a HTML nie?


5
Czy masz na myśli coś innego niż ukończenie Turinga?
Manoj R

1
@ManojR Nie wszystkie kompletne języki Turinga są uważane za języki programowania, na przykład XSLT.
yannis

Re zamknięcie, zobacz Q / A w meta na meta.programmers.stackexchange.com/q/5397/70298
miraculixx

1
Świetna edycja @gnat, dzięki. Pytanie zostało ponownie otwarte, nieaktualne komentarze zostały usunięte.
yannis

1
@YannisRizos Właśnie skopiowałem wyjaśnienie podane przez OP w komentarzach . Zastanawiam się, dlaczego tak wielu użytkowników umieszcza ważne komentarze na temat swoich postów w komentarzach zamiast edytować; ja prawie zawsze edytuję swoje posty w takich przypadkach
gnat

Odpowiedzi:


45

Język programowania to zapis przeznaczony do przekazywania instrukcji do maszyny. Zgodnie z tą definicją zarówno C ++, jak i HTML są językami programowania, podobnie jak zapis Joseph Marie Jacquard użył w 1801 roku do programowania swoich krosien .

Jednak wraz z rozprzestrzenianiem się języków, które są wykorzystywane do strukturyzacji i / lub opisu danych, definicja języka programowania została zmieniona tak, aby obejmowała tylko języki zdolne do wyrażania algorytmów. Jest to dziś bardziej powszechna definicja i wyklucza języki takie jak HTML lub XML.

Istotą obecnej definicji jest koncepcja kompletności Turinga . Większość języków programowania jest kompletna Turinga, a kompletność Turinga jest często cytowana jako jedna z kluczowych cech oddzielających język programowania od dowolnego innego języka komputerowego. Jest to wystarczająca ogólna zasada, ale nie do końca dokładne:

  1. Niektóre kompletne języki inne niż Turing są uważane za języki programowania, na przykład miłość .
  2. Niektóre języki, które nie są powszechnie uważane za języki programowania, są kompletne Turinga, na przykład XSLT .
  3. Samo kompletowanie Turinga nie mówi wiele o przydatności języka .

W zależności od kontekstu możesz wybrać dowolną definicję.

Edytować:

Niech będzie dalej wiadomo, że implementacja języka nie nadaje właściwości samemu językowi, na przykład: specyfikacja języka może definiować kompletny język Turinga, ktoś mógłby wprowadzić go przypadkowo, nie dopuszczając kompletności. Ta implementacja jako niekompletna nie oznacza jednak, że sam język nie jest kompletny (raczej oznacza to, że implementacja jest niezgodna). Szczegóły języka i szczegóły konkretnej implementacji języka należy rozpoznać jako osobne rzeczy, dlatego niedopuszczalne jest nazywanie języka interpretowanego lub kompilowanego itp.


6
Czy mógłbyś rozwinąć temat „XSLT nie uważany za język programowania”. Nigdy tego nie widziałem i IMO wypowiadając się, kwestionowałbym czyjąś wiedzę lub kompetencje z PL. Nie mogę nawet wymyślić żadnego powodu, dla którego XSLT nie powinien być traktowany jako PL (XSLT może być łagodnym przypadkiem leczenia tarniny, ale to inna kwestia).
bhaak

@bhaak Nie mówię, że nie należy tego traktować jako języka programowania. Języki transformacji danych nie są powszechnie uważane za języki programowania, co absolutnie nic nie mówi, jeśli są lub nie są językami programowania. Widziałem logikę biznesową w XSLT i osobiście uważam to za język programowania. Ale pewnie bym tego nie zrobił, gdybym po raz pierwszy nie widział tego w pracy. W każdym razie, kogo to obchodzi?
yannis

Możesz dodać zdanie lub dwa na temat tego, co oznacza bycie kompletnym.
phant0m


@ think123 Nie sądzę, żebym mógł podać prostszą definicję niż ta z Wikipedii, i już podłączyłem odpowiedni artykuł w odpowiedzi.
yannis

5

Wyrażenie „Wiem, kiedy to widzę” to kolokwialne wyrażenie, za pomocą którego mówca próbuje sklasyfikować obserwowalny fakt lub zdarzenie, chociaż kategoria jest subiektywna lub nie ma jasno określonych parametrów. Frazę tę wykorzystał słynny sędzia Sądu Najwyższego Stanów Zjednoczonych Potter Stewart, aby opisać swój test progowy pod kątem nieprzyzwoitości w Jacobellis przeciwko Ohio (1964).

- „Wiem, kiedy to widzę” artykuł w Wikipedii

Podobnie jak wulgaryzmy, myślę, że wszyscy znamy język programowania, kiedy go widzimy. Najwyraźniej OP to robi, ponieważ już oceniłeś C ++ jako język programowania, a HTML nie.

Więc jaki jest dokładnie cel formalnej definicji? Yannis wyjaśnił już, dlaczego najpopularniejsza definicja, kompletność Turinga, jest wadliwa: prowadzi do kategoryzacji, która sprzeciwia się testowi „wiem, kiedy go widzę”.

Daję wam do zrozumienia, że każda definicja, którą możecie wymyślić, doprowadzi do niektórych języków, które według nas nie są językami „programowania”, będą tak sklasyfikowane; lub niektórych językach, które wszyscy czujemy „programowanie” języki zostaną zakwalifikowane jako nie jest tak.

Dlaczego nie pójdziesz z jelitami? Używam prostej heurystyki: język programowania to język, którego głównym celem, moim zdaniem i zgodnie z moimi spostrzeżeniami, jest pisanie programów. Nie oznaczać treści. Nie przekształcać XML. Pisać programy ogólnego przeznaczenia. Wolę po prostu to wiedzieć, kiedy to widzę, niż próbować doprecyzować formalną definicję i nie widzę żadnej prawdziwej wartości, która mogłaby pochodzić z próby takiej definicji.


Ale teraz ograniczacie „języki programowania” do „języków programowania ogólnego zastosowania”. To drugie jest tym, co ludzie zwykle mają na myśli, mówiąc „język programowania”, ale dążenie do tego, jakie dokładnie są cechy definiujące „język programowania”, ma również sens w zrozumieniu, jakie są języki programowania, jak działają i jakie są ich ograniczenia. Na przykład każdy wykwalifikowany programista musi rozpoznać problem zatrzymania, gdy go napotka, co byłoby trudne bez przestudiowania teoretycznych granic języków programowania.
JesperE

@JesperE: Z przyjemnością ograniczam moją ocenę „wiem, kiedy to widzę” do języków programowania, które mają co najmniej dość ogólny cel. Nie zgadzam się również z tym, że „każdy wykwalifikowany programista” potrzebuje jakiejkolwiek wiedzy na temat problemu zatrzymania - wiem, że moja wiedza na ten temat z mojej formalnej edukacji informatycznej nigdy nie była dla mnie istotna przez prawie dwie dekady rozwoju zawodowego.
Carson63000,

1
Jeśli nie musiałeś tego poruszać, to prawdopodobnie dobrze. To nie znaczy, że nie jest ważne wiedzieć. Jakość pasów bezpieczeństwa nie jest oceniana na podstawie tego, jak często trafiło ono do użytku, prawda?
JesperE

Czy według heurystyki elisp jest językiem programowania?
Brian

@Brian: interesujący! Wydaje mi się, że zawsze myślałem o elisp jako implementacji Lisp, która wyraźnie jest językiem programowania, nawet jeśli ta konkretna implementacja ma znacznie bardziej szczegółowy zakres.
Carson63000 27.04.13

2

Języki znaczników zajmują się głównie sposobem wyświetlania informacji i na ogół brakuje im infrastruktury programowania zmiennych, matematyki, porównania, podejmowania decyzji (jeśli ... to), pętli (for, while) itp.

HTML sam w sobie jest statyczny; to znaczy, podobnie jak edytor tekstu, ma na celu prezentowanie informacji takimi, jakie są. Tylko po dodaniu pewnego rodzaju języków programowania (zwykle języków skryptowych, takich jak JavaScript, PHP itp.) Strony HTML mogą mieć „zmieniającą się” treść. Języki skryptowe zapewniają możliwości „programowania” ze zmiennymi, matematyką, porównaniami, podejmowaniem decyzji, pętlami itp.


0

HTML jest językiem deklaratywnym. Sam w sobie niewiele robi, po prostu opisuje dokument i jego zawartość (używając znaczników o znaczeniu semantycznym).

Z drugiej strony C ++ coś robi. Definiuje funkcje i klasy, ale opisuje również, w jaki sposób te funkcje powinny ze sobą współpracować, w jaki sposób ich wejścia i wyjścia są powiązane w znaczący sposób oraz w jaki sposób aplikacja powinna działać jako całość.

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.