107 地方特考三等 資訊處理 程式語言 考古題詳解
第 一 題15 分
Java 與 Python 是目前被廣泛使用的程式語言,試就下列特性比較它們之間的不同,包括 Typing、Coding(撰寫程式之難易)、執行環境、程式執行效能、開發 App 的難易度。
登入後即可作答並保存紀錄。
核心觀念
本題旨在評量考生對主流程式語言(Java 與 Python)之語言特性、底層架構與實務應用場景的綜合比較能力。核心考核重點涵蓋:
- 型態系統(Type System):型態綁定與檢查的時機(靜態型態 vs. 動態型態)以及型態轉換的嚴格程度(強型態 vs. 弱型態)。
- 語法與設計哲學(Syntax & Design Philosophy):語法冗贅度(Boilerplate code)、可讀性、多典範支援對程式撰寫效率(Coding Effort)的影響。
- 執行環境與虛擬機器(Runtime & Virtual Machine):原始碼轉譯機制(原始碼 位元碼 Bytecode 機器碼)、JVM 與 PVM 的運作模式及 JIT(Just-In-Time)編譯技術。
- 執行效能與最佳化(Execution Performance):靜態型態最佳化、記憶體管理機制與直譯器鎖(如 CPython 之 GIL)對運算效能與並行處理的制約。
- 應用生態系(Application Ecosystem):原生行動裝置(Android)開發工具鏈、SDK 支援度及跨平台框架之適用性。
解題方法
本題為典型的「跨語言橫向比較申論題」。面對此類題型,最佳作答架構為:
- 先總結後分項:以結構化「綜合對照表」開篇,讓閱卷委員迅速掌握關鍵結論。
- 依指定面向深入論述:依題意規定的五大維度(Typing、Coding、執行環境、執行效能、開發 App 難易度),以標準專有名詞(如 Compile-time Type Checking、Bytecode、JIT、GIL、Android SDK)進行精確定義與優劣分析。
- 區分概念範疇:論述「開發 App」時,應明確區分「原生行動裝置 App(Mobile App)」與「廣義應用系統(Application / Web App)」,避免論述單一失焦。
選項分析
本題為申論問答題,無選擇選項。答題應就題目指定的五項評比維度逐一詳加對比論述:
- Typing(型態系統):
- 核心分歧點在於「型態檢查發生的時機」。
- Java:屬於「靜態型態(Statically Typed)」且為「強型態(Strongly Typed)」。變數必須先宣告明確型態(如
int,String)方能使用,型態檢查於編譯時期(Compile-time)執行。 - Python:屬於「動態型態(Dynamically Typed)」且為「強型態(Strongly Typed)」。變數無需宣告型態,變數僅是物件的指標/參照,型態資訊附著於物件本體,型態檢查於執行時期(Runtime)動態決定。
- Coding(撰寫程式之難易):
- 核心分歧點在於「語法簡潔度與開發典範限制」。
- Java:語法嚴謹、繁複,強制物件導向(所有程式碼均須包覆於
class內),樣板程式碼(Boilerplate code)較多,學習曲線較陡峭;但其明確的結構對大型系統多人協同開發與靜態分析除錯極具優勢。 - Python:語法簡潔優雅、接近虛擬碼(Pseudocode),以縮排(Indentation)界定程式區塊;支援多典範(程序式、物件導向、函式式),具備豐富的內建高階資料結構與廣大的第三方函式庫,開發週期極短,初學者極易上手。
- 執行環境(Execution Environment):
- 核心分歧點在於「轉譯架構與虛擬機器實作」。
- Java:依賴 Java 虛擬機器(JVM)。原始碼(
.java)先經編譯器編譯為與平台無關的位元碼(.class),再由 JVM 在目標作業系統上透過直譯器配合 JIT 編譯器轉換為原生機器碼執行,具「一次編寫,到處執行(Write Once, Run Anywhere)」特性。 - Python:標準實作(CPython)依賴 Python 虛擬機器(PVM)。原始碼(
.py)在載入時由直譯器編譯為 Python 位元碼(.pyc),再由 PVM 逐行直譯執行,為典型的直譯式架構。
- 程式執行效能(Execution Performance):
- 核心分歧點在於「型態開銷、編譯技術與平行運算限制」。
- Java:效能高。靜態型態於編譯期即可最佳化記憶體配置,搭配成熟的 HotSpot JIT 編譯器動態將熱點程式碼編譯為機器碼,且支援真實的多執行緒並行運算(OS-level threads),整體運算速度與吞吐量遠高於純直譯語言。
- Python:效能相對較低。動態型態導致執行時期有龐大的型態檢查、動態分派與物件裝箱/拆箱(Boxing/Unboxing)開銷;此外,CPython 具全域直譯器鎖(GIL, Global Interpreter Lock),限制同一行程內同一時間僅有一個執行緒可執行 Python 位元碼,不利於 CPU 密集型的多執行緒平行運算。
- 開發 App 的難易度(App Development Difficulty):
- 核心分歧點在於「生態系工具鏈與原生平台支援度」。
- 行動裝置 App(Mobile App):Java 是 Android 平台長期的官方原生開發語言,結合 Android Studio 與 Android SDK,具備完善的原生 UI 元件、硬體存取能力與最佳執行效能,開發成熟度高;Python 缺乏原生行動作業系統直接支援,雖有 Kivy、BeeWare 等跨平台套件,但打包體積龐大、啟動慢、硬體調用與原生 UI 整合困難,開發原生 App 難度與維護成本高。
- 網路與通用應用(Web/Enterprise App):Java(Spring Boot)架構龐大完整,適合複雜的高並發企業級系統,但設定繁複;Python(Django, FastAPI, Flask)開發門檻極低,原型設計(Prototyping)與 API 構建速度極快。
解題技巧
- 破除常見觀念陷阱:
- 陷阱:將 Python 誤認為「弱型態(Weakly Typed)」。
- 判定標準:弱型態語言(如 JavaScript、C)會自動進行非預期的隱性型態轉換(如 JavaScript 中
1 + "2"結果為"12");而 Python 是「強型態」,執行1 + "2"會直接拋出TypeError,絕不會隱性強制轉型。
第 二 題20 分
諾姆·杭姆斯基(Noam Chomsky)定義了 type-0、type-1、type-2、type-3 四種語法類型,請說明各類型可接受之語言(Language Accepted)是什麼?相對應之自動機(Automaton)是什麼?
登入後即可作答並保存紀錄。
核心觀念
本題評量形式語言理論(Formal Language Theory)與編譯器前端設計之核心基礎——杭姆斯基階層(Chomsky Hierarchy)。
形式文法定義為四元組 ,其中 為非終結符號集合、 為終結符號集合、 為產生規則集合(Production Rules,形式為 )、 為起始符號。杭姆斯基依據產生規則中左式 與右式 的限制嚴格程度,將文法由廣至狹劃分為 Type-0 至 Type-3 四個層級。
各層級文法所定義之字串集合稱為該層級之可接受語言(Language Accepted);而辨識各層級語言所需具備之最精簡計算模型,即為其相對應之自動機(Automaton)。其階層關係具備嚴格的真包含特性:
解題方法
國考申論題處理此類對應題型時,切入點應採「先綜整、後詳析」之架構:
- 綜整對照:先建立階層對照表,使閱卷委員一目了然核心對應關係。
- 逐項分述:針對 Type-0 至 Type-3,逐一闡述其「文法名稱與規則限制」、「可接受之語言」及「相對應之自動機架構與儲存特徵」,展現紮實的學理深度。
杭姆斯基階層綜合對照表
| 語法類型 | 文法名稱(Grammar) | 可接受之語言(Language Accepted) | 相對應之自動機(Automaton) | 記憶體/儲存結構特徵 |
|---|---|---|---|---|
| Type-0 | 無限制文法(Unrestricted Grammar) | 遞迴可枚舉語言(Recursively Enumerable Language) | 圖靈機(Turing Machine, TM) | 無限長、雙向可讀寫帶(Infinite Tape) |
| Type-1 | 上下文相關文法(Context-Sensitive Grammar) | 上下文相關語言(Context-Sensitive Language) | 線性有界自動機(Linear-Bounded Automaton, LBA) | 長度受限於輸入長度線性倍數之雙向讀寫帶 |
| Type-2 | 上下文無關文法(Context-Free Grammar) | 上下文無關語言(Context-Free Language) | 下推自動機(Pushdown Automaton, PDA / NPDA) | 有限狀態控制器 + 單一先進後出堆疊(Stack) |
| Type-3 | 正規文法(Regular Grammar) | 正規語言(Regular Language) | 有限狀態自動機(Finite Automaton, FA / FSM) | 僅有有限內部狀態,無額外外部輔助記憶體 |
選項分析(各語法類型深度剖析)
本題為申論題,以下針對題幹所求之四種語法類型逐項進行精確解析:
1. Type-0 語法
- 產生規則特徵:形式為 ,僅限制 且 至少須包含一個非終結符號,對 無長度或內容限制(又稱片語結構文法 Phrase Structure Grammar)。
- 可接受之語言:遞迴可枚舉語言(Recursively Enumerable Language, RE)。若字串屬於該語言,演算法必能接受並停機;若不屬於,可能停機拒絕或陷入無窮迴圈。
- 相對應之自動機:圖靈機(Turing Machine, TM)。具備一條無限長、可任意雙向移動與讀寫的資料帶(Tape),為最強的計算模型。
2. Type-1 語法
- 產生規則特徵:形式為 ,其中 ,,;或滿足非縮減條件 (允許特例 當 不出現在任何規則右式)。
第 三 題15 分
(一) 請解釋程式語言中之變數動態範圍(Dynamic Scope)與語句參考環境(Referencing Environment)。(6 分)
(二) 以下為一動態範圍之程式,請分別列出 、、 三點之參考環境。(9 分)
void subprogram1() { int X, Y; ... <----------------- a } /* end of subprogram1 */
void subprogram2() { int Y, Z; ... <----------------- b } /* end of subprogram2 */
void main() { int W, Z; ... <----------------- c } /* end of main */
登入後即可作答並保存紀錄。
核心觀念
- 動態範圍(Dynamic Scope): 變數名稱與其記憶體儲存體(空間)之繫結(Binding)關係,取決於執行時期的副程式呼叫順序(Calling Sequence / Dynamic Link),而非原始碼在文字排版上的靜態巢狀架構(Static / Lexical Scope)。當程式引用某一非區域變數時,直譯器或執行環境會沿著呼叫堆疊(Call Stack)由最新呼叫的副程式往回搜尋,以最近一次宣告該變數者作為繫結對象。
- 語句參考環境(Referencing Environment): 在程式執行到某一特定語句(Statement)之當下,所有處於活躍狀態(Active)且可被該語句合法存取(Visible)的變數名稱及其對應繫結的集合。在動態範圍語言中,任一點的參考環境為「該副程式自身的區域變數」加上「呼叫鏈上所有處於活躍狀態之副程式中未被遮蔽(Shadowed)的變數」。
解題方法
(一) 動態範圍與語句參考環境之解釋
- 動態範圍(Dynamic Scope): 依據執行時期的呼叫順序決定變數的作用範圍。在此機制下,副程式內部若存取未宣告之自由變數,會動態向上尋找呼叫它的父呼叫者(Caller)之區域變數,直到找到或到達進入點為止。其優點為便於隱式傳遞參數;缺點為破壞模組獨立性、難以進行靜態型態檢查、降低程式碼可讀性且除錯困難。
- 語句參考環境(Referencing Environment): 指某一特定程式執行點上,所有可被參照(可見)之變數集合。在動態範圍語言中,其建構規則為:
(二) 、、 三點之參考環境推導
題目程式未明文給定執行時期的呼叫鏈,而在動態範圍中,參考環境必然依賴動態呼叫順序;依公職命題慣例與程式進入點規則,最合理的呼叫鏈假設為:main 呼叫 subprogram2,subprogram2 再呼叫 subprogram1。
- 推導點 :
- 位於
main內部。 - 執行狀態:呼叫堆疊僅有
main。 - 區域變數宣告:
int W, Z;。 - 參考環境:
main中的 與 。
- 推導點 :
- 位於
subprogram2內部。 - 執行狀態:呼叫鏈為
mainsubprogram2。 - 區域變數宣告:
int Y, Z;。 - 堆疊前層變數:
main之 。 - 遮蔽效應:
subprogram2的 會遮蔽(Shadow)main的 。 - 參考環境:
subprogram2中的 以及main中的 。
- 推導點 :
- 位於
subprogram1內部。 - 執行狀態:呼叫鏈為
mainsubprogram2subprogram1。 - 區域變數宣告:
int X, Y;。 - 堆疊前層變數:
subprogram2之 、main之 。 - 遮蔽效應:
subprogram1的 遮蔽subprogram2的 。
第 四 題20 分
在一 concurrent 環境下,有一共享變數 ,其初始值為 。程序(process)A 必須加 到 ,程序 B 必須將 乘以 。
A 與 B 都要執行三個動作:
- 讀取 。
- 進行算數運算。
- 將算好的值寫回 。
試列出最後可能得到的 值。
登入後即可作答並保存紀錄。
核心觀念
本題評量並行程式設計(Concurrent Programming)中的競態條件(Race Condition)與非不可分割操作(Non-atomic Operations)。
- 不可分割性(Atomicity)缺失: 變數更新動作「讀取(Read) 運算(Modify) 寫回(Write)」並非不可分割的單一原子操作(Atomic Operation)。在沒有互斥鎖(Mutex)或同步機制保護的臨界區間(Critical Section)中,兩程序的指令會發生交錯執行(Interleaving)。
- 遺失更新(Lost Update): 當多個程序在彼此寫回前皆讀取了舊的共享變數值,較晚寫回的程序會無條件覆蓋較早寫回的運算結果,導致前者的更新無效化。
解題方法
設共享變數初始值 。各程序內部以區域暫存器(Register)或區域變數儲存中繼資料,指令分解如下:
- 程序 A(加 2):
- :讀取 (令暫存器 )
- :算術運算()
- :寫回 ()
- 程序 B(乘 4):
- :讀取 (令暫存器 )
- :算術運算()
- :寫回 ()
決定最終 值的關鍵在於兩程序讀取 的時機點與最後寫入 的程序。推導情境如下:
情境一:程序 A 執行完畢後,程序 B 才讀取 (序向執行:A 先 B 後)
- 執行順序範例:
- 讀取 至 。
- 計算 。
- 寫回 。
- 讀取更新後的 至 。
- 計算 。
- 寫回 。
- 最終結果:
情境二:程序 B 執行完畢後,程序 A 才讀取 (序向執行:B 先 A 後)
- 執行順序範例:
- 讀取 至 。
- 計算 。
- 寫回 。
- 讀取更新後的 至 。
- 計算 。
- 寫回 。
- 最終結果:
第 五 題15 分
假設有一 C++ 中的 namespace,稱之為 MyStack,該 namespace 中有一變數 topPtr,試列出參考該變數的三種方式。
登入後即可作答並保存紀錄。
核心觀念
本題評量 C++ 語言中命名空間(namespace)的識別字存取機制與範疇管理(Scope Management)。
命名空間的核心目的是避免全域名稱衝突(Name Pollution / Collision)。在命名空間定義外部要參考(存取)其內部定義的成員(如變數、函式、類別),C++ 標準規範了三種標準存取方式:
- 範疇解析運算子(Scope Resolution Operator,
::):以完全限定名稱(Qualified Name)直接指定目標。 using宣告(usingdeclaration):將命名空間中的單一特定成員引入當前宣告範疇。using指示詞(usingdirective):將命名空間中的所有成員一次性開放給當前宣告範疇。
解題方法
要在命名空間外部參考 MyStack 內的變數 topPtr,三種標準實作方式如下:
方法一:使用範疇解析運算子(Scope Resolution Operator, ::)
- 原理說明:使用限定名稱語法
NamespaceName::MemberName,明確指示編譯器該識別字屬於哪一個命名空間。此方式不會改變當前範疇內的符號表。 - 語法與範例:
MyStack::topPtr = nullptr; // 直接使用「MyStack::」前綴存取 topPtr
- 特性:安全性最高、無名稱衝突風險,是 Google C++ Style Guide 等業界規範推薦的嚴謹寫法。
方法二:使用 using 宣告(using declaration)
- 原理說明:利用
using NamespaceName::MemberName;語法,僅將該命名空間中的特定成員宣告至當前的區域範疇(Block Scope)或全域範疇中。宣告後在該範疇內即可直接以未限定名稱(Unqualified Name)存取該成員。 - 語法與範例:
using MyStack::topPtr; // 將 topPtr 單獨引入當前範疇
topPtr = nullptr; // 後續可直接存取
- 特性:精確控制引入的成員,不會意外引進
MyStack中其他不需要或同名的成員。
方法三:使用 using 指示詞(using directive)
- 原理說明:利用
using namespace NamespaceName;語法,將該命名空間內定義的所有成員視為在當前範疇的可見符號(如同全域或外層符號般可直接存取)。 - 語法與範例:
第 六 題15 分
試說明 SQL 與 NoSQL,包括資料庫結構、資料庫可擴展性,並列舉它們的優點各三項。
登入後即可作答並保存紀錄。
核心觀念
本題評量重點在於現代軟體系統架構中兩大資料儲存典範——關聯式資料庫(SQL / RDBMS)與非關聯式資料庫(NoSQL)的架構差異、核心設計哲學與工程取捨。考生須熟練掌握以下核心理論:
- 資料模型(Data Model):關聯式代數(二維表格、Primary/Foreign Key、實體關聯)與非關聯式多模型(Key-Value、Document、Column-family、Graph)。
- 綱要約束(Schema Constraint):預先定義的靜態結構(Rigid/Predefined Schema)與動態無綱要(Schema-free / Dynamic Schema)。
- 擴展性維度(Scalability):向上垂直擴展(Scale-up)與向外水平擴展(Scale-out / Sharding)。
- 交易保證原則:ACID 原則(Atomicity, Consistency, Isolation, Durability)與分散式環境下的 CAP 定理及 BASE 模式(Basically Available, Soft-state, Eventually consistent)。
解題方法
本題為標準的技術對比申論題,作答策略應遵循「先總述定義 專題分項對比(結構、擴展性) 條列各自優勢」之邏輯架構:
- 定義界定:明確指出 SQL 是以關聯式模型為核心的標準化關聯式資料庫;NoSQL(Not Only SQL)則是專為大規模、分散式、半結構化或非結構化資料設計的非關聯式資料庫總稱。
- 結構對比:針對資料組織方式(Table vs. 多元模型)、資料綱要(固定 vs. 動態)、關聯完整性(正規化/Foreign Key vs. 反正規化/嵌入式結構)作明確對照。
- 擴展性對比:從硬體升級路徑(Scale-up vs. Scale-out)、分散式資料分片(Partitioning/Sharding)難易度,以及分散式交易開銷角度分析為何兩者有本質差異。
- 優點條列:針對 SQL 與 NoSQL 分別列出 3 項具代表性、互不重複且具技術說服力的優點,並精準點出應用情境(如金融交易 vs. 大數據日誌/高併發快取)。
選項分析
本題為申論問答題,無選擇題選項。依閱卷評分要點,針對題幹各子題的作答要求剖析如下:
- 資料庫結構剖析:必須點出 SQL 依賴嚴謹的二維表格與固定綱要(Schema),強調減少冗餘的資料庫正規化;NoSQL 則支援動態綱要,具備四大資料模型(文件型、鍵值型、寬欄型、圖形型),允許半結構化(JSON/XML)或反正規化(Denormalization)設計。
- 可擴展性剖析:必須精確區分「垂直擴展(Vertical Scaling)」與「水平擴展(Horizontal Scaling)」。評分關鍵在於說明 SQL 因跨節點維護 ACID 特性與跨表連接(JOIN)運算成本極高,故傳統上偏好垂直擴展;NoSQL 原生為分散式叢集設計,易於透過資料分片(Sharding)進行節點的水平擴充。
- 優點列舉:雙方各需 3 項獨立優勢,不可將同一優點換句話說(例如將「查詢彈性」與「SQL語法強大」拆成兩點會被扣分),且需緊扣 ACID、資料一致性、查詢標準化(SQL)與高彈性、高吞吐、高可用性(NoSQL)等關鍵字。
解題技巧
- 關鍵字精準對照:
- SQL 對應關鍵字:
RDBMS、二維表格、Predefined Schema、ACID、Scale-up(垂直擴展)、正規化。 - NoSQL 對應關鍵字:
Not Only SQL、Schema-less / Dynamic、CAP / BASE、Scale-out(水平擴展)、分散式分片(Sharding)。
- 避免常見陷阱:
- 勿將 NoSQL 解釋為「No SQL(完全不用 SQL)」,正確意涵為「Not Only SQL」。
- 解釋可擴展性時,切忌只寫出名詞,必須補述「為什麼」SQL 難以水平擴展(分散式環境下維持跨節點 ACID 交易與分散式 JOIN 成本過高)。
- 列舉優點時應採用「小標題+精要說明」格式,方便閱卷委員快速辨識得分點。
【答案】
一、SQL 與 NoSQL 概述
- SQL(關聯式資料庫,RDBMS):基於關聯式模型(Relational Model),利用數學上的關聯代數以嚴謹的二維表格(Table,包含橫列 Row 與直欄 Column)組織資料,並以 SQL(Structured Query Language)作為標準查詢與操作語言,嚴格遵循 ACID 交易原則(如 PostgreSQL、MySQL、Oracle)。