Marejeo ya Lugha

Marejeo kamili ya toleo la 1.0: maneno muhimu 12, familia za aina 5, waendeshaji, kazi za ndani, na muundo wa sarufi — pamoja na mipaka inayojulikana, iliyoandikwa kwa uwazi. Kila kitu kimejaribiwa kwa mkusanyaji halisi.

1. Maneno muhimu

Maneno muhimu 12 ya Swa, maana yao, na umbo la matumizi:

Maneno muhimu 12 ya Swa, maana yao, na umbo la matumizi
NenoMaanaUmbo la matumizi
kamashartikama (sharti) { ... }
sivyotawi-jinginesivyo { ... } (hiari; pia hali ya kawaida ya chagua)
wakatikitanziwakati (sharti) { ... }
kwakitanzi cha hesabukwa (kianzilishi; sharti; hatua) { ... }
chaguauteuzichagua (usemi) { hali 1: ...; sivyo: ...; }
halihali ya uteuzihali 1: taarifa;
vunjatoka kitanzivunja;
endeleaendelea kitanziendelea; (ndani ya kwa inaruka hadi hatua)
rudisharudisha thamanirudisha <usemi>; au rudisha; kwa W0
muundomuundo wa datamuundo Jina { N32 x; };
achiliaachilia kumbukumbuachilia(p);
husishatangazo la utegemezihusisha { faili.swa } au husisha C::stdio

2. Aina za nambari

Familia tano, kila moja ikifuatiwa na upana wa tarakimu:

Familia tano za aina za nambari za Swa, maelezo yao, na aina zilizojaribiwa
FamiliaJinaMaelezoZilizojaribiwa
Nkamili yenye isharaN8 (baiti 1), N16 (baiti 2), N32 (baiti 4), N64 (baiti 8)N8, N16, N32, N64
Aasili, bila isharanambari kamili zisizo na ishara
DdesimaliD64 = baiti 8, IEEE 754; D32 hutumia movss kwenye kizalisheD64
Bbuli/bitiB1 = matokeo ya ulinganisho na mantiki; aina ya ndaniB1
Wupana wa mashineW0 = bila thamani (void), kwa kazi tuW0

T* — kielekezi; T[n] — safu; miundo iliyotangazwa na mtumiaji. Hakuna neno tupu, kweli, wala uongo: W0 ni "bila thamani" na ukweli ni 1 au 0. Matokeo ya == != < > <= >= && || ! ni 1 au 0.

3. Waendeshaji

Ishara zote zinazosaidiwa:

ishara
+ - * / % << >> < > <= >= == != && || & | ^ ~ ! = ? : ( ) { } [ ] -> * & , ;

Utangulizi wa ishara, juu hadi chini:

Utangulizi wa waendeshaji wa Swa kwa vina
KinaWaendeshaji
6* / %
5+ -
4<< >>
3< > <= >=
2== != = (ugawi)
1&& || & | ^

Mabano hubadilisha utangulizi. Ternary sharti ? kweli : uwongo inasaidiwa. && na || zinatathmini kwa fupi-hali. Hesabu ya kielekezi: &, *, ->, a[i].

4. Kazi za ndani

Kazi za ndani za Swa, umbo la matumizi, na maelezo
KaziUmboMaelezo
wito_wa_mfumowito_wa_mfumo(N64 namba, N64 a1, ..., N64 a6)syscall ya Linux: rax = namba, rdi, rsi, rdx, r10, r8, r9
tekelezatekeleza(N8* kazi, N32 argc, N8** argv, N32 ofseti)JIT: r11 = kazi, rdi = argc, rsi = argv + ofseti * 8, al = 0, call r11
anwani_ya_kazianwani_ya_kazi(N8* jina)anwani ya kazi ya ndani (kwa JIT)
ukubwaukubwa(T)ukubwa wa aina kwa baiti — wakati wa kukusanya kwenye mnyororo wa .swa, kazi ya wakati wa utekelezaji kwenye mbegu

5. Kumbukumbu na mifumo

tenga(ukubwa) hutenga kumbukumbu; achilia(p) huachilia; badili(p, ukubwa) hupanua kipande (inayolingana na realloc). Maktaba inatumia arena ya kumbukumbu (mmap ya baiti 1,048,576) badala ya malloc/realloc/free; achilia haifungui kipande kweli — kinarejeshwa kwenye arena.

kumbukumbu_z.swa
N32 main() {
    N32* p = tenga(4);
    kama (p == 0) { rudisha 1; }
    *p = 42;
    andika("thamani: %d\n", *p);
    achilia(p);
    rudisha 0;
}
$ ./kumbukumbu_z.bin thamani: 42

6. Muundo wa sarufi

Faharasa ya vipimo rasmi, kipande kwa kipande:

  1. Muundo wa kimsingi: matamko ya kiwango cha juu — kazi, miundo, vigezo na safu za ulimwengu, na matamko ya husisha. Sehemu ya kuingia ni N32 main() (au N32 main(N32 argc, N8** argv)). Taarifa ya kiwango cha juu ni kosa la mchanganuzi.
  2. Leksia: vitambulisho (herufi au _ kwanza), maneno muhimu 12, halisi (kamili hadi N32/N64, desimali hadi D64, mfuatano), maoni (// na /* ... */, bila kijiuzi), ishara.
  3. Aina: familia 5 (N, A, D, B, W), kielekezi, safu, miundo.
  4. Usemi na utangulizi: vina 6 hadi 1, fupi-hali, hesabu ya kielekezi (&, *, ->, a[i]).
  5. Tangazo la kazi: <aina> <jina>(<vigezo>) { <mwili> }.
  6. Taarifa: tangazo la kigezo, ugawi, kama/sivyo, wakati, kwa, chagua, vunja, endelea.
  7. Miundo: sehemu kwa . na ->; kupita na kurejesha kwa thamani.
  8. Kuingiza: husisha { faili.swa } — maelekezo ya utegemezi; mnyororo wa sasa huyaondoa na faili huunganishwa kwa cat. husisha C::stdio — jina la kumbukumbu la C kwenye faili la kitu, hutoa kazi yoyote.
  9. Kazi za ndani: wito_wa_mfumo, tekeleza, anwani_ya_kazi, ukubwa(T).
  10. Maktaba ya kawaida: msingi/*.swa — moduli 9 za watumiaji pamoja na moduli za mkusanyaji.
  11. Mipaka ya 1.0: sehemu ya 7 hapa chini.
  12. Uthibitisho: majaribio ya mnyororo na ya dereva.

7. Mipaka na ukweli

Toleo la 1.0 lina mipaka yake, na mipaka hii imejaribiwa kwa kujenga na kuendesha mkusanyaji. Hali halisi ya kila kipengele:

Hali halisi ya vipengele vya Swa 1.0 kwenye minyororo asilia
KipengeleHali
kama, sivyo, wakati, kwa, vunja, endeleazinafanya kazi kwenye minyororo yote miwili; kwa ina semantiki ya C ya endelea (inaruka hadi hatua)
chagua, halizimevunjika: mbegu inakataa chagua kabisa; mnyororo wa .swa hulinganisha hali ya kwanza pekee. Dereva wa Rust/LLVM (majaribio) ndio pekee unazifanya kazi
miundo kwa kielekezi (p->x)zinafanya kazi kwenye minyororo yote miwili
miundo kwa thamani kama hojambegu inarudisha matokeo mabaya kimya (pata_x(n) hurudisha 72 badala ya 12); mnyororo wa .swa unafanya kazi. Kurudisha muundo kwa thamani (sret) kunafanya kazi
tenga(ukubwa) na achilia(p)zinafanya kazi kwenye minyororo yote miwili — moduli ya kumbukumbu lazima iunganishwe
tenga N32 (umbo la taarifa)SEGV kwenye minyororo yote miwili — usitumie
husisha { faili.swa }tangazo la utegemezi pekee: mbegu inakiruka, stage1 inakiondoa (ondoa_husisha); faili lazima ziunganishwe kwa cat
safu yenye kianzilishi cha mfuatano (N8 s[] = "habari")imevunjika kwenye minyororo yote miwili; tumia nakili_mfuatano
aina pana (N128, A128, D80, B64, W64)mbegu SEGV; mnyororo wa .swa unafanya kazi; hazijathibitishwa na majaribio
halisi za herufi ('A')hazipo — mchanganuzi analia herufi isiyojulikana; tumia nambari ya ASCII
D64 kwenye kiwango cha juumbegu inashindwa kuchanganua; ndani ya kazi inafanya kazi
wito wa kazi wenye D64 (hoja au kurejesha)mbegu inakataa kwa sauti (ABI ya xmm haijakamilika); mnyororo wa .swa una ABI kamili
uchapishaji wa nambari hasi%d kwa N32 hasi kwenye mbegu inachapisha 4294967295; N64 hasi kwenye .swa bado si sahihi; %% haitorekaji
N64 kubwa kwenye kigezo cha ndanimbegu inahifadhi thamani mbovu kimya; kigezo cha ulimwengu kinahifadhiwa kwa usahihi
B1 kama aina ya kigezo kinachotangazwambegu SEGV; mkaguzi wa .swa anakataa
faili.swa, nasibu.swa, wakati.swazinahitaji maktaba ya C — haziwezi kufanya kazi kwenye mnyororo safi wa --exe
orodha.swa, ramani.swaFAIL kwenye MANIFEST kwa mbegu (hesabu ya anwani ya tenga/badili); mnyororo wa .swa unafanya kazi