19 คะแนน โดย GN⁺ 2025-07-10 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ที่มาของสำนวน "เรียกฟังก์ชัน" ในการเขียนโปรแกรม มีลักษณะคล้ายกับแนวคิดเรื่องการ "เบิก" หรือ "เรียก" หนังสือในห้องสมุด
  • ในยุคแรกของคอมพิวเตอร์ มีแนวโน้มที่จะใช้วิธี เรียกหรืออัญเชิญซับรูทีนจากไลบรารี เป็นหลัก
  • เมื่อ Fortran II นำคำสั่ง CALL มาใช้ สำนวน "to call a function" จึงแพร่หลายอย่างรวดเร็ว
  • หลังจากนั้น ภาษาอย่าง Algol และ JOVIAL ก็รับแนวคิดนี้ไปใช้ และเริ่มใช้คำนามว่า "call"
  • ความหมายของ "call" ค่อยๆ ขยายและฝังตัว ตั้งแต่ ก่อน ระหว่าง และหลังการส่งต่อการควบคุมขณะรันไทม์

ทำไมโปรแกรมเมอร์ถึงพูดว่า "เรียก(call)" ฟังก์ชัน?

  • มีคำถามบน StackExchange เกี่ยวกับที่มาของสำนวน "เรียก(call)ฟังก์ชัน"
  • แม้จะมีการเปรียบเทียบหลายแบบ แต่ในความเป็นจริง คำว่า "call" มาจากความหมายว่าอัญเชิญ(summon)หรือเรียกเข้ามา
    • คล้ายกับการ "เบิก" หนังสือจากห้องสมุด คือเริ่มจากการ "เบิก" ซับรูทีนมาใช้งาน
    • "call number" เป็นป้ายระบุตำแหน่งของหนังสือในห้องสมุด

ประวัติของคำว่า "call" ในศัพท์ห้องสมุด

  • ตาม OED ระบุว่า Melvil Dewey ใช้คำว่า "call number" เป็นครั้งแรกในปี 1876 ในฐานะศัพท์ด้านบรรณารักษศาสตร์
    • "call number" คือสัญลักษณ์ที่ใช้ระบุตำแหน่งของหนังสือหรือใช้ในการขอเบิก
  • ใน Library Journal ปี 1888 ก็มีการใช้คำอย่าง "call blank", "call slip", "call number" เป็นเรื่องปกติในชีวิตประจำวัน
  • ตามคำอธิบายของ Joudrey & Taylor ชื่อ "call number" มาจากการเรียกขอเอกสารจากชั้นเก็บแบบปิด
    • ระบบอย่าง Cutter number ถูกนำมาใช้เพื่อการจัดหมวดหมู่

การใช้คำว่า "call" ในวิทยาการคอมพิวเตอร์ยุคแรก

  • ใน บทความปี 1947 ของ John W. Mauchly มีตัวอย่างการใช้ซับรูทีนโดย "called in" จากไลบรารีซับรูทีน
    • อยู่ในบริบทของการอ้างอิงและนำมาใช้ได้อย่างรวดเร็วผ่านหมายเลขที่บันทึกไว้
  • แอสเซมบลีรูทีนของ MANIAC II (1956) ก็ใช้แนวคิดคล้ายกัน โดยกำหนด "call number" ให้แต่ละซับรูทีนเพื่อเรียกใช้เมื่อจำเป็น
    • แต่ในภาษาแอสเซมบลีจริงจะเรียกว่า "transfer control"
  • ในช่วงเวลานี้ แนวคิดที่ถูกเน้นยังเป็นการดึงชิ้นส่วนโค้ดเข้ามาในขั้นคอมไพล์หรือลิงก์ มากกว่าการ "เรียก" ระหว่างรันไทม์

การปรากฏของคำสั่ง "CALL" ในภาษาโปรแกรม

  • Fortran II (1958) นำคำสั่ง CALL และ RETURN มาใช้
    • เป็นการส่งการควบคุมการทำงานไปยังซับรูทีนด้วยการกระทำแบบ "call for"
    • คำสั่ง CALL ชี้ตรงไปยังการกระทำเชิงไวยากรณ์ของการ "เรียก" จริงๆ
  • จากนั้นความหมายของการ "transfer control" ตอนรันไทม์ กับการ "เรียก" ในขั้นลิงก์/แอสเซมบลี ก็ค่อยๆ ปะปนกันอย่างคลุมเครือ

การขยายความหมายและการลงหลักปักฐานของ "call" ในทศวรรษ 1960

  • พจนานุกรมของ Sarbacher (1959) นิยาม "call in" ว่าเป็นการย้ายการควบคุมจากเมนรูทีนไปยังซับรูทีน
    • และยังอธิบาย "call number" กับ "call word" ในความหมายของตัวระบุและโค้ดสำหรับการเรียก
  • ใน JOVIAL (1960) มีการใช้คำว่า "procedure call" และ "calls" อย่างเป็นทางการในฐานะคำนาม
    • ต่อมาจึงใช้ร่วมกับความหมายหลายชั้น เช่น จุดที่เรียก(site), อาร์กิวเมนต์(argument), พารามิเตอร์ ฯลฯ
  • Algol (1959~1960) ก็ใช้สำนวนอย่าง "procedure call", "called procedure", "during the call" เพื่อบอกแง่มุมต่างๆ ของจังหวะการเรียก
    • ในรายงาน Algol 60 ของ Peter Naur ยังมีการแยกความหมายเชิงเวลาอย่าง "call for" และ "during the call"
  • ใน Burroughs Algebraic Compiler (1961) ปรากฏรูปกริยา "to call" อย่างชัดเจนเป็นครั้งแรก
  • หลังงานของ Corbató และคณะ (1963) การใช้แบบสมัยใหม่อย่าง "to call a subroutine" ก็กลายเป็นเรื่องทั่วไป

สรุป

  • คำสั่ง "CALL X" ของ Fortran II ทำให้สำนวน "call" สำหรับการเรียกฟังก์ชัน/ซับรูทีนฝังตัวอย่างมั่นคง
    • แม้จะได้แรงบันดาลใจจากแนวคิดแบบห้องสมุดเดิม (เรียกตามหมายเลข) แต่ก็ขยายความหมายใหม่ในโลกภาษาโปรแกรม
  • ต่อมา Algol, JOVIAL ฯลฯ ก็รับคำอย่าง "call", "call site" ไปใช้ต่อ
  • ราวปี 1961 เป็นต้นมา สำนวน "to call X" เริ่มลงหลักปักฐานในเอกสารโปรแกรมและชุมชนอย่างเป็นทางการ
  • ปัจจุบัน การเรียกฟังก์ชันหมายถึง ชุดการทำงานทั้งหมดที่ส่งต่อการควบคุมชั่วคราว รับผลลัพธ์ แล้วกลับคืนมา และคำว่า 'call' ก็กลายเป็นศัพท์มาตรฐานสำหรับสิ่งนี้

1 ความคิดเห็น

 
GN⁺ 2025-07-10
ความเห็นจาก Hacker News
  • Grace Hopper อธิบายว่าความหมายดั้งเดิมของคำว่า call (ซึ่งมีที่มาจาก call number ที่ใช้จัดระเบียบเอกสารในห้องสมุดจริง) ยังมีอิทธิพลต่อการกำเนิดของคำว่า compiler ด้วย โดยแต่ละซับรูทีนจะได้รับ call word และแนวคิดก็คือการสร้างโปรแกรมเหมือนการหยิบเอกสารจากห้องสมุดออกมาประกอบกัน
    • ฉันใช้คำเหล่านี้อยู่จริง
    • ตอนนี้เพิ่งรู้สึกว่าชิ้นส่วนปริศนาทั้งหมดเข้าที่แล้ว เลขระบุในระบบดิวอี้ทศนิยมถูกเรียกว่า call number
  • ฉันคิดว่าวิชาบรรณารักษศาสตร์มีส่วนต่อวงการคอมพิวเตอร์สมัยใหม่มากกว่าที่เราจินตนาการกันมาก เช่น เวลาจะอธิบาย database index ฉันมักหยิบภาพตู้บัตรรายการขึ้นมาใช้เสมอ พอเห็นลิ้นชักไม้ที่ค้นหาได้ตามชื่อผู้แต่ง, ดิวอี้ทศนิยม, หรือหัวข้อ ทุกคนก็เข้าใจทันที ดูแนวคิดเรื่องบัตรรายการห้องสมุด
    • ฉันเป็นคนรุ่นที่เคยใช้ลิ้นชักไม้ในห้องสมุดท้องถิ่นกับพจนานุกรมกระดาษ ตอนที่เจอ hashmap หรือ IDictionary ครั้งแรกเมื่อ 25 ปีก่อน ภาพพวกนี้ช่วยให้เข้าใจได้ทันที แต่เดี๋ยวนี้อุปมานี้ไม่ได้ช่วยมากเหมือนเดิม ฉันเคยต้องอธิบายอยู่บ่อย ๆ ว่าบัตรรายการหรือพจนานุกรมหน้าตาเป็นอย่างไร แล้วคนรุ่นใหม่ก็มักพูดว่า "อ๋อ งั้นมันก็คือ analog hash map สินะ"
    • ไม่กี่เดือนก่อนฉันยังสงสัยอยู่เลยว่าทำไมความกว้างมาตรฐานของเทอร์มินัลถึงเป็น 80 ตัวอักษร ฉันคิดว่าเป็นเพราะขนาดหน้าจอ PC สมัยก่อน แต่จริง ๆ แล้วเป็นเพราะบัตรเจาะรูมี 80 ตัวอักษร และต้นกำเนิดของบัตรเจาะรูก็โยงกลับไปที่ index card อีกที เป็นอีกครั้งที่ทำให้ต้องคารวะวงการบรรณารักษศาสตร์ นี่ให้ความรู้สึกเหมือนประวัติศาสตร์คอมพิวเตอร์แบบเดียวกับเรื่องความกว้างรถยนต์ที่สืบมาจากความกว้างก้นม้าสองตัว
    • เมื่อ 1–2 ปีก่อน ฉันเคยใช้อุปมาว่าลิ้นชักไม้มีฝุ่นเกาะอยู่มุมห้องสมุดก็เหมือนฐานข้อมูล บริบทและความรู้พื้นฐานสำคัญจริง ๆ
    • ฉันเคยคิดมาตลอดว่าคำว่า index ในศัพท์คอมพิวเตอร์มีจุดเริ่มจากสารบัญท้ายหนังสือ ไม่เคยเชื่อมโยงมันกับ index cards มาก่อน
    • คนรุ่นใหม่สมัยนี้อาจไม่เคยเห็นบัตรรายการห้องสมุดด้วยซ้ำ ฉันเลยอธิบายว่าฮาร์ดดิสก์คือรายการของ 0 กับ 1 ที่เรียงกันอยู่ และถ้าจะหาอะไรสักอย่าง เราจำเป็นต้องมีโครงสร้าง
  • ฉันเป็นชาวฟินแลนด์ ในภาษาฟินแลนด์ คำที่ใช้กับ "การเรียกฟังก์ชัน" คือ kutsua ซึ่งถ้าแปลกลับเป็นอังกฤษจะใกล้กับ invite หรือ summon มากกว่า คือเป็นความหมายแบบ "แม่เรียกลูกจากสนามเข้าบ้าน" ไม่ใช่ call แบบ "Joe โทรหาเพื่อน" หรือ "สีนี้เรียกว่าอะไร" แค่อยากแชร์ไว้
    • ในภาษาเยอรมันใช้ aufrufen ถ้าแปลแยกคำประมาณว่า "เรียกขึ้นมา" และถ้าใช้กับกรรมตรงแบบที่โรงเรียนใช้เรียกชื่อนักเรียน ก็จะหมายถึงการเรียกใครบางคนด้วยชื่อหรือหมายเลข ส่วนคำว่าโทรศัพท์หาคือ anrufen
    • summon บางครั้งก็ฟังดูเหมาะมาก เพราะมีบรรยากาศเหมือนกำลังเรียกสิ่งสยองขวัญเชิงไสยศาสตร์ออกมาในโค้ด ส่วน invite บางทีก็ให้ความรู้สึกเหมือนเชิญปีศาจหรือแวมไพร์เข้าบ้าน
    • ในนอร์เวย์ใช้ funksjonskall ซึ่งแปลตรงตัวว่า function call คือ call ในความหมายเรียกอะไรบางอย่างธรรมดา
    • ภาษารัสเซียก็คล้ายกัน ถ้าแปลย้อนกลับจะได้ประมาณว่า "เรียกทางโทรศัพท์", "อัญเชิญ", "เชื้อเชิญ" เป็นต้น
    • ไม่เกี่ยวกับหัวข้อโดยตรง แต่ถ้าคุณอยู่เฮลซิงกิ ก็อยากชวนไป มีตอัป Hacker News ท้องถิ่น
  • ในหนังสือ Wilkes, Wheeler, Gill (1951) มีการใช้วลี call in กับการรันซับรูทีน ในหน้า 31 มีข้อความว่า "ถ้าซับรูทีนถูกเรียกไม่ถูกต้อง เครื่องจะหยุดทำงาน" และ "ในทุกโปรแกรมสามารถเรียกซับรูทีนได้อย่างอิสระ" และในรายงานยุคแรกของ EDSAC ปี 1950 ก็ยังมีหมายเหตุว่า call in auxiliary sub-routine ซึ่งดูได้ในสไลด์นำเสนอนี้
  • บางครั้งคนก็ใช้ invoke หรือ execute แทน call แต่เป็นคำที่ยาวกว่าและกว้างกว่า อย่างไรก็ตาม ฉันมักได้ยินการใช้คำว่า call แบบผิดบริบทจากนักศึกษา CS ที่ไม่ได้เป็นเจ้าของภาษาอังกฤษ เช่น "calling a command" หรือ "calling a button" ซึ่งชวนให้ขัดใจนิดหน่อย
    • invoke มาจากภาษาละติน invocō, invocāre (เรียกขึ้นมา) ดังนั้นจริง ๆ แล้วมันไม่ผิด เพียงแค่เป็นรูปย่อ
    • ตัวอย่างใช้ผิดที่ได้ยินบ่อยที่สุด (หรือเกลียดที่สุด) คือเอาไปใช้กับ return อย่างเช่น "ตอนนี้ถ้า call คีย์เวิร์ด return ฟังก์ชันก็จะจบ" ฉันเคยได้ยินแบบนี้จริง ๆ
    • C# ใช้ Invoke บ่อยกับพวก delegate หรือ reflection แต่ในดีบักเกอร์กลับใช้ Call Stack
    • จากประสบการณ์ของฉัน คนเจ้าของภาษาอังกฤษที่เพิ่งเริ่มเรียนเขียนโปรแกรมก็ใช้คำคล้าย ๆ กัน พวกเขาอธิบายสิ่งที่ไม่ใช่คำสั่งว่าเป็น command เหมือนกัน
    • บางครั้งมือใหม่ก็กลับกันไปเลย เรียก statement หรือแม้แต่การประกาศฟังก์ชันทั้งก้อนว่า command
  • นี่ไม่ใช่ทฤษฎีวิทยาศาสตร์ แค่ข้อสังเกตอย่างหนึ่ง คำศัพท์ใหม่จะแพร่กระจายได้ดีเมื่อมันมีจุดที่ "คลิก" กับคนได้ มักจะสั้น และทำให้จินตนาการหรือจดจำความหมายได้ง่าย เลยกระจายเร็ว บางครั้งต้องมีคำอธิบาย แต่หลายครั้งคนก็เรียนรู้จากบริบทและส่งต่อกันได้ เช่นคำว่า salty ก็เป็นแบบนั้น และ call ก็เหมือนกัน มันสั้น ใช้บ่อย และทั้ง call up / call in / summon / invoke (ที่ให้ความรู้สึกเหมือนคาถาเวทมนตร์) ก็ล้วนให้ภาพที่เข้ากัน ยุคนั้นโทรศัพท์ก็เป็นเทคโนโลยีใหม่ที่น่าตื่นเต้น จึงเป็นไปได้ว่าภาพของการโทรหาอีกคนถูกเชื่อมโยงกับการเรียกซับรูทีนได้ง่าย ส่วนคำอย่าง jump ก็ถูกใช้ในอีกความหมายอยู่แล้ว ฉันเลยคิดว่า call จึงแพร่หลายได้
    • สำหรับฉัน salty ไม่ค่อยเกี่ยวกับน้ำตาเลย ในสัญชาตญาณทางภาษา มันไม่ได้แปลว่าเศร้า แต่แปลว่าหงุดหงิดหรือไม่พอใจ คือเป็นภาพเปรียบเทียบจากความเค็มที่แสบและจัดจ้าน พูดอีกอย่างคือ แม้แต่ตอนที่แต่ละคนตีความต่างกัน อุปมาก็ยังใช้งานได้ดี ซึ่งแสดงให้เห็นว่า call ก็น่าจะแพร่หลายได้ในลักษณะเดียวกัน
  • ฉันไม่เคยนึกมาก่อนเลยว่าในประโยคที่ว่า "...สิ่งที่ซับซ้อนควรอยู่ใน library ซึ่งก็คือชุดเทปแม่เหล็ก (ที่เก็บปัญหามีค่าซึ่งเขียนไว้ก่อนหน้านี้)" คำว่า library จะมีที่มาจากชั้นวางเอกสารที่ติดป้ายจริง ๆ
  • ฉันเคยคิดมาตลอดว่าฟังก์ชันไม่จำเป็นต้องมีคีย์เวิร์ด call ก็ได้ เพราะปกติฟังก์ชันคืนค่า จึงใช้ภายในประโยคกำหนดค่าได้ สิ่งที่ต้องใช้ call คือ subroutine (ซึ่งในทางปฏิบัติก็คือ address/label ที่มีชื่อ) จริง ๆ แล้วจะ GOTO ไปยัง address นี้ตรง ๆ แล้วกลับมาก็ยังได้ คีย์เวิร์ด CALL แค่ทำให้เห็นลำดับการไหลของการทำงานชัดขึ้น เหมือนเจ้านายมอบงานให้ Sam ไปคิดเงิน แล้วต่อด้วยให้ Bill ไปพิมพ์รายงาน TPS สุดท้ายทุกอย่างก็กลายเป็นฟังก์ชัน และ subroutine ก็ถูกเรียกว่า spaghetti แต่ก็ยังสงสัยว่าทำไมถึงมีทั้งคำว่า routine (โปรแกรม) และ subroutine
    • ที่มาของคำว่า routine ตามเอกสารปี 1947 ของ Goldstine และ von Neumann ระบุชัดว่า "ชุดคำสั่งที่เข้ารหัสสำหรับปัญหาหนึ่งเรียกว่า routine" (อ้างอิง)
  • ในดนตรีก็มีคำว่า "call and response" อยู่เหมือนกัน ฉันคิดว่ามันเชื่อมโยงกับแนวคิดเรื่อง return value ได้ด้วย
  • Algol 60 ก็ใช้คำว่า call ไม่ใช่แค่กับฟังก์ชัน แต่ยังใช้กับพารามิเตอร์ด้วย เช่น "call by value", "call by name" เป็นต้น โดยในข้อ 4.7.5.3 มีโครงสร้างว่า "ในกรณีของ call by value" ทุกวันนี้เรามักพูดว่า procedure/function/subroutine นั้นถูก call ส่วน argument/parameter นั้นถูก pass ดังนั้น pass by value/reference/name จึงชัดเจนกว่า แต่ศัพท์เก่าอย่าง "call by value" ก็ยังคงหลงเหลืออยู่ในบางบริบท แม้แนวคิดเรื่องการ call argument หรือ parameter จะหายไปแล้วก็ตาม