- ที่มาของสำนวน "เรียกฟังก์ชัน" ในการเขียนโปรแกรม มีลักษณะคล้ายกับแนวคิดเรื่องการ "เบิก" หรือ "เรียก" หนังสือในห้องสมุด
- ในยุคแรกของคอมพิวเตอร์ มีแนวโน้มที่จะใช้วิธี เรียกหรืออัญเชิญซับรูทีนจากไลบรารี เป็นหลัก
- เมื่อ 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 ความคิดเห็น
ความเห็นจาก Hacker News
call(ซึ่งมีที่มาจาก call number ที่ใช้จัดระเบียบเอกสารในห้องสมุดจริง) ยังมีอิทธิพลต่อการกำเนิดของคำว่าcompilerด้วย โดยแต่ละซับรูทีนจะได้รับcall wordและแนวคิดก็คือการสร้างโปรแกรมเหมือนการหยิบเอกสารจากห้องสมุดออกมาประกอบกันcall numberindexในศัพท์คอมพิวเตอร์มีจุดเริ่มจากสารบัญท้ายหนังสือ ไม่เคยเชื่อมโยงมันกับindex cardsมาก่อนkutsuaซึ่งถ้าแปลกลับเป็นอังกฤษจะใกล้กับinviteหรือsummonมากกว่า คือเป็นความหมายแบบ "แม่เรียกลูกจากสนามเข้าบ้าน" ไม่ใช่callแบบ "Joe โทรหาเพื่อน" หรือ "สีนี้เรียกว่าอะไร" แค่อยากแชร์ไว้aufrufenถ้าแปลแยกคำประมาณว่า "เรียกขึ้นมา" และถ้าใช้กับกรรมตรงแบบที่โรงเรียนใช้เรียกชื่อนักเรียน ก็จะหมายถึงการเรียกใครบางคนด้วยชื่อหรือหมายเลข ส่วนคำว่าโทรศัพท์หาคือanrufensummonบางครั้งก็ฟังดูเหมาะมาก เพราะมีบรรยากาศเหมือนกำลังเรียกสิ่งสยองขวัญเชิงไสยศาสตร์ออกมาในโค้ด ส่วนinviteบางทีก็ให้ความรู้สึกเหมือนเชิญปีศาจหรือแวมไพร์เข้าบ้านfunksjonskallซึ่งแปลตรงตัวว่า function call คือcallในความหมายเรียกอะไรบางอย่างธรรมดา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 ฟังก์ชันก็จะจบ" ฉันเคยได้ยินแบบนี้จริง ๆInvokeบ่อยกับพวก delegate หรือ reflection แต่ในดีบักเกอร์กลับใช้Call Stackcommandเหมือนกันcommandsaltyก็เป็นแบบนั้น และcallก็เหมือนกัน มันสั้น ใช้บ่อย และทั้งcall up/call in/summon/invoke(ที่ให้ความรู้สึกเหมือนคาถาเวทมนตร์) ก็ล้วนให้ภาพที่เข้ากัน ยุคนั้นโทรศัพท์ก็เป็นเทคโนโลยีใหม่ที่น่าตื่นเต้น จึงเป็นไปได้ว่าภาพของการโทรหาอีกคนถูกเชื่อมโยงกับการเรียกซับรูทีนได้ง่าย ส่วนคำอย่างjumpก็ถูกใช้ในอีกความหมายอยู่แล้ว ฉันเลยคิดว่าcallจึงแพร่หลายได้saltyไม่ค่อยเกี่ยวกับน้ำตาเลย ในสัญชาตญาณทางภาษา มันไม่ได้แปลว่าเศร้า แต่แปลว่าหงุดหงิดหรือไม่พอใจ คือเป็นภาพเปรียบเทียบจากความเค็มที่แสบและจัดจ้าน พูดอีกอย่างคือ แม้แต่ตอนที่แต่ละคนตีความต่างกัน อุปมาก็ยังใช้งานได้ดี ซึ่งแสดงให้เห็นว่าcallก็น่าจะแพร่หลายได้ในลักษณะเดียวกัน.libcallก็ได้ เพราะปกติฟังก์ชันคืนค่า จึงใช้ภายในประโยคกำหนดค่าได้ สิ่งที่ต้องใช้callคือ subroutine (ซึ่งในทางปฏิบัติก็คือ address/label ที่มีชื่อ) จริง ๆ แล้วจะGOTOไปยัง address นี้ตรง ๆ แล้วกลับมาก็ยังได้ คีย์เวิร์ดCALLแค่ทำให้เห็นลำดับการไหลของการทำงานชัดขึ้น เหมือนเจ้านายมอบงานให้ Sam ไปคิดเงิน แล้วต่อด้วยให้ Bill ไปพิมพ์รายงาน TPS สุดท้ายทุกอย่างก็กลายเป็นฟังก์ชัน และ subroutine ก็ถูกเรียกว่าspaghettiแต่ก็ยังสงสัยว่าทำไมถึงมีทั้งคำว่า routine (โปรแกรม) และ subroutinecallไม่ใช่แค่กับฟังก์ชัน แต่ยังใช้กับพารามิเตอร์ด้วย เช่น "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" ก็ยังคงหลงเหลืออยู่ในบางบริบท แม้แนวคิดเรื่องการcallargument หรือ parameter จะหายไปแล้วก็ตาม