ทำไมโปรแกรมเมอร์บางคนจัดหมวดหมู่ C, Python, C ++ แตกต่างกันอย่างไร - เกี่ยวกับระดับ


16

ฉันกำลังเรียนหลักสูตรเบื้องต้นเกี่ยวกับหลามและผู้สอนบอกว่าหลามเป็นภาษาระดับสูงและ C และ C ++ เป็นภาษาระดับต่ำ มันแค่ทำให้สับสน ฉันคิดว่า C, C ++, Python, Java และอื่น ๆ เป็นภาษาระดับสูงทั้งหมด

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


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

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

คำตอบ:


31

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

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

C อยู่ในระดับต่ำในระดับที่ 2: สามารถเปิดใช้งานการจัดการโดยตรงกับฮาร์ดแวร์คอมพิวเตอร์ (อย่างน้อยก็โดยตรงตามที่ระบบปฏิบัติการอนุญาต) การใช้งานทั่วไปของ Python, Java และอื่น ๆ อย่างน้อยหนึ่งขั้นตอนลบออกจากฮาร์ดแวร์เพราะพวกเขาทำงานใน VM หากคุณต้องการจัดการฮาร์ดแวร์จาก Python คุณจะต้องเขียนส่วนขยายไปยัง Python VM โดยปกติจะเป็น C หรือ C ++

C ++ เป็นกรณีแปลก ๆ มันมีโครงสร้างข้อมูลที่ดีมากมายซึ่งเป็นส่วนหนึ่งของไลบรารีมาตรฐาน แต่มันก็ช่วยให้สามารถจัดการฮาร์ดแวร์ในระดับต่ำได้


3
C ++ ไม่ใช่กรณีที่แปลกจริง ๆ IMO - เป็นเพียงภาษาผสม ระดับของสิ่งที่คุณได้รับนั้นขึ้นอยู่กับคุณสมบัติที่คุณใช้
Steve314

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

1
@Giorgio - c ++ ช่วยให้คุณสามารถซ่อนใด ๆรายละเอียดการดำเนินงาน - เช่นทำให้มันเป็นส่วนหนึ่งของ internals ส่วนตัวของชั้นดังนั้นวิธีที่เป็นทางการเท่านั้นที่จะใช้มันเป็นผ่านทางอินเตอร์เฟซของประชาชนในระดับที่ แน่นอนว่าคุณสามารถทำลายกฎและช่วงชิงความจำของคุณได้ทุกอย่างที่คุณต้องการ - แต่ในทางปฏิบัติคุณสามารถทำเช่นนั้นในภาษาใดก็ได้ที่สนับสนุนการพัฒนาแอปพลิเคชันในโลกแห่งความเป็นจริง
Steve314

@Giorgio - ยกตัวอย่าง Haskell "ไม่ปลอดภัย" ในกรณีนั้นมีแนวโน้มที่จะหมายถึงแบบไม่โปร่งใส (เหมือนในunsafePerformIO) มีหลายIORefประเภท แต่ไม่มีอะไรเทียบเท่ากับที่reinterpret_castฉันรู้และไม่เท่ากันของเลขคณิตของตัวชี้ แต่นั่นไม่ได้หมายความว่าปลอดภัยจากผู้คนที่กำลังแฮ็คข้อมูล เพื่อให้เป็นภาษาที่ใช้งานได้ Haskell จำเป็นต้องเชื่อมต่อกับระบบปฏิบัติการและห้องสมุดในโลกแห่งความเป็นจริง มันมี "อินเตอร์เฟสฟังก์ชั่นต่างประเทศ" ถ้าฉันต้องการโค่นล้มมันทั้งหมดที่ฉันต้องทำก็คือใช้ FFI เพื่อเขียนฟังก์ชั่นการโค่นล้มดั้งเดิม
Steve314

@Giorgio - แน่นอนว่าฉันอาจมีปัญหาในการค้นหาค่าที่ฉันต้องการเสียหายในหน่วยความจำ แต่สิ่งเดียวกันนั้นสามารถใช้ได้ใน C ++ ขึ้นอยู่กับว่าฉันซ่อนมันได้ดีแค่ไหน ตัวอย่างเช่นผมอาจใช้PIMPL ถ้าฉันเพียงแค่ให้รหัสวัตถุและส่วนหัวสำหรับห้องสมุดที่เข้าใจในสิ่งที่ชี้ไปที่ผู้ถูกโค่นล้มจะต้องย้อนกลับ - วิศวกรที่รหัสวัตถุที่จะคิดออกว่าจะล้มล้างและวิธีการ
Steve314

8

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

ภาษาระดับต่ำเขียนขึ้นเพื่อนำคอมพิวเตอร์โดยตรง - คิดว่ารหัสเครื่องและรหัสประกอบ

ภาษาระดับสูงพยายามที่จะสรุปรายละเอียดของ nitty-gritty (โดยเฉพาะการจัดสรรหน่วยความจำและการปล่อยหน่วยความจำ) ความคิดคือการให้อินเทอร์เฟซ "ธรรมชาติ" มากขึ้นในการเขียนโปรแกรมและหวังว่าผู้เขียนโปรแกรมจะมุ่งเน้นไปที่การออกแบบและการผลิต

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

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

ภาษาระดับสูงมีข้อดีของฟังก์ชั่น พวกเขาอนุญาตให้เราออกแบบและพัฒนาได้อย่างอิสระ (และปลอดภัย!)

ภาษาระดับต่ำมีข้อดีของความเร็วในกรณีส่วนใหญ่ มีค่าใช้จ่ายในการแปลรหัสระดับสูง นอกจากนี้มันค่อนข้างเจ๋งที่จะเขียนอะไรบางอย่างใน 'speek คอมพิวเตอร์'

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


5

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

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

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

C ++ เพิ่ม abstractions อีกเลเยอร์: เพิ่มคลาส (การสรุป vtables และบริบทที่ส่งผ่านไปยังไวยากรณ์ OOP) newและdelete(การจัดสรรหน่วยความจำบันเดิลและการกำหนดค่าเริ่มต้นตัวแปรให้เป็นโครงสร้างเดียว) การตรวจสอบชนิดเวลาคอมไพล์ metaprogramming) และสิ่งอำนวยความสะดวกด้านไวยากรณ์เวลาคอมไพล์เช่นเนมสเปซ, ฟังก์ชั่นและการโอเวอร์โหลดของผู้ปฏิบัติงานเป็นต้น

Python ก้าวไปอีกขั้นจากฮาร์ดแวร์ C ++ ยังให้โปรแกรมเมอร์ควบคุมการจัดสรรหน่วยความจำเต็มรูปแบบและช่วยให้การจัดการ RAM โดยตรง; Python ดูแลการจัดการหน่วยความจำให้คุณ นอกจากนี้แทนที่จะรวบรวมรหัสของคุณเป็นคำสั่งเครื่องที่ใช้ภาษาท้องถิ่นทั้งหมดจะรันรหัสดังกล่าวกับเครื่องเสมือน (ซึ่งบางครั้งอาจหนักหนาสาหัส แต่มักจะไม่ใช่สิ่งที่ต้องกังวล) แต่มันยังช่วยให้สิ่งที่เรียบร้อยซึ่งจะยุ่งยากใน C ++ และยากมากใน C เช่นการจัดการกับฟังก์ชันและคลาสที่ทำงาน เวลารับชื่อของออบเจกต์ตามอำเภอใจในเวลาใช้งานอินสแตนซ์คลาสโดยใช้ชื่อ ณ รันไทม์การปะแก้ลิง ฯลฯ เป็นต้น

ดังนั้นเมื่อผู้คนแบ่งภาษาออกเป็น "ระดับสูง" และ "ระดับต่ำ" พวกเขาจะวาดเส้นที่กำหนดไว้ที่ใดที่หนึ่งและบรรทัดนั้นจะไม่เหมือนกันเสมอไป ในปี 1970 เส้นแบ่งระหว่างแอสเซมบลีและ C (สรุปคำสั่งเครื่องเฉพาะแพลตฟอร์มเป็นปัจจัยชี้ขาด); ในปี 1987 มันอาจจะอยู่ระหว่าง C และ C ++; วันนี้อาจอยู่ระหว่าง C ++ และ Java (ด้วยการจัดการหน่วยความจำอัตโนมัติเป็นปัจจัยชี้ขาด)

เรื่องสั้นสั้น: ระดับสูงเป็นสเกลเลื่อนและสำหรับสามภาษาที่คุณพูดถึงคือ C <C ++ <Python


ฉันจะบอกว่าระดับสูงกับระดับต่ำไม่ใช่ระดับเดียว แต่แทนที่จะเป็นสองสเกลแยกต่างหาก ระดับต่ำเกี่ยวข้องกับภาษาที่เกี่ยวข้องกับพฤติกรรมของเครื่องในขณะที่ระดับสูงเกี่ยวข้องกับความสามารถในการให้สิ่งที่เป็นนามธรรม C # เป็นภาษาระดับสูงมากกว่า C99 แต่ยังต่ำกว่าภาษาที่กำหนดโดยมาตรฐาน C เนื่องจากพฤติกรรมของเช่นใช้ตัวชี้ "int" เพื่อประมวลผลค่า "สั้น" ในอาร์เรย์สองที่ เวลาถูกกำหนดใน C # แต่ไม่ใช่ใน C99
supercat

3

เส้นแบ่งระหว่างภาษา "ระดับต่ำ" และ "ระดับสูง" จะเปลี่ยนไปตามเวลา
ตัวอย่างเช่น:
ย้อนกลับไปในยุคของ UNIX, C เป็นภาษาระดับสูง
วันนี้ C ไม่มีโครงสร้างเช่นประเภทการแมป (พจนานุกรม) ตัววนซ้ำ ฯลฯ ซึ่งภาษาระดับสูงอย่าง Python มีในปัจจุบัน ดังนั้นเส้นจึงเปลี่ยนไปและตอนนี้ C ก็ตกลงไปในกลุ่มระดับต่ำ

ภาษาระดับต่ำ:
ภาษาเหล่านี้ "ปิด" กับสิ่งที่เครื่องสามารถดำเนินการได้ (ระดับต่ำสุดคือ: รหัสการประกอบ!)
เมื่อทำงานกับภาษาเหล่านี้โปรแกรมเมอร์จะต้องคิดถึงสิ่งต่าง ๆ ในระดับต่ำสุดเช่นการจัดการหน่วยความจำ .. คุณรู้สึกใกล้ชิดกับฮาร์ดแวร์มากและคุณต้องทำงานกับมันโดยตรง

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

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