ผลต่างระหว่างรุ่นของ "ภาษาซี"

เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
ไม่มีความย่อการแก้ไข
ป้ายระบุ: แก้ไขจากอุปกรณ์เคลื่อนที่ แก้ไขจากเว็บสำหรับอุปกรณ์เคลื่อนที่
ไม่มีความย่อการแก้ไข
ป้ายระบุ: แก้ไขจากอุปกรณ์เคลื่อนที่ แก้ไขจากเว็บสำหรับอุปกรณ์เคลื่อนที่
บรรทัด 3:
 
หากคำนึงถึงความสามารถในระดับล่าง ภาษานี้ถูกออกแบบขึ้นเพื่อส่งเสริมการเขียนโปรแกรมที่ขึ้นอยู่กับเครื่องใดเครื่องหนึ่ง (machine-independent) โปรแกรมภาษาซีที่เขียนขึ้นตามมาตรฐานและเคลื่อนย้ายได้ สามารถแปลได้บนแพลตฟอร์มคอมพิวเตอร์และระบบปฏิบัติการต่าง ๆ อย่างกว้างขวาง โดยแก้ไข[[รหัสต้นฉบับ]]เพียงเล็กน้อยหรือไม่ต้องแก้ไขเลย ภาษานี้สามารถใช้ได้บนแพลตฟอร์มได้หลากหลายตั้งแต่[[ไมโครคอนโทรลเลอร์]]ฝังตัวไปจนถึง[[แฮรี่เคน))
 
== ลักษณะเฉพาะ ==
ภาษาซีมีสิ่งอำนวยสำหรับการเขียนโปรแกรมเชิงโครงสร้าง และสามารถกำหนด[[ขอบข่ายตัวแปร]]และ[[การเรียกซ้ำ|เรียกซ้ำ]] เช่นเดียวกับภาษาโปรแกรมเชิงคำสั่งส่วนใหญ่ในสายตระกูล[[ภาษาอัลกอล]] ในขณะที่[[ระบบชนิดตัวแปร]]แบบอพลวัตช่วยป้องกันการดำเนินการที่ไม่ได้ตั้งใจ รหัสที่ทำงานได้ทั้งหมดในภาษาซีถูกบรรจุอยู่ใน[[ซับรูทีน|ฟังก์ชัน]] [[พารามิเตอร์]]ของฟังก์ชันส่งผ่านด้วยค่าของตัวแปรเสมอ ส่วนการส่งผ่านด้วยการอ้างอิงจะถูกจำลองขึ้นโดยการส่งผ่านค่า[[ตัวชี้]] ชนิดข้อมูลรวมแบบแตกต่าง (<code>[[สตรักต์|struct]]</code>) ช่วยให้สมาชิกข้อมูลที่เกี่ยวข้องกันสามารถรวมกันและจัดการได้ในหน่วยเดียว รหัสต้นฉบับของภาษาซีเป็นรูปแบบอิสระ ซึ่งใช้[[อัฒภาค]] (<code>;</code>) เป็นตัวจบคำสั่ง (มิใช่ตัวแบ่ง)
 
ภาษาซียังมีลักษณะเฉพาะต่อไปนี้เพิ่มเติม
* ตัวแปรอาจถูกซ่อนในบล็อกซ้อนใน
* ชนิดตัวแปรไม่เคร่งครัด เช่นข้อมูลตัวอักษรสามารถใช้เป็นจำนวนเต็ม
* เข้าถึง[[หน่วยความจำคอมพิวเตอร์]]ในระดับต่ำโดยแปลงที่อยู่ในเครื่องด้วยชนิดตัวแปรตัวชี้ (pointer)
* ฟังก์ชันและตัวชี้ข้อมูลรองรับการทำงานใน[[ภาวะหลายรูปแบบ]] (polymorphism)
* การกำหนดดัชนี[[แถวลำดับ]]สามารถทำได้ด้วยวิธีรอง คือนิยามในพจน์ของเลขคณิตของตัวชี้
* [[ตัวประมวลผลก่อน]]สำหรับการนิยาม[[แมโคร]] การรวมไฟล์รหัสต้นฉบับ และการแปลโปรแกรมแบบมีเงื่อนไข
* ความสามารถที่ซับซ้อนเช่น [[ไอ/โอ]] การจัดการ[[สายอักขระ]] และฟังก์ชันทางคณิตศาสตร์ รวมอยู่ใน[[ไลบรารี]]
* [[คำหลัก]]ที่สงวนไว้มีจำนวนค่อนข้างน้อย
* ตัวดำเนินการแบบประสมจำนวนมาก อาทิ <code>+=</code>, <code>-=</code>, <code>*=</code>, <code>++</code> ฯลฯ
 
โครงสร้างการเขียน คล้าย[[ภาษาบี]]มากกว่าภาษาอัลกอล ตัวอย่างเช่น
* ใช้วงเล็บปีกกา <code>{ ... }</code> แทนที่จะเป็น <code>begin ... end</code> ใน[[ภาษาอัลกอล 60]] หรือวงเล็บโค้ง <code>( ... )</code> ใน[[ภาษาอัลกอล 68]]
* เท่ากับ <code>=</code> ใช้สำหรับ[[การกำหนดค่า|กำหนดค่า]] (คัดลอกข้อมูล) เหมือน[[ภาษาฟอร์แทรน]] แทนที่จะเป็น <code>:=</code> ในภาษาอัลกอล
* เท่ากับสองตัว <code>==</code> ใช้สำหรับเปรียบเทียบความเท่ากัน แทนที่จะเป็น <code>.EQ.</code> ในภาษาฟอร์แทรนหรือ <code>=</code> ใน[[ภาษาเบสิก]]และภาษาอัลกอล
* ตรรกะ "และ" กับ "หรือ" แทนด้วย <code>&&</code> กับ <code>||</code> ตามลำดับ แทนที่จะเป็นตัวดำเนินการ ∧ กับ ∨ ในภาษาอัลกอล แต่ตัวดำเนินการดังกล่าวจะไม่ประเมินค่าตัวถูกดำเนินการทางขวา ถ้าหากผลลัพธ์จากทางซ้ายสามารถพิจารณาได้แล้ว เหตุการณ์เช่นนี้เรียกว่า[[การประเมินค่าแบบลัดวงจร]] (short-circuit evaluation) และตัวดำเนินการดังกล่าวก็มีความหมายต่างจาก[[การดำเนินการระดับบิต|ตัวดำเนินการระดับบิต]] <code>&</code> กับ <code>|</code>
 
=== คุณลักษณะที่ขาดไป ===
ธรรมชาติของภาษาในระดับต่ำช่วยให้โปรแกรมเมอร์ควบคุมสิ่งที่คอมพิวเตอร์กระทำได้อย่างใกล้ชิด ในขณะที่อนุญาตให้มีการปรับแต่งพิเศษและการทำให้เหมาะที่สุดสำหรับแพลตฟอร์มหนึ่งใดโดยเฉพาะ สิ่งนี้ทำให้รหัสสามารถทำงานได้อย่างมีประสิทธิภาพบนฮาร์ดแวร์ที่มีทรัพยากรจำกัดมาก ๆ ได้เช่น[[ระบบฝังตัว]]
 
ภาษาซีไม่มีคุณลักษณะบางอย่างที่มีในภาษาอื่นอาทิ
* ไม่มีการนิยาม[[ฟังก์ชันซ้อนใน]]
* ไม่มีการกำหนดค่าแถวลำดับหรือสายอักขระโดยตรง (การคัดลอกข้อมูลจะกระทำผ่านฟังก์ชันมาตรฐาน แต่ก็รองรับการกำหนดค่าวัตถุที่มีชนิดเป็น <code>struct</code> หรือ <code>union</code>)
* ไม่มี[[การเก็บข้อมูลขยะ]]โดยอัตโนมัติ
* ไม่มีข้อกำหนดเพื่อ[[การตรวจสอบขอบเขต]]ของแถวลำดับ
* ไม่มี[[การเขียนโปรแกรมเชิงแถวลำดับ|การดำเนินการสำหรับแถวลำดับทั้งชุด]]ในระดับตัวภาษา
* ไม่มีวากยสัมพันธ์สำหรับ[[ช่วงค่า]] (range) เช่น <code>A..B</code> ที่ใช้ในบางภาษา
* ก่อนถึงภาษาซี99 ไม่มีการแบ่งแยก[[ชนิดข้อมูลแบบบูล]] (ค่าศูนย์หรือไม่ศูนย์ถูกนำมาใช้แทน) <ref>ภาษาซี99 เพิ่มชนิดข้อมูล <code>_Bool</code> แต่มันไม่ใช่การปรับปรุงใหม่เพื่อเข้าสู่บริบทแบบบูล เราสามารถจำลองชนิดข้อมูลแบบบูลได้ดังวิธี <code>enum { false, true } bool;</code> แต่การกระทำเช่นนี้ก็ไม่เป็นการจัดสรรคุณลักษณะทั้งหมดของชนิดข้อมูลแบบบูล</ref>
* ไม่มี[[ส่วนปิดคลุม (วิทยาการคอมพิวเตอร์)|ส่วนปิดคลุม]]แบบรูปนัย (closure) หรือฟังก์ชันในรูปแบบพารามิเตอร์ (มีเพียงตัวชี้ของฟังก์ชันและตัวแปร)
* ไม่มี[[ตัวสร้าง (วิทยาการคอมพิวเตอร์)|ตัวสร้าง]]และ[[โครูทีน]] การควบคุมกระแสการทำงานภายในเทร็ดมีเพียงการเรียกใช้ฟังก์ชันซ้อนลงไป เว้นแต่การใช้ฟังก์ชัน <code>[[longjmp]]</code> หรือ <code>[[setcontext]]</code> จากไลบรารี
* ไม่มี[[การจัดกระทำสิ่งผิดปรกติ]] (exception handling) ฟังก์ชันไลบรารีมาตรฐานจะแสดงเงื่อนไขข้อผิดพลาดด้วย[[ตัวแปรส่วนกลาง]] <code>[[errno]]</code> และ/หรือค่ากลับคืนพิเศษ และฟังก์ชันไลบรารีได้เตรียม <code>goto</code> แบบไม่ใช่เฉพาะที่ไว้ด้วย
* [[การเขียนโปรแกรมเชิงมอดูล]]รองรับแค่ระดับพื้นฐานเท่านั้น
* [[การโอเวอร์โหลดเมท็อด|การโอเวอร์โหลด]]ฟังก์ชันหรือตัวดำเนินการไม่รองรับภาวะหลายรูปแบบขณะแปลโปรแกรม
* [[การเขียนโปรแกรมเชิงวัตถุ]]รองรับในระดับที่จำกัดมาก โดยพิจารณาจากภาวะหลายรูปแบบกับ[[การรับทอด]] (inheritance)
* [[การซ่อนสารสนเทศ]] (encapsulation) รองรับในระดับที่จำกัด
* ไม่รองรับโดยพื้นฐานกับการทำงานแบบ[[มัลติเทร็ด]]และ[[เครือข่ายคอมพิวเตอร์]]
* ไม่มีไลบรารีมาตรฐานสำหรับ[[คอมพิวเตอร์กราฟิกส์]]และความจำเป็นหลายอย่างในการเขียนโปรแกรมประยุกต์
คุณลักษณะเหล่านี้จำนวนหนึ่งมีให้ใช้ได้จากส่วนขยายในตัวแปลโปรแกรมบางตัว หรือจัดสรรไว้แล้วในสภาพแวดล้อมของระบบปฏิบัติการ (เช่น[[โพสซิกซ์]]) หรือจัดเตรียมโดยไลบรารีภายนอก หรือสามารถจำลองโดยดัดแปลงแก้ไขรหัสที่มีอยู่ หรือบางครั้งก็ถูกพิจารณาว่าไม่ใช่รูปแบบการเขียนโปรแกรมที่เหมาะสม
 
=== พฤติกรรมไม่นิยาม ===
การดำเนินการหลายอย่างในภาษาซีมี[[พฤติกรรมไม่นิยาม]]ซึ่งไม่ถูกกำหนดว่าต้องตรวจสอบ[[ขณะแปลโปรแกรม]] ในกรณีของภาษาซี "พฤติกรรมไม่นิยาม" หมายถึงพฤติกรรมเฉพาะอย่างที่เกิดขึ้นโดยมาตรฐานมิได้ระบุไว้ และสิ่งที่จะเกิดขึ้นก็ไม่มีในเอกสารการใช้งานของภาษาซี หนึ่งในชุดคำสั่งที่มีชื่อเสียงและน่าขบขันจาก[[กลุ่มข่าว]] [news:comp.std.c comp.std.c] และ [news:comp.lang.c comp.lang.c] นั้นทำให้โปรแกรมเกิดปัญหาที่เรียกว่า "ปิศาจที่ออกมาจากจมูกของคุณ" (demons to fly out of your nose) <ref>{{cite web | url=http://www.catb.org/jargon/html/N/nasal-demons.html | title=Jargon File entry for ''nasal demons''}}</ref> บางครั้งสิ่งที่เกิดขึ้นในทางปฏิบัติอันเป็นผลมาจากพฤติกรรมไม่นิยามทำให้เกิด[[จุดบกพร่อง]]ที่ยากต่อการตรวจสอบและอาจทำให้ข้อมูลในหน่วยความจำผิดแปลกไป ตัวแปลโปรแกรมบางชนิดช่วยสร้างการดำเนินงานที่ทำให้พฤติกรรมนั้นดีขึ้นและมีเหตุผล ซึ่งแตกต่างจากการแปลโดยตัวแปลชนิดอื่นที่อาจดำเนินงานไม่เหมือนกัน สาเหตุที่พฤติกรรมบางอย่างยังคงไว้ว่าไม่นิยามก็เพื่อให้ตัวแปลโปรแกรมบนสถาปัตยกรรม[[ชุดของคำสั่งเครื่อง]]ที่หลากหลาย สามารถสร้างรหัสที่ทำงานได้ในพฤติกรรมที่นิยามอย่างมีประสิทธิภาพมากขึ้น ซึ่งเชื่อว่าเป็นบทบาทหนึ่งที่สำคัญของภาษาซีในฐานะภาษาสำหรับสร้างระบบ ดังนั้นภาษาซีจึงส่งผลให้เกิดความรับผิดชอบของโปรแกรมเมอร์เพื่อหลีกเลี่ยงพฤติกรรมไม่นิยาม โดยอาจใช้[[#เครื่องมือที่ใช้กับภาษา|เครื่องมือต่าง ๆ]] เพื่อค้นหาส่วนของโปรแกรมว่าพฤติกรรมใดบ้างที่ไม่นิยาม ตัวอย่างของพฤติกรรมไม่นิยามเช่น
* การเข้าถึงข้อมูลนอกขอบเขตของแถวลำดับ
* ข้อมูลล้น (overflow) ในตัวแปรจำนวนเต็มมีเครื่องหมาย
* ฟังก์ชันที่กำหนดไว้ว่าต้องส่งค่ากลับ แต่ไม่มีคำสั่งส่งกลับ (return) ในฟังก์ชัน ในขณะเดียวกันค่าส่งกลับก็ถูกใช้งานด้วย
* การอ่านค่าตัวแปรโดยที่ยังไม่ได้กำหนดค่าเริ่มต้น
การดำเนินการเหล่านี้ทั้งหมดเป็นข้อผิดพลาดในการเขียนโปรแกรม ซึ่งสามารถปรากฏในการใช้ภาษาโปรแกรมอื่น ๆ จำนวนมาก ภาษาซีจึงถูกวิพากษ์วิจารณ์เพราะมาตรฐานของมันสามารถชี้ให้เห็นถึงพฤติกรรมไม่นิยามในหลายกรณีได้อย่างชัดเจน รวมไปถึงพฤติกรรมบางอย่างที่อาจนิยามไว้อย่างดีแล้ว และไม่มีการระบุกลไกการจัดกระทำต่อข้อผิดพลาดขณะทำงานเลย
 
ตัวอย่างหนึ่งของพฤติกรรมไม่นิยามเช่นการเรียกใช้ <code>fflush()</code> บนกระแสข้อมูลป้อนเข้า ซึ่งไม่จำเป็นว่าจะทำให้โปรแกรมทำงานผิดพลาด แต่ในบางกรณีที่การทำให้เกิดผลที่สอดคล้องกันได้นิยามไว้แล้วอย่างดี มีความหมายซึ่งใช้ประโยชน์ได้ (จากตัวอย่างนี้คือการสมมติให้ข้อมูลที่ป้อนเข้าถูกละทิ้งทั้งหมดจนถึงอักขระขึ้นบรรทัดใหม่ตัวถัดไป) เป็น ''ส่วนขยาย'' ที่อนุญาต ส่วนขยายที่ไม่เป็นมาตรฐานเช่นนี้เป็นข้อจำกัดความสามารถในการเคลื่อนย้ายของซอฟต์แวร์
 
== ประวัติ ==
เข้าถึงจาก "https://th.wikipedia.org/wiki/ภาษาซี"