ทุกภาษาเหมือนกันหรือไม่


39

เมื่อเร็ว ๆ นี้ฉันต้องเข้าใจการออกแบบโปรแกรมเล็ก ๆ ที่เขียนด้วยภาษาที่ฉันไม่มีความคิด ( ABAPถ้าคุณต้องรู้) ฉันสามารถคิดออกโดยไม่ยากเกินไป

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

นี่เป็นเรื่องจริงหรือไม่ ภาษาการเขียนโปรแกรมทั้งหมดประกอบด้วยโครงสร้างที่คล้ายกันเช่นลูป, ข้อความสั่งแบบมีเงื่อนไขและการส่งข้อความระหว่างฟังก์ชั่นหรือไม่? มีภาษาที่ไม่ลึกลับซึ่งโปรแกรมเมอร์ Java / Ruby / Haskell ทั่วไปจะไม่สามารถเข้าใจได้หรือไม่? ทุกภาษามีต้นกำเนิดร่วมกันหรือไม่?


4
ฉันจะพาคุณไปที่การตีค่าเฉลี่ยโดย Paul Graham คุณอาจจะหรืออาจไม่ต้องการที่จะอ่านทั้งหมด แต่สำหรับการค้นหาส่วนที่เกี่ยวข้องสำหรับหัวข้อ "The Blub Paradox" คุณเกรแฮมไม่สามารถใส่ใจที่จะใส่สมอในผนังข้อความของเขาดังนั้นฉันจึงไม่สามารถเชื่อมโยงโดยตรงกับมัน
kwatford

4
ภาษาไม่มีต้นกำเนิดร่วมกัน แต่ทุกภาษาพยายามที่จะแก้ปัญหา ฉันคิดว่ามันค่อนข้างคล้ายกับภาษาพูด มีวัตถุประสงค์เพื่อแสดงความเป็นตัวของตัวเอง ฉันไม่สามารถพูดได้ว่ามันเป็นเรื่องตรงไปตรงมาที่จะเข้าใจภาษาตามความรู้ของ 1 กระบวนงาน / OO / หน้าที่ ฉันยังไม่ได้ทำ แต่ถ้าฉันต้องถามคำถามนี้ฉันจะดู perl หรือ lisp ด้วยวงเล็บจำนวนมาก & ฉันจะไม่สามารถพูดได้ว่าการรู้ 1 ภาษาทุกประเภทก็เพียงพอแล้ว
shahkalpesh

1
ในกรณีนั้น: แคลคูลัสแลมบ์ดา อาจไม่ใช่ภาษา 'จริง' แต่เป็นแม่ของภาษาการเขียนโปรแกรมทุกประการ ฉันเคยต้องใช้ภาษาที่ใช้งานได้เพื่อที่จะรวบรวมเป็นสำนวนแลมบ์ดา (ซึ่งถูกตีความโดยตรง) ผลลัพธ์คือ (สำหรับฉันอย่างน้อย) ไม่สามารถอ่านได้แม้จะรักษาตัวระบุที่เกี่ยวข้องทั้งหมดไว้ ฟังก์ชั่นแบบเรียกซ้ำโดยใช้ Y-combinator วิธีเดียวที่ใช้งานได้จริงเพื่อค้นหาว่านิพจน์ตัวอย่างบางกลุ่มทำอะไรเพื่อประเมินผลด้วยตนเอง สิ่งที่เรียบง่ายเช่น fibonnaci และ merge sort ไม่สามารถอ่านได้
kwatford

2
หากคุณรู้จักภาษาที่ใช้งานได้คุณควรรู้ว่าลูปไม่สามารถใช้ได้ในทุกภาษา
jalf

Pietค่อนข้างแตกต่าง :)

คำตอบ:


88

พื้นฐานของภาษาส่วนใหญ่นั้นเหมือนกันหมด

พวกเขาเสนอ:

  • ประเภทข้อมูลเกลา: โดยปกติแล้วจะเป็นบูลีนจำนวนเต็มลอยและตัว
  • ชนิดข้อมูลแบบผสม: อาร์เรย์ (สตริงเป็นกรณีพิเศษ) และโครงสร้าง
  • โครงสร้างรหัสพื้นฐาน: เลขคณิตมากกว่าสเกลาร์, การเข้าถึงอาร์เรย์ / โครงสร้าง, การมอบหมาย
  • โครงสร้างการควบคุมแบบง่าย: if-then, if-then-else, ในขณะที่สำหรับลูป
  • แพคเกจของบล็อครหัส: ฟังก์ชันขั้นตอนพร้อมพารามิเตอร์
  • ขอบเขต: พื้นที่ที่ตัวระบุมีความหมายเฉพาะ

หากคุณเข้าใจสิ่งนี้คุณจะเข้าใจภาษา 90% ของโลก สิ่งที่ทำให้ภาษาเหล่านี้เข้าใจยากขึ้นเล็กน้อยคือความหลากหลายของไวยากรณ์แปลก ๆ ที่คนทั่วไปใช้ในการพูดสิ่งพื้นฐานเดียวกัน บางคนใช้สัญกรณ์สั้นที่เกี่ยวข้องกับเครื่องหมายวรรคตอนแปลก (APL เป็นสุดขีด) บางคนใช้คำหลักจำนวนมาก (ภาษาโคบอลเป็นตัวแทนที่ดีเยี่ยม) นั่นไม่สำคัญหรอก สิ่งที่สำคัญคือถ้าภาษานั้นสมบูรณ์เพียงพอสำหรับตัวเองในการทำงานที่ซับซ้อนโดยไม่ทำให้คุณขาดทรงผม (ลองเข้ารหัสแฮ็คสตริงที่ร้ายแรงในสคริปต์เชลล์ของ Window DOS: มันเป็นความสามารถของทัวริง แต่แย่มากในทุกสิ่ง)

ข้อเสนอภาษาขั้นตอนที่น่าสนใจมากขึ้น

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

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

ภาษาที่ยากต่อการเข้าใจคือภาษาที่ไม่ใช้ขั้นตอน:

  • ภาษาที่ใช้งานได้จริงโดยไม่มีการมอบหมายหรือผลข้างเคียง
  • ภาษาลอจิกเช่น Prolog ซึ่งการคำนวณเชิงสัญลักษณ์และการรวมเกิดขึ้น
  • ภาษาที่จับคู่รูปแบบซึ่งคุณระบุรูปร่างที่ตรงกับปัญหาและบ่อยครั้งที่การกระทำถูกเรียกใช้งานโดยการจับคู่
  • ภาษาข้อ จำกัด ซึ่งช่วยให้คุณระบุความสัมพันธ์และแก้สมการโดยอัตโนมัติ
  • ภาษาคำอธิบายฮาร์ดแวร์ซึ่งทุกอย่างดำเนินการในแบบคู่ขนาน
  • ภาษาเฉพาะโดเมนเช่น SQL, Colored Petri Nets เป็นต้น

มีสองรูปแบบการดำเนินการที่สำคัญสำหรับภาษา:

  • ข้อความอ้างอิงซึ่งเอนทิตีของตัวระบุชื่อและการไหลของข้อมูลถูกเข้ารหัสโดยปริยายในสูตรที่ใช้ตัวระบุเพื่อตั้งชื่อเอนทิตี (Java, APL, ... )
  • กราฟิกซึ่งเอนทิตีถูกวาดเป็นโหนดและความสัมพันธ์ระหว่างเอนทิตีถูกวาดเป็นเส้นโค้งที่ชัดเจนระหว่างโหนดเหล่านั้น (UML, Simulink, LabView)

ภาษากราฟิกมักจะอนุญาตให้มีข้อความย่อยเป็นข้อความประกอบในโหนดและบนส่วนโค้ง ภาษากราฟิกอื่น ๆ อนุญาตให้ใช้กราฟซ้ำ (พร้อมข้อความ :) ในโหนดและบนส่วนโค้ง ภาษากราฟิกที่แปลกจริง ๆ อนุญาตให้กราฟหมายเหตุประกอบชี้ไปที่กราฟที่มีการเพิ่มความคิดเห็น

ภาษาเหล่านี้ส่วนใหญ่ใช้รูปแบบการคำนวณจำนวนน้อยมาก:

  • แคลคูลัสแลมบ์ดา (พื้นฐานสำหรับเสียงกระเพื่อมและภาษาที่ใช้งานได้ทั้งหมด)
  • ระบบโพสต์ (หรือเทคนิคการเขียนสตริง / ต้นไม้ / กราฟ)
  • เครื่องทัวริง (การปรับเปลี่ยนสถานะและการเลือกเซลล์หน่วยความจำใหม่)

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

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


3
คำตอบที่ดี! ตามการติดตาม (มีวิธีถามคำถามติดตามใน SO หรือไม่) มีภาษาหนึ่งที่ฉันสามารถเชี่ยวชาญและอ้างว่าเข้าใจแนวคิดทั้งหมดในซอฟต์แวร์การเขียนโปรแกรมหรือไม่ มันจะเป็นเสียงกระเพื่อม (หรือภาษาเช่น Scheme)?

@Anirudh: ไม่มีกลไกการติดตามอย่างเป็นทางการ แต่คุณสามารถเปิดคำถามใหม่ได้ หากมีเหตุผลและลิงก์ไปยังคำถามนี้อาจไม่สามารถปิดได้ ;) เพื่อตอบการติดตามของคุณฉันเชื่ออย่างเต็มที่ว่าไม่มีแค่ภาษาเดียวเนื่องจากกระบวนทัศน์แตกต่างกันมากเกินไป

@Anirudh: เห็นด้วยกับจอห์น Y มีเพียงหนึ่งเดียวไม่ได้ แต่ถ้าคุณยังใหม่กับสนามคุณควรใช้พลังงานมากพอที่จะควบคุมกระบวนทัศน์กระบวนทัศน์ (ฉันถือว่า OO เป็นเพียงความเชี่ยวชาญ) มันจะไม่เจ็บที่จะมองกระบวนทัศน์อื่น ๆ (ตรรกะ, ข้อ จำกัด , ดาต้าโฟลว์) เพื่อให้เข้าใจถึงวิธีการทำงานของพวกเขา แต่สำหรับงานอุตสาหกรรมในแต่ละวัน
Ira Baxter

1
เช่นเดียวกับภาษาธรรมชาติ "ยากที่จะเข้าใจ" เป็นแบบอัตนัยและขึ้นอยู่กับภาษาแรกที่คุณเรียน
NullUserException

1
@NullUserException: นี่เป็นการแนะนำว่าคุณควรเลือกภาษาแรกของคุณอย่างระมัดระวังเพื่อให้ง่ายต่อการเข้าใจผู้อื่นมากที่สุด นั่นคือจุดประสงค์ของโครงการและโดยเฉพาะอย่างยิ่งหนังสือ SICP
Ira Baxter

6

ภาษาคำอธิบายฮาร์ดแวร์เป็นภาษาโปรแกรม แต่แนวคิดแตกต่างกันมาก ลองขนาด VHDL หรือ Verilog เป็นเรื่องปกติสำหรับการเขียนโปรแกรม FPGA (ตกลงดังนั้นจึงไม่ใช่โปรเซสเซอร์ แต่เป็นอุปกรณ์ประมวลผลทั่วไปและควรได้รับการพิจารณาว่าเป็นฮาร์ดแวร์ที่ถูกต้องสำหรับหัวข้อวิทยาศาสตร์คอมพิวเตอร์) คุณต้องทำให้สิ่งต่างๆเกิดขึ้นอย่างชัดเจน มันเป็นรูปแบบที่แตกต่างอย่างสิ้นเชิง คุณคิดถึงสิ่งต่าง ๆ ที่เกิดขึ้นพร้อมกันเนื่องจากกฎไม่ใช่ข้อยกเว้น สำหรับลูปใน verilog จะขยายเป็นฮาร์ดแวร์แบบขนาน ดังนั้นพฤติกรรม "คาดหวัง" อาจไม่ใช่สิ่งที่คุณคาดหวัง


นั่นเป็นจุดที่ดี ฉันจะค้นหา Verilog / VHDL

ฉันคิดเสมอว่าภาษาการเขียนโปรแกรมแบบเดิม ๆ นั้นเป็นวิธีที่ผิดเพี้ยนในการเขียนโปรแกรมที่ขนานกันอย่างเป็นธรรมชาติเช่น VHDL เมื่อคุณเริ่มต้นในฐานะนักออกแบบฮาร์ดแวร์บิตเกี่ยวกับทุกสิ่งที่เกิดขึ้นในแบบอนุกรมดูเหมือนว่าเงอะงะอย่างไม่น่าเชื่อ (เรากำลังสอนการเขียนโปรแกรม langauges ที่ไม่ถูกต้องแก่ผู้ใช้เป็นอย่างแรกพวกเขาควรจะเป็น Verilog!)
Ira Baxter

4

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "พื้น" ความยืดหยุ่นทุกภาษาของทัวริงสมบูรณ์ ในแง่ที่ว่า: ใช่พวกเขาทั้งหมดเหมือนกัน

ในระดับต่ำพวกเขาทั้งหมดดำเนินการลำดับการดำเนินการที่คล้ายกันและทุกสิ่งที่ Windows, Linux และ (ล่าสุด) OS X ทั้งหมดทำงานบนโปรเซสเซอร์ที่เข้ากันได้กับ Intel โดยใช้ชุดคำสั่งเดียวกัน ด้วยวิธีนี้พวกเขาก็เหมือนกันโดยทั่วไป

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


3

ฉันจะบอกว่าภาษาเข้ารหัสความหมาย หากความหมายมีความหมายใด ๆ ในบริบทบางอย่างทุกภาษาที่สามารถแสดงความหมายอาจกล่าวได้ว่าถูก จำกัด ด้วยความหมายและบริบท

หากคุณ จำกัด บริบทนั้นกับเครื่องมาตรฐาน Von Neumann ความหมายการคำนวณของการเปลี่ยนหน่วยความจำและการคำนวณในซีพียูอาจกล่าวได้ว่าเป็นจุดกำเนิด - และอาจเป็นความหมายเดียวที่ทุกภาษามีเหมือนกัน สิ่งอื่น ๆ ล้วนเป็นสิ่งที่สร้างขึ้นบนสิ่งเหล่านี้


1
John von Neumann และมันก็ไม่ได้ออกเสียงเหมือน "นิวแมน" มากกว่าเช่น "นอยแมน"

ขอบคุณสำหรับการแก้ไข - ฉันออกเสียงเป็นเหมือนที่คุณพูด
Preet Sangha

เมื่อมีคนแนะนำการแก้ไขคุณสามารถแก้ไขโพสต์เพื่อแสดงถึงการแก้ไขได้
Phil Miller

2

ภาษาการเขียนโปรแกรมยังเป็นเครื่องมือสำหรับการคิด ด้วยมุมมองความคิดอื่น ๆ ปัญหาบางอย่างก็หายไปหรือถูกเปลี่ยนไปเป็นประเภทที่แตกต่างและจัดการได้ง่ายกว่า (ตัวอย่างเช่นรูปแบบการออกแบบสไตล์ C ++ จำนวนมากจะหายไปเมื่อคุณคิดถึง Lisp (ดูตัวอย่างการนำเสนอของ Peter Norvik ) และErlangปลดปล่อยคุณจากการคิด ของการทำงานพร้อมกันในระดับต่ำหรือสร้างการคำนวณแบบกระจายและให้คุณจดจ่อกับตรรกะของแอพพลิเคชัน)

แต่โปรดทราบว่าบางครั้งกระบวนทัศน์ "ใหม่" สามารถบางส่วนนำไปใช้กับ "เก่า" ภาษาโปรแกรมซึ่งจะอธิบายว่าทำไมเราตัวอย่างเช่นมีหนังสือสอนเขียนโปรแกรมการทำงานสำหรับการเขียนโปรแกรม Java แต่โดยพื้นฐานแล้วการสนับสนุนและบูรณาการกระบวนทัศน์ที่ทรงพลังยิ่งขึ้นในระดับภาษาจะช่วยให้การประยุกต์ใช้กระบวนทัศน์เป็นธรรมชาติมากขึ้น (และทำให้มันเป็นไปไม่ได้ที่จะเข้าใจโปรแกรมในภาษาที่สนับสนุนกระบวนทัศน์ที่ไม่คุ้นเคยตามคำแนะนำอื่น ๆ - @Ira Baxter และ @kwatford หมายถึงPaul Graham )


2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

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


1

โดยทั่วไปภาษาผู้ใหญ่มีเป้าหมายสองสามข้อและพวกเขาทำการแลกเปลี่ยนที่พวกเขาเสียสละสิ่งหนึ่งเพื่ออีก ภาษาที่ใช้งานทั่วไปสามารถใช้งานได้ทุกอย่าง แต่ไม่มีภาษาใดสามารถทำได้ดีเยี่ยมในทุก ๆ ด้าน ตัวอย่างบางส่วน:

C พยายามเป็นภาษาการเขียนโปรแกรมระบบในอุดมคติ ด้วยเหตุนี้จึงเสียสละความสามารถในการอ่านและความปลอดภัยสำหรับการควบคุมและความเร็วในระดับต่ำ

Python มุ่งหวังที่จะเป็นภาษาสคริปต์ที่สมบูรณ์แบบ ด้วยเหตุนี้มันเสียสละความเร็วและตรวจสอบได้สำหรับการผลิตและพกพา

Haskell พยายามเป็นภาษาที่ปลอดภัยและบริสุทธิ์ทางคณิตศาสตร์ ด้วยเหตุนี้มันเสียสละความสามารถในการเรียนรู้และการประชุมเพื่อการตรวจสอบและความน่าเชื่อถือ

การเสียสละและผลประโยชน์เหล่านี้สร้างความแตกต่างอย่างมากในภาษา ใช่ภาษาการเขียนโปรแกรมส่วนใหญ่สามารถใช้กับทุกสิ่งที่คอมพิวเตอร์ทำได้ แต่ไม่ควรใช้ภาษาเดียวกันกับทุกสิ่ง ทุกภาษาด้านบนเป็นภาษาที่ฉันจะเลือกสำหรับงานบางอย่าง แต่ไม่ใช่สำหรับคนอื่น ถ้าฉันเขียนโปรแกรมระบบปฏิบัติการฉันจะเลือก C. ถ้าฉันเขียนแบ็กเอนด์สำหรับเว็บไซต์ฉันจะใช้ Python และถ้าฉันเขียนระบบการเงินฉันจะใช้ Haskell

ในที่สุดคุณเลือกเป็นโปรแกรมเมอร์เป็นเครื่องมือที่เหมาะสมสำหรับงาน

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