BASIC மொழி

aukimi-இன் கிளாசிக் BASIC பேச்சுவழக்கு types, structures, இரண்டு shorthands, மற்றும் எல்லோரையும் மாட்டிக்கொள்ளும் விதிகள். இதற்குப் பின்னால் 2,237 commands.

ஒரே வரியில்#

Aukimi ஒரு கிளாசிக் BASIC பேச்சுவழக்கை வழங்குகிறது: ஒரு விளையாட்டு macro system அல்ல, ஒரு முழுமையான மொழி, typed numerics, records, methods, references, structured errors, coroutines மற்றும் WebGPU compute-உடன். இது Engine-இன் TXT viewport முறையிலும், script editor-இன் BASIC காட்சியிலும் வாழ்கிறது.

JavaScript தொடர்ந்து canonical scripting API ஆகவே இருக்கிறது. BASIC ஒரு விருப்பமான frontend: இரண்டும் அதே private dispatcher-க்கு compile ஆகின்றன, எனவே ஒரு BASIC நிரலும் ஒரு JavaScript நிரலும் சரியாக அதே engine-ஐ அடைகின்றன. எதுவும் இரண்டாம் தரமானது அல்ல, எதுவும் தனி runtime அல்ல.

எல்லோரையும் மாட்டிக்கொள்ளும் விதி#

ஒரு command அழைப்பு எப்போதும் அடைப்புக்குறிகளை (parentheses) சுமக்கிறது.

mode = ClipSpaceMode()
SpritePosition(player, 320, 180)

இது ஒரு style அல்ல. இதுவே compiler-ஐ ஒரு command-ஐயும் variable-ஐயும் வேறுபடுத்தச் செய்கிறது, மேலும் இதனால்தான் ஒரு எழுத்துப்பிழை இப்போது compile நேரத்திலேயே பிடிபடுகிறது:

நீங்கள் எழுதுவதுமுன்பு என்ன நடந்ததுஇப்போது என்ன நடக்கிறது
SpritePositon(1, 10, 20)சுத்தமாக compile ஆகிவிடும், sprite நகராது, மேலும் தோல்வி பின்னர் ... is not defined என தோன்றும்compile error, அருகிலுள்ள catalogued spelling பரிந்துரைக்கப்பட்டு
Blorp(1, 2)உருவாக்கப்பட்ட JavaScript-க்குள் அப்படியே அனுப்பப்படும்compile error
ceci nest pas du basicஒரு statement ஆக வெளியிடப்படும்compile error

ஒரு எழுத்து தவறு முன்பு ஒரு engine பிழையாகத் தன்னைக் காட்டிக் கொள்ளும். 84-demo corpus-க்கு எதிராக அளவிடப்பட்டதில், இந்த guard பூஜ்ஜிய தவறான positives-ஐ உருவாக்கியது, மேலும் இரண்டு உண்மையான அமைதியான தோல்விகளைக் கண்டறிந்தது, SetMusicSystemVolume மற்றும் GetLightSensorExists, catalogue இவற்றை MusicSystemVolume மற்றும் LightSensorExists என்று மட்டுமே அறியும்.

இரண்டு leaks வேண்டுமென்றே திறந்தே விடப்பட்டுள்ளன: console.log("x") மற்றும் window.x = 1 இன்னும் கடந்து செல்கின்றன. அவற்றுக்கான ஒரு guard எழுதப்பட்டு, அளவிடப்பட்டு, திரும்பப் பெறப்பட்டது: BASIC compiler-ஆல் enumerate செய்ய முடியாத பெயர்களை வழங்கும் ஒரு context-க்குள் இயங்குகிறது, எனவே தெரியாத ஒரு root-ஐ மறுப்பது சரியான நிரல்களையும் நிராகரித்தது. அங்கே ஒரு தவறான positive, leak-ஐ விட மோசமானது.

மிகவும் பொதுவான ஒரே ஆச்சரியம்:

Print(...)திரையில் வரையும், மேலும் ஒரு நிரல் ஒவ்வொரு frame-உம் இதை அழைக்கும்
Console(...)editor-இன் console-க்கு எழுதும், வேறு எதுவும் செய்யாது
Debug(...)muscle memory-க்காக, PureBasic-இன் பெயரின் கீழ் அதே command
ConsoleWarning, ConsoleError, ClearConsolelog-இன் மீதமுள்ளவை

ஒரு frame loop-இல் Print, console-இல் உள்ள எந்த உண்மையான பிழையையும் மூழ்கடித்துவிடும், இதனால்தான் இரண்டும், ஒரு flag உடன் ஒன்றாக இல்லாமல், தனித்தனி commands ஆக உள்ளன.

Types#

Numeric types உண்மையானவை, மேலும் ஒவ்வொரு target-இலும் ஒரே மாதிரியாக நடந்துகொள்கின்றன, editor, HTML export மற்றும் Bevy/native build:

  • Signed மற்றும் unsigned 8, 16, 32 மற்றும் 64-bit integers, deterministic coercion, integer DIV, மற்றும் wrapping overflow-உடன்.
  • float32 மற்றும் float64.
  • classic sigils இன்னும் வேலை செய்கின்றன: name$ ஒரு string, speed# ஒரு float.

OPTION EXPLICIT விருப்பப்படி இயக்கக்கூடியது, மேலும் classic implicit variables இயல்பாகவே தொடர்கின்றன, எனவே இறக்குமதி செய்யப்பட்ட நிரல்கள் இன்னும் இயங்கும். அதை இயக்குவது, அது இல்லாமல் பாதுகாப்பாக இருக்க முடியாத இரண்டு அம்சங்களுக்கும் முன்நிபந்தனை, numeric typing மற்றும் references, ஏனெனில் அமைதியாக ஒரு variable-ஐ உருவாக்கும் ஒரு எழுத்துப்பிழை assignment இரண்டையும் தோற்கடிக்கும்.

Structures#

Records#

TYPE ஒரு record-ஐ declare செய்கிறது. அவை எப்படி வேண்டுமானாலும் nest ஆகலாம், மேலும் அவற்றுக்கு value semantics உண்டு: ஒன்றை assign செய்வது, nested arrays மற்றும் collections உட்பட, அதை deep-copy செய்யும்.

Methods#

METHOD ஒரு function-ஐ ஒரு instance-க்கு bind செய்கிறது, அதற்குள் SELF-உடன், construct செய்ய New-உம் destroy செய்ய Delete-உம். Deep copies method-safe ஆகவே இருக்கும்.

References#

REF மற்றும் BYREF இரண்டு எழுத்துருக்களுக்குக் கீழே உள்ள அதே விஷயம், மேலும் இரண்டும் ஒரு live read/write parameter-ஐத் தருகின்றன, ஒரு scalar, ஒரு record, ஒரு தனி field, ஒரு array, ஒரு list cursor அல்லது ஒரு map entry-க்கு. References calls வழியாக முன்னோக்கிச் செல்கின்றன, மேலும் எல்லையில் fixed-width types-க்கு coerce ஆகின்றன.

Handles#

@target ஒரு first-class reference-ஐ எடுக்கும். HANDLE மற்றும் POINTER typed forms, சரிபார்க்கப்பட்ட read, write, validity மற்றும் release-உடன், மேலும் நீக்கப்பட்ட ஒரு record-க்கான ஒரு handle, தொங்கவிடப்படாமல் invalidate செய்யப்படும்.

Control மற்றும் safety#

Structured errors: TRY / CATCH / FINALLY, nested, THROW-உடன், பாதுகாக்கப்பட்ட RETHROW, மற்றும் structured மற்றும் string catches இரண்டும்.

Conditional compilation: #IF / #ELSEIF / #ELSE / #ENDIF, nested, feature flags மற்றும் editor, HTML, Bevy, native/wasm மற்றும் debug/release-க்கான explicit profiles-உடன். இது ஒவ்வொரு target-இலும் includes-க்கு முன் தீர்க்கப்படுகிறது.

Rich functions: default values, OPTIONAL, ஒரு இறுதி PARAMARRAY (அல்லது ...), safe arity overloads, typed return coercion, மற்றும் clone செய்யப்பட்ட record மற்றும் array returns.

Multi-file நிரல்கள்#

#INCLUDE, #INSERT மற்றும் IncludeFile ஒரு நிரலை பல கோப்புகளாக ஆக்குகின்றன. Editor திட்ட modules-ஐ உருவாக்கி இறக்குமதி செய்கிறது, include paths-ஐ complete செய்கிறது, dependency graph-ஐ வைத்திருக்கிறது, மேலும் ஒவ்வொரு runtime target-உம் இதற்காக wire செய்யப்பட்டுள்ளது.

Coroutines, மற்றும் வேண்டுமென்றே விடப்பட்ட விஷயம்#

Cooperative tasks label அடிப்படையிலானவை, typed handles, ஒரு result மற்றும் error state, yields-இல் cancellation, மற்றும் ஒரு task-இலோ ஒரு group-இலோ awaits-உடன். அவை ஒவ்வொரு target-இலும் game scheduler-ஐ பகிர்ந்துகொள்கின்றன.

Shared memory உள்ள Threads வேண்டுமென்றே விலக்கப்பட்டுள்ளன. "இன்னும் இல்லை" அல்ல, விலக்கப்பட்டுள்ளது. நீங்கள் reason செய்யக்கூடிய ஒரு cooperative scheduler, நீங்கள் reproduce செய்ய முடியாத ஒரு data race-ஐ விட மேலானது.

WebGPU compute#

Typed f32 / i32 / u32 storage buffers, raw WGSL pipelines, frame-ordered dispatch மற்றும் memblock readback, BASIC-இலிருந்து உண்மையான GPU compute.

⚠️ Engine மட்டும். HTML target ஒரு வெளிப்படையான capability error-ஐ எழுப்புகிறது, மேலும் Bevy target, முதல் dispatch-இல் தோல்வியடையும் ஒரு பைனரியை உருவாக்குவதற்குப் பதிலாக, build-க்கு முன் incompatibility-ஐ தெரிவிக்கிறது.

அதே பிரச்சினைக்கான இரண்டு shorthands#

597 commands Set/Get<Object><Property> என பெயரிடப்பட்டுள்ளன: Sprite 66, Tween 58, Text 32, Edit 29. Object-இன் பெயர் function பெயருக்குள் இருக்கிறது, மேலும் அதன் id ஒவ்வொரு வரியின் முதல் argument. கீழே உள்ள இரண்டு shorthands-உம் அந்த மறுபடியும் மறுபடியும் சொல்லுதலை நீக்குகின்றன, மேலும் இரண்டும் ஒரு புதிய API அல்ல: compiler உண்மையான command பெயரை மீண்டும் கட்டமைத்து அதை catalogue-இல் தேடுகிறது.

WITH <family>, ஒரு block-க்குள்#

WITH SPRITE s
  \position 100, 200      ` SpritePosition(s, 100, 200)
  \size 64, 64            ` SpriteSize(s, 64, 64)
  x# = \x                 ` SpriteX(s)
ENDWITH

ஒரு statement-இன் தலைப்பில் \prop எழுதுகிறது; வேறு எங்கும் அது படிக்கிறது. இடம்தான் தீர்மானிக்கிறது, எனவே கற்றுக்கொள்ள இரண்டாவது notation எதுவும் இல்லை. WITH hero, ஒரு token, இன்னும் record block தான்; WITH SPRITE s ஒரு catalogue family-ஐ தேர்ந்தெடுக்கிறது.

s.position(...), வேறு எல்லா இடங்களிலும்#

s = CreateSprite(img)     ` the family is DEDUCED from the creation command
s.position(100, 200)      ` SpritePosition(s, 100, 200)
s.visible = 1             ` SpriteVisible(s, 1)
x# = s.x                  ` SpriteX(s)

Family Create<F> / Load<F> / Clone<F>-இலிருந்து வருகிறது, அல்லது id வேறு எங்கிருந்தாவது வரும்போது ஒரு வெளிப்படையான s AS Sprite-இலிருந்து. Family தெரிந்த variables மட்டுமே மீண்டும் எழுதப்படும்: records தங்கள் fields-ஐ வைத்திருக்கும், lists தங்கள் methods-ஐ வைத்திருக்கும், SELF.field தொடப்படாமல் இருக்கும்.

⚠️ Typed parameter ஒன்று அடையாளம் காணப்படாது. FUNCTION move(s AS Sprite), s-க்கு ஒரு family தராது, pass statement-level declarations மற்றும் assignments-ஐ மட்டுமே படிக்கும். இது ஒரு உண்மையான வரம்பு என்பதால் இங்கு சொல்லப்பட்டுள்ளது, நீங்கள் தேட வேண்டிய ஒரு பிழை அல்ல.

⚠️ Catalogue properties-இல் வினைச்சொல்லை கைவிடுகிறது, lifecycle-இல் வைத்திருக்கிறது. SpritePosition எழுதுகிறது, SpriteX படிக்கிறது, மேலும் இரண்டும் ஒரு Set அல்லது Get-ஐ சுமக்காது: முழு catalogue-இலும் 4 commands Set-உடன் தொடங்குகின்றன, மேலும் எதுவும் Get-உடன் தொடங்குவதில்லை. ஏதேனும் ஒன்று உருவாகும் அல்லது முடிவடையும் இடத்தில் வினைச்சொல் தப்பிக்கிறது: CreateSprite, LoadImage, DeleteSprite.

ஒரு எழுத்துப்பிழை ஒரு compile error என்பதால் இது தெரிந்துகொள்ள மதிப்புள்ளது, மேலும் மக்கள் வரும் எழுத்துப்பிழை Set… தான். Catalogue தான் அதிகாரம், மேலும் the reference அதிலிருந்து உருவாக்கப்படுகிறது.

String interpolation, விருப்பப்படி#

Print($"score: {points}")        ` "score: " + Str(points)

{{ மற்றும் }} literal braces-ஐ எழுதுகின்றன.

⚠️ $ prefix கட்டாயமானது, மேலும் அது ஒரு அலங்காரம் அல்ல. ஒவ்வொரு literal-ஐயும் interpolate செய்வது, world API வழக்கமாக எடுத்துக்கொள்ளும் கையால் எழுதப்பட்ட JSON-ஐ உடைத்தது:

CreateTerrain("island", "{\"preset\":\"island\",\"size\":256}")

அங்கு braces தரவு, holes அல்ல. ஒரு prefix இல்லாத string, அது எதைக் கொண்டிருந்தாலும் தொடப்படாமல் விடப்படும்.

பெயரிடுவது காட்டுவதாகும்#

ஒரு classic நிரல் நூற்றுக்கணக்கான objects-ஐ உருவாக்குகிறது. அது NAME செய்யும் ஒன்றுகள் மட்டுமே Scene Graph-க்குள் நுழையும், SpriteName(id, "player")-உம் அதன் siblings-உம், மற்ற Engine பார்க்கக்கூடிய tree-க்குள் ஒரு object-ஐ வைப்பவை. LightName மற்றும் ParticlesName, ஒரு light-க்கும் ஒரு emitter-க்கும் அதையே செய்கின்றன.

Name what your program creates tutorial இதை விரிவாக நடத்திச் செல்கிறது: அதே scene, ஒருமுறை tree காலியாகவும், ஒருமுறை அதில் மூன்று entries-உடனும்.

Command catalogue#

2,237 commands, 2,550 public overloads, 43 categories. மிகப்பெரியவை:

3D286Studio106File61
Core200Input95Memblock43
Tweening149Input-Raw943D Particles41
3D Physics144Multiplayer91World40
Sprite135Text68Particles38
Platform1112D Physics66Sound37

மேலும் JSON (36), Image (35), Skeleton (34), XML (34), Music (29), Preference (27), Extras (21), HTTP (21), String (21), Math (19), Regular Expression (19), Video (18), Dictionary (17), Benchmarking (15), Compute (14), Date (13), Maths (12), Time (12), StringBuilder (9), Compression (7), Font (8), Error (4), Array (3), Cipher (2), Sort (2).

Studio மற்றும் Compute தான் classic dialect-க்கு Aukimi-இன் சொந்த சேர்க்கைகள்: console commands, object naming, மற்றும் WebGPU pipeline.

முழுமையான command reference, ஒவ்வொரு parameter-உடனும் ஒவ்வொரு overload-உடனும், அவை அனைத்தையும் பட்டியலிடுகிறது, மேலும் அதற்கே உரிய தேடலுடன், இந்த பக்கம் எண்ணும் அதே catalogue-இலிருந்து உருவாக்கப்பட்டது, எனவே அது இதற்குப் பின் தங்க முடியாது. Editor-இன் சொந்த API பேனலும் அந்த catalogue-ஐ படிக்கிறது.

இந்த பக்கம் மொழியை ஆவணப்படுத்துகிறது; அந்தப் பக்கம் commands-ஐ ஆவணப்படுத்துகிறது.

வரம்புகளும் பொதுவான சிக்கல்களும்#

  • ஒரு command-இல் parentheses விருப்பமானவை அல்ல. வெறும் PureBasic வடிவம் (Debug "x") நிராகரிக்கப்படுகிறது, ஏனெனில் அது compile-time guard சார்ந்திருக்கும் variable/command தெளிவின்மையை மீண்டும் திறக்கிறது.
  • ஒரு பயனர் function, அதே பெயரின் catalogued command-ஐ விட வெல்லும், மேலும் ஒரு variable, ஒரு typed declaration-இல், ஒரு assignment-இன் இடதுபுறத்தில், அல்லது ஒரு path-இன் root ஆக, ஒரு command-இன் பெயரை பகிரலாம்.
  • Variables மற்றும் user functions case-insensitive, மேலும் அவற்றின் symbol spaces catalogue-இன் symbol space-இலிருந்து உண்மையிலேயே தனியானவை.
  • Print ஒரு log அல்ல. மேலே பார்க்கவும்; இதுதான் ஒரு console-ஐ நிரப்பும் தவறு.
  • Compute ஏற்றுமதியாகாது. அதை நம்புவதற்கு முன் fallback path-ஐ எழுதுங்கள்.