通義靈碼——靈動指間,快碼加編,你的智慧編碼助手

發表於2024-02-11

通義靈碼,是阿里雲出品的一款基於通義大模型的智慧編碼輔助工具,提供行級/函式級實時續寫、自然語言生成程式碼、單元測試生成、程式碼最佳化、註釋生成、程式碼解釋、研發智慧問答、異常報錯排查等能力,並針對阿里雲的雲服務使用場景調優,助力開發者高效、流暢的編碼。

點選此處立即參與通義靈碼體驗!

程式碼智慧生成,完成工作更高效

經過海量優秀開原始碼資料訓練,可根據當前程式碼檔案及跨檔案的上下文,為你生成行級/函式級程式碼、單元測試、程式碼註釋等。沉浸式編碼心流,秒級生成速度,讓你更專注在技術設計,高質高效地完成編碼工作。

行/函式級實時續寫

在編碼的過程中,根據上下文和當前語法,為你自動預測和生成建議程式碼,你只需單擊 Tab 鍵即可採納。

public class ZipUtil {
  // 將檔案壓縮為zip檔案
  public static void zip(String sourceDir, String zipFile) {icon
    try (ZipOutputStream zos = new ZipOutputStream(
      new FileOutputStream(zipFile))) {
      File[] files = new File(sourceDir).listFiles();
      for (File file : files) {
          if (file.isFile()) {
              zos.putNextEntry(
                new java.util.zip.ZipEntry(
                  file.getName()
                )
              );
              zos.write(FileUtils.readFileToByteArray(file));
              zos.closeEntry();
          }
      }
    } catch (Exception e) {
        e.printStackTrace();
    }
  }

自然語言生成程式碼

在編輯器中,透過自然語言描述你想要的功能,根據你的描述和上下文,支援在編輯器區直接生成程式碼及相關注釋,編碼心流不間斷。

// 生成 SHA1 簽名

public static String sha1(String str) {
  try {
      MessageDigest md = MessageDigest.getInstance(
        "SHA-1"
      );
      md.update(str.getBytes());
      byte[] digest = md.digest();
      return java.util.Base64.getEncoder().
        encodeToString(digest);
  } catch (Exception e) {
      throw new RuntimeException(e);
  }
}
public static void main(String[] args) {
  String str = "123456";
  String sign = sha1(str);
  System.out.println(sign);
}|

單元測試生成

支援根據 JUnit、Mockito、Spring Test、unit test、pytest 等框架生成單元測試以及單元測試相關程式碼解釋。

import org.junit.Assert;
import org.junit.Test;

public class DemoTest {
    @Test
    public void testMerge() {
        int[] nums1 = {1, 3, 5, 0, 0, 0};
        int[] nums2 = {2, 4, 6};
        int[] expected = {1, 2, 3, 4, 5, 6};
        int[] result = Demo.merge(nums1, 3, nums2, 3);

        Assert.assertArrayEquals(expected, result);
    }
}|

程式碼最佳化

深度分析程式碼及其上下文,迅速識別潛在的編碼問題,從簡單的語法錯誤到複雜的效能瓶頸,均能夠指出問題所在,並提供具體的最佳化建議程式碼。

這段程式碼的目的是建立一個 ArrayList,向其新增兩個字串元素,然後檢查這個列表是否包含了所有它自己的元素。然而,這樣的檢查是無意義的,因為這樣的列表永遠為真。此外,如果列表確實包含了所有元素,那麼程式碼將列印出"Hello world",並移除所有這些元素,使用 removeAll 方法代替 clear 方法,這在列表中有很多元素時會影響效能。

最佳化後的程式碼如下:

public static void foo() {
  List<String> list = new ArrayList<>();
  list.add("Hello");
  list.add("World");
  if (list.size() == 2) { // 假設您需要檢查列表是否包含兩個特定的元素
      System.out.println("Hello world");
  }
  list.clear(); // 更高效的清空方法
}

在這個最佳化版本中,我移除了list.containsAll(list)的呼叫,因為它總是返回true,並且沒有實際的檢查目的。相反,我檢查list的size是否等於2,這取決於您實際的業務需求,假設您需要確保列表包含兩個特定的元素。如果list.size()等於2,那麼假設條件成立,會列印出"Hello world"。最後,使用clear()來清空列表,這是一個更高效的方法,因為它在內部不需要進行復雜的remove操作。請根據您的實際需求調整對list.size()的檢查。如果您的需求不是檢查特定數量的不同元素,您可以移除這個檢查,並且直接呼叫list.clear()來清空列表。

程式碼註釋生成

一鍵生成方法註釋及行間註釋,節省你寫程式碼註釋的時間,有效提升程式碼可讀性和註釋覆蓋率。

/**
 * 壓縮檔案或目錄到Zip檔案中
 * @param file 要壓縮的檔案或目錄
 * @param zos ZipOutputStream物件
 * @throws Exception 壓縮過程中可能出現的異常
 */
private static void zip(File file, ZipOutputStream zos) 
throws Exception {
   // 如果是檔案,則直接壓縮
   if (file.isFile()) {
       zos.putNextEntry(new ZipEntry(file.getName()));
       FileInputStream in = new FileInputStream(file);
       int len;
       byte[] buf = new byte[1024];
       while ((len = in.read(buf)) != -1) {
           zos.write(buf, 0, len);
       }
       in.close();
   } else {
       File[] files = file.listFiles();
       for (File f : files) {
           zip(f, zos);
       }
   }
}|

程式碼解釋

支援 30 多種語言的識別,選中程式碼後可自動識別程式語言並生成程式碼解釋。跨越語言的邊界,讓你快速瞭解程式碼邏輯和功能設計。

public static List<String> listDir(OssConfig 
  cfg, String keyPreffix) {
      List<String> result = new ArrayList<>();
      OSSClient ossClient = new OSSClient(
        cfg.endpoint, cfg.accessKeyId, cfg.accessKeySecret
      );
      String nextMarker = null;
  try {
      ObjectListing objectListing = null;
      do {
          objectListing = ossClient.listObjects(
              new ListObjectsRequest(cfg.bucketName)
                  .withPrefix(keyPreffix)
                  .withDelimiter("/")
                  .withMarker(nextMarker));
          for (String commonPrefix : objectListing.
            getCommonPrefixes()) {
              result.add(commonPrefix);
          }
          nextMarker = objectListing.getNextMarker();
      } while (objectListing != null && objectListing.
        isTruncated());
  } catch (Exception e) {
      log.error(e.getMessage(), e);
  } finally {
      ossClient.shutdown();
  }
  return result;
}
該函式用於在阿里雲 OSS 中列出指定字首的資料夾列表。透過迴圈呼叫OSSClient 的 listObjects 方法,獲取資料夾列表並將其新增到結果列表中。最後返回結果列表。

研發智慧問答,解決問題更輕鬆

基於海量研發文件、產品文件、通用研發知識、阿里雲的雲服務文件和 SDK/OpenAPI 文件等進行問答訓練,為你答疑解惑,助你輕鬆解決研發問題。

研發領域知識問答

例如:

問:如何呼叫阿里雲 OSS 服務下載檔案

通義靈碼:呼叫阿里雲 OSS 服務下載檔案可以透過以下步驟實現:

  1. 在阿里雲控制檯上建立 OSS 儲存桶(Bucket)並上傳需要下載 的檔案;
  2. 獲取儲存桶和檔案的 URL:在阿里雲控制檯上可以找到儲存桶的 URL,檔案的 URL 可以透過在儲存桶中選擇檔案並點選“複製連結” 來獲取;
  3. 使用程式語言中的 HTTP 客戶端庫傳送 HTTP GET 請求到檔案的 URL 上。根據需要可以設定請求頭、請求體等引數;
  4. 伺服器收到請求後,會返回檔案內容。根據需要可以將檔案內容保 存到本地檔案系統或直接寫入到其他輸出流中。

異常報錯智慧排查

Exception in thread "main" java.lang.
StringIndexOutOfBoundsException Create breakpoint :index 1,lengt at java.base/java.lang.String.checkIndex(String.java:3278)
at java.base/java.lang.String.checkIndex(String.java:3278)
at java.base/java.lang.AbstractStringBuilder.deleteCharAt(AbstractStringBuilder.j

通義靈碼:這段程式碼會出現 java.lang.StringIndexOutOfBoundsException: index 1, length 0 異常的原因是 StringBuilder 的長度為0,無法 刪除下標為1的字元。要修復這個問題,可以先給 StringBuilder 新增字 符,例如前面加上 stringBuilder.append("Hello"),刪除指定字元後 則會輸出 Hllo 。在這個例子中,stringBuilder 的初始長度為5,刪除 下標為 1 的字元後,長度變為4。

多程式語言、多編輯器全方位支援

支援 Java、Python、Go、JavaScript、TypeScript、C/C++、C# 等主流語言,同時相容 Visual Studio Code、JetBrains IDEs 等主流程式設計工具,為你提供高效、流暢、舒心的智慧編碼體驗。

image.png

未來已來,碼上見證

根據阿里雲內部研發全面應用和真實反饋,通義靈碼自動生成的推薦程式碼中,有 30%~50% 被程式碼開發者採納,成倍地提升研發工作效率。

通義靈碼已經不再是玩具,而是生產力工具!——極海|資深技術專家

用通義靈碼把編碼、調研、分析交給大語言模型,發揮人類工程師獨特創造性。——張剛|英慕科技創始人

嘗試用通義靈碼寫了 OpenAPI 的測試,在已寫的API 的基礎上寫第二個時,助手首次給出的補全匹配度達到 60%~70%。我糾正過一次後,後續匹配度達到80%~90%,體驗超預期。——阿里雲測試工程師

認真的把通義靈碼從頭到尾玩了一遍,整體來說還是很驚喜的。尤其是通義靈碼的條件下SHELL指令碼自生成能力已經達到高階,能夠根據要求編寫一系列複雜shell指令碼。——週週|某政企事業單位工程師

*通義靈碼的續寫程式碼功能非常強大。它能夠根據當前的程式碼上下文,預測出可能的程式碼走向,給出合適的程式碼片段,極大地提高了程式設計效率。同時,它也能自動識別程式語言,並給出相應的程式碼解釋,對於學習程式設計的新手來說非常有幫助。
除了續寫程式碼功能,通義靈碼的生成測試程式碼功能也十分出色。相較於人工編寫測試用例需要數分鐘甚至數十分鐘的時間,通義靈碼可以以毫秒級的速度生成測試程式碼,且準確率和覆蓋率都令人滿意。——朗新科技 資深產品工程師*

通義靈碼作為國產工具,更加符合國內人的情況:通義靈碼在智慧問答、單元測試生成、程式碼解釋,起到了非常大的幫助。新接手專案,使用通義靈碼的程式碼解釋,大大提高了瞭解的效率;開發過程中,API查詢,用靈碼問答詢問更加高效,省了Google和Bing的查詢次數。——海爾科技|技術架構師

點選此處,立即瞭解「通義靈碼」並參與使用!