ลองเล่น Go
ไม่ได้เขียนอะไรใหม่ๆ ที่นี่มาเกือบครึ่งปี เพราะงานยุ่ง แล้วก็ยังเสพติด twitter และ facebook งอมแงมอีกต่างหาก วันนี้มีเวลาว่าง (จริงๆ ก็ไม่ว่างหรอก แต่ขี้เกียจทำงานที่ควรจะทำ) เลยเอา Go Programming Language ที่พัฒนาโดย Google มาลองเล่นดู เนื่องจากผมใช้ Mac OS X ซึ่งเป็นแพลตฟอร์มที่สนับสนุนอยู่แล้ว ก็เลยติดตั้งไม่ยาก แค่มี XCode อยู่ แล้วลง mercurial เพิ่ม ก็สามารถโหลดซอร์สโค้ดคอมไพเลอร์ของ Go มาคอมไพล์เองได้เลย ใช้เวลาคอมไพล์ตัวคอมไพเลอร์สั้นมาก แป๊บเดียวเสร็จ ประทับใจพอสมควร
จากนั้นก็เลยลองเขียนโปรแกรมแบบมั่วๆ (เพราะยังงงกับ syntax อยู่) เพื่อแก้ปัญหา N-Queens แบบง่ายๆ (ใช้ backtracking search ด้วย recursive ดื้อๆ เอานี่แหละ) โดยใช้ Go:
package main import "fmt" var N int = 10 func nqueens(board []int, filled int) int { var attack bool = false; if filled == N-1 { for i:=0; i<N; i++ { fmt.Printf("%d\t", board[i]) } fmt.Printf("\n"); return 1 } filled += 1; for i:=0; i<N; i++ { board[filled] = i; attack = false; for j:=0; j<filled; j++ { dy := board[j]-board[filled]; dx := j - filled; if (board[j] == board[filled]) || (dy/dx == 1 || dy/dx == -1) && (dy%dx == 0) { attack = true; break } } if !attack { nqueens(board, filled) } } return 0 } func main() { var board []int = make([]int, N); nqueens(board, -1); }
ด้วยความอยากรู้ ก็เลยลองเอาโปรแกรมนี้เอามาแปลงเป็นภาษา C แบบตรงๆ บรรทัดต่อบรรทัด
#include<stdio.h> #include<stdlib.h> const int N=10; int nqueens(int *board, int filled) { int i,j,attack,dy,dx; if (filled == N-1) { for(i=0; i<N; i++) printf("%d\t", board[i]); printf("\n"); return 1; } filled++; for(i=0; i<N; i++) { board[filled] = i; attack = 0; for(j=0; j<filled; j++) { dy = board[j]-board[filled]; dx = j - filled; if ((board[j] == board[filled]) || ((dy/dx == 1 || dy/dx == -1) && (dy%dx == 0))){ attack = 1; break; } } if (!attack) nqueens(board, filled); } return 0; } main() { int *board = (int *)malloc(sizeof(int)*N); nqueens(board, -1); }
เสร็จแล้วก็ลองเขียน Python อีกโปรแกรมหนึ่ง
def nqueens(board, filled): global N if filled == N-1: for i in board: print "%d\t" % board[i], print return True filled+=1 for i in xrange(0, N): board[filled] = i attack = False for j in xrange(0, filled): dy = board[j]-board[filled] dx = j - filled if board[j] == board[filled] or ((dy/dx == 1 or dy/dx == -1) and dy%dx==0): attack = True break if not attack: nqueens(board, filled) return 0 N=10 board = [0]*N nqueens(board, -1)
ทดลองรัน (ด้วย N=10) แล้วจับเวลาง่ายๆ ด้วย time ก็จะได้ผลเป็น
| Go | C | Python | |
|---|---|---|---|
| real | 0m0.165s | 0m0.041s | 0m1.048s |
| user | 0m0.116s | 0m0.029s | 0m1.028s |
| sys | 0m0.040s | 0m0.002s | 0m0.015s |
ประสิทธิภาพแบบคร่าวๆ ก็ถือว่าใช้ได้ทีเดียว ไม่ได้แย่กว่า C นัก แต่ไม่รู้ว่าผมชินกับภาษา C มากเกินไปหรือเปล่า ทำให้ผมรู้สึกแปลกๆ งงๆ กับ syntax ของ Go มันดูไม่ค่อยสวยงามยังไงไม่รู้ บอกไม่ถูก เหมือนแค่เอา C มาตัดบางส่วนออก เพราะกลัวจะพิมพ์เยอะเกินไป มันเลยดูขัดๆ อีกอย่าง Go ก็ไม่ได้เขียนสั้นๆ ง่ายๆ ได้เหมือน Python ผมว่าโครงสร้าง syntax ของ C กับ Python สวยงามกว่าเยอะ แต่ผมก็ยังไม่ลอง concurrent programming ที่เป็นจุดขายของ Go เหมือนกัน เอาไว้หนีงานมาลองใหม่คราวหน้าละกัน

Recent Comments