Linux中國

不同編程語言是如何完成同一件事

當我開始學習一種新的編程語言時,會把重點放在定義變數、書寫聲明以及計算表達式,一旦對這些概念有一個大致的了解,通常就能夠自己弄清剩下的部分。大多數編程語言都具有相似性,所以如果你掌握了一種編程語言,學習下一種語言的重點就是弄清楚獨有的概念以及區分不同。

我喜歡寫一些測試程序來幫助練習新的編程語言。其中我經常寫的是一個叫做「猜數字」的小遊戲,計算機選出 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)

循環進行直到我猜出該隨機數字

循環通常是用控制流程來實現的,如 whiledo-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&apos;s right!");

C++:

if ( guess > number) { cout << "Too high.n" << endl; }
else if ( guess < number ) { cout << "Too low.n" << endl; }
else {
    cout << "That&apos;s right!n" << endl;
    exit(0);
}

Rust:

_ if guess < random => println!("Too low"),
_ if guess > random => println!("Too high"),
_ => {
    println!("That&apos;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&apos;s right!");
    System.exit(0);
}

Groovy:

if (guess < randomNumber)
    print &apos;too low, try again: &apos;
else if (guess > randomNumber)
    print &apos;too high, try again: &apos;
else {
    println "that&apos;s right"
    break
}

JavaScript:

if (myGuess === randomNumber) {
    feedback.textContent = "You got it right!"
} else if (myGuess > randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That&apos;s too high. Try Again!"
} else if (myGuess < randomNumber) {
    feedback.textContent = "Your guess was " + myGuess + ". That&apos;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&apos;s rightn"
    exit
}

Lua:

if ( player.guess > number ) then
    print("Too high")
elseif ( player.guess < number) then
    print("Too low")
else
    print("That&apos;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&apos;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&apos;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 *, &apos;TOO LOW&apos;
ELSE IF (GUESS.GT.NUMBER) THEN
    PRINT *, &apos;TOO HIGH&apos;
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

其他語言:

via: https://opensource.com/article/21/4/compare-programming-languages

作者:Jim Hall 選題:lujun9972 譯者:VeryZZJ 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國