不同編程語言是如何完成同一件事
當我開始學習一種新的編程語言時,會把重點放在定義變數、書寫聲明以及計算表達式,一旦對這些概念有一個大致的了解,通常就能夠自己弄清剩下的部分。大多數編程語言都具有相似性,所以如果你掌握了一種編程語言,學習下一種語言的重點就是弄清楚獨有的概念以及區分不同。
我喜歡寫一些測試程序來幫助練習新的編程語言。其中我經常寫的是一個叫做「猜數字」的小遊戲,計算機選出 1 到 100 里的任一數字,然後我來猜。程序循環進行,直到猜出正確數字。通過偽代碼可以看出,這是個非常簡單的程序:
- 計算機在 1 到 100 之間選出一個隨機數字
- 循環進行直到猜出該隨機數字
- 計算機讀取我的猜測
- 告訴我我的猜測過高還是過低
我們發表了一些文章,用不同的語言寫這個程序。這是一個比較不同語言做同樣事情的有趣機會。大多數編程語言具有相似性,所以當你在學習下一種新的編程語言時,主要是學習它的獨特之處。
C 語言由 Dennis Ritchie 於 1972 年在貝爾實驗室創建,是一種早期的通用編程語言。C 語言非常受歡迎,並迅速成為 Unix 系統上的標準編程語言。正是因為它的流行,許多其他編程語言也採用了類似的編程語法。這就是為什麼如果你已經知道如何使用 C 語言編程,學習 C++、Rust、Java、Groovy、JavaScript、awk 或 Lua 會更容易。
接下來我們看看這些不同的編程語言是如何實現 「猜數字」 遊戲的主要步驟。我將把重點放在基本元素的相似或不同,跳過一些外圍代碼,如分配臨時變數。
計算機在 1 到 100 之間選出一個隨機數字
你可以看到這裡有許多相似之處。大多數編程語言使用類似 rand()
的函數,你可以設定一個範圍來生成隨機數。而其他一些語言使用一個特殊的函數來設定範圍生成隨機數。
C:
// Using the Linux `getrandom` system call
getrandom(&randval, sizeof(int), GRND_NONBLOCK);
number = randval % maxval + 1;
// Using the standard C library
number = rand() % 100 + 1;
C++:
int number = rand() % 100+1;
Rust:
let random = rng.gen_range(1..101);
Java:
private static final int NUMBER = r.nextInt(100) + 1;
Groovy:
int randomNumber = (new Random()).nextInt(100) + 1
JavaScript:
const randomNumber = Math.floor(Math.random() * 100) + 1
awk:
randomNumber = int(rand() * 100) + 1
Lua:
number = math.random(1,100)
循環進行直到我猜出該隨機數字
循環通常是用控制流程來實現的,如 while
或 do-while
。JavaScript 中的實現沒有使用循環,而是 「實時 」更新 HTML 頁面,直到用戶猜出正確的數字。Awk 雖然支持循環,但是通過循環讀取輸入信息是沒有意義的,因為 Awk 是基於數據管道的,所以它從文件而不是直接從用戶讀取輸入信息。
C:
do {
…
} while (guess != number);
C++:
do {
…
} while ( number != guess );
Rust:
for line in std::io::stdin().lock().lines() {
…
break;
}
Java:
while ( guess != NUMBER ) {
…
}
Groovy:
while ( … ) {
…
break;
}
Lua:
while ( player.guess ~= number ) do
…
end
計算機讀取我的猜測
不同編程語言對輸入的處理方式不同。例如,JavaScript 直接從 HTML 表單中讀取數值,而 Awk 則從數據管道中讀取數據。
C:
scanf("%d", &guess);
C++:
cin >> guess;
Rust:
let parsed = line.ok().as_deref().map(str::parse::<i64>);
if let Some(Ok(guess)) = parsed {
…
}
Java:
guess = player.nextInt();
Groovy:
response = reader.readLine()
int guess = response as Integer
JavaScript:
let myGuess = guess.value
Awk:
guess = int($0)
Lua:
player.answer = io.read()
player.guess = tonumber(player.answer)
告訴我猜測過高還是過低
在這些類 C 語言中,通常是通過 if
語句進行比較的。每種編程語言列印輸出的方式有一些變化,但列印語句在每個樣本中都是可識別的。
C:
if (guess < number) {
puts("Too low");
}
else if (guess > number) {
puts("Too high");
}
…
puts("That's right!");
C++:
if ( guess > number) { cout << "Too high.n" << endl; }
else if ( guess < number ) { cout << "Too low.n" << endl; }
else {
cout << "That's right!n" << endl;
exit(0);
}
Rust:
_ if guess < random => println!("Too low"),
_ if guess > random => println!("Too high"),
_ => {
println!("That's right");
break;
}
Java:
if ( guess > NUMBER ) {
System.out.println("Too high");
} else if ( guess < NUMBER ) {
System.out.println("Too low");
} else {
System.out.println("That's right!");
System.exit(0);
}
Groovy:
if (guess < randomNumber)
print 'too low, try again: '
else if (guess > randomNumber)
print 'too high, try again: '
else {
println "that's right"
break
}
JavaScript:
if (myGuess === randomNumber) {
feedback.textContent = "You got it right!"
} else if (myGuess > randomNumber) {
feedback.textContent = "Your guess was " + myGuess + ". That's too high. Try Again!"
} else if (myGuess < randomNumber) {
feedback.textContent = "Your guess was " + myGuess + ". That's too low. Try Again!"
}
Awk:
if (guess < randomNumber) {
printf "too low, try again:"
} else if (guess > randomNumber) {
printf "too high, try again:"
} else {
printf "that's rightn"
exit
}
Lua:
if ( player.guess > number ) then
print("Too high")
elseif ( player.guess < number) then
print("Too low")
else
print("That's right!")
os.exit()
end
非類 C 編程語言會怎麼樣呢?
非類 C 編程語言會有很大的不同,需要學習特定的語法來完成每一步。Racket 源於 Lisp 和 Scheme,所以它使用 Lisp 的前綴符和大量括弧。Python 使用空格而不是括弧來表示循環之類的塊。Elixir 是一種函數式編程語言,有自己的語法。Bash 是基於 Unix 系統中的 Bourne shell,它本身借鑒了 Algol68,並支持額外的速記符,如 &&
作為 and
的變體。Fortran 是在使用打孔卡片輸入代碼的時期創建的,所以它依賴於一些重要列的 80 列布局。
我將通過比較 if
語句,舉例表現這些編程語言的不同。if
判斷一個值是否小於或大於另一個值,並向用戶列印適當信息。
Racket:
(cond [(> number guess) (displayln "Too low") (inquire-user number)]
[(< number guess) (displayln "Too high") (inquire-user number)]
[else (displayln "Correct!")]))
Python:
if guess < random:
print("Too low")
elif guess > random:
print("Too high")
else:
print("That's right!")
Elixir:
cond do
guess < num ->
IO.puts "Too low!"
guess_loop(num)
guess > num ->
IO.puts "Too high!"
guess_loop(num)
true ->
IO.puts "That's right!"
end
Bash:
[ "0$guess" -lt $number ] && echo "Too low"
[ "0$guess" -gt $number ] && echo "Too high"
Fortran:
IF (GUESS.LT.NUMBER) THEN
PRINT *, 'TOO LOW'
ELSE IF (GUESS.GT.NUMBER) THEN
PRINT *, 'TOO HIGH'
ENDIF
更多
當你在學習一種新的編程語言時 「猜數字」 遊戲是一個很友好的入門程序,通過一種簡單的方式練習了幾個常見的編程概念。通過不同編程語言實現這個簡單遊戲,你可以理解一些核心概念和每種語言的細節。
學習如何用 C 和類 C 語言編寫 「猜數字」 遊戲:
- C, Jim Hall
- C++, Seth Kenlon
- Rust, Moshe Zadka
- Java, Seth Kenlon
- Groovy, Chris Hermansen
- JavaScript, Mandy Kendall
- awk, Chris Hermansen
- Lua, Seth Kenlon
其他語言:
- Racket, Cristiano L. Fontana
- Python, Moshe Zadka
- Elixir, Moshe Zadka
- Bash, Jim Hall
- Fortran, Jim Hall
via: https://opensource.com/article/21/4/compare-programming-languages
作者:Jim Hall 選題:lujun9972 譯者:VeryZZJ 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive