Ăl mallkuar i projektit Cosmopolitan 2.0 Ă«shtĂ« publikuar, i cili po zhvillon bibliotekĂ«n standarde C dhe formatin universitar tĂ« skedarĂ«ve ekzekutivĂ«, i cili mund tĂ« pĂ«rdoret pĂ«r shpĂ«rndarjen e programeve pĂ«r sisteme tĂ« ndryshme operative pa pĂ«rdorur interpreterĂ« dhe makina virtuale. Rezultati i marrĂ« pĂ«rmes kompilimit nĂ« GCC dhe Clang komponohet nĂ« njĂ« skedar ekzekutiv universitar qĂ« mund tĂ« startohet nĂ« çdo distribucion tĂ« Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD dhe madje edhe tĂ« thirret nga BIOS. Kodi i projektit shpĂ«rndahet nĂ«n licencĂ«n ISC (version i thjeshtuar i MIT/BSD).
Kontejneri për formimin e skedarëve ekzekutivë universitarë është i bazuar në kombinimin e segmenteve të specifikës për sisteme të ndryshme operative dhe titujve (PE, ELF, MACHO, OPENBSD) në një skedar, duke kombinuar në të disa formate të ndryshme të përdorura në Unix, Windows dhe macOS. Për të siguruar startimin e një skedari ekzekutiv në Windows dhe sistemet Unix, përdoret një truk i lidhur me kodimin e skedarëve Windows PE në formën e një skedari shell, duke përfituar nga fakti se Thompson Shell nuk përdor shenjën e skedareve "#!". Për krijimin e programeve që përfshijnë disa skedare (kombinimi i të gjitha burimeve në një skedar), mbështetet formimi i skedarit ekzekutiv në formën e një arkivi ZIP të formatuar në mënyrë speciale. Skema e formatit të propozuar (shembulli i aplikacionit hello.com):
MZqFpD=â BIOS BOOT SECTORâ exec 7 $(command -v $0) printf â\177ELFâŠLINKER-ENCODED-FREEBSD-HEADERâ >&7 exec «$0» «$@» exec qemu-x86_64 «$0» «$@» exit 1 REAL MODE⊠ELF SEGMENTS⊠OPENBSD NOTE⊠MACHO HEADERS⊠CODE AND DATA⊠ZIP DIRECTORYâŠ
Fillimisht në skedar jepet një etiketë «MZqFpD», e cila përceptohet si një titull format Windows PE. Kjo sekuencë gjithashtu dekodohet në udhëzimin «pop %r10 ; jno 0x4a ; jo 0x4a», ndërsa vargu «\177ELF» në udhëzimin «jg 0x47», të cilat përdoren për kalimin në pikën e hyrjes. Në sistemet Unix ekzekutohet kodi shell, në të cilin përdoret komanda exec me transmetimin e kodit ekzekutiv përmes një kanali të paemëruar. Kufizimi i metodës së propozuar është mundësia e ekzekutimit në OS të ngjashëm me Unix vetëm duke përdorur shell-e që mbështesin përputhjen me Thompson Shell.
Thirrja e qemu-x86_64 parashikohet për realizimin e portabilitetit shtesë dhe lejon ekzekutimin e kodit të kompiluar për arkitekturën x86_64 në platformat që nuk janë x86, për shembull, në pllakëza Raspberry Pi dhe pajisje Apple që janë të përfshira me procesorë ARM. Projekti gjithashtu mund të përdoret për krijimin e aplikacioneve të vetë-mjaftueshme, të cilat funksionojnë pa sistem operativ (bare metal). Në këto aplikacione, një ngarkues i bashkëngjitet skedarit ekzekutiv, dhe programi shërben si një sistem operativ i ngarkueshëm.
Në bibliotekën standarde C libc që po zhvillohet nga projekti janë propozuar 2024 funksione (në lëshimin e parë ishin rreth 1400 funksione). Për nga performanca, Cosmopolitan punon po aq shpejt sa glibc dhe përshpejton dukshëm Musl dhe Newlib, ndërsa Cosmopolitan është me një rend kodimi më të vogël se glibc dhe përafërsisht përputhet me Musl dhe Newlib. Për optimizimin e funksioneve që thirren shpesh si memcpy dhe strlen, përdoret gjithashtu teknika e "trickle-down performance", ku për thirrjen e funksionit përdoret një makro-mbështetje, në të cilin kompileri informohet për regjistrat e CPU të angazhuar në procesin e ekzekutimit të kodit, që lejon kursimin e burimeve duke ruajtur gjendjen e CPU përmes ruajtjes vetëm të regjistrave të ndryshueshëm.
Ndryshimet në publikimin e ri përfshijnë:
- Ka ndryshuar skema e qasjes nĂ« burimet e brendshme brenda skedarit zip (kur hapen skedarĂ«t tani pĂ«rdoren rrugĂ« tĂ« zakonshme \/zip\⊠nĂ« vend tĂ« qasjes sipas prefiksit zip:..). Po ashtu, pĂ«r aksesin nĂ« disqet nĂ« Windows Ă«shtĂ« ofruar mundĂ«sia e pĂ«rdorimit tĂ« rrugĂ«ve tĂ« tipit «\/c\/âŠÂ» nĂ« vend tĂ« «C:\âŠÂ».
- ĂshtĂ« propozuar njĂ« ngarkues i ri APE (Actually Portable Executable), i cili pĂ«rcakton formatin e skedarĂ«ve universitarĂ« ekzekutivĂ«. Ngarkuesi i ri pĂ«rdor mmap pĂ«r vendosjen e programit nĂ« kujtesĂ« dhe nuk ndryshon mĂ« pĂ«rmbajtjen nĂ« kohĂ« reale. NĂ«se Ă«shtĂ« e nevojshme, skedari ekzekutiv universitar mund tĂ« konvertohet nĂ« skedarĂ« ekzekutivĂ« tĂ« zakonshĂ«m tĂ« lidhur me platforma tĂ« veçanta.
- Në platformën Linux është zbatuar mundësia e përdorimit të modulit të bërthamës binfmt_misc për ekzekutimin e programeve APE. Vihet në dukje se përdorimi i binfmt_misc është metoda më e shpejtë për ekzekutim.
- Për Linux është propozuar implementimi i funksionalitetit të thirrjeve sistemike pledge() dhe unveil(), që janë duke u zhvilluar nga projekti OpenBSD. Ofrohet një API për përdorimin e këtyre thirrjeve në programe në gjuhët C, C++, Python dhe Redbean, si dhe një utilitet pledge.com për izolimin e proceseve të rastit.
- PĂ«r ndĂ«rtimin pĂ«rdoret utilita Landlock Make â njĂ« version i GNU Make me kontroll mĂ« tĂ« fortĂ« tĂ« varĂ«sive dhe pĂ«rdorimin e thirrjes sistemore Landlock pĂ«r tĂ« izoluar programin nga pjesa tjetĂ«r e sistemit dhe pĂ«r tĂ« rritur efikasitetin e caching. Siopsion, Ă«shtĂ« ruajtur mundĂ«sia e ndĂ«rtimit me GNU Make tĂ« zakonshĂ«m.
- JanĂ« implementuar funksione pĂ«r shumĂ«thirrje â _spawn() dhe _join(), qĂ« pĂ«rfaqĂ«sojnĂ« mbĂ«shtetje universale pĂ«r API tĂ« ndryshme specifike pĂ«r sistemet operative. Po ashtu, po punohet pĂ«r implementimin e mbĂ«shtetjes pĂ«r POSIX Threads.
- ĂshtĂ« ofruar mundĂ«sia e pĂ«rdorimit tĂ« fjalĂ«s kyçe _Thread_local pĂ«r tĂ« pĂ«rdorur depo tĂ« veçanta pĂ«r çdo fije (TLS, Thread-Local Storage). Nga e para, runtime C inicializon TLS pĂ«r fijen kryesore, e cila ka çuar nĂ« rritjen e madhĂ«sisĂ« minimale tĂ« skedarit tĂ« ekzekutueshĂ«m nga 12 nĂ« 16 KB.
- NĂ« skedarĂ«t e ekzekutueshĂ«m Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r parametrat ââftraceâ dhe ââstraceâ pĂ«r tĂ« prodhuar nĂ« stderr informacion mbi tĂ« gjitha thirrjet e funksioneve dhe thirrjet sistemore.
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r thirrjen sistemore closefrom(), e mbĂ«shtetur nĂ« Linux 5.9+, FreeBSD 8+ dhe OpenBSD.
- Në platformën Linux është rritur deri në 10 herë performanca e thirrjeve clock_gettime dhe gettimeofday për shkak të përdorimit të mekanizmit vDSO (virtual dynamic shared object), i cili lejon që menaxheri i thirrjes sistemore të transferohet në hapësirën e përdoruesit dhe të shmangë ndryshimet e kontekstit.
- Janë transferuar funksionet matematikore nga biblioteka Musl për punën me numra kompleksë. Performanca e shumë funksioneve matematikore është përmirësuar.
- ĂshtĂ« propozuar funksioni nointernet(), qĂ« çjerr mundĂ«sitĂ« rrjetore.
- Janë shtuar funksione të reja për bashkimin efikas të vargjeve: appendd, appendf, appendr, appends, appendw, appendz, kappendf, kvappendf dhe vappendf.
- ĂshtĂ« shtuar njĂ« variant i mbrojtur i familjes sĂ« funksioneve kprintf(), i destinuar pĂ«r t'u pĂ«rdorur nĂ«n privilegje tĂ« rritura.
- Performanca e implementimeve është rritur ndjeshëm SSL, SHA, curve25519 dhe RSA.
Burimi: opennet.ru
