7 คะแนน โดย GN⁺ 2024-12-20 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • แม้ Java จะเป็นที่รู้กันว่าเหมาะกับโปรเจกต์ขนาดใหญ่และระยะยาว แต่ก็สามารถเป็นเครื่องมือที่ยอดเยี่ยมสำหรับ งานเล็ก ๆ ได้เช่นกัน
  • การตรวจสอบชนิดแบบสแตติก และ การรองรับเครื่องมือที่ยอดเยี่ยม เป็นข้อได้เปรียบสำคัญแม้ในงานขนาดเล็ก
  • การปรับปรุงภาษาล่าสุดทำให้ Java ใช้งานได้มีประโยชน์ยิ่งขึ้น

รันได้โดยไม่ต้องคอมไพล์

  • ด้วย JEP 330 และ JEP 458 ทำให้สามารถรันไฟล์ซอร์ส Java ได้โดยตรง:
    java RandomFiles.java 10 /home/cay/data  
    
  • ทุกครั้งที่รันจะมีการคอมไพล์ให้อัตโนมัติ จึงเหมาะกับการพัฒนาและทดสอบ
  • สามารถใช้ Graal เพื่อแปลงเป็นไฟล์รันแบบเนทีฟได้ แต่ในกรณีส่วนใหญ่ความต่างด้านประสิทธิภาพแทบไม่มีนัยสำคัญ

ไวยากรณ์ที่กระชับ: เมธอด main แบบอินสแตนซ์และคลาสโดยนัย

  • JEP 477: ทำให้การเขียนโปรแกรมขนาดเล็กและสคริปต์ง่ายขึ้น
  • ตัดไวยากรณ์ที่ยุ่งยากแบบเดิม (public static void main) ออกไป:
var someVariable = initialValue;  
String helper(int param) { ... }  
void main(String[] args) {  
    ...  
}  
  • มีการ import โมดูล java.base ให้อัตโนมัติ เพิ่มความสะดวก
  • เมธอด println, print, readln ก็ถูก import ให้อัตโนมัติเช่นกัน

Records และ Enums

  • Records: ใช้แทนดิกชันนารีของ Python สำหรับการแสดงข้อมูลแบบมีโครงสร้าง
record Window(int id, int desktop, int x, int y, int width, int height, String title) {}  
  • Enums: การแสดงค่า enum ที่เข้าใจได้ตรงไปตรงมามากกว่า Python
enum Direction { NORTH, EAST, SOUTH, WEST };  

ฟีเจอร์ภาษาและ API ที่มีประโยชน์

  • การใช้ var: ทำให้ใช้ตัวแปรในสคริปต์ได้โดยไม่ต้องประกาศชนิด
  • static import: ช่วยให้การคำนวณทางคณิตศาสตร์กระชับขึ้น
import static java.lang.Math.*;  
var diagonal = sqrt(pow(width, 2) + pow(height, 2));  
  • text block: ช่วยเก็บโค้ดและข้อมูลไว้ด้วยกันพร้อมเพิ่มความอ่านง่าย
  • มีไลบรารีที่ทรงพลังสำหรับสตริง, regular expression, collection และวันที่/เวลา
  • การอ่านไฟล์:
var content = Files.readString(Path.of(filename));  
  • การรันโปรเซสภายนอก:
String run(String... cmd) throws Exception {  
    var process = new ProcessBuilder(cmd).redirectErrorStream(true).start();  
    process.waitFor();  
    return new String(process.getInputStream().readAllBytes());  
}  

การจัดการ dependency และ JBang

  • JBang: สามารถเพิ่ม dependency ของ Maven ลงในไฟล์ซอร์สได้โดยตรง
//DEPS org.eclipse.angus:jakarta.mail:2.0.3  
  • จากนั้นก็รันได้แบบนี้
jbang MailMerge.java  
  • แปลงสคริปต์ให้เป็นไฟล์รันได้:
///usr/bin/env jbang "$0" "$@" ; exit $?  

สภาพแวดล้อมแบบโน้ตบุ๊ก

ข้อดีของโน้ตบุ๊ก

  • การเขียนโปรแกรมเชิงสำรวจ: เหมาะกับการจัดการข้อมูลและการรันโค้ดแบบครั้งเดียวหรือขนาดเล็ก
  • โครงสร้างแบบเซลล์โค้ดและเซลล์ข้อความ:
    • ผลลัพธ์จากการรันเซลล์โค้ดสามารถแสดงเป็นข้อความ ตาราง รูปภาพ เสียง หรือวิดีโอได้
    • สามารถลองผิดลองถูกซ้ำ ๆ จนได้ผลลัพธ์ที่ต้องการ แล้วค่อยเพิ่มคำอธิบายประกอบ
  • ดีกว่า JShell:
    • การทำงานเป็นหน่วยเซลล์ทำได้ง่ายกว่า
    • มองเห็นตารางข้อมูลและกราฟได้ในเชิงภาพ
    • บันทึกและแชร์ได้ง่าย

Jupyter และ Java Notebook

  • Jupyter Notebook: เป็นเครื่องมือที่นักวิทยาศาสตร์ข้อมูลสาย Python ใช้กันอย่างแพร่หลาย
    • รันได้ทั้งบนเครื่องและบนคลาวด์ (เช่น Google Colab)
  • เทคโนโลยีของ Jupyter ไม่ขึ้นกับภาษา:
    • ติดตั้งเคอร์เนลสำหรับหลายภาษาได้ (เช่น IJava, JJava, Ganymede, Rapaio)
    • Jupyter Java Anywhere: ใช้ JBang เพื่อทำให้การติดตั้ง Java kernel ง่ายขึ้น
  • ข้อจำกัด:
    • แต่ละเคอร์เนลมีวิธีจัดการ dependency และการแสดงผลลัพธ์ที่ไม่ใช่ข้อความต่างกัน
    • เคอร์เนล IJava มีปัญหาบางอย่างในการแก้ไข dependency
    • Oracle หรือผู้ให้บริการรายใหญ่ควรมีบริการ Colab สำหรับ Java โดยเฉพาะ

การประมวลผลข้อมูลและการทำภาพข้อมูลใน Java

  • Python มีไลบรารีอย่าง NumPy และ Matplotlib ที่ทำให้การประมวลผลข้อมูลเป็นเรื่องง่าย
    • ในฝั่ง Java ยังขาดระบบนิเวศที่ใกล้เคียงกันอยู่
  • tablesaw:
    • ใช้เป็นทางเลือกแทน NumPy ได้
    • รองรับการทำภาพข้อมูลโดยใช้แพ็กเกจ JavaScript ของ Plot.ly

โปรเจกต์ JTaccuino

  • JTaccuino:
    • เป็น Java notebook ที่ Sven Reimers กำลังพัฒนา
    • มี UI ที่ใช้งานง่ายบนพื้นฐาน JavaFX
    • ใช้ JShell เป็นแบ็กเอนด์
    • ยังอยู่ในระยะเริ่มต้น แต่มีศักยภาพในการพัฒนาสูง

Kotlin Notebook

  • มี Kotlin Notebook IntelliJ plugin สำหรับนักพัฒนา Kotlin

บทสรุป

  • หากใช้เครื่องมือได้เหมาะสม Java เป็นตัวเลือกที่มีประสิทธิภาพมากสำหรับการจัดการงานเล็ก ๆ
  • JBang ทำให้การเขียนสคริปต์ที่ใช้ไลบรารีของบุคคลที่สามง่ายขึ้น
  • Java มีศักยภาพสำหรับการเขียนโปรแกรมเชิงสำรวจเช่นกัน แต่ยังต้องการการปรับปรุงด้านการรองรับเครื่องมือ

2 ความคิดเห็น

 
aer0700 2024-12-24

เวลาใช้ทำงานง่ายๆ แบบสคริปต์ ภาษาแบบไดนามิกไทป์มันสะดวกมากจริงๆ...
แน่นอนว่าถ้าพ้นช่วงทำต้นแบบไปแล้วก็คงใช้ภาษาสแตติกครับ

 
GN⁺ 2024-12-20
ความเห็นจาก Hacker News
  • พบวิธีรันโปรแกรม "Hello World" ได้อย่างง่ายมาก โค้ดซับซ้อนแบบเดิมถูกทำให้สั้นลงมาก

    • พอใช้ Java 21 ก็รู้สึกได้ว่าโค้ดซับซ้อนน้อยลง โดยเฉพาะ var และ record ที่มีประโยชน์มาก
    • กำลังใช้รูปแบบ java myfile.java เพื่อแก้ปัญหา AoC และฟีเจอร์ที่ import java.base ให้อัตโนมัติก็มีประโยชน์
  • ใช้ Java, JavaScript และ TypeScript แต่สำหรับงานสคริปต์ใช้ .NET กับ LINQPad ซึ่ง LINQ ช่วยให้การเขียนสคริปต์ง่ายขึ้น

    • ชื่นชม Python แต่รู้สึกว่าอ่านยาก และไม่คุ้นกับไวยากรณ์ของ PHP กับ Python
  • ตอนพัฒนา JDK 1.1 ยังไม่มีฉันทามติเกี่ยวกับ test suite โดย Mark Reinhold ปฏิเสธการทดสอบในรูปแบบ JCK และเขียน test harness แบบง่ายขึ้นมา

    • สำหรับโปรแกรมเมอร์ Java ฟีเจอร์ที่มีประโยชน์ที่สุดคือ debugger hot reload ซึ่งทำให้การเขียนโค้ดง่ายขึ้นมาก
  • ภาษาโปรแกรมพัฒนาไปตามกาลเวลา ตอนนี้ Java เร็วขึ้นแล้ว และมีทั้ง generics กับความสามารถในการอนุมานชนิดแบบง่าย ๆ เพิ่มเข้ามา ทำให้โค้ด boilerplate ลดลง

  • PHP ก็เป็นภาษาที่มีประโยชน์เช่นกัน มีติดตั้งมาให้ล่วงหน้าในระบบ *nix จำนวนมาก และมี standard library ที่เหมาะกับการจัดการไฟล์, JSON และ network request

  • ใน Java 23 มี 3 เมธอดจาก java.io.IO ที่ถูก import ให้อัตโนมัติ นี่เป็น type ใหม่ที่ใช้งานได้ด้วยตัวเลือก --enable-preview

  • เรียนรู้การเขียน "Java ไฟล์เดียว" จาก Hacker Rank และมันมีประโยชน์สำหรับการแก้โจทย์ whiteboard coding

  • ถ้าอยากรู้เหตุผลของ main method แบบง่าย ๆ ก็ควรไปดู JEP 495 ซึ่งมีกำหนดจะรวมอยู่ใน JDK 24

  • ใช้ Java กับทุกงานสคริปต์และงานเขียนโค้ดมานานกว่า 5 ปีในบริษัท และพอใจกับการพัฒนาอย่างต่อเนื่องของ Java