導航:首頁 > 源碼編譯 > 編譯演算法簡化計算嗎

編譯演算法簡化計算嗎

發布時間:2023-08-21 04:33:15

1. 編譯原理

C語言編譯過程詳解
C語言的編譯鏈接過程是要把我們編寫的一個C程序(源代碼)轉換成可以在硬體上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯為機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啟動代碼和用到的庫文件進行組織形成最終生成可執行代碼的過程。過程圖解如下:

從圖上可以看到,整個代碼的編譯過程分為編譯和鏈接兩個過程,編譯對應圖中的大括弧括起的部分,其餘則為鏈接過程。
一、編譯過程
編譯過程又可以分成兩個階段:編譯和匯編。
1、編譯
編譯是讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,源文件的編譯過程包含兩個主要階段:
第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。如#include指令就是一個預處理指令,它把頭文件的內容添加到.cpp文件中。這個在編譯之前修改源文件的方式提供了很大的靈活性,以適應不同的計算機和操作系統環境的限制。一個環境需要的代碼跟另一個環境所需的代碼可能有所不同,因為可用的硬體或操作系統是不同的。在許多情況下,可以把用於不同環境的代碼放在同一個文件中,再在預處理階段修改代碼,使之適應當前的環境。
主要是以下幾方面的處理:
(1)宏定義指令,如 #define a b。
對於這種偽指令,預編譯所要做的是將程序中的所有a用b替換,但作為字元串常量的 a則不被替換。還有 #undef,則將取消對某個宏的定義,使以後該串的出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif等。
這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3) 頭文件包含指令,如#include "FileName"或者#include <FileName>等。
在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。包含到C源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與C源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。
例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
第二個階段編譯、優化階段。經過預編譯得到的輸出文件中,只有常量;如數字、字元串、變數的定義,以及C語言的關鍵字,如main,if,else,for,while,{,}, +,-,*,\等等。
編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼表示或匯編代碼。
優化處理是編譯系統中一項比較艱深的技術。它涉及到的問題不僅同編譯技術本身有關,而且同機器的硬體環境也有很大的關系。優化一部分是對中間代碼的優化。這種優化不依賴於具體的計算機。另一種優化則主要針對目標代碼的生成而進行的。
對於前一種優化,主要的工作是刪除公共表達式、循環優化(代碼外提、強度削弱、變換循環控制條件、已知量的合並等)、復寫傳播,以及無用賦值的刪除,等等。
後一種類型的優化同機器的硬體結構密切相關,最主要的是考慮是如何充分利用機器的各個硬體寄存器存放的有關變數的值,以減少對於內存的訪問次數。另外,如何根據機器硬體執行指令的特點(如流水線、RISC、CISC、VLIW等)而對指令進行一些調整使目標代碼比較短,執行的效率比較高,也是一個重要的研究課題。
2、匯編
匯編實際上指把匯編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段:
代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。
數據段:主要存放程序中要用到的各種全局變數或靜態的數據。一般數據段都是可讀,可寫,可執行的。
UNIX環境下主要有三種類型的目標文件:
(1)可重定位文件
其中包含有適合於其它目標文件鏈接來創建一個可執行的或者共享的目標文件的代碼和數據。
(2)共享的目標文件
這種文件存放了適合於在兩種上下文里鏈接的代碼和數據。
第一種是鏈接程序可把它與其它可重定位文件及共享的目標文件一起處理來創建另一個 目標文件;
第二種是動態鏈接程序將它與另一個可執行文件及其它的共享目標文件結合到一起,創建一個進程映象。
(3)可執行文件
它包含了一個可以被操作系統創建一個進程來執行之的文件。匯編程序生成的實際上是第一種類型的目標文件。對於後兩種還需要其他的一些處理方能得到,這個就是鏈接程序的工作了。
二、鏈接過程
由匯編程序生成的目標文件並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個源文件中的函數可能引用了另一個源文件中定義的某個符號(如變數或者函數調用等);在程序中可能調用了某個庫文件中的函數,等等。所有的這些問題,都需要經鏈接程序的處理方能得以解決。
鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠被操作系統裝入執行的統一整體。
根據開發人員指定的同庫函數的鏈接方式的不同,鏈接處理可分為兩種:
(1)靜態鏈接
在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。
(2) 動態鏈接
在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。
對於可執行文件中的函數調用,可分別採用動態鏈接或靜態鏈接的方法。使用動態鏈接能夠使最終的可執行文件比較短小,並且當共享對象被多個進程使用時能節約一些內存,因為在內存中只需要保存一份此共享對象的代碼。但並不是使用動態鏈接就一定比使用靜態鏈接要優越。在某些情況下動態鏈接可能帶來一些性能上損害。
我們在linux使用的gcc編譯器便是把以上的幾個過程進行捆綁,使用戶只使用一次命令就把編譯工作完成,這的確方便了編譯工作,但對於初學者了解編譯過程就很不利了,下圖便是gcc代理的編譯過程:

從上圖可以看到:
預編譯
將.c 文件轉化成 .i文件
使用的gcc命令是:gcc –E
對應於預處理命令cpp
編譯
將.c/.h文件轉換成.s文件
使用的gcc命令是:gcc –S
對應於編譯命令 cc –S
匯編
將.s 文件轉化成 .o文件
使用的gcc 命令是:gcc –c
對應於匯編命令是 as
鏈接
將.o文件轉化成可執行程序
使用的gcc 命令是: gcc
對應於鏈接命令是 ld
總結起來編譯過程就上面的四個過程:預編譯、編譯、匯編、鏈接。了解這四個過程中所做的工作,對我們理解頭文件、庫等的工作過程是有幫助的,而且清楚的了解編譯鏈接過程還對我們在編程時定位錯誤,以及編程時盡量調動編譯器的檢測錯誤會有很大的幫助的。
是否可以解決您的問題?

2. 關於編譯和編程

編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。
什麼叫編譯程序
編譯程序:是指這樣的程序,它能夠把某種語言的程序轉換成另一種語言的程序,而後者與前者在邏輯上是等價的.如果源語言是諸如FORTRAN,Pascal,C,Ada,Smalltalk或Java這樣的"高級語言",而目標語言如匯編語言之類的"低級語言"這樣的翻譯程序則稱之為編譯程序.
注意編譯程序與解釋程序的區別,一個語言的解釋程序是著樣的程序:它以該語言寫的源程序作為輸入,但不產生目標程序,而是邊解釋邊執行源程序本身.
術語"編譯"的內涵是實現從源語言表示的演算法向目標語言表示的演算法的等價變換.
你說學編程還是學編譯啊?

3. 編程的科普小知識

1.編程是什麼
簡單的說,編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。

計算機雖然功能十分強叢坦大。可以供你上網、打游戲、管理公司人事關系等等,但是沒有程序,它就等於是一堆廢鐵,不會理會我們對它下達的「命令」。

於是,我們要馴服它,只有通過一種方式——程序,這也是我們和計算機溝通的唯一方式。 那程序到底是什麼呢? 程序也就是指令的 *** ,它告訴計算機如何執行特殊的任務。

打個比方說,它好比指導你烹調菜品的菜譜或指揮行駛一路到達目的地的交警(或者交通路標)。沒有這些特殊的指令,就不能執行預期的任務。

計算機也一樣,當你想讓計算機為你做一件事情的時候,計算機本身並不能主動為我們工作,因此我們必須對它下達指令,而它根本不會也不可能聽懂人類自然語言對事情的描述,因此我們必須使用程序來告訴計算機做什麼事情以及如何去做?甚至對最簡單的任務也需要指令,例如如何取得擊鍵,怎樣在屏幕上放一個字母,怎樣在磁碟中保存文件等等。 這么麻煩,連這些東西編程都要考慮!怪不得人家說編程好難!你錯了,其實許多這樣的指令都是現成的,包含在處理晶元中內置於操作系統中,因此我們不必擔心它們工作,他們都是由處理器和操作系統來完成的,並不需要我們來干預這些過程。

上面講到的計算機本身不會主動的做任何事情。因此我們要通過程序的方式來讓計算機為我們「效勞」。

而這個過程就是我們「編」出來的。編程可以使用某一種程序設計語言來實現,按照這種語言的語法來描述讓計算機要做的事情。

我們這里所講的語法和外語中的語法完全兩碼事,這里講的語法只是讀你的程序書寫做出一寫規定而已。 寫出程序後,再由特殊的軟體將你的程序解釋或翻譯成計算機能夠識別的「計算機語言」,然後計算機就可以「聽得懂」你的話了,並會按照你的吩咐去做事了。

因此,編程實際上也就是「人給計算機出規則」這么一個過程。 隨計算機語言的種類非常的多,總的來說可以分成機器語言,匯編語言,高級語言三大類。

電腦每做的一次動作,一個步驟,都是按照已經用計算機語言編好的程序來執行,程序是計算機要執行的指令的 *** ,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過計算機語言向計算機發出命令。

計算機所能識別的語言只有機器語言,即由構成的代碼。但通常人們編程時,不採用機器語言,因為它非常難於記憶和識別。

目前通用的編程語言有兩種形式:匯編語言和高級語言。 匯編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。

它同樣需要編程者將每一步具體的操作用命令的形式寫出來。 匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此匯編源程序一般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。

高級語言是目前絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。

由於省略了很多細節,所以編程者也不需要具備太多的專業知識。 高級語言主要是相對於匯編語言而言,它並不是特指某一種具體的語言,而是包括了很多編程語言,如目前流行的VB、VC、FoxPro、Delphi等,這些語言的語法、命令格式都各不相同。

(1)解釋類:執行方式類似於我們日常生活中的「同聲翻譯」,應用程序源代碼一邊由相應語言的解釋器「翻譯」成目標代碼(機器語言),一邊執行,因此效率比較低,而且不局燃能生成可獨立執行的可執行文件,應用程序不能脫離其解釋器,但這種方式比較靈活,可以動態地調整、修改應用程序。 (2)編譯類:編譯是指在應用源程序執行之前,就將程序源代碼「翻譯」成目標代碼(機器語言),因此其目標程序可以脫離其語言環境獨立執行,使用比較方便、效率較高。

但應用程序一旦需要修改,必須先桐鄭虛修改源代碼,再重新編譯生成新的目標文件(*.OBJ)才能執行,只有目標文件而沒有源代碼,修改很不方便。現在大多數的編程語言都是編譯型的,例如Visual Basic、Visual C++、Visual Foxpro、Delphi等。

這個問題其實很簡單。前面我們講到,程序是人與計算機進行溝通的唯一方式,因此我們要讓計算機為我們服務,就必須有程序,而程序從哪裡來?當然是由我們編寫出來了。

或許你又會問到另一個問題:現在要什麼程序有什麼程序, *** 嘛還要編程呢?這你就錯了,現在的程序雖然很多,需要什麼樣的程序直接到網上不需要很長時間就可以找到類似的,而且有可能就是你所需要的。但是,就好比去買衣服,雖然賣衣服的到處都是,但是哪一件是為你「量身定做」的呢! 程序還能夠做很多事情不同的程序可以完成不同的。
2.科普小知識資料有哪些
科普小知識按研究對象不同可分為自然科學、社會科學和思維科學。

1、自然科學是關於自然現象的各門具體科學,研究自然界的本質和規律。

例如,數學、物理學、化學、天文學、地理學、生物學等等。

2、社會科學是關於社會現象的各門具體科學、力求揭示社會的本質和規律。

例如,經濟學、政治學、軍事學、社會學、管理學、教育學等等。

3、人文科學是關於人類文化現象的各門具體科學、力求揭示社會文化領域的本質和規律。

例如,語言學、歷史學、考古學、倫理學、美學、宗教學等等。

科學知識普及簡稱科普,又稱大眾科學或者普及科學,是指利用各種傳媒以淺顯的、讓公眾易於理解、接受和參與的方式向普通大眾介紹自然科學和社會科學知識、推廣科學技術的應用、倡導科學方法、傳播科學思想、弘揚科學精神的活動。科學普及是一種社會教育。

參考資料

科學的分類.360個人圖書館[引用時間2018-4-4]
3.計算機編程入門
選擇一門編程語言、建立基本的編程思想、注重實驗和學習相關知識。

1、選擇一門編程語言。

雖然目前編程語言有600種左右,但是比較流行的編程語言只有幾十種,所以盡量選擇流行程度比較高的編程語言來入門編程。對於沒有明確編程場景的初學者來說,盡量選擇全場景編程語言,比如Java、Python、C#等就是不錯的選擇,不僅應用范圍廣泛,而且也有大量的開發案例可以參考學習。

2、建立基本的編程思想。

編程語言本身的難度並不高,只要掌握了相應的編程規則就能逐漸建立起自己的編程思想。建立編程思想的第一步是了解編程語言的基本語法規則,以Java語言為例,要掌握各種抽象概念,比如類、對象、屬性、方法等;第二步是了解基本的編程過程,比如類的定義、對象的創建、方法的調用;第三步是學習經典的編程模式。

3、注重實驗。

學習編程語言一定要重視實驗,實驗不僅能夠幫助理解各種抽象概念,也能在一定程度上積累編程經驗。

4、學習相關知識。

在學習編程語言的過程中,也需要同時學習計算機網路、資料庫等相關知識,在當前的雲計算和大數據時代背景下,還需要掌握如何通過雲計算(PaaS)來輔助開發,以及如何利用大數據平台的各種資源。

(3)編譯演算法簡化計算嗎擴展閱讀

注意事項:

1、網上有很多編程社區,編程論壇,以及免費的學習教程、視頻資源等。剛開始學習,除了看書,要親自上手實踐,遇到問題去這些地方查找。

2、要學習電腦編程,對於剛入門的新手來說,一定要多實踐,多敲代碼,遇到bug上網查找,多看看別人的博客、個人網站,向程序員大牛學習。
4.計算機的科學、學問除了編程一大方面還有哪幾個方面
計算機的科學?與計算機有關的學科有:計算機科學,數學,計算機程序設計,軟體工程,計算機工程等。

如你所說的微電子學,電學等都是以上學科的基礎性課程。如學數字電子技術(或稱計算機邏輯),再學計算機組成與結構,再學微機原理介面,學具體的微機(MCU,DSP)。

課程都是一門承接著一門的。以下可做參考:硬體 結構控制和指令系統 演算法和邏輯結構 存儲器結構 馮·諾伊曼結構 哈佛結構 輸入/輸出和數據通信 數字邏輯 邏輯設計 集成電路 計算機系統組織 計算機系統結構 計算機網路 分布式計算 網路安全 計算機系統實現 軟體 系統軟體 操作系統 編譯器 應用軟體 計算機游戲 辦公自動化 網路軟體 CAD軟體 計算機程序 程序設計和程序設計實踐 面向對象技術 程序設計語言 軟體工程 軟體復用 驅動程序 計算機模擬 程序設計方法學 數據和信息系統 數據結構 數據存儲表示 數據加密 數據壓縮 編碼與資訊理論 文件 信息系統 管理信息系統 決策支持系統 - 專家系統 資料庫 信息存儲和數據存取 信息交互與表達 主要的研究領域 形式化基礎 邏輯學 謂詞邏輯 模態邏輯 時序邏輯 描述邏輯 數學 泛代數 遞歸論 模型論 概率論和數理統計 邏輯代數 布爾代數 離散數學 組合數學 圖論 網論 資訊理論 理論計算機科學 形式語言 自動機 可計算性 演算法 計算復雜性 描述復雜性 編譯器 程序設計理論 資訊理論 類型理論 指稱語義 微程序 遺傳演算法 並行計算 計算方法學 人工智慧 計算機圖形學 圖像處理與計算機視覺 模式識別 語音識別 文字識別 簽名識別 人臉識別 指紋識別 模擬與建模 數字信號處理 文檔與文本處理 計算機應用 數值計算 數值分析 定理機器證明 計算機代數 工程計算 計算機化學 計算機物理 生物資訊理論 計算生物學 非數值計算 工廠自動化 辦公室自動化 人工智慧 信息存儲與檢索 符號語言處理 計算機輔助科學 計算機輔助設計 計算機輔助教學 計算機輔助管理 計算機輔助軟體工程 機器人學 多媒體技術 人機交互 電子商務 特定技術 測試基準 機器視覺 數據壓縮 軟體設計模式 數字信號處理 文件格式 信息安全 國際互聯網路 超大規模集成電路設計 網路傳輸協議 網路處理器技術 整數運算器 浮點運算器 矩陣運算處理器 網格 計算科學史 計算機歷史 軟體業歷史 編程思想。
5.科普小知識的內容是什麼
科普小知識的內容是什麼?

科普知識是一種用通俗易懂的語言,來解釋種種科學現象和理論的知識文字。用以普及科學知識為目的。

科普知識涵蓋了科學領域的各個方面,無論是物理、化學、生物各個學科,還是日常生活無不涉及到科普知識。由於其范圍的廣泛性,奠定了科普知識的重要意義和影響。科普知識的重要意義必然要求我們的科普教育必須與時俱進的與我們所提倡的素質教育同行。同步發展。使科普知識,科普教育真正意義上走進人們的生活。科普知識的意義和影響必將是深遠的、長久的。

這里舉兩個例子:

1.為甚麼星星會一閃一閃的?

我們看到星閃閃,這不是因為星星本身的光度出現變化,而是與大氣的遮擋有關。

大氣隔在我們與星星之間,當星光通過大氣層時,會受到大氣的密度和厚薄影響。大氣不是絕對的透明,它的透明度會根據密度的不同而產生變化。所以我們在地面透過它來看星星,就會看到星星好像在閃動的樣子了。

2. 為甚麼人會打呵欠?

當我們感到疲累時,體內已產生了許多的二氧化碳。當二氧化碳過多時,必須再增加氧氣來平衡體內所需。因為這些殘留的二氧化碳,會影響我們身體的機能活動,這時身體便會發出保護性的反應,於是就打起呵欠來。

打呵欠是一種深呼吸動作,它會讓我們比平常更多地吸進氧氣和排出二氣化碳,還做到消除疲勞的作用呢。

……
6.科普小知識
科學知識

1白天,鳥兒們在枝頭穿梭嗚叫,在藍天下自由飛翔,到了晚上,它們和我們人一樣也要休息、睡覺,恢復體力,不過它們睡覺的姿勢可是各不相同的。

2冰糕冒氣是因為外界空氣中有不少眼睛看不見的水汽,碰到很冷的冰糕時,一遇冷就液化成霧滴包圍在冰糕周圍,看上去似乎是冰糕在「冒氣」一樣。

3向日葵的莖部含有一種奇妙的植物生長素。這種生長素非常怕光。一遇光線照射,它就會到背光的一面去,同時它還 *** 背廣義面的細胞迅速繁殖,所以,背光的一面就比向光的一面生長的快,使向日葵產生了向旋光性彎曲。

4蟬的外殼(外骨骼)是堅硬的,不能隨著蟬的生長而擴大,當蟬生長到一定階段時,蟬的外骨骼限制了蟬的生長,蟬將原有的外骨骼脫去,就是蟬蛻。

5蜂先把采來的花朵甜汁吐到一個空的蜂房中,到了晚上,再把甜汁吸到自己的蜜胃裡進行調制,然後再吐出來,再吞進去,如此輪番吞吞吐吐,要進行100~240次,最後才釀成香甜的蜂蜜

6我們看到星閃閃,這不是因為星星本身的光度出現變化,而是與大氣的遮擋有關。大氣隔在我們與星星之間,當星光通過大氣層時,會受到大氣的密度和厚薄影響。大氣不是絕對的透明,它的透明度會根據密度的不同而產生變化。所以我們在地面透過它來看星星,就會看到星星好像在閃動的樣子了。

7當我們感到疲累時,體內已產生了許多的二氧化碳。當二氧化碳過多時,必須再增加氧氣來平衡體內所需。因為這些殘留的二氧化碳,會影響我們身體的機能活動,這時身體便會發出保護性的反應,於是就打起呵欠來。打呵欠是一種深呼吸動作,它會讓我們比平常更多地吸進氧氣和排出二氣化碳,還做到消除疲勞的作用呢。

8蛇的身上有很多鱗片,這是它們身上最外面的一層盔甲。鱗片不但用來保護身體,還可以是它們的「腳」。蛇向前爬行時,身體會呈S形。而每一片在S形外邊的鱗片,都會翹起來,幫助蛇前進時抓住不平的路面。這些鱗片跟蛇的肌肉互相配合,並能推動身體向前爬行,所以蛇沒有腳也可以走動呀!

9我們的頭發中有一種叫「黑色素」的物質,黑色素愈多頭發的顏色便愈黑。而黑色素少的話,頭發便會發黃或變白。人類到了老年時,身體的各種機能會逐漸衰退,色素的形成亦會愈來愈少,所以頭發也會漸漸變白啊

10當別人搔自己時,我們會倍感痕癢,而且不斷大笑;可是,當自己搔自己的時候,我們不單不會大笑,而且更不感痕癢。基於我們的思想上已有了准備,大腦會發出一種 「不會有危險」的訊息,神經亦隨之放鬆,所以便不會大笑起來和感到痕癢了!

11望向大海,很多時也發現海水呈現藍、綠色。可是,當你把海水撈起時,你卻只能看到它像往日的水般,透明無色。原來,海水本身與我們日常所接觸到的水沒有大分別,也是透明的。我們所看到的綠色,其實是海水對光吸收能力而產生出來的現象。只有綠光能被海水吸收,從而反射出來;當海水更深時,綠光也被吸收,海水看上去便成了藍色。

12我們的皮膚表面長著汗毛,而每一個毛孔下都有一條豎毛肌,當受到神經 *** (例如:生氣、害怕、受涼等情況)後,身體的溫度會下降,而豎毛肌便會收縮而令毛發豎立起來,形成雞皮疙瘩。除了有著保溫的作用外,這個生理系統亦可使動物的體型看起來比實際更大,從而嚇退敵人
7.科學小知識大全
科學小知識 冰糕為什麼會冒氣? 冰糕冒氣是因為外界空氣中有不少眼睛看不見的水汽,碰到很冷的冰糕時,一遇冷就液化成霧滴包圍在冰糕周圍,看上去似乎是冰糕在「冒氣」一樣。

向日葵為什麼總是向著太陽? 向日葵的莖部含有一種奇妙的植物生長素。這種生長素非常怕光。

一遇光線照射,它就會到背光的一面去,同時它還 *** 背光一面的細胞迅速繁殖,所以,背光的一面就比向光的一面生長的快,使向日葵產生了向光性彎曲。 蟬為什麼會蛻皮? 蟬的外殼(外骨骼)是堅硬的,不能隨著蟬的生長而擴大,當蟬生長到一定階段時,蟬的外骨骼限制了蟬的生長,蟬將原有的外骨骼脫去,就是蟬蛻。

蜜蜂怎樣釀蜜? 蜂先把采來的花朵甜汁吐到一個空的蜂房中,到了晚上,再把甜汁吸到自己的蜜胃裡進行調制,然後再吐出來,再吞進去,如此輪番吞吞吐吐,要進行100~240次,最後才釀成香甜的蜂蜜。

4. 什麼是編譯原理

問題一:什麼是編譯原理 編譯:就是將程序語言進行翻譯,生成可供用戶直接執行的二進制代碼,即可執行文件。
任務是個比較模糊的概念,指的是操作系統中正在進行的工作,既可以指進程,也可以指程序春坦灶。
程序指的是可以連續執行,並能夠完成一定任務的一條條指令的 *** 。
進程是程序在一個數據 *** 上運行的過程,它是傳統操作系統進行資源分配和調度的一個獨立單位。
線程是一個指令執行序列,是操作系統調度的最小單位。一個或多個線程構成進程,構成一個進激的線程之間共享資源。進程和線程之間的最大區別就是線程不能獨立擁有資源,進程擁有自己的資源。

問題二:編譯原理中V*是什麼意思 V是一個符號 *** ,假設V指的是三個符號a, b, c的 *** ,記為 V = {a, b, c }
V* 讀作「V的閉包」,它的數學定義是V自身的任意多次自身連接(乘法)運算的積,也是一個 *** 。
也就是說,用V中的任意符號進行意多次(包括0次)連接,得到的符號串,都是V*這個 *** 中的元素。
0次連接的結果是不含任何符號的空串,記為 ε
1次連接就是只有一個符號的符號串,比如,a,b, c
2次連接是兩個符號構成的符號串,比如,aa, ab, ac, ba, bb, bc,等等
……
n次連接是一個長度為n、由a、b、c三個符號構成的符號串,比如abaacbbac……
因此,V*包含一切由a,b,c三個符號連接而成的、任意長度的符號串(以及空串ε)

問題三:編譯原理 V+什麼意思,例如下面的例子。。。 v表示終結符和非終結符 *** 。
+表示 *** 中的一個或多個元素構成的串的 *** 。
所以v+表示由一個或多個終結符或非終結符構成的串的 *** 。比如如果a∈VT,A∈VN,那麼a,A,aA,Aa,aAA,AaA等都是v+中的元素。

問題四:誰能夠解釋下編譯原理中什麼是FIRSTVT,和LASTVT,盡量淺顯易懂點謝謝 Firstvt和Lastvt是為了畫算符優先關系表的(就是表裡面填優先大於小於等於的那個)。
然後要注意他們可都是終結符的 *** 。
Firstvt
找Firstvt的三條規則:如果要找A的Firstvt,A的候選式中出現:
A->a.......,即以終結符開頭,該終結符入Firstvt
A->B.......,即以非終結符開頭,該非終結符的Firstvt入A的Firstvt
攻 A->Ba.....,即先以非終結符開頭,緊跟終結符,則終結符入Firstvt
Lastvt
找Lastvt的三條規則:如果要找A的Lastvt,A的候選式中出現:
A->.......a,即以終結符結尾,該終結符入Lastvt
A->.......B,即以非終結符結尾,該非終結符的Lastvt入A的Lastvt
A->.....aB,即先以非終結符結尾,前面是終結符,則終結符入Firstvt

問題五:編譯原理 什麼是語義分析 在編譯原理中,語法規則和詞法規則不同之處在於:規則主要識別單詞,而語法主要識別多個單片語成的句子。詞法分析信孝和詞法分析程序:詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用lex等工具自動生成。語法分析(Syntax *** ysis或Parsing)和語法分析程序(Parser) 語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程序」,「語句」,「表達式」等等.語法分扒扮析程序判斷源程序在結構上是否正確.源程序的結構由上下文無關文法描述.語義分析(Syntax *** ysis) 語義分析是編譯過程的一個邏輯階段. 語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查.語義分析將審查類型並報告錯誤:不能在表達式中使用一個數組變數,賦值語句的右端和左端的類型不匹配.

問題六:編譯原理中,(E)是什麼意思? E→(E)? 10分 就是 字元本身 意思是F產生( E ) 或者 i 比如If語句的開頭 就是 帶括弧的 必須是 if(表達式)這樣的形式 丟了任何即括弧就是其 終結符 「(」 和 「)」.

問題七:大家覺得對編譯器及編譯原理需要掌握到一個什麼程度 我跟你說,編譯原理太有用了。
我是做手機游戲的,現在做一個游戲引擎。既然是引擎,就需要提供抽象的東西給上層使用。這里,我引入了腳本系統。
這個腳本系統包括一堆我根據實際需求自行設計的指令集,包括基本的輸入輸出,四則運算,系統功能調用,函數聲明,調用等等(其實你要是用過lua或者其他游戲腳本你就知道了。)整個結構包括指令集、編譯器、虛擬機等部分。這樣,引擎提供一些基礎服務,比如繪圖,計算位置等,腳本就可以非常簡單控制游戲。甚至快速構建新游戲。你應該知道QUAKE引擎吧?
這里提供給你一個計算器的小程序,應用了EBNF理論,支持表達式,比如(2+3*6)*4+4,你自己體驗一下它的簡潔和強大。
/*
simple integer arithmetic calculator according to the EBNF
-> {}
->+|-
->{}
-> *
-> ( )| Number
Input a line of text from stdin
Outputs Error or the result.
*/
#include
#include
#include
char token;/*global token variable*/
/*function prototypes for recursive calls*/
int exp(void);
int term(void);
int factor(void);
void error(void)
{
fprintf(stderr,Error\n);
exit(1);
}
void match(char expectedToken)
{
if(token==expectedToken)token=getchar();
else error();
}
main()
{
int result;
token = getchar();/*load token with first character for lookahead*/
result = exp();
if(token=='\n')/*check for end of line */
printf(Result = %d\n,result);
else error();/*extraneous cahrs on line*/
return 0;
}
int exp(void)
{
int temp = term();
while((token=='+')||(token=='-'))
switch(token)
{
case '+':
match('+');
temp+=term......>>

問題八:編譯原理中,自動機究竟是什麼. 形式語言
形式語言 是一個字母表上的某些有限長字串的 *** 。一個形式語言可以包含無限多個字串。
語言的形式定義
字母表 ∑ 為任意有限 *** ,ε 表示空串, 記 ∑ 0 為{ε},全體長度為 n 的字串為 ∑ n , ∑ * 為 ∑ 0 ∪∑ 1 ∪…∪∑ n ∪…, 語言 L 定義為 ∑ * 的任意子集。
注記:∑ * 的空子集 Φ 與 {ε} 是兩個不同的語言。
語言間的運算
語言間的運算就是 ∑ * 冪集上的運算。
字串 *** 的交並補等運算。
連接運算:L 1 L 2 = { xy | x 屬於L 1 並且 y 屬於L 2 }。
冪運算:L n = L … L (共 n 個 L 連接在一起),L 0 = {ε}。
閉包運算:L * = L 0 ∪L 1 ∪…∪L n ∪…。
(右)商運算:L 1 /L 2 = {x | 存在 y 屬於L 2 使得 xy 屬於L 1 }。
語言的表示方法
一個形式語言可以通過多種方法來限定自身,比如:
枚舉出各個字串(只適用於有限字串 *** )。
通過 形式文法 來產生(參見 喬姆斯基譜系 )。
通過正則表達式來產生。
通過某種自動機來識別,比如 圖靈機 、 有限狀態自動機 。
自動機
automata
對信號序列進行邏輯處理的裝置。在自動控制領域內,是指離散數字系統的動態數學模型,可定義為一種邏輯結構,一種演算法或一種符號串變換。自動機這一術語也廣泛出現在許多其他相關的學科中,分別有不同的內容和研究目標。在計算機科學中自動機用作計算機和計算過程的動態數學模型,用來研究計算機的體系結構、邏輯操作、程序設計乃至計算復雜性理論。在語言學中則把自動機作為語言識別器,用來研究各種形式語言。在神經生理學中把自動機定義為神經網路的動態模型,用來研究神經生理活動和思維規律,探索人腦的機制。在生物學中有人把自動機作為生命體的生長發育模型,研究新陳代謝和遺傳變異。在數學中則用自動機定義可計算函數,研究各種演算法。現代自動機的一個重要特點是能與外界交換信息,並根據交換得來的信息改變自己的動作,即改變自己的功能,甚至改變自己的結構,以適應外界的變化。也就是說在一定程度上具有類似於生命有機體那樣的適應環境變化的能力。
自動機與一般機器的重要區別在於自動機具有固定的內在狀態,即具有記憶能力和識別判斷能力或決策能力,這正是現代信息處理系統的共同特點。因此,自動機適宜於作為信息處理系統乃至一切信息系統的數學模型。自動機可按其變數集和函數的特性分類,也可按其抽象結構和聯結方式分類。主要有:有限自動機和無限自動機、線性自動機和非線性自動機、確定型自動機和不確定型自動機、同步自動機和非同步自動機、級聯自動機和細胞自動機等。
這可能有你想要的答案
./question/7218281?fr=qrl3

問題九:編譯原理中"(E)"表示什麼 字元( 表達式 字元)

5. 請問編譯原理的詞法分析用C語言編寫的演算法是怎樣的

ε只能出現在NFA中,當然不是為了方便直觀,而是連通NFA和DFA的橋梁。編譯原理講授的不是如何繪制NFA或者DFA,二是告訴讀者怎樣能夠自動實現NFA或DFA的構造。在實際應用中ε可以幫助計算機轉換NFA為DFA,而在屬性文法和語法制導階段,它也是溝通綜合屬性與繼承屬性、執行語義動作不可或缺的一部分。另外ε的使用可以大大簡化文法產生式的構造難度。我記得最初使用ε是為了使得文法體系(字母表)更加完善,但是在實際應用中卻變得應用廣泛(此觀點不一定正確)。 最後想說的是,在編譯中,ε也帶來了不小的麻煩,否則也就不會有諸如「去空產生式」這樣的演算法了:)
採納哦

閱讀全文

與編譯演算法簡化計算嗎相關的資料

熱點內容
伺服器上如何查看伺服器的埠 瀏覽:676
單片機伺服器編譯 瀏覽:768
單口usb列印機伺服器是什麼 瀏覽:859
戰地五開伺服器要什麼條件 瀏覽:954
在word中壓縮圖片大小 瀏覽:253
javatomcat圖片 瀏覽:417
程序員生產智能創意 瀏覽:65
匯和銀行app怎麼登錄 瀏覽:381
騰訊伺服器如何上傳源碼 瀏覽:745
單片機的原理概述 瀏覽:510
火控pdf 瀏覽:267
如何復制雲伺服器centos環境 瀏覽:984
債權pdf 瀏覽:303
紅色番字的app怎麼下載 瀏覽:876
雲伺服器流程教課 瀏覽:702
中國農業銀行app怎麼沒有網 瀏覽:997
幾率表演算法 瀏覽:902
程序員理工科 瀏覽:708
企業郵箱登錄收件伺服器地址 瀏覽:560
計算機思維與演算法設計的重要性 瀏覽:664