2016年4月13日 星期三

[網購] KINMAC民族風系列雙肩電腦包 淘寶 心得

嗨~~~大家好我又手滑了
只是跟以往不同的是這次不是在Buytogether板
是私下跟幾個人一起買而已喔~三個人的份量,使用淘寶集運到台灣,寄到同個地方再分貨。

這次買的是從網頁圖上就覺得很華麗的後背電腦包。

賣場圖:

160109Kinmiac_热销款背包(带切片)01_05

很漂亮吧><
所以我就買這款了~

[攝影] 手機用魚眼、微距、廣角三合一鏡頭組實拍~使用iPhone5


最近總是陰雨綿綿。

(雨鞋派上用場了呢😄)

這是在NOVA裡面購買的超便宜手機用三合一鏡頭組用手機拍的照片
只要128元~太便宜了所以想都沒想就買來玩了
第一次在手機上使用外接的鏡頭:3

[海洋學] 海洋學小問答小整理

其實是期中考週到了來整理一下。
課後填寫的部分,有在上課就會寫了。
不過真的要找的話老師給的PPT裡面也是有啦~

 覺得非常有趣的一張地圖...


[UNIX] 作業系統上安裝git&增加ssh key

學校測試機是FreeBSD的。
要安裝git的話,要使用pkg來安裝:

pkg install git

接下來要可以為了讓欲連結的github, gitlab伺服器能授權,必須使用SSH Key公開金鑰來授權。

2016年4月12日 星期二

[Mac/ Linux] Highlight Your VIM Editor

mac內建的terminal中的vim編輯器是沒有任何highlight顏色顯示的
為了方便編輯在這裡做一些修改

[網購] 生火雨牧英倫時尚風雨鞋/雨靴

undefined噹啷~~人生第一雙新雨鞋get合購板最近真是我的新寵呀快被他燒到體無完膚了很不幸的這次跟到的團 拖得滿久的QQ賣家那邊發貨量一直不足等了兩三個禮拜才拿到手那時還想說 靠勒雨都下完了TAT 不過好險最近天氣預報說這幾天會下雨(怎麼感覺有點幸災樂禍XD)可以讓我好好見識雨鞋之防水功力啦!

[程語] C/C++如何執行一個程式

Programming Language的作業中看到的,
因為自己觀念也沒釐清,
所以就查了書籍及在上網中找資料,
做了一些心得小筆記。 以下是題目給的C語言code


Assume the executable file of the program example.c is called example.exe. (a) Which program handles the statement "#include <stdio.h>" in file example.c?(b) Which program handles the statement at line 2 in file example.c to generate corresponding machine code in example.exe?(哪個program有line 2的statement可以產生相應的機器碼(也是目的碼:object code)於可執行檔example.exe呢?)
C語言的code的第一行通常是引入header檔
像是 #include <stdio.h>但會是哪個部分處理 .c 中的這一行程式碼呢?-要解這題必須要先懂C/C++執行程式的流程步驟的概念,
首先,電腦程式語言分成三種,相信會看這篇文章的大家應該都知道,
分別是1. 高階語言、 2. 組合語言、3. 機器語言這三個層次

高階語言High-Level Language
像是C/C++這些high-level language,他們會隱藏執行程式的電腦與OS的細節,
這個特性稱為 platform-independent,就是平台獨立的意思,
因為相同code不必被修改就可以在不同microprocessor(微處理器)和OS的電腦中轉換及執行。

組合語言Assembly Language
組合語言可以直接處理儲存在微處理器裡面的資料,可以從memory中載入資料到register以處理資料,執行運算。
非平台獨立。

機器語言Machine Language
最低層次的programming language.,是給機器看的機器指令。
當微處理器讀入並執行一個指令時,此指令即為機器語言指令。
Programmer並不是直接寫機器語言,而是用高階語言或組合語言撰寫,再經由微處理機轉換,才可被微處理器執行。

Compiling and Assembling.
高階語言被編譯(compiled)

輸入code到compiler檢查程式,確保每一個statement都有效。若不含syntax error(語法錯誤),編譯器就會完成source code,即為來源碼,然後產生object code檔,目的碼檔->即為機器語言
編譯完成後還不能執行,因為還必須使用其他program的object code。
而誰來結合呢?
我們依靠  Linker ---- 連結器來結合自身及其他所需的obj code。
而結合成後會儲存成executable file,就是我們常見副檔名為 .exe的可執行檔。
那怎麼執行呢?


Loader ---- 載入器會複製exe檔
組合語言被組譯(assembled)
source code會被compiled



而回到問題本身(終於繞回來了XD)
那些前面有#的敘述到底由誰來處理?
Ans:
Preprocessor,就是前置處理器/預處理器

他負責處理巨集,在Compler開始編譯程式之前會自動啟動。
我們將最前面有#的敘述稱為前置處理指引敘述。


Preprocessor的功能:1. 檔案含入功能: #include
2. 字串置換和巨集定義:#define#undef
3. 條 件 編 譯 : #if...#elif...#else...#endif #ifdef...#else...#endif #ifndef...#else...#endif 


第二個問題(什麼program處理非#的敘述?)

從文章一開始就能知道是Compiler在做這些事情囉。


小整理:
C/C++ 語言並不複雜,但由於它的原始碼(source code)是要用來被編譯為讓電腦能直接執行的機械碼(object code, 或俗稱 binary code)的, C/C++ 語言的一個學習重點就是一定要同時了解語言編譯器(compiler, 例如 Visaul C++)是怎麼把你的 .cpp 原始碼變成 .exe 執行檔的C/C++特性
  1. 原始碼通常被編譯為Machine Code,但Java和C#不會,C/C++會直接處理資料儲存格式與編碼方式。
  1. 語言變數的宣告/使用方式與記憶體實際儲存方式符合。
  1. 可直接依address存取記憶體, 現在幾乎只有C/C++有pointer的資料型態囉。
  1. OS和韌體本身常用C語言撰寫,就是因為他們可以直接編譯好給CPU執行的machine code,所以是主流
  1. Strong type=強型別語言

要寫出可執行的程式要素:
  1. 程式語言知識
  1. Compiler
  1. 必須的程式庫

How OS Execute A Program?OS會先在RAM配置一塊給Program用的記憶體,再將.exe檔由硬碟仔速到專屬記憶體program counter(城市指位器)指向該記憶體中的Machine code起始位置程式開始執行
CPU fetches a machine code, (may need decoding), execute it and move PC so that it PC can point to the next instruction.Unless Jump happens, PC points to other address where the machine code put.
Fetch -> Decode -> Execute -> Increment PC ——^——循環——————————————————|
編譯器Compiler的工作例子:Object Code                    程式語言(Source Code)Register <- [b]                    a=b+cRegister <- [c]選擇&執行加法電路Register -> [a]
把原始碼重新編成、翻譯為machine code(object code, binary code)。因為CPU 無法處理有語意的指令,所以如上面的例子,意思是把 b 和 c 相加以後,以此結果賦予 a 變數的值,編譯器所產生的機械碼可能是把 [b] 數值搬移(move)到 暫存器,接著把 [c] 數值搬移到 CPU 的另一個暫存器,接著如上圖地,輸出加法運算的機械碼(設定 CPU 周圍的針腳以選用加法電路),若干 clock 以後,某個暫存器中的值變成方才兩個暫存器相加的值,接著下一行,另一個搬移的機械碼又把結果搬移到記憶體的 [a] 位置。


Linker的工作

要在電腦螢幕上顯示一行”Hello World1"文字
是 .cpp這個原始檔做的事情,經過compiler變成了 .obj檔,
printf()就是被呼叫的內建函式,不過其原始碼不在這個產生的 .cpp/ .obj裡面
所以.cpp只有呼叫printf()來顯示這些文字。

函式就是一段code segment, 

一個程式所呼叫的函式可能在另一個原始碼檔案(.c 或 .cpp)當中,
也可能在另一個ㄐㄧ碼檔案(.obj)中,
也可能在程式庫檔案中(.lib)中,
無論如何,當編譯器在編譯 HelloWorld.cpp 的時候它並不知道 printf( ) 的程式碼在哪裡,亦不知道程式的

流程該跳往何位址,所以在編譯出的 .obj 檔案中這個「空格」會被保留下來,
而由連結器(linker)收集了所有的目的檔(.obj與.lib)以後,才將它們填上,
其實程式庫檔案(.lib)只不過是一些machine code(.obj)的集合體。


承續上面的例子,連結器所產出的可執行檔(executable file)裡面,

它把 HelloWorld.obj 和 printf( ) 的機械碼都合併 HelloWorld.exe 當中了,

所以在 HelloWorld.obj 當中呼叫 printf( )函式所造成的程式流程跳躍(jump),

就變成了是同一個 .exe 檔案內(作業系統載入後是同一塊記憶體內)的位址跳躍了,

所以連結器可以明確地寫上位址數值,

總結地來說連結器所做的事情就是收集像這樣互相參考的machine code、合併為執行檔、並且填寫這些machine code之間的參考位址,

這就是為甚麼通常由source code產生的可執行檔都會比原始檔案大很多,

因為合併了許多來其他檔案的machine code。

由原始碼產生執行檔的過程中,除了要編譯(compile)還需要經過連結(link)才能得到這樣的可執行檔。



*這裡的machine code就是機器碼,就是目的碼,object code。