Scala: อะไรที่ Scala เป็น

scala เป็นภาษาที่เริ่มต้นโดย Martin Odersky คนเขียน compiler ให้ java (ไอ้ที่เราพิพม์กัน javac นั่นแหละครับ)

เล่าแค่นี้ ถ้าเป็นเจ้านายเก่าผมเค้าจะเรียกว่า เจ้าพ่อมาทำเอง

แปลว่า ประสบการณ์ของคนเริ่มทำให้ลดการลองผิดลองถูกได้เยอะ

Scala มาจากคำว่า Scalability ทีแปลเป็นไทยว่า “ขยายขีดความสามารถ”

ก็แปลว่า ตัวภาษาสามารถขยายตัวมันเองได้

ถ้าจะเอาให้ชัด Martin เขียนไว้ในหนังสือ “Programming in Scala” ว่า

Scala -> “A language that grows on you” หรือแปลเป็นไทยว่า “ภาษาที่เติบโตด้วยคุณ”

ซึ่งเราสามารถ พัฒนา library เพิ่มให้ Scala ได้ โดยที่ผู้ใช้ยังรู้สึกว่ามันเป็น native library ของ Scala

และเช่นเคยครับ อ่าน Java Banana (ซึ่งขณะนี้กลายเป็น Scala Banana ไปแล้ว)

ก็จะได้หลักคิดของคนที่ออกแบบภาษานี้

(โดยผมเอามาจากหนังสือ “Programming in Scala” ของ Martin Odersky เช่นเคย)

สิ่งที่ Scala เป็น

Scala run บน JVM เหมือน Java โดย

Code Scala — [Scala Compiler] –> Byte Code —[Java Virtual Machine]—> Program

นี่แปลว่า anything จิงกาเบลที่เป็น library ของ java นั้น Scala เรียกได้หมดโดย native และ “ไม่ต้อง” มี wrapper class

Scala เป็น Object-Oriented

Object-Oriented คือ “โครงสร้าง” ในการขังรวม “ข้อมูล” (field) ที่เกียวข้องด้วย “พฤติกรรม” (method) เพื่อเป็น “แนวทางในการพัฒนา โปรแกรมให้ยืนยาว”

โดย Scala เป็น Object-Oriented อย่างบริสุทธิ์ ไม่มี primitive type ให้ใช้แบบ Java นะจร๊ะ (Java มี primitive 8 types -> int, short, long, bytes,boolean, float, double, char)

แต่เวลา compile นั้น compiler จะฉลาดและสำนึกได้เองว่า ถ้าไม่ได้ใช้คุณสมบัติอะไรของ Object จะแอบ compile Object ที่เข้า type ดังกล่าวให้เป็น primitive ของ Java เอง ดังนั้นเรื่อง performance จึงมีการ optimize โดย compiler

Screen Shot 2016-04-17 at 7.10.05 AM

Scala เป็น functional

คำว่า Scala เป็น functional คือ Scala เขียนโปรแกรมแบบ functional programming paradigm ซึ่งจะมีแค่ matching กับ rewrite เหมือนเราแก้สมการสมัยเรียนประถมนั่นแหละ

เรื่อง functional programming นี่เป็นอีก paradigm เลย ใครเขียนแบบ imperative (imperative แปลง่ายๆว่า เขียน java, C, C++, .NET, JavaScript หรืออะไรๆที่ภาษา Programming ปัจจุบันเป็น) มา อาจจะโลกหมุนหน่อย ถ้ามาเจอ functional (ผมหมุนไป 2-3 วัน มึนเขร้)

อย่างนึงที่อยากบอก Scala มีการ model แบบ Object-Oriented แต่ให้ Programming แบบ Functional ตามวัตถุประสงค์ของผู้ออกแบบภาษา

แต่ก็ยังอนุญาติให้เขียนแบบ imperative ได้

ตรงนี้ต้องเข้าใจก่อนนะ Object-Oriented ไม่เท่ากับ Imperative

เพราะ Object-Oreinted แค่ขังรวม Field กับ Method ที่เป็นของสิ่งเดียวกันไว้ร่วมกัน แค่นั้น

แต่ไม่จำเป็นต้องเขียนโปรแกรมมีการประกาศตัวแปลแบบ Java

สรุป “อะไรที่ Scala เป็นคือ การ model element ของโปรแกรมเป็น Object-Oriented และเขียน Program ด้วย Functional Programming Paradigm”

ทำไมต้อง Scala?

Scala is compatible

โดย compatible กับ Java library ซึ่งเป็นตัวที่ทำให้ภาษา Java ยืนยง

ถ้าใครเคยคุยกับผม ผมชอบเล่าตลกร้ายให้ฟังว่า Java ไม่ได้แข็งแกร่งเพราะตัวภาษาอย่างเดียว แต่ที่แข็งแกร่งสุดๆ เพราะ interoperability หรือการเชื่อมต่อกับระบบ Legacy อื่นๆ (เอาง่ายๆ Service Bus หลายๆตัวที่เห็น ก็เป็น Java)

เพราะมาเฟียอย่าง Oracle, IBM หรือ SAP ต่างให้การหนุนหลัง Java และทำ library สำหรับต่อเข้ากับ Legacy ของตนเอง (ซึ่งมาเฟียพวกนี้ เป็นโคตรพ่อโคตรแม่ ที่ทำให้เกิด Popreitary)

Scala is concise

ภาษา Scala จะเน้นความประชับในการเขียน ไม่เว่นเว้อแบบ Java เช่นประกาศ class ก็ไม่ต้องเขียน getter, setter เดี๋ยว compiler มันจัดการให้เอง

ดังนั้น การเขียน Scala โดยทั่วไปจะ code น้อยกว่าของ java ด้วยความกระชับในตัวภาษา

(นี่ยังไม่รวมว่า Functional Programming Paradigm เขียนได้กระชับกว่า Imperative Programming Paradigm นะ)

Scala is high-level

ภาษา Scala เป็นภาษาที่พยายามลด complexity ใน code ที่ไม่จำเป็น ดังนั้นการทำงานหลายอย่าง เราเขียนแค่ว่า “อยากทำอะไร” แล้วเดี๋ยวตัว library จะจัดการเรื่อง “ทำอย่างไร” ให้เอง

เช่น เราอยากวน loop for เพื่อหาว่าตัวอักษรตัวใดของ string ตัวนี้ที่เป็นตัวพิมพ์ใหญ่

ถ้าเป็น java เราต้องเว่นเว้อเขียน loopแล้วค่อยๆ charAt ทีละตัว อย่างน้อยก็ 6-7 บรรทัด

แต่ถ้าเป็น scala เราจะเขียนแค่บรรทัดเดียว ดังนี้

val upperCase = stringData.exists(_.isUpperCase)

บรรทัดเดียวจบ

จะเห็นว่า scala เราแค่ define การทำงานแค่ high-level แล้วตัว library (ซึ่งอาจจะเป็นของภาษาหรือเราเขียนขึ้นเอง หรือเป็นของคนอื่นเขียน เพราะ scala จะโตตามคนเขียน อย่างที่บอกไปด้านบน) จะเป็นตัวจัดการ “how” หรือ “ทำอย่างไร” ให้นั่นเอง

Scala เป็น static type

แปลว่า ถ้าประกาศตัวแปลเป็น type อะไรแล้ว ก็จะเป็น type นั้นตลอดๆ ไม่มีการเปลี่ยน type เช่น Int ไม่เป็น String แต่ Scala เป็น Object-Oriented ดังนั้น จึงมีการทำ polymorphism ได้ ก็แปลว่า เราเอา type แม่ มาชี้หา type ลูกได้ นั่นเอง

แต่จะสังเกตุว่าภาษา Scala ประกาศ type แล้วไม่ต้องเอาชื่อ type ขึ้นก่อนแบบ java เช่น

// อันนี้ Java

String a = “Hello”;

int b = 3;

//อันนี้ Scala

val a = “Hello”

val b = 3

จะเห็นว่า Scala จะใช้แค่คำว่า “val” ประกาศตัวแปร (จริงๆมี val กับ var แต่ไว้ค่อยพูดตอนหลัง) โดยไม่มี type ตอนประกาศ เพราะ compiler จะฉลาดและเลือก type ที่เหมาะสมให้เอง

เช่น a จะเป็น type String เพราะตามด้วย String ส่วน b จะเป็น int เพราะตามด้วย int

แต่เราก็สามารถ ข่มขืน Scala โดยการยัด type ได้เช่น

val a: String = “Hello”

การทำ “: String” คือการข่มขืน  Scala โดยการยัด type ให้

วันนี้เล่าแค่นี้ ให้จบบทที่ 1 ใน Programming in Scala ของ Martin

แล้ววันอื่นค่อยมาแปลบทต่อไป…

เค้าบอกว่าที่ Scala ไม่ spread เพราะ doc อ่านยาก ดังนั้น JavaBanana (ซึ่งตอนนี้คือ ScalaBanana) เกิดมาเพื่อแก้ปัญหานี้ และเขียนเป็นภาษาไทยด้วย หึหึ

สวัสดี

 

 

 

 

About champillon

Enterprise Opensource Implementer
This entry was posted in Scala and tagged . Bookmark the permalink.

Leave a comment