Inbyggda funktioner
Funktioner som runtime implementerar i C++: erlang-BIF:ar och funktioner i
andra moduler vars motsvarigheter i OTP är BIF:ar, NIF:ar eller behöver runtime.
Registrerade efter modul, funktion och aritet; nås direkt, via dynamiska anrop
eller som funs. Källkoden finns i runtime/src/builtins/; observerbara
skillnader från OTP finns i skillnader.
Vilka inbyggda funktioner som finns
- Katalogen
abi::v1::bridge_builtins(builtins.hpp): varje inbyggd funktion som både kompilatorn och runtime känner till; gruppkommentarer namnger den implementerande filen. - En posts index är talet som genererad kod skickar till bryggan; katalogen får ordnas om (kompilatorn och runtime byggs tillsammans).
- Modulen
erlang: guard-BIF:ar, operatorer som funktioner,display/1,halt/0,1, felkastning, termåtkomst, konverteringar, processer, portar, externt termformat, tid, systeminformation, fun-information, hashning, kodladdning. - Övriga moduler: ett avsnitt var nedan; privata hjälpmoduler
(
clause_unicode,clause_re,clause_zlib,clause_receive, ...) betjänar Erlang-bibliotekskod. - Status per funktion (inbyggd funktion, Erlang-kropp, stubbe) finns i
library/<application>/<module>.terms(bibliotek). - Ett kvalificerat anrop av en inbyggd funktion i katalogen anropar bryggan;
varje annan
erlang-funktion når biblioteksmodulen erlang.
Hur anrop når dem
| Källa | Väg |
|---|---|
abs(X), X + Y, display, halt, error | Inline-kod eller en särskild tjänst |
Inbyggda funktioner i katalogen utan inline-tjänst (A -- B, ...) | Inträde som i en funktion: CLAUSE_builtin_frame_v1, argument i register |
| Direkta inbyggda funktioner (gör aldrig trap, väntar aldrig och rör aldrig en annan process) | CLAUSE_builtin_call_v1 returnerar resultatet |
Snabba inbyggda funktioner (length, binary_to_list, list_to_binary, iolist_to_binary) | Begränsad snabb väg (256 celler, 4096 resultatbyte); annars inträde i ramen |
A ++ B | Kort äkta A kopieras inline; annars inträde |
fun abs/1, fun erlang:'+'/2 | Extern fun erlang:F/A bunden till den inbyggda funktionen |
M:F(Args), apply/3, fun M:F/A vid körning | Modulexport först, sedan inbyggd funktion |
fun F/Aav en autoimport som modulen varken definierar eller undertrycker ärfun erlang:F/A, som i OTP. Icke-autoimporter (display/1,raise/3,make_tuple/2,3, ...) behöver prefixeterlang:.- En inbyggd funktions ram har en null-kropp: inträdet lägger inte till någon ram, så ett svansanrop returnerar till anroparens anropare.
- Fel (
badarg,badarith,system_limit,{badmap, M},{badkey, K}) använder den kontrollerade felkanalen. - Termåtkomst och konverteringar följer OTP:s
badarg-regler:setelement/3: litet index i tupeln;make_tuple/2,3: storlek 0..16,777,215;A ++ B: äktaA;A -- B: äkta listor,=:=, O((n + m) log m).list_to_atom/1: det 256:e tecknet gersystem_limit; full atomtabell (--max-atoms) avslutar med 70.integer_to_list/2,list_to_integer/2: bas 2..36;system_limitefter 1,262,611 decimalsiffror.float_to_list/1,2: OTP:s format (scientific,decimals,compact,short); 256+ byte text gerbadarg.- Binary-motsvarigheterna delar textregler (
erlang/conversion_text.cpp); flyttalstext behöver siffror på båda sidor om punkten.
function_exported/3: sant för en programexport eller en registrerad inbyggd funktion.
Portioner
Inbyggda funktioner vars arbete växer med en lista eller binary körs i begränsade portioner, som OTP:s trapping-BIF:ar.
- Varje inträde i en inbyggd funktion förbrukar en reduktion; en portion gör
WORK_PER_REDUCTION(16) enheter per reduktion som återstår i tidskvoten. - Arbete kvar:
ProcessStack::trapnamnger en fortsättning; tillståndstermer stannar i register (rötter), native-tillstånd iTrapState. Processen lämnar ifrån sig exekveringen och återupptas senare. - Kan fortsätta i en Erlang-export (
iotill en processenhet gör trap tillfile:write/2). - Resultat, fel och ordning är desamma som vid körning till slut. Värdanrop
(
call_builtin) slutför varje trap direkt. - Små indata tar snabba vägar på ordnivå (
++med ≤ 64 celler, kortainteger_to_list,list_to_integer,atom_to_list, tupelkonverteringar). - Gör trap:
length/1i en kropp (guard förblir inline),++,--,binary_to_list/1,list_to_binary/1,iolist_to_binary/1. - Allt annat, inklusive
io:formatoch inbyggda tupelfunktioner, körs till slut.
Typade inbyggda funktioner
- C++-funktioner
Result F(ProcessContext &, Parameters...)registrerade medtyped_entry<F>(module, name)(typed.hpp). - Adaptern tar emot argumentord och konverterar till parametertyper; en
avvikelse ger
badarginnan kroppen körs.Named<Role>förhindrar förväxlade termparametrar. - Returnerar en term,
BuiltinResulteller råttWord, eller kastarBuiltinFailure; andra C++-undantag blirout_of_memoryellerinternal_error. - Guard-BIF:ar, operatorer och listfunktioner som gör trap är adaptrar av typen
BuiltinBodypå ordnivå; frekventa konverteringar läser celler på plats (TermAccess::trusted).
Registrering
BuiltinRegistry(builtin_registry.hpp), som ägs avCodeServer, mappar modul/funktion/aritet till enBuiltinFrame;addregistrerar en hel grupp eller ingenting.- Vid start registreras varje tabell i
production_builtins()(builtins/registry.cpp), sedan tabellerna från de runtime-tillägg som startdeskriptorn listar (RuntimeOptions::extensions): kryptoarkivets när programmet länkar det (modulen crypto). - Klistriga: modulexporter med samma namn som en inbyggd funktion hoppas över,
så anrop når aldrig en
clause_builtin_placeholder-kropp eller en användarfunktion med samma namn. - Värdvägen
abi::v1::dispatch_builtinär separat (runtime).
Källkodslayout
- Stora moduler får en underkatalog med en fil per familj (
erlang/,lists/,binary/,unicode/,re/,zlib/, ...); små är enskilda filer. - Varje familjefil definierar en
*_builtins()-tabell som listas iproduction_builtins(). Ny familj = ny fil; dela filer över cirka 400 rader. - Kompilatorn läser aldrig runtime-källkod; katalogen är den delade listan.
Modulen erlang
library/erts/erlang.terms: OTP 29:s exporter som{Name, Arity, Flags, Status}(flaggorauto_import,guard; statusimplementedeller{unavailable, Reason}), statusar hålls uppdaterade för hand.tests/compiler/builtins/generate_erlang.pyskriverlibrary/erts/erlang.erl(stubbar) ochcompiler/src/semantic/erlang_auto_imports.inc. CTestsbuiltins_erlang_inventory(aktuella) ochbuiltins_erlang_freshness(värd-OTP).- Inbyggda funktioner vinner för
erlang:F(...),fun erlang:F/A,applyoch importer; övriga exporter ger{not_implemented, F, A}vid anrop, spårningsfunktionerna ({unavailable, tracing}:trace*,system_monitor,system_profile,seq_trace*,dt_*)notsup; okända namn ärundefined function. - Tillägg (
executables_erlang_gaps,_packet_decoding,_suspension):adler32,crc32och*_combineovanpå fastlåst zlib;iolist_to_iovec/1.append_element/2,insert_element/3,delete_element/2.- Cookies som på en icke-levande nod;
halt/2somhalt/1. send/3,spawn/2,4och besläktade (processer).decode_packet/3: varje OTP-pakettyp och alternativ, OTP:s http-termer.suspend_process/1,2,resume_process/1,process_display/2.
Externt termformat
erlang/term_encoding.cpp, term_decoding.cpp; kodek delad med kompilatorn
(external_term.hpp), explicita
stackar.
term_to_binary/1,2: OTP:s byte förnonode@nohost; alternativminor_version,deterministic,compressed; lokala funs och native records gernotsup.term_to_iovec/1,2,external_size/1,2.binary_to_term/1,2: längder kontrolleras före allokering;safe,used; felaktig indata eller främmande identiteter gerbadarg.- Kodekens stackar och de kodade byten i
term_to_binaryär trådlokala buffertar som behålls mellan anrop (upp till 1 MB vardera,builtins/scratch.hpp), så en stor term tar inte nya sidor vid varje anrop; små heltal hoppar över den generella objektvägen i båda riktningarna. - CTests
executables_external_terms,builtins_etf_fuzz.
Tid
erlang/time.cpp.
- Monoton tid är den stadiga klockan;
nativeär nanosekunder; OTP:s enhetsatomer eller heltal som anger delar per sekund. convert_time_unit/3avrundar nedåt;unique_integer/0,1en stigande räknare;now/0strikt stigande.- Kalenderkonverteringar är strikta och använder C-bibliotekets lokala tidszon.
- Timers: processer.
Systeminformation
erlang/system.cpp, erlang/system_flags.cpp.
statistics/1:wall_clock,runtime, körköer,context_switches; räknare för reduktioner, skräpsamling och I/O rapporterar noll.system_info/1:otp_release"29",version"17.1",machine"Clause", antal, gränser, fasta emulatorsvar; fullständig lista isystem.cpp.memory/0,1: OTP:s typer;binary,code,etsär 0.system_flag/2:backtrace_depth(≤ 64) ochmin_heap_sizehar effekt; de flesta andra läses tillbaka utan effekt;cpu_topology,erts_alloc, ...badarg.
Hashning
erlang/hashing.cpp, erlang/md5.cpp.
phash2/1,2,phash/2: OTP:s värden för atomer, tal, binaries, listor, tupler, maps; pid:ar, portar, referenser och funs hashas på Clauses eget sätt.md5/1ochmd5_init/update/final: RFC 1321; kontexten är Clauses egen binary på 96 byte.
Kodladdning
erlang/code.cpp. Varje modul länkas och förblir laddad; dynamisk kod är
uppskjuten.
module_loaded/1,loaded/0,pre_loaded/0omfattar kompilerade och inbyggda moduler.delete_module/1för en laddad modul gernotsup;prepare_loading/2ger{error, badfile}.
Modulen lists
builtins/lists/. OTP:s lists är Erlang, så inbyggda funktioner ger de fel
som dess klausuler ger.
- Genomgångar (
sublist,flatten, sammanslagningar,key*,zip,sort,usort, ...) gerfunction_clausesom OTP och förblir lika lata (sublist([a | b], 1)är[a]). keymember/3,keysearch/3är BIF:ar:badarg-regler.- Lika element: det första vinner (
max([1, 1.0])är1). - Funktioner som tar funs och resten är Erlang i
library/stdlib/lists.erl; inuti den anropas inbyggda funktioner kvalificerat. - Inbyggd
function_clausehar ingen egen ram.
Modulen math
builtins/math.cpp.
- Varje OTP 29-funktion ovanpå C-biblioteket; icke-tal ger
badarg, icke-ändliga resultatbadarith. - 64-bitars kodgenerering inlinar
sqrt,floor,ceil,exp,log*,sin,cos,powpå tal och behåller råa double-värden.
Modulen binary
builtins/binary/; replace/3,4 och list_to_bin/1 är Erlang.
- Mönster: binary, lista av binaries eller kompilerat; matchning längst till
vänster, sedan längst;
scope,global,trim,trim_all. compile_pattern/1returnerar{bm, ...}eller{ac, ...}utan referens.- Övriga funktioner följer OTP; felaktiga argument ger
badarg;referenced_byte_size/1är binaryns egen storlek.
Modulen maps
builtins/maps.cpp, builtins/os.cpp.
- Varje dokumenterad
maps-funktion; kärnfunktioner är inbyggda med OTP:s fel; nycklar matchas exakt. - Funktioner som tar funs är Erlang i
maps.erl; iteratorer användererts_internal:map_next/3. - Map-markörer går igenom platta maps och map-träd i nyckelordning;
clause_maps:entries/1försermaps:fold/3med poster. os:type,getenv,env,putenv,unsetenv,getpid,versionär inbyggda; tidsfunktioner är Erlang;os:cmd/1använder en port.
Samlingar
builtins/collections/: varje dokumenterad funktion i ordsets, orddict,
proplists, dict, sets, gb_trees, gb_sets, queue, array.
- Listgenomgångar är inbyggda funktioner; funktioner som tar funs är Erlang.
- Varje inbyggd funktion går igenom data som OTP:s klausuler: samma resultat, samma fel för alla indata.
dict, version 1 avsets: OTP:s linjära hash-records (samma layout och ordning). Version 2 av sets är maps.gb_trees,gb_sets: delad balanserad trädmotor; träd är lika OTP:s.queue: OTP:s förflyttningar av{Rear, Front}; köer är lika OTP:s.array: OTP 29:s record#array{}, ändras exakt som i OTP.
Mängder av mängder
sofs(builtins/sofs/,executables_sofs_sets): OTP:s records ovanpå sorterade listor; algebra, relationer och familjer är inbyggda funktioner, funktioner som tar funs är Erlang.
Graf
graph(builtins/graph/,executables_graph_module): OTP:s#graph{}; genomgångar och vägar är inbyggda funktioner med explicita stackar, uppdateringar är Erlang.
Digraph
digraph,digraph_utils(builtins/digraph/,executables_digraph_tables): OTP:s tre ETS-tabeller; uppdateringar i Erlang ovanpåets; vägsökningar och genomgångar är inbyggda funktioner som läser tabeller på plats.
ETS
builtins/ets/ ovanpå runtimens tabeller (runtime).
- Inbyggda funktioner: tabellernas livscykel, infogning/uppslag/radering,
genomgångar, räknare,
info; folds,i/0..3,fun2ms/1är Erlang. - Alternativ och åtkomsträttigheter som OTP; varje fel är
badarg. - Matchningsspecifikationer (runtime):
select*,match*,match_spec_*,erlang:match_spec_test/3; resultat i genomgångsordning, fortsättningar med OTP:s form. - Tabellfiler:
tab2file,file2tab,tabfile_infoläser och skriver OTP:s disk_log-format i båda riktningarna. to_dets/2,from_dets/2ovanpådets;table/1,2i Erlang ovanpåqlc:table/2(select/3 som standard,first_next,last_prev,{select, MS}), slår upp nycklar med==i ettordered_set, annars=:=.- CTests
executables_ets_*kör OTP-referensfall.
Dets
dets.erl ovanpå clause_dets (builtins/dets/): OTP:s filformat version 9,
byte för byte, samma filordningar.
- Motor (C++): huvud, buddy-frilistor, linjär hashning, tömning av skrivcache, skanningar, bulklayouter.
- Processer (Erlang):
dets-server med OTP:s registertabeller; en process per tabell som håller filhandtag, cache, fixeringar, timers. - Reparationer och fel vid öppning som i OTP; funs körs där OTP kör dem.
table/1,2i Erlang ovanpåqlc:table/2(select/3 som standard,first_next,{select, MS}); odokumenterade hjälpfunktioner är stubbar.- CTest
executables_dets_tablesjämför med OTP, inklusive filernas MD5.
Kodningar
builtins/encoding/.
base64: varje funktion är inbyggd; avkodningsfel matchar OTP:s tillståndsmaskiner.json:decode/1,encode/1,format/1,2och binary-kodare är inbyggda funktioner (återgår till Erlang efter 256 nästlingsnivåer); avkodare med återanrop och kodare som tar funs är Erlang ovanpåclause_json-skannrar.
POSIX-meddelanden
builtins/erl_posix_msg.cpp, library/stdlib/erl_posix_msg.erl.
erl_posix_msg:message/1(OTP:s interna modul, somfile:format_error/1behöver): den engelska texten för en POSIX-felorsak från en tabell observerad från OTP 29,"unknown POSIX error: "och namnet för en annan atom,badargför något som inte är en atom.
Nätverksnamn
builtins/net/, library/kernel/clause_net.erl, library/kernel/net.erl.
clause_net:gethostname/0,getaddrinfo/2,getnameinfo/4,getservbyname/2,getservbyport/2anropar systemets funktioner och svarar som OTP:sprim_net: adressinformation som maps avfamily,socktype,protocoloch en socketadress, prim_net:s felnamn (eservice,enodata, ...),{error, einval}för en okänd tjänst.netkontrollerar argumenten med OTP:s guards och skickar text som UTF-8-binaries.clause_net:inet_getifaddrs/0listar gränssnitt som OTP:sinet_drvgör förinet:getifaddrs/0(på Windows frånGetAdaptersAddressesochGetIfEntrymed dess regler för flaggor, prefix och klassbaserade nätmasker; annars frångetifaddrs(3), sammanslagna per namn och flaggor somprim_inet).clause_net:getifaddrs/0listar dem somnet:getifaddrs(all)(Windows: OTP:snet-moduls paketposter och sorterade flaggor; annars prim_net:s maps med paket- eller länkadresser);netfiltrerar dem efter familj, flaggor eller fun.if_names/0är listan över index och namn som bådenet:if_index2name/1ochif_name2index/1söker i.inet:getservbyname/2,getservbyport/2ochgethostbyaddr/1(ettgetnameinfomedNI_NAMEREQD) använder samma inbyggda funktioner; nätverksnamnrymder svarar{error, enotsup}(skillnader).clause_net:dns_decode/1ochdns_encode/1(builtins/net/dns.cpp) är inet_res:s kodek för DNS-meddelanden: OTP:s tupler#dns_rec{},#dns_header{},#dns_query{},#dns_rr{},#dns_rr_opt{}och#dns_rr_tsig{}med inet_dns:s värden (symboliska typer, klasser och operationskoder, escape-sekvenser i namnetiketter, LOC som grader och meter) och dessformerr-regler (komprimeringspekare bakåt efter huvudet, namn under 255 byte, trunkerade avsnitt bara med TC-biten); kodning komprimerar namn.
Filnamn
builtins/filename/.
- Sökvägsfunktioner är inbyggda och följer OTP:s klausuler för värdens familj
(Unix eller Windows-enheter och
//-namn); OTP:s resultatformer och fel. absname/1,2,basedir/2,3är Erlang.
Filelib
builtins/filelib.cpp, library/stdlib/filelib.erl, library/stdlib/clause_filelib.erl.
clause_filelib:escape/1skriver@och\så attfilename:split/1behåller escape-sekvenser;compile_part/1kompilerar en del av ett uppdelat mönster (?,*,**, teckenmängder med intervall,{...}-alternativ som tar med resten av sin del) med OTP:s egenheter (**bara som en hel del,]först eller som ett intervalls nedre gräns,{badpattern, missing_delimiter}, encase_clauseför nästlade alternativ);matches/3ochmatch/2filtrerar katalogposter.- Genomgången (literala prefix,
..,**, existenskontroller) är Erlang ovanpåfileochfilename, så resultaten är OTP:s, sorterade.
Argparse
builtins/argparse/, library/stdlib/argparse.erl,
library/stdlib/clause_argparse.erl.
clause_argparse:validate/3kontrollerar ett kommando som OTP:svalidate/2gör, i OTP:s ordning, och returnerar det första ogiltiga fältet så attargparse.erlkan ge ett fel.parse/6är OTP:s tolk som en loop: långa former (--name=value), korta former, kombinerade flaggor, bifogade värden, negativa tal,nargs, åtgärder, typer, underkommandon, standardvärden; OTP:s kastade fel och argument-maps.help/4bygger OTP:s hjälplistor (radbrytning av användningsanvisningar, avsnitt, mallar) genom de inbyggda funktionerna iio_lib,stringochunicode, så formerna är lika OTP:s.- Funs anropas av
argparse.erl: en inbyggd funktion returnerar en begäran ({custom, Fun, Arg},{re, Arg, Re[, Options]},{describe, Fun}) och anropas igen med svaren hittills och spelar upp sin genomgång på nytt; varje fun körs en gång, i OTP:s ordning. run/3, hanterare ochformat_error/1,2är Erlang.
Qlc pt
builtins/qlc_pt/, library/stdlib/qlc_pt.erl,
library/stdlib/clause_qlc_pt.erl: qlc:s parse transform vid körning, för
qlc:string_to_handle/1,2,3 och qlc:q/1,2 i utvärderad kod. Moduler som
kompileras med qlc.hrl får fortfarande värd-OTP:ns transformering
(parse transforms).
clause_qlc_pt:transform_expression/4ochparse_transform/4följerqlc_pt.erlfunktion för funktion: NodeInfo (unika annoteringar och vad kontrollerna noterar på varje nod, lagrat efter platsnummer från 1 som i OTP),no_shadows, lint-körningarna som hittar introducerade variabler och generatorvariabler, ramar av#bind{}-records för konstant- och kopplingskolumner, överhoppning av filter, matchningsspecifikationer, kopplingsgeneratorer, den genererade tillstånds-funen,Qdata,CodeF(term_to_binary(_, [compressed])av den ursprungliga koden) och alternativ-funen. Mellandata är Erlang-termer med OTP:s former, så sorteringar följer termordningen; genererade variabler är referenser som OTP:smake_ref/0.- Meddelanden kommer från C++-versionen av
erl_lint(Lint), vägen som OTP:sqlc_pttar när kompilatorn inte är tillgänglig; en lint-krasch på de former den bygger är kompilatorns interna fel, så som OTP:s kompilator rapporterar det. Records expanderas av C++-versionen averl_expand_records, guard-tester avis_guard_test/3. - Matchningsspecifikationer kör
ms_transformi Erlang: den inbyggda funktionen returnerar{try_ms, Forms},qlc_pt.erlsvarar med resultatet avtry_ms/4och anropar den inbyggda funktionen igen med svaren hittills och spelar upp dess genomgång på nytt; resultatet är{done, Result, Transformed}(en transformerad modul höjer stackspårningsdjupet till 500, som OTP:s transformering gör).
Qlc
library/stdlib/qlc.erl: varje funktion i Erlang, eftersom utvärderingen
anropar frågans funs. Skriven utifrån OTP:s dokumentation; algoritmerna är
OTP:s där svar, deras ordning eller info/1,2 visar dem.
- Handtag behåller OTP:s tupler (
{qlc_handle, H}medqlc_lc,qlc_table,qlc_append,qlc_sort;{qlc_cursor, {Pid, Owner}}); kompilerade frågor är transformeringens{qlc_lc, Fun, Opt}med data iqlc_v1ellersimple_v1. - Förberedelse: uppslag vid nyckeln eller indexet med minst antal nycklar
(
max_lookup), matchningsspecifikationer för unära genomgångs-funs och listor, uppslagskopplingar föredras framför sammanslagningskopplingar, indata till sammanslagningskopplingar sorteras om de inte är kända som sorterade, enkla frågor förcacheochunique, sammanslagna, och aldrig för den första generatorn. - Utvärdering: svar är listor som slutar i
[]eller en fortsättnings-fun.cacheanvänderets-tabeller (qlc, privata) eller en lista lagrad under{Ref, '$_qlc_cache_tmpfiles_'}, som flyttas till en temporär fil eftermax_list_size; sammanslagningskopplingar lägger stora klasser av lika nycklar på fil ('$_qlc_merge_join_tmpfiles_'); sorteringar körfile_sorternär svaren överstigersize. Temporära filer heterqlc_<node>_<os pid>_<unique>itmpdireller arbetskatalogen;tmpdir_usagerapporterar genomerror_logger. - Fel som utvärderingen hittar (ett icke-listsvar från en genomgångs- eller
uppslags-fun, filfel,
{tmpdir_usage, _}) kastas med en intern tagg och returneras aveval/2,fold/4,info/2och markörer, så som OTP returnerar felen dessthrow_error/1kastar. info/1,2skriver den förberedda frågan mederl_pp:expr/3, tabellbeskrivningar genom deras format-funs (strängar tolkas averl_eval:extended_parse_exprs/1).string_to_handle/1,2,3ocherl_eval:sqlc:q/1,2kör Clausesqlc_pt;ets:table/1,2,dets:table/1,2ocherl_evalnårqlcvia ett runtime-namn, så bara program som namngerqlclänkar det.- CTest
executables_qlc_queriesjämför med OTP: dess frågemodul kompileras frånqlc_queries.abstr, formerna efter OTP:s transformering, så testet behöver ingen värd-OTP (körbara fall).
Strängar
builtins/string/: varje string-funktion.
- Genomgångar följer
string.erlovanpåunicode_util:cp/1,gc/1: OTP:s svansar, sub-binaries, blandade listor och fel. - Genomgångar från slutet loopar i stället för att rekursera.
- Skiftlägesfunktioner returnerar indata när ingenting ändras;
equal/4normaliserar viaunicode/normalize.cpp. to_integer/1,to_float/1, Latin-1-API,jaro_similarity/2som OTP.
URI-strängar
builtins/uri/.
parse/1: en RFC 3986-genomgång i OTP:s ordning, OTP:s felfragment.recompose,normalize,resolve,percent_decode,quoteoch frågefunktioner följer OTP:s genomgångar och felstilar.unicode/graphemes.cppdelar upp kluster för inbyggda funktioner som behöver dem.
Slumptal
builtins/rand/.
rand: OTP:s tillstånd och hanterare; varje algoritm ger OTP:s sekvenser. Kända hanterare körs i C++ (clause_rand:*); övriga kör OTP:s generiska Erlang.splitmix64_next/1,exsp_*,mwc59*är inbyggda funktioner.tools/rand/observerar OTP-konstanter och genererartables.cpp.random:uniform_s/1är inbyggd, resten Erlang.
Kalender
builtins/calendar.cpp.
- Inbyggda funktioner för gregoriansk aritmetik över heltal av valfri storlek, OTP:s formler och fel.
- Lokal/universell tid och RFC 3339 är Erlang i
calendar.erl.
Timer
builtins/timer.cpp.
seconds/1,minutes/1,hours/1,hms/3ochnow_diff/2som Erlang-aritmetik över vilka tal som helst:badarithför ett icke-tal,function_clauseför ett argument tillnow_diff/2som inte är en 3-tupel.- Timers är Erlang i
timer.erl, utantimer_server: sändningar till en lokal pid användererlang:send_after/3; varje annan engångs- eller intervalltimer är en process som skapar ett alias, som dessTRefbär ochcancel/1skickar till. En intervalltimer övervakar processen den arbetar åt och avslutas med den;apply_repeatedlyväntar på att varje åtgärd avslutas före nästa tick.
Persistenta termer
builtins/persistent_term.cpp ovanpå runtimens tabell
(runtime).
put/2,put_new/2,get/0,1,2,erase/1,info/0med OTP:s resultat; nycklar matchas exakt; läsningar returnerar den lagrade termen utan kopia.
Modulen unicode
builtins/unicode/: varje funktion är inbyggd.
- Kodningar
latin1,utf8,utf16,utf32(med byteordning); annarsbadarg. - Chardata: binaries, kodpunkter, nästlade listor; på varandra följande binaries är en ström.
- Fel ger
{error | incomplete, Converted, Rest}med OTP:s form påRest. - Normalformer,
category/1,is_whitespace/1,is_id_*behåller OTP:s genvägar.
Modulen code
builtins/code.cpp. Ingen code_server-process; svaren beskriver det länkade
programmet.
ensure_loaded/1,is_loaded/1({file, preloaded}),which/1(preloaded),all_loaded/0,module_status/0,1;is_sticky/1false.- Kodsökväg (
library/kernel/code.erl): en persistent term som byggs vid första användning så som OTP:s interaktiva kodserver bygger den: applikationernasebin-kataloger iERL_LIBS, den senaste versionen av varje applikation ilib_dir(), sedan".".root_dir/0är den körbara filens katalog. Sökvägsändringar normaliserar och kontrollerar kataloger som OTP;lib_dir/1,priv_dir/1ochcompiler_dir/0namnger den första sökvägskatalogen.../Name[-Vsn][/ebin]. - Laddningssvar för länkad kod: objektkod som hittas på sökvägen ger
erlang:prepare_loading/2:s{error, badfile}, saknad kodnofile;purge/1false,soft_purge/1true,delete/1false;get_doc/1{error, missing}; inget stöd för täckningsmätning.
Modulen io
builtins/terminal.cpp, library/stdlib/clause_io.erl.
clause_io:isatty/1(stdin,stdout,stderr): en konsol på Windows,isatty(3)annars;window_size/1: en terminals{Columns, Rows}(GetConsoleScreenBufferInfo,TIOCGWINSZ), annars{error, enotsup}.- De besvarar terminalflaggorna i
io:getopts/0,1,io:columns/0,1,io:rows/0,1ochio_ansi:enabled/0,1. - Servern för standardindata (
io.erl) läser rader som OTP:s grupp gör: enget_until-begäran (io:read/1,2,io:scan_erl_exprs/1..4, skalets kommandon) tar en rad i taget och skriver sin prompt igen före varje ytterligare rad, och ett CRLF-radslut läses som LF.
Modulen os
builtins/os.cpp, library/kernel/os.erl.
type/0,getenv/0,1,env/0,putenv/2,unsetenv/1,getpid/0,version/0är inbyggda funktioner.cmd/1,2: Erlang ovanpå en spawn-port med OTP:s protokoll: Windows körCOMSPEC /c Command; annars läser/bin/sh -s unix:cmdkommandot och ekar^D(och slutstatusen) vid dess slut.max_size,exception_on_failure, UTF-8-utdata avkodas till tecken.find_executable/2(inbyggd funktion): OTP:s sökning över element iPATH(Windows: den aktuella katalogen först,.exe,.com,.cmd,.bat).set_signal/2(inbyggd funktion):badargpå Windows som OTP; annarssigaction; en hanterad signal fungerar som OTP:s standardhanterareerl_signal_handler.
Modulen init
builtins/init.cpp, library/erts/init.erl. Ett startat system utan
bootskript.
- Kommandoraden avkodas en gång (
startup/arguments.cpp): vanliga argument matar startpunktens argv ochget_plain_arguments/0. - Enda flaggan är
home;script_name/0är den körbara filens sökväg. - Övriga funktioner är Erlang med OTP:s startade svar;
script_id/0är{"Clause", "29"}. stop/0,1,reboot/0stoppar direkt;boot/1,restart/0,1,make_permanent/2avvisas mednotsup.
Atomics och counters
builtins/atomics.cpp.
- En
atomics-array är en handtagsreferens ovanpåstd::atomic_ref-värden; aritet 1..2^27; OTP:sbadarg-regler ochinfo/1. countersär Erlang ovanpå en atomics-array med tecken; write-concurrency- räknare är exakta.
Erts internal
builtins/erts_internal.cpp, library/erts/erts_internal.erl: funktionerna
som stdlib och kernel anropar.
- Inbyggda funktioner
cmp_term/2ochmap_next/3(map-iteratorer, nyckelordning). - Erlang:
list_to_integer/2,binary_to_integer/2,map_to_tuple_keys/1,term_type/1, räknare,dynamic_node_name. get_creation/0undefined; grupper för distribution och.beamavböjs.erts_code_purger: ingenting att rensa.
Unicode util
unicode_util.erl ovanpå inbyggda funktioner i clause_unicode och genererade
tabeller (unicode/tables.cpp).
cp/1,gc/1(UAX #29),nfd/nfc/nfkd/nfkc, skiftlägesmappningar med OTP:s former;spec_version/0{17, 0}.tools/unicode/generate.pybygger tabeller från värd-OTP:ns svar och Unicode 17.0-data; byggen behöver ingetdera.- CTests
executables_unicode_tables,_clusters,_forms.
io_lib
io_lib.erl, builtins/io_lib/. OTP:s djupa teckenlistor byggs i en C++-arena;
io:format använder samma motor.
- Skrivare (
write.cpp):write,write_string,write_atom, ... skriver escape-sekvenser och begränsar som OTP. - Formatmotor (
format_scan.cpp,format_build.cpp): varje styrsekvens,chars_limit, OTP:s flyttalsavrundning; felbadarg. - Pretty printer (
pretty*.cpp): OTP:s layouter iio_lib_pretty.clause_io_lib:pretty/2ärio_lib_pretty:print/2för skalet:column,line_length,depth,line_max_chars,strings,encodingochrecords, definitionerna[{Name, [Field]}]som enrecord_print_funskulle svara med, så tupler med ett känt namn och en känd storlek skrivs som#Name{Field = Value, ...}med OTP:s layout. CTestexecutables_shell_session. - Skanner (
fread.cpp): styrsekvenser och fortsättningar förfread/2,3. - Insamlare (
collect.cpp), kontroller av utskrivbarhet,indentation/2. - Funs för
maps_order: den inbyggda funktionen registrerar maps och fortsätter iclause_io_lib:sort_maps/6, kör igen med sorterade nycklar. - Nästling djupare än 256 ger
system_limit. CTestsexecutables_io_lib_text,_pretty_print,_fread_scanning.
Kompilatortabeller
builtins/front_end/.
erl_internal: BIF- och guard-tabeller frånerlang.terms; typ- och operatortabeller;add_predefined_functions/1.erl_anno: OTP:s former och fel.erl_features: svar från Clauses kompilator;used/1läser deskriptorer ellerMeta-block i.beam.records: se native records.- CTests
executables_compiler_tables,_records_reflection.
Erl scan
erl_scan.erl ovanpå clause_erl_scan:scan/6 (front_end/scanner*.cpp), dess
egen skanner som följer OTP:s scan1/5.
- OTP:s token, annoteringar, sigill, strängar med tredubbla citattecken, fel och rester.
- Återanrop för
reserved_word_fun,text_funkörs i Erlang i tokenordning. - Fortsättningar för
tokens/3,4skannar om den ofärdiga token. - CTest
executables_erl_scan_tokens.
Erl parse
erl_parse.erl ovanpå clause_erl_parse:parse/1 (front_end/parser*.cpp), en
rekursiv nedstigningstolk för OTP:s grammatik.
- OTP:s abstrakta format och LALR-felbeteende (stopptoken, ordning mellan åtgärdsfel och syntaxfel).
first_anno/1,last_anno/1följer ordningen imap_anno/2.normalise/1,abstract/1,2,tokens/1,2är inbyggda funktioner; annoteringsgenomgångar med funs är Erlang.- CTest
executables_erl_parse_forms.
Erl eval
erl_eval.erl tolkar det abstrakta formatet i Erlang; inbyggda funktioner i
clause_erl_eval hanterar bitsyntaxsegment (front_end/erl_eval.cpp) och
mönstermatchning (front_end/eval_match.cpp), och erl_eval:partial_eval/1
och is_constant_expr/1 är också inbyggda funktioner.
-
clause_erl_eval:match/4ärmatch1/5: literaler, variabler, listor, tupler, maps, native records, prefix av"abc" ++ T, operatorkonstanter och binary-mönster, ger{match, Bindings},nomatchellerinvalid(ges som{illegal_pattern, Pattern}averl_eval.erl). Map-nycklar och segmentstorlekar är guard-uttryck som utvärderas över de yttre bindningarna (front_end/guard_eval.cpp, delas medepp:s-if); bindningar läses och lagras somorddicteller en map, som OTP gör, även en osorterad lista. -
clause_erl_eval:bits_gen/4tar en binary-generators mönster från bitarnas början; utvärderarens loop, guards (de anropar den icke-lokala hanteraren) och comprehension-genomgångarna förblir Erlang. -
bit_type/2fastställer enbin_element:s specifikationer mederl_bits:s standardvärden och fel (front_end/bit_types.cpp, delas mednormalise/1);bit_segment/3bygger ett segment (badarg,system_limit),bit_take/3tar ett från början av en bitstring (nomatch). -
Funs som utvärderaren skapar är closures över OTP:s miljö
{Anno, Bindings, Lf, Ef, UsedVars, Clauses}, såfun_data/1ocherlang:fun_info/2svarar som i OTP;fun M:F/Amed delar vid körning användererlang:make_fun/3. -
exprs/2,expr/2ochcheck_command/2kontrollerar kommandon mederl_lint:exprs_opt/3som OTP gör. -
CTest
executables_erl_eval_exprs.
Erl lint
Kontrollerna i erl_lint är inbyggda funktioner (front_end/lint*.cpp),
skrivna efter OTP:s erl_lint klausul för klausul; erl_lint.erl behåller det
som anropar funs eller andra moduler.
- Ett
Lint-objekt håller OTP:s#lint{}-tillstånd; variabeltabeller är vektorer sorterade efter namn (OTP:s orddicts), mängder och maps som OTP håller i termordning är ordnade behållare, så fel behåller infogningsordningen och varningar sorteras som ireturn_status/1. module/1,2,3går genomclause_erl_lint:module/4med behaviour-modulernas svar frånbehaviour_info/1uppslagna i Erlang (skillnader);format_error/1formaterar svaret frånclause_erl_lint:format_spec/1(inklusive nästladeio_lib:format/2-delar) så att resultaten är lika OTP:s termer.- Utfasningar kommer från OTP:s
otp_internal-tabeller (front_end/otp_obsolete.inc, genererad avtests/compiler/library/generate_obsolete.escript). erl_eval:partial_eval/1ocherl_bits:set_bit_type/2som kontrollerna använder är C++ (lint_eval.cpp,bit_types.cpp).- CTest
executables_erl_lint_checks.
Erl pp
Utskriften i erl_pp är en inbyggd funktion (front_end/pp*.cpp),
clause_erl_pp:print/2, porterad från den tidigare Erlang-modulens två pass;
erl_pp.erl behåller krokarna och legalize_vars/1.
- Det första passet gör om en form till layoutobjekt i en arena (
pp_items,pp_exprs,pp_forms,pp_types); det andra lägger ut dem mot radbredden (pp_layout) och skriver atomer, strängar, tecken och värden genom C++-skrivarna iio_lib. - En form som bara kroken kan skriva stoppar layouten med
{hook, Expr, Column, Precedence};erl_pp.erlanropar kroken och skriver igen med svaren hittills, så varje krok körs en gång, i OTP:s ordning. - Precedenser och
erl_parse:abstract/2kommer frånerl_parse.cpp. - CTest
executables_erl_pp_forms.
Epp
Villkoren i epp:s -if och -elif utvärderas av en inbyggd funktion,
clause_epp:eval_if/1 (front_end/epp_eval.cpp), så ett program som
förbehandlar filer inte länkar erl_eval.
- Den utvärderar guard-uttrycket som
erl_eval:exprs/3gör utan bindningar: literaler, listor, tupler, maps och map-uppdateringar, binaries (segment genom bitfunktionerna iclause_erl_eval), operatorer därandalso/orelseger högersidans värde, och anrop av guard-BIF:ar (lokala autoimporterade ellererlang:) genom guard-tabellen för matchningsspecifikationer. - Varje fel (obundna variabler, odefinierade records, en BIF som ger fel, ett
lokalt anrop) gör villkoret falskt, eftersom
eppfångar det. epp,fileocherl_featureskompileras med strikt livstidsanalys.
Erl expand records
erl_expand_records:module/2 är en inbyggd funktion
(front_end/expand_records.cpp): expansionen går igenom former i C++ i stället
för en stor klausuldispatch i Erlang, så program som anropar den inte
kompilerar någon extra kod.
- OTP:s genomgångsordning (binary-segment från sista till första, matchningens
högersida först) och
recN-numrering; guard-tester medis_record/3blir mönster. - Filter i comprehensions är guard-tester enligt
erl_lint:s regler (front_end/guard_tests.cpp, med modulens records och lokala eller importerade funktioner). - Alternativen
dialyzer,expand_inits,[no_]strict_record_tests, även från-compile-attribut. - CTest
executables_erl_expand_records_forms.
Modulen zlib
builtins/zlib/streams.cpp, library/erts/zlib.erl.
- Länkar zlib 1.3.2 som OTP 29 (zlib): samma byte.
- En ström är en handtagsreferens som äger
z_stream; inbyggda funktioner iclause_zlibkör en operation över all indata. zlib.erlbehåller OTP:s API, fel, tillstånd och helbuffertfunktioner.- Komprimeringen i
term_to_binaryföljer OTP:s storleksregel.
Modulen zstd
builtins/zstd/contexts.cpp, library/stdlib/zstd.erl.
- Länkar zstd 1.5.7 som OTP 29 (zstd): samma ramar.
- Kontexter och ordlistor är handtagsreferenser som äger libzstd:s motsvarigheter;
en kontext som refererar till en ordlista håller den vid liv. Inbyggda
funktioner i
clause_zstdspeglar OTP:s NIF: utdatablock påZSTD_CStreamOutSize()/ZSTD_DStreamOutSize()(en ram som anger en mindre storlek dekomprimeras till ett block av den storleken), resultaten{continue, Rest, Out},{flush, Out}och{done, Out}, ägarkontroller (not_on_controlling_process), felen{badarg, {invalid_key | invalid_value, Term}}och{zstd_error, Name}, booleska värden läses tillbaka somfalseså som OTP:s NIF läser dem. zstd.erlbehåller OTP:s hantering av iodata, strömning och ramar.
ASN.1-kodek
builtins/asn1/ i clause_runtime, library/asn1/clause_asn1.erl
(ASN.1).
clause_asn1:encode/3ochdecode/3tar den genererade modulens schematerm, typnamnet och värdet eller byten (en binary eller iolist);decode/3returnerar{Value, Rest}. De tolkar schemat som asn1ct:s genererade BER-kod ochasn1rtt_bergör och ger sammaexit/error-orsaker, som den genererade omslutande funktionen gör om till{error, {asn1, Reason}}.- TLV:er tolkas som
asn1rt_niftolkar dem (tlv.cpp: dess felpositioner, gränser på två byte för taggar och fyra byte för längder);ber_decode.cpp,ber_constructed.cpp,ber_encode.cppochber_encode_constructed.cppinnehåller primitiva och konstruerade typer,values.cppINTEGER, REAL och DER-DEFAULT-jämförelser,legacy.cppäldreBIT STRING-former. - PER (
per.hpp):per_bits.cppbitfält, längdbestämningar, heltal och strängar med deras justering och fragment;per_encode.cpp/per_decode.cppde primitiva typerna;per_encode_constructed.cpp/per_decode_constructed.cppsekvenser, utökningar, val och öppna typer;per_strings.cppBIT STRING-värden. En PER-avkodning tar en binary och returnerar bitarna som lämnats olästa.
Publik nyckel
builtins/public_key/ i clause_runtime,
library/public_key/clause_public_key.erl (public_key):
record-genomgångarna och tabellerna i OTP:s pubkey_translation och
pubkey_cert_records, som clause_public_key_codec anropar.
translate(decode | encode, Term)(translate.cpp) går igenom en term sompubkey_translation:decode/1ochencode/1gör: de genererade modulernas recordsSubjectPublicKeyInfo_algorithm,DSA-Params,DSA-Sig-Value,OTPExtension,SingleAttribute,OneAsymmetricKey(versionv1) ochEncryptionAlgorithmIdentifierblir dem sompublic_key.hrldokumenterar, och tillbaka; en oäkta lista gerbad_generatorsom comprehension gör.oid_name(Table, Oid)ochname_oid(Table, Name)(tables.cpp, rader itables.inc) slår upp i tabellernapublic_key_algorithm(en algoritms nyckeltyp),curve_type,named_curve,ml_dsa,ml_kem,slh_dsaochextension(en utöknings typ);undefinednär tabellen saknar rad,badargför en annan tabell.asn1_module(Type)namnger den genererade modul somder_decode/2ochder_encode/2använder för en typ (public_key:get_asn1_module/1),undefinedför en typ som inte hör till någon.
Modulen crypto
builtins/crypto/ i det separata arkivet clause_runtime_crypto,
library/crypto/crypto.erl och clause_crypto.erl.
- Länkar OpenSSL:s libcrypto ≥ 3.1.2 (fastlåst 4.1.0, OpenSSL);
bara program som anropar
crypto(eller anger--with-crypto) länkar arkivet, vars postCLAUSE_crypto_extension_v1listas i startdeskriptorn. algorithms.cppbehåller OTP:s namntabeller (hashvärden, chiffer, MAC:ar, nyckeltyper, kurvor, KEM:ar) med deras OpenSSL-hämtningsnamn; det förstacrypto-anropet laddar leverantörerna default, base och legacy och hämtar varje hashfunktion, chiffer och MAC, som OTP:s NIF gör när den laddas; kurvor provas (en nyckel genereras på varje) vid förstasupports(curves).supports/0,1,hash_info/1,info/0ochinfo_lib/0rapporterar vad det länkade libcrypto har.- Hashtillstånd är handtagsreferenser som äger en
EVP_MD_CTX;hash_update/2returnerar ett nytt tillstånd över en kopia, som OTP:s. MAC-tillstånd äger enEVP_MAC_CTXsommac_update/2för framåt på plats.crypto.erlmatar texter längre än 20000 byte i delar, som OTP gör, så inget anrop av en inbyggd funktion körs länge. - Fel är OTP:s NIF-fel:
{badarg | notsup | error, #{c_file_name, c_file_line_num, c_function_arg_num}, Description}, somcrypto.erlgör om till{Class, {File, Line}, Description}mederror_info(?nif_call); beskrivningar och kontroller följer OTP:s ordning, fil och rad är Clauses. - Motorer svarar som en OTP vars OpenSSL saknar motorstöd (
notsup; OpenSSL 4 saknar det). - Chiffer (
cipher.cpp) följer OTP:sapi_ng.c: tillstånd fråncrypto_init/4äger enEVP_CIPHER_CTXbakom ett lås somcrypto_update/2för framåt på plats;crypto_final/1fyller ut enligt alternativen (OTP:sundefined,none,zero,random,pkcs_padding);crypto_one_time/5kör ett temporärt tillstånd.crypto.erlmatarcrypto_update/2med texter längre än 20000 byte i delar. AEAD (aead.cpp) följeraead.cför GCM, CCM och ChaCha20-Poly1305; en felaktig tagg dekrypteras tillerror.crypto.erlkörrand-generatorernacrypto_aesochcrypto_prng1som OTP:s, ovanpå de inbyggda funktionernaexro928_*ochseed58/2irand. - FIPS (
fips.cpp): varje tabellpost behåller en andrafips=yes-hämtning, som används i FIPS-läge; en post utan en sådan är förbjuden där (OTP:s*_FORBIDDEN_IN_FIPS), lämnarsupports/1och ger OTP:snotsup-beskrivningar.enable_fips_mode/1växlar OpenSSL:s standardegenskaper; program byggda med--fipslänkar arkivets postCLAUSE_crypto_fips_extension_v1, vars startkrok laddar leverantören bredvid den körbara filen (FIPS). - Publika nycklar följer OTP:s
pkey.c,rsa.c,dss.c,eddsa.c,ec.c,ecdh.c,dh.c,evp.cochsrp.c:crypto.erlgör om heltal till binaries (format_pkey,nif_curve_params) och de inbyggda funktionerna bygger OpenSSL-nycklar från sammaOSSL_PARAM-listor som OTP:s NIF:ar bygger (params.cpp, stora tal i native-byteordning), med OTP:s kontroller, beskrivningar och argumentnummer.pkey.cpp:sign/4,5,verify/5,6(RSA med PKCS #1, PSS, X9.31 och utan utfyllnad, DSA, ECDSA, EdDSA, ML-DSA, SLH-DSA;{digest, Digest}), RSA-public_encrypt/4och dess tre syskon (PKCS #1, OAEP med dess hashfunktioner och etikett, ingen utfyllnad),privkey_to_pubkey/2.keys.cpp: nyckelgenerering för RSA, DH, X25519/X448, Ed25519/Ed448, ML-DSA, SLH-DSA och ML-KEM, nyckelutbyte med DH och X25519/X448,encapsulate_key/2,decapsulate_key/3.curves.cpp: ECDH-nycklar och nyckelutbyte på namngivna eller explicita kurvor, försöker igen med explicita parametrar när OpenSSL inte känner till OTP:s namn (som OTP:sretry_without_name), ochec_curve/1, vars explicita parametrar kommer från det länkade libcrypto:s inbyggda kurvor i stället för OTP:s tabellcrypto_ec_curves(byte för byte samma termer).srp.cpp: SRP:s formler för stora tal;crypto.erlbehåller OTP:s multiplikator och scrambler. OTP:s egenheter behålls:sign(dss, none, ...)ger"Bad digest type",generate_key(dh, ...)ignorerar en given privat nyckel, och en publik RSA-exponent på flera byte når OpenSSL i native-byteordning.
Modulen re
builtins/re/, re.erl ovanpå medföljande PCRE2 (PCRE2).
- Kompilerat mönster: OTP 29:s
{re_pattern, ...}med en handtagsreferens. clause_re:compile/2,clause_re:run/4(en matchning, varje capture-alternativ, OTP:s fel).re.erl: chardata-konvertering,global-loop,replace,split.export/import/1tillhandahålls inte. CTestexecutables_re_module.
Prim eval
process/receive.cpp, library/erts/prim_eval.erl.
prim_eval:'receive'/2går igenom brevlådan med inbyggda funktioner iclause_receive(peek,skip,take,restart,wait); det första svaret som inte ärnomatchvinner.- CTest
executables_prim_eval_receive.
Clause