用三種語言寫了最精簡版的 VTE terminal emulator。
覺得還是學 C 就好,沒有比較難,效能又很好。
C | #include <vte/vte.h>
main(){
gtk_init(0,0);
GtkWidget *w=gtk_window_new(0);
GtkWidget *t=vte_terminal_new();
vte_terminal_fork_command(t,"sh",0,0,"/",0,0,0);
gtk_container_add(w,t);
gtk_widget_show_all(w);
gtk_main();
} |
ruby | #!/usr/bin/ruby
require 'gtk2'
require 'vte'
w=Gtk::Window.new
t=Vte::Terminal.new
t.fork_command
w.add(t)
w.show_all
Gtk.main |
python | #!/usr/bin/python
import gtk
import vte
w=gtk.Window()
t=vte.Terminal()
t.fork_command()
w.add(t)
w.show_all()
gtk.main() |
|
程式大了就會覺得 C 比較難。:)
GUI 程式,還是用 C 比較好,用 script 程式複雜點就慢下來了。
不過,我倒是不知道 ruby 有 vte binding 說。
|
使用 script 的好處是他包了許多糖衣,例如字串處理,這個部份要用 C 寫,就麻煩多了。
簡單的 GUI, 用 script 是還好,大一點的就不合適了。如果是才剛開始學程式語言,我是比較建議學 C,先習慣程式語言如何抽象化,將來要學什麼都好說。
程式語言有兩大難題,1. 抽象化,2. 結構演算。初學,是 1. 比較困難。有一定程度的是 2. 比較困難。
以上是我的簡單學習經驗,供大家參考(因為不小心,這三種我都曾學過 XD)。
|
舉了有元件可以用的例子並不太公平啊 :P
如果要舉內嵌 asm 的例子,同時也對另外二者不公平了
(不公平並不是說做不到的意思 :D)
並不是所有的用途都能讓三者的實作難度那麼平均的
所以這樣的比較實在沒有參考性啊 >"<
|
管他黑貓白貓,會抓老鼠的就是好貓!
不過,script 的發展會吸引一堆人,總是有他的好處。C 一直維持不墜的地位,也當然有他一定的道理。最好當然就是兩個都會,針對要解決的問題評估後看要用哪一種。只是我長期觀察的結果,業餘用途的話,你會用哪一種就是那一種吧!想太多就天亮了,不如趕快動手才是真的。XD
edited: 1
|
LGJ |
只是我長期觀察的結果,業餘用途的話,你會用哪一種就是那一種吧!想太多就天亮了,不如趕快動手才是真的。XD
|
所以姿勢有空再學, 先動手才是真的。因為想太多就天亮了 (逃)
|
qrtt1 |
所以姿勢有空再學, 先動手才是真的。因為想太多就天亮了 (逃)
|
那些都不重要,小q 萌主最重要的是先找一個可以動手的對象。XD
|
letoh 從 demo.c 轉的 Reva Forth code: Reva Forth | " libvte.so" lib libvte libvte not [IF] ." load libvte failed..." cr -1 throw [THEN] 0 func: vte_terminal_new 8 func: vte_terminal_fork_command needs ui/gtk2 ~gtk2 : =exit callback gtk_main_quit ; : main ( -- ) init GTK_WINDOW_TOPLEVEL gtk_window_new dup dup vte_terminal_new dup 0 0 0 0 0 0 0 vte_terminal_fork_command drop 2dup _add z" child-exited" ['] =exit _connect drop z" delete-event" ['] =exit _connect drop gtk_widget_show_all gtk_main ; 1 [IF] ~sys ' main is appstart exit~ save test_vte [ELSE] main [THEN] bye |
edited: 3
|
現在用 forth 的是稀有動物了吧!
|
http://live.gnome.org/Vala Vala | // valac --pkg vte demo.vala -o demo using Gtk; using Vte; void main(string[] args){ Gtk.init(ref args); Window m=new Window(Gtk.WindowType.TOPLEVEL); Terminal v=new Terminal(); v.fork_command(null,null,null,null,false,false,false); m.add(v); m.show_all(); Gtk.main(); } |
edited: 1
|
C++ | // g++ demo.cpp -o demo `pkg-config --cflags --libs libvtemm` #include <libvtemm.h> main(){ Gtk::Main kit(0,0); Gtk::Window::Window m; Gnome::Vte::Terminal v; v.fork_command(); m.add(v); m.show_all_children(); Gtk::Main::run(m); } |
edited: 1
|