โปรแกรมเมอร์จัดการกับการพัฒนาซอฟต์แวร์ระดับต่ำในภาษาระดับสูงได้อย่างไร


20

ฉันค่อนข้างใหม่ในการเขียนโปรแกรมและวิธีที่ดีที่สุดที่ฉันสามารถถามคำถามนี้คือตัวอย่าง

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

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

ฉันรู้ว่าคำถามนี้อาจดูเหมือนชัดเจนสำหรับบางคนและฉันรู้ว่าฉันต้องเรียนรู้มากมาย แต่ฉันไม่รู้ด้วยซ้ำว่าจะเริ่มต้นด้วยคำถามเช่นนี้ ขอขอบคุณ.

ดังนั้นคำถามของฉันคือ:

หากมีใครบางคนกำลังสร้างเครื่องเสมือนหรือ Playstation emulator หรือระบบปฏิบัติการหรือไดรเวอร์หรือเพิ่มการรองรับ mp3 ลงในเครื่องเล่นสื่อหรือสร้างประเภทไฟล์ของคุณเอง ฯลฯ ได้อย่างไร ฉันไม่เห็นวิธีที่จะทำกับ C # หรือ Java

กล่าวอีกนัยหนึ่งถ้าฉันอ่านหนังสืออย่าง Professional C # โดย WROX หรือ Programming C # โดย OReilly ฉันจะรู้วิธีทำสิ่งเหล่านี้ได้อย่างไร หรือคุณต้องเรียนรู้ภาษาแอสเซมบลีหรือบางสิ่งในระดับต่ำเช่น C ++?


7
เคล็ดลับหนึ่งในการเข้าใจสิ่งที่เกิดขึ้น "ภายใต้ประทุน" คือการมุ่งเน้นและใช้ย่อหน้าเพื่อทำให้อ่านและเข้าใจได้ง่ายขึ้น โปรดแก้ไขคำถามนี้เพื่อให้อ่านง่ายขึ้น
S.Lott

1
ด้วยความสนใจของคุณคุณอาจต้องการรับรหัสของ Charles Petzold: ภาษาที่ซ่อนอยู่ของฮาร์ดแวร์และซอฟต์แวร์คอมพิวเตอร์ มันเป็นการอ่านที่ดี amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight

@ S.Lott To the rescue :-)
Martin Wickman

@Martin Wickman: ในขณะที่ทำงานได้ดีมากมันช่วย @ fender1901 ในการแก้ไขหรือโฟกัสได้ไหม?
S.Lott

1
@Martin Wickman: การยกเลิกการเปลี่ยนแปลงไม่ใช่จุด จุดประสงค์ของฉันคือการกระตุ้นให้ผู้อื่นเรียนรู้ คุณรู้อยู่แล้วอย่างชัดเจน @ fender1901 ต้องเรียนรู้ด้วยการทำ คำถามของฉันคือ: "มันช่วย @ fender1901 ในการแก้ไขหรือมุ่งเน้นหรือไม่" คุณคิดอย่างไร?
S.Lott

คำตอบ:


9

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

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

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

ฉันเชื่อว่า C / C ++ ยังคงกฎพักในพื้นที่ของการเขียนโปรแกรมควบคุมระดับต่ำ ฯลฯ ในขณะที่คุณสามารถปรับการจัดการหน่วยความจำและโครงสร้างข้อมูลในระดับที่ n

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

HTH


คุณสามารถโปรแกรมด้วยภาษาระดับกลางจริง ๆ หรือว่าพวกเขาอยู่ที่นั่นเพื่อตรวจสอบหรือไม่
fender1901

คุณกำลังถามว่าคุณสามารถเขียนซอร์สโค้ด 'bytecode' ได้หรือไม่?
Martijn Verburg

ฉันคิด. ฉันสงสัยว่าถ้าคุณสามารถเริ่มการเข้ารหัสด้วย bytecode หรือ il เช่นเดียวกับที่คุณต้องการ java หรือ c #?
fender1901

Java หรือ C # มีเพียงไม่กี่คนเท่านั้นที่จัดการกับ bytecode แต่ผู้คนจำนวนมากมองว่าโค้ดไบต์ของโค้ดที่สูงกว่าระดับใดที่พวกเขา
กำลังเดือดร้อน

4

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

ในภาษาระดับต่ำกว่าเช่น C และ C ++ ระบบปฏิบัติการ API สามารถเข้าถึงได้โดยตรง (ส่วนใหญ่เนื่องจากระบบปฏิบัติการส่วนใหญ่เขียนด้วยภาษา C ดังนั้นพวกเขาจึงเปิดเผย API ผ่านภาษา C) ตัวอย่างเช่นใน C บนระบบ UNIX คุณสามารถเรียกใช้ioctlฟังก์ชันเพื่อเชื่อมต่อกับอุปกรณ์โดยตรง

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

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


2

ข่าวดีก็คือมันสามารถทำได้กับ Java หรือ C # ปัญหาเดียวที่คุณจำเป็นต้องรู้คือวิธีการ โดยทั่วไปคุณจำเป็นต้องรู้เรื่องเล็ก ๆ น้อย ๆ เกี่ยวกับ Hardware Architecture (ไม่ใช่ PC ที่จำเป็น แต่ Playstation ถ้านั่นคือสิ่งที่คุณต้องการเลียนแบบ) และฉันกลัวว่าคุณจะต้องลงลึกเช่น Assembler และ Machine Language
ทั้งหมด ALUs, ลงทะเบียน, MMUs และสิ่งต่าง ๆ อาจถูกทำให้เป็นนามธรรมและเลียนแบบด้วยภาษาระดับสูง คุณสามารถเรียกใช้ฟังก์ชั่นระดับต่ำเพื่อรับการสนับสนุนฮาร์ดแวร์ (เช่นเรียนรู้เกี่ยวกับ PInvoke และ JNA)

อย่างไรก็ตามเนื่องจากคุณเป็นผู้เริ่มต้นฉันไม่แนะนำให้เริ่มต้นด้วยภารกิจที่ยิ่งใหญ่เช่นนี้ ฉันขอแนะนำให้คุณเรียนรู้ C / C ++, เล็กน้อยเกี่ยวกับ Linux (หรือ Unix-like OS อื่น ๆ , เช่น FreeBSD), สถาปัตยกรรมคอมพิวเตอร์, จากนั้น Assembler ... อาจต้องใช้เวลาสองสามปีดังนั้น ...
สิ่งที่คุณต้องการจริงๆคือ แรงจูงใจและความอดทน


2

สิ่งที่ฉันทำในสิ่งที่เรียนรู้ภาษาระดับสูง (Java) นั้นเริ่มเป็นที่สนใจมากขึ้นอย่างที่คุณเป็นเกี่ยวกับภาษาและฮาร์ดแวร์ระดับต่ำ ในสภาพดั้งเดิมที่สุดคอมพิวเตอร์เป็นอุปกรณ์อิเล็กทรอนิกส์ 1 และ 0 เป็นเพียงตัวเลขสำหรับค่าไฟฟ้า (เปิดและปิด) เมื่อฉันเริ่มเข้าใจตรรกะที่อยู่เบื้องหลังตัวประมวลผลและสิ่งที่อยู่ภายใน Arithmetic Logic Unit สิ่งต่าง ๆ ก็เกิดขึ้นจริง
ฉันคิดว่าคุณควรเริ่มการศึกษาของคุณด้วยสิ่งต่างๆเช่นตรรกะบูลีน (AND, OR, XOR เป็นต้น) จากนั้นเริ่มออกแบบ ALU ขนาดเล็กและดูว่าหน่วยความจำและการลงทะเบียนเล่นเป็นอย่างไร หลังจากนั้นเรียนรู้ภาษาแอสเซมบลีแล้วคุณจะรู้ว่าคอมไพล์ทำงานอย่างไร ในไม่ช้าภาษาระดับสูงจะดูน่าเบื่อ! :) ผมล้อเล่น. มันเป็นสิ่งที่สวยงามว่าทุกอย่างเข้าที่และควรจะสนุกกับการเรียนรู้ เมื่อคุณเริ่มตามเส้นทางของความอยากรู้คุณจะได้รับสิ่งต่าง ๆ ในเวลาไม่นาน


2

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

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

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


ฉันคิดว่าปัญหาที่ใหญ่ที่สุดของฉันในตอนนี้คือหัวข้อเหล่านี้จำนวนมากกำลังจะเข้าใจยากเพราะฉันไม่มีพื้นหลัง ฉันต้องการฉันเดาว่าเป็นสะพานสู่พื้นที่เหล่านั้น
fender1901

@ fender1901: นั่นอาจเป็นปัญหา เคอร์เนล Linux ทำบางสิ่งที่ดูเหมือนแปลกสำหรับคนที่ไม่เข้าใจว่าระบบปฏิบัติการทำอะไร สิ่งเลียนแบบที่คุณพูดถึงอาจจะง่ายที่สุดในการเข้าใจและมีอีมูเลเตอร์เรียบง่ายอยู่ที่นั่นบ่อยครั้งสำหรับไมโครคอมพิวเตอร์ยุคแรก ๆ
David Thornley

1

คุณต้องค้นหาว่าเป็นไปได้ที่จะใช้ฟังก์ชันระดับต่ำกับแพลตฟอร์ม / ภาษาที่ใช้หรือไม่:

  • การจัดเก็บไบต์ไว้ในตัวแปร
  • การอ่าน / เขียนไฟล์เป็นไบต์
  • การตั้งค่าอาร์เรย์ของไบต์การเข้าถึงองค์ประกอบ
  • ใช้คุณสมบัติขั้นตอนจริง OOP
  • การเข้าถึงหน้าจอคีย์บอร์ดซ็อกเก็ต

อืมเสียงที่เลือกภาษาควรเป็นแบบสุ่ม


-2

คำถามมีคำตอบหลายประการ: 1. Java และ C # เป็นภาษาระดับสูงที่พัฒนาขึ้นสำหรับการพัฒนาแอปพลิเคชันบนระบบปฏิบัติการที่มีอยู่ซึ่งจัดการหน่วยความจำ (สิ่งนี้ยังทำให้สามารถสร้างโปรแกรมไฮบริดที่สามารถทำงานบนระบบที่แตกต่างกันได้) 2. พื้นที่ที่จำเป็นต้องมีการเขียนโปรแกรมระดับต่ำคือการพัฒนาระบบปฏิบัติการการพัฒนาไดร์เวอร์การพัฒนาเกม AAA เป็นต้นโดยปกติการเขียนโปรแกรมระดับต่ำจะไม่ได้ทำใน Java หรือ C # โดยใช้ภาษา C / C ++ และแอสเซมบลี

ด้วยจุดสองจุดนี้เท่านั้นที่เราสามารถพูดได้ว่าการเขียนโปรแกรมระดับต่ำทำได้แยกจากกันและไม่จำเป็นต้องเขียนโปรแกรมระดับต่ำในการเขียนโปรแกรมระดับสูง ชิ้นส่วนที่ต้องการการเขียนโปรแกรมระดับต่ำเช่น I / O นั้นดำเนินการโดยล่ามซึ่งเขียนด้วยภาษาระดับต่ำ (ตัวอย่างเช่น JVM ของ java เขียนด้วยภาษา C)

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


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