近日從網(wǎng)上看到一款稱為Scratch的語言,感覺它是屬于很久以前了解過的可視語言(Visual Language)??梢暰幊蹋?/span>Visual Programming)眾所周知,類似VB、Delphi等都可歸入可視編程范疇,但完全的可視編程應(yīng)基于可視語言,而非傳統(tǒng)中的程序設(shè)計(jì)語言。
言歸正傳,我們先上官方網(wǎng)站看看,網(wǎng)址是http://scratch.mit.edu:
SCRATCH下面的三個(gè)關(guān)鍵詞:imagine、program、share,很好地點(diǎn)出了它的用途:你先想象你要做的、然后把它變成程序、最后共享給大家看。
下面三幅圖片組成的流程圖,基本上描繪了Scratch的工作過程。首先看第一幅圖,它是把blocks(積木塊)snap到一起,就象玩樂高玩具一樣。事實(shí)上這就是編程!積木塊相當(dāng)于語句,snap到一起就編成了程序,圖形化的語句和圖形化的操縱過程,這便是可視語言和可視編程。
然后第二幅圖表示程序的運(yùn)行畫面,這是一個(gè)以精靈為主角的表演舞臺,演出的正是你想象中的故事,那只貓就是Scratch默認(rèn)的精靈,你完全可以創(chuàng)作你自己的精靈。
最后一幅圖片上的地球,代表共享。共享是Scratch的核心思想之一,事實(shí)上Scratch本身就是一個(gè)開源的軟件,你可以隨意下載它的源代碼,不過要看懂可不容易哦,因?yàn)樗怯?/span>smalltalk-80語言寫的!
接下來的一幅一幅圖片,正是世界各地用戶上傳的作品。如果你時(shí)不時(shí)刷新一下頁面,就會發(fā)現(xiàn)這些作品畫面在不斷變化、更新,這足以證明該軟件的用戶群已相當(dāng)龐大,上傳的作品源源不斷。
好了,我們還是來體驗(yàn)一下這個(gè)工具吧。哪怕它是個(gè)玩具,我們也先來玩一把,編程的日子實(shí)在太枯燥了。
在首頁上右面就有Download Scratch,點(diǎn)進(jìn)去下載一個(gè)Windows下的執(zhí)行文件就可以了,安裝實(shí)在是簡單,一路下去就OK。
現(xiàn)在我們啟動這個(gè)編程工具,主界面如下:
從界面看,它可不象通常的商業(yè)軟件樣子,事實(shí)上它是一款教育軟件,用來幫助8歲以上年輕人開發(fā)學(xué)習(xí)技能??磥韺W(xué)習(xí)是最枯燥的,所以人家搞出這種好玩的工具來幫助學(xué)習(xí)。那么對我等專業(yè)程序員來說,這玩具還玩兒么?不管怎么,它可是MIT媒體實(shí)驗(yàn)室的成果,而且是受美國NSF資助的。
我們觀察一下主界面上布局,發(fā)現(xiàn)左邊是語句,分為很多類,比如Motion(控制精靈運(yùn)動)、Control(控制類,包括傳統(tǒng)語言中的條件、循環(huán))。中間就是程序區(qū)了,它叫Scripts,而不稱Program,真有自知之明。右邊應(yīng)該是運(yùn)行結(jié)果顯示區(qū),也就是精靈表演的舞臺。
既然它是一種新的語言,那么它的編程能力如何呢?顯然,我們不能把它和C/C++、Java等相比,那是通用的程序設(shè)計(jì)語言。關(guān)于可視語言,大多應(yīng)該是面向?qū)iT領(lǐng)域的,象很久以前研究過的AVS、Khoros就是面向圖像處理和科學(xué)可視化的數(shù)據(jù)流可視語言。
不過我們還是出個(gè)題目來檢驗(yàn)一下Scratch的能力,那就是從1-100中找出所有素?cái)?shù)來,這個(gè)程序?qū)嵲诤唵危瑑蓚€(gè)循環(huán)就可以搞定,我們想看到的是Scratch如果能夠編制出來,會是什么樣子?
為了少走彎路,畢竟Scratch問世不久,還在更新發(fā)展階段,不能指望過高,我們先用傳統(tǒng)語言寫出這個(gè)程序來做參考。因?yàn)槭稚现挥?/span>PHP環(huán)境,那就用PHP寫吧:
<?php
echo '2<br>';
for($num=3;$num<100;$num++)
{
$isprime=1;
for($i=2;$i<sqrt($num)+1;$i++)
{
if($num%$i==0)
{
$isprime=0;
break;
}
}
if($isprime==1)echo $num.'<br>';
}
?>
我們要編程,首先想到要定義變量,那么Scratch中果然有Variables這個(gè)類,其中可以Make一個(gè)變量,從而產(chǎn)生這個(gè)變量和兩個(gè)語句(一個(gè)是設(shè)置值,另一個(gè)是改變值),不過我們發(fā)現(xiàn)它沒有數(shù)組,而且變量值除了是數(shù)字外,并不支持字符串,好在我們的測試程序只涉及到數(shù)字。
程序的核心是兩重循環(huán),我們發(fā)現(xiàn)Scratch的foreach循環(huán)后面不能再接語句,因?yàn)樗膱D標(biāo)下邊緣是平的,不能snap上去其它積木塊。幸好它還有repeat until語句可以下接其它語句,所以這個(gè)問題也可以解決。
關(guān)于輸出,比如象PHP中的echo,開始為Scratch中沒有對應(yīng)的語句發(fā)愁。原來打算定義一個(gè)結(jié)果變量放到舞臺上,在它上面顯示結(jié)果,由于沒有數(shù)組,那就等待一定時(shí)間顯示一個(gè)結(jié)果(無意中變成了動畫!)。后來發(fā)現(xiàn)一個(gè)更好的方式,那就是使用Scratch的say語句,讓那個(gè)小精靈在舞臺上say出結(jié)果,豈不妙哉!
最后要說明的是Scratch中沒有break跳轉(zhuǎn)語句,所以不能跳出循環(huán)省時(shí)間了,程序運(yùn)行效率會受到一定影響。
為了直觀起見,考慮以上Scratch語言情況,我們將測試程序重新編寫,并根據(jù)它搭建出了Scratch的腳本程序,整個(gè)過程簡單而Happy,下面就是兩種語言所寫程序的對照,基本上是一一對應(yīng)。
原來可視語言Scratch編寫的程序就是這個(gè)模樣,真的象是用樂高拼接的玩具作品。
下面我們可以運(yùn)行一下這個(gè)程序,顯然精靈cat不斷say出了正確的結(jié)果:
獨(dú)樂樂不如眾樂樂,我們在Scratch主界面上方菜單條中發(fā)現(xiàn)Share!,正是讓你共享你的作品,這是Internet和開源時(shí)代的精神。你可以點(diǎn)擊進(jìn)去,共享上傳,當(dāng)然你首先要在它的官方網(wǎng)站上注冊一個(gè)用戶名。
共享上傳后,我們發(fā)現(xiàn)在網(wǎng)頁上也能運(yùn)行,而且在瀏覽器狀態(tài)欄中顯示小應(yīng)用程序ScratchApplet啟動,莫非它用Java Applet制作了一個(gè)解析器來解析Scratch作品(其作品文件擴(kuò)展名是sb,老外這不是罵人吧)。