日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

未来一瞥:机器人码农

發(fā)布時間:2024/10/12 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 未来一瞥:机器人码农 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Dmitriy Gakh 著
Conmajia 譯
原文發(fā)表于 2018 年 12 月 14 日 CODEPROJECT. 中文版已獲作者授權(quán).

全文約 3700 字,建議閱讀時間 8 分鐘.

主要講述自動化代碼生成的一般性概念,實(shí)現(xiàn)了兩個可以寫程序的機(jī)器人碼農(nóng)

第一個碼農(nóng)(簡單,性能差)

第二個碼農(nóng)(復(fù)雜,性能好)

運(yùn)行之前先讀讀代碼使用說明. 機(jī)器人寫的程序

簡介

為了滿足不斷增長的方法學(xué)需求和硬件性能,軟件開發(fā)技術(shù)已經(jīng)有了長足進(jìn)步. 自動化在軟件開發(fā)過程中對簡化人工勞動起著越來越重要的作用. 軟件開發(fā)自動化包含多個方面,例如代碼構(gòu)建管理器、靜態(tài)代碼分析器、自動測試等系統(tǒng).

另一方面,人工智能和機(jī)器人方面的研究顯著進(jìn)步,機(jī)器人(bot)軟件家族得到了蓬勃發(fā)展. 機(jī)器人們實(shí)現(xiàn)了預(yù)設(shè)的邏輯操作,只要硬件能跟上,它們的能力幾乎沒有限制. 而現(xiàn)代軟件開發(fā)技術(shù)可以應(yīng)用到機(jī)器人上,讓它們具備可以編程開發(fā)的能力.

這篇文章介紹了創(chuàng)建軟件開發(fā)機(jī)器人的一般概念,從現(xiàn)代軟件開發(fā)的角度展示了這一概念. 文章還附帶了兩個機(jī)器人碼農(nóng)的例子作為演示. 寫作本文是為了拋磚引玉,啟發(fā)讀者學(xué)習(xí)現(xiàn)代編程技術(shù),并應(yīng)用到現(xiàn)實(shí)生活中. 我只是初步闡述了自己的一點(diǎn)想法,讀者中能人眾多,希望能對此篇拙作加以斧正.

導(dǎo)讀

本文兩個主要章節(jié):

  • 思路部分主要是一般概念闡述
  • 機(jī)器人碼農(nóng)部分主要是兩個機(jī)器人碼農(nóng)的實(shí)現(xiàn)

讀者可以從感興趣的部分開始閱讀.

術(shù)語

ATDCG,(Automated Test-Driven Code Generation)測試驅(qū)動的自動代碼生成
SDB,(Software Development Bot)軟件開發(fā)機(jī)器人
TDCG,(Test-Driven Code Generation)測試驅(qū)動的代碼生成
TDD,(Test-Driven Development)測試驅(qū)動的開發(fā)

思路

軟件開發(fā)的發(fā)展

引發(fā) SDB 領(lǐng)域研究的最初問題是“軟件開發(fā)技術(shù)是如何開發(fā)的?”,了解軟件開發(fā)技術(shù)的趨勢非常重要,這些知識有助于創(chuàng)造未來的愿景. 編程范式的前幾個階段可以簡要描述為:

  • 代碼序列. 早期由于硬件能力較弱,一般的軟件都是程序員單打獨(dú)斗完成的. 這些程序通常是以非結(jié)構(gòu)化的形式開發(fā)的.
  • 結(jié)構(gòu)化編程. 隨著需要解決的問題涉及范圍不斷擴(kuò)大,需要不斷增加編程代碼量. 為了更好管理代碼,出現(xiàn)了分塊組織的代碼結(jié)構(gòu).
  • 面向?qū)ο缶幊?/strong>. 代碼塊結(jié)構(gòu)不斷增長,最終組合成一種新的稱為對象的結(jié)構(gòu). 代碼塊之間關(guān)系的數(shù)量和復(fù)雜性也在增加. 引入了一些新的關(guān)系結(jié)構(gòu),比如封裝、集成、多態(tài)等. 編程模型反映了復(fù)雜系統(tǒng)的特征,不同的單元執(zhí)行不同的操作,和現(xiàn)實(shí)生活中的參與者及過程密切相關(guān).
  • 問題是:下一步是什么?編程方法朝著什么方法發(fā)展?

    簡化的 TDD 過程

    TDD 是開發(fā)的進(jìn)化方向,它結(jié)合了測試優(yōu)先的開發(fā),在開發(fā)或重構(gòu)代碼前編寫測試. TDD 不是一種簡單的編程技術(shù),而是一種重要的敏捷需求和敏捷設(shè)計技術(shù),其目標(biāo)是編寫干凈而有效的代碼. TDD 是解釋本文主要思想的一種簡潔方法. 本文以 TDD 作為進(jìn)一步闡述的基礎(chǔ),給出了描述 TDCG 方法論的清晰路徑. 完整的 TDD 過程包含代碼重構(gòu)階段,通過測試確保代碼正確. 在創(chuàng)建新代碼階段,不需要重構(gòu),可以簡化 TDD 過程. 簡化后的 TDD 主要有:創(chuàng)建測試,開發(fā)軟件單元,可能重復(fù)開發(fā)任務(wù),直到代碼通過測試階段.

    圖 1 簡化的 TDD 過程

    幾乎所有描述 TDD 任務(wù)的信息來源都關(guān)注到有的處理可以自動進(jìn)行而減少人工工作這一事實(shí). 其中尤為重要的一項(xiàng)特性是,自動任務(wù)運(yùn)行的是經(jīng)過證明的算法,性能穩(wěn)定,但是人工執(zhí)行的任務(wù)反而會引入錯誤. 換句話說,測試及軟件的開發(fā)者有責(zé)任保證他們工作的質(zhì)量. 故而考慮簡化 TDD 過程時的主要任務(wù)可以從職責(zé)角度進(jìn)行描述:

    • 創(chuàng)建測試:影響整個軟件開發(fā)單元的主要任務(wù)
    • 運(yùn)行測試:經(jīng)過證明的自動過程,本身不會引入錯誤
    • 開發(fā)軟件:由程序員實(shí)施,通過測試保證其工作的質(zhì)量

    盡管本文考慮減少程序員對其工作的責(zé)任,但這意味著只有通過測試才能保證工作的質(zhì)量. 為保持解釋的簡單性,暫不考慮其他質(zhì)量指標(biāo),如代碼可讀性、開發(fā)時間、代碼性能等.

    測試驅(qū)動的代碼生成

    Raphael Marvie 在《測試驅(qū)動的代碼生成簡介》[Marvie, 2006]一文中描述了測試驅(qū)動的代碼生成(TDCG)技術(shù). Marvie 是在 TDD 處理的范疇內(nèi)描述 TDCG 的,而本文將自動代碼生成視為一種獨(dú)立的技術(shù),而不是 TDD 的一部分. 但是,所考慮的技術(shù)與 TDD 和其他信息技術(shù)有著密切的關(guān)系. 自動代碼生成基于先前編寫的測試,因此可以將其命名為測試驅(qū)動的自動代碼生成(ATDCG).

    上述推理表明,只有運(yùn)行測試是自動化的,但創(chuàng)建測試和開發(fā)軟件是 TDD 中的人工實(shí)施的任務(wù)(這些任務(wù)可以部分自動化,但不能完全自動化). 事實(shí)上,由于軟件開發(fā)任務(wù)的質(zhì)量是通過測試自動控制的,開發(fā)也可以完全自動化. 人類的角色將收縮為僅負(fù)責(zé)創(chuàng)建測試. 從業(yè)務(wù)的角度來看,這意味著程序員為軟件單元創(chuàng)建、描述需求,而這些單元將根據(jù)需求自動創(chuàng)建. 因此,自動軟件開發(fā)可以被看作是上述簡化 TDD 過程的一種演變.

    圖 2 自動化 TDD 過程

    自動化測試

    傳統(tǒng)的自動化軟件測試方法有一個稱為代碼覆蓋率(code coverage)的特性. 這是用于描述在特定測試單元運(yùn)行時,程序源代碼的執(zhí)行程度的度量. 較小的代碼覆蓋率意味著存在未經(jīng)自動測試的代碼. ATDCG 技術(shù)從零開始創(chuàng)建代碼,因此可以保證測試完全覆蓋所有代碼. 換句話說,它有 100% 的代碼覆蓋率. 也正是因?yàn)檫@個特性,代碼覆蓋率無法用于衡量 ATDCG 成功與否. 于是,應(yīng)該考慮引入新的指標(biāo),通過測試來衡量實(shí)際的業(yè)務(wù)問題覆蓋率. 這一事實(shí)將成功與否的度量從軟件開發(fā)領(lǐng)域轉(zhuǎn)移到業(yè)務(wù)分析中. 關(guān)于這方面的話題已經(jīng)超出了本文討論的范圍,不再贅述.

    ATDCG 中測試的角色

    創(chuàng)建測試是 ATDCG 過程中唯一需要人工執(zhí)行的任務(wù). 測試是軟件單元自動生成過程的主要驅(qū)動,同時保證了過程的質(zhì)量. 因此,ATDCG 中的測試具有以下特點(diǎn):

    • 整個 ATDCG 過程和結(jié)果的質(zhì)量均取決于測試
    • 創(chuàng)建測試是 ATDCG 最主要和最敏感的任務(wù)
    • 與經(jīng)典方法相比,創(chuàng)建測試與業(yè)務(wù)需求較創(chuàng)建軟件代碼的關(guān)系更為密切
    • 需要研究、制定用于創(chuàng)建 ATDCG 測試的方法和規(guī)則

    機(jī)器學(xué)習(xí)

    正如前面提到的,ATDCG 開發(fā)的軟件單元質(zhì)量完全取決于測試. 反過來,測試的創(chuàng)建在很大程度上與業(yè)務(wù)需求相關(guān),而不是與編程相關(guān). 從另一個角度來看,測試將以聲明性的方式描述,并包含大量的規(guī)則、數(shù)據(jù). 因?yàn)闇y試創(chuàng)建過程與業(yè)務(wù)需求相關(guān),所以這些數(shù)據(jù)應(yīng)該具有足夠高的抽象級別,以使測試創(chuàng)建者能夠方便地根據(jù)業(yè)務(wù)需求開發(fā)測試. 與傳統(tǒng)的測試方法相比,測試設(shè)計的高抽象級別和大量數(shù)據(jù)引入將導(dǎo)致復(fù)雜性的增加. 創(chuàng)建測試和運(yùn)行 ATDCG 可以描述為:

    • 以聲明形式創(chuàng)建測試并考慮實(shí)際物理數(shù)據(jù)的數(shù)量
    • 將創(chuàng)建的測試或其一部分視為軟件單元自動創(chuàng)建的訓(xùn)練數(shù)據(jù)

    這些觀察結(jié)果表明 ATDCG 與有監(jiān)督學(xué)習(xí)(supervised learning)有很深的關(guān)系,后者的相關(guān)理論和技術(shù)可以應(yīng)用于 ATDCG 領(lǐng)域的研究.

    社會影響

    ATDCG 旨在完成軟件開發(fā)任務(wù)的自動化,它將使程序員從這個角色中解放出來. 同時,測試分析師和創(chuàng)建者的角色成為成功運(yùn)行 ATDCG 的關(guān)鍵. 此外,ATDCG 的開發(fā)顯然將滿足兩條 Unix 編程規(guī)則 [Raymond, 2003]:

  • 經(jīng)濟(jì)規(guī)則:程序員的時間是昂貴的,節(jié)省人的時間優(yōu)先于機(jī)器時間
  • 生成規(guī)則:盡可能編寫一些程序,由它們負(fù)責(zé)編寫其余的程序
  • 因此,ATDCG 可以認(rèn)為是一種軟件開發(fā)技術(shù),它可以帶來更多的機(jī)會,為進(jìn)一步研究這一問題提供機(jī)遇.

    機(jī)器人碼農(nóng)

    這里的機(jī)器人指的是軟件機(jī)器人(software robot). 本節(jié)講述兩個 SDB 的創(chuàng)建過程.

    • 1 號:最簡單的 SDB,用于展示概念,性能較差
    • 2 號:更好的性能,可以在 5-10 分鐘內(nèi)得到結(jié)果(Intel i7)

    問題

    本文試圖給出一個盡可能簡單的解釋,以提出該技術(shù)的一般概念. 在這種情況下,最小的軟件單元可以只是一個簡單的函數(shù),由一個寫在高級語言上的代碼行表示. 下面兩個例子的目的都是基于訓(xùn)練數(shù)據(jù)在 C# 語言上創(chuàng)建一個簡單的函數(shù). 在每種情況下,測試將檢查輸入功能輸出值的等效性.

    訓(xùn)練數(shù)據(jù)

    輸入?yún)?shù) \(a\)\(b\),輸出 \(f\) 在下表列出:

    表 1 訓(xùn)練數(shù)據(jù)$a$$b$$f$
    3821463
    41180
    5172645
    1232313
    621150
    2038599
    2543849
    319113
    40341779

    這些數(shù)據(jù)是用多項(xiàng)式 \(f=a^2+5b+9\) 得到的. 用這些數(shù)據(jù)檢查創(chuàng)建的 SDB 是否正確操作. 在現(xiàn)實(shí)世界中,目標(biāo)函數(shù)和測試很可能是未知的,并且非常復(fù)雜. 根據(jù)訓(xùn)練數(shù)據(jù),機(jī)器碼農(nóng)理應(yīng)找到與上述多項(xiàng)式相等的函數(shù),但其結(jié)果可以有不同的形式. 在結(jié)果一節(jié)可以看到,機(jī)器人根據(jù)訓(xùn)練數(shù)據(jù)發(fā)現(xiàn)了多個版本的實(shí)現(xiàn).

    1 號機(jī)器人

    前面說過,1 號機(jī)器人用于演示 SDB 的主要概念,它的性能較差,但勝在代碼簡潔. 1 號以 C# 語言創(chuàng)建 \(f(a,b)\) 形式的函數(shù),產(chǎn)生類似這樣的代碼片段:

    namespace Program {public class WorkingClass{public static int F(int a, int b){return XXX;}} }

    機(jī)器人需要做的根據(jù)表 1 的訓(xùn)練數(shù)據(jù),找到標(biāo)為 XXX 部分的正確的 C# 語句,最后輸出完整的程序. 在這個例子里,機(jī)器人碼農(nóng)在編程時將用到四個算術(shù)運(yùn)算符(+、-、*、/)、兩個變量(a、b)和 9 個數(shù)字(1、2、3、4、5、6、7、8、9).

    作為例子,1 號機(jī)器人程序?qū)崿F(xiàn)的算法也很簡單:

  • 通過將從字母表中隨機(jī)選擇的符號插入到 XXX 位置來創(chuàng)建代碼
  • 把代碼編譯到 RAM。如果編譯失敗,回到 1
  • 運(yùn)行訓(xùn)練數(shù)據(jù)集函數(shù)
  • 比較實(shí)際的函數(shù)輸出和訓(xùn)練數(shù)據(jù)集的結(jié)果,如果有任何不同,回到 1
  • 打印找到的函數(shù)
  • 算法用 C# 實(shí)現(xiàn),使用了反射、動態(tài)代碼生成等技術(shù).

    性能

    這種簡單算法的性能非常之差. 對一個有 4 個操作和 5 個變量的程序來說,最多可以有超過 4100 萬個不同符號組合,這對于簡單的迭代而言計算量太大. 使用普通 PC 是無法勝任的. 就這個例子而言,我在配備 Intel i7 四核處理器的 PC 上花了 10 天時間運(yùn)行 4 個機(jī)器人實(shí)例,才找到一個解決方案.

    2 號機(jī)器人

    1 號機(jī)器人可以用來理解自動創(chuàng)建軟件代碼的最簡單算法,并研究所需的編程語言命令,但運(yùn)行性能太差,不便于觀察結(jié)果. 為了在合理的時間內(nèi)得到結(jié)果,我對 1 號進(jìn)行了改進(jìn),得到 2 號機(jī)器人.

    2 號實(shí)現(xiàn)了遺傳算法,大大減少了尋找解決方案的時間. 在 Intel i7 CPU 單核運(yùn)行的情況下,2 號可以在 5-20 分鐘內(nèi)得到結(jié)果. 它的代碼更復(fù)雜,不過我加入了不少注釋,理解起來應(yīng)該不算太難.

    結(jié)果

    下面的圖片顯示了由 2 號產(chǎn)生的幾個結(jié)果,注意觀察最終生成的 C# 代碼和運(yùn)行時間. 讀者可以下載源代碼并自己運(yùn)行示例(參見使用代碼一節(jié)).

  • 輸出結(jié)果圖(點(diǎn)擊小圓點(diǎn)翻閱)

    未來發(fā)展

    本文展示了創(chuàng)建 SDB 的可能性,但現(xiàn)在還不能用在實(shí)踐中. 不過相關(guān)的技術(shù)如機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、TDD、自動代碼生成等都對它有所裨益. ATDCG 的未來發(fā)展可能涉及到編譯程序和代碼分析器的構(gòu)建經(jīng)驗(yàn). 成熟的機(jī)器人可以創(chuàng)建軟件單元,避免使用高級語言和編譯階段. 它們可以創(chuàng)建由中間語言(CIL)或 Java 字節(jié)代碼(bytecode)組成的單元,這可以顯著加快代碼生成過程. 目前,有很多愛好者研究和開發(fā) ATDCG. 理論研究將為理解 ATDCG 的優(yōu)點(diǎn)以及如何在實(shí)踐中加以實(shí)施打下基礎(chǔ).

    代碼使用說明 返回正文

    1 號碼農(nóng)和 2 號碼農(nóng)開發(fā)、運(yùn)行環(huán)境:

    • 開發(fā) Microsoft Visual Studio Community 2015
    • 編譯 Microsoft .NET Framework 4.5
    • 平臺 Microsoft Windows 8.1 64-bit on Intel i7

    第一個碼農(nóng)

    第二個碼農(nóng)

    兩個例子都使用了單線程,可以多開,但是 CPU 使用率會達(dá)到 100%. 在這樣的高負(fù)荷下,CPU 會嚴(yán)重發(fā)熱,長時間運(yùn)行時要考慮到這一點(diǎn). 2 號碼農(nóng)運(yùn)行起來會快很多,CPU 負(fù)荷更低.

    參考資料

  • [Marvie,06] R. Marvie. An Introduction to Test-Driven Code Generation. EuroPython 2006.
  • [Raymond,03] E. S. Raymond. The Art of Unix Programming. Addison-Wesley, 2003.
  • 歷史

    • 2019-01-22 中文版
    • 2018-12-15 更新了圖片
    • 2016-11-22 首發(fā)

    許可

    文中內(nèi)容全部使用 MIT 許可.

    關(guān)于作者

    Dmitriy Gakh,來自阿塞拜疆 ,軟件工程師、分析員、架構(gòu)師、研究員、IT 應(yīng)用專家、培訓(xùn)師.

    轉(zhuǎn)載于:https://www.cnblogs.com/conmajia/p/source-code-generated-by-bots.html

    總結(jié)

    以上是生活随笔為你收集整理的未来一瞥:机器人码农的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。