ml編譯器
㈠ ML是什麼意思
是男女雙方最高境界的交流 通俗地說,就是性生活。 英文:make love.ML的相關資源 這里是我找到的一些ML相關的資源: SML New Jersey --> http://www.smlnj.org/ 最著名的SML編譯器——Standard ML New Jersey的官方網站。其中還可以找到很多SML相關的內容 Programming in Standard ML --> http://www.cs.cmu.e/afs/cs/usr/rwh/public/www/introsml/ 我喜歡的一本Carnegie Mellon University使用的ML教科書——Programming in Standard ML。你也可以從我這里下載。 將Emacs作為SML的開發環境 目前有兩個常用的SML的Emacs mode。一個是 Stefan Monnier寫的,功能強大一些。可以從這里下載。SML/NJ的網站上有它的文檔。 一個在線教程 Programming in Standard ML '97: On-line Tutorial --> http://www.dcs.ed.ac.uk/home/stg/NOTES/ SML的Basic Library文檔 如果要用ML寫能實際干點事情的程序,離了Standard ML Basic Library是不行的。SML/NJ編譯器安裝時已經包含了Basic Library,你可以直接使用。如果需要查文檔(其實是必然需要的:-)),請看這里。 ML編程環境的配置 我在Windows環境下使用Emacs作為ML的集成開發環境。下面關於Emacs和SML在Windows下的配置說明其實同樣適合於各種Unix類操作系統)。這里有一副抓圖:在左邊的frame中編輯好SML源程序後,按下C-c C-b,程序就交付給運行在右邊frame中的SML編譯器了。你也可以直接在右邊的frame中互動式的輸入SML程序。 為了配置這個環境我安裝了GNU Emacs for Windows(你也可以用XEmacs for Windows)、SML編譯器SML/NJ(你也可以用其他編譯器,比如Moscow ML,Poly/ML)、Emacs的SML mode。安裝和配置步驟如下: 下載和安裝GNU Emacs for Windows 下載和安裝SML New Jersey編譯器 下載和安裝Emacs的SML major mode。具體的方法如下: 在你的Emacs安裝目錄(例如F:\Program Files\emacs-21.3)下建一個子目錄叫site-lisp。如果已經有了就不用建了。 在其中建一個子目錄叫sml-mode 將你下載的SML major mode壓縮包解開,將其中所有.el文件拷貝到site-lisp/sml-mode子目錄下 編輯site-lisp中的site-start.el,加入兩行: (add-to-list 'load-path "F:/Program Files/emacs-21.3/site-lisp/sml-mode") (load "sml-mode-startup") 在PATH環境變數里包含SML編譯器所在的目錄。我的是f:\sml\bin。 啟動Emacs後,敲 M-x run-sml就可以在Emacs中啟動一個SML交互環境。 如果用 M-x sml-mode就將當前buffer的major mode設置為sml-mode,你會發現其中的SML代碼被語法高亮顯示了。如果沒有語法高亮,你可以在Emacs的配置文件(對於Windows版本的GNU Emacs和XEmacs而言是C:\.emacs,對Unix版本的是~/.emacs)中加入一行: ; Syntax highlight (global-font-lock-mode t) 著作節選 John C. Mitchell在他的Concepts in Programming Langugaes一書中使用ML來展示Algol類語言、Lisp類語言、以及並行語言和面向對象語言中的概念。應清華大學出版社的要求,我參與翻譯了此書中的部分內容,其中包括介紹ML語言(和其他Algol類語言)的第5章。沒有經過校對的翻譯結果可以從這里下載。請大家幫我多提意見。謝謝。 從例子看ML編程風格 通常大家學習編程都是從命令式語言開始的。和函數示語言不同,命令式語言以語句作為基本單位。Algol家族的所有語言都是命令式語言,ML也不例外。因此學習ML不像學習Scheme那樣需要完全轉換一套思路。但是ML繼承了函數式語言的很多特徵,而且也有自己的一些特點。 我修改了網上找到的一個求解n皇後問題的程序,用來展示ML編程的一些基本手段: 查看源程序 上面程序中使用了option。如果要改用exception可以將其中addqueen函數的定義改成這樣。 程序註解和說明 線性數據結構 程序中總要定義數據結構。常用的定長線性結構包括:Pascal的record,C的struct,C++和Java的class。在ML中我們通常用tuple,即用圓括弧括起來的,用逗號分隔的若干項元素。 Tuple是個線性結構,可以用整數索引。比如 #1(1, 2.0, "apple") = 1 #2(1, 2.0, "apple") = 2.0 #3(1, 2.0, "apple") = "apple" 和Algol類語言的數組不同的是,tuple中各個元素的類型可以不一樣。 C++的boost模板庫中提供了一個模板tuple,模仿ML/Scheme的tuple,使C++程序員可以將不同類型的數據組織成一個便於訪問的線性結構。 函數的嵌套定義 ML和大多數Algol類語言一樣支持函數的嵌套定義(包括Algol 60、Algol 68和Pascal,但是C是例外)。 如果函數A和函數B互相嵌套調用(indirect recursion),則源程序中可以將B的函數體定義在 A的函數體內,或者A的定義在B的函數體內。具體採用那一種,要看外界是調用A還是B。 函數addqueen和其內部函數try就是這樣的例子。顯然addqueen是要被外部調用的。 用尾部遞歸(tail recursion)代替循環 如果用Algol類語言(例如 Pascal和C)來寫函數addqueen,其中需要一個循環,從某行的第一個位置開始,判斷如果在這個位置上放一個皇後是否可以使得其不和前面已經放上的皇後沖突,而且後面還可以繼續放滿皇後。而ML中這個循環用遞歸函數tryARow表示。 純表達式(pure expression)風格,避免副作用(side effect) 大多數Algol類語言對機器的抽象是以內存為中心的,即變數和對象(object)對應內存中的存儲區域,賦值語句對應機器的訪存操作,所以程序中有大量的賦值語句。ML也支持賦值,但是通常建議採取的風格是類似Lisp和Scheme的純表達式風格,避免賦值操作。 例如如果用C來描述n皇後問題,通常我們會設計一個數據結構描述棋盤(和ML程序一樣),然後定義這個數據結構的一個實例(可能是個全局變數)。演算法的主要工作是通過賦值修改這個實例的內容。 而例子中的ML代碼中經典的一段是函數place。這是修改棋盤數據結構的代碼。但是並沒有使用賦值,而是產生了一個新的數據結構實例,其內容和參數略有區別(放上了一個新的皇後)。 純表達式的使用要求程序員先對程序考慮得非常細致才能動筆(動手?),因此使得程序邏輯更加清晰。(這和literate programming的思想是一致的。)但是目前的硬體機器是以內存為中心設計的,所以純表達式語言的實現(編譯器和解釋器)的效率依靠於設計者多費心思。ML就是通過靜態作用域(statically scoping)和uniform data representation等特點結合起來達到高效的。
希望採納
㈡ lisp和ml哪個更適合寫編譯器
如果是寫lisp的編譯器, 當然是lisp自舉更容易.
如果寫其他語言編譯器, 差距不會太大, 差不多.
㈢ c語言編譯器哪個好
1.
GCC
大名鼎鼎的GNU的C/C++/Obj-C編譯器,
當前版本是2.8.1,
但據說與2.7.*有兼容性
問題.
而使用較廣的是gcc
2.7.2系列,
如RedHat5中帶的就是gcc
2.7.2.3
有時候在Cyrix上用gcc會有些問題,
因此有一套針對Cyrix特點的gcc
2.7.2.3
我這里有RedHat5的rpms
ftp://166.111.68.98/pub/Warez-CD/Huricane-contrib
(Cyrix
2.7.2.3
&
2.8.1)
其基本結構就是一個front
end和back
end,
/usr/bin/gcc
就是個front
end,
其kernel東西都放在
/usr/lib/gcc-lib下面,
cpp是C預處理器,
cc1*的1M多的就是編譯器的核心模塊了
cc1
C
compiler
cc1plus
C++
compiler
cc1obj
Object-C
compiler
但gcc並沒有集成Fortran的compiler,
一般要用f2c轉成C後才用gcc編譯
好象也還有個g77
Fortran
compiler吧?
gcc的不斷發展完善使許多commercial
compiler都相形見絀,
那當然,
gcc/emacs
都由GNU創始人Richard
Stallman手創,
是GNU的旗艦產品,
質量當然沒得說了:-)
由於
Unix平台的高度可移植性,
gcc幾乎在各種常見的Unix平台上都有,
即使是
Win32/DOS也有gcc的port.
比如說該死的Solaris普通版本連compiler都沒有,
也
就只好用gcc了...
2.
EGCS(Experimental/Enhanced
GNU
Compiler
System)
這是gcc的發展方向,
把fortran等編譯器集成進來,
也許還會有Pascal?
它的構造很清晰,
把對gcc的各種改進/port都集成回去.
如gcc
2.7系列據說是
沒有對Pentium進行優化的,
而egcs則把pgcc對Pentium的一些優化集成進去了
現在gcc的開發工作主要就是egcs,
由Cygnus公司領導(?),
這Cygnus公司還是很
不錯的,
還出了GNU-Win32,
SourceNavigator等,
是GNU的堅實擁護者:-))
http://egcs.cygnus.com
包括了C/C++/Obj-C/Fortran
編譯器,
當前最新版本1.0.2,
還在不斷開發中
昨天download發現KDE
Beta4都用egcs編譯了
:-)
Fortran集成進來後在/usr/lib/gcc-lib下又多了個f771的back
end,
當然
還是g77/f77
編譯
我這里有egcs
1.0.2
的rpm
在RH5-CD/collect下面
3.
PGCC(Pentium
GCC)
http://www.gcc.ml.org
針對Pentium
CPU進行了編譯器優化的compiler
pgcc據說用JPEG壓縮解壓縮測試最快可比gcc快
30%!
新版的pgcc都是基於egcs的,
以一個patch的形式release
㈣ ML語言的ML編程環境的配置
在Windows環境下使用Emacs作為ML的集成開發環境。下面關於Emacs和SML在Windows下的配置說明其實同樣適合於各種Unix類操作系統)。這里有一副抓圖:在左邊的frame中編輯好SML源程序後,按下C-c C-b,程序就交付給運行在右邊frame中的SML編譯器了。你也可以直接在右邊的frame中互動式的輸入SML程序。
為了配置這個環境我安裝了GNU Emacs for Windows(你也可以用XEmacs for Windows)、SML編譯器SML/NJ(你也可以用其他編譯器,比如Moscow ML,Poly/ML)、Emacs的SML mode。安裝和配置步驟如下:
下載和安裝GNU Emacs for Windows
下載和安裝SML New Jersey編譯器
下載和安裝Emacs的SML major mode。具體的方法如下:
在你的Emacs安裝目錄(例如F:Program Filesemacs-21.3)下建一個子目錄叫site-lisp。如果已經有了就不用建了。
在其中建一個子目錄叫sml-mode
將你下載的SML major mode壓縮包解開,將其中所有.el文件拷貝到site-lisp/sml-mode子目錄下
編輯site-lisp中的site-start.el,加入兩行:
(add-to-list 'load-path F:/Program Files/emacs-21.3/site-lisp/sml-mode)
(load sml-mode-startup)
在PATH環境變數里包含SML編譯器所在的目錄。我的是f:smlin。
啟動Emacs後,敲 M-x run-sml就可以在Emacs中啟動一個SML交互環境。
如果用 M-x sml-mode就將當前buffer的major mode設置為sml-mode,你會發現其中的SML代碼被語法高亮顯示了。如果沒有語法高亮,你可以在Emacs的配置文件(對於Windows版本的GNU Emacs和XEmacs而言是C:.emacs,對Unix版本的是~/.emacs)中加入一行:
Syntax highlight
(global-font-lock-mode t)
㈤ vb怎麼做個vb編譯器
如果你要自己做程序編譯的話很難,就算調用c2.exe和link.exe也沒用,因為VB
在調用之前已經在臨時目錄下生成了一堆看不懂的東西。
但你可以調用VB主程序的命令行來生成程序,如你要生成的程序在D盤根目錄,工程文件為
1.vbp那你可以在CMD里打VB6.exe /make D:\1.vbp
具體的可以參照VB6.exe /?
附:
VB的編譯過程大致如下,當我們在編輯環境中編寫完代碼後,VB調用C2將所有的模塊(包括CLASS)編譯成OBJ文件(能夠為機器語言識別的代碼)。一下是C2的一些編譯參數說明(E文):
- the the name of the prefixed one used for the names of the rowscontaining ' precompilato', one
risen of intermediate tails (from which name of the switch) temporary; these rows are 5 and finish withi suffissi GL, SY, FORMER, IN and DB; they contained are not documented
- f the name of the rows to compile
- W3 warning level 3, level of ' attenzione' dedicating to i warnings
- Gy it qualifies the connection to level of function (function-level linking)
- G5 optimization for the Pentium
- Gs4096 it allows not to insert the code for the control of stack (stack probe) if a function does not
use more than 4096 byte of stack
- dos not documented
- Z1 it removes the name of the bookcase of default from the rows.OBJ
- Fofileobj the name of rows OBJ to generate (rows output)
- Qifdiv it puts in action the corrections for the bug of the division of the Pentium (FDIV bug)
- MILILITER it creates rows eseguibile single-threaded
- basic it indicates the compiler C2 the fact that the compilation it happens for a plan basic
C2完成編譯後,VB會調用LINK.EXE將所有的OBJ文件連接成EXE文件,完成編譯過程。下面是一段命令行演示如何調用LINK.EXE:
LINK C:\Test\Form1.obj C:\Test\Molo1.obj C:\Test\Progetto1.obj C:\Programmi\Microsoft Visual Studio\VB98\VBAEXE6.lib /ENTRY:__ vbaS /OUT:C:\Test\Progetto1.exe /BASE:0x400000 /SUBSYSTEM:WINDOWS, 4.0 /VERSION:1.0 /DEBUG /DEBUGTYPE:CV /INCREMENTAL:NOT /OPT:REF/MERGE:.rdata =.text /IGNORE:4078
對於我們來說這些參數沒有什麼意義,用默認的就行了。這段命令行中並沒有包括輸出函數,如果我們希望輸出函數,可以定義一個.def文件,按照格式加入要輸出的函數列表,然後在命令行後面加上 「/DEF: 文件名」(當然也可以直接加/ EXPORTS參數),再調用命令行編譯,用的denpendency工具查看你就會發現你要輸出的函數了。
Def文件格式的定義:
LIBRARY 程序名稱
DESCRIPTION "MyDLL - (C) Antonio Giuliana, 2004"
EXPORTS
函數名= ?函數名@函數所在模塊名@@AAGXXZ
…
例:
LIBRARY MyDLL
DESCRIPTION "MyDLL - (C) Antonio Giuliana, 2004"
EXPORTS
DllRegisterServer= ?DllRegisterServer@SymExp@@AAGXXZ
DllUnregisterServer= ?DllUnregisterServer@SymExp@@AAGXXZ
注意:函數名和模塊名是區分大小寫的
我先用Vb編一個截取C2、LINK命令的程序:
C2:
Private Sub Form_Load()
f = UCase$(Left$(Command$, 256))
Open "E:\C2.txt" For Output As #1
Print #1, f
Close
End
End Sub
LINK:
Private Sub Form_Load()
f = UCase$(Left$(Command$, 256))
Open "E:\C2.txt" For Output As #1
Print #1, f
Close
End
End Sub
生成EXE後把VB98下的c2與LINK剪切到別處,在用這兩個程序代替。運行VB6.exe,隨意打開一個工程,點文件菜單,生成EXE。
不久我編的兩個程序就送給我夢寐以求的文件:
E:\C2.txt
-IL "C:\DOCUME~1\ADMINI~1\LOCALS~1\TEMP\VB381884" -F "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\新建文件夾 (2)\FORM1.FRM" -W 3 -GY -G5 -GS4096 -DOS -ZL -FO"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\FORM1.OBJ" -QIFDIV -ML -BASIC
E:\LINK.txt
"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\FORM1.OBJ" "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\LINK.OBJ" "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\VBAEXE6.LIB" /ENTRY:__VBAS /OUT:"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\LINK.EXE" /BASE:0X400000 /SUBS
這兩個TXT就是VB送給c2以及LINK的命令。
詳細解讀如下:
C2.txt
-IL "C:\DOCUME~1\ADMINI~1\LOCALS~1\TEMP\VB381884" -F "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\新建文件夾 (2)\FORM1.FRM"是c2准備處理的兩個文件。 -W 3 -GY -G5 -GS4096 -DOS -ZL是c2生成OBJ的格式,後邊則是OBJ文件的地址。
LINK.txt
"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\FORM1.OBJ" "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\LINK.OBJ"是源文件。"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\VBAEXE6.LIB"是轉換庫。後面是EXE文件地址及格式
㈥ 用masm做匯編語言顯示ml.exe不能用
用MASM編譯器的話, 是在編譯器的目錄下,用 masm a.asm,然後如果沒錯誤,會生成a.obj,再輸入 link a, 就生成了a.exe
㈦ 匯編語言編譯器的TASM的用法
TASM是Borland公司推出的匯編編譯器,也是一種使用很廣泛的編譯器,和MASM相比,TASM的升級沒有這么頻繁。TASM早在1.0版本就有了對80386處理器指令的完全支持(MASM要到5.0版本才支持80386指令),1989年推出的1.01版本修正了1.0版的一些錯誤;早期的版本還有TASM 3.0和TASM 4.0,其中4.0版是TASM系列編譯器編寫DOS程序使用最廣泛的版本。
到目前為止,TASM的最後一個版本是5.0版,這個版本支持Win32編程,並單獨為Win32編程附帶有一整套的32位程序:32位的編譯器TASM32.EXE、鏈接器TLINK32.EXE和資源編譯器BRC32.EXE。與這些32位程序對應的16位工具在軟體包中依然存在,文件名為TASM.EXE,TLINK.EXE和BRC.EXE等。
TASM 5.0命令行的使用方法是:
TASM32 [選項] 源文件名[,[目標文件名],[列表文件名],[索引文件名]][;]
在Win32編程時TASM的常用選項如下表所示。
選 項
簡 介
/ml,/mx,/mu
對大小寫是否敏感:ml=全部敏感,mx=全局變數大小寫敏感,mu=不敏感,Win32編程中必須用ml選項
/m#
允許第#次編譯掃描時可以向前引用,一般使用/m2
/i路徑
設定include文字所在的路徑
/l,/la
lst文件的格式:/l為正常格式,/la為擴充格式
/zi,/zd,/zn
符號調試信息的控制:/zi為全部,/zd為僅有行號,/zn為不產生調試信息
TASM和MASM之間的導入庫和目標文件等不能通用,程序員無法用Microsoft的鏈接器來鏈接TASM產生的obj文件,反之亦然,這是因為TASM的庫文件和obj文件一直是OMF格式,與Microsoft使用的COFF格式不兼容
㈧ ML是什麼意思
ML 是一個通用的函數式編程語言,它是由愛丁堡大學的Robin Milner及他人在二十世紀七十年代晚期開發的。它的語法是從ISWIM得到的靈感。作為元語言的ML是為了幫助在LCF定理證明機中尋找證明策略而構想出來的。(之前的元語言是pplambda,它聯合了一階邏輯演算、多態及∧演算)。它使用了Hindley-Milner類型推論演算法來推測大多數值的類型,而不需要四處使用註解。
ML一般被歸為非純函數式編程語言,因為它允許副作用和指令式編程。這一點和純函數是編程語言??例如Haskell??很不一樣。
ML特性有惰性求值的求值策略,一階類型函數, 帶有垃圾收集的自動內存管理, 參數多態,靜態數據類型,類型推斷,代數數據類型,模式匹配和異常處理。
不像Haskell,ML使用熱情求值,也就是說所有的子表達式總是被求值。導致的一個結果是你不能使用無窮表。然而,惰性求值產生的無窮表可以通過使用匿名函數來模擬。
今天在ML家族中有好幾種語言:兩種主要的方言是Standard ML和Caml,其他的包括F# - 針對Microsoft .NET平台的開放研究項目。 ML中的思想影響了眾多的語言,例如Haskell,Cyclone和Nemerle。
ML的實力大多被用於語言設計和操作(編譯器、分析器、定理證明機), 但是它作為通用語言也被用於生化,金融系統,和宗譜資料庫,一個P2P的客戶/伺服器程序等等。
㈨ ML語言的從例子看ML編程風格
通常大家學習編程都是從命令式語言開始的。和函數示語言不同,命令式語言以語句作為基本單位。Algol家族的所有語言都是命令式語言,ML也不例外。因此學習ML不像學習Scheme那樣需要完全轉換一套思路。但是ML繼承了函數式語言的很多特徵,而且也有自己的一些特點。 程序中總要定義數據結構。常用的定長線性結構包括:Pascal的record,C的struct,C++和Java的class。在ML中我們通常用tuple,即用圓括弧括起來的,用逗號分隔的若干項元素。
Tuple是個線性結構,可以用整數索引。比如
#1(1, 2.0, apple) = 1
#2(1, 2.0, apple) = 2.0
#3(1, 2.0, apple) = apple
和Algol類語言的數組不同的是,tuple中各個元素的類型可以不一樣。
C++的boost模板庫中提供了一個模板tuple,模仿ML/Scheme的tuple,使C++程序員可以將不同類型的數據組織成一個便於訪問的線性結構。 ML和大多數Algol類語言一樣支持函數的嵌套定義(包括Algol 60、Algol 68和Pascal,但是C是例外)。
如果函數A和函數B互相嵌套調用(indirect recursion),則源程序中可以將B的函數體定義在 A的函數體內,或者A的定義在B的函數體內。具體採用那一種,要看外界是調用A還是B。
函數addqueen和其內部函數try就是這樣的例子。顯然addqueen是要被外部調用的。 大多數Algol類語言對機器的抽象是以內存為中心的,即變數和對象(object)對應內存中的存儲區域,賦值語句對應機器的訪存操作,所以程序中有大量的賦值語句。ML也支持賦值,但是通常建議採取的風格是類似Lisp和Scheme的純表達式風格,避免賦值操作。
例如如果用C來描述n皇後問題,通常我們會設計一個數據結構描述棋盤(和ML程序一樣),然後定義這個數據結構的一個實例(可能是個全局變數)。演算法的主要工作是通過賦值修改這個實例的內容。
而例子中的ML代碼中經典的一段是函數place。這是修改棋盤數據結構的代碼。但是並沒有使用賦值,而是產生了一個新的數據結構實例,其內容和參數略有區別(放上了一個新的皇後)。
純表達式的使用要求程序員先對程序考慮得非常細致才能動筆(動手?),因此使得程序邏輯更加清晰。(這和literate programming的思想是一致的。)但是目前的硬體機器是以內存為中心設計的,所以純表達式語言的實現(編譯器和解釋器)的效率依靠於設計者多費心思。ML就是通過靜態作用域(statically scoping)和uniform data representation等特點結合起來達到高效的。
㈩ 編譯匯編語言時提示"ML不是內部或外部命令,也不是可運行的程序或批處理文件"
是編譯器版本過低識別不了ML快捷匯編
至少要6.11以上
我的版本是5.0的。。。所以ML要換成兩部操作
DOS狀態用CD命令跳轉到MASM編輯器的目錄下
首先有.asm的源文件
然後MASM文件名.ASM
然後LINK文件名
最後會生成文件名.EXE的可執行文件
完成