老版本fortran语言 内存无效_编程语言的分类
編程語言世代
第一代和第二代語言又稱低級(jí)語言(Low-level language),其余被視為高級(jí)語言(High-level language)
第一代編程語言
即機(jī)器語言,由0和1構(gòu)成,通過面板、打孔帶或者打孔卡輸入。
第二代編程語言
即匯編語言,是機(jī)器語言的簡(jiǎn)單替換,目前在內(nèi)核/驅(qū)動(dòng)中會(huì)被用到。
第三代編程語言
架構(gòu)無關(guān)的語言,更加面向程序員,而非機(jī)器。第三代語言將很多細(xì)節(jié)交由計(jì)算機(jī)(編譯器)把控,同時(shí)變得更加抽象。從Fortran、ALGOL、COBOL到C、C++、C#、Java、Basic和PASCAL都是第三代語言。大多數(shù)第三代語言支持結(jié)構(gòu)化編程,不少支持面向?qū)ο缶幊獭?/p>
第四代編程語言
是一個(gè)比較模糊而不斷變化的概念,本質(zhì)上說,任何在第三代語言的概念上有所改進(jìn)的語言都可被視為第四代語言。
第四代語言可能包括對(duì)數(shù)據(jù)庫(kù)處理、報(bào)告生成、GUI開發(fā)、網(wǎng)絡(luò)開發(fā)等的支持。某些人認(rèn)為第四代語言是domain-specific語言的子集。而且這些支持在第三代語言中都有以庫(kù)的方式體現(xiàn),這模糊了第三代和第四代的區(qū)別。
第五代編程語言
第五代語言被認(rèn)為可以讓計(jì)算機(jī)在不需要程序員的情況下獨(dú)立解決一個(gè)問題,也就是說計(jì)算機(jī)只需要了解這個(gè)問題的約束,而無需程序員寫出算法。
廣義上來說,大部分constraint-based和logic-programming和某些其他的declarative語言都是第五代語言。第五代語言通常被用作在人工智能的研究上,一些這樣的語言(比如OPS5)基于Lisp。
狹義上來說,第五代語言尚未誕生。因?yàn)槠涮攸c(diǎn),第五代語言曾被認(rèn)為是未來的語言,將取代所有之前的高級(jí)語言,日本曾在第五代語言方面投入了大量的研究和資金,但事實(shí)上因?yàn)榈谖宕Z言和Strong AI息息相關(guān),其難度非常之高。
編譯型和解釋型
所有語言最終都需要轉(zhuǎn)變?yōu)闄C(jī)器碼,基于其轉(zhuǎn)換為機(jī)器碼的方式,高級(jí)語言可大致分為編譯型和解釋型兩類(匯編語言無須編譯或解釋,僅需匯編成機(jī)器碼)。
通常來說,編譯型語言的運(yùn)行速度更快(因?yàn)橐呀?jīng)預(yù)先編譯好,運(yùn)行時(shí)無須執(zhí)行解釋這一步驟),而因此,編譯型語言的開發(fā)/調(diào)試時(shí)間也較長(zhǎng),因?yàn)槊看握{(diào)試之前都需要編譯一次。而解釋型語言則可以快速的測(cè)試和調(diào)試。
理論上來說,任何語言都可以是編譯型的或者解釋型的。許多語言同時(shí)采用編譯器和解釋器來實(shí)現(xiàn):先將代碼編譯為(虛擬機(jī)一致的)字節(jié)碼,在運(yùn)行時(shí)再用解釋器解釋執(zhí)行,即所謂的JIT(Just-in-time,即時(shí)編譯)。
編譯型語言(Compiled language)
編譯型語言利用編譯器先將代碼編譯為機(jī)器碼,再加以運(yùn)行。比如C、C++、C#(編譯成字節(jié)碼)、Java(編譯成字節(jié)碼)等
解釋型語言(Interpreted language)
解釋型語言利用解釋器,在運(yùn)行期間,動(dòng)態(tài)將代碼逐行解釋(Interpret)為機(jī)器代碼并執(zhí)行。比如Python、BASIC、JavaScript等。
編程范式
Programming Paradigms,或叫編程范型、編程典范,基于編程語言的特點(diǎn)而進(jìn)行分類的方式。一種語言可以可以支持超過一種編程范型。
命令式和聲明式
這是兩個(gè)相對(duì)/并列的范式,命令式編程描述過程 ,聲明式編程描述目標(biāo)。
命令式編程(Imperative programming)
命令式編程描述計(jì)算所需作出的行為。幾乎所有的計(jì)算機(jī)硬件都是命令式的。
子范式:過程式和面向?qū)ο笫?#xff0c;過程式更靠近機(jī)器,面向?qū)ο笫礁N近程序員。
過程式編程(Procedural programming)
來源于結(jié)構(gòu)化編程,其概念基于過程(procedure、routine、subroutine、function),過程由一系列可執(zhí)行可計(jì)算的步驟構(gòu)成。
Fortran、ALGOL、COBOL、BASIC、Pascal和C等語言采用過程式編程。
面向?qū)ο笫骄幊?#xff08;Object-oriented programming)
具有對(duì)象概念的編程范式。
重要的面向?qū)ο缶幊陶Z言包括Common Lisp、Python、C++、Java、C#、Perl、PHP、Ruby、Swift等。
聲明式編程(Declarative programming)
聲明式編程描述目標(biāo)的性質(zhì),讓計(jì)算機(jī)明白目標(biāo),而非流程。聲明式編程通常被定義為所有的“非命令式編程”。
聲明式編程包括數(shù)據(jù)庫(kù)查詢語言(SQL)、正則表達(dá)式、邏輯式編程、函數(shù)式編程和configuration management。聲明式編程通常用作解決人工智能和約束滿足問題。
子范型:函數(shù)式編程、邏輯式編程、約束式編程、數(shù)據(jù)流式編程
函數(shù)式編程(Functional programming)
又稱泛函編程,它將計(jì)算視為數(shù)學(xué)上的函數(shù)運(yùn)算,避免變量或狀態(tài)(只有函數(shù)及其參數(shù))。其最重要的基礎(chǔ)是λ演算(lambda calculus),λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入和輸出。
分為純函數(shù)式編程(Purely functional programming)和函數(shù)邏輯式編程(Functional logic programming,函數(shù)式編程和邏輯式編程的組合)
邏輯式編程(Logic programming)
邏輯式編程基于數(shù)理邏輯,它設(shè)置答案所須匹配的規(guī)則來解決問題,而非設(shè)置步驟來解決問題。過程為:事實(shí)+規(guī)則=結(jié)果。
最常用的邏輯式編程語言是Prolog,Mercury則較適用于大型方案。
約束式編程(Constraint programming)
在這種范式中,變量之間的關(guān)系是以約束的形式陳述的,它們并非明確說明了要去執(zhí)行步驟的某一步,而是規(guī)范其解的一些屬性。
數(shù)據(jù)流式編程(Dataflow programming)
將程序建模為一個(gè)描述數(shù)據(jù)流的有向圖。例如BLODI。
結(jié)構(gòu)化和非結(jié)構(gòu)化
這是兩個(gè)相對(duì)的范式,非結(jié)構(gòu)化編程是最早的編程范式,現(xiàn)今的計(jì)算機(jī)科學(xué)家都同意結(jié)構(gòu)化編程的好處。
非結(jié)構(gòu)化編程(Non-structured programming)
是最早的編程范式,相對(duì)于結(jié)構(gòu)化編程,特點(diǎn)是其控制流是通過(容易引起混亂的)goto語句跳轉(zhuǎn)實(shí)現(xiàn)的。非結(jié)構(gòu)化編程包括機(jī)器語言、匯編語言、MS-DOS batch、以及早期的BASIC及Fortran等等。
結(jié)構(gòu)化編程(Structured programming)
通過子程序、代碼塊、for循環(huán)、while循環(huán)等結(jié)構(gòu)來取代之前的goto語句,以提高代碼的清晰程度,獲得更好的可讀性。現(xiàn)今的大部分高級(jí)語言都是結(jié)構(gòu)化的。
結(jié)構(gòu)化編程的流程包括順序、選擇(if, else, switch)、循環(huán)(for, while)幾類。
元編程(Metaprogramming)
元編程是一種讓程序視其他程序?yàn)閿?shù)據(jù)的編程技術(shù)。也即是說一個(gè)程序可以被設(shè)計(jì)為讀取、產(chǎn)生、分析、改變其他程序,甚至在運(yùn)行時(shí)改變自己。元編程所用的語言叫做元語言。
最著名的元語言是Lisp。
元編程的子范型:自動(dòng)式編程、反射式編程
自動(dòng)式編程(Automatic programming)
自動(dòng)式編程的定義并不清晰,而且隨時(shí)間在演變。
反射式編程(Reflection programming)
反射式編程指的是程序具有在運(yùn)行時(shí)檢查/修改它自身的結(jié)構(gòu)及行為的能力。
泛型編程(Generic programming)
泛型允許程序員在用強(qiáng)類型語言編寫代碼時(shí)使用一些以后才指定的類型。
Ada、Delphi、C#、Java、Swift、http://VB.NET稱之為泛型(generics),Scala和Haskell稱之為參數(shù)多態(tài)(parametric polymorphism),C++稱之為模板()
動(dòng)態(tài)語言(Dynamic programming language)
動(dòng)態(tài)語言在運(yùn)行時(shí)可以改變其結(jié)構(gòu):新的函數(shù)、對(duì)象甚至代碼可以被引進(jìn),已有的函數(shù)可以被刪除或有其他結(jié)構(gòu)上的變化。JavaScript、PHP、Python、Ruby屬于動(dòng)態(tài)語言,而C和C++則不屬于動(dòng)態(tài)語言。
大部分動(dòng)態(tài)語言都使用動(dòng)態(tài)類型,但也有些不是。
類型系統(tǒng)(Type system)
動(dòng)態(tài)和靜態(tài)類型檢查
對(duì)類型的檢查可能發(fā)生在編譯時(shí)(靜態(tài)檢查),或者程序運(yùn)行時(shí)(動(dòng)態(tài)檢查)進(jìn)行。動(dòng)態(tài)類型檢查經(jīng)常出現(xiàn)在腳本語言和解釋型語言中,編譯語言則通常使用靜態(tài)類型檢查。
大部分動(dòng)態(tài)語言都使用動(dòng)態(tài)類型,但也有些不是。
強(qiáng)弱類型
強(qiáng)類型(Strongly typed)和弱類型(Weakly/Loosely typed)并沒有非常明確地定義。主要用于描述編程語言對(duì)于混入不同數(shù)據(jù)類型的值進(jìn)行運(yùn)算時(shí)的處理方式。強(qiáng)類型的語言遇到函數(shù)形參和實(shí)參的類型不匹配時(shí)通常會(huì)失敗,而弱類型的語言常常會(huì)進(jìn)行隱式的轉(zhuǎn)換(并可能造成不可知的后果)。
類型安全和內(nèi)存安全
第三種對(duì)語言的類型系統(tǒng)進(jìn)行分類的方法,就是類型運(yùn)算和轉(zhuǎn)換的安全性。如果它不允許導(dǎo)致不正確的情況的運(yùn)算或轉(zhuǎn)換,計(jì)算機(jī)科學(xué)就認(rèn)為該語言是類型安全的。
內(nèi)存安全則指的是程序不被允許訪問沒有分配給它的內(nèi)存,比如:內(nèi)存安全語言會(huì)做數(shù)組邊界檢查。通常來說,類型安全和內(nèi)存安全是同時(shí)存在的。
比如以下例子:
var x:= 5
var y:= “37”
var z:= x + y
上例中的z的值為42,不管編寫者有沒有這個(gè)意圖,該語言定義了明確的結(jié)果,且程序不會(huì)就此崩潰,或?qū)⒉幻鞫x的值賦給z。就這方面而言,這樣的語言就是類型安全的。
再比如:
int x = 5
char y[] = “37”
char* z = x + y
在這個(gè)例子中,z將會(huì)指向一個(gè)超過y地址5個(gè)字節(jié)的存儲(chǔ)器地址,相當(dāng)于指向y字符串的指針之后的兩個(gè)空字符之處。這個(gè)地址的內(nèi)容尚未定義,且有可能超出存儲(chǔ)器的定址界線,這就是一個(gè)類型不安全/內(nèi)存不安全的語言。
顯式聲明和隱式暗示
許多靜態(tài)類型系統(tǒng),如C和Java,要求變量聲明類型:編寫者必須以指定類型明確地關(guān)系到每一個(gè)變量上。其它的,如Haskell,則進(jìn)行類型推斷:編譯器根據(jù)編寫者如何運(yùn)用這些變量,以草擬出關(guān)于這個(gè)變量的類型的結(jié)論。
例如,給定一個(gè)函數(shù)f(x,y),它將x和y加起來,編譯器可以推斷出x和y必須是數(shù)字——因?yàn)榧臃▋H定義給數(shù)字。因此,任何在其它地方以非數(shù)值類型(如字符串或鏈表)作為參數(shù)來調(diào)用f的話,將會(huì)發(fā)出一個(gè)錯(cuò)誤。
在代碼中數(shù)值、字符串常量以及表達(dá)式,經(jīng)常可以在詳細(xì)的前后文中暗示類型。例如,一個(gè)表達(dá)式3.14可暗示浮點(diǎn)數(shù)類型;而[1, 2, 3]則可暗示一個(gè)整數(shù)的鏈表;通常是一個(gè)數(shù)組。
總結(jié)
以上是生活随笔為你收集整理的老版本fortran语言 内存无效_编程语言的分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多人在线创作游戏《Roblox》有望在今
- 下一篇: 2020亚太杯数学建模_比赛 | 202