非過程語言

非過程語言

非過程語言是一種計算機程式設計語言,是相對於過程語言而言的,其語言的組織不是圍繞於過程的。它同過程語言的區別是非過程語言編寫的程式可以不必遵循計算機執行的實際步驟,使人們無須關心問題的解法和計算過程的描述,。在非過程語言中,只要指明輸入記錄、所要完成的加工以及輸出形式,便能得到所要求的輸出結果,其餘工作全部由系統來完成。其主要優點是可減少程式設計師編程的工作量。

當前使用的非過程語言種類很多:一類是以LISPFP等為代表的函式式程式設計語言;一類是以PROLOG為代表的邏輯型程式設計語言;還有一類稱為面向對象的程式設計語言,其典型語言是Smalltalk

基本介紹

  • 中文名:非過程語言
  • 外文名: nonprocedural language 
  • 解釋:描述問題時不指明解決問題的順序
  • 時代: 20 世紀 60 年代寫成
編寫步驟,概念解釋,歷史發展,特徵,關係,

編寫步驟

在編寫非過程語言程式時一般要遵守下列步驟:
1.執行內務處理,例如清存儲器、預置計數器初值等;
2.打開文卷,檢查標號;
3.讀輸入記錄;
4.執行算術或邏輯運算;
5.產生輸出記錄;
6.重複步驟3—5,直到處理完全部記錄;
7.列印最終的輸出記錄,關閉文卷;
8.結束程式或將控制返回作業系統.

概念解釋

非過程這一術語是相對的,它隨技術水平的變化而變化。無論如何,較少過程的這一用語較佳,因為它明確了這一概念的相對性。考察圖1將使這個問題更清楚。比較圖1 (a)和1(a*),表明了彙編語言與類Fortran語言之間的差別。在Fortran存在之前,表達式A=(B+C) *D+E*F可認為是非過程的,因為它不能被任何語言加工程式所直接翻譯。同樣,圖1(b)與1(b*)示出另一級的相對性,因為進行矩陣相乘的Fortran程式在APL中可用一個語句來處置。在Fortran中採用子例程式並不給出附加的非過程性,因為過程性乃基於語言的基元。最後,圖1(c*)示出一個程式,它計算素數3到95的平方根並按兩列列印(CALCULATE THE SQUARE ROOT OF THE PRIME NUMBERS FROM 3 TO 95 AND PRINT IN TWO COLUMNS),它不能被任何至今已知的翻譯系統所處置,但是如果它能的話,按1980標準,該語言可認為是非過程的。[必須認識,圖1(c*)中示出的兩種形式在邏輯上是等效的,對其中一種形式比另一種 (即形式表示比英語表示)更喜歡,那只是個人愛好的問題。]一個系統“理解”英語的能力不在這裡爭論;看起來象英語的短語實際上取決於特定的程式設計技術(例如模式匹配擴展),而不是英語的文法。用另一方式陳述這一觀點(由於其在這事情至為重要),完全可能設計一個形式語言來做數學問題,其中可接受CALCULATE THE SQUARE ROOT OF THE PRIME NUMBERS FROM 3 TO 95 AND PRINT IN TWO COLUMNS這一語句。在另一極端,象FIND x SUCH THAT X**2=5(求x使x2=5) 這樣的看起來自然又優雅的短語實際上等效於調用一個平方根例行程式。因此,非過程性與英語表示法是完全無關的兩個方面。
圖1
(a) (a*)
(assembly Language) (Fortran)
CLA B A=(B+C)*D+E*F
ADD C MPY D STO T CLA E MPY F ADD T STO A
(b) (b*)
(Fortran) (APL)
DO 71=1,M A←B+.×C DO 8J=1,N C(1,J)=0
DO 9K=1,L C(1,J)=C(1,J)+A(1,K)*B(K,J)
9 CONTINUE
8 CONTINUE
7 CONTINUE
(c)
(PL/1) (c*)
DO 1=3 TO 95 BY 2; PRINT(2)
IF PRIME(1) SQ(PRIME(3,95))
THEN PUT SKIP LIST
(1,SQRT(1)); 或
ELSE RETURN;
END; CALCULATE THE SQUARE
ROOT OF THE PRIME
NUMBERS FROM 3 TO
95 AND PRINT IN
2 COLUMNS

歷史發展

在很早期的程式設計 (即50年代的前5年)中,自動程式設計這個詞用來表示用某一高級語言來編寫一個程式的過程。其中“高級”是與機器代碼相比較。隨著時間推移,顯然編碼只是整個解題任務的一部分,所以用自動編碼這個詞來表示採用諸如Fortran這樣的語言。因此,甚至在很早期,在編碼(它是整個程式設計任務中的一個方面)和說明與設計這一大量活動之間作出了適當的區別。第一批重要的成就之一是在Information Algebra的開發中Codasyl Languange Structure Group的工作。這實質上是利用輸入/輸出關係來描述數據處理套用的一種面向數學的方法;這些輸入/輸出關係實際上是利用對稱為區域(類似於檔案)的實體集合的變換來定義的。作為另一個例子,我們注意到,象 Comit與Snobol這樣的面向字元串與模式的語言對於那些特徵的過程性比Fortran與Cobol這樣的語言少得多。
Lisp 語言最早是在 20 世紀 50 年代末由麻省理工學院(MIT)為研究人工智慧而開發的。Lisp 語言的強大使它在其它方面諸如編寫編輯命令和集成環境等顯示其優勢。而 GNU Emacs Lisp 主要由 Maclisp 發展而來。它在某種程度上繼承了 Common Lisp,而 Common Lisp 在 20 世紀 80 年代成了一種標準。 Lisp 代表 LISt Processing,即表處理,這種程式語言用來處理由括弧(即“(”和“)”)構成的列表。

特徵

相聯引用
我們將使用相聯引用這個術語來指基於數據的本徵性質的數據存取。相聯引用通常在那些把集合作為數據結構的語言中提供。從原先定義的集合中選擇元素和基於成員的某一特性從老的集合中定義新的集合,這樣的操作有時稱為集合形成(例如,見SETL——q. v.)。SETL的功能的一個例子可由下列表達式看到,它說明在2與100之間的素數。
{P,2<=P<=100↑
( 2<=N<P↑(P//N)NE、O)}
用英語這可讀為“the set of P’s between 2 and 100 such that for every N greater than or equal to 2 and less than P,the remainder of P/N is not equal to zero”(在2與100 之間的P的集合,使每個大於或等於2且小於P的 N,P/N的餘數不等於零)。(這個說明顯然不是高效的;實用的算法至少是只應考慮從3到100的奇數。)
在非過程語言中相聯引用的重要性在於程式設計師不必顯式說明存取路徑或把一算法編成程式以便指導對一特定數據結構的查找。相聯引用也用於資料庫管理語言中。
Codd(1972)定義了對關係的代數操作,這些代數作給出語言與這一類型的數據結構的相對能力的量度。除了笛卡兒乘積邏輯或邏輯與等傳統的集合操作之外,他定義了投影連線、相除與限定等相關操作。這些操作符(見下面的聚集操作符)有效地提供各種類型的相聯引用。
聚集操作符
在提供聚集操作符的一些程式設計語言中可避免編寫循環。APL中的十操作符可同等地用於標量與聚集,就是這類操作符的一個最簡單的例子。例如,兩個向量X、Y的相加只要寫X+ Y就可獲得,而在其他大多數程式設計語言中,結果向量的各元素必須在循環的控制下一次一個地獲得。在APL中的聚集操作符的另一個例子是使用歸約操作符來求一個向量X的各元素之和,如下列表達式所示:+/X。在有些情況下,PL/I程式設計師可通過採用對整個數組或結構都分布的若干操作符(例如賦值與相加操作符,如A=B+C,其中A、B、與C是數組)的方法來避免循環。
在相聯引用與我們現在正在討論的聚集操作符之間有密切的關係。顯然,Codd(1972)對關係定義的代數操作符是聚集操作符。無疑,採用這個手段來消除顯式的定序是一個非過程的特徵。
在數據處理套用(但只用於說明)很有用的兩個聚集操作符是在Information Algebra(Codasyl,1962) 中提出的BUNDLE與GLUMP這兩個操作符。 GLUMP操作符把一個區域(它如同一個檔案)劃分成稱為元素的子集,使一個元素含有在該區域中具有對給定的GLUMP操作符相同值的所有實體。 GLUMP操作符用於分組與歸納,這些是數據處理中的典型任務。例如,給定一組顧客訂貨單,其中可能有的顧客有一個以上的訂貨單,GLUMP操作可用 GLUMP(CUST#,ORDERS)表示。這個操作的結果是對ORDERS進行劃分,使一個分區中的各訂貨單有相同的訂貨單號。BUNDLE操作符對有序的區域集合進行工作,對於笛卡兒乘積的每個成員,只選擇滿足某一條件(例如在一特定域中值的相等)的那些實體。
任意定序的消除
我們把任意定序定義為不是用套用的數據相關性所指揮的任何定序。
函式型程式設計語言是或不包含賦值語句或不包括GOTO語句的語言。因此,“函式型”看來是“非過程”的同義詞,因為它更多地包含對輸入函式所要求的輸出的規定,而不是指出程式步驟的逐步序列。用諸如純Lisp這樣的函式型語言編寫的程式可避免一些副作用,這些副作用是過程程式設計的伴隨物。在過程語言中的一個副作用是在表達式計算期間因一個賦值語句而修改存儲(例如在表達式中一個函式的計算期間)造成的。純函式型語言不產生副作用,因為它們沒有賦值操作,它們不能在表達式計算期間修改存儲。
函式型程式設計的一個例子是APL“單線”操作(沒有賦值或沒有帶副作用的函
數調用)。在下列 APL單線函式中將從向量X刪除先行元素,其中 QTEMP表示一個加引號的字元串或含有要刪除的示樣的數字向量。
非過程語言
缺少任意定序的最終表達式是純數據流程式設計語言。在這種形式方法中,套用被分解成一組模組,一個模組在它被另一模組產生之後可只消耗(即 RESULT得到其輸入數據)一特定值,和反之。定序是由數據相關性嚴格控制的[例如,見圖1(c*)]。著名的數據流程式設計語言的最佳例子是GPSS(通用系統模擬語言),在其中一個模擬程式的定序是由傳過該模型的事務(數據)所控制的。

關係

RPG與非過程語言的關係
在討論非過程語言時往往提到RPG(報表程式的生成程式)。無疑,一個RPG的輸出格式是通過說明要什麼而不是它應如何產生的方法指定的。但是,應該指出,一個 RPG程式的Calculation(計算)部分明確地是屬於低層。這證實了我們關於沒有一種語言在絕對意義上是非過程的這一說法。一個具體語言可具有某些特徵而缺乏其他特徵,或者在一個方面具有某一特徵而在另一個方面缺乏此同一特徵。

相關詞條

熱門詞條

聯絡我們