nlp用什麼編譯器
A. 程序猿專用十大在線編譯器(IDE)整理
1. CodeSandbox(基於 React 的在線代碼沙盒平台) 我常用的
① 主流的腳手架都支持,比如在線create-react-app,vue-cli等(在線 fork 修改),支持 github 登錄(項目導入),也支持 cli 上傳例子,例子可以在線訪問和下載,當然也支持內嵌到其他博客等網頁中。
② 地址:https://codesandbox.io/
③ 圖示
2. CodePen(前端代碼編輯運行的網站)
① CodePen 是一個完全免費的前端代碼託管服務,主要功能有:
② 地址:https://codepen.io/
③ 圖示
3. JSRUN(支持手機端的在線JS編輯器)
① jsrun是一款支持手機端的在線JS編輯器, HTML/CSS/Javascript在線代碼運行工具,js代碼在線測試調試,是runjs的升級版支持vue.js/angular.js的在線編輯器
② 地址:http://jsrun.net/
③ 圖示
4. jsFiddle(前端代碼編輯運行的網站)
① jsFiddle 是一個Web開發人員的練習場,可在線編輯和測試 HTML、CSS、JavaScript代碼片段。在 jsFiddle 編輯的代碼,可以保存,也可分享給其他人,還可嵌入到其他網頁
② 地址:https://jsfiddle.net/
③ 圖示
5. Ideone(C和C++的在線編譯和調試工具,支持其他的60種語言) 我常用
① Ideone是C和C++的在線編譯和調試工具,支持其他的60種語言。這個工具提供許多強大的功能,允許程序員快速高效的編譯源代碼
② 地址:https://www.ideone.com/
③ 圖示
6. Codechef(C,C ++和Java的在線編譯工具)
① 它支持C,C ++和Java,非常接近真正的桌面IDE。這是超快速和易於使用。適合於課堂和作業的學生,練習面試問題。
② 地址:https://www.codechef.com/ide
③ 圖示
7. JDoodle (C,C ++和Java的在線IDE)
① 支持協作代碼。它只是從一個簡單的文本區域開始,您可以粘貼代碼,然後單擊運行。您可以更改命令行參數並在運行該程序之前設置stdin。最適合新的在線編輯器不支持的許多舊語言。
② 地址:https://www.codechef.com/ide
③ 圖示
8. OnlineGDB (在線C,C ++,Java,PHP編譯器) 我常用
① 它支持C,C ++,PHP和Java編譯器。OnlineGDB的獨特功能是,您可以逐步調試您的代碼。一旦代碼被寫入,它可以很容易地格式化,使其看起來不錯。
② 地址:https://www.onlinegdb.com/
③ 圖示
9. GCC資源管理器
① GCC編譯器資源管理器是一個互動式在線編譯器,它顯示編譯後的C++、RISE、GO(以及更多)代碼的匯編輸出。
② 地址:https://gcc.godbolt.org/
③ 圖示
10. plnkr edit在線編輯器
① js的在線編輯器。
② 地址:http://plnkr.co/edit/
③ 圖示
B. NLP第九篇-句法分析
句法分析的基本任務是確定句子的 語法結構 或句子中 詞彙之間的依存關系 。句法分析不是一個自然語言處理任務的最終目標,但它往往是實現最終目標的關鍵環節。
句法分析分為 句法結構分析 和 依存關系分析 兩種。以獲取整個句子的句法結構為目的的稱為 完全句法分析 ,而以獲得局部成分為目的的語法分析稱為 局部分析 ,依存關系分析簡稱 依存分析 。
一般而言,句法分析的任務有三個:
判斷輸出的字元串是否屬於某種語言
消除輸入句子中詞法和結構等方面的歧義
分析輸入句子的內部結構,如成分構成、上下文關系等。
第二三個任務一般是句法分析的主要任務。
一般來說,構造一個句法分析器需要考慮兩部分工作:一部分是語法的形式化表示和詞條信息描述問題,形式化的語法規則構成了規則庫,詞條信息等由詞典或同義詞表等提供,規則庫與詞典或同義詞表構成了句法分析的知識庫;另一部分就是基於知識庫的解析演算法了。
語法形式化屬於句法理論研究的范疇,目前在自然語言處理中廣泛使用的是上下文無關文法(CFG)和基於約束的文法,後者又稱合一文法。
簡單的講,句法結構分析方法可以分為基於規則的分析方法和基於統計的分析方法兩大類。
基於規則的句法結構分析方法的基本思路是,由人工組織語法規則,建立語法知識庫,通過條件約束和檢查來實現句法結構歧義的消除。
根據句法分析樹形成方向的區別,人們通常將這些方法劃分為三種類型:自頂向下的分析方法,自底向上的分析方法和兩者相結合的分析方法。自頂向下分析演算法實現的是規則推導的過程,分析樹從根結點開始不斷生長,最後形成分析句子的葉結點。而自底向上分析演算法的實現過程恰好想法,它是從句子符號串開始,執行不斷規約的過程,最後形成根節點。
基於規則的語法結構分析可以利用手工編寫的規則分析出輸入句子所有可能的句法結構;對於特定領域和目的,利用有針對性的規則能夠較好的處理句子中的部分歧義和一些超語法(extra-grammatical)現象。
但對於一個中等長度的輸入句子來說,要利用大覆蓋度的語法規則分析出所有可能的句子結構是非常困難的,而且就算分析出來了,也難以實現有效的消歧,並選擇出最有可能的分析結果;手工編寫的規則帶有一定的主觀性,還需要考慮到泛化,在面對復雜語境時正確率難以保證;手工編寫規則本身就是一件大工作量的復雜勞動,而且編寫的規則領域有密切的相關性,不利於句法分析系統向其他領域移植。
基於規則的句法分析演算法能夠成功的處理程序設計語言的編譯,而對於自然語言的處理卻始終難以擺脫困境,是因為程序設計語言中使用的知識嚴格限制的上下文無關文法的子類,但自然語言處理系統中所使用的形式化描述方法遠遠超過了上下文無關文法的表達能力;而且人們在使用程序設計語言的時候,一切表達方式都必須服從機器的要求,是一個人服從機器的過程,這個過程是從語言的無限集到有限集的映射過程,而在自然語言處理中則恰恰相反,自然語言處理實現的是機器追蹤和服從人的語言,從語言的有限集到無限集推演的過程。
完全語法分析
基於PCFG的基本分析方法
基於概率上下文無關文法的短語結構分析方法,可以說是目前最成功的語法驅動的統計句法分析方法,可以認為是規則方法與統計方法的結合。
PCFG是CFG的擴展,舉個例子:
PCFG
當然,同一個符號不同生成式的概率之和為1。NP是名詞短語、VP是動詞短語、PP是介詞短語。
基於PCFG的句法分析模型,滿足以下三個條件:
位置不變性:子樹的概率不依賴於該子樹所管轄的單詞在句子中的位置
上下文無關性:子樹的概率不依賴於子樹控制范圍以外的單詞
祖先無關性:子樹的概率不依賴於推導出子樹的祖先節點
根據上述文法,『He met Jenny with flowers』有兩種可能的語法結構:
而且我們可以通過將樹中的所有概率相乘,得到兩棵子樹的整體概率,從中選擇概率更大的子樹作為最佳結構。
與HMM類似,PCFG也有三個基本問題:
給定一個句子W=w1w2…wn和文法G,如何快速計算概率P(W|G)
給定一個句子W=w1w2…wn和文法G,如何選擇該句子的最佳結構?即選擇句法結構樹t使其具有最大概率
給定PCFG G和句子W=w1w2…wn,如何調節G的概率參數,使句子的概率最大
首先是第一個問題,HMM中我們用的是前向演算法和後向演算法來計算觀察序列O概率,相似的,這里我們用的是內向演算法和外向演算法來計算P(W|G) 。
首先我們定義內向變數αij(A),與前向變數相似但又有不同,αij(A)即非終結符A推導出W中字串wiw(i+1)…wj的概率。那P(W|G)自然就等於α1n(S)了,S是起始符號,計算的就是由起始符號S推導出整個句子W=w1w2…wn的概率。
所以只要有αij(A)的遞歸公式就能計算出P(W|G),遞歸公式如下:
根據定義,αii(A)自然就等同於符號A輸出wi的概率;而αij(A)的計算思路是,這個子串wiw(i+1)…wj可以被切成兩部分處理,前一部分wiw(i+1)…wk由非終結符號B生成,後一部分wkw(k+1)…wj由非終結符號C生成,而BC由A生成。這樣將概率依次相乘,即可將一個大問題劃分為兩個小問題處理,兩個小問題又可以進一步劃分直到不能劃分為止,然後遞歸回來得到結果。
這里給一張內向變數計算方法示意圖:
這個問題也可以用外向演算法來解決。
首先定義外向變數,βij(A)是,初始符號S在推導出語句W=w1w2…wn的過程中,產生符號串w1w2…w(i-1)Aw(j+1)…wn的概率(隱含著A會生成wiw(i+1)…wj)。也就是說βij(A)是S推導出除了以A節點為根節點的子樹以外的其他部分的概率。
《統計自然語言處理(第二版)》這本書里講錯了,這里我給出我自己的理解,書里給的演算法步驟如下:
很明顯的錯誤,初始化都把結果初始化了,那這個演算法還算什麼,直接等於1就完了唄。
這是作者對外向變數定義理解模糊的問題,上面給了外向變數的定義,裡面有一句話『隱含著A會生成wiw(i+1)…wj』,那問題在於,A會生成wiw(i+1)…wj,這到底算是條件還是推論。
看這個演算法的初始化的意思,說β1n(A),在A=S的時候,為1,不等於S為0,意思是什麼?意思就是『隱含著A會生成wiw(i+1)…wj』這句話是條件,β1n(S)已經隱含了S生成W=w1w2…wn了,所謂的w1w2…w(i-1)Aw(j+1)…wn也就不存在了,只剩下一個S->S了,所以概率自然為1。
但是在第三步這個地方,作者理解成什麼意思了呢?作者又把『隱含著A會生成wiw(i+1)…wj』這句話當成推論了,認為在β1n(S),里S會生成W=w1w2…wn是推論,那真是就正好了,要求的結果就是S生成W=w1w2…wn,這不就結束了嗎,結果就導致了這個演算法第一步初始化都把結果初始化了。
那我的理解是什麼呢,通過這個公式計算出來的β1n(S),確實是正確的,意義實際上也是包含了『隱含著A會生成wiw(i+1)…wj』這句話是推論,但是右側式子里由於不斷遞歸而產生的β1n(S),是把『隱含著A會生成wiw(i+1)…wj』這句話當條件的,所以計算上沒有問題。
我傾向於為第三步中的β1n(S)加一個星號,以表明意義的不同。
書中還給了個外向變數的計算方法示意圖,我覺得也是莫名其妙:
他說βij(A)是這兩種情況的概率和,這我們知道j比i大,那這圖里這個k既比i小又比j大,這不是搞笑嗎。只能說圖上這倆C就不是一個C,k也不是一個k。
那我為什麼會理解成一個呢,除了字母相同,他前面還這么講『必定運用了形如B->AC或者B->CA的規則』、『運用B->AC或者B->CA兩種規則的情況』,這明顯就是給人以順序交換的誤解。
另外,還在內向變數的使用上前後不一,可以說這本書里對外向演算法的講解是非常失敗的。而且對外向演算法的計算仍然需要用到內向演算法的遞歸,那真的直接用內向演算法就好了,外向演算法還要多定義變數。
然後是第二個問題,選擇句子的最佳結構,也即給定一個句子W=w1w2…wn和文法G,
選定擁有最大概率的語法結構樹。這一問題與HMM中類似,仍然採用動態規劃的思想去解決。最後利用CYK演算法去生成擁有最大概率的語法結構樹。
第三個問題是給定PCFG G和句子W=w1w2…wn,如何調節G的概率參數,使句子的概率最大,與HMM相對的,PCFG這里採用的演算法名叫內外向演算法。與前後向演算法相同,也屬於一種EM演算法,其基本思想是,首先給G的產生式隨機地賦予一個概率值(滿足歸一化條件),得到文法G0,然後根據G0和訓練數據,可以計算出每條規則使用次數的期望值,用期望值進行最大似然估計,得到語法G的新參數值,新的語法記作G1,然後循環執行該過程,G的參數概率將收斂於最大似然估計值。
PCFG只是一種特殊的上下文無關文法模型,根據PCFG的模型和句子,具體去對句子做語法分析,生成語法結構樹,靠的是還是CYK演算法。CYK演算法是一個用來判定任意給定的字元串W是否屬於一個上下文無關文法的演算法。
基於PCFG的句法分析模型存在有許多問題,比如因為PCFG沒有對詞彙進行建模,所以存在對詞彙信息不敏感的問題。因此人們提出了詞彙化的短語結構分析器,有效的提升了基於PCFG的句法分析器的能力。
而且,我們上面也提到了PCFG的三個獨立性假設,這也導致了規則之間缺乏結構依賴關系(就像HMM的三個假設也不完全合理一樣),而在自然語言中,生成每個非終結符的概率往往是與其上下文結構有關系的,所以有人提出了一種細化非終結符的方法,為每個非終結符標註上其父節點的句法標記信息。
D. Klein提出了帶有隱含標記的上下文無關文法(PCFG with latent annotations,PCFG-LA),使得非終結符的細化過程可以自動進行,並且在使用EM演算法優化時,為避免到達局部最優,對其進行了改進,提出了一種層次化的『分裂-合並』策略,以期獲取一個准確並且緊湊的PCFG-LA模型。基於PCFG-LA的Berkeley Parser作為非詞彙化句法分析器的代表,無論是性能表現還是運行速度,都是目前開源的短語結構分析器中最好的。其語法樹如下圖:
普通句法樹與PCFG-LA句法樹對照實例
這個x就是隱含標記,xi的取值范圍一般是人為設定的,一般取1~16之間的整數。而且PCFG-LA也類似於HMM模型,原始非終結符對應HMM模型中的觀察輸出,而隱含標記對應HMM模型中的隱含狀態。
淺層語法分析(局部語法分析)
由於完全語法分析要確定句子所包含的全部句法信息,並確定句子中各成分之間的關系,這是一項十分苦難的任務。到目前為止,句法分析器的各方面都難以達到令人滿意的程度,為了降低問題的復雜度,同時獲得一定的句法結構信息,淺層句法分析應運而生。
淺層語法分析只要求識別句子中的某些結構相對簡單的獨立成為,例如非遞歸的名詞短語、動詞短語等,這些被識別出來的結構通常稱為語塊(chunk)。
淺層句法分析將句法分析分解為兩個主要子任務,一個是語塊的識別和分析,另一個是語塊之間的依附關系分析。其中,語塊的識別和分析是主要任務。在某種程度上說,淺層句法分析使句法分析的任務得到了簡化,同時也有利於句法分析系統在大規模真實文本處理系統中迅速得到應用。
基本名詞短語(base NP)是語塊中的一個重要類別,它指的是簡單的、非嵌套的名詞短語,不含有其他子項短語,並且base NP之間結構上是獨立的。示例如下:
base NP識別就是從句子中識別出所有的base NP,根據這種理解,一個句子中的成分和簡單的分為baseNP和非base NP兩類,那麼base NP識別就成了一個分類問題。
base NP的表示方法有兩種,一種是括弧分隔法,一種是IOB標注法。括弧分隔法就是將base NP用方括弧界定邊界,內部的是base NP,外部的不屬於base NP。IOB標注法中,字母B表示base NP的開端,I表示當前詞語在base NP內,O表示詞語位於base NP之外。
基於SVM的base NP識別方法
由於base NP識別是多值分類問題,而基礎SVM演算法解決的是二值分類問題,所以一般可以採用配對策略(pairwise method)和一比其餘策略(one vs. other method)。
SVM一般要從上下文的詞、詞性、base NP標志中提取特徵來完成判斷。一般使用的詞語窗口的長度為5(當前詞及其前後各兩個詞)時識別的效果最好。
基於WINNOW的base NP識別方法
WINNOW是解決二分問題的錯誤驅動的機器學習方法,該方法能從大量不相關的特徵中快速學習。
WINNOW的稀疏網路(SNoW)學習結構是一種多類分類器,專門用於處理特徵識別領域的大規模學習任務。WINNOW演算法具有處理高維度獨立特徵空間的能力,而在自然語言處理中的特徵向量恰好具有這種特點,因此WINNOW演算法也常用於詞性標注、拼寫錯誤檢查和文本分類等等。
簡單WINNOW的基本思想是,已知特徵向量和參數向量和實數閾值θ,先將參數向量均初始化為1,將訓練樣本代入,求特徵向量和參數向量的內積,將其與θ比較,如果大於θ,則判定為正例,小於θ則判定為反例,將結果與正確答案作比較,依據結果來改變權值。
如果將正例估計成了反例,那麼對於原來值為1的x,把它的權值擴大。如果將反例估計成了正例,那麼對於原來值為1的x,把它的權值縮小。然後重新估計重新更改權重,直到訓練完成。
這其實讓我想到了LR演算法,因為LR演算法也是特徵向量與參數向量的內積,最後將其送到Sigmoid函數中去拿到判定結果,然後大於0.5的為正例,小於0.5的為反例,實際上只要反過來,Sigmod函數輸出0.5時候的輸入就是WINNOW演算法里的那個實數閾值θ。但是區別在於WINNOW演算法只判定大小,不判定概率,而LR利用Sigmoid函數給出了概率。LR利用這給出的概率,通過使訓練集的生成概率最大化來調整參數,而WINNOW則是直接樸素的錯誤情況來增大或縮小相關參數。目測LR因為使用了梯度下降,它的收斂速度要快於WINNOW,而WINNOW的優勢則在於可以處理大量特徵。
基於CRF的base NP識別方法
基於CRF的base NP識別方法擁有與SVM方法幾乎一樣的效果,優於基於WINNOW的識別方法、基於MEMM的識別方法和感知機方法,而且基於CRF的base NP識別方法在運行速度上較其他方法具有明顯優勢。
依存語法理論
在自然語言處理中,我們有時不需要或者不僅僅需要整個句子的短語結構樹,而且要知道句子中 詞與詞之間的依存關系 。用詞與詞之間的依存關系來描述語言結構的框架成為依存語法,又稱從屬關系語法。利用依存語法進行句法分析也是自然語言理解的重要手段之一。
有人認為,一切結構語法現象可以概括為關聯、組合和轉位這三大核心。句法關聯建立起詞與詞之間的從屬關系,這種從屬關系由 支配詞 和 從屬詞 聯結而成, 謂語中的動詞是句子的中心並支配別的成分,它本身不受其他任何成分支配 。
依存語法的本質是一種結構語法,它主要研究以謂詞為中心而構句時由深層語義結構映現為表層語法結構的狀況及條件,謂詞與體詞之間的同現關系,並據此劃分謂詞的詞類。
常用的依存於法結構圖示有三種:
計算機語言學家J. Robinson提出了依存語法的四條公理:
一個句子只有一個獨立的成分
句子的其他成分都從屬於某一成分
任何一個成分都不能依存於兩個或兩個以上的成分
如果成分A直接從屬於成分B,而成分C在句子中位於A和B之間,那麼,成分C或者屬於成分A,或者從屬於B,或者從屬於A和B之間的某一成分。
這四條公理相當於對依存圖和依存樹的形式約束:單一父節點、連通、無環和可投射,由此來保證句子的依存分析結果是一棵有根的樹結構。
這里提一下可投射,如果單詞之間的依存弧畫出來沒有任何的交叉,就是可投射的(參考上面的兩個有向圖)。
為了便於理解,我國學者提出了依存結構樹應滿足的5個條件:
單純結點條件:只有終結點,沒有非終結點
單一父結點條件:除根節點沒有父結點外,所有的結點都只有一個父結點
獨根結點條件:一個依存樹只能有一個根結點,它支配其他結點
非交條件:依存樹的樹枝不能彼此相交
互斥條件:從上到下的支配關系和從左到右的前於關系之間是相互排斥的,如果兩個結點之間存在著支配關系,它們就不能存在於前於關系
這五個條件是有交集的,但它們完全從依存表達的空間結構出發,比四條公理更直觀更實用。
Gaifman 1965年給出了依存語法的形式化表示,證明了依存語法與上下文無關文法沒有什麼不同..
類似於上下文無關文法的語言形式對被分析的語言的投射性進行了限制,很難直接處理包含非投射現象的自由語序的語言。20世紀90年代發展起來了約束語法和相應的基於約束滿足的依存分析方法,可以處理此類非投射性語言問題。
基於約束滿足的分析方法建立在約束依存語法之上,將依存句法分析看做可以用約束滿足問題來描述的有限構造問題。
約束依存語法用一系列形式化、描述性的約束將不符合約束的依存分析去掉,直到留下一棵合法的依存樹。
生成式依存分析方法、判別式依存分析方法和確定性依存分析方法是數據驅動的統計依存分析中具有代表性的三種方法。
生成性依存分析方法
生成式依存分析方法採用聯合概率模型生成一系列依存語法樹並賦予其概率分值,然後採用相關演算法找到概率打分最高的分析結果作為最後輸出。
生成式依存分析模型使用起來比較方便,它的參數訓練時只在訓練集中尋找相關成分的計數,計算出先驗概率。但是,生成式方法採用聯合概率模型,再進行概率乘積分解時做了近似性假設和估計,而且,由於採用全局搜索,演算法的復雜度較高,因此效率較低,但此類演算法在准確率上有一定優勢。但是類似於CYK演算法的推理方法使得此類模型不易處理非投射性問題。
判別式依存分析方法
判別式依存分析方法採用條件概率模型,避開了聯合概率模型所要求的獨立性假設(考慮判別模型CRF舍棄了生成模型HMM的獨立性假設),訓練過程即尋找使目標函數(訓練樣本生成概率)最大的參數θ(類似Logistic回歸和CRF)。
判別式方法不僅在推理時進行窮盡搜索,而且在訓練演算法上也具有全局最優性,需要在訓練實例上重復句法分析過程來迭代參數,訓練過程也是推理過程,訓練和分析的時間復雜度一致。
確定性依存方法
確定性依存分析方法以特定的方向逐次取一個待分析的詞,為每次輸入的詞產生一個單一的分析結果,直至序列的最後一個詞。
這類演算法在每一步的分析中都要根據當前分析狀態做出決策(如判斷其是否與前一個詞發生依存關系),因此,這種方法又稱決策式分析方法。
通過一個確定的分析動作序列來得到一個唯一的句法表達,即依存圖(有時可能會有回溯和修補),這是確定性句法分析方法的基本思想。
短語結構與依存結構之間的關系
短語結構樹可以被一一對應地轉換成依存關系樹,反之則不然。因為一棵依存關系樹可能會對應多棵短語結構樹。
C. 目前比較好用的中文編譯器
無所謂好壞。主流編譯器都可以。
最常用的兩種:
1 VC/VS系列。微軟開發的。與windows兼容性最好。適用於windows軟體開發。
2 gcc系列,包括mingwin, codeblock, devicec等。 對C/C++規范支持最好,是目前執行規范最徹底的編譯器。
對於初學者,任意一個編譯器都是沒區別的。
水平較高的編程人員,可以根據自身常用區域,選擇針對性的編譯器。
D. 學習python建議用什麼編譯器
LLVM後端的numba和支持大部分C++編譯器作為後端的nuitka。
Python由荷蘭數學和計算機科學研究學會的Guido van Rossum於1990 年代初設計,作為一門叫做ABc語言的替代品。
Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。
Python解釋器易於擴展,可以使用C或C++(或者其他可以通過C調用的語言)擴展新的功能和數據類型。Python 也可用於可定製化軟體中的擴展程序語言。Python豐富的標准庫,提供了適用於各個主要系統平台的源碼或機器碼。
Python是一門跨平台的腳本語言,Python規定了一個Python語法規則,實現了Python語法的解釋程序就成為了Python的解釋器。
簡單講,編譯器就是將「一種語言(通常為高級語言)」翻譯為「另一種語言(通常為低級語言)」的程序。
一個現代編譯器的主要工作流程:源代碼 (source code) →預處理器(preprocessor) → 編譯器 (compiler) →目標代碼(object code) →鏈接器(Linker) → 可執行程序(executables)。
高級計算機語言便於人編寫,閱讀交流,維護。機器語言是計算機能直接解讀、運行的。編譯器將匯編或高級計算機語言源程序(Source program)作為輸入,翻譯成目標語言(Target language)機器代碼的等價程序。
源代碼一般為高級語言 (High-level language), 如Pascal、C、C++、Java、漢語編程等或匯編語言,而目標則是機器語言的目標代碼(Object code),有時也稱作機器代碼(Machine code)。
對於C#、VB等高級語言而言,此時編譯器完成的功能是把源碼(SourceCode)編譯成通用中間語言(MSIL/CIL)的位元組碼(ByteCode)。最後運行的時候通過通用語言運行庫的轉換,編程最終可以被CPU直接計算的機器碼(NativeCode)。
E. 新手學C語言用什麼編譯器比較好
1、 visual c++6.0 (win8系統下不好用,C/C++)-Microsoft Visual C++ ;
2、 visual studio (2005、2008、2010、2012、2013)- Microsoft Visual Studio ;
3、 win-tc非常方便:不騙你,2000/XP/7都可以用 ;
4、 Code::Blocks(win7、8都可以用);
5、 Turb C(只能編譯C語言) ;
6、 gcc (GNU編譯器套件) ;
7、 DEV C++;
8、 C-Free;
9、 Borland C++、WaTCom C++、Borland C++ Builder、GNU DJGPP C++、Lccwin32 C Compiler3.1、High C、My Tc等,由於C語言比較成熟,所以編程環境很多;
10、還常用souceinsight ,在工作中還用Labwindows編程,直接調試運行,不過那是有工程背景,有工作經驗的技術人員用的。
最好用第一個
F. R,Python,Scala 和 Java,到底該使用哪一種大數據編程語言
如果你對晦澀的統計運算進行繁重的數據分析工作,那麼你不青睞R才怪。如果你跨GPU進行NLP或密集的神經網路處理,那麼Python是很好的選擇。如果想要一種加固的、面向生產環境的數據流解決方案,又擁有所有重要的操作工具,Java或Scala絕對是出色的選擇。
有一個大數據項目,你知道問題領域(problem domain),也知道使用什麼基礎設施,甚至可能已決定使用哪種框架來處理所有這些數據,但是有一個決定遲遲未能做出:我該選擇哪種語言?(或者可能更有針對性的問題是,我該迫使我的所有開發人員和數據科學家非要用哪種語言?)這個問題不會推遲太久,遲早要定奪。
當然,沒有什麼阻止得了你使用其他機制(比如XSLT轉換)來處理大數據工作。但通常來說,如今大數據方面有三種語言可以選擇:R、Python和Scala,外加一直以來屹立於企業界的Java。那麼,你該選擇哪種語言?為何要選擇它,或者說何時選擇它?
下面簡要介紹了每種語言,幫助你做出合理的決定。
R
R經常被稱為是「統計人員為統計人員開發的一種語言」。如果你需要深奧的統計模型用於計算,可能會在CRAN上找到它――你知道,CRAN叫綜合R檔案網路(Comprehensive R Archive Network)並非無緣無故。說到用於分析和標繪,沒有什麼比得過ggplot2。而如果你想利用比你機器提供的功能還強大的功能,那可以使用SparkR綁定,在R上運行Spark。
然而,如果你不是數據科學家,之前也沒有用過Matlab、SAS或OCTAVE,可能需要一番調整,才能使用R來高效地處理。雖然R很適合分析數據,但是就一般用途而言不太擅長。你可以用R構建模型,但是你需要考慮將模型轉換成Scala或Python,才能用於生產環境,你不太可能使用這種語言編寫一種集群控制系統(運氣好的話,你可以對它進行調試)。
Python
如果你的數據科學家不使用R,他們可能就會徹底了解Python。十多年來,Python在學術界當中一直很流行,尤其是在自然語言處理(NLP)等領域。因而,如果你有一個需要NLP處理的項目,就會面臨數量多得讓人眼花繚亂的選擇,包括經典的NTLK、使用GenSim的主題建模,或者超快、准確的spaCy。同樣,說到神經網路,Python同樣游刃有餘,有Theano和Tensorflow;隨後還有面向機器學習的scikit-learn,以及面向數據分析的NumPy和Pandas。
還有Juypter/iPython――這種基於Web的筆記本伺服器框架讓你可以使用一種可共享的日誌格式,將代碼、圖形以及幾乎任何對象混合起來。這一直是Python的殺手級功能之一,不過這年頭,這個概念證明大有用途,以至於出現在了奉行讀取-讀取-輸出-循環(REPL)概念的幾乎所有語言上,包括Scala和R。
Python往往在大數據處理框架中得到支持,但與此同時,它往往又不是「一等公民」。比如說,Spark中的新功能幾乎總是出現在Scala/Java綁定的首位,可能需要用PySpark編寫面向那些更新版的幾個次要版本(對Spark Streaming/MLLib方面的開發工具而言尤為如此)。
與R相反,Python是一種傳統的面向對象語言,所以大多數開發人員用起來會相當得心應手,而初次接觸R或Scala會讓人心生畏懼。一個小問題就是你的代碼中需要留出正確的空白處。這將人員分成兩大陣營,一派覺得「這非常有助於確保可讀性」,另一派則認為,2016年,我們應該不需要就因為一行代碼有個字元不在適當的位置,就要迫使解釋器讓程序運行起來。
Scala
現在說說Scala:在本文介紹的四種語言中,Scala是最輕松的語言,因為大家都欣賞其類型系統。Scala在JVM上運行,基本上成功地結合了函數範式和面向對象範式,目前它在金融界和需要處理海量數據的公司企業中取得了巨大進展,常常採用一種大規模分布式方式來處理(比如Twitter和LinkedIn)。它還是驅動Spark和Kafka的一種語言。
由於Scala在JVM裡面運行,它可以立即隨意訪問Java生態系統,不過它也有一系列廣泛的「原生」庫,用於處理大規模數據(尤其是Twitter的Algebird和Summingbird)。它還包括一個使用非常方便的REPL,用於互動式開發和分析,就像使用Python和R那樣。
我個人非常喜歡Scala,因為它包括許多實用的編程功能,比如模式匹配,而且被認為比標準的Java簡潔得多。然而,用Scala來開發不止一種方法,這種語言將此作為一項特色來宣傳。這是好事!不過考慮到它擁有圖靈完備(Turing-complete)的類型系統和各種彎彎曲曲的運算符(「/:」代表foldLeft,「:\」代表foldRight),很容易打開Scala文件,以為你看到的是某段討厭的Perl代碼。這就需要在編寫Scala時遵循一套好的實踐和准則(Databricks的就很合理)。
另一個缺點是,Scala編譯器運行起來有點慢,以至於讓人想起以前「編譯!」的日子。不過,它有REPL、支持大數據,還有採用Jupyter和Zeppelin這一形式的基於Web的筆記本框架,所以我覺得它的許多小問題還是情有可原。
Java
最終,總是少不了Java――這種語言沒人愛,被遺棄,歸一家只有通過起訴谷歌才有錢可賺時才似乎關心它的公司(註:Oracle)所有,完全不時髦。只有企業界的無人機才使用Java!不過,Java可能很適合你的大數據項目。想一想Hadoop MapRece,它用Java編寫。HDFS呢?也用Java來編寫。連Storm、Kafka和Spark都可以在JVM上運行(使用Clojure和Scala),這意味著Java是這些項目中的「一等公民」。另外還有像Google Cloud Dataflow(現在是Apache Beam)這些新技術,直到最近它們還只支持Java。
Java也許不是搖滾明星般備受喜愛的首選語言。但是由於研發人員在竭力理清Node.js應用程序中的一套回調,使用Java讓你可以訪問一個龐大的生態系統(包括分析器、調試器、監控工具以及確保企業安全和互操作性的庫),以及除此之外的更多內容,大多數內容在過去二十年已久經考驗(很遺憾,Java今年迎來21歲,我們都老矣)。
炮轟Java的一個主要理由是,非常繁瑣冗長,而且缺少互動式開發所需的REPL(R、Python和Scala都有)。我見過10行基於Scala的Spark代碼迅速變成用Java編寫的變態的200行代碼,還有龐大的類型語句,它們占據了屏幕的大部分空間。然而,Java 8中新的Lambda支持功能對於改善這種情況大有幫助。Java從來不會像Scala那麼緊湊,但是Java 8確確實實使得用Java進行開發不那麼痛苦。
至於REPL?好吧,目前還沒有。明年推出的Java 9會包括JShell,有望滿足你的所有REPL要求。
G. 常見的C語言編譯器是什麼
目前最流行的C語言編譯器有以下幾種:
1、GNU Compiler Collection 或稱GCC
GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的編程語言編譯器。它是以GPL許可證所發行的自由軟體,也是 GNU計劃的關鍵部分。
GCC原本作為GNU操作系統的官方編譯器,現已被大多數類Unix操作系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。GCC是自由軟體過程發展中的著名例子,由自由軟體基金會以GPL協議發布。
2、Microsoft C 或稱 MS C
Microsoft C 是c語言的一種IDE(集成開發環境),常見的還有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C等等......
3、Borland Turbo C 或稱 Turbo C
Turbo C是美國Borland公司的產品,Borland公司是一家專門從事軟體開發、研製的大公司。該公司相繼推出了一套 Turbo系列軟體, 如Turbo BASIC, Turbo Pascal, Turbo Prolog, 這些軟體很受用戶歡迎。
(7)nlp用什麼編譯器擴展閱讀:
C編譯的整個過程很復雜,大致可以分為以下四個階段:
1、預處理階段在該階段主要完成對源代碼的預處理工作,主要包括對宏定義指令,頭文件包含指令,預定義指令和特殊字元的處理,如對宏定義的替換以及文件頭中所包含的文件中預定義代碼的替換等,總之這步主要完成一些替換工作,輸出是同源文件含義相同但內容不同的文件。
2、編譯、優化階段編譯就是將第一階段處理得到的文件通過詞法語法分析等轉換為匯編語言。優化包括對中間代碼的優化,如刪除公共表達式,循環優化等;和對目標代碼的生成進行的優化,如如何充分利用機器的寄存器存放有關變數的值,以減少內存訪問次數。
3、匯編階段將匯編語言翻譯成機器指令。
4、鏈接階段鏈接階段的主要工作是將有關的目標文件連接起來,即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的目標文件成為一個能夠被操作系統裝入執行的統一整體。
H. python有什麼好的入門教程用什麼編譯器呢
python是一門動態解釋性語言不像c語言一樣還有編譯器,動態語言都是對應一個解釋器,python的解釋器有很多版本,其中用得最多最廣泛的是cpython,大家一提python基本就是值得喜歡個版本,目前cpython已經更新到3.9版本,希望可以幫到你
I. 學python用什麼編譯器啊,哪位大佬推薦一下
1、CPython
是Python語言規范的參考實現,能夠優先獲得Python語言的最新、最強的功能,CPython是由C語言編寫而成,不但可以從Python代碼中調用C代碼的函數,還可以直接在Python中使用大量現有的C代碼庫。
2、Brython
Brython可用於在瀏覽器中運行包含了Python 3腳本的Web應用。
3、PyPy Python
雖然第一個推薦的是在Python中使用最廣泛的編譯器,但卻不是最快的,PyPy採用的是即時的編譯概念,在代碼執行前,就直接編譯為機器代碼,因此其執行速度提高了近4倍。
4、Jython或JPython
使用率第二高,Jython最初被稱為JPython,是通過Python語言來實現Java虛擬機的,開發者既可以將現有的Java包和代碼庫,導入自己的Python程序中,還可以在Java程序中嵌入Python腳本。
5、Cython
Cython與CPython不同,更像是一個超集,允許開發者在代碼中結合C和Python,從而生成C語言代碼類型的輸出,以供任何一種C/C++編譯器進行後續編譯。
6、Skulpt
流行的速度非常快,主要目的是提供一種良好的在線式Python編譯器,也可以通過讓Web應用引擎包含Skulpt,以方便開發者編寫出被用於前端的Python腳本。
7、PyJS
是另一款完全用Python去開發Web應用的編譯工具,在後台,PyJS會在使用內置的Ajax框架之前,將Python代碼編譯為JavaScript。
8、WinPython
是Python的"即用型"發行版,也就意味著用戶無需安裝,即可在Windows PC上運行,作為另一種Python的實現,WinPython編譯器不僅帶來了Python執行環境,而且還包含了諸如:Scipy、Numpy、以及Pandas等各種Python庫。