生活中的Computer Science

 

Lesson 4. 怎麼會有這麼多程式語言?
程式語言基礎與簡介

程式語言在幹嘛?

其實就是一些指令

 

去去武器走!(武器就飛走了)

疾疾,護法現身!(護法就現身了)

 

有朝一日,可能會變成這樣...

 

 

抓取 後台數據
算出 每日用戶數量 和 留存率
輸出 圖表

抓取 google搜尋"遊戲酒吧"的結果
分析 總共有幾頁
分析 各個詞出現的次數
算出 每個詞的頻率
輸出 圓餅圖

建立 網頁
功能 會員, 文章, 資料搜集, 分析
名稱 我的部落格
建立

組合語言

Assembly language

 

很底層的語言,一個指令只做一兩件事情

start:
mov AL, 5 //把5移到AL裡面去
mov CL, 6 //把6移到CL裡面去
add AL, CL //AL = AL+CL
cmp AL, 100 //拿AL跟100比較
jlt start //jlt = jump if less than, 如果剛剛比較的結果AL<100,就跳到start去
end //結束


開始:
把 5 移到 AL 裡面
把 6 移到 CL 裡面
把 AL 跟 CL 相加,存回AL
把 AL 跟 100 拿來比較
如果 比較的結果是小於的話,跳到標籤"開始"
結束

AL跟CL是"暫存器"的名稱,可以想像成是有一塊記憶體
其實就是一個放資料的地方
讓你可以把資料儲存在那邊

高階語言

叫做高階語言是相對於比較底層的組合語言

大家都看到了,組合語言一行指令做的事情很少

而且可讀性很差,十分難維護,因為我們需要更方便的語言

 

大家常聽到的C++, Java都是屬於高階語言

int a = 5;
int b = 6;
while(a<100){
  a+=b;
}
start:
mov AL, 5
mov CL, 6
add AL, CL
cmp AL, 100
jlt start
end

右邊的程式碼跟左邊的比起來

是不是好懂多了呢?而且比較容易一眼看出在幹嘛

編譯器

Compiler

 

其實高階語言的那些程式碼,都會經過一道手續叫做編譯

編譯是什麼?編譯就是把高階語言的程式碼,變成組合語言

 

沒錯,所以底層還是組合語言

只是用一些語法包裝起來,讓程式的可讀性變得比較高

逆向工程

Reverse engineering

 

剛剛說過,你可以把程式碼編譯之後變成組合語言

接著再產生執行黨來執行程式

 

相反的,也可以把程式逆向回去,變成組合語言的程式碼

這就是逆向工程!

應用比較多的地方,就是軟體破解

假設我們有一段code是這樣

if(已經註冊過){
  給予完整版權限
}else{
  跳出註冊視窗
}

部分翻成組合語言可能是

cmp AX, 1 //拿AX(是否註冊過的結果)跟1比較
jeq vip   //如果相等,代表註冊過,跳去vip的block
jmp askRegister //不相等,跳到要求註冊的區塊

讓我們動一些手腳,原本的是

cmp AX, 1 //拿AX(是否註冊過的結果)跟1比較
jeq vip   //如果相等,代表註冊過,跳去vip的block
jmp askRegister //不相等,跳到要求註冊的區塊

假如我們把jeq改成jne的話...

cmp AX, 1 //拿AX(是否註冊過的結果)跟1比較
jnq vip   //如果不相等,跳去vip的block
jmp askRegister 

我們就得到完整版的權限了 :)

 

以上只是概念性的說法,算是破解的其中一種方法

事實上,事情並沒有那麼簡單(但的確有些就是這麼簡單)

你得要先從茫茫的程式碼海裡面找到關鍵的這一段

並且這個程式要真的這樣寫才行

 

但通常是不會啦,還會再多做更多層的保護

避免軟體被破解

各種語言介紹

C

歷史悠久的程式語言,相信資工系學生一定不陌生

有人稱之為「中階語言」,因為比起其他高階語言更接近底層

越接近底層的語言越難,但也可以做越多事情

C通常應用在一些硬體或韌體的開發上面

int main(){
  for(int i=1;i<=10;i++){
    printf("hello world\n");
  }
}

C++

多了++就知道一定比較新比較厲害

跟C的差別在於語法以及多了「物件導向」這個概念

這概念很難解釋所以我就不講了,有興趣可以自行估狗

C++通常拿來寫一些桌面應用程式

int main(){
  for(int i=1;i<=10;i++){
    cout << "hello world" << endl;
  }
}

Java

Java厲害之處在於跨平台,因為它編譯出來的不是組合語言

而是一種叫做byte code的東西,可以想成是java版的組語

然後會跑在java的虛擬機上面,所以只要電腦有裝java虛擬機

就一定可以跑java的code

import java.util.*;
import java.lang.*;
import java.io.*;

class hello{
    public static void main (String[] args){
	System.out.println("hello world");
    }
}

Javascript

跟Java沒什麼關係,而且差很多,不要搞混了

原本只能用在瀏覽器,所以不被重視

但近幾年因為Google開發的v8引擎太厲害

所以可以在瀏覽器外執行,稱之為node.js,這一兩年很夯

for(var i=1;i<=10;i++{
  alert("hello world!");
}

Ruby

英文中是紅寶石的意思,發明者是一個日本人

特色是有很多特殊的語法,可以很直覺,簡便的寫程式碼

跟寫網頁的框架Rails搭配可以說是威力無窮

近幾年來Ruby on Rails是最夯的快速網頁開發首選

10.times{
  puts "hello"    
}

Brainfuck

顧名思義,就是一個會讓你的頭腦爆炸的程式語言

有一堆奇怪的符號,分別代表著不同指令

可以做的事情很有限,畢竟只是個為了好玩的語言

++++++++[>++++[>++>+++>+++>+<<<<-]>+
>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-
.<.+++.------.--------.>>+.>++.

Whitespace

同上,一個為了好玩的程式語言

指令是空白、tab鍵跟換行

所以程式碼你什麼都看不到

  

總結

恭喜你現在成為一個空有理論(而且也不是很扎實)

而完全沒有實作基礎的人了!

 

這一堂課的目的在於讓大家初步認識什麼是程式語言

以及介紹一些常見或是好玩的程式語言

 

如果有更深的興趣,可以自己上網開始找資料

或是參加一些線上課程,開始自己的程式設計之路

這堂課學到的東西

 

  1. 何謂程式語言
  2. 組合語言
  3. 編譯器
  4. 逆向工程
  5. 各種語言介紹

 

一個猜程式語言的小遊戲

http://helloworldquiz.com/

生活中的Computer Science - Lesson 4

By huli

生活中的Computer Science - Lesson 4

4.怎麼會有這麼多程式語言? 副標:程式語言基礎與簡介 說明:玲琅滿目的程式語言大家一定都聽過其中一些,但卻不知道差別在哪,這個主題會直接切入程式語言的運作方式,帶到組合語言、編譯器,最後簡單介紹各種程式語言

  • 1,614