在Stata中編寫估計命令:編寫C語言插件

2020-12-17 中國教育裝備採購網

這篇文章演示了如何用其他語言(如C,C 或Java)編寫的代碼插入到Stata中。這種技術被稱為Stata編寫插件或編寫動態連結庫(DLL)。本文中,在C語言中編寫一個插件,它實現了mymean11.ado中mymean_work()執行的計算,在文章在Stata中編寫估計命令編寫插件中討論過。

編寫一個hello-world C插件

在進行任何計算之前,先說明如何編寫和編譯與Stata通信的C插件。Code block 1包含myhello.ado的代碼,該代碼調用C插件hello,它只顯示Stata中的「Hello from C」。

第6行執行句柄hello的插件。第10行將hello.plugin中實現的插件加載到句柄hello中。執行語句在加載語句開始出現之前就是奇數。完整地讀取Stata ado文件,並且在執行主要ado程序行之前加載每個ado程序,Mata函數或插件句柄。所以第10行實際上是在第6行之前執行的。

插件的句柄名稱,本例中的hello,必須與主要ado程序的名稱,本例中的myhello以及此.ado文件中定義的任何其他ado程序不同。

Code block 2中的hello.c的代碼。

第2行包括Stata插件頁眉文件stplugin.h。第6行是Stata C插件入口函數的標準聲明。您應該複製它。在stata_call()中,argc將包含傳遞給插件的參數數量,字符串向量argv將包含參數本身。

第8行聲明並為C字符串msg分配空間。第10行將「Hello from C」中的新行添加到msg中。第11行有Stata顯示msg包含的內容。12行將0作為返回碼。請注意,我將文字0轉換為預期類型ST_retcode。

現在討論如何從hello.c創建插件hello.plugin。在包含myhello.ado和hello.c的目錄中,我也有stplugin.c。stplugin.c定義了一個函數,使stata_call()函數對Stata可用。

不要更改stplugin.h或stplugin.c的內容。事實上,您甚至不需要看它們。

在安裝了命令行開發工具的OS X Mac上,使用gcc通過輸入stplugin.c和hello.c來創建hello.plugin,

gcc -bundle -DSYSTEM=APPLEMAC stplugin.c hello.c -o hello.plugin

上面的gcc命令編譯兩個.c文件並連結它們以創建myhello.ado可以調用的DLL hello.plugin。

在本文的附錄中,我提供了在其他平臺上創建hello.plugin的說明。

創建了hello.plugin後,就可以在Stata中執行myhello。

示例1:myhello

為簡單起見,我將stplugin.h,stplugin.c,hello.c,myhello.ado和hello.plugin放在同一目錄中。對於較大的項目,我會將.ado和.plugin文件放在Stata的ADOPATH目錄中,並使用我的編譯器環境來管理我放置標題和C源文件的位置。 對於這篇文章中的示例,我將所有.ado文件,頭文件,C源文件和創建的.plugin文件放入一個目錄中。

訪問插件中的Stata數據

hello.plugin使Stata顯示在插件中創建的內容。下一步是讓插件訪問Stata中的數據。 為了說明這個過程,我討論了mylistc.ado,它使用插件列出指定變量的觀察結果。

我們先來看一下ado-code。

第6行中,syntax創建了三個本地宏。它將用戶指定的變量放入本地宏varlist中。它將用戶指定的任何if條件放入本地宏if。將用戶指定的任何條件放入本地宏in中。為syntax指定了max = 3以將變量數量限制為3。我不需要它作為Stata / Mata程序示例,但它簡化了示例C插件。

第7行中,marksample創建了一個樣本包含變量,並將其名稱放在本地宏touse中。樣本包含變量對於每一個被排除的觀察和每個被包含的觀察都是0。marksample使用本地宏varlist中的變量,本地宏中的if的條件,以及本地宏in中的範圍來創建樣本包含變量。 (所有三個本地宏由syntax創建。)如果本地宏varlist中的任何變量包含缺失值,如果被本地宏if的條件排除,或者被本地宏in的範圍排除,則排除觀察。樣本包含變量是未被排除的觀測值之一。

第9行中,通過顯示插件列出的值的變量名稱進一步簡化了C插件。

第10行,plugin調用mylistw.plugin。因為指定了'varlist',所以Stata插件接口(SPI)函數SF_vdata()能訪問本地宏varlist中包含的變量。因為如果指定了`touse',如果`touse'中的樣本包含變量為0,則SPI函數SF_ifobs()將返回0,如果樣本包含變量為1,則函數將返回1。由於指定了「in」,因此SPI函數SF_in1()和SF_in2()分別返回範圍內任何用戶指定的第一個和最後一個觀察值。

指定「in」不是識別用戶指定樣本所必需的,因為如果`touse'已經指定了此樣本包含信息。 但是,指定「in」可以顯著減少數據循環中的觀察範圍,從而加快代碼速度。

在包含stplugin.h,stplugin.c和mylistw.c的目錄中,通過鍵入以下代碼在Mac上創建了mylistw.plugin

gcc -bundle -DSYSTEM=APPLEMAC stplugin.c mylistw.c -o mylistw.plugin

如果你正在閱讀這篇文章,你可以閱讀標準C。我討論了mylistw.c如何說明Stata C插件的結構,並解釋了代碼中使用的SPI定義的類型和函數。

如果一切順利,mylistw.c會向Stata返回0,如果出錯,會返回一個非0錯誤的代碼。 每當在mylistw.c中調用一個可能失敗的函數時,我都會檢查它的返回碼。如果該函數失敗,我會讓Stata顯示錯誤消息,並向Stata返回非0錯誤代碼。 該邏輯為mylisw.c提供了整體結構。大多數代碼處理錯誤條件或者注意不要在字符串緩衝區中放入超出其容量的字符。

C插件使用SPI中定義的函數讀取或寫入Stata對象。mylistw.c不會返回任何結果,因此它具有簡單的結構。

. 使用SPI函數從Stata中指定的數據樣本中讀取數據。

. 使用標準C和SPI函數列出指定樣本的觀察值,並保留指定樣本中觀察數量的計數器。

. 使用標準的C和SPI函數來顯示樣本中的第一個觀察結果,這是樣本中的最後一個觀察結果,以及指定樣本中有多少觀察結果。

現在,我將討論mylistw.c的具體部分。

在9-12行中,使用SPI定義的類型ST_int,ST_double和ST_retcode來處理SPI函數返回的變量或SPI函數的參數。 使用這些定義的類型是必不可少的,因為它們與原始C類型的映射會隨著時間而變化。

rc保存插件將返回到Stata的返回代碼。在16行,我將rc初始化為0。如果SPI函數可能會失敗,那麼它會返回0的返回碼。如果SPI函數無法執行請求,則返回的是非0返回碼。每次調用可能失敗的SPI函數時,我都會將它返回的代碼存儲在rc中。如果rc不是0,我會讓Stata顯示錯誤消息並使插件返回存儲在rc中的非0值。

第18,20和22行使用SPI功能。SF_in1()將in範圍指定的第一個觀察值放入first。SF_in2()將in範圍內指定的最後一個觀察值放入last。如果沒有為plugin指定in範圍,則first包含1,last將包含數據集中的觀察數。SF_nvars()將varlist中指定的變量數放入nVars。

第30-32行確保我們跳過mylistc.ado第10行中為插件指定的if限制所排除的觀察結果。為了說明一些細節,請參考示例2。

示例2:mylistc

在第30行中,對於觀察值i來說,當為plugin指定的if限制為1,SF_ifobs(i)返回1,否則返回0。在mylist.ado的第10行中,我們看到傳入plugin的if限制是「touse」。如上所述,本地宏touse的樣本包含變量對於排除的觀察值是0,對於包括的觀察值是1。

在mylistc.ado第10行的範圍內,使mylistw.c第27行中循環的觀察結果只能從範圍內任何指定的開始到結束。在示例2中,mylistw.c的第27行上的循環從2到10,而不是在自動數據集上對所有74個觀察結果進行循環。

在示例2中,樣本包含變量對於6個觀察值為1,對於其他68個觀察值為0。在in 2/10範圍內不包括觀察結果1和11-74的觀察結果。 在前10個觀察中,2個被排除,因為缺少rep78。 排除一個觀察因為trunk是21。

為了比較,在示例3中列出了2和10之間的所有9個觀察結果。

案例3:list

返回mylistw.c的第38行,rc = SF_vdata(j,i,&value)將觀察值i放在變量j上,它將SF_vdata()返回的代碼放入rc。 如果一切順利,rc包含0,並且不輸入第41-43行中的錯誤塊。 如果SF_vdata()無法將數據存儲到value中,則會輸入 第41-43行中的錯誤塊,這會使Stata顯示錯誤消息並導致mylistw.plugin以rc包含的錯誤代碼退出。在錯誤塊中,SF_error()使Stata以紅色顯示C字符串的內容。

SF_vdata()只能訪問一個數字Stata數據類型(byte,int,long,float或double)的變量。(對於字符串數據使用SF_sdata()。)無論變量是哪個Stata數字類型,SF_vdata()都將結果存儲為ST_double。 在示例2中,mpg,trunk,rep78在Stata中都是int類型,但每個都作為ST_double存儲到value中。

第46行,如果value是缺失值,則SF_is_missing(value)返回1,否則返回0。如果其中一個變量中的任何觀察值包含缺失值,則第46-50行導致mlistw.plugin以錯誤416退出。這些行是多餘的,因為傳遞到mylistw.plugin的樣本包含變量排除了包含缺失值的觀察。 我包含這些行是來說明如何安全地從插件中排除缺失值並重申C代碼必須小心處理缺失值。 Stata缺失值在C代碼中的是有效的雙精度數。如果在計算中包含Stata缺失值,則會得到錯誤的結果。

剩餘的行構造C字符串行,傳遞給Stata以顯示每個觀察結果,最後顯示有關樣本的摘要信息。

C語言插件中的均值估計

我現在討論ado-命令mymeanc,它使用mycalcs.plugin實現mymean_work()執行的計算,在Programming an estimation command in Stata: Preparing to write a plugin中有討論mymean11.ado。

mymeanc的代碼位於mymeanc.ado中,在下面代碼塊5中。

該程序的一般結構與mymean10.ado和mymean11相同,在Programming an estimation command in Stata: Preparing to write a plugin中討論過。 從全局角度來看,mymeanc.ado:

. 解析用戶輸入;

. 創建一些名稱和對象來保存結果;

. 調用工作程序來進行計算;

. 將工作程序返回的結果存儲在e()中;

. 顯示結果.

mymeanc.ado和mymean11.ado之間的主要區別在於工作程序是C插件而不是Mata函數。

第6行和第7行與mylistc.ado中的相同。有關這些行如何創建本地宏varlist的說明,本地宏touse中包含的樣本包含變量以及包含任何用戶指定範圍的本地宏,請參閱Getting access to the Stata data in your plugin中mylistc.ado的討論。

第8行將臨時名稱放入本地宏b,V和N中。我們將這些名稱用於C插件計算的結果,並知道不會覆蓋用戶存儲在全局Stata內存中的任何結果。(回想一下,Stata矩陣和標量是Stata中的全局對象;Using temporary names for global objects in Programming an estimation command in Stata: A first ado-command文中有討論本話題。)另外,此外,當mymeanc終止時,Stata將刪除tempname創建的臨時名稱中的對象。

第10-12行創建Stata矩陣來保存結果。我們使用tempname為這些矩陣創建臨時名稱。

mymeanc.ado中的第14行類似於mylistc.ado中第10行的對應部分。在這種情況下,插件調用mycalcs.plugin來完成工作。 varlist的細節,`if' `touse' 和 `in'在上面討論過。 最新的是我們將參數`b'`V'`N'將臨時名稱傳遞給mycalcs.plugin。

mycalcs.plugin

. 做計算

. 估計均值放入Stata矩陣中,該矩陣的名稱在本地宏b中

. 估計量的估計方差(VCE)放入名稱在本地宏V中的Stata矩陣中

. 樣本中的觀察數量放入名稱在本地宏N中的Stata標量中

16-18行將變量名稱放在估計均值向量的列條帶上以及VCE矩陣的行和列條帶上。 第19-21行將結果存儲在e()中。 在第22行顯示結果。

現在討論創建mycalcs.plugin的代碼。 在討論細節之前,我們創建插件並運行一個例子。

在包含mycalcs.c,mycalcsw.h,mycalcsw.c,stplugin.c和stplugin.h的目錄中,通過輸入以下代碼在Mac上創建mycalcs.plugin

gcc -bundle -DSYSTEM=APPLEMAC stplugin.c mycalcsw.c mycalcs.c -o mycalcs.plugin

創建mycalcs.plugin後,運行示例3。

示例3:mymeanc

現在討論用於創建mycalcs.plugin的C代碼的一些方面。 從代碼塊6中的mycalcs.c開始,包含入口函數stata_call()的代碼。

總之,mycalcs.c中的代碼執行以下任務。

  1. 它將作為參數傳入的Stata對象名稱放入可以傳遞給工作函數的C字符串中。

  2. 它使用工作函數InitCmat()為C數組bmat和vmat分配空間,以保存矩陣結果。

  3. 它使用工作函數MyAve()和MyV()來計算存儲在bmat,vmat和nObs中的結果。

  4. 它使用工作函數CopyCtoStataMatrix()和SPI函數SF_scal_save()從bmat,vmat和nObs中將結果複製到在步驟1中解析其名稱的Stata對象中。

  5. 它釋放分配的C數組並返回返回代碼。

mycalcs.c很容易閱讀,因為我將所有細節都放入了工作函數中。這些函數是在mycalcsw.c中定義,在下面我們將討論它們。

與mylistw.c一樣,mycalcs.c使用返回代碼rc來處理錯誤情況。如果一切順利,則每個工作函數返回0,如果無法執行所請求的作業,則返回非0錯誤代碼。 如果返回代碼不為0,mycalcs.c會進入一個代碼塊來處理錯誤。每個錯誤塊使Stata顯示錯誤消息,它釋放任何已分配的C數組,最後,導致stata_call()返回非0代碼。

現在在Code block 7中討論mycalcsw.c中的工作函數。

如何在C數組中實現矩陣的兩個方面值得討論。首先,將矩陣存儲為具有行主要存儲的向量,正如第7-10行的注釋中所提到的那樣。 其次,使用第14-18行定義的預處理器宏來使代碼更易於閱讀。 請注意,在第166-169行上未定義這些宏。

除了使用SF_error()使Stata顯示錯誤消息,如果malloc()不能分配內存,工作函數InitCmat()使用標準C來實現矩陣分配和初始化函數。

工作函數MyAve()是在Mata中實現的MyAve()的C實現,詳見: Programming an estimation command in Stata: Preparing to write a plugin。當我討論mylistw.c時,如上所述,MyAve()處理Stata數據和缺失值。在第71行調用的工作函數DivideByScalar(),通過存儲在n中的樣本觀察數劃分bmat中的每個元素。(強制轉換可確保執行浮點而不是整數除法。)

工作函數MyV()是在Mata中實現的MyV()的C實現,參考Programming an estimation command in Stata: Preparing to write a plugin。MyV()使用到目前為止討論的大多數編碼技術和函數。 此函數比其他函數更長,但其中的所有內容都是標準C或我已經討論過的內容。

工作函數CopyCtoStataMatrix()將結果從C數組複製到Stata矩陣。使用SF_mat_store(smat,(i 1),(j 1),C(i,j))將元素從C數組的第i行和第j列複製到Stata矩陣中的相應元素。Stata矩陣元素被指定為(i 1)和(j 1),因為在代碼中的C矩陣使用基於零開始的索引,而SF_mat_store()使用基於一個索引的Stata矩陣元素。

工作函數Divide By Scalar()用標量劃分C數組中的每個元素。

為了完整起見,我現在討論mycalcsw.h。 代碼塊8中給出的mycalcsw.h包含mycalcsw.c中定義的工作函數的函數原型。

完成和撤消

我展示了如何實現一個C插件,該插件執行mymean10.ado和mymean11.ado中Mata工作函數執行的計算,如程序29中所述。

附錄

在文中,我展示了如何使用命令行開發工具編譯和連結一個OS 10 MAC的插件。 在這裡,我在Windows 10和RedHat Linux上為gcc編譯器提供命令。

Windows 10

本小節提供了在64位Windows 10系統上編譯和連結Cygwin環境中插件的命令。與其他平臺不同,我們不能只使用gcc。在Cygwin中,gcc編譯應用程式以在Cygwin POSIX / Unix環境中運行。我們希望使用Cygwin編譯一個連結到本機Windows應用程式並在其中運行的庫。 Cygwin擁有適用於Windows(MinGW)的極簡的GNU編譯器,可以滿足我們的需求。 相應編譯器的名稱取決於平臺。在64位x86-Intel機器上,我使用了x86_64-w64-mingw32-gcc編譯器。

hello.plugin

在包含stplugin.h,stplugin.c和hello.c的目錄中,通過鍵入以下命令來創建hello.plugin:

x86_64-w64-mingw32-gcc -shared -mno-clwb stplugin.c hello.c -o hello.plugin

mylistw.plugin

在包含stplugin.h,stplugin.c和mylistw.c的目錄中,通過鍵入以下命令來創建mylistw.plugin:

x86_64-w64-mingw32-gcc -shared -mno-clwb stplugin.c mylistw.c -o mylistw.plugin

mycalcs.plugin

在包含stplugin.c,stplugin.h,mycalcs.c,mycalcsw.h和mycalcsw.c的目錄中,通過鍵入以下命令來創建mycalcs.plugin:

x86_64-w64-mingw32-gcc -shared -mno-clwb stplugin.c mycalcsw.c mycalcs.c -o mycalcs.plugin

RedHat Linux

本小節提供了在RedHat Linux上編譯和連結插件的gcc命令。

hello.plugin

在包含stplugin.h,stplugin.c和hello.c的目錄中,通過鍵入以下命令來創建hello.plugin:

gcc -shared -fPIC -DSYSTEM=OPUNIX stplugin.c hello.c -o hello.plugin

mylistw.plugin

在包含stplugin.h,stplugin.c和mylistw.c的目錄中,通過鍵入以下命令來創建mylistw.plugin:

gcc -shared -fPIC -DSYSTEM=OPUNIX stplugin.c mylistw.c -o mylistw.plugin1

mycalcs.plugin

在包含stplugin.c,stplugin.h,mycalcs.c,mycalcsw.h和mycalcsw.c的目錄中,通過鍵入以下命令來創建mycalcs.plugin:

gcc -shared -fPIC -DSYSTEM=OPUNIX stplugin.c mycalcsw.c mycalcs.c -o mycalcs.plugin

相關焦點

  • 物理機性能監控—基於collectd插件編寫
    在開發過程中發現了collectd開源框架,下面將從以下幾方面對collectd進行介紹:  1、collectd介紹  2、collectd的基本安裝配置  3、collectd插件編寫  collectd介紹  collectd是一個守護進程,由c語言實現,用來收集系統信息,
  • Stata程序:10 分鐘快樂編寫 ado 文件
    基本命令介紹在這一部分中,我們將簡要介紹編寫 ado 文件的相關命令。而想要從例子出發由淺入深地了解程序編寫技巧的讀者可以先跳過這一部分,從第三部分看起,有不明白的地方再回頭看這一部分的命令介紹。幫助文件的編寫在編寫完一個新命令後,我們不僅可以自己使用,還可以分享給其他需要的人,這是 Stata 開放性的一種體現。而 Stata 中最熱門的命令,如 outreg2 (Roy Wada), estout (Ben Jann) 和 winsor2(Lian Yu-jun) 等,在使用時都可以通過 help 命令查詢其具體功能和應用例子。
  • C語言編寫程序求水仙花數
    C語言編寫程序求水仙花數水仙花數是一個數學問題,其實質是一個三位數,個位數的立方加十位數的立方加百位數的立方之和等於這個三位數本身。例如153=1*1*1+5*5*5+3*3*3,即153=1+125+27。
  • 摘要:編寫第一個NDK,使用C語言進行輸出。
    編寫第一個NDK,使用C語言進行輸出。新建一個android工程JniTest。右鍵項目->Android tools->Add Native Support...,填寫生成庫的名稱,會在項目目錄下生成jni文件夾和obj文件夾。
  • Cocos 插件教程:編寫帶擴展屬性插件的經驗分享
    這兩天用cocos插件編寫了一個2d粒子控制項。很明顯的感受是官方文檔不是很完善,那篇超級長的說明脈絡也不是很清晰,以至於我在此期間掉了不少坑走了不少彎路,不過這次cocos放出來的插件系統還是很靈活很強大的,從編輯到最終輸出都可以由我們自定義實現。這篇教程就來分享下我這兩天做擴展屬性過程中總結的經驗,探討在插件的編寫過程中的一些技巧,幫助下後來者。
  • CobaltStrike 插件編寫指南
    我們可以使用一些IRC、Webhook去對接機器人和監控,比如瞎子哥的Server上線監聽,以及檮杌等插件的編寫,所以本文也會在他們的代碼基礎上去解釋一些東西由於 Aggressor Script是由Sleep解析的,所以我們先要安裝一下這個語言的解釋器,這個語言是基於Java的腳本語言Sleep語言下載地址:http://sleep.dashnine.org/download
  • 世界上第一個C語言編譯器是怎麼編寫的?它為什麼能夠用C語言編寫?
    不知道大家有沒有想過一個問題:C語言編譯器為什麼能夠用C語言編寫? 今天小編就帶大家一探究竟! 所謂C語言編譯器,就是把編程得到的文件,比如.c,.h的文件,進行讀取,並對內容進行分析,按照C語言的規則
  • 用C語言編寫程序列印輸出九九乘法表
    用C語言編寫程序列印輸出九九乘法表C語言的功能十分強大,本人非常喜歡,九九乘法表既有C程序中的循環結構,也有輸出格式的設置,能夠體現出C程序的風格特點。下面就C程序編寫九九表分享給大家!#include <stdio.h>int main(){int a,b,c;for(a=1;a<=9;a++){
  • 基於Cortex-A9 LED彙編、C語言驅動編寫
    下面我們就以華清遠見的fs4412開發板為例來看如何編寫led的裸機程序。四、驅動編寫下面我們分別用彙編和C語言來給LED編寫驅動程序。1.2. c語言實現如果要進入C語言執行環境,那麼就必須為設置棧空間,函數調用參數和返回值會壓棧。
  • 如何讓用編輯器編寫EverNote?
    02 安裝插件在VSCode中安裝EverMonky,Auto Close Tag,Auto Rename Tag,HTML CSS Support和Markdown All in One插件這與vscode中使用markdown中所述有些區別,可能是插件的更新修改了名字,以及自己挖掘了幾款不錯的插件。
  • 通過編寫一個簡單的遊戲學習 C 語言|Linux 中國
    下面是如何用 C 語言來編寫它。 我在小學時就開始自學編程。我的第一個程序是在 Apple II 上編寫的,但最終,我還是通過看書和編程練習學會了 C 語言。練習編程的最佳方法是編寫示例程序,它能幫助你練習新知識。 在我學習一種新的程式語言時,我喜歡編寫一個簡單的「猜數字」遊戲來練習。
  • 編寫自己的JEB2插件
    背景JEB2發布有段時間了,相比於JEB1來說功能強大了很多,但是API也發生了巨大的變化,不僅是定義上也包括架構上,這給我們移植或者是新編寫插件帶來了一定不便
  • 第一個 C 語言編譯器是怎樣編寫的?
    所以衡量某種高級語言的可移植性其實就是在討論ANSI/ISO C的移植性。C語言是很低級的語言,很多方面都近似於彙編語言,在《Intel 32位彙編語言程序設計》一書中,甚至介紹了手工把簡單的C語言翻譯成彙編的方法。
  • 編寫自己的 Shell 命令(上)
    這次實驗的目標是編寫一個自定義的Shell命令,更具體來說是在 Shell 中加入自定義的 command: lzc, 它的功能只是在屏幕上顯示一段字符串表示這個命令已經運行。Sources.common]節加入 lzc.c 文件名3.UefiShellLevel3CommandsLib.h 中聲明ShellCommandRunLzc 函數/** Function for 'getmtc' command.
  • 手把手教你編寫抖音自動評論腳本
    學習方式:按鍵精靈使用的是Q語言,在VBScript語言基礎上發展來的,如果對VBScript語言有了解更好一些,沒有了解也沒關係,注意上圖腳本編寫界面中的基本命令和全部命令標籤,基礎命令標籤可通過點擊自動生成代碼,全部命令標籤大部分方法通過代入參數也可自動生成代碼
  • 編寫自己的 Shell 命令(下)
    有些時候,我們編寫的 EFI 程序不希望有人改動,這個時候就可以考慮將程序「藏」到 Shell 中。
  • 一次使用 Go 語言編寫腳本的經歷
    本文介紹了我如何嘗試使用 Go 語言進行腳本編程的經歷。文中我將討論 Go 腳本的必要性,我們預期的表現以及可能的實現方式。在討論過程中,我講深入探討腳本、Shell 和 Shebang。最終,我們將會討論讓 Go 腳本工作的解決方案。為什麼 Go 語言適合編寫腳本?
  • Code::Blocks使用教程(使用Code::Blocks編寫C語言程序)
    CodeBlocks 完全支持單個源文件的編譯,如果你的程序只有一個源文件(初學者基本上都是在單個源文件下編寫代碼),那麼不用創建項目,直接運行即可;如果有多個源文件,才需要創建項目。注意:保存時,將源文件後綴名改為 .c。2) 生成可執行程序在上方菜單欄中選擇 構建 --> 構建,就可以完成 hello.c 的編譯工作。
  • 關於Stata,這些基礎知識你必須要知道
    Stata的矩陣運算功能矩陣代數是多元統計分析的重要工具,Stata不但提供了多元統計分析中所需的基本矩陣運算,如矩陣的加、積、逆、Cholesky分解、Kronecker內積等,還提供了一些高級運算,如特徵根、特徵向量、奇異值分解等。在執行完某些統計分析命令後,還提供了一些系統矩陣,如估計係數向量、估計係數的協方差矩陣等。
  • RPG DOTA2 自定義地圖製作指南——腳本編寫
    DOTA2創意工坊工具的程序使用的是LUA程式語言,如果你對於編寫其他語言比較熟悉的話,那麼編寫LUA也會是一件很容易的事。   提示:在遊戲運行的時候,你能夠使用script_reload命令來重新載入你的代碼。