Autor Zpráva
RastyAmateur
Profil
Krásné odpoledne,

zrovna jsem četl pár článků o všelijakých programovacích jazycích a napadlo mě pár otázek, které jistě většina z vás dokáže zodpovědět...

Jak programovací jazyky vznikají? Je mi jasné, že každý programovací jazyk byl (pravděpodobně) napsán v nějakém jiném programovacím jazyku. Často jsem četl, že spousta programovacích jazyků vznikla na základě Cčka. Jak tedy vzniklo Cčko? Jak je možné, že programovací jazyk vytvořený v jiném jazyce je rychlejší než původní jazyk sám? Nebo se v tom snad pletu?

Jak je asi vidět - mám v tom neskutečný guláš. Tyto teoretické základy mi očividně chybí. Pokud někdo zná nějakou "učebnici", nebo článek zabývající se těmito či podobnými tématy, budu rád, když mi ho sem hodí (angličtina by neměla vadit).

Děkuji, RA
Martin2
Profil *
RastyAmateur:
Jak programovací jazyky vznikají?
Přirozenou lidskou leností.

Když se lidem přestalo chtít psát programy jako dírky do papírové pásky, vznikl assembler. Pak se jim zdál assembler nepřehledný a špatně přenositelný, vymysleli céčko. Když céčko přestalo stačit potřebám velkých programů a velkých týmů, doplnily se do něj objekty a vzniklo C++. A tak dál.

Jak je možné, že programovací jazyk vytvořený v jiném jazyce je rychlejší než původní jazyk sám? Nebo se v tom snad pletu?
V tom se spíš pleteš. Vyšší jazyky jsou jednodušší pro práci, ale nebývají rychlejší.
RastyAmateur
Profil
Martin2:
V první řadě děkuji za reakci!
Takže když napíšu program v tom assembleru tak bude velice rychlý (oproti stejnému programu např. v Pythonu)?
Martin2
Profil *
RastyAmateur:
Takže když napíšu program v tom assembleru tak bude velice rychlý
Teoreticky. Překladače třeba z céčka bych nepodceňoval. Jsou už hodně kvalitní, umí optimalizace, které by člověka ani nemusely napadnout.
Joker
Profil
RastyAmateur:
Takže když napíšu program v tom assembleru tak bude velice rychlý (oproti stejnému programu např. v Pythonu)?

To závisí na tom, jak ten program bude napsaný.
I v PHP, nebo jiném jazyku, lze napsat dva kódy, které řeší stejný problém a v rychlosti se budou lišit klidně o několik řádů.

Na jedné straně je pravda, že optimálně napsaný program v assembleru bude rychlejší, přinejhorším stejně rychlý, jako optimálně napsaný program v nějakém vyšším programovacím jazyku.
Ale na druhé straně ve vyšším programovacím jazyku je snazší se tomu optimu přiblížit.
Naprogramovat určité zadání v assembleru bude typicky mnohem náročnější a s vyšším rizikem chyb, než naprogramovat totéž zadání ve vyšším programovacím jazyku.

Pro srovnání, kód, který vypíše čísla od 1 do 9 v PHP:
for ($i = 1; $i <= 9; $i++) echo $i;

A totéž v assembleru (převzato odsud):
section    .text
   global _start        ;must be declared for using gcc
    
_start:                    ;tell linker entry point
   mov ecx,10
   mov eax, '1'
    
l1:
   mov [num], eax
   mov eax, 4
   mov ebx, 1
   push ecx
    
   mov ecx, num        
   mov edx, 1        
   int 0x80
    
   mov eax, [num]
   sub eax, '0'
   inc eax
   add eax, '0'
   pop ecx
   loop l1
    
   mov eax,1             ;system call number (sys_exit)
   int 0x80              ;call kernel
section    .bss
num resb 1
Alphard
Profil
RastyAmateur:
Jak je možné, že programovací jazyk vytvořený v jiném jazyce je rychlejší než původní jazyk sám? Nebo se v tom snad pletu?
Podle mě tady chybí jedna důležitá věc. Programovací jazyky lze rozdělit na kompilované a interpretované. Zatímco při vytváření sekvence interpretovaný jazyk napsaný v interpretovaném jazyce (atd.) bychom postupně nutně ztráceli rychlost, u kompilovaných jazyků to neplatí. Ať je program kompilovaný v libovolně pomalém prostředí, jeho výsledná rychlost závisí jen na kvalitě kompilátoru.
V PHP je možné napsat kompilátor vlastního jazyka a program vytvořený v tomto prostředí by mohl být mnohem rychlejší než PHP samotné.
RastyAmateur
Profil
Martin2, Joker, Alphard:
Znovu děkuji za reakce. Všem těmto odpovědím rozumím, ale stále si je nejsem schopen srovnat a zařadit. Jak to tedy aktuálně chápu:

Napíšu aplikaci např. v Cčku. Ten kód se převede do assembleru. Assemblerský kód se převede do strojového kódu, který se předá hardwaru [smal](typuji procesoru, ale v hardwaru se vůbec nevyznám, takže to je vážně jen typ)[/small] a ten vykoná daný script.

Chápu to alespoň částečně správně?


Ještě jedna doplňující otázka:
Binární kód je strojový kód typu 00101011 00101100?
Joker
Profil
RastyAmateur:
Napíšu aplikaci např. v Cčku. Ten kód se převede do assembleru. Assemblerský kód se převede do strojového kódu

Bez toho assembleru, řekl bych.
Assembler je lidsky čitelný zápis strojového kódu (ale termíny assembler a strojový kód se někdy zaměňují), takže pro kompilátor by to byl zbytečný mezikrok.

Ale jinak ano, strojový kód už zpracovává počítač.

Binární kód v tomhle kontextu bude spíš synonymum pro strojový kód.
Jinak jak vypadá strojový kód se dá podívat, stačí si otevřít nějaký .exe soubor třeba v Notepadu a část toho obsahu je strojový kód.
RastyAmateur
Profil
Joker:
Děkuji.. :)
Davex
Profil
Joker:
Bez toho assembleru, řekl bych.
Není překladač jako překladač. Třeba v GCC proběhne proces překladu celkem čtyřmi kroky: preprocesor, kompilátor, assembler a linker.
RastyAmateur
Profil
Ještě dotaz. Jak je to konkrétně u PHP? Pokud vím, tak je napsaný v Cčku. To se kód přeloží do Cčka a ten se následně přeloží do strojového kódu?
Davex
Profil
RastyAmateur:
To se kód přeloží do Cčka a ten se následně přeloží do strojového kódu?
Pokud tím kódem myslíš PHP skripty, tak ne.

Většinou jsou dvě možnosti:

1) PHP do verze 5.6 přeloží skript do bytecode, který při běhu interpretuje
2) PHP od verze 7 nebo třeba jiná implementace PHP v HHVM přeloží skript do bytecode a následně před spuštěním do strojového kódu (AOT/JIT), který se přímo vykonává v procesoru
RastyAmateur
Profil
Davex:
Děkuji :)

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0