การโปรแกรมในปรัชญา UNIX เหมือนกับการเขียนโปรแกรมเชิงหน้าที่หรือไม่?


30

สภาพแวดล้อมการเขียนโปรแกรม UNIX (ข้อความคลาสสิก) ระบุว่าวิธี UNIX ในการเขียนโปรแกรมคือการสร้างเครื่องมือขนาดเล็กที่กำหนดอย่างดีซึ่งสามารถรวมกันเพื่อแก้ไขปัญหาที่ซับซ้อนมากขึ้น ในการเรียนรู้ C และ Bash shell ฉันพบว่านี่เป็นแนวคิดที่ทรงพลังที่สามารถใช้เพื่อจัดการกับปัญหาการเขียนโปรแกรมที่หลากหลาย

เพียงแค่ใช้แพลตฟอร์ม Linux แนวคิดนั้นค่อนข้างชัดเจนและใช้งานได้ตลอดเวลา การแสดงออกใด ๆ ที่เกิดขึ้นในบรรทัดคำสั่งที่เปลี่ยนเส้นทาง I / O, การเชื่อมโยงเครื่องมือระบบเช่น ls, grep, อื่น ๆ และอื่น ๆ แสดงให้เห็นว่าแนวคิดนี้มีประสิทธิภาพเพียงใด

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

สิ่งนี้ถูกต้องหรือไม่การเข้าใจปรัชญาการเขียนโปรแกรมของ UNIX นั้นคือการเขียนโปรแกรมที่ใช้งานได้โดยใช้เครื่องมือที่อาจสร้างขึ้นโดยใช้รูปแบบการเขียนโปรแกรมที่จำเป็น?


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

คำตอบ:


19

ฉันคิดว่าคุณมีจุดที่มี แต่cp, rm, cdและจำนวนมากของรัฐอื่น ๆ การเปลี่ยนแปลงเพื่อให้พวกเขาไม่ได้ฟังก์ชั่นจริงๆ ปรัชญาของ UNIX นั้นเกี่ยวกับการทำเพียงสิ่งเดียว แต่ทำได้ดีกว่า บ่อยครั้งที่ทำได้ดีหมายถึงการอนุญาตให้ใช้งานได้ แต่ไม่เสมอไป


9

คำตอบอยู่ใน"การเขียนโปรแกรม Monadic i / o และ UNIX shell"โดย Oleg Klysov

นี่เป็นบทความที่ได้รับแรงบันดาลใจจากกระดาษของ Philip Wadler "How to Declare a Imperative" [ Wadler97 ] เราจะแสดงความคล้ายคลึงกันอันน่าประหลาดใจระหว่าง monadic i / o ใน Haskell และองค์ประกอบตัวกรอง UNIX ตามท่อและการเปลี่ยนเส้นทาง ท่อ UNIX (ถือว่าเป็นความหมายเหมือนการเขียนไปยังไฟล์ชั่วคราว) ค่อนข้างคล้ายกับพระ นอกจากนี้ในระดับของการเขียนโปรแกรม UNIX, i / o ทั้งหมดถือได้ว่าเป็น monadic ...


6

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


1
คุณมีเครื่องบินจริงเหรอ? ;) (ขออภัยสำหรับความคิดเห็นแบบ offtopic)
BlackBear

@BlackBear ไม่ใช่ของส่วนตัวของฉันเอง ฉันอยู่ในสโมสรที่พวกเราประมาณ 50 คนเป็นเจ้าของเครื่องบินรวม 4 ลำ มันเป็นวิธีที่ไม่แพงมาก :-)
Brian Knoblauch

@Brian Knoblauch: ฉันต้องการเครื่องบินในอนาคต .. การอนุญาตเงิน: P
BlackBear

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

2

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

การเขียนโปรแกรมทั้งหมดเป็นการจัดการข้อมูลบางประเภท! และในบางกรณีการเขียนโปรแกรมก็ยังจัดการโปรแกรมเอง (Meta programming) ตอนนี้วิธีการทำงานของปรัชญา UNIX คือลองนึกภาพการประมวลผลข้อความ ข้อความคืออะไร ข้อความเป็นข้อมูลบางประเภท เมื่อรวมตัวกันเป็นข้อกำหนดข้อความก็จะกลายเป็น XML และ JSON ของ ข้อความยังสามารถเป็นรายการของตัวเลขข้อความสามารถเป็นของ csv, tsv และอะไรก็ได้! ในข้อความหรือสตริงอื่น ๆ สามารถเป็นตัวแทนของพื้นที่การเขียนโปรแกรมข้อมูลขนาดใหญ่เพียงเพราะบริบทสามารถบิดและกลายเป็นสิ่งที่เราต้องการ!

การเขียนโปรแกรมทั้งหมดต้องการการจัดระเบียบข้อมูลบางอย่าง การจัดระเบียบต้องค้นหา ...

คุณไปที่นั่นแค่มี 'grep', 'fgrep' และครอบครัวของมันเพื่อทำเช่นนั้น

เมื่อคุณค้นหาคุณต้องทำการเรียงลำดับ ..

ข ตอนนี้เรามีคำสั่ง 'เรียงลำดับ' เพื่อทำเช่นนั้น

คุณเพิ่งเรียงลำดับสองไฟล์ตอนนี้คุณต้องการเปรียบเทียบมัน

ค ตอนนี้เรามี 'diff', 'cmp' และ al เพื่อทำเช่นนั้น

คุณเพิ่งพบว่าไม่มีความแตกต่างระหว่างไฟล์ คุณต้องการข้อมูลที่เป็นระเบียบมากขึ้นในตอนนี้

d คุณมี 'cat' ไพพ์และโอเปอเรเตอร์การเปลี่ยนเส้นทางเพื่อเขียนไปยังไฟล์

คุณต้องการการแยกวิเคราะห์ที่เฉพาะเจาะจงมากขึ้น ..

อี คุณมีหัวหางมากขึ้นน้อยลงตัดและทำเช่นนั้น ...

ทั้งหมดนี้ถูกเย็บเข้าด้วยกันโดยใช้ '|' เพื่อสร้างสิ่งที่ทรงพลังจริง ๆ โดยไม่ต้องเขียนโค้ดใด ๆ เลย สำหรับการค้นหาและเย็บเพิ่มเติมที่คุณมี ..

ฉ awk, shell และ sed

awk, shell และ sed ช่วยให้คุณควบคุมข้อความได้ดีกว่าสิ่งที่ตัด, diff et al สามารถให้คุณได้ คุณเคยสงสัยหรือไม่ว่า command1 | command2 | command3 ... series เป็นกลไกเวิร์กโฟลว์ เมื่อรวมกับ If's จะมีพลังมากขึ้น

ตอนนี้สนุกมากขึ้น

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

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

ฉันอ่านนี้บางที่ที่ Reddit

"หากเป้าหมายการออกแบบเพียงอย่างเดียวของคุณคือความเรียบง่ายคุณจะได้ผู้ใช้มากถึง Plan9"


1

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

หวังว่าจะช่วยได้

-tjw

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