使用現有線上翻譯服務進行程式碼翻譯的體驗 2018-09-10
阿新 • • 發佈:2019-01-12
前文瀏覽器外掛實現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日 新增結束 --------
基於上面的測試, 嘗試列出一些原始碼翻譯的目標:
程式語言方面
- 具備語法高亮. 雖然所有線上翻譯都不具備這一功能, 但對於原始碼閱讀來說是必需的.
- 程式碼語義不能改變. 比如某一變數翻譯後, 它的所有引用也需翻譯. 這和IDE中的’重新命名’功能類似, 重構後的程式碼需要語義相同. 這依賴於語法分析和程式碼生成, 感覺是這個專案在程式語言方面門檻最高的部分之一. 另外, 程式碼格式不能改變, 各種縮排, 空行等必須保留
- 對無法識別語義的部分, 包括所有相關引用, 傾向於保留原文. 不僅節省計算資源, 也是翻錯不如不翻的考慮.
翻譯方面
- 長句自然語言部分可暫時不翻譯. 原始碼文字中, 最接近自然語言的部分是常量字串(如上面的"Drift!"), 以及註釋行. 對於較長的整句自然語言, 短期很很難做到獨立翻譯.
- 支援關鍵詞翻譯: 程式語言關鍵詞相對較易翻譯, 使用字典一對一翻譯.
- 命名儘量翻譯: 需要進行詞拆分(如按照駝峰命名法)之後進行類自然語言的翻譯, 但多數是詞或短語, 如上面的’setLength’. 對它們的翻譯難度應該小於整句的自然語言翻譯.
還有其他嗎?