1. 程式人生 > >使用現有線上翻譯服務進行程式碼翻譯的體驗 2018-09-10

使用現有線上翻譯服務進行程式碼翻譯的體驗 2018-09-10

前文瀏覽器外掛實現GitHub程式碼翻譯原型演示之後, 意識到現有線上翻譯服務已經具備部分設想的功能.

第一個測試, 選了一個很小的Python入門例程:

class Person:
    pass  # An empty block

p = Person()
print(p)

谷歌翻譯:

班級人物:
     傳遞#空塊

p =人()
列印(P)

百度翻譯:

類人:
傳遞空塊

P=個人()
列印(P)

有道翻譯:

類人:
傳遞一個空塊
p =人()
列印(p)

搜狗翻譯:

階級人士:
傳遞#一個空塊
p =人( )
印刷(印刷)

可以看出, 谷歌翻譯是唯一一個保全原有程式碼格式的. 而其他的都刪除了縮排, 甚至空行和特殊字元(#). 這會很大影響程式碼可讀性, 對Python來說也直接影響語義.

第二個測試, 也是很小的Java入門例程:

package com.headfirstjava.chapterseven.boats;

public class Boat {

    private int length;

    public int getLength() {
        return length;
    }

    public void setLength(int len)
{ length = len; } public void move() { System.out.print("Drift! "); } }

谷歌:

package com.headfirstjava.chapterseven.boats;

公共艙船{

     private int length;

     public int getLength(){
         返回長度;
    }

     public void setLength(int len){
         長度= len;
    }

     public void move(){
         System.out.print(“Drift!”);
    }
}

它的翻譯較為保守, 沒有翻譯很多與自然語言相差很大的程式碼行. 這也導致一處’length’變數名沒有翻譯.

百度:

包裝件。
公務艙船
私有int長度;
Puint int GETLINTHOST()
返回長度;
}
公共無效設定長度(int LeN){
長度=Le;
}
公共空隙MOVE()
列印輸出(“漂移”);
}
}

這裡有不少將原詞改寫的情況, 比較不理解. 如getLength變為GETLINTHOST, len變為Le. 另外, 同樣是void, 有’無效’和’空隙’兩種翻譯, 應該是考慮了上下文.

有道:

包com.headfirstjava.chapterseven.boats;

公共級艇

私人int長度;

public int getLength() {
返回長度;
}

public void setLength(int len) {
長度=蘭;
}

public void move() {
System.out.print(“漂移!”);
}
}

它也比較保守, 但同樣的len, 一處沒有翻譯, 一處譯為’蘭’, 這樣也改變了程式碼語義.

搜狗:

Java . chaptersen .船;
公共船
私有整數長度;
公共整數getLength ( )
返回長度;
}
公共空隙設定長度(內部透鏡) (
長度=鏡頭;
}
公共空間移動( )
系統輸出列印(“漂移!”);
}
}

與百度類似, 也有改寫詞: chapterseven被縮減成chaptersen. 另外int被解釋成’內部’, 也許是認為原文是’in’的筆誤?

------- 2018年十月2日 新增 --------

在Chrome翻譯嘗試如下, 發現比google線上翻譯更進一步. 看起來html元素分割後, 不同語法部分可以更容易識別, 這與前文瀏覽器外掛實現GitHub程式碼翻譯原型演示是異曲同工.

package  com.headfirstjava.chapterseven.boats ;

公共 艙 船 {

    private  int length;

    public  int  getLength(){
        返回長度;
    }

    public  void  setLength(int  len){
        長度= len;
    }

    public  void  move(){
        系統。出。列印(“漂移!”);
    }
}

------- 2018年十月2日 新增結束 --------

基於上面的測試, 嘗試列出一些原始碼翻譯的目標:

程式語言方面

  1. 具備語法高亮. 雖然所有線上翻譯都不具備這一功能, 但對於原始碼閱讀來說是必需的.
  2. 程式碼語義不能改變. 比如某一變數翻譯後, 它的所有引用也需翻譯. 這和IDE中的’重新命名’功能類似, 重構後的程式碼需要語義相同. 這依賴於語法分析和程式碼生成, 感覺是這個專案在程式語言方面門檻最高的部分之一. 另外, 程式碼格式不能改變, 各種縮排, 空行等必須保留
  3. 對無法識別語義的部分, 包括所有相關引用, 傾向於保留原文. 不僅節省計算資源, 也是翻錯不如不翻的考慮.

翻譯方面

  1. 長句自然語言部分可暫時不翻譯. 原始碼文字中, 最接近自然語言的部分是常量字串(如上面的"Drift!"), 以及註釋行. 對於較長的整句自然語言, 短期很很難做到獨立翻譯.
  2. 支援關鍵詞翻譯: 程式語言關鍵詞相對較易翻譯, 使用字典一對一翻譯.
  3. 命名儘量翻譯: 需要進行詞拆分(如按照駝峰命名法)之後進行類自然語言的翻譯, 但多數是詞或短語, 如上面的’setLength’. 對它們的翻譯難度應該小於整句的自然語言翻譯.

還有其他嗎?