俄羅斯娃娃 C. 分層程式語言系統

讓我們試試想像沒有門捷列夫週期表(1869)的化學。 有多少元素必須牢記在心,並且沒有特定的順序......(然後 - 60。)

要做到這一點,只需同時考慮一種或多種程式語言即可。 同樣的感受,同樣的創意混亂。

現在,我們可以重溫 XNUMX 世紀化學家在一張元素週期表中獲得所有知識(甚至更多知識)時的感受。

俄羅斯娃娃 C. 分層程式語言系統


《俄羅斯娃娃 C.》一書《程式語言分層體系》將C語言的各個單元一目了然。 這使您可以組織它們,糾正過時的信息,甚至澄清程序的概念。

今天,程式設計資訊比 150 年前的化學元素更需要係統化。

第一個需要是教學。 當門捷列夫面臨從哪個元素開始講課的問題時,他開始創建他的系統:O、H、N、He、Au…同時,這對他來說更容易- 他向最優秀的學生教授化學聖彼得堡大學。 學校已經教授編程,很快將在幼兒園開始教授。

第二個需要是科學的方法。 在元素週期表的幫助下,新元素被發現,舊元素資訊被修正。 她幫助創建了原子模型(1911)。 等等。

第三個需要是澄清程序的概念。

現代程式設計的一隻腳還停留在 50 世紀 XNUMX 年代。 那時候,程式很簡單,但機器和機器語言很複雜,所以一切都圍繞著機器和語言。

現在一切都相反了:程序是複雜的、主要的,語言是簡單的、次要的。 這稱為應用方法,每個人似乎都很熟悉。 但學生和開發人員仍然相信一切都是一樣的。

這讓我們回到了私人講師門捷列夫的第一堂課。 對新生說些什麼? 真相在哪裡? 就是那個問題。

《Matryoshka C》一書給了這個問題的答案。 程式語言的分層系統」。 此外,它不僅針對學生,也針對經過訓練的程式設計師,因為正是他們,即我們,必須尋求真理並改變世界觀。

以下是本書的摘要。

1。 介紹

1969 年,C 語言誕生,成為基本的程式語言,並維持了 50 年。 為什麼會這樣呢? 首先,因為C是 已申請 提供程式的語言 人道 改為查看 機器。 這項成就是由 C 家族的語言實現的:C++、JavaScript、PHP、Java、C# 等。 其次,它是一種簡短而優美的語言。

然而,C 語言本身通常與機器彙編程式混合在一起,使其感知變得複雜和扭曲。 另一個極端是將某種「哲學」強加在語言上:過程式、物件式、函數式、編譯式、解釋式、類型化等等。 這增加了情感,但無助於更好地描述語言。

真理位於中間,對於 C 語言來說,它嚴格地位於哲學感知和機器感知之間。

C語言並不是獨立的,它服從普通的書面語言,同時又控制著組合語言本身。 這個位置描述了 程式的語音模型,根據該程式將程式分為三個從屬類型:語音、代碼、指令。 C語言負責第二個,代碼類型。

確定了語言在程式中的位置後,您可以組織有關它的信息,這使得 分層程式語言系統,以週期系統的精神代表 C 語言 - 在一頁。

該系統的建構考慮到 應用語言社群,源自於他們的言語從屬地位。 一套套娃 C 單元可讓您描述和比較不同的語言,創建一系列娃娃:C++、PHP、JavaScript、C#、MySQL、Python 等。 不同的語言以基本語言的單位來描述是值得且正確的。

2. 第 1 章. 程式的語音模型。 清除C

第一章介紹 程式的語音模型,反映了一種應用方法。 據他介紹,該程序有三種明顯的順序類型:

  1. 演講 - 解決問題的程式設計師的直接演講,
  2. 編碼 - 用 C 語言(或任何其他語言)將解決方案編碼為數學形式
  3. 和命令 - 直接機器命令。

語音模型解釋了為什麼 C 是一種簡單易懂的語言。 習是建立在我們熟悉的人類語言的形象和相似之處的。

第一種程式是程式設計師的直接講話。 言語對應人類的思維。 初級程式設計師使用語音編寫程式 - 首先用俄語,然後逐步將操作翻譯成程式語言。 C語言正是在這個模型上誕生的。

程式設計師以語音表達的結論被轉換為編碼的數字形式。 這種轉變應該稱為 反射,因為語音和代碼具有相同的性質(反射 - 出生 - 性別)。 如果我們比較程式的語音(左側)和程式碼(右側)類型,這一點非常明顯。

俄羅斯娃娃 C. 分層程式語言系統

奇怪的是,反射的發生非常簡單——只有兩種類型的表達式。

然而,C 語言的現代描述(從 1978 年開始)並沒有包含足夠的名稱列表來總體描述該語言,或具體描述反射任務。 因此,我們不得不發揮創意並引入這些名稱。

詞語的選擇必須準確、清晰。 這需要一種特殊的方法,簡單表述如下:嚴格使用母語。 對英國人來說,那就是英國人,但我們不是英國人。 所以我們將利用我們所擁有的一切並嘗試說俄語。

反射由兩種類型的表達式執行:

  1. 計算 (HF) - 反映物件屬性的變化。 物件的屬性用數字來表示,那麼對屬性的操作就是對數字的操作-操作。
  2. 從屬 (Pch) - 反映動作順序的變化。 Pch的原型是一個語音複合句,因此大多數類型的Pch都以從屬連接詞“if”、“otherwise”、“while”、“for”開頭。 其他類型的個人電腦對它們進行補充。

順便說一句,你能相信在 C 語言的描述中沒有計算表達式的名稱嗎?它們簡稱為「表達式」? 此後,對於從屬類型沒有名稱和關聯,並且實際上缺乏名稱、定義和概括,就不再令人驚訝了。 這是因為著名的 K/R(《C 語言》,Kernighan/Ritchie,1978)不是描述,而是使用該語言的指南。

但是,我仍然想要對該語言的描述。 因此他被提供 分層程式語言系統.

3. 第 2 章. 圖層系統。 簡介C

任何描述都必須準確且極為簡潔。 對於程式語言來說,正面描述是很困難的。

這裡我們有一個程式。 它由模組組成。 模組由子程式和集合(結構)組成。 子程式由單獨的表達式組成:宣告、計算、從屬關係。 隸屬的種類多達十種。 從屬關係連接子層級和子程式。 還有幾個廣告。 然而,聲明不僅包含在子程式和子層級中,還包含在模組和集合中。 大多數表達方式都包含難以描述的單詞,因此通常簡單地以兩個列表給出 - 原始單詞和派生單詞,您將在學習和使用該語言的過程中逐漸熟悉這些單詞。 讓我們加入標點符號和一些其他表達式。

在這樣的演講中,很難理解誰站在誰那邊。

描述語言的直接分層方法會過於複雜。 迂迴搜尋導致根據語言的語音性質和命令方面對語言進行描述。 因此,層系統誕生了,與門捷列夫的週期系統部分重合,這也是 層數。 其出版 42 年後(1869 年)證明,該系統的周期性與電子有關。 層數 (1911 年,玻爾-盧瑟福原子模型)。 此外,分層系統和週期系統在一頁上所有單元的表格排列方面是相似的。

語言單元的描述很簡短——只有10種表達方式和8種其他單元,並且有意義和直觀。 儘管對於初次相識來說很不尋常。

語言單元分為6個等級:

  1. 單位 - 表行
  2. 部門 - 屬的特殊群體(第一線的部分)
  3. 屬 - 細胞(主要分裂水平)
  4. superspecies - 物種分隔符號(稀有等級)
  5. types - 單位公式位於儲存格底部或單獨
  6. 模式 - 單位本身(僅適用於單字)

範例詞描述 字典 - 由相同的六個層級組成的獨立子系統。

C 語言的語音成分是相當明顯的,儘管它仍然值得描述。 但語言的命令部分恰恰與編譯控制相關,在編譯控制期間創建了第三種類型的程式-命令。 下面我們就來談談C語言最令人興奮的面向:美。

4. 以下章節。 司帥

C語言是現代程式設計的基礎。 為什麼? 首先,由於與言語的最大對應性。 其次,因為它完美地繞過了機器數位處理的限制。

習近平具體提出了什麼建議? 圖像和圖層。

「圖像」一詞是英文單字「type」的翻譯,它來自希臘文「原型」—「類型」。 在俄語中,「類型」一詞並沒有傳達所表達概念的基石;而且,它與輔助意義「類型」混淆。

最初,圖像解決了純粹的機器計算問題,然後成為物件語言誕生的跑道。

這層立即解決了幾個問題——包括機器問題和應用問題。 因此,我們將從單任務影像開始考慮,然後轉向多任務層。

歷史規劃的令人不快的特徵之一是大多數概念,包括基本概念,都是在沒有定義的情況下給出的。 「程式語言(河流的名稱)有整數和浮點數類型…」他們進一步抓了下去。 沒有必要定義什麼是「類型」(圖像),因為作者自己並不完全理解這一點,並且會「為了清楚起見」而掩蓋它。 如果它們被釘在牆上,它們就會給出一個模糊且無用的定義。 隱藏在外來詞後面有很大幫助:對於俄羅斯作家來說,隱藏在英語(類型)後面,對於英國人來說,隱藏在法語(子例程)、希臘語(多態性)、拉丁語(封裝)或其組合(臨時多態性)後面。

但這不是我們的命運。 我們的選擇是用純俄語的凸起面罩進行定義。

圖片

圖片 是數量的象徵性名稱,定義 1) 數量的內在屬性和 2) 數量的操作選擇。

「類型」(type)一詞對應於定義的第一部分:「數量的內在屬性」。 但該圖像的主要含義在第二部分:「對數量的操作的選擇」。

在C中引入影像的起點是普通計算,例如加法運算。

數學,無論是手寫的還是印刷的,對數字類型沒有太大區別,通常假設它們是真實的。 因此,它們的處理操作是明確的。

數學嚴格地將數字分為整數和分數。 不同類型的數字在記憶體中的儲存方式不同,並由不同的處理器指令處理。 例如,整數和分數相加的指令是對應於兩個不同處理器節點的兩個不同指令。 但沒有用於添加整數和小數參數的命令。

應用 數學,即 C 語言,將數字的類型分開,但將運算組合在一起:整數和/或分數的加法用一個動作符號編寫。

概念圖的明確定義讓我們可以明確地談論另外兩個概念: и 手術.

幅度和操作

— 正在處理的數量。

手術 — 處理初始值(參數)的值以獲得最終數字(總數)。

幅度和操作是相互關聯的。 每個操作都是一個量,因為它有一個數字結果。 每個值都是與處理器暫存器之間傳送一個值的結果,也就是運算的結果。 儘管存在這種關係,但最主要的是它們單獨描述的可能性,儘管一個單字在字典的不同部分中重複,這就是 MA3 中發生的情況。

機器方法將程式設計師所使用的所有數字分為 命令 и 數據。 以前都是數字,例如指令都是用數字代碼寫的。 然而,在應用語言中,命令不再是數字,而是變成了 用文字 и 行動跡象。 只有「數據」仍然是數字,但繼續這樣稱呼它們是荒謬的,因為在從機器到數學觀點的轉變中,數字是除以原始的量(數據)和最終的(必需的)。 「未知數據」聽起來很愚蠢。

這些團隊也分為兩種類型的行動:數學和服務。 數學動作-運算。 我們稍後會討論官方的內容。

在C語言中,通常的紙和機器明確的,或單一的,數學運算幾乎普遍變成多重的。

多個操作是具有不同類型參數和不同但含義相似的操作的同名操作。

整數參數對應於整個運算,小數參數對應於小數運算。 這種差異在除法運算期間尤其明顯,此時表達式 1/2 給出的總數為 0,而不是 0,5。 這樣的表示法並不符合紙上數學的規則,但 C 語言並不努力遵守它們(與 Fortran 不同)——它按照自己的方式發揮作用 應用 規則。

在混合整數和分數的情況下,僅包含正確的一個 轉換參數值 — 將數值從一幅影像選擇性地轉換為另一幅影像。 確實,當整數和小數相加時,結果是小數,所以運算的圖像 拿起 將整數參數轉換為小數值的操作。

仍有多項操作 多種的單身的。 此類運算僅針對一種類型的參數定義:除法餘數 - 整數參數,堆疊(位元運算) - 自然整數。 Ma3指示操作的多重性,其中符號(#^)指示為其定義操作的圖像。 這是每個操作的一個重要但以前被忽略的屬性。

所有函數都是任意單元操作。 例外的是運營商 - 非括號函數,內建於語言中(原始操作)。

協助

協助 - 伴隨操作的動作。

如果我們將操作視為主要操作,那麼我們可以區分提供該操作並與之不同的兩個伴隨操作。 它們是 1) 可變控制和 2) 從屬關係。 這個動作稱為 協助.

這裡需要離題,單獨說一下程式教材的俄文翻譯。 K/R文本中引入了一個新詞來記錄動作 聲明 (表達式),它試圖將機器命令的概念劃分為不同的操作:1)操作,2)聲明,3)從屬(稱為「控制結構」)。 這一嚐試被俄語翻譯者埋葬,用“運算符”一詞取代了“表達”,其中:

  1. 已成為機器詞「命令」的代名詞,
  2. 原來是「行動的標誌」這個短語的同義詞,
  3. 並且還獲得了無限數量的附加價值。 也就是變成了類似英文文章「uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh」的東西

考慮伴隨的行動,或者 協助.

變數控制

變數控制 (UP) - 建立/刪除變數儲存格。
UE 在宣告變數時隱含發生,而該變數已因另一個原因而寫入 - 指示值的圖像。 僅明確管理一個視圖 附加變數 使用 malloc() 和 free() 函數。

應該指出的是,隱式動作更方便編寫,因為它們根本不需要編寫任何內容,但它們更難以理解 - 它們更難以考慮和解釋。

普奧德契尼涅尼耶

普奧德契尼涅尼耶 — 連接/停用層部分。

C語言提供了一種與彙編程式不同的控制動作順序的應用方法—從屬關係。 它反映和發展了一個語音複雜句子,明確分為主要部分(從屬子句)和從屬部分(子級/子程序部分)。

聲明和提交都完全建立在這個概念上 .

是有限的單級選擇性表達式集。

此層同時顯性和隱性地承擔多項任務:

  1. 組織節目
  2. 限制名稱的可見性(隱式),
  3. 變數(儲存單元)的管理(隱式),
  4. 從屬子句的定義,
  5. 功能和選擇的定義等。

機器語言中沒有層的概念,所以它沒有出現在K/R中,如果沒有的話,那麼在後續書籍中引入它就是異端和自由思想。 因此,層的概念根本沒有出現,儘管它非常有用且非常明顯。

沒有一層,就不可能簡單清晰地解釋程序的許多動作和規則。 例如,為什麼簡單的三戈比的 goto 不好,而棘手的 while 卻好。 你只能無奈地咒罵,就像Dijkstra那樣(「程式設計師的技能是一個函數,與程式中goto語句出現的頻率成反比。」總之,只有山羊才用goto,理由的程度就是上帝。)確實,如果你的書我們根本不需要解釋任何事情,這並不那麼可怕,但是,正如我們已經說過的,這不是我們的命運。

順便說一句,可以假設 Dan Ritchie 將 goto 精確地留下來作為搜尋某些未命名概念的關鍵,因為 goto 表達式沒有必要或美麗。 但是,需要對新的語言原理進行簡單易懂的解釋,而里奇本人並不想給出這種解釋,而這些解釋正是基於這個概念 .

偏差

偏差 — 變更新名稱的常用屬性。

最重要的偏差恰恰與程式的圖層屬性有關,用「靜態」一詞來描述,在每種類型的圖層中都有不同的意義。

5. 最後一章。 應用語言的共通性

應用語言有 比喻的 語言(有圖像,“打字”)。 它們基於影像的顯式或隱式使用。 而且,這裡又出現了一個矛盾:清晰的影像更容易理解,但不太方便,反之亦然。

俄羅斯娃娃 C. 分層程式語言系統

(表格佈局尚未交付,因此表格以圖片形式顯示。)

C之後,應用語言的發展走上了增加形象化的道路。 對於理解高意象最重要的是C的直系後代-C++語言。 他提出了任意選擇數量運算的想法,並在合成表達式選擇的基礎上具體化了它,並獲得了一個新名稱——物件。 然而,由於新集合類型及其相關規則的重載,C++ 並不像 C 那樣簡潔和富有表現力。 順便說一下「超載」。

重載和多型

「過載」這個詞是一個過時的機器學習術語,用於創建 多次操作.

機器(系統)程式設計師 複數 運算很可能很煩人:「這個符號 (+) 是什麼意思:整數相加、分數相加,甚至移位?! 我們那個時代可不是這樣寫的!” 因此,所選詞具有負面意義(「過度殺戮」、「疲倦」)。 對應用程式設計師來說,多重操作是 C 語言的基石、主要成就和遺產,如此自然以至於它們常常不被認識。

在C++語言中 複數 不僅擴展到原始操作,還擴展到函數(單獨的函數和組合成類別的方法)。 多種方法帶來了在擴展類別中重寫它們的能力,這被模糊地稱為“多態性”。 多態性和過載的結合產生了一種爆炸性的混合物,分裂成兩種多態性:「真實」和「暫時」。 儘管指定了名稱,但只有這樣才能理解這一點。 廣告之路是由外國名字鋪成的。

「過載」形式的聲明最好用這個字來表達 附加公告 — 新增具有不同影像參數的同名函數的宣告。

「多態性」形式的聲明較適合稱為 重新宣布 — 具有相同影像參數的同名函數的新擴充層中的重疊宣告。

那麼就很容易理解不同影像(參數)相同的方法了—— 另外宣布,和一張圖像 - 重新宣布.

俄語單字決定。

跑道

對高度比喻語言的概念的考慮證實了基本概念的清晰定義的重要性。 如果正確地描述了 C,學習高階語言將會變得輕鬆而愉快。

這對於 隱含的高度比喻語言 (PHP、JavaScript)。 對他們來說,物件(複合影像)的重要性變得比 C++ 中更高,但影像的概念變得隱含且難以捉摸。 從方便的角度來看,它們變得更加簡單,但從理解的角度來看,它們變得更加困難。

因此,你應該從C語言開始學習程式語言,並按照C家族語言出現的順序進一步推進。

描述語言也是如此。 不同的語言具有與 C 語言相同或更少的單位性別集。 類型和樣本的數量可能在兩個方向上都不同:C++ 的類型比 C 多,而 JavaScript 的類型少。

MySQL 語言值得特別提及。 看似沒有什麼共同點,但俄羅斯娃娃卻完美地描述了他,了解他變得更快更容易。 考慮到網路對現代程式設計的美食之路的重要性,這一點很重要。 哪裡有 MySQL,哪裡就有其他 SQL。 好吧,一旦他們接觸到各種 Fortran-Pascal-Python,Matryoshka 也會對其進行描述。

因此,偉大的事物等待著我們——C 語言的應用描述和後續語言的統一描述。 「我們的目標很明確,我們的任務也很明確。 同志們,開始工作吧! (雷鳴般的、經久不息的掌聲,變成了鼓掌。大家起立。)”

我們將非常重視您的意見,我們將非常感謝您對創建嵌套娃娃網站的幫助。 有關這本書的更完整資訊位於網站上,巧妙地隱藏在 Matryoshka C 中。

來源: www.habr.com

添加評論