ทำไมการอ่านจากหน่วยความจำไม่ใช่ผลข้างเคียง แต่การอ่านจากไฟล์คืออะไร


16

อะไรทำให้การอ่านจากหน่วยความจำกระบวนการเป็นการดำเนินการที่แท้จริง สมมติว่าฉันสร้างอาร์เรย์จำนวนเต็ม 100 จำนวนในหน่วยความจำส่วนกลางและนำองค์ประกอบที่ 42 ของอาร์เรย์นี้มา มันไม่ใช่ผลข้างเคียงใช่มั้ย เหตุใดการอ่านอาเรย์จำนวนเต็ม 100 ตัวจากไฟล์จึงมีผลข้างเคียง


5
ลองพิจารณาแก้ไขเพื่ออธิบายสิ่งที่ทำให้คุณคิดว่าการอ่านอาเรย์ของจำนวนเต็ม 100 จำนวนจากไฟล์นั้นเป็นผลข้างเคียงเช่นเดียวกับ "การดำเนินการที่แท้จริง" มีความหมายต่อคุณอย่างไร
gnat

3
@gnat เพราะเป็น I / O และ I / O เป็นผลข้างเคียง
ZhekaKozlov

3
อะไรทำให้คุณคิดว่า I / O เป็นผลข้างเคียง พิจารณาแก้ไข ] เพื่ออธิบายคำถามที่ผู้อ่าน เมื่อทราบทั่วไปมากขึ้นร่วมกันวิจัยของคุณช่วยให้ทุกคน บอกเราว่าคุณได้ลองทำอะไรและทำไมมันถึงไม่ตรงกับความต้องการของคุณ สิ่งนี้แสดงให้เห็นว่าคุณใช้เวลาในการพยายามช่วยตัวเองมันช่วยให้เราไม่ต้องย้ำคำตอบที่ชัดเจนและส่วนใหญ่จะช่วยให้คุณได้คำตอบที่เฉพาะเจาะจงและเกี่ยวข้องมากขึ้น ดูวิธีถาม
gnat

22
@gnat I / O เป็นผลข้างเคียง, คาบ มันเป็นหนึ่งในตัวอย่างคลาสสิก เราไม่ได้เป็น Wikipedia เราไม่ต้องการการอ้างอิงเพื่อความรู้พื้นบ้าน หากคุณคิดว่าบางสิ่งสามารถปรับปรุงได้เกี่ยวกับคำถามให้พูดออกมาอย่างเต็มที่แทนที่จะไปหาคนฟางนี้

7
'O' เป็นผลข้างเคียง 'ฉัน' เป็นเพียงผลข้างเคียงหากทำ 'ฉัน' เปลี่ยนสถานะของสิ่งที่คุณกำลังทำ 'ฉัน' สิ่งใดเป็นจริงสำหรับหน่วยความจำบางอย่างที่แมป I / O แต่ไม่น่าจะเป็นกรณีของไฟล์ปกติ
Tom Tanner

คำตอบ:


27

หากหน่วยความจำที่คุณเข้าถึงสามารถเปลี่ยนแปลงได้แสดงว่าเป็นผลข้างเคียง

ตัวอย่างเช่นใน Haskell ฟังก์ชันเพื่อเข้าถึงอาร์เรย์ที่ไม่แน่นอน ( IOArray) มีประเภท

Ix i => IOArray i e -> i -> IO e

(ลดความซับซ้อนลงเล็กน้อยเพื่อจุดประสงค์ของเรา) ในขณะที่การเข้าถึงอาร์เรย์ที่ไม่เปลี่ยนรูปแบบมีประเภท

Ix i => Array i e -> i -> e

รุ่นแรกส่งคืนสิ่งที่ประเภทIO eซึ่งหมายความว่ามันมีผลข้างเคียงของ I / O รุ่นที่สองเพียงคืนองค์ประกอบประเภทeโดยไม่มีผลข้างเคียงใด ๆ

ในกรณีของการเข้าถึงไฟล์คุณไม่สามารถรู้ได้ในเวลารวบรวมว่าไฟล์นั้นจะมีการเปลี่ยนแปลงระหว่างการรันโปรแกรมหรือไม่ ดังนั้นคุณจะต้องถือว่ามันเป็นการดำเนินงานที่มีผลข้างเคียงที่อาจเกิดขึ้น


4
ด้วยไฟล์ที่คุณไม่สามารถแน่ใจได้อย่างแน่นอน
ftr

2
คุณไม่สามารถแน่ใจได้ แต่สำคัญกว่า: คอมไพเลอร์ไม่แน่ใจ นอกจากนี้ระบบไฟล์ของคุณอาจเสียหายหรือฮาร์ดดิสก์ของคุณอาจตัดการเชื่อมต่อในขณะที่คุณกำลังอ่านไฟล์
Tobias Brandt

5
นั่นไม่ใช่ผลข้างเคียงของโปรแกรม แต่เป็นผลข้างเคียงของสิ่งอื่น ๆ หน่วยความจำไม่มีผลข้างเคียงอย่างใดอย่างหนึ่งเนื่องจากอนุภาคแอลฟาหรือนิวตรอนจรจัดสามารถพลิกได้เล็กน้อยและส่งผลให้เกิดการเปลี่ยนแปลงของอาร์เรย์
Blrfl

3
@ Blrfl นั้นเป็นจุดที่ดี แต่ฉันไม่คิดว่าทั้งสองจะเปรียบเทียบกันได้ ความเสียหายของหน่วยความจำไม่ใช่สิ่งที่คุณสามารถจัดการได้เพราะอาจส่งผลต่อข้อมูลโปรแกรมและคำแนะนำในลักษณะที่ไม่มีกฎเกณฑ์ หากเกิดขึ้นสิ่งเดียวที่ต้องทำคือยกเลิกโปรแกรม (และอาจเป็นระบบปฏิบัติการ) ในทางตรงกันข้ามข้อผิดพลาดการอ่านเนื่องจากความเสียหายของระบบไฟล์เป็นสิ่งที่คุณคาดหวังและสามารถจัดการได้ เป็นส่วนหนึ่งของการจัดการไฟล์
Tobias Brandt

2
คุณกำลังก้าวออกจากขอบเขตของผลข้างเคียงและเข้าสู่การตรวจจับและจัดการข้อผิดพลาดซึ่งเป็นการสนทนาที่แตกต่างอย่างสิ้นเชิง คำถามของผลข้างเคียงเป็นหนึ่งในการดำเนินการที่มีผลกระทบต่อสิ่งอื่นใดหรือไม่ไม่ว่าผลการดำเนินงานจะได้รับอิทธิพลจากปัจจัยภายนอกหรือไม่
Blrfl

10

ในวิทยาการคอมพิวเตอร์ฟังก์ชันหรือนิพจน์ถูกกล่าวว่ามีผลข้างเคียงถ้านอกเหนือจากการส่งคืนค่ามันยังแก้ไขบางสถานะหรือมีปฏิสัมพันธ์ที่สังเกตได้กับฟังก์ชันการโทรหรือโลกภายนอก การอ่านจากไฟล์เป็นการโต้ตอบที่สังเกตได้กับโลกภายนอก มันเป็นไปตามคำนิยามของผลข้างเคียง การอ่านองค์ประกอบที่ 42 จากหน่วยความจำส่วนกลางจะเป็นผลข้างเคียงเช่นกันยกเว้นว่าอาร์เรย์ของคุณเป็นค่าคงที่เพราะจะเป็นการโต้ตอบที่สังเกตได้กับฟังก์ชันอื่น ๆ ที่อาจปรับเปลี่ยนอาร์เรย์


2

หากคุณมีหมายเลขอ้างอิงไฟล์ที่แชร์การอ่านไฟล์จะย้ายตัวจัดการไฟล์นั้นไปยังตำแหน่งที่คุณได้อ่านและจะปล่อยให้อยู่ในตำแหน่งนั้น

หากคุณมีสองเธรดที่มีการจัดการไฟล์แยกกันไปที่ไฟล์เดียวกันการอ่านจากหนึ่งจะไม่มีผลข้างเคียงที่เห็นได้ชัดในอีก

อย่างไรก็ตามในทั้งสองกรณีนี้การอ่านหน่วยความจำและการอ่านไฟล์อาจมีผลข้างเคียงที่ซ่อนอยู่ของการแคชระบบตัวดำเนินการ


0

การอ่านจากหน่วยความจำไม่มีผลต่อฟังก์ชั่นอื่น ๆ ดังนั้นจึงไม่มีผลข้างเคียง โดยทั่วไปการอ่านจากไฟล์จะย้ายตัวชี้ตำแหน่งของไฟล์ดังนั้นเมื่อคุณอ่านอีกครั้งคุณอ่านข้อมูลหลังจากสิ่งที่คุณอ่านไปแล้วดังนั้นฟังก์ชั่นการอ่านหนึ่งฟังก์ชั่นจะเปลี่ยนผลลัพธ์ของฟังก์ชั่นการอ่านอื่น ๆ หากคุณเปิดอ่านและปิดไฟล์ในครั้งเดียวแทนที่จะเกิดผลข้างเคียงนี้จะหายไป แต่ไม่สามารถทำได้สำหรับไฟล์ขนาดใหญ่ นอกจากนี้ขึ้นอยู่กับวิธีที่คุณเปิดไฟล์มันอาจถูกล็อคหลังจากเปิดมันดังนั้นความพยายามครั้งแรกในการเปิดและอ่านไฟล์สำเร็จในขณะที่การพยายามต่อไปนี้จะล้มเหลวโดยมีข้อผิดพลาดของไฟล์ที่เปิดอยู่แล้วซึ่งเป็นผลข้างเคียง

การสร้างฟังก์ชั่นการอ่านที่ไม่มีผลข้างเคียงที่อ่านไฟล์ในครั้งเดียวและช่วยให้การอ่านหลายรายการในเวลาเดียวกันเป็นเรื่องยากเพราะมีฟังก์ชั่นการเขียนไฟล์ที่ได้รับอิทธิพลจากฟังก์ชั่นการอ่านและการกำจัดฟังก์ชั่นการเขียนไฟล์ .


1
คุณสามารถอ่านผลข้างเคียงได้ฟรีจากไฟล์หากไฟล์ไม่เปลี่ยนแปลงและคุณเปลี่ยนไฟล์ให้เป็นสตรีม (รายการที่ขี้เกียจ)
Giorgio

2
การเข้าถึงระบบปฏิบัติการสำหรับไฟล์ที่ไม่ได้อยู่ภายใต้การควบคุมของคุณเป็นผลข้างเคียง เฉพาะในกรณีที่คุณสามารถควบคุมความไม่แน่นอนของไฟล์ (และอาจจะเป็นลำดับการดำเนินการกลายพันธุ์ในไฟล์ ... ผ่านทางIOMonad?) คุณสามารถสร้างฟังก์ชั่นที่ไม่มีผลข้างเคียงสำหรับการอ่าน
Bergi

0

การอ่านจากสตรีมเป็นผลข้างเคียงอยู่แล้วเนื่องจากผลลัพธ์ของฟังก์ชั่นเช่นisEOFอาจส่งคืนผลลัพธ์ที่แตกต่างหลังจากการอ่านมากกว่าก่อนการอ่าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.