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