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:
| Neno | Maana | Umbo la matumizi |
|---|---|---|
kama | sharti | kama (sharti) { ... } |
sivyo | tawi-jingine | sivyo { ... } (hiari; pia hali ya kawaida ya chagua) |
wakati | kitanzi | wakati (sharti) { ... } |
kwa | kitanzi cha hesabu | kwa (kianzilishi; sharti; hatua) { ... } |
chagua | uteuzi | chagua (usemi) { hali 1: ...; sivyo: ...; } |
hali | hali ya uteuzi | hali 1: taarifa; |
vunja | toka kitanzi | vunja; |
endelea | endelea kitanzi | endelea; (ndani ya kwa inaruka hadi hatua) |
rudisha | rudisha thamani | rudisha <usemi>; au rudisha; kwa W0 |
muundo | muundo wa data | muundo Jina { N32 x; }; |
achilia | achilia kumbukumbu | achilia(p); |
husisha | tangazo la utegemezi | husisha { faili.swa } au husisha C::stdio |
2. Aina za nambari
Familia tano, kila moja ikifuatiwa na upana wa tarakimu:
| Familia | Jina | Maelezo | Zilizojaribiwa |
|---|---|---|---|
N | kamili yenye ishara | N8 (baiti 1), N16 (baiti 2), N32 (baiti 4), N64 (baiti 8) | N8, N16, N32, N64 |
A | asili, bila ishara | nambari kamili zisizo na ishara | — |
D | desimali | D64 = baiti 8, IEEE 754; D32 hutumia movss kwenye kizalishe | D64 |
B | buli/biti | B1 = matokeo ya ulinganisho na mantiki; aina ya ndani | B1 |
W | upana wa mashine | W0 = bila thamani (void), kwa kazi tu | W0 |
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:
+ - * / % << >> < > <= >= == != && || & | ^ ~ ! = ? : ( ) { } [ ] -> * & , ;
Utangulizi wa ishara, juu hadi chini:
| Kina | Waendeshaji |
|---|---|
| 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 | Umbo | Maelezo |
|---|---|---|
wito_wa_mfumo | wito_wa_mfumo(N64 namba, N64 a1, ..., N64 a6) | syscall ya Linux: rax = namba, rdi, rsi, rdx, r10, r8, r9 |
tekeleza | tekeleza(N8* kazi, N32 argc, N8** argv, N32 ofseti) | JIT: r11 = kazi, rdi = argc, rsi = argv + ofseti * 8, al = 0, call r11 |
anwani_ya_kazi | anwani_ya_kazi(N8* jina) | anwani ya kazi ya ndani (kwa JIT) |
ukubwa | ukubwa(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.
N32 main() {
N32* p = tenga(4);
kama (p == 0) { rudisha 1; }
*p = 42;
andika("thamani: %d\n", *p);
achilia(p);
rudisha 0;
}
6. Muundo wa sarufi
Faharasa ya vipimo rasmi, kipande kwa kipande:
- Muundo wa kimsingi: matamko ya kiwango cha juu — kazi, miundo, vigezo na safu za ulimwengu, na matamko ya
husisha. Sehemu ya kuingia niN32 main()(auN32 main(N32 argc, N8** argv)). Taarifa ya kiwango cha juu ni kosa la mchanganuzi. - Leksia: vitambulisho (herufi au
_kwanza), maneno muhimu 12, halisi (kamili hadi N32/N64, desimali hadi D64, mfuatano), maoni (//na/* ... */, bila kijiuzi), ishara. - Aina: familia 5 (
N,A,D,B,W), kielekezi, safu, miundo. - Usemi na utangulizi: vina 6 hadi 1, fupi-hali, hesabu ya kielekezi (
&,*,->,a[i]). - Tangazo la kazi:
<aina> <jina>(<vigezo>) { <mwili> }. - Taarifa: tangazo la kigezo, ugawi,
kama/sivyo,wakati,kwa,chagua,vunja,endelea. - Miundo: sehemu kwa
.na->; kupita na kurejesha kwa thamani. - Kuingiza:
husisha { faili.swa }— maelekezo ya utegemezi; mnyororo wa sasa huyaondoa na faili huunganishwa kwacat.husisha C::stdio— jina la kumbukumbu la C kwenye faili la kitu, hutoa kazi yoyote. - Kazi za ndani:
wito_wa_mfumo,tekeleza,anwani_ya_kazi,ukubwa(T). - Maktaba ya kawaida:
msingi/*.swa— moduli 9 za watumiaji pamoja na moduli za mkusanyaji. - Mipaka ya 1.0: sehemu ya 7 hapa chini.
- 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:
| Kipengele | Hali |
|---|---|
kama, sivyo, wakati, kwa, vunja, endelea | zinafanya kazi kwenye minyororo yote miwili; kwa ina semantiki ya C ya endelea (inaruka hadi hatua) |
chagua, hali | zimevunjika: 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 hoja | mbegu 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 juu | mbegu 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 ndani | mbegu inahifadhi thamani mbovu kimya; kigezo cha ulimwengu kinahifadhiwa kwa usahihi |
B1 kama aina ya kigezo kinachotangazwa | mbegu SEGV; mkaguzi wa .swa anakataa |
faili.swa, nasibu.swa, wakati.swa | zinahitaji maktaba ya C — haziwezi kufanya kazi kwenye mnyororo safi wa --exe |
orodha.swa, ramani.swa | FAIL kwenye MANIFEST kwa mbegu (hesabu ya anwani ya tenga/badili); mnyororo wa .swa unafanya kazi |