อ่าน 8 นาที
กระรอก (ภาษาโปรแกรม)
Squirrel เป็น ภาษาโปรแกรมเชิงวัตถุระดับสูงที่ออกแบบมาให้เป็นภาษาสคริปต์น้ำหนักเบาที่เหมาะสมกับขนาด แบนด์วิดท์หน่วยความจำ และข้อกำหนดแบบเรียลไทม์ของแอปพลิเคชันต่างๆ เช่นวิดีโอเกม...
กระรอก (ภาษาโปรแกรม)
| กระรอก | |
|---|---|
| กระบวนทัศน์ | รูปแบบการเขียนโปรแกรมหลายแบบ : การเขียนสคริปต์ , การเขียน โปรแกรมเชิงคำสั่ง , การเขียนโปรแกรมเชิงฟังก์ชัน , การเขียนโปรแกรมเชิงวัตถุ |
| ออกแบบโดย | อัลแบร์โต เดมิเชลิส |
| ปรากฏครั้งแรก | 6 กันยายน 2546 |
| เวอร์ชันเสถียร | 3.2 [ 1 ] |
| วินัยในการพิมพ์ | พลวัต |
| โอเอส | ข้ามแพลตฟอร์ม |
| ใบอนุญาต | ใบอนุญาต MIT |
| นามสกุลไฟล์ | .นัท |
| เว็บไซต์ | squirrel-lang |
| ได้รับอิทธิพลจาก | |
| C++ , JavaScript , Lua , Python | |
| ได้รับอิทธิพล | |
| MiniD (ปัจจุบันเปลี่ยนชื่อเป็น Croc) | |
Squirrel เป็น ภาษาโปรแกรมเชิงวัตถุระดับสูงที่ออกแบบมาให้เป็นภาษาสคริปต์น้ำหนักเบาที่เหมาะสมกับขนาด แบนด์วิดท์หน่วยความจำ และข้อกำหนดแบบเรียลไทม์ของแอปพลิเคชันต่างๆ เช่นวิดีโอเกม โดยเปิด ตัว เมื่อวันที่ 6 กันยายน 2546
MirthKit ซึ่งเป็นชุดเครื่องมืออย่างง่ายสำหรับการสร้างและเผยแพร่เกม 2 มิติแบบโอเพนซอร์สข้ามแพลตฟอร์ม ใช้ Squirrel เป็นแพลตฟอร์ม[ 2 ] Code::Blocksใช้ Squirrel อย่างกว้างขวางสำหรับการเขียนสคริปต์ และยังใช้ในFinal Fantasy Crystal Chronicles: My Life as a Kingอีก ด้วย [ 3 ] [ 4 ]นอกจากนี้ยังใช้ในLeft 4 Dead 2 , Portal 2 , Team Fortress 2 , Thimbleweed ParkและWar Thunderสำหรับเหตุการณ์ที่เขียนสคริปต์ และในNewDarkซึ่งเป็นการอัปเดตเอนจิ้นที่ไม่เป็นทางการของ Thief 2: The Metal Ageเพื่ออำนวยความสะดวกในการเขียนสคริปต์เหตุการณ์ภารกิจเพิ่มเติมที่ง่ายขึ้น นอกเหนือจากการเขียนสคริปต์C ทั่วไป [ 5 ]
ลักษณะทางภาษา
- การพิมพ์แบบไดนามิก
- คณะผู้แทน
- คลาส , การสืบทอด
- ฟังก์ชันลำดับสูงกว่า
- เครื่องกำเนิดไฟฟ้า
- เธรดร่วมมือ ( โครูทีน )
- การเรียกซ้ำแบบหาง
- การจัดการข้อยกเว้น
- การจัดการหน่วยความจำอัตโนมัติ (ส่วนใหญ่เป็นการนับจำนวนการอ้างอิง พร้อมด้วยตัวเก็บขยะ สำรอง )
- การอ้างอิงที่ไม่แข็งแรง
- ทั้งคอมไพเลอร์และเครื่องเสมือน สามารถทำงานร่วมกันได้ด้วย โค้ดC++ประมาณ 7,000 บรรทัด
- รองรับสตริงแบบกว้างUCS-2 ( ไม่บังคับ)
สถานะการพัฒนา
เวอร์ชัน 2.0 เปิดตัวเมื่อวันที่ 3 เมษายน 2548
เวอร์ชันเสถียรปัจจุบันคือ 3.2 เมื่อวันที่ 10 กุมภาพันธ์ 2022 [ 6 ]
โครงการนี้ได้รับการออกแบบให้คอมไพล์และรันบน Windows (86x, 64x), Linux, Illumos (ทั้ง x86 และ x64), Android, IOS, Mac OS และ FreeBSD [ 7 ]
ได้รับการทดสอบกับคอมไพเลอร์ต่อไปนี้:
- MS Visual C++ เวอร์ชัน 6.0, 7.0, 7.1, 8.0, 9.0 และ 10.0 (x86 และ x64)
- MinGW gcc 3.2 (mingw special 20020817-1)
- ไซก์วิน gcc 3.2
- ลินุกซ์ gcc 3.x
- ลินุกซ์ gcc
- xอิลลูโมส
- xXCode 4
ค่าและชนิดข้อมูล โครงสร้างทางศัพท์
แม้ว่า Squirrel จะเป็นภาษาที่มีการกำหนดประเภทแบบไดนามิก และตัวแปรไม่มีประเภท แต่การดำเนินการต่างๆ อาจตีความตัวแปรว่ามีประเภทอยู่ ประเภทพื้นฐานของ Squirrel ได้แก่ จำนวนเต็ม, ทศนิยม, สตริง, ค่าว่าง, ตาราง, อาร์เรย์, ฟังก์ชัน, ตัวสร้าง, คลาส, อินสแตนซ์, บูลีน, เธรด และข้อมูลผู้ใช้[ 8 ]
จำนวนเต็ม:
จำนวนเต็มแสดงถึงจำนวนที่มีเครื่องหมาย 32 บิต (หรือดีกว่า): [ 9 ]
ค่าท้องถิ่น a = 123 //เลขฐานสิบ ค่า b ในเครื่อง = 0x0012 //เลขฐานสิบหก local c = 075 //เลขฐานแปด [ 10 ]
ลอย:
ค่า float หมายถึงจำนวนทศนิยม 32 บิต (หรือดีกว่านั้น)
ค่าท้องถิ่น a=1.0 ค่าท้องถิ่น b=0.234
สตริง:
สตริงเป็นลำดับของอักขระที่ไม่สามารถเปลี่ยนแปลงได้ หากต้องการแก้ไขสตริง จำเป็นต้องสร้างสตริงใหม่[ 11 ]
สตริงในภาษา Squirrel คล้ายกับสตริงในภาษา C หรือ C++ โดยจะถูกคั่นด้วยเครื่องหมายอัญประกาศ ( ") และสามารถมีลำดับอักขระหลีก ( \t, \a, \b, \n, \r, \v, \f, \\, \", \', \0, \x<hh>, \u<hhhh>และ\U<hhhhhhhh>) ได้
ข้อความตัวอักษรแบบตรงตัวจะไม่ตีความลำดับการหลีกเลี่ยง (escape sequence) โดยจะเริ่มต้น@"และสิ้นสุดด้วยเครื่องหมายอัญประกาศที่ตรงกัน นอกจากนี้ ข้อความตัวอักษรแบบตรงตัวยังสามารถขยายข้ามการขึ้นบรรทัดใหม่ได้ หากเป็นเช่นนั้น จะรวมอักขระช่องว่างใดๆ ที่อยู่ระหว่างเครื่องหมายอัญประกาศด้วย
local a = "ฉันเป็นสตริงที่ยอดเยี่ยม\n " // มีอักขระขึ้นบรรทัดใหม่ที่ท้ายสตริง local x = @"ฉันเป็นสตริงที่ตรงตามตัวอักษรทุกประการ\n " // \n เป็นอักขระตามตัวอักษร คล้ายกับ " \\ n" ในสตริงทั่วไป
อย่างไรก็ตาม เครื่องหมายอัญประกาศคู่ภายในสตริงที่ตรงตามต้นฉบับจะถูกแทนที่ด้วยเครื่องหมายอัญประกาศเดี่ยว: [ 6 ]
บรรทัดหลายบรรทัดท้องถิ่น = @" นี่คือสตริงหลายบรรทัด มันจะ "ฝัง" บรรทัดใหม่ทั้งหมด ตัวละคร
โมฆะ:
ค่า null เป็นค่าพื้นฐานที่แสดงถึงค่าว่าง ค่าที่ไม่มีอยู่จริง หรือการอ้างอิงที่ไม่มีอยู่จริง ชนิดข้อมูล Null มีค่าเพียงค่าเดียวเท่านั้น คือค่า null
โลคอล a = null
บูล
Bool เป็นชนิดข้อมูลแบบสองค่า (บูลีน) ค่าคงที่ของมันคือtrueและfalseค่าบูลีนแสดงถึงความถูกต้องของเงื่อนไข (บอกว่าเงื่อนไขเป็นจริงหรือเท็จ): [ 12 ]
local a = true;
โต๊ะ
ตารางเป็นคอนเทนเนอร์แบบเชื่อมโยงที่ถูกนำมาใช้ในรูปแบบของคู่คีย์/ค่าที่เรียกว่าสล็อต:
t ท้องถิ่น = {} การทดสอบในพื้นที่ = { a=10 b = ฟังก์ชัน(a) { ส่งคืนค่า a + 1; } } อาร์เรย์
อาร์เรย์เป็นลำดับของวัตถุอย่างง่าย ขนาดของอาร์เรย์เป็นแบบไดนามิก และดัชนีจะเริ่มต้นจาก 0 เสมอ: [ 13 ]
local a = ["ฉันเป็น","อาร์เรย์"] โลคอล b = [null] b[0] = a[2];
การทำงาน
ฟังก์ชันต่างๆ คล้ายคลึงกับฟังก์ชันในภาษาโปรแกรมที่คล้าย C อื่นๆ โดยมีข้อแตกต่างที่สำคัญบางประการ (ดูด้านล่าง)
ระดับ
คลาสเป็นคอนเทนเนอร์แบบเชื่อมโยงที่ถูกนำมาใช้ในรูปแบบของชุดคู่คีย์/ค่า คลาสถูกสร้างขึ้นผ่าน 'นิพจน์คลาส' หรือ 'คำสั่งคลาส' สมาชิกของคลาสสามารถสืบทอดมาจากวัตถุคลาสอื่นได้ในขณะสร้าง หลังจากสร้างแล้ว สามารถเพิ่มสมาชิกได้จนกว่าจะมีการสร้างอินสแตนซ์ของคลาส[ 14 ]
อินสแตนซ์คลาส
อินสแตนซ์ของคลาสถูกสร้างขึ้นโดยการเรียกอ็อบเจ็กต์ของคลาสอินสแตนซ์ เช่นเดียวกับตาราง จะถูกนำไปใช้เป็นชุดของคู่คีย์/ค่า สมาชิกของอินสแตนซ์ไม่สามารถเพิ่มหรือลบได้แบบไดนามิก อย่างไรก็ตาม ค่าของสมาชิกสามารถเปลี่ยนแปลงได้[ 15 ]
เครื่องกำเนิดไฟฟ้า
ตัวสร้างคือฟังก์ชันที่สามารถระงับได้ด้วยคำสั่ง 'yield' และกลับมาทำงานต่อได้ในภายหลัง (ดู ตัวสร้าง) [ 13 ]
ข้อมูลผู้ใช้
อ็อบเจ็กต์ Userdata คือกลุ่มข้อมูลในหน่วยความจำหรือตัวชี้ที่กำหนดโดยแอปพลิเคชันโฮสต์ แต่จัดเก็บไว้ในตัวแปรของ Squirrel (ดู Userdata และ UserPointers)
ด้าย
เธรดคือวัตถุที่แสดงถึงกระบวนการทำงานร่วมกัน หรือที่เรียกว่า โครูทีน
การอ้างอิงที่อ่อนแอ
การอ้างอิงแบบอ่อน (Weak References) คือวัตถุที่ชี้ไปยังวัตถุอื่น (ที่ไม่ใช่สเกลาร์) แต่ไม่มีการอ้างอิงแบบแข็ง (strong reference) ไปยังวัตถุนั้น (ดู การอ้างอิงแบบอ่อน) [ 12 ]
คำต่อไปนี้สงวนไว้และไม่สามารถใช้เป็นตัวระบุได้: [ 12 ]
| ฐาน | หยุดพัก | กรณี | จับ | ระดับ | โคลน |
| ดำเนินการต่อ | คอนสต | ค่าเริ่มต้น | ลบ | อื่น | enum |
| ขยาย | สำหรับ | สำหรับแต่ละ | การทำงาน | ถ้า | ใน |
| ท้องถิ่น | โมฆะ | ประวัติย่อ | กลับ | สวิตช์ | นี้ |
| โยน | พยายาม | ประเภทของ | ในขณะที่ | ผลผลิต | ผู้สร้าง |
| ตัวอย่างของ | จริง | เท็จ | คงที่ | __เส้น__ | __ไฟล์__ |
| เรียกดิบ |
ตัวระบุเริ่มต้นด้วยตัวอักษรหรือสัญลักษณ์ '_' ตามด้วยตัวอักษร '_' หรือตัวเลขจำนวนเท่าใดก็ได้ ([0-9]) ภาษา Squirrel เป็นภาษาที่คำนึงถึงตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก หมายความว่าตัวอักษรเดียวกันที่เป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ถือเป็นตัวอักษรที่แตกต่างกัน ตัวอย่างเช่น “foo”, “Foo” และ “fOo” ถือเป็นตัวระบุที่แตกต่างกัน 3 ตัว[ 12 ]
โปรแกรม Squirrel รองรับตัวดำเนินการต่อไปนี้:
! | != | || | == | && | >= | <= | > |
<=> | + | += | - | -= | / | /= | * |
*= | % | %= | ++ | -- | <- | = | & |
^ | | | ~ | >> | << | >>> |
สำหรับโทเค็นสำคัญ:
{ | } | [ | ] | . | : |
:: | ' | ; | " | @" |
ข้อความแสดงความคิดเห็นคือข้อความที่คอมไพเลอร์ไม่สนใจ แต่มีประโยชน์สำหรับโปรแกรมเมอร์ โดยปกติแล้วข้อความแสดงความคิดเห็นจะใช้เพื่อฝังคำอธิบายประกอบในโค้ด คอมไพเลอร์จะถือว่าข้อความเหล่านั้นเป็นช่องว่าง[ 12 ]
คอมเมนต์สามารถประกอบด้วย/*อักขระ (สแลช, แอสเตร็จ) ตามด้วยลำดับอักขระใดๆ (รวมถึงขึ้นบรรทัดใหม่) ตามด้วย*/อักขระ ไวยากรณ์นี้เหมือนกับ ANSI C: [ 12 ]
/* any text between will be ignored */
ฟังก์ชัน Squirrel รองรับตัวเลขจำนวนเต็ม ตัวเลขทศนิยม และสตริงข้อความ
34 | จำนวนเต็ม (ฐาน 10) |
0xFF00A120 | จำนวนเต็ม (ฐาน 16) |
0753 | จำนวนเต็ม (ฐาน 8) |
'a' | จำนวนเต็ม |
1.52 | เลขทศนิยม |
1.e2 | เลขทศนิยม |
1.e-2 | เลขทศนิยม |
"I'm a string" | สตริง |
@"I'm a verbatim string" | สตริง |
@" I'm amultiline verbatim string" | สตริง |
ไวยากรณ์
ไวยากรณ์ของ squirrel คล้ายกับ C/C++/Java เป็นต้น... แต่ภาษานี้มีลักษณะไดนามิกมากเหมือน Python/Lua เป็นต้น... [ 12 ]
แฟกทอเรียลในกระรอก
ฟังก์ชันภายในfactorial ( x ) // เรียกใช้ฟังก์ชัน factorial จากนั้นเรียกใช้ค่า x { ถ้า( x <= 1 ) { // ถ้า x น้อยกว่า 1 ให้คืนค่า1 ; // จากนั้นโค้ดจะคืนค่า 1 } มิฉะนั้น{ // ถ้าวิธีนี้ไม่ได้ผลให้คืนค่าx * factorial ( x - 1 ); // จากนั้นโค้ดจะคืนค่า x คูณ factorial(x-1) } }เครื่องกำเนิดไฟฟ้า
ฟังก์ชันnot_a_random_number_generator ( max ) { local last = 42 ; local IM = 139968 ; local IA = 3877 ; local IC = 29573 ; for (;;) { // วนลูปไปเรื่อยๆyield ( max * ( last = ( last * IA + IC ) % IM ) / IM ); } }local randtor = not_a_random_number_generator ( 100 );for ( local i = 0 ; i < 10 ; i += 1 ) print ( ">" + resume randtor + "\n" );คลาสและการสืบทอด
คลาสBaseVector { ตัวสร้าง(...) { ถ้า( vargv.len () >= 3 ) { x = vargv [ 0 ] ; y = vargv [ 1 ] ; z = vargv [ 2 ]; } } x = 0 ; y = 0 ; z = 0 ; }คลาสVector3 สืบทอดมาจาก BaseVector { ฟังก์ชัน_add ( other ) { ถ้า( other instanceof :: Vector3 ) ให้คืนค่า:: Vector3 ( x + other.x , y + other.y , z + other.z ) ; มิฉะนั้นให้โยนข้อความ"พารามิเตอร์ไม่ถูกต้อง" ; } ฟังก์ชันPrint ( ) { :: print ( x + ""," + y + " "," + z + " \n " ) ; } }local v0 = Vector3 ( 1 , 2 , 3 ) local v1 = Vector3 ( 11 , 12 , 13 ) local v2 = v0 + v1 ; v2 . Print ();แอปพลิเคชัน
แอปพลิเคชันที่ใช้ Squirrel
- Code::Blocksสภาพแวดล้อมการพัฒนาแบบบูรณาการ
- เอ็นดูโร่/เอ็กซ์ เซิร์ฟเวอร์แอปพลิเคชันคลัสเตอร์
- Electric Imp แพลตฟอร์ม IoT แบบครบวงจร[ 16 ]
เกมที่ใช้กระรอก
- ฝูงเอเลี่ยน[ 17 ]
- ความขัดแย้งของดอกไม้ทั่วไป[ 18 ]
- เอเพ็กซ์ เลเจนด์ส
- พี่น้องนักรบ
- การแพร่ระบาด[ 17 ]
- Counter Strike: Global Offensive [ 17 ]
- CRSED: FOAD
- ไฟนอลแฟนตาซี คริสตัล โครนิเคิลส์: ชีวิตของฉันในฐานะราชา[ 3 ]
- Gothic Online [ 19 ]ม็อดสำหรับGothic II
- GTA IV 's IV-MP [ 20 ]
- Left 4 Dead 2 [ 17 ]
- เสรีภาพปลดปล่อย[ 21 ]
- M2-MultiplayerของMafia II [ 22 ]
- เลือดละลาย: ประเภทลูมิน่า[ 23 ]
- รุ่งอรุณนิวเคลียร์[ 17 ]
- OpenTTD [ 24 ]
- พอร์ทัล 2 [ 17 ]
- โลหะร้อนของTom Clancy's Rainbow Six Siege [ 25 ]
- นักรบเงา
- Simutrans [ 26 ]
- Sonic Unleashed (PS2/Wii) [ 27 ]
- ซูเปอร์ทักซ์
- ทีมฟอร์เทรส 2 [ 28 ]
- สวนสาธารณะทิมเบิลวีด[ 29 ]
- Thief II (การอัปเดตเอนจิ้น NewDark อย่างไม่เป็นทางการ) [ 30 ]
- Titanfall [ 17 ]
- Vice City Multiplayer [ 31 ]ม็อดสำหรับGrand Theft Auto: Vice City [ 32 ]
- ภายใต้กลางคืนในการเกิด[ 33 ]
- วอร์ธันเดอร์
- Zero no Tsukaima - Maigo no Period to Ikusen no Symphony (PS2)
- Zero no Tsukaima - Muma ga Tsumugu Yokaze no Nocturne (PS2)
- Zero no Tsukaima - Shou-akuma ถึง Harukaze no Concerto (PS2)
ประวัติศาสตร์
ภาษานี้ถูกเผยแพร่สู่สาธารณะในปี 2546 ภายใต้ใบอนุญาต zlib/libpng [ 34 ] ใน เดือนพฤศจิกายน 2553 ใบอนุญาตถูกเปลี่ยนเป็นใบอนุญาต MITเพื่อให้สามารถโฮสต์โครงการบนGoogle Codeได้[ 35 ] [ 36 ] พัฒนาและดูแลโดย Alberto Demichelis