Portál AbcLinuxu, 30. dubna 2025 14:09

Můj první erlang modul

13.4.2007 17:56 | Přečteno: 2009× | erlang | Výběrový blog | poslední úprava: 16.4.2007 11:15

Nedávno jsem narazil na úžasný nový (pro mě), průmyslově ověřený funkcionální jazyk. Jmenuje se Erlang. Jeho vlastnosti mě přiměly říct wow! Posuďte sami. Za pozornost stojí například distributed (no on je to taky tak trochu komplet OS co se dokáže tvářit, že jede jako by jeden homogenní OS na heterogenním HW) a Hot code upgrade (viz example 14), nebo "Mnesia is a nice example of the power of Erlang: in how many languages could you write a fully-featured industrial-strength distributed DBMS in less than 20,000 lines of code?"

Napsal jsem, že je pro mě nový, ale on tak zas nový není, vznikl už kolem roku 1987 a stále se vyvíjí (4 release v roce 2006 a od začátku 2007 už stihl dva další - teda jedná se spíš o upgrade nadstaveb a nástrojů jako OTB). Má velmi lehké thready, například na AMD Athlon XP 2200+ má režii na vytvoření vlákna, přijetí zprávy a odeslání zprávy 2,1 us (včetně ukončení vlákna a garbage collectingu, testováno na 100 mil. vláknech, na samotnou zprávu padne asi 0,4 us)

Tak jsem si řekl, že si ho trošku ošahám. Jedna z prvních věcí, co mě zajímala (mimo jiné), byla existence nějakého dokumentačního systému. A měl ho tam, edoc. Takže jsem si napsal takový jednoduchý modulek a zkusil si ho v edocu zdokumentovat. Zároveň jsem si to chtěl troško o benchmarkovat a proto jsem si udělal takový malý generátor permutací. Tady je:

%% @copyright 2007 Hynek Vychodil
%% @author Hynek Vychodil <pichi@nekde.top>
%%   [http://www.abclinuxu.cz/blog/Pichi]
%% @version 0.0.1
%% @end
%% =====================================================================
%% @doc perms - Permutation generator
%%
%% This module provides "simply" permutation generator with state support.
%%
%% == Usage ==
%%```
%%> perms:perms([a,b,c]).
%%[[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
%%> perms:foreach(fun(P)->io:format("~p~n",[P]) end, [a,b,c]).
%%[a,b,c]
%%[a,c,b]
%%[b,a,c]
%%[b,c,a]
%%[c,a,b]
%%[c,b,a]
%%ok
%%> perms:foldl(fun(_,N)->N+1 end, 0, lists:seq(1,10)).
%%3628800
%%> perms:map(fun(P)->lists:flatten(io_lib:write(P)) end, [a,b,c]).
%%["[a,b,c]","[a,c,b]","[b,a,c]","[b,c,a]","[c,a,b]","[c,b,a]"]
%%> {_,FS} = perms:first([a,b,c]).
%%{[a,b,c],[{[b],[]},{[c],[b]},{[a,b,c],[]}]}
%%> perms:next(FS).
%%{[a,c,b],[{[c],[]},{[a,c],[]},{[b,c],[a]}]}
%%> perms:next([{[c],[]},{[a,c],[]},{[b,c],[a]}]).
%%{[b,a,c],[{[a],[]},{[c],[a]},{[b,c],[a]}]}
%%> perms:nextState([{[a],[]},{[b],[a]},{[c],[b,a]}]). % e.g. last state -> [c,b,a]   
%%'$end_of_table'
%%> perms:perm([{[a],[]},{[b],[a]},{[c],[b,a]}]). % see above
%%[c,b,a]
%%'''

-module(perms).
-export([first/1, next/1, perms/1, foreach/2, map/2, foldl/3, foldr/3]).
-export([firstState/1, perm/1, nextState/1]).
-import(lists, [reverse/1, reverse/2]).

%% @spec (list()) -> {L::list(), State::state()}
%% @type state() = [stack_entry()] | '$end_of_table'
%% 		stack_entry() = { Todo::list(), Done::list() }.
%%	State is stack emulation of standard permutation generators
%%
%% @doc Makes first permutation (same as original `L') and `State' for next permutation.
%% @see next/1
first(L) -> next(firstState(L)).
%% @spec (state()) -> {P::list(), S2::state()}
%% @doc Makes permutation `P' from current `S' {@type state()} and next `S2' {@type state()}.
next(S) -> {perm(S), nextState(S)}.

%% @spec (list()) -> State::state()
%% @doc Makes first `State' ({@type state()}) for permutation of `L'.
%%
%% {@link perm/1} from this state makes original `L'.
firstState(L) -> firstState(L, []).

firstState([], Result) -> Result;
firstState([_|Rest] = L, Result) ->
	firstState(Rest, [{L, []}|Result]).

%% @spec (state()) -> P::list()
%% @doc Makes permutation `P' from current `State'.
%% @see firstState/1
%% @see nextState/1
%% @end
%perm('$end_of_table') -> throw(beyond_end);
perm(State) -> perm(State, []).

perm([], Perm) -> Perm;
perm([{[H|_], _}|RestOfState], Perm) ->
	perm(RestOfState, [H|Perm]).

%% @spec (State::state()) -> Next::state()
%% @doc Makes `Next' {@type state()} from current `State'.
%% @end
%nextState('$end_of_table') -> throw(beyond_end);
nextState([]) -> '$end_of_table';
nextState([{[_], _}|State]) ->
	nextState(State);
nextState([{[H|[_|TT]=T], Rest}|State]) ->
	firstState(reverse(Rest, [H|TT]), [{T, [H|Rest]}|State]).

%% @spec (list()) -> Permutations::list()
%% @doc Returns {@type list()} containing all `L''s permutations.
perms(L) -> perms(firstState(L), []).

perms('$end_of_table', Res) -> reverse(Res);
perms(State, Res) ->
	{P, NS} = next(State),
	perms(NS, [P|Res]).

%% @spec (F, list()) -> ok
%% 	F = (P::list()) -> any()
%% @doc Call `F' for each permutation `P' of `L'.
foreach(F,L) -> foreachState(F, firstState(L)).

foreachState(_, '$end_of_table') -> ok;
foreachState(F, State) ->
	{P, NS} = next(State),
	F(P),
	foreachState(F, NS).

%% @spec (F, list()) -> Result::list()
%%	F = (P::list()) -> Res
%%	Result = [Res]
%% @doc Makes `Result' {@type list()} of `Res' results from calling `F' on each permutations `P' of `L'.
map(F, L) -> map(F, firstState(L), []).

map(_, '$end_of_table', Res) -> reverse(Res);
map(F, State, Res) ->
	{P, NS} = next(State),
	map(F, NS, [F(P)|Res]).
%% @spec (F, Acc0, list()) -> Acc
%%	F = (P::list(), AccIn) -> AccOut
%% @doc Folds permutations of `L'. Calls `F' on each permutation of `L'. `Acc0' is passed as `AccIn' to firts `F' call
%% and each `AccOut' is passed to next `F' call.
%% Last `F' call result is returned as `Acc'.
foldl(F, Acc0, L) -> foldlState(F, Acc0, firstState(L)).

foldlState(_, Acc, '$end_of_table') -> Acc;
foldlState(F, Acc, S) ->
	{P, NS} = next(S),
	foldlState(F, F(P, Acc), NS).

%% @spec (F, Acc0, list()) -> Acc
%%	F = (P::list(), AccIn) -> AccOut
%% @doc Same as {@link foldl/3} but in reverse order.
foldr(F, Acc0, L) -> foldl(F, Acc0, reverse(L)).

Nic moc složitého, že? A přitom vygenerování 3 628 800 permutací desetiprvkové množiny a zavolání nějaké drobné funkce pro každou už tomu dá trošku zapotit, a taky že jo: cca 4,3 us na výše uvedeném Athlonu. Nic moc proti Alghoritm-Permute a 0,6 us (nejrychlejší = "call back" použití) na stejném stroji, ale to je psané přímo v C a vlastně nevím jestli jsem zvolil zrovna vhodný algoritmus. Snad mi vyjde čas zkusit totéž nativně v perlu, případně pythonu.

A tady je ta slíbená dokumentace:

Module perms

perms - Permutation generator.

Copyright © 2007 Hynek Vychodil

Version: 0.0.1

Authors: Hynek Vychodil (pichi@nekde.top) [web site: http://www.abclinuxu.cz/blog/Pichi].

Description

perms - Permutation generator

This module provides "simply" permutation generator with state support.

Usage

 > perms:perms([a,b,c]).
 [[a,b,c],[a,c,b],[b,a,c],[b,c,a],[c,a,b],[c,b,a]]
 > perms:foreach(fun(P)->io:format("~p~n",[P]) end, [a,b,c]).
 [a,b,c]
 [a,c,b]
 [b,a,c]
 [b,c,a]
 [c,a,b]
 [c,b,a]
 ok
 > perms:foldl(fun(_,N)->N+1 end, 0, lists:seq(1,10)).
 3628800
 > perms:map(fun(P)->lists:flatten(io_lib:write(P)) end, [a,b,c]).
 ["[a,b,c]","[a,c,b]","[b,a,c]","[b,c,a]","[c,a,b]","[c,b,a]"]
 > {_,FS} = perms:first([a,b,c]).
 {[a,b,c],[{[b],[]},{[c],[b]},{[a,b,c],[]}]}
 > perms:next(FS).
 {[a,c,b],[{[c],[]},{[a,c],[]},{[b,c],[a]}]}
 > perms:next([{[c],[]},{[a,c],[]},{[b,c],[a]}]).
 {[b,a,c],[{[a],[]},{[c],[a]},{[b,c],[a]}]}
 > perms:nextState([{[a],[]},{[b],[a]},{[c],[b,a]}]). % e.g. last state -> [c,b,a]
 '$end_of_table'
 > perms:perm([{[a],[]},{[b],[a]},{[c],[b,a]}]). % see above
 [c,b,a]

Data Types

state()

state() = [stack_entry()] | '$end_of_table'

State is stack emulation of standard permutation generators

Function Index

first/1Makes first permutation (same as original L) and State for next permutation.
firstState/1Makes first State (state()) for permutation of L.
foldl/3Folds permutations of L.
foldr/3Same as foldl/3 but in reverse order.
foreach/2Call F for each permutation P of L.
map/2Makes Result list() of Res results from calling F on each permutations P of L.
next/1Makes permutation P from current S state() and next S2 state().
nextState/1Makes Next state() from current State.
perm/1Makes permutation P from current State.
perms/1Returns list() containing all L's permutations.

Function Details

first/1

first(L::list()) -> {L::list(), State::state()}

Makes first permutation (same as original L) and State for next permutation.

See also: next/1.

firstState/1

firstState(L::list()) -> State::state()

Makes first State (state()) for permutation of L.

perm/1 from this state makes original L.

foldl/3

foldl(F, Acc0, L::list()) -> Acc

Folds permutations of L. Calls F on each permutation of L. Acc0 is passed as AccIn to firts F call and each AccOut is passed to next F call. Last F call result is returned as Acc.

foldr/3

foldr(F, Acc0, L::list()) -> Acc

Same as foldl/3 but in reverse order.

foreach/2

foreach(F, L::list()) -> ok

Call F for each permutation P of L.

map/2

map(F, L::list()) -> Result::list()

Makes Result list() of Res results from calling F on each permutations P of L.

next/1

next(S::state()) -> {P::list(), S2::state()}

Makes permutation P from current S state() and next S2 state().

nextState/1

nextState(State::state()) -> Next::state()

Makes Next state() from current State.

perm/1

perm(State::state()) -> P::list()

Makes permutation P from current State.

See also: firstState/1, nextState/1.

perms/1

perms(L::list()) -> Permutations::list()

Returns list() containing all L's permutations.

Celkem to ujde a ještě se to nechá formátovat CSS a kvůli Abíčku jsem musel vyhodit nějaké ty atributy kolem tabulky. Kdyby jste si chtěli někdo obenchmarkovat thready a zprávy u sebe, tak ještě zdrojáky testů co jsem dělal

Erlang vlákna

-module(ring).
-export([start/1, start/2, server/1, child/1]).

child(Parent) ->
	receive
		0 ->
			Parent ! done;
		N ->
			Child = spawn(?MODULE, child, [Parent]),
			Child ! N-1
	end.

start(N) -> start(N, 10000).

start(N, Timeout) ->
	process_flag(trap_exit, true),
	Parent = spawn_link(?MODULE, server, [Timeout]),
	statistics(wall_clock),
	Child = spawn(?MODULE, child, [Parent]),
	Child ! N,
	receive
		{'EXIT', Parent, ok} ->
			{_, T} = statistics(wall_clock),
			T/N/1000;
		{'EXIT', Parent, Reason} -> Reason
	end.

server(Timeout) ->
	receive
		done ->
			exit(ok)
		after
			Timeout ->
				exit(timeout)
	end.

Usage:

> c(ring).
{ok,ring}
> ring:start(pocet_opakovani)
trvání jednoho v sec. nebo atom timeout pokud na to nestačilo 10s
> ring:start(pocet_opakovani, timeout_v_ms)
trvání jednoho v sec. nebo atom timeout pokud na to nestačil zadaný timeout

Erlang zprávy - pingpong

-module(pingperf).
-export([start/1, pong/1]).

pong(P) ->
	receive
		ping ->
			P ! pong,
			pong(P)
	end.

ping(P, 0) -> exit(P, kill);
ping(P, N) ->
	P ! ping,
	receive
		pong ->
			ping(P, N-1)
	end.

start(N) ->
	statistics(wall_clock),
	PONG = spawn(?MODULE, pong, [self()]),
	ping(PONG, N),
	{_, T} = statistics(wall_clock),
	T/N/2000.

Usage:

> c(pingperf).
{ok,ring}
> ring:start(pocet_opakovani)
trvání zaslání jedné zprávy v sec.

Update:

Když už máme ten funkcionální jazyk, tak jde perms pěkně přepsat pomocí map (a taky nikam nespěchá, když chce vrátit všechny permutace :-) )

--- perms.erl.old	2007-04-16 11:05:12.000000000 +0200
+++ perms.erl	2007-04-16 11:04:42.000000000 +0200
@@ -87,12 +87,8 @@
 
 %% @spec (list()) -> Permutations::list()
 %% @doc Returns {@type list()} containing all `L''s permutations.
-perms(L) -> perms(firstState(L), []).
-
-perms('$end_of_table', Res) -> reverse(Res);
-perms(State, Res) ->
-	{P, NS} = next(State),
-	perms(NS, [P|Res]).
+perms(L) -> map(fun identity/1, L).
+identity(P) -> P.
 
 %% @spec (F, list()) -> ok
 %% 	F = (P::list()) -> any()
       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

14.4.2007 13:07 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Můj první erlang modul
Odpovědět | Sbalit | Link | Blokovat | Admin
krucis, krucis.... erlang vypada fakt cool... skoda, ze musim delat hafo jinych veci a nemuzu se misto toho naucit novy jazyk ;-]...

je to jenom muj pocit nebo se ten jazyk tezce inspiroval prologem? ...nicmene s podporou sekvencniho zpracovani to muze byt docela divocina...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
14.4.2007 15:56 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Můj první erlang modul
Pro seznámení doporučuju skvělý, jedinečný, neopakovatelný „Erlang:The Movie:-D :-D :-D (Trošku ve stylu Montyho Pythona - autoři na něj dodnes neradi vzpomínají ;-))
14.4.2007 21:51 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Můj první erlang modul
Ten film je dobrej, s chutí jsem ho zhlédl a celkem mě potěšilo, že jsem všemu rozuměl. Holt ta moje angličtina už není tak hrozná :-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
14.4.2007 23:09 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Můj první erlang modul
Von je hlavně úplně děsnej :-D, právě takovýhle lidi by měli držet v laboratořích a v řetězech (s volnýma rukama na klávesnici), páč tam budou užitečnější než při dělání PR. :-D (-Ahoj, Michale! -Ahoj, Roberte! -Ahoj, Hynku! -Ahoj, Michale a Hynku! Ahoj, Jakube! -Ahoj všichni! ;-))
15.4.2007 11:25 Martin | skóre: 10 | blog: Nádraží Perdido
Rozbalit Rozbalit vše Re: Můj první erlang modul
Jo, tak zrovna u téhle části jsem si fakt nebyl jistý, jestli je to míněno vážně nebo je to zoufalý pokus o humor :-D Jdu si to pustit ještě jednou :-D
16.4.2007 10:48 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Můj první erlang modul
To nebyl až tak pokus o humor jako demonstrace síly erlnagu. Já jsem si celou tu dobu té šaškárny s opravou schopnosti dělat konferenční hovor říkal proč sakra zavolal a nechal odložené sluchátko. No a na závěr bum ho, on ten hovor stále běžel se starým kódem, prostě tam v jednu chvíli běžely dvě verze stejného modulu, ten starý s chybou na hovoru, který nevyužívá tu konferenční feature, no a pak druhý co to měl už opravené. Až se ukončí všechny procesy, co ten modul používají, tak se teprve starý kód zahodí. No ono je to krapet složitější, protože on ten sám proces dokonce může přejít na nový kód (stačí zavolat uvnitř toho modulu funkci přes modul:foo místo jen foo a bum a běží v nové verzi, typicky se tak píšou loop smyčky serveru viz níže).

Samoupgradující server:
loop(State) -> receive
     Msg -> NewState = do_some(State, Msg), ?MODULE:loop(NewState)
end.
Server s upgrade on demand:
loop(State) -> receive
     upgrade -> ?MODULE:loop(State);
     Msg -> NewState = do_some(State, Msg), loop(NewState)
end.
Pokud ten server má zpracovávat řádově stovky tisíc requestů za sekundu tak ten druhej kód bude o chlup rychlejší, ale zas musíš při upgrade zaslat ten signál.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.4.2007 18:43 Martin | skóre: 10 | blog: Nádraží Perdido
Rozbalit Rozbalit vše Re: Můj první erlang modul
Mě pobavila ta konverzace ve stylu Monty Pythona, proti erlangu samotnému (ani proti tomu, na co chtěli autoři poukázat) samozřejmě nenamítám nic :-)
14.4.2007 18:47 Martin | skóre: 10 | blog: Nádraží Perdido
Rozbalit Rozbalit vše Re: Můj první erlang modul
Odpovědět | Sbalit | Link | Blokovat | Admin
Moc hezké. Když jsem si onehdá řekl, že se pro rozptýlení pustím do nějakého funkcionálního jazyka, tak jsem si vybral Scheme a Haskell. Na Erlang se rád podrobněji mrknu, až se zkamarádím s výše uvedenými :-) Jen teď řeším problém, do kterého se pustit dřív :-)
14.4.2007 20:30 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Můj první erlang modul
scheme ja dobra volba... a nejlip se ho naucite, kdyz si napisete vlastni intepretr.... (se kterym pak muzete oslnovat slecny ;-])
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
14.4.2007 20:47 Martin | skóre: 10 | blog: Nádraží Perdido
Rozbalit Rozbalit vše Re: Můj první erlang modul
Netřeba vykat :-)

Jj, taky mám pocit, že bude první na řadě Scheme. Sice mě ze začátku mátly ty řeči o praktické nepoužitelnosti (v porovnání s Lispem), ale Scheme na mě na první pohled působil jaksi, hmm... kompaktněji :-) Zlé funkcionální jazyky by se sice osypaly při pomyšlení na možnost přiřazení, ale na to teď nehledím :-) Zatím jsem nepoznal jazyk, který by byl víc sexy než libovolný dialekt Lispu :-D A ty závorky, mmmmm... :-D

Interpret možná přijde na řadu malinko později, jestli tím oslním svou slečnu, to sice nevím, ale zkusit to můžu (od mě jako od Matfyzáka už zažila mnohé :-D).
14.4.2007 20:57 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Můj první erlang modul
Interpret možná přijde na řadu malinko později, jestli tím oslním svou slečnu, to sice nevím, ale zkusit to můžu (od mě jako od Matfyzáka už zažila mnohé ).
Největší frajeřina by byla dát jí ho k narozeninám...tím samozřejmě myslím napsat ho tak kompaktní, aby se – napsaný polevou – vešel na horní stranu dortu. ;-) :-D
Marek Bernát avatar 14.4.2007 22:23 Marek Bernát | skóre: 17 | blog: Arcadia
Rozbalit Rozbalit vše Re: Můj první erlang modul
horní stranu dortu

Len tak odhadom, v hornej časti torty je zhruba 10^20 molekúl, takže mám pocit, že by sa tam vo vhodnom tvare vošiel aj interpreter Common Lispu :-P Hoci s CL jeden nikdy nevie :-D
physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
15.4.2007 11:22 Martin | skóre: 10 | blog: Nádraží Perdido
Rozbalit Rozbalit vše Re: Můj první erlang modul
:-D To je nápad! ;-) To bych do konce příštího ledna mohl stihnout ;-)
14.4.2007 21:57 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Můj první erlang modul
Scheme a Haskel se mi líbí, protože jsou přece jen modernější. Jenomže já potřebuji právě některé vlastnosti erlangu, hlavně ty tenké vlákna, zasílání zpráv, škálovatelnost, vždyť on to není jen jazyk, ale OS. Taky je možné, že toho prostě o Scheme a Haskelu málo vím a pak bych byl rád, kdyby mě někdo vyvedl z nevědomosti.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
14.4.2007 22:53 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: Můj první erlang modul
Mimochodem, Scheme dostává své pověsti jazyka pro experimenty a existuje pokus o implementaci Erlangových vymožeností - Termite. O tom, že Erlang je vyzrálejší a prověřenější se samozřejmě nemá cenu hádat.
15.4.2007 14:24 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Můj první erlang modul
Migrace je dost podstatná feature, nicméně vyzrálost taky. No nic, budeme termite sledovat :-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
14.4.2007 23:14 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Můj první erlang modul
nenechte se zmast... scheme je z roku 1975...

koncept programovaci jazyk == operacni system == neco uzasneho je tu uz delsi dobu a ma sve kouzlo -- at uz ve smalltalk, jvm nebo kombinace unixove jadro+shell

jedna vec me, ale stale vrta v hlave... jak maji udelane ty hotupdaty... malinko tusim jednu fintu z pH (kazde vlakno ma svoji verzi pameti), ale jak to maji v praxi implementovane...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
16.4.2007 11:41 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Můj první erlang modul
No spíš bych řekl, že využívají toho, že něco jako stav vůbec neexistuje. Pak je něco jako verze paměti moc netrápí, prostě jen funkce a její parametry. I přiřazení je přiřazení v matematickém smyslu i když záleží na pořadí (to jen kvůli jednoduššímu kompilátoru). Tím se spousta věcí zjednodušuje, takže je spíš něco jako centrální slovník modulů (přeložených binárek) s různými verzemi (konkrétně tři) a prostě se ta funkce jen zavolá přímo do té binárky, dokud se volá foo, tak to všechno běhá uvnitř té binárky snad i včetně imported funkcí (přímé adresy do verze jiného modulu, která byla v okamžiku natažení volajícího modulu, ale tím si nejsem jistý, možná, že to rovnou sahá po aktuální verzi) a v okamžiku požadavku na module:foo se koukne do aktuálního slovníku (je to o chlup pomalejší) a skočí na nejnovější verzi (trošku to připomíná Debian a jeho větve :-) ). Problém může nastat pokud by ta hloubka 3 verze zpět nestačila. Jenže ty funkce jsou celkem malé a pokud uděláš velké moduly, tak ti to celé pěkně samo migruje na novější kód. No apk je tam funkce, co ti zjistí jestli běžíš ve staré verzi kódu. Samozřejmě třeba migrace na novou verzi jádra a init modulu a dalších systémových věcí je trochu těžší, ale jak často měníš jádro, že :-) Asi jako jádro Linuxu, ale to pak nečekáš, že to samo přemigruje.

To by se ale chtělo kouknout přímo do implementace BEAMu, případně jádra, kompilátoru a loaderu. Zdrojáky jsou k dispozici :-)
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.4.2007 11:44 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Můj první erlang modul
s/pokud uděláš velké moduly/pokud neděláš velké moduly/
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
16.4.2007 12:28 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Můj první erlang modul
diky za osvetleni, kdyz tady nekdo hodil link na termite, tak me to uz trochu zacalo zapalovat.... vyporadat se stavem, tak ze vlastne neexistuje... a redukovat to na to, ze jediny stav jsou "mailboxy", kam chodi zpravy mezi vlaknama a u tech je zarucene, ze jsou na pocatku vlakna vzdycky prazdne... hm... panove co to vymysleli budou asi hodne chytri...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.