Various programming language definitions

 各種程式語言定義

程式語言

- Object-Oriented languages(物件導向語言):

  + 定義:這些語言的主要特點是使用物件作為資料的基本單元,通過物件之間的相互關係實現複雜的程式邏輯。Object-Oriented languages將資料和相關操作封裝到物件中,並支援繼承和多型等物件導向特性。

  +我的回答:以物件為基本單元,物件中包含屬性與方法,透過物件之間的互動完成複雜的操作。並支援封裝、繼承、多型等物件導向特性。有助於模組化與重用程式碼。

 +現存語言:Java, C#(,c++)

- Functional languages(函數式語言):

  + 定義:這些語言的主要特點是強調使用純函數和不可變性。它們不依賴於狀態,函數是不可變的,並且通常不會改變傳遞給它們的參數的狀態。函數式語言通常具有高階函數和閉包,支援遞迴和高階函數。

主要特點是強調使用純函數和不可變性。純函數,即把所有資料變成參數或內部狀態(資料)的函式。不可變性,則是不會改到資料本身。通常支援高階函數。

純函數,把所有資料變成參數或內部狀態(資料)的函式。

不可變性,不會改到資料本身。

高階函式 Higher-order function定義:一個能夠接收函式作為參數(這個被接收的函式稱為回調函式)或者將函式作為返回值輸出的函式,滿足其中之一即可

 +現存語言:Haskell, Scala

- Logic languages(邏輯語言):

  +定義:這些語言基於邏輯推理和規則。Prolog是一個常見的邏輯語言,它用於知識表示和符號推理。Logic languages通常用於人工智慧和專家系統等領域。

 +現存語言:Prolog, Mercury

- Script languages(腳本語言):

  +定義:這些語言通常用於自動化任務和快速開發。它們具有解釋性質,通常用於網頁開發、系統管理、數據處理等應用。JavaScript、Python和Ruby都是常見的腳本語言。

 +現存語言:Javascript, python

- 最近語言的發展中,像 Functional languages 與 Script languages,都逐漸引進物件導向性質(OO),就這兩類語言,各舉一個近來發展出且具有 OO 性質的語言。

- JavaScript:JavaScript是一個腳本語言,近年來已引入了許多物件導向特性,如類、繼承和封裝。這使得它更適合大型應用程序的開發

- Python:Python一直是一個多範式語言,但近年來已引入了更多物件導向特性,如類和繼承和封裝。這使得Python更適合對象導向程式設計



 C#與 JAVA 的 concurrency 

- C#的thread可以是actor thread吗?JAVA的呢?

   - C#: C#中的线程可以用来实现Actor模型,但是Actor模型通常需要额外的库或框架,如Akka.NET,用于构建actor系统。

   - Java: Java中没有内置的Actor模型,但你可以使用第三方库,如Akka,来构建Actor系统。

- C#的thread可以被非同步调用吗?JAVA的呢?

   - C#: 在C#中,线程可以通过异步方法和Task等机制来实现非同步调用。异步方法允许你在不阻塞主线程的情况下执行某些操作。

   - Java: 在Java中,线程可以通过使用Java的并发包(如Future和CompletableFuture)来进行非同步调用。Java也支持异步编程模型。

- C#的Sleep方法与Java的Sleep方法有何不同?

   - C#: 在C#中,Thread.Sleep方法用于使当前线程休眠指定的毫秒数,且单位是毫秒。

   - Java: 在Java中,Thread.sleep方法也用于使当前线程休眠指定的毫秒数,但单位是毫秒。 Java的Sleep方法与C#的Sleep方法在这方面没有显著的不同。

程式語言中的變數依其記憶體配置(allocation)的不同可分為那三類?其生命期(lifetime)有何不同?其優缺點各為何?(24 

根據記憶體配置的不同,變數可以分為靜態變數、堆疊動態變數和外顯堆積動態變數。
這三種變數的生命週期和優缺點如下:

Y=f(x)
F(t)函數為static 關鍵字
Y是呈現出來的效果
X是變數

1. **靜態變數(Static Variable):**
   -定義:
 + 在程式執行之前分配記憶體,並在整個程式的執行期間存在。
 + 在C語言中,使用 `static` 修飾符宣告靜態變數。
   - **生命週期:** 整個程式的執行期間。
   - **優點:** 保留狀態,可以在多次函數呼叫之間保持數值不變。
   - **缺點:** 佔用固定的記憶體空間,可能導致浪費。

Y=f(x)
F(t)函數為無須關鍵字
Y是呈現出來的效果
X是變數

2. **堆疊動態變數(Stack-Dynamic Variable):**
   - 定義:
  +是在程式執行時自動分配和釋放記憶體的變數。
  +常與函數的呼叫框架關聯,函數被呼叫時,為其局部變數分配空間,當函數返回時,該空間被自動釋放。
   - **生命週期:** 隨著函數的呼叫而動態分配和釋放,生命週期與函數呼叫相關。
   - **優點:** 自動管理記憶體,無需手動釋放。
   - **缺點:** 限制於函數的生命週期,無法保留狀態。

Y=f(x)
F(t)函數為 malloc free 
Y是呈現出來的效果
X是變數


外顯堆積動態變數(Explicit Heap-Dynamic Variable):
定義:由開發者手動分配和釋放記憶體。在C語言中,通常使用 malloc 函數進行分配,並使用 free 函數進行釋放。
生命週期: 由開發者手動分配和釋放,生命週期由開發者管理。
優點: 可以動態調整記憶體大小,生命週期有彈性。
缺點: 需要手動管理記憶體,容易出現記憶體泄漏或者釋放過早的問題。

補充:
記憶體流失(英語:memory leak)是電腦科學中的一種資源漏失,主因是計算機程式的記憶體管理失當,因而失去對一段已分配記憶體空間的控制,程式繼續占用已不再使用的記憶體空間,或是記憶體所儲存之物件無法透過執行程式碼而存取,令記憶體資源空耗。

----

三種類型變數舉例說明:

1. **靜態變數(Static Variable):** 靜態變數
範例
    ```c
    #include <stdio.h>

    void exampleFunction() {
        static int staticVariable = 5;
        printf("Static Variable: %d\n", staticVariable);
        staticVariable++;
    }

    int main() {
        exampleFunction();
        exampleFunction();
        return 0;
    }
    ```

    在這個例子中,`staticVariable` 是一個靜態變數,它在 `exampleFunction` 函數中保留了它的值,而不是每次函數呼叫都重新初始化。


2. **堆疊動態變數(Stack-Dynamic Variable):*
範例

    ```c
    #include <stdio.h>

    void exampleFunction() {
        int stackVariable = 10;
        printf("Stack Variable: %d\n", stackVariable);
    }

    int main() {
        exampleFunction();
        return 0;
    }
    ```

    在這個例子中,`stackVariable` 是一個堆疊動態變數,它在 `exampleFunction` 函數被呼叫時分配,在函數結束時自動釋放。


3. **外顯堆積動態變數(Explicit Heap-Dynamic Variable):*
範例

    ```c
    #include <stdio.h>
    #include <stdlib.h>

    int main() {
        int *heapVariable = (int*)malloc(sizeof(int));
        *heapVariable = 15;
        printf("Heap Variable: %d\n", *heapVariable);
        free(heapVariable);
        return 0;
    }
    ```

    在這個例子中,`heapVariable` 是一個外顯堆積動態變數,開發者手動分配了記憶體,並在使用結束後使用 `free` 進行釋放。


3. **外顯堆積動態變數(Explicit Heap-Dynamic Variable):**
   -定義:
  +由開發者手動分配和釋放記憶體。
  +在C語言中,通常使用 `malloc` 函數進行分配,並使用 `free` 函數進行釋放。
   - **生命週期:** 由開發者手動分配和釋放,生命週期由開發者管理。
   - **優點:** 可以動態調整記憶體大小,生命週期有彈性。
   - **缺點:** 需要手動管理記憶體,容易出現記憶體泄漏或者釋放過早的問題。

總體而言,選擇使用哪種變數類型取決於程式的需求:

- 如果需要在多次函數呼叫之間保留狀態,且佔用固定記憶體空間不是問題,可以使用靜態變數。
- 如果變數的生命週期與函數的呼叫相關,且自動管理記憶體是重要的,可以使用堆疊動態變數。
- 如果需要彈性管理記憶體,且願意手動管理記憶體,可以使用外顯堆積動態變數。

在實際應用中,通常會根據程式的需求和效能考慮,選擇適當的變數類型。

、在 C 語言中,指標型態(pointer type)為其一大特色,請問其指標型態主要的優點為何?(8 分)

但是指標型態也帶來不少問題,請舉出指標的問題主要有那些?(8

指標型態在C語言中具有以下主要優點:
記憶體的使用
-新增/刪除
- 陣列,函數存取記憶體

1. 直接記憶體存取:指標允許直接存取記憶體位置,這樣可以實現高效的記憶體操作。這對於處理大型(或複雜)資料結構、陣列以及實作複雜的資料結構非常有用。

2. 動態記憶體配置:指標使您能夠在運行時分配和釋放記憶體(以靈活處裡記憶體資源),這對於管理資料結構的大小和生命週期非常重要。這允許更靈活地處理記憶體資源。

》外顯堆積動態變數

3. 函數引數(參數)的靈活性:指標允許將記憶體位址傳遞給函數,這樣可以實現對資料的原地修改,而無需進行複製。

然而,指標型態也帶來一些主要問題:

1. 記憶體錯誤:使用指標時容易出現記憶體錯誤,如未初始化指標、訪問無效記憶體、釋放後再次訪問等,這可能導致程式崩潰或不穩定。

2. 複雜的語法:指標的語法較為複雜,包括指標運算、陣列指標和函數指標等,這需要開發者具備良好的理解和使用指標的能力。

3. 安全性風險:指標操作可以繞過某些安全檢查,可能導致緩衝區溢出和其他安全漏洞,這使程式更容易受到攻擊

4. 難以維護:程式中使用大量指標的程式碼可能變得難以維護和理解,尤其是在大型專案中。

總結來說,指標型態在C語言中提供了高度的靈活性和效能,但同時也帶來了風險和複雜性,因此需要謹慎使用並遵循最佳實踐以確保程式的穩定性和安全性。

請用您熟習的語言,設計一程序(procedure)或函式(function),此程序或函式在

參數傳遞方式不同時:以值傳遞(passed by value)、以參照傳遞(passed by
reference),會產生不同的效果,並說明為何會有不同。(20 分

我的回答:
(一)以值傳遞,將變數值當作參數傳入函式。無副效應,修改函式內的形式參數不會影響實際參數的值。
Void add(int a, int b){
  a=a+b;//a=6
}
int main(){
  int a =3;
int b=3;
 add(a,b);
//因為傳值呼叫,無論在函式add中做了什麼,都不會影響變數a,b的值。
}

(二)以參照傳遞,將變數地址當作參數傳入函式。有副效應,修改函式內的形式參數會影響實際參數的值。
Void add(int &a, int &b){
  *a=*a+*b;//a=6
}
int main(){
  int a =3;
int b=3;
 add(a,b);
//因為傳參照呼叫,故在函式add中對變數a做加法運算,會影響變數a的值。結果a=6,b=3
}

Chatgpt 的回答:
以下是使用Python語言的範例程式,展示了在不同的參數傳遞方式(值傳遞和參照傳遞)下會產生不同效果的情況。

```python
# 以值傳遞方式傳遞參數
def value_pass(x):
    x = x * 2

# 以參照傳遞方式傳遞參數
def reference_pass(lst):
    for i in range(len(lst)):
        lst[i] = lst[i] * 2

# 主程式
if __name__ == '__main__':
    a = 5
    print("原始值 (以值傳遞):", a)
    value_pass(a)
    print("值傳遞後的值:", a)

    numbers = [1, 2, 3, 4]
    print("原始列表 (以參照傳遞):", numbers)
    reference_pass(numbers)
    print("參照傳遞後的列表:", numbers)
```

這個程式示範了兩個函數:`value_pass` 和 `reference_pass`。`value_pass` 接收一個參數並以值傳遞方式處理,而 `reference_pass` 接收一個列表作為參數,以參照傳遞方式處理。

當呼叫 `value_pass` 函數時,原始變數 `a` 的值不受影響,因為它是以值傳遞方式傳遞的,對函數內的 `x` 進行操作不會影響原始值。

當呼叫 `reference_pass` 函數時,原始列表 `numbers` 的值會被修改,因為它是以參照傳遞方式傳遞的,對函數內的 `lst` 進行操作會影響原始列表。

這個範例展示了值傳遞和參照傳遞之間的差異,值傳遞時不會影響原始值,而參照傳遞時會影響原始資料。

程式語言以堆疊結構實作副程式或函式呼叫的順序,堆疊中的元素稱為啟動紀錄

(activation record)。
假設函式 foo 呼叫函式 bar,請說明 foo 要將那些資訊存入 bar 的啟動紀錄中,才
能將控制權交給 bar;bar 要將那些資訊存入啟動紀錄中,才能將控制權還給
foo?(10 分)
有些語言在啟動紀錄裡儲存靜態連結( static link),靜態連結與動態連結
(dynamic link)的用途有何不同?那種特性的程式語言需要靜態連結?(10 分

1. 當函式 `foo` 呼叫函式 `bar` 時,以下是需要存入 `bar` 的啟動紀錄中的資訊:
   - 呼叫函式的返回地址:用於當 `bar` 執行完畢後返回控制給 `foo`。
   - 本地變數和參數:`bar` 函式可能需要存取這些變數,它們需要在 `bar` 的啟動紀錄中分配空間。
   - 堆疊指標(Stack Pointer,SP):用於堆疊管理,指向 `bar` 的啟動紀錄。
   - 靜態鍊接(Static Link):如果 `bar` 函式需要訪問 `foo` 函式中的靜態作用域變數,需要存儲指向 `foo` 的啟動紀錄的參考。

2. 靜態鏈接(Static Link)和動態鏈接(Dynamic Link)在語言中的作用有所不同:
   - 靜態鏈接:用於訪問靜態作用域變數,即變數在它們被定義的範疇之外仍然可見。靜態鏈接的用途是確保在函式中可以訪問到非局部變數,例如,當一個函式內部要訪問另一個函式中的全局變數時,需要靜態鏈接。
   - 動態鏈接:用於訪問動態作用域變數,即變數只能在它們的函式或區塊內部可見。動態鏈接的用途是確保在遞歸呼叫或嵌套函式中能夠正確地訪問函式的變數。

程式語言需要靜態鏈接的情況通常是指在函式內部訪問全局變數或靜態變數。語言中是否需要靜態鏈接取決於語言的作用域規則和變數存取規則。有些語言需要靜態鏈接,而其他語言可能使用其他方法來實現相同的功能。例如,C語言使用靜態鏈接來訪問全局變數。


Comments

Popular posts from this blog

How to write data into a excel file using vbscript

Format date as yyyy-mm-dd using vbscript