新聞中心
通過(guò)一個(gè)簡(jiǎn)單的小游戲比較 13 種編程語(yǔ)言。
創(chuàng)新互聯(lián)建站專業(yè)成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,集網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營(yíng)銷、軟文營(yíng)銷等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計(jì),讓網(wǎng)站在運(yùn)行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計(jì)制作為您帶來(lái)效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
當(dāng)我開(kāi)始學(xué)習(xí)一種新的編程語(yǔ)言時(shí),會(huì)把重點(diǎn)放在定義變量、書(shū)寫聲明以及計(jì)算表達(dá)式,一旦對(duì)這些概念有一個(gè)大致的了解,通常就能夠自己弄清剩下的部分。大多數(shù)編程語(yǔ)言都具有相似性,所以如果你掌握了一種編程語(yǔ)言,學(xué)習(xí)下一種語(yǔ)言的重點(diǎn)就是弄清楚獨(dú)有的概念以及區(qū)分不同。
我喜歡寫一些測(cè)試程序來(lái)幫助練習(xí)新的編程語(yǔ)言。其中我經(jīng)常寫的是一個(gè)叫做“猜數(shù)字”的小游戲,計(jì)算機(jī)選出 1 到 100 里的任一數(shù)字,然后我來(lái)猜。程序循環(huán)進(jìn)行,直到猜出正確數(shù)字。通過(guò)偽代碼可以看出,這是個(gè)非常簡(jiǎn)單的程序:
- 計(jì)算機(jī)在 1 到 100 之間選出一個(gè)隨機(jī)數(shù)字
- 循環(huán)進(jìn)行直到猜出該隨機(jī)數(shù)字
- 計(jì)算機(jī)讀取我的猜測(cè)
- 告訴我我的猜測(cè)過(guò)高還是過(guò)低
我們發(fā)表了一些文章,用不同的語(yǔ)言寫這個(gè)程序。這是一個(gè)比較不同語(yǔ)言做同樣事情的有趣機(jī)會(huì)。大多數(shù)編程語(yǔ)言具有相似性,所以當(dāng)你在學(xué)習(xí)下一種新的編程語(yǔ)言時(shí),主要是學(xué)習(xí)它的獨(dú)特之處。
C 語(yǔ)言由 Dennis Ritchie 于 1972 年在貝爾實(shí)驗(yàn)室創(chuàng)建,是一種早期的通用編程語(yǔ)言。C 語(yǔ)言非常受歡迎,并迅速成為 Unix 系統(tǒng)上的標(biāo)準(zhǔn)編程語(yǔ)言。正是因?yàn)樗牧餍?,許多其他編程語(yǔ)言也采用了類似的編程語(yǔ)法。這就是為什么如果你已經(jīng)知道如何使用 C 語(yǔ)言編程,學(xué)習(xí) C++、Rust、Java、Groovy、JavaScript、awk 或 Lua 會(huì)更容易。
接下來(lái)我們看看這些不同的編程語(yǔ)言是如何實(shí)現(xiàn) “猜數(shù)字” 游戲的主要步驟。我將把重點(diǎn)放在基本元素的相似或不同,跳過(guò)一些外圍代碼,如分配臨時(shí)變量。
計(jì)算機(jī)在 1 到 100 之間選出一個(gè)隨機(jī)數(shù)字
你可以看到這里有許多相似之處。大多數(shù)編程語(yǔ)言使用類似 ??rand()?? 的函數(shù),你可以設(shè)定一個(gè)范圍來(lái)生成隨機(jī)數(shù)。而其他一些語(yǔ)言使用一個(gè)特殊的函數(shù)來(lái)設(shè)定范圍生成隨機(jī)數(shù)。
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)
循環(huán)進(jìn)行直到我猜出該隨機(jī)數(shù)字
循環(huán)通常是用控制流程來(lái)實(shí)現(xiàn)的,如 ??while??? 或 ??do-while??。JavaScript 中的實(shí)現(xiàn)沒(méi)有使用循環(huán),而是 “實(shí)時(shí) ”更新 HTML 頁(yè)面,直到用戶猜出正確的數(shù)字。Awk 雖然支持循環(huán),但是通過(guò)循環(huán)讀取輸入信息是沒(méi)有意義的,因?yàn)?Awk 是基于數(shù)據(jù)管道的,所以它從文件而不是直接從用戶讀取輸入信息。
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
計(jì)算機(jī)讀取我的猜測(cè)
不同編程語(yǔ)言對(duì)輸入的處理方式不同。例如,JavaScript 直接從 HTML 表單中讀取數(shù)值,而 Awk 則從數(shù)據(jù)管道中讀取數(shù)據(jù)。
C:
scanf("%d", &guess);C++:
cin >> guess;
Rust:
let parsed = line.ok().as_deref().map(str::parse::);
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è)過(guò)高還是過(guò)低
在這些類 C 語(yǔ)言中,通常是通過(guò) ??if?? 語(yǔ)句進(jìn)行比較的。每種編程語(yǔ)言打印輸出的方式有一些變化,但打印語(yǔ)句在每個(gè)樣本中都是可識(shí)別的。
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 right\n"
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 編程語(yǔ)言會(huì)怎么樣呢?
非類 C 編程語(yǔ)言會(huì)有很大的不同,需要學(xué)習(xí)特定的語(yǔ)法來(lái)完成每一步。Racket 源于 Lisp 和 Scheme,所以它使用 Lisp 的前綴符和大量括號(hào)。Python 使用空格而不是括號(hào)來(lái)表示循環(huán)之類的塊。Elixir 是一種函數(shù)式編程語(yǔ)言,有自己的語(yǔ)法。Bash 是基于 Unix 系統(tǒng)中的 Bourne shell,它本身借鑒了 Algol68,并支持額外的速記符,如 ??&&??? 作為 ??and?? 的變體。Fortran 是在使用打孔卡片輸入代碼的時(shí)期創(chuàng)建的,所以它依賴于一些重要列的 80 列布局。
我將通過(guò)比較 ??if??? 語(yǔ)句,舉例表現(xiàn)這些編程語(yǔ)言的不同。??if?? 判斷一個(gè)值是否小于或大于另一個(gè)值,并向用戶打印適當(dāng)信息。
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
更多
當(dāng)你在學(xué)習(xí)一種新的編程語(yǔ)言時(shí) “猜數(shù)字” 游戲是一個(gè)很友好的入門程序,通過(guò)一種簡(jiǎn)單的方式練習(xí)了幾個(gè)常見(jiàn)的編程概念。通過(guò)不同編程語(yǔ)言實(shí)現(xiàn)這個(gè)簡(jiǎn)單游戲,你可以理解一些核心概念和每種語(yǔ)言的細(xì)節(jié)。
網(wǎng)站題目:不同編程語(yǔ)言是如何完成同一件事
轉(zhuǎn)載源于:http://fisionsoft.com.cn/article/djoeipd.html


咨詢
建站咨詢

