Máy ảo Java trong Omarine 3.0

Công cụ chính sách với giao diện đồ họa

Java là ngôn ngữ độc lập nền vì chương trình ứng dụng chạy mã byte (bytecode) trên máy ảo Java với mọi kiến trúc máy tính, do đó nó thích hợp trong các hệ thống nhúng.

Như đặc điểm chung của các hệ thống logic, Java gặp vấn đề về tốc độ thực hiện, chương trình Java chạy chậm hơn chương trình C++ – một ngôn ngữ mà nó kế thừa khá nhiều cú pháp. Thêm nữa, Java tiêu tốn nhiều bộ nhớ hơn. Java có bộ thu rác quản lý bộ nhớ tự động. Ưu điểm này cũng đồng thời là nhược điểm khi bộ thu rác được kích hoạt lúc không còn bộ nhớ để cấp cho một đối tượng mới, chương trình bị ngừng trong giây lát (hình dung là chương trình bị giật). Java không thể giải phóng bộ nhớ một cách tường minh.

Có thể thấy, Java là vật liệu quý của công nghiệp 4.0. Tuy nhiên, trí tuệ nhân tạo đối với nó là một thử thách vì chương trình trí tuệ nhân tạo đòi hỏi tính toán sâu và thao tác bộ nhớ động liên tục.

Người ta tìm cách bù đắp nhược điểm của Java, ví dụ điển hình là Android Studio bổ sung C++ vào môi trường phát triển vốn sử dụng Java làm ngôn ngữ chính. Bạn có thể gọi hàm trong thư viện C++ từ mã Java thông qua JNI (Java Native Interface).

Vì tính chất xuyên nền, Java thường được sử dụng ngang qua mạng nên vấn đề an ninh cần được quan tâm. Dữ liệu đi vào hệ thống cần được xác minh. Để tạo cơ sở dữ liệu khóa mật mã (keystore) toàn hệ thống cho Java, bạn cần cài đặt JRE CA-Certificates (JRE Certificate Authority Certificates). Đó là các chứng chỉ dùng cho các dịch vụ xác minh, chứa trong tệp cacerts , đường dẫn đầy đủ là /opt/jdk/jre/lib/security/cacerts. Việc tạo hoặc cập nhật tệp cacerts được thực hiện với hai dòng lệnh như sau:

sudo makeca -f
sudo makeca-java

makeca và makeca-java là hai chương trình được viết riêng bởi Omarine. Makeca tạo và cập nhật các chứng chỉ CA-certificates, là các chứng chỉ của hệ điều hành dùng để xác minh liên lạc qua giao thức bảo mật https. Lệnh makeca -f thực hiện cập nhật chứng chỉ với dữ liệu chứng chỉ hiện hành. Nếu bạn muốn thực hiện sâu hơn, thay đổi các chứng chỉ với dữ liệu mới, bạn có thể xem trang hướng dẫn (man page) của makeca để biết thêm chi tiết.

Ở dòng lệnh thứ hai, makeca-java sẽ tạo tệp cacerts dựa vào các chứng chỉ CA-certificates của hệ điều hành.

Để xem các chứng chỉ, bạn chạy lệnh dưới đây:

keytool -list -keystore /opt/jdk/jre/lib/security/cacerts

Bạn sẽ được yêu cầu vào mật khẩu, mật khẩu mặc định là changeit.

Một chương trình ví dụ

Chương trình ví dụ chủ yếu dùng để minh họa cấu hình môi trường Java. Bạn nào mới làm quen với Java có thể tham khảo chương trình về sử dụng gói, kế thừa, sử dụng giao diện, một số cú pháp trong ngôn ngữ Java, chuyển đổi kiểu tự động, một số phép toán trên bit và sử dụng lớp Arrays. Ngoài ra, chúng ta sẽ tạo tệp jar và chạy nó.

Omarine 3.0 đã được cấu hình để cập nhật CLASSPATH đối với thư mục java_projects trong thư mục nhà, bao gồm cả các thư mục con và các tệp jar của nó. Chương trình ví dụ sẽ đặt trong thư mục helloworld, là thư mục con của thư mục java_projects. Vì vậy chúng ta tạo thư mục cho chương trình, sau đó chuyển tới thư mục đó:

mkdir -p ~/java_projects/helloworld
cd ~/java_projects/helloworld

Chúng ta tạo hai tệp mã nguồn HelloWorld.java và app1.java:

cat > HelloWorld.java << "EOF"

package helloworld;
import java.util.*;

class abc {
        private int m_i;
        abc(int i) {
                m_i = i;
        }
        void display()
        {
                System.out.println(m_i);
        }
}

interface instruments
{
        String what(); 
}

class WindBase implements instruments
{
        public String what()
        {
                return "to be or not to be";
        }
}

class Wind extends WindBase
{
        int[] m_array = {5, 6, 7};
        protected void finalize() throws Throwable 
        {
                // do something
                // ...
                super.finalize();
        }
}

public class HelloWorld {

        public static void main(String[] args) {

                System.out.println("Hello, World");
                System.out.println(1 == 2);

                int i = 5, j = 6;
                int k = i & j;
                System.out.println(k << 1);
                String str = "k, i: ";
                str += k + ", " + i;
                System.out.println(str);

                abc obj = new abc(5);
                obj.display();

                app1 appobj = new app1();
                appobj.display();

                Wind w = new Wind();
                System.out.println(w.what());
                w.m_array[0] = 22;
                System.out.println(w.m_array[0]);

                Number n = 4.5;
                str = n.toString();
                System.out.println(str);

                double[] d = { 65.0, 32.0, 12.0, 5.0 };
                Arrays.sort(d);
                System.out.println(d[1]);
        }
}
EOF

cat > app1.java << "EOF"

package helloworld;

public class app1 {

        public void display() {
                System.out.println("I come from other source file!");
        }
}
EOF

Tệp nguồn app1.java cho biết lớp app1 thuộc gói helloworld, cùng gói với các lớp trong HelloWorld.java.

Trong HelloWorld.java, lệnh import nhập khẩu các lớp trong java.util, lát sau chúng ta sẽ sử dụng lớp Arrays từ đó. Lớp WindBase thi hành giao diện instruments. Lớp Wind kế thừa lớp WindBase, nó viết chồng hàm finalize() để làm công việc bổ sung nào đó khi bộ thu rác dọn dẹp đối tượng.

Chương trình sẽ bắt đầu từ hàm tĩnh main của lớp HelloWorld. Đầu tiên nó in ra “Hello, World”. Dòng tiếp theo in ra giá trị của biểu thức 1 == 2, là false. Biến k (kiểu int) được gán với kết quả của phép và nhị phân của i với j. Sau đó biểu thức biến nguyên (int) k dịch trái 1 bit, được in ra. Tiếp theo là phép cộng hỗn hợp các biến nguyên và xâu kí tự, kết quả tự cộng vào một biến String. Ở đây xảy ra chuyển đổi kiểu từ int sang String. Một đối tượng obj của lớp abc được tạo ra với giá trị khởi tạo là 5. Rồi đối tượng appobj của lớp app1 được tạo ra, lớp này nằm trong tệp nguồn app1.java, khác với tệp nguồn chính. Tiếp theo, đối tượng w của lớp Wind được tạo ra. Dòng lệnh sau đó in ra giá trị hàm what() của lớp cơ sở WindBase, là hàm định nghĩa cho phương pháp what() của giao diện instruments. w có một mảng thành phần kiểu int có 3 phần tử được khởi tạo là 5, 6, 7. Nhưng một lệnh gán đã gán cho phần tử đầu tiên của mảng nhận giá trị là 22. Tiếp theo là biến n có kiểu Number được khởi tạo giá trị là 4.5. Lệnh sau đó chuyển đổi kiểu đối với giá trị của n từ Number sang String với hàm thành phần toString, kết quả gán cho biến str. Cuối cùng là mảng d có kiểu double có 4 phần tử được khởi tạo là 65.0, 32.0, 12.0, 5.0. Lớp Arrays sử dụng hàm tĩnh sort để sắp thứ tự cho mảng d. Kết quả là phần từ thứ hai của mảng là d[1] sẽ có giá trị là 12.0.

Để biên dịch chương trình sang bytecode dưới dạng các tệp class, bạn chạy lệnh sau:

javac app1.java HelloWorld.java

Bây giờ chạy chương trình:

java helloworld.HelloWorld

Kết quả là:

Hello, World
false
8
k, i: 4, 5
5
I come from other source file!
to be or not to be
22
4.5
12.0

Để tạo tệp lưu trữ jar (Java Archive) có tên hello.jar để đóng gói tất cả các tệp class vào đó, bạn thực hiện:

( cd ..; jar cfe hello.jar helloworld.HelloWorld helloworld/*.class )

Chúng ta được tệp hello.jar nằm trong thư mục cha java_projects. Chúng ta có thể chạy trực tiếp tệp jar này như sau:

java -jar ../hello.jar

Các tệp class không còn cần thiết, chúng ta xóa hết chúng:

rm *.class

Bây giờ cập nhật CLASSPATH:

source ~/.bashrc

Lúc này chúng ta có thể chạy chương trình tại bất kỳ vị trí nào trong hệ thống. Để thử, bạn hãy trở về thư mục nhà, rồi chạy lại chương trình:

cd
java helloworld.HelloWorld

Giống như các gói khác, Java trong Omarine 3.0 không phải là gói nhị phân, mà được biên dịch từ mã nguồn, vì vậy luôn có thể được cập nhật phiên bản mới nhất. Phiên bản hiện hành là OpenJDK-1.8.0.141.

Bình luận về bài viết này