不同程式語言是如何完成同一件事
硬派老王 · 程式 ·

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

通過一個簡單的小遊戲比較 13 種程式語言。

通過一個簡單的小遊戲比較13種程式語言。

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

我喜歡寫一些測試程序來幫助練習新的程式語言。其中我經常寫的是一個叫做「猜數字」的小遊戲,計算機選出 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 callgetrandom(&randval, sizeof(int), GRND_NONBLOCK);number = randval % maxval + 1;// Using the standard C librarynumber = 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::

Java:

guess = player.nextInt;

Groovy:

response = reader.readLineint guess = response as Integer

JavaScript:

let myGuess = guess.value

Awk:

guess = int($0)

Lua:

player.answer = io.readplayer.guess = tonumber(player.answer)

告訴我猜測過高還是過低

在這些類 C 語言中,通常是通過 if語句進行比較的。每種程式語言列印輸出的方式有一些變化,但列印語句在每個樣本中都是可識別的。

C:

if (guess number) { puts("Too high");}…puts("That's right!");

C++:

if ( guess > number) { cout 

Rust:

_ if guess 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 

Groovy:

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 

Awk:

if (guess randomNumber) { printf "too high, try again:"} else { printf "that's right\n" exit}

Lua:

if ( player.guess > number ) then print("Too high")elseif ( player.guess 

非類 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)] [(

Python:

if guess random: print("Too high")else: print("That's right!")

Elixir:

cond do guess 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

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

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯
繼續其他精彩內容吧!
more