ProgrammingLanguage程式語言2006/07/11ByShu-ChunWeng(翁書鈞,scw)scwatcsiedotorg什麼是程式語言?研究已經存在的程式語言研究新的程式語言•研究已有的功能、已有的特性•修正、改進、研發2020/5/6CSCamp20063語言有哪些特性?語法難易、打字多少語義合理性自由度、容錯能力編譯器檢查•型別檢查•安全性檢查執行期檢查•權限檢查•例外處理2020/5/6CSCamp20064為什麼要程式語言?因為電腦很機車,它說的話沒有人看得懂因為電腦很機車,它說的話別台電腦也看不懂i386:10110000000000111111111011000000110000001110000000000010MIPS:001000000000100000000000000000110010000100001000000000000000000100000000000010000100000010000000他們都在說(3+1)*4!2020/5/6CSCamp20065為什麼要程式語言?(cont.)因為電腦很笨,聽不懂人說話因為人很機車,說話很難理解Isawasawsawingaseesaw.Timeflieslikeanarrow.光陰似箭{測速蒼蠅}如箭測速{蒼蠅喜歡箭}時間蒼蠅喜歡箭2020/5/6CSCamp20066所以我想說什麼?程式語言比較的觀點介紹一卡車程式語言•低階語言•老古董和還在用的老古董•物件導向程式語言•腳本語言、網頁腳本語言•函式語言•邏輯語言、伺服器端腳本、硬體描述語言•其他有的沒的•其中我會寫的約二十種,加上很多只看得懂的,和一些連看都不想看的……2020/5/6CSCamp20067所以我想說什麼?(cont.)編譯器、直譯器、互動介面語法、語義、型別程式檢查2020/5/6CSCamp20068可移植性(Portability)哇!這支程式好棒!可是我是在Linux上用的哇!Mac的介面好漂亮!可是Mac用的不是x86CPU同樣的程式能不能拿到不同的OS上用?同樣的程式能不能拿到不同的CPU上用?2020/5/6CSCamp20069可移植性(Portability)(cont.)愈高階:通常愈具可移植性語言標準通常完全可移植•但那些不標準的部份通常很難移植視窗介面加速函式庫語法自由留下的奇妙現象解決方式•關鍵部份由作者自行依不同環境各別撰寫,很累•包山包海的標準!•虛擬機器2020/5/6CSCamp200610語言結構性(Structure)這行做完之後要做哪一行?從這邊跳到那邊是為什麼?寫出來的程式容不容易看懂寫出來的程式容不容易除錯2020/5/6CSCamp200611語言結構性(Structure)(cont.)愈高階:通常愈結構化、愈模組化機械碼jmp[距離]組合語言jmp[標簽]FORTRAN有‘if’‘while’C很少用gotoJava沒有goto!2020/5/6CSCamp200612語言結構性(Structure)(cont.)結構化程式語言(structured)FORTRAN以後提供‘if’‘while’等語法函式導向程式語言(procedure-oriented)Algol,CPL以後有函式以及區域變數、遞迴呼叫物件導向程式語言(object-oriented)Simula,Smalltalk以後以資料訂定型別,同時包含操作資料的函式2020/5/6CSCamp200613語言可讀性(Readable)是詩篇還是天書?不只視覺效果,更影響開發效率、除錯效率!語言本身限制外,如何使用影響甚鉅2020/5/6CSCamp200614語言可讀性(Readable)(cont.)高階語言的目標通常包含可讀性return${${$_[0]}-{capture}}ifdefined${${$_[0]}-{capture}};returnsubstr(${${$_[0]}-{str}},$_[0]-from,$_[0]-to-$_[0]-from);notexplogsrandxorsqqqxxorsxxlengthucordandprintchrordforqwqjoinusesubtiedqxxorevalxorprintqqqqxorintevallcqmcosandprintchrordforqwyabsneopentiedhexexprefymxorscalarsrandprintqqqqxorintevallcqqysqrtcosandprintchrordforqwxprintfeachreturnlocalxyorprintqqssandevalqsundeforoctxortimexorrefprintchrintordlcforeachqwyhexalarmchdirkillexecreturnysgtsinsortsplit2020/5/6CSCamp200615BEFOREHAND:closedoor,eachwindow&exit;waituntiltime.openspellbook,study,read(scan,select,tellus);writeit,printthehexwhileeachwatches,reverseitslength,writeagain;killspiders,popthem,chop,split,killthem.unlinkarms,shift,wait&listen(listening,wait),sorttheflock(then,warnthegoats&killthesheep);killthem,dumpqualms,shiftmoralities,valuesaside,eachone;diesheep!dietoreversethesystemyouaccept(reject,respect);nextstep,killthenextsacrifice,eachsacrifice,wait,redoritualuntilallthespiritsarepleased;doit(astheysay).doit(*everyone***must***participate***in***forbidden**s*e*x*).returnlastvictim;packagebody;exitcrypt(time,times&halfatime)&closeit,select(quickly)&warnyournextvictim;AFTERWORDS:tellnobody.wait,waituntiltime;waituntilnextyear,nextdecade;sleep,sleep,dieyourself,dieatlast#LarryWall2020/5/6CSCamp200616語言實用性(Usable)可以寫視窗介面嗎?可以寫網路程式嗎?效率夠好嗎?語言設計時的考量影響語言多好用、什麼時候會被用。標準函式庫(standardlibrary)的內容主流!2020/5/6CSCamp200617語言實用性(Usable)(cont.)重視效率可能要犧牲模組化(FORTRAN,C++)重視可移植性可能要犧牲效率(Java,C#)重視語法簡易可能要犧牲檢查或簡潔(Python)重視彈性可能要犧牲可讀性(C,Perl)2020/5/6CSCamp200618程式執行方式直譯(interpret)•邊讀邊執行程式•BASIC,python,ruby,shellscript,lisp編譯(compile)•至原生碼(nativecode)C,C++,FORTRAN•至虛擬碼(bytecode)(JIT)Java,C#,Smalltalk,(Perl)•至其他語言Haskell2020/5/6CSCamp200619語言介紹低階語言•機械碼•組合語言2020/5/6CSCamp200620機械碼(MachineCode)i386:10110000000000111111111011000000110000001110000000000010MIPS:001000000000100000000000000000110010000100001000000000000000000100000000000010000100000010000000他們都在說(3+1)*4!2020/5/6CSCamp200621i3861011000000000011111111101100000011000000111000000000001010110000000000111111111011000000110000001110000000000010X=3X=X+1X=X*4X=(3+1)*42020/5/6CSCamp200622000000000000100001000000100000000000000000001000010000001000000000100001000010000000000000000001001000010000100000000000000000010010000000001000000000000000001100100000000010000000000000000011MIPSX=3X=X+1X=X*4X=(3+1)*42020/5/6CSCamp200623組合語言用單字取代0和1給暫存器(register)名字動作(通常)很單純MOV,JMP,ADD……•moval,3incalshlal,2•addi$t0,$0,3addi$t0,$t0,1sll$t0,$t0,22020/5/6CSCamp200624組合語言(cont.)不允許一些危險行為101100000000001111111110110000001100000011100000000000101110101111110110101100000000001111111110110000001100000011100000000000101110101111110110MOVal,3ADDal,1SHLal,2JMP-8ROLal,e0hADDedi,esi00000011111111101100000011000000KUKUKU~2020/5/6CSCamp200625高階語言2020/5/6CSCamp200626高階語言(cont.)變數•不用自己管資料放在哪裡•可以取個有意義的名字指派(assignment)•X=3;X=2;運算式•c=sqrt(a*a+b*b)控制結構•如果…就…要不…:if…then…else…•如果…就重複…:while…do…函式•內建函式:sin(),cos(),…•使用者自訂2020/5/6CSCamp200627FORTRAN第一個高階語言!還在用的老古董MathematicalFormulaTranslatingSystemIBM1954-57完成1977年訂定F77標準•結構化•多種內建資料型態科學計算•效率2020/5/6CSCamp200628FORTRAN(cont.)PROGRAMCMPLXDIMPLICITCOMPLEX(X)PARAMETER(PI=3.141592653589793,XJ=(0,1))DO1,I=0,7X=EXP(XJ*I*PI/4)IF(AIMAG(X).LT.0)THENPRINT2,'e**(j*',I,'*pi/4)=',REAL(X),'-j',-AIMAG(X)ELSEPRINT2,'e**(j*',I