สำรวจข้อขัดแย้งพื้นฐานระหว่างกฎการกำหนดขอบเขตแบบคงที่และแบบไดนามิก
ขอบเขตของตัวแปรหมายถึงขอบเขตของโปรแกรมที่สามารถเข้าถึงตัวแปรนั้นได้ การกําหนดขอบเขตช่วยแยกตัวแปรที่ใช้ในส่วนต่างๆ ของโปรแกรมออกจากกัน แม้ว่าจะมีชื่อเดียวกันก็ตาม นี่เป็นสิ่งสําคัญเนื่องจากโปรแกรมเมอร์มักใช้ชื่อตัวแปรทั่วไปซ้ํา เช่น i, x, หรือ count ในส่วนต่างๆ ของโปรแกรม.
การกําหนดขอบเขตโดยทั่วไปแบ่งออกเป็นสองประเภท:
หรือที่เรียกว่าการกําหนดขอบเขตคําศัพท์ จะกําหนดขอบเขตของตัวแปรตามโครงสร้างของรหัสโปรแกรม ในวิธีนี้การผูกตัวแปรสามารถกําหนดได้โดยการตรวจสอบข้อความของโปรแกรมโดยไม่คํานึงถึงวิธีที่โปรแกรมดําเนินการในรันไทม์ คอมไพเลอร์จะค้นหาตัวแปรตามลําดับต่อไปนี้: บล็อกปัจจุบัน, บล็อกการปิดล้อม, ขอบเขตส่วนกลาง ภาษาโปรแกรมสมัยใหม่ส่วนใหญ่ เช่น C, C++, Java และ Python ใช้การกําหนดขอบเขตแบบคงที่ เนื่องจากขอบเขตเป็นที่รู้จักในเวลาคอมไพล์ จึงทําให้โปรแกรมเข้าใจ ดีบัก และปรับให้เหมาะสมได้ง่ายขึ้น.
// A C program to demonstrate static scoping.
#include<stdio.h>
int x = 10;
// Called by g()
int f()
{
return x;
}
// g() has its own variable
// named as x and calls f()
int g()
{
int x = 20;
return f();
}
int main()
{
printf("%d", g());
printf("\n");
return 0;
}เอาท์พุต :
10
ค่าของตัวแปรถูกกําหนดโดยการเรียกฟังก์ชันล่าสุดในสแต็กการเรียกของโปรแกรม แทนที่จะทําตามโครงสร้างโปรแกรม ระบบรันไทม์จะค้นหาคําจํากัดความตัวแปรในห่วงโซ่ของการเรียกฟังก์ชันที่ใช้งานอยู่ ลําดับการค้นหาคือ: ฟังก์ชันปัจจุบัน, ฟังก์ชันการโทร, ฟังก์ชันที่สูงขึ้นในสแต็กการเรียก ไม่ค่อยได้ใช้ในภาษาโปรแกรมสมัยใหม่.
// Since dynamic scoping is very uncommon in
// the familiar languages, we consider the
// following pseudo code as our example. It
// prints 20 in a language that uses dynamic
// scoping.
int x = 10;
// Called by g()
int f()
{
return x;
}
// g() has its own variable
// named as x and calls f()
int g()
{
int x = 20;
return f();
}
main()
{
printf(g());
}ผลลัพธ์ในภาษาที่ใช้การกําหนดขอบเขตแบบไดนามิก :
20
