Content update
This commit is contained in:
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
= ลำโพงสัญญาณ (Buzzer)
|
||||
|
||||
#i Buzzer เป็นอุปกรณ์ส่งสัญญาณเสียงซึ่งอาจเป็น อุปกรณ์ เชิงกลเครื่องกลไฟฟ้าหรือเพียโซอิเล็กทริก
|
||||
#h(1.70em) Buzzer เป็นอุปกรณ์ส่งสัญญาณเสียงซึ่งอาจเป็น อุปกรณ์ เชิงกลเครื่องกลไฟฟ้าหรือเพียโซอิเล็กทริก
|
||||
(เรียกสั้น ๆ ว่าเพียโซ) การใช้งานทั่วไปของบัซเซอร์และบี๊บเปอร์
|
||||
ได้แก่อุปกรณ์แจ้งเตือนตัวตั้งเวลาวงจรและการยืนยันการป้อนข้อมูลของผู้ใช้ เช่น
|
||||
การคลิกเมาส์หรือการกดแป้นพิมพ์
|
||||
|
||||
+208
-196
@@ -3,12 +3,12 @@
|
||||
|
||||
= ภาษาซี (C Programming Language) <cprogramming>
|
||||
|
||||
#i ภาษาซีเป็นภาษาโปรแกรมสำหรับวัตถุประสงค์ทั่วไปสร้างขึ้นในช่วงทศวรรษ 1970
|
||||
#h(2.25em) ภาษาซีเป็นภาษาโปรแกรมสำหรับวัตถุประสงค์ทั่วไปสร้างขึ้นในช่วงทศวรรษ 1970
|
||||
โดยเดนนิสริตชีและยังคงได้รับความนิยมและใช้งานอย่างกว้างขวางด้วยการออกแบบภาษาซีทำให้โปรแกรมเมอร์สามารถเข้าถึงคุณลักษณะต่างๆของสถาปัตยกรรมซีพียูทั่วไปได้โดยตรง
|
||||
ซึ่งปรับแต่งให้เหมาะกับชุดคำสั่ง เป้าหมาย ภาษาซี
|
||||
ถูกนำมาใช้และยังคงนำมาใช้ในการพัฒนาระบบปฏิบัติการไดรเวอร์อุปกรณ์และสแต็กโปรโตคอลแต่การใช้งานในซอฟต์แวร์แอปพลิเคชั่นกำลังลดลงภาษาซีถูกนำมาใช้ในคอมพิวเตอร์ตั้งแต่ซูเปอร์คอมพิวเตอร์ขนาดใหญ่ที่สุดไปจนถึงไมโครคอนโทรลเลอร์ขนาดเล็กที่สุดและระบบฝังตัว
|
||||
|
||||
#i
|
||||
#h(2.25em)
|
||||
ภาษาซีเป็นภาษาเชิงกระบวนการที่จำเป็นรองรับการเขียนโปรแกรมแบบมีโครงสร้างขอบเขตตัวแปรเชิงศัพท์และการเรียกซ้ำด้วยระบบชนิดข้อมูลแบบคงที่ภาษาซีถูกออกแบบมาเพื่อการคอมไพล์เพื่อให้สามารถเข้าถึงหน่วยความจำ
|
||||
และโครงสร้างภาษา ในระดับต่ำซึ่งแมปกับคำสั่งเครื่องได้อย่างมีประสิทธิภาพ โดยทั้งหมดนี้รองรับรันไทม์ขั้นต่ำ
|
||||
แม้จะมีความสามารถในระดับต่ำ แต่ภาษาซีก็ถูกออกแบบมาเพื่อสนับสนุนการเขียนโปรแกรมข้ามแพลตฟอร์ม
|
||||
@@ -16,26 +16,27 @@
|
||||
ที่สอดคล้องกับมาตรฐานที่เขียนขึ้นโดยคำนึงถึงความสามารถในการพกพาสามารถคอมไพล์สำหรับแพลตฟอร์มคอมพิวเตอร์และระบบปฏิบัติการที่หลากหลาย
|
||||
โดยมีการเปลี่ยนแปลงซอร์สโคดเพียงเล็กน้อย
|
||||
|
||||
#i แม้ว่าทั้งภาษาซีและไลบรารีมาตรฐานของภาษา ซีจะไม่ได้มีคุณสมบัติยอดนิยมบางอย่างที่พบในภาษาอื่น
|
||||
แต่ก็มีความยืดหยุ่นเพียงพอที่จะรองรับคุณสมบัติเหล่านั้นได้
|
||||
#h(2.25em) แม้ว่าทั้งภาษาซีและไลบรารีมาตรฐานของภาษา
|
||||
ซีจะไม่ได้มีคุณสมบัติยอดนิยมบางอย่างที่พบในภาษาอื่น แต่ก็มีความยืดหยุ่นเพียงพอที่จะรองรับคุณสมบัติเหล่านั้นได้
|
||||
ตัวอย่างเช่นการวางแนววัตถุและการเก็บขยะนั้นจัดทำโดยไลบรารีภายนอก GLib Object System และ
|
||||
Boehm garbage collector ตามลำดับ
|
||||
|
||||
#i ตั้งแต่ปี 2000 เป็นต้นมาภาษาซี ได้รับการจัดอันดับอย่างต่อเนื่องให้อยู่ในอันดับสี่ภาษาสูงสุดในดัชนี TIOBE
|
||||
#h(2.25em) ตั้งแต่ปี 2000 เป็นต้นมาภาษาซี
|
||||
ได้รับการจัดอันดับอย่างต่อเนื่องให้อยู่ในอันดับสี่ภาษาสูงสุดในดัชนี TIOBE
|
||||
ซึ่งเป็นการวัดความนิยมของภาษาการเขียนโปรแกรม
|
||||
|
||||
== ประวัติ
|
||||
|
||||
=== การพัฒนาช่วงแรก
|
||||
|
||||
#h(9.75em) ที่มาของภาษา C มีความเชื่อมโยงอย่างใกล้ชิดกับการพัฒนาระบบปฏิบัติการ#jb Unix
|
||||
#h(8.85em) ที่มาของภาษา C มีความเชื่อมโยงอย่างใกล้ชิดกับการพัฒนาระบบปฏิบัติการ#jb Unix
|
||||
ซึ่งเดิมทีเขียนด้วยภาษาแอสเซมบลีบน PDP-7 โดย Dennis Ritchie และ Ken Thompson
|
||||
โดยนำแนวคิดหลายอย่างจากเพื่อนร่วมงานมาใช้ ในที่สุดพวกเขาก็ตัดสินใจย้ายระบบปฏิบัติการไปยัง PDP-11
|
||||
เวอร์ชัน Unix ดั้งเดิมบน PDP-11 ก็ได้รับการพัฒนาด้วยภาษาแอสเซมบลีเช่นกัน
|
||||
|
||||
=== ภาษา B
|
||||
|
||||
#h(13.5em) ทอมป์สันต้องการภาษาโปรแกรมสำหรับการพัฒนายูทิลิตี้สำหรับแพลตฟอร์มใหม่
|
||||
#h(8.85em) ทอมป์สันต้องการภาษาโปรแกรมสำหรับการพัฒนายูทิลิตี้สำหรับแพลตฟอร์มใหม่
|
||||
เขาพยายามเขียนคอมไพเลอร์ Fortran ก่อน
|
||||
แต่ในไม่ช้าเขาก็ล้มเลิกความคิดนั้นและสร้างเวอร์ชันย่อของภาษาโปรแกรมระบบ ที่พัฒนาขึ้นใหม่ชื่อ BCPL แทน
|
||||
คำอธิบายอย่างเป็นทางการของ BCPL ยังไม่พร้อมใช้งานในขณะนั้นและทอมป์สันได้แก้ไขไวยากรณ์ให้
|
||||
@@ -47,7 +48,7 @@ Boehm garbage collector ตามลำดับ
|
||||
|
||||
=== ภาษา B ใหม่และ C รุ่นแรก
|
||||
|
||||
#h(13.5em) ในปี พ.ศ. 2514 ริชชีเริ่มปรับปรุง B เพื่อใช้คุณสมบัติของ PDP-11 ที่ทรงพลังยิ่งขึ้น
|
||||
#h(8.85em) ในปี พ.ศ. 2514 ริชชีเริ่มปรับปรุง B เพื่อใช้คุณสมบัติของ PDP-11 ที่ทรงพลังยิ่งขึ้น
|
||||
การเพิ่มเติมที่สำคัญคือประเภทข้อมูลอักขระ เขาเรียกสิ่งนี้ว่า New B (NB) ทอมป์สันเริ่มใช้ NB เพื่อเขียน
|
||||
เคอร์เนล Unix และข้อกำหนดของเขากำหนดทิศทางการพัฒนาภาษา
|
||||
|
||||
@@ -57,87 +58,91 @@ char และได้มีการเพิ่มพอยเตอร์
|
||||
อาร์เรย์ภายในนิพจน์ได้รับการปฏิบัติเสมือนเป็นพอยเตอร์ มีการเขียนคอมไพเลอร์ใหม่ และเปลี่ยนชื่อภาษาเป็น
|
||||
C
|
||||
|
||||
คอมไพเลอร์ C และยูทิลิตี้บางส่วนที่สร้างขึ้นด้วยคอมไพเลอร์นี้ถูกรวมอยู่ใน Unix เวอร์ชัน 2
|
||||
#h(8.85em) คอมไพเลอร์ C และยูทิลิตี้บางส่วนที่สร้างขึ้นด้วยคอมไพเลอร์นี้ถูกรวมอยู่ใน Unix เวอร์ชัน 2
|
||||
ซึ่งเรียกอีกอย่างว่า Research Unix
|
||||
|
||||
=== โครงสร้างและการเขียน Unix kernel ใหม่
|
||||
|
||||
#h(13.5em) ใน Unix เวอร์ชัน 4 ซึ่งวางจำหน่ายในเดือนพฤศจิกายน พ.ศ. 2516 เคอร์เนล ของ Unix
|
||||
#h(8.85em) ใน Unix เวอร์ชัน 4 ซึ่งวางจำหน่ายในเดือนพฤศจิกายน พ.ศ. 2516 เคอร์เนลของ Unix
|
||||
ได้รับการเขียนใหม่อย่างกว้างขวางด้วยภาษา C ในเวลานั้น ภาษา C
|
||||
ได้รับคุณสมบัติที่ทรงพลังบางอย่างเช่นประเภท struct
|
||||
|
||||
ตัวประมวลผลล่วงหน้าได้รับการแนะนำประมาณปี 1973 ตามคำแนะนำของ Alan Snyder
|
||||
#h(8.85em) ตัวประมวลผลล่วงหน้าได้รับการแนะนำประมาณปี 1973 ตามคำแนะนำของ Alan Snyder
|
||||
และยังเป็นการยอมรับถึงประโยชน์ของกลไกการรวมไฟล์ที่มีอยู่ใน BCPL และPL/I
|
||||
เวอร์ชันดั้งเดิมให้เฉพาะไฟล์ที่รวมไว้และการแทนที่สตริงแบบง่ายเท่านั้น `#include` รวม `#define`
|
||||
ถึงมาโครที่ไม่มีพารามิเตอร์ หลังจากนั้นไม่นาน ก็มีการขยายเพิ่มเติม โดยส่วนใหญ่โดย Mike Lesk
|
||||
และต่อมาโดย John Reiser เพื่อรวมมาโครที่มีอาร์กิวเมนต์และการคอมไพล์แบบมีเงื่อนไข
|
||||
|
||||
Unix เป็นหนึ่งในเคอร์เนลระบบปฏิบัติการแรกๆ
|
||||
#h(8.85em) Unix เป็นหนึ่งในเคอร์เนลระบบปฏิบัติการแรกๆ
|
||||
ที่เขียนด้วยภาษาอื่นที่ไม่ใช่ภาษาแอสเซมบลีตัวอย่างก่อนหน้านี้ได้แก่ ระบบ Multics (ซึ่งเขียนด้วยภาษา
|
||||
PL/I ) และ Master Control Program (MCP) สำหรับ Burroughs B5000 (ซึ่งเขียนด้วยภาษา
|
||||
ALGOL ) ในปี 1961 ในช่วงปี 1977 Ritchie และ Stephen C. Johnson
|
||||
PL/I) และ Master Control Program (MCP) สำหรับ Burroughs B5000 (ซึ่งเขียนด้วยภาษา
|
||||
ALGOL) ในปี 1961 ในช่วงปี 1977 Ritchie และ Stephen C. Johnson
|
||||
ได้ทำการเปลี่ยนแปลงเพิ่มเติมให้กับภาษาเพื่ออำนวยความสะดวกในการพกพาระบบปฏิบัติการUnix
|
||||
คอมไพเลอร์ Portable C ของ Johnson เป็นพื้นฐานสำหรับการใช้งาน C บนแพลตฟอร์มใหม่ๆ
|
||||
หลายแพลตฟอร์ม
|
||||
|
||||
=== K&R C
|
||||
|
||||
#h(9.75em) ในปี พ.ศ. 2521 Brian KernighanและDennis Ritchie ได้ตีพิมพ์หนังสือ The C
|
||||
#h(8.85em) ในปี พ.ศ. 2521 Brian KernighanและDennis Ritchie ได้ตีพิมพ์หนังสือ The C
|
||||
Programming Language ฉบับพิมพ์ครั้งแรกหนังสือเล่มนี้รู้จักกันในชื่อย่อ K&R
|
||||
ตามชื่อย่อของผู้เขียนและทำหน้าที่เป็นข้อกำหนดที่ไม่เป็นทางการ ของภาษาเป็นเวลาหลายปีเวอร์ชันของภาษา
|
||||
C ที่อธิบายไว้ในหนังสือเล่มนี้มักเรียกกันว่า "K&R C" เนื่องจาก หนังสือเล่มนี้ได้รับการเผยแพร่ในปี พ.ศ.
|
||||
2521 จึงเรียกอีกอย่างว่า C78 หนังสือฉบับพิมพ์ครั้งที่สองครอบคลุมมาตรฐาน ANSI C ในภายหลัง
|
||||
ซึ่งจะกล่าวถึงต่อไป
|
||||
|
||||
K&R ได้เพิ่มฟีเจอร์ด้านภาษาหลายอย่าง:
|
||||
#h(8.85em) K&R ได้เพิ่มฟีเจอร์ด้านภาษาหลายอย่าง
|
||||
|
||||
+ ไลบรารีอินพุต/เอาต์พุตมาตรฐาน
|
||||
+ long int ประเภทข้อมูล
|
||||
+ unsigned int ประเภทข้อมูล
|
||||
+ ตัวดำเนินการกำหนดค่าแบบผสมในรูปแบบ =_op_ (เช่น `=-`) ถูกเปลี่ยนเป็นรูปแบบ _op_= (นั่นคือ
|
||||
`-=`)#jb เพื่อขจัดความกำกวมทางความหมายที่เกิดจากโครงสร้างเช่น `i=-10` ซึ่งถูกตีความว่า
|
||||
`i =- 10` (ลด `i` ลง 10) แทนที่จะเป็นความหมายที่ตั้งใจไว้ (ให้ `i` เป็น -10)
|
||||
#[
|
||||
#set enum(indent: 8.85em)
|
||||
1. ไลบรารีอินพุต/เอาต์พุตมาตรฐาน
|
||||
2. long int ประเภทข้อมูล
|
||||
3. unsigned int ประเภทข้อมูล
|
||||
4. ตัวดำเนินการกำหนดค่าแบบผสมในรูปแบบ =_op_ (เช่น `=-`) ถูกเปลี่ยนเป็นรูปแบบ _op_= (นั่นคือ
|
||||
`-=`) เพื่อขจัดความกำกวมทางความหมายที่เกิดจากโครงสร้างเช่น `i=-10` ซึ่งถูกตีความว่า
|
||||
`i =- 10` (ลด `i` ลง 10) แทนที่จะเป็นความหมายที่ตั้งใจไว้ (ให้ `i` เป็น -10)
|
||||
]
|
||||
|
||||
#h(9.75em) แม้หลังจากมีการเผยแพร่มาตรฐาน ANSI ปี 1989 แล้วก็ตาม เป็นเวลาหลายปีที่ K&R C
|
||||
#h(8.85em) แม้หลังจากมีการเผยแพร่มาตรฐาน ANSI ปี 1989 แล้วก็ตาม เป็นเวลาหลายปีที่ K&R C
|
||||
ยังคงถูกพิจารณาว่าเป็น "ตัวหารร่วมที่ต่ำที่สุด" ที่โปรแกรมเมอร์ภาษา C
|
||||
ยึดถือเมื่อต้องการความสามารถในการพกพาได้สูงสุด
|
||||
เนื่องจากคอมไพเลอร์รุ่นเก่าจำนวนมากยังคงถูกใช้งานอยู่และเนื่องจากโค้ด K&R C
|
||||
ที่เขียนอย่างระมัดระวังก็สามารถเป็นไปตามมาตรฐาน C ได้เช่นกัน
|
||||
|
||||
แม้ว่า C เวอร์ชันต่อมาจะกำหนดให้ฟังก์ชันต้องมีการประกาศประเภทอย่างชัดเจนแต่ C เวอร์ชัน K&R
|
||||
กำหนดให้ฟังก์ชันที่ส่งคืนค่าประเภทอื่นที่ไม่ใช่ประเภท ที่กำหนดไว้เท่านั้น int ที่จะต้องประกาศก่อนใช้งาน
|
||||
ฟังก์ชันที่ใช้โดยไม่มีการประกาศล่วงหน้าจะถือว่าส่งคืนค่าประเภทที่กำหนด int ไว้
|
||||
#h(8.85em) แม้ว่า C เวอร์ชันต่อมาจะกำหนดให้ฟังก์ชันต้องมีการประกาศประเภทอย่างชัดเจนแต่ C
|
||||
เวอร์ชัน K&R กำหนดให้ฟังก์ชันที่ส่งคืนค่าประเภทอื่นที่ไม่ใช่ประเภท ที่กำหนดไว้เท่านั้น int
|
||||
ที่จะต้องประกาศก่อนใช้งาน ฟังก์ชันที่ใช้โดยไม่มีการประกาศล่วงหน้าจะถือว่าส่งคืนค่าประเภทที่กำหนด int
|
||||
ไว้
|
||||
|
||||
=== ANSI C และ ISO C
|
||||
|
||||
#h(9.75em) ในช่วงปลายทศวรรษ 1970 และ 1980 ภาษา C เวอร์ชันต่างๆ ถูกนำไปใช้งานใน
|
||||
#h(8.85em) ในช่วงปลายทศวรรษ 1970 และ 1980 ภาษา C เวอร์ชันต่างๆ ถูกนำไปใช้งานใน
|
||||
คอมพิวเตอร์เมนเฟรมมินิคอมพิวเตอร์และไมโครคอมพิวเตอร์หลากหลายรุ่นรวมถึง IBM PC ด้วย
|
||||
เนื่องจากความนิยมของคอมพิวเตอร์ประเภทนี้เพิ่มขึ้นอย่างมาก
|
||||
|
||||
#h(9.75em) ในปี 1983 สถาบันมาตรฐานแห่งชาติอเมริกัน (ANSI) ได้จัดตั้งคณะกรรมการ#jb X3J11
|
||||
#h(8.85em) ในปี 1983 สถาบันมาตรฐานแห่งชาติอเมริกัน (ANSI) ได้จัดตั้งคณะกรรมการ#jb X3J11
|
||||
เพื่อกำหนดมาตรฐานของภาษา C X3J11 ใช้มาตรฐาน C ที่อิงตามการใช้งานบนระบบ Unix เป็นพื้นฐาน
|
||||
อย่างไรก็ตามส่วนที่ไม่สามารถพกพาได้ของไลบรารี C บน Unix ได้ถูกส่งต่อไปยังกลุ่มทำงาน IEEE 1003
|
||||
เพื่อใช้เป็นพื้นฐานสำหรับ มาตรฐาน POSIX ในปี 1988 ในปี 1989 มาตรฐาน C ได้รับการรับรองเป็น
|
||||
ANSI X3.159-1989 "ภาษาโปรแกรม C" เวอร์ชันนี้ของภาษามักถูกเรียกว่า ANSI C, Standard C
|
||||
หรือบางครั้งเรียกว่า C89
|
||||
|
||||
#h(9.75em) ในปี 1990 มาตรฐาน ANSI C (พร้อมการเปลี่ยนแปลงรูปแบบ)
|
||||
#h(8.85em) ในปี 1990 มาตรฐาน ANSI C (พร้อมการเปลี่ยนแปลงรูปแบบ)
|
||||
ได้รับการรับรองโดยองค์การมาตรฐานสากล (ISO) ในชื่อ ISO/IEC 9899:1990 ซึ่งบางครั้งเรียกว่า C90
|
||||
ดังนั้น คำว่า "C89" และ "C90" จึงหมายถึงภาษาโปรแกรมเดียวกัน
|
||||
|
||||
#h(9.75em) เช่นเดียวกับองค์กรมาตรฐานแห่งชาติอื่นๆ ANSI ไม่ได้พัฒนามาตรฐาน C ด้วยตนเองอีกต่อไป
|
||||
#h(8.85em) เช่นเดียวกับองค์กรมาตรฐานแห่งชาติอื่นๆ ANSI ไม่ได้พัฒนามาตรฐาน C ด้วยตนเองอีกต่อไป
|
||||
แต่จะอ้างอิงถึงมาตรฐาน C สากล ซึ่งดูแลโดยคณะทำงาน ISO/IEC JTC1/SC22 /WG14
|
||||
การนำมาตรฐานสากลฉบับปรับปรุงมาใช้ในระดับประเทศมักเกิดขึ้นภายในหนึ่งปีหลังจากที่ ISO
|
||||
เผยแพร่มาตรฐานดังกล่าว
|
||||
|
||||
#h(9.75em) หนึ่งในเป้าหมายของกระบวนการกำหนดมาตรฐานภาษา C คือการสร้างซูเปอร์เซ็ตของ K&R C
|
||||
#h(8.85em) หนึ่งในเป้าหมายของกระบวนการกำหนดมาตรฐานภาษา C คือการสร้างซูเปอร์เซ็ตของ K&R C
|
||||
โดยรวมเอาคุณสมบัติที่ไม่เป็นทางการหลายอย่างที่ถูกนำมาใช้ในภายหลัง
|
||||
คณะกรรมการมาตรฐานยังได้เพิ่มคุณสมบัติเพิ่มเติมอีกหลายอย่างเช่นต้นแบบฟังก์ชัน (ยืมมาจาก C++),
|
||||
voidพอยเตอร์, การรองรับชุดอักขระและภาษาท้องถิ่นระหว่างประเทศ และการปรับปรุงพรีโปรเซสเซอร์
|
||||
แม้ว่าไวยากรณ์สำหรับการประกาศพารามิเตอร์จะได้รับการปรับปรุงให้รวมรูปแบบที่ใช้ใน C++
|
||||
แต่ก็ยังคงอนุญาตให้ใช้อินเทอร์เฟซ K&R เพื่อความเข้ากันได้กับซอร์สโค้ดที่มีอยู่
|
||||
|
||||
#h(9.75em) C89 ได้รับการสนับสนุนจากคอมไพเลอร์ C ในปัจจุบัน และโค้ด C สมัยใหม่ส่วนใหญ่ก็ใช้ C89
|
||||
#h(8.85em) C89 ได้รับการสนับสนุนจากคอมไพเลอร์ C ในปัจจุบัน และโค้ด C สมัยใหม่ส่วนใหญ่ก็ใช้ C89
|
||||
เป็นพื้นฐานโปรแกรมใดๆ ที่เขียนด้วยภาษา C มาตรฐานเท่านั้น และไม่มีข้อสมมติฐานใดๆ ที่ขึ้นอยู่กับฮาร์ดแวร์
|
||||
จะทำงานได้อย่างถูกต้องบนแพลตฟอร์มใดๆ ที่มีการใช้งาน C ที่สอดคล้องกับมาตรฐาน
|
||||
ภายในขีดจำกัดของทรัพยากร หากไม่ระมัดระวัง
|
||||
@@ -145,48 +150,48 @@ voidพอยเตอร์, การรองรับชุดอักข
|
||||
ตัวอย่างเช่น เนื่องจากการใช้ไลบรารีที่ไม่เป็นมาตรฐาน เช่น ไลบรารี GUI
|
||||
หรือการพึ่งพาคุณลักษณะเฉพาะของคอมไพเลอร์หรือแพลตฟอร์ม เช่น ขนาดที่แน่นอนของชนิดข้อมูลและลำดับไบต์
|
||||
|
||||
#h(9.75em)
|
||||
#h(8.85em)
|
||||
ในกรณีที่โค้ดต้องสามารถคอมไพล์ได้ทั้งโดยคอมไพเลอร์ที่สอดคล้องกับมาตรฐานหรือคอมไพเลอร์ที่ใช้ C แบบ
|
||||
K&R นั้น `__STDC__` สามารถใช้มาโครเพื่อแบ่งโค้ดออกเป็นส่วนมาตรฐานและส่วน K&R
|
||||
เพื่อป้องกันการใช้คุณสมบัติที่มีเฉพาะใน C มาตรฐานบนคอมไพเลอร์ที่ใช้ C แบบ K&R
|
||||
|
||||
#h(9.75em) หลังจากกระบวนการกำหนดมาตรฐาน ANSI/ISO ข้อกำหนดภาษา C
|
||||
#h(8.85em) หลังจากกระบวนการกำหนดมาตรฐาน ANSI/ISO ข้อกำหนดภาษา C
|
||||
ยังคงค่อนข้างคงที่เป็นเวลาหลายปี ในปี 1995 มีการเผยแพร่การแก้ไขมาตรฐานฉบับที่ 1 ของมาตรฐาน C ปี
|
||||
1990 (ISO/IEC 9899/AMD1:1995 ซึ่งเรียกกันอย่างไม่เป็นทางการว่า C95)
|
||||
เพื่อแก้ไขรายละเอียดบางประการและเพิ่มการสนับสนุนชุดอักขระสากลที่ครอบคลุมมากขึ้น
|
||||
|
||||
=== C99
|
||||
|
||||
#h(9.75em) มาตรฐาน C ได้รับการแก้ไขเพิ่มเติมในช่วงปลายทศวรรษ 1990 ส่งผลให้มีการตีพิมพ์
|
||||
#h(8.85em) มาตรฐาน C ได้รับการแก้ไขเพิ่มเติมในช่วงปลายทศวรรษ 1990 ส่งผลให้มีการตีพิมพ์
|
||||
ISO/IEC 9899:1999 ในปี 1999 ซึ่งโดยทั่วไปเรียกว่า "C99" ต่อมาได้มีการแก้ไขเพิ่มเติมอีกสามครั้งโดย
|
||||
Technical Corrigenda
|
||||
|
||||
#h(9.75em) C99 ได้นำเสนอคุณสมบัติใหม่หลายประการรวมถึงฟังก์ชันอินไลน์ชนิดข้อมูลใหม่หลายชนิด(รวมถึง
|
||||
#h(8.85em) C99 ได้นำเสนอคุณสมบัติใหม่หลายประการรวมถึงฟังก์ชันอินไลน์ชนิดข้อมูลใหม่หลายชนิด(รวมถึง
|
||||
long long intชนิด ข้อมูล complex ที่ใช้แทนจำนวนเชิงซ้อน)
|
||||
อาร์เรย์ที่มีความยาวแปรผันได้และสมาชิกอาร์เรย์ที่ยืดหยุ่นการสนับสนุนที่ดีขึ้นสำหรับเลขทศลอย IEEE 754
|
||||
การสนับสนุนมาโครแบบแปรผัน (มาโครที่มีจำนวนอาร์กิวเมนต์ แปรผันได้)
|
||||
และการสนับสนุนความคิดเห็นแบบบรรทัดเดียวที่ขึ้นต้นด้วย `@` `//` เช่นเดียวกับใน BCPL หรือ C++
|
||||
คุณสมบัติเหล่านี้หลายอย่างได้ถูกนำไปใช้เป็นส่วนขยายในคอมไพเลอร์ C หลายตัวแล้ว
|
||||
|
||||
#h(9.75em) โดยส่วนใหญ่แล้ว C99 สามารถใช้งานร่วมกับ C90 ได้ แต่มีความเข้มงวดมากกว่าในบางด้าน
|
||||
#h(8.85em) โดยส่วนใหญ่แล้ว C99 สามารถใช้งานร่วมกับ C90 ได้ แต่มีความเข้มงวดมากกว่าในบางด้าน
|
||||
โดยเฉพาะอย่างยิ่ง การประกาศที่ไม่มีตัวระบุประเภทจะไม่ถือว่ามีintการกำหนดโดยปริยายอีกต่อไป
|
||||
มีการกำหนดมาโครมาตรฐาน `__STDC_VERSION__` พร้อมค่า `199901L` เพื่อระบุว่ามีการสนับสนุน C99
|
||||
คอม ไพเลอร์ C อื่นๆ เช่น GCC, Solaris Studio และคอมไพเลอร์ C อื่นๆ
|
||||
ในปัจจุบันรองรับคุณสมบัติใหม่หลายอย่างหรือทั้งหมดของ C99 อย่างไรก็ตาม คอมไพเลอร์ C ใน Microsoft
|
||||
Visual C++ ใช้มาตรฐาน C89 และส่วนต่างๆ ของ C99 ที่จำเป็นสำหรับการใช้งานร่วมกับ C++11
|
||||
|
||||
#h(9.75em) นอกจากนี้ มาตรฐาน C99 ยังกำหนดให้รองรับตัวระบุที่ใช้ Unicode
|
||||
#h(8.85em) นอกจากนี้ มาตรฐาน C99 ยังกำหนดให้รองรับตัวระบุที่ใช้ Unicode
|
||||
ในรูปแบบของอักขระพิเศษ (เช่น `\u0040` หรือ `\U0001f431`) และแนะนำให้รองรับชื่อ Unicode
|
||||
ดิบด้วย
|
||||
|
||||
=== C11
|
||||
|
||||
#h(9.75em) งานปรับปรุงมาตรฐาน C ฉบับใหม่เริ่มขึ้นในปี 2550 โดยเรียกกันอย่างไม่เป็นทางการว่า
|
||||
#h(8.85em) งานปรับปรุงมาตรฐาน C ฉบับใหม่เริ่มขึ้นในปี 2550 โดยเรียกกันอย่างไม่เป็นทางการว่า
|
||||
"C1X" จนกระทั่งมีการประกาศใช้มาตรฐาน ISO/IEC 9899:2011 อย่างเป็นทางการในวันที่ 8 ธันวาคม
|
||||
2554 คณะกรรมการมาตรฐาน C ได้กำหนดแนวทางเพื่อจำกัดการนำคุณสมบัติใหม่ๆ
|
||||
ที่ยังไม่ได้รับการทดสอบโดยระบบที่มีอยู่มาใช้
|
||||
|
||||
#h(9.75em) มาตรฐาน C11 เพิ่มคุณสมบัติใหม่มากมายให้กับภาษา C และไลบรารี
|
||||
#h(8.85em) มาตรฐาน C11 เพิ่มคุณสมบัติใหม่มากมายให้กับภาษา C และไลบรารี
|
||||
รวมถึงมาโครแบบเจเนริกชนิดโครงสร้างนิรนามการสนับสนุน Unicode ที่ดีขึ้น
|
||||
การดำเนินการอะตอมิกการทำงานแบบมัลติเธรดและฟังก์ชันตรวจสอบขอบเขต
|
||||
นอกจากนี้ยังทำให้บางส่วนของไลบรารี C99 ที่มีอยู่เป็นตัวเลือก และปรับปรุงความเข้ากันได้กับ C++
|
||||
@@ -194,7 +199,7 @@ Visual C++ ใช้มาตรฐาน C89 และส่วนต่าง
|
||||
|
||||
=== C17
|
||||
|
||||
#h(9.75em) C17 เป็นชื่อเรียกอย่างไม่เป็นทางการของ ISO/IEC 9899:2018
|
||||
#h(8.85em) C17 เป็นชื่อเรียกอย่างไม่เป็นทางการของ ISO/IEC 9899:2018
|
||||
ซึ่งเป็นมาตรฐานสำหรับภาษาโปรแกรม C ที่เผยแพร่ในเดือนมิถุนายน 2018
|
||||
มาตรฐานนี้ไม่ได้เพิ่มคุณสมบัติใหม่ใดๆ ให้กับภาษา แต่เป็นการแก้ไขทางเทคนิคและการชี้แจงข้อบกพร่องใน
|
||||
C11 เท่านั้น มาโครมาตรฐาน `__STDC_VERSION__` ถูกกำหนดขึ้นเพื่อ `201710L` ระบุว่ามีการรองรับ
|
||||
@@ -202,7 +207,7 @@ C17 แล้ว
|
||||
|
||||
=== C23
|
||||
|
||||
#h(9.75em) C23 เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C หลักในปัจจุบัน
|
||||
#h(9.4em) C23 เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C หลักในปัจจุบัน
|
||||
ซึ่งในระหว่างการพัฒนาส่วนใหญ่เรียกว่า "C2X" โดยสร้างขึ้นจากเวอร์ชันก่อนหน้า และแนะนำคุณสมบัติใหม่
|
||||
เช่น คำหลักใหม่ ความหมายเพิ่มเติมสำหรับเพื่อ `auto`
|
||||
ให้มีการอนุมานประเภทเมื่อประกาศตัวแปรประเภทใหม่รวมถึง `nullptr_t` และ `_BitInt` (N)
|
||||
@@ -213,26 +218,26 @@ C23 ได้รับการเผยแพร่ในเดือนตุ
|
||||
|
||||
=== C2Y
|
||||
|
||||
#h(9.75em) C2Y เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C ครั้งใหญ่ถัดไป หลังจาก
|
||||
#h(9.4em) C2Y เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C ครั้งใหญ่ถัดไป หลังจาก
|
||||
C23 (C2X) ซึ่งคาดว่าจะออกในช่วงปลายทศวรรษ 2020 ดังนั้นจึงมีเลข '2' ใน "C2Y" ร่างฉบับแรกของ
|
||||
C2Y ได้รับการเผยแพร่ในเดือนกุมภาพันธ์ 2024 ในชื่อ N3220 โดยกลุ่มทำงาน ISO/IEC JTC1/SC22
|
||||
/WG14
|
||||
|
||||
=== Embedded C
|
||||
|
||||
#h(9.75em) ในอดีตการเขียนโปรแกรม C
|
||||
#h(9.4em) ในอดีตการเขียนโปรแกรม C
|
||||
สำหรับระบบฝังตัวจำเป็นต้องใช้ส่วนขยายที่ไม่เป็นมาตรฐานของภาษา C เพื่อรองรับคุณสมบัติพิเศษ
|
||||
เช่นการคำนวณเลขทศนิยมคงที่
|
||||
ธนาคารหน่วยความจำหลายชุดที่แตกต่างกันและการดำเนินการอินพุต/เอาต์พุตพื้นฐาน
|
||||
|
||||
#h(9.75em) ในปี 2551 คณะกรรมการมาตรฐาน C ได้เผยแพร่รายงานทางเทคนิคที่ขยายภาษา C
|
||||
#h(9.4em) ในปี 2551 คณะกรรมการมาตรฐาน C ได้เผยแพร่รายงานทางเทคนิคที่ขยายภาษา C
|
||||
เพื่อแก้ไขปัญหาเหล่านี้โดยการจัดหามาตรฐานทั่วไปสำหรับการใช้งานทั้งหมดให้ปฏิบัติตาม
|
||||
ซึ่งรวมถึงคุณสมบัติหลายอย่างที่ไม่มีในภาษา C ปกติ เช่น การคำนวณเลขทศนิยมคงที่
|
||||
พื้นที่แอดเดรสแบบมีชื่อและการกำหนดแอดเดรสฮาร์ดแวร์ I/O พื้นฐาน
|
||||
|
||||
== ตัวแปร (Variables)
|
||||
|
||||
#i ตัวแปรในภาษา C เบื้องต้นแล้วประกอบไปด้วยประเภทของข้อมูลและชื่อตัวแปร
|
||||
#h(5.05em) ตัวแปรในภาษา C เบื้องต้นแล้วประกอบไปด้วยประเภทของข้อมูลและชื่อตัวแปร
|
||||
โดยที่ชื่อตัวแปรนั้นสามารถเป็นรายการที่ถูกแบ่งด้วยเครื่องหมายจุลภาคได้ด้วยเช่นกัน ตัวอย่างคือ
|
||||
|
||||
#afigure(
|
||||
@@ -246,51 +251,63 @@ C2Y ได้รับการเผยแพร่ในเดือนกุ
|
||||
|
||||
== ประเภทข้อมูล (Data Types)
|
||||
|
||||
#h(6em) ข้อมูลที่เกี่ยวข้องกับตัวเลขมักมีประเภท unsigned และ signed โดยความแตกต่างหากอธิบายสั้น
|
||||
ๆ คือ
|
||||
#h(5.05em) ข้อมูลที่เกี่ยวข้องกับตัวเลขมักมีประเภท unsigned และ signed
|
||||
โดยความแตกต่างหากอธิบายสั้น ๆ คือ
|
||||
|
||||
#[
|
||||
#set enum(indent: 6em)
|
||||
+ Signed (มีเครื่องหมาย): ตัวเลขที่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ -128 ถึง 127
|
||||
+ Unsigned (ไม่มีเครื่องหมาย): ตัวเลขที่ไม่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ 0 ถึง 255
|
||||
#set enum(indent: 5.05em)
|
||||
1. Signed (มีเครื่องหมาย): ตัวเลขที่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ -128 ถึง#jb 127
|
||||
2. Unsigned (ไม่มีเครื่องหมาย): ตัวเลขที่ไม่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ 0 ถึง 255
|
||||
]
|
||||
|
||||
#h(6em) จะสังเกตได้ว่า ข้อมูลประเภท unsigned นั้นสามารถเก็บตัวเลขบวกได้จำนวนมากกว่า คือสูงสุดที่
|
||||
255 แต่หากนำค่าสัมบูรณ์ (absolute value) ของระยะข้อมูลแบบ signed มาบวกกัน เช่น\
|
||||
#h(5.05em) จะสังเกตได้ว่า ข้อมูลประเภท unsigned นั้นสามารถเก็บตัวเลขบวกได้จำนวนมากกว่า
|
||||
คือสูงสุดที่ 255 แต่หากนำค่าสัมบูรณ์ (absolute value) ของระยะข้อมูลแบบ signed มาบวกกัน เช่น\
|
||||
#math.equation($|-128| + |127|$, alt: "ค่าสัมบูรณ์ของ -128 บวกค่าสัมบูรณ์ของ 127")
|
||||
จะพบว่าได้ค่า 255 หมายความว่า จริง ๆ แล้วข้อมูลประเภท signed สามารถเก็บข้อมูลได้ 255
|
||||
ตัวเลขเช่นกัน เพียงแต่ว่าครึ่งหนึ่งของตัวเลขที่สามารถเก็บได้เป็นตัวเลขติดลบ
|
||||
|
||||
#h(6em) ดังนั้นโปรดจำไว้ว่า เลขคณิตจำนวนเต็มมีนิยามแตกต่างกันสำหรับชนิดจำนวนเต็มแบบ signed และ
|
||||
unsigned โปรดดูตัวดำเนินการเลขคณิต โดยเฉพาะอย่างยิ่งการโอเวอร์โฟลว์จำนวนเต็ม
|
||||
#h(5.05em) ดังนั้นโปรดจำไว้ว่า เลขคณิตจำนวนเต็มมีนิยามแตกต่างกันสำหรับชนิดจำนวนเต็มแบบ signed
|
||||
และ unsigned โปรดดูตัวดำเนินการเลขคณิต โดยเฉพาะอย่างยิ่งการโอเวอร์โฟลว์จำนวนเต็ม
|
||||
|
||||
=== ประเภทบูลีน (Boolean)
|
||||
|
||||
ประเภทบูลีนนั้นถูกนำเสนอครั้งแรกในมาตรฐาน C99 โดยการกล่าวถึงประเภทข้อมูลบูลีนนั้น ในประวัติของภาษา C แล้วมีสองแบบ
|
||||
#h(8.85em) ประเภทบูลีนนั้นถูกนำเสนอครั้งแรกในมาตรฐาน C99 โดยการกล่าวถึงประเภทข้อมูลบูลีนนั้น
|
||||
ในประวัติของภาษา C แล้วมีสองแบบ
|
||||
|
||||
#set enum(indent: 8.85em)
|
||||
|
||||
+ `_Bool` (และมีมาโคร `bool`): จนถึงมาตรฐาน C23
|
||||
+ `bool` (ที่ไม่ใช่แค่มาโคร): มีตั้งแต่มาตรฐาน C23
|
||||
|
||||
=== ประเภทจำนวนเต็ม (Integer)
|
||||
|
||||
+ `short int` (หรืออีกชื่อหนึ่งคือ `short` และสามารถใช้คีย์เวิร์ด `signed` ได้)
|
||||
+ `unsigned short int` (หรือ `unsigned short`)
|
||||
+ `int` (หรือ `signed int`) \
|
||||
1. `short int` (หรืออีกชื่อหนึ่งคือ `short` และสามารถใช้คีย์เวิร์ด `signed` ได้)
|
||||
2. `unsigned short int` (หรือ `unsigned short`)
|
||||
3. `int` (หรือ `signed int`) \
|
||||
คือประเภทข้อมูลตัวเลขที่ปกติที่สุด และจะถูกการันตีว่าจะมีขนาดขั้นต่ำ 16 บิตเสมอ
|
||||
โดยระบบทั่วไปส่วนใหญ่ในปัจจุบันจะเป็น 32 บิต
|
||||
+ `unsigned int` (หรือเพียงแค่ `unsigned`): คือประเภท `int` ในแบบ `unsigned`, มี
|
||||
4. `unsigned int` (หรือเพียงแค่ `unsigned`) คือประเภท `int` ในแบบ `unsigned`, มี
|
||||
modulo arithmetic, และเหมาะสมสำหรับการเปลี่ยนแปลงบิต
|
||||
+ `long int` (หรือ `long`)
|
||||
+ `unsigned long int` (หรือ `unsigned long`)
|
||||
+ มีเพิ่มตั้งแต่ C99:
|
||||
+ `long long int` (หรือ `long long`)
|
||||
+ `unsigned long long int` (หรือ `unsigned long long`)
|
||||
+ มีเพิ่มตั้งแต่ C23:
|
||||
+ `_BitInt(n)` (หรือ `signed _BitInt(n)`): ประเภทข้อมูล signed แบบมีขนาดชัดเจน โดย
|
||||
n แทนด้วยจำนวนบิต (รวมถึงบิตเครื่องหมาย และ n จะต้องไม่มากกว่า `BITINT_MAXWIDTH`
|
||||
จากไฟล์ `<limits.h>`)
|
||||
+ `unsigned _BitInt(n)`: เหมือนข้างต้น เพียงแค่เป็นประเภท unsigned
|
||||
(และไม่มีบิตเครื่องหมาย)
|
||||
5. `long int` (หรือ `long`)
|
||||
6. `unsigned long int` (หรือ `unsigned long`)
|
||||
7. มีเพิ่มตั้งแต่ C99
|
||||
#listy(
|
||||
indent: 10.20em,
|
||||
numbering: thai-numbering,
|
||||
[`long long int` (หรือ `long long`)],
|
||||
[`unsigned long long int` (หรือ `unsigned long long`)],
|
||||
)
|
||||
#v(0.4em)
|
||||
8. มีเพิ่มตั้งแต่ C23
|
||||
#listy(
|
||||
indent: 10.20em,
|
||||
numbering: thai-numbering,
|
||||
[`_BitInt(n)` (หรือ `signed _BitInt(n)`): ประเภทข้อมูล signed แบบมีขนาดชัดเจน โดย n
|
||||
แทนด้วยจำนวนบิต (รวมถึงบิตเครื่องหมาย และ n จะต้องไม่มากกว่า `BITINT_MAXWIDTH` จากไฟล์
|
||||
`<limits.h>`)],
|
||||
[`unsigned _BitInt(n)`: เหมือนข้างต้น เพียงแค่เป็นประเภท unsigned
|
||||
(และไม่มีบิตเครื่องหมาย)],
|
||||
)
|
||||
|
||||
และเหมือนประเภทข้อมูลอื่น ๆ คุณสามารถเรียงคีย์เวิร์ดแบบใดก็ได้ เช่น `unsigned long long int`
|
||||
และ `long int unsigned long` นั้นเหมือนกัน
|
||||
@@ -316,11 +333,11 @@ unsigned โปรดดูตัวดำเนินการเลขคณ
|
||||
),
|
||||
table.cell(`char`, align: left),
|
||||
`char`,
|
||||
table.cell([อย่างน้อย\ *8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([*8*], rowspan: 3),
|
||||
table.cell([อย่างน้อย\ 8], rowspan: 3),
|
||||
table.cell([8], rowspan: 3),
|
||||
table.cell([8], rowspan: 3),
|
||||
table.cell([8], rowspan: 3),
|
||||
table.cell([8], rowspan: 3),
|
||||
table.cell(`signed char`, align: left),
|
||||
`signed char`,
|
||||
table.cell(`unsigned char`, align: left),
|
||||
@@ -328,44 +345,17 @@ unsigned โปรดดูตัวดำเนินการเลขคณ
|
||||
|
||||
table.cell(`short`, align: left),
|
||||
table.cell(`short int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([*16*], rowspan: 6),
|
||||
table.cell([อย่างน้อย\ 16], rowspan: 6),
|
||||
table.cell([16], rowspan: 6),
|
||||
table.cell([16], rowspan: 6),
|
||||
table.cell([16], rowspan: 6),
|
||||
table.cell([16], rowspan: 6),
|
||||
table.cell(`short int`, align: left),
|
||||
table.cell(`signed short`, align: left),
|
||||
table.cell(`signed short int`, align: left),
|
||||
table.cell(`unsigned short`, align: left),
|
||||
table.cell([`unsigned`\ `short int`], rowspan: 2),
|
||||
table.cell(`unsigned short int`, align: left),
|
||||
|
||||
table.cell(`int`, align: left),
|
||||
table.cell(`int`, rowspan: 3),
|
||||
table.cell([อย่างน้อย\ *16*], rowspan: 5),
|
||||
table.cell([*16*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell([*32*], rowspan: 5),
|
||||
table.cell(`signed`, align: left),
|
||||
table.cell(`signed int`, align: left),
|
||||
table.cell(`unsigned`, align: left),
|
||||
table.cell([`unsigned int`], rowspan: 2),
|
||||
table.cell(`unsigned int`, align: left),
|
||||
|
||||
table.cell(`long`, align: left),
|
||||
table.cell(`long int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*32*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell(`long int`, align: left),
|
||||
table.cell(`signed long`, align: left),
|
||||
table.cell(`signed long int`, align: left),
|
||||
table.cell(`unsigned long`, align: left),
|
||||
table.cell([`unsigned`\ `long int`], rowspan: 2),
|
||||
table.cell(`unsigned long int`, align: left),
|
||||
),
|
||||
caption: [ขนาดของข้อมูลเป็นบิต],
|
||||
)
|
||||
@@ -386,13 +376,40 @@ unsigned โปรดดูตัวดำเนินการเลขคณ
|
||||
[LLP64],
|
||||
[LP64],
|
||||
),
|
||||
table.cell(`int`, align: left),
|
||||
table.cell(`int`, rowspan: 3),
|
||||
table.cell([อย่างน้อย\ 16], rowspan: 5),
|
||||
table.cell([16], rowspan: 5),
|
||||
table.cell([32], rowspan: 5),
|
||||
table.cell([32], rowspan: 5),
|
||||
table.cell([32], rowspan: 5),
|
||||
table.cell(`signed`, align: left),
|
||||
table.cell(`signed int`, align: left),
|
||||
table.cell(`unsigned`, align: left),
|
||||
table.cell([`unsigned int`], rowspan: 2),
|
||||
table.cell(`unsigned int`, align: left),
|
||||
|
||||
table.cell(`long`, align: left),
|
||||
table.cell(`long int`, rowspan: 4),
|
||||
table.cell([อย่างน้อย\ 32], rowspan: 6),
|
||||
table.cell([32], rowspan: 6),
|
||||
table.cell([32], rowspan: 6),
|
||||
table.cell([32], rowspan: 6),
|
||||
table.cell([64], rowspan: 6),
|
||||
table.cell(`long int`, align: left),
|
||||
table.cell(`signed long`, align: left),
|
||||
table.cell(`signed long int`, align: left),
|
||||
table.cell(`unsigned long`, align: left),
|
||||
table.cell([`unsigned`\ `long int`], rowspan: 2),
|
||||
table.cell(`unsigned long int`, align: left),
|
||||
|
||||
table.cell(`long long`, align: left),
|
||||
table.cell([`long long int` (C99)], rowspan: 4),
|
||||
table.cell([อย่างน้อย\ *64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([*64*], rowspan: 6),
|
||||
table.cell([อย่างน้อย\ 64], rowspan: 6),
|
||||
table.cell([64], rowspan: 6),
|
||||
table.cell([64], rowspan: 6),
|
||||
table.cell([64], rowspan: 6),
|
||||
table.cell([64], rowspan: 6),
|
||||
table.cell(`long long int`, align: left),
|
||||
table.cell(`signed long long`, align: left),
|
||||
table.cell(`signed long long int`, align: left),
|
||||
@@ -403,10 +420,9 @@ unsigned โปรดดูตัวดำเนินการเลขคณ
|
||||
caption: [ขนาดของข้อมูลเป็นบิต (ต่อ)],
|
||||
)
|
||||
|
||||
#h(12em) 1) รูปแบบข้อมูล (data model)
|
||||
|
||||
==== รูปแบบข้อมูล (data model)
|
||||
|
||||
#h(13.5em) รูปแบบข้อมูล หรือ data model
|
||||
#h(13.15em) รูปแบบข้อมูล หรือ data model
|
||||
คือรูปแบบการเก็บข้อมูลของโปรแกรมซึ่งเป็นสิ่งที่กำหนดขนาดของตัวแปร
|
||||
โดยรูปแบบข้อมูลนั้นจะถูกกำหนดโดยแพลตฟอร์มเป้าหมาย
|
||||
ซึ่งมีหน่วยประมวลผลและระบบปฏิบัติการเป็นปัจจัยหลัก โดยตามตารางในหัวข้อก่อนหน้า หลัก ๆ
|
||||
@@ -415,115 +431,110 @@ unsigned โปรดดูตัวดำเนินการเลขคณ
|
||||
|
||||
=== ประเภทจำนวนทศนิยมจริง (Real floating types)
|
||||
|
||||
#h(9.75em) ภาษา C นั้นมีประเภทข้อมูลสำหรับแทนตัวเลขทศนิยมจริง 3 (หรือ 6 ตั้งแต่ C23) ประเภท
|
||||
#h(8.85em) ภาษา C นั้นมีประเภทข้อมูลสำหรับแทนตัวเลขทศนิยมจริง 3 (หรือ 6 ตั้งแต่ C23) ประเภท
|
||||
|
||||
+ `float`: จำนวนทศนิยมความแม่นยำเดี่ยว ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary32 หากรองรับ
|
||||
+ `double`: จำนวนทศนิยมความแม่นยำสองเท่า ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary64
|
||||
1. `float` จำนวนทศนิยมความแม่นยำเดี่ยว ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary32 หากรองรับ
|
||||
2. `double` จำนวนทศนิยมความแม่นยำสองเท่า ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary64
|
||||
หากรองรับ
|
||||
+ `long double`: จำนวนทศนิยมความแม่นยำเพิ่มเติม ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary128
|
||||
3. `long double` จำนวนทศนิยมความแม่นยำเพิ่มเติม ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary128
|
||||
หากรองรับ มิฉะนั้นจะตรงกับ IEEE-754 binary64-extended หากรองรับ
|
||||
มิฉะนั้นจะตรงกับรูปแบบจำนวนทศนิยมที่ไม่ตรงกับมาตรฐาน IEEE-754
|
||||
รูปแบบใดก็ได้ตราบใดที่มีความแม่นยำกว่า binary64 และระยะข้อมูลนั้นอย่างน้อยก็ต้องดีเท่า binary64
|
||||
และหากไม่รองรับทั้งหมดนั้น จะตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary64
|
||||
+ รูปแบบ binary128 นั้นถูกใช้โดยระบบ HP-UX, SPARC, MIPS, ARM64, และ z/OS บางระบบ
|
||||
+ รูปแบบ IEEE-754 binary64-extended ที่รู้จักกันอย่างแพร่หลายที่สุดคือรูปแบบความแม่นยำเพิ่มเติม
|
||||
80 บิต x87 ซึ่งถูกใช้โดยสถาปัตยกรรม x86 และ x86-64 บางระบบ (การยกเว้นที่ควรพูดถึงคือ
|
||||
MSVC ที่กำหนดให้ `long double` อยู่ในรูปแบบเดียวกันกับ `double`, เช่น binary64)
|
||||
|
||||
เมื่อใช้มาตรฐาน C ตั้งแต่ C23 เป็นต้นไปและหากแพลตฟอร์มของคุณใช้งานคอนแสตนต์มาโคร
|
||||
#listy(
|
||||
indent: 10.20em,
|
||||
numbering: thai-numbering,
|
||||
[รูปแบบ binary128 นั้นถูกใช้โดยระบบ HP-UX, SPARC, MIPS, ARM64, และ z/OS บางระบบ],
|
||||
[รูปแบบ IEEE-754 binary64-extended ที่รู้จักกันอย่างแพร่หลายที่สุดคือรูปแบบความแม่นยำเพิ่มเติม
|
||||
80 บิต x87 ซึ่งถูกใช้โดยสถาปัตยกรรม x86 และ x86-64 บางระบบ#jb (การยกเว้นที่ควรพูดถึงคือ
|
||||
MSVC ที่กำหนดให้ `long double` อยู่ในรูปแบบเดียวกันกับ `double`, เช่น#jb binary64)],
|
||||
)
|
||||
|
||||
#h(8.85em) เมื่อใช้มาตรฐาน C ตั้งแต่ C23 เป็นต้นไปและหากแพลตฟอร์มของคุณใช้งานคอนแสตนต์มาโคร
|
||||
`__STDC_IEC_60559_DFP__` ข้อมูลประเภทตัวเลขทศนิยมดังต่อไปนี้จะถูกรองรับด้วย:
|
||||
|
||||
#[
|
||||
#set enum(indent:9.75em)
|
||||
+ `_Decimal32`: แทนรูปแบบมาตรฐาน IEEE-754 decimal32
|
||||
+ `_Decimal64`: แทนรูปแบบมาตรฐาน IEEE-754 decimal64
|
||||
+ `_Decimal128`: แทนรูปแบบมาตรฐาน IEEE-754 decimal128
|
||||
]
|
||||
+ `_Decimal32` แทนรูปแบบมาตรฐาน IEEE-754 decimal32
|
||||
+ `_Decimal64` แทนรูปแบบมาตรฐาน IEEE-754 decimal64
|
||||
+ `_Decimal128` แทนรูปแบบมาตรฐาน IEEE-754 decimal128
|
||||
|
||||
มิฉะนั้น ประเภทตัวเลขทศนิยมเพิ่มเติมเหล่านี้จะไม่ถูกรองรับ
|
||||
#h(8.85em) มิฉะนั้น ประเภทตัวเลขทศนิยมเพิ่มเติมเหล่านี้จะไม่ถูกรองรับ
|
||||
|
||||
ข้อมูลประเภททศนิยมอาจรองรับค่าพิเศษเพิ่มเติมได้แก่
|
||||
#h(8.85em) ข้อมูลประเภททศนิยมอาจรองรับค่าพิเศษเพิ่มเติมได้แก่
|
||||
|
||||
#[
|
||||
#set enum(indent: 9.75em)
|
||||
+ อนันต์ (Infinity, ทั้งบวกและลบ)
|
||||
+ ศูนย์ติดลบ, `-0.0` โดยมีค่าเท่ากับศูยน์ที่ติดบวก แต่อาจมีความหมายในบางสมการ เช่น
|
||||
1. อนันต์ (Infinity, ทั้งบวกและลบ)
|
||||
2. ศูนย์ติดลบ, `-0.0` โดยมีค่าเท่ากับศูยน์ที่ติดบวก แต่อาจมีความหมายในบางสมการ เช่น
|
||||
`1.0 / 0.0 == INFINITY` แต่ `1.0 / -0.0 == -INFINITY`
|
||||
+ ไม่ใช่ตัวเลข (not-a-number; NaN) ซึ่งไม่เท่ากับอะไรเลย (รวมถึงตัวมันเอง)
|
||||
]
|
||||
3. ไม่ใช่ตัวเลข (not-a-number; NaN) ซึ่งไม่เท่ากับอะไรเลย รวมถึงตัวมันเอง
|
||||
|
||||
ทศนิยมจำนวนจริงสามารถถูกใช้กับตัวดำเนินการทางคณิตศาสตร์ได้ *+ - / \**
|
||||
#h(8.85em) ทศนิยมจำนวนจริงสามารถถูกใช้กับตัวดำเนินการทางคณิตศาสตร์ได้ *+ - / \**
|
||||
และฟังก์ชันทางคณิตศาสตร์จาก `<math.h>`
|
||||
โดยทั้งตัวดำเนินการและฟังก์ชันจากไลบรารีนั้นสามารถก่อให้เกิดการแสดงข้อผิดพลาดของจำนวนทศนิยมได้และจะตั้งค่า
|
||||
`errno`
|
||||
|
||||
=== ประเภทจำนวนทศนิยมซับซ้อน (Complex floating types)
|
||||
|
||||
#h(9.75em) ประเภทข้อมูลจำนวนทศนิยมซับซ้อนนั้นเป็นประเภทที่แทนตัวเลขเชิงซ้อน (complex number)
|
||||
#h(8.85em) ประเภทข้อมูลจำนวนทศนิยมซับซ้อนนั้นเป็นประเภทที่แทนตัวเลขเชิงซ้อน (complex number)
|
||||
นั้นคือ ตัวเลขที่สามารถถูกเขียนแทนเป็นผลรวมของจำนวนจริงและจำนวนจริงที่คูณด้วยจำนวนจินตภาพ (a +
|
||||
bi) โดยประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่
|
||||
|
||||
+ `float _Complex` (และสามารถใช้ `float complex` ได้เช่นกันหากนำเข้า `<complex.h>`)
|
||||
+ `double _Complex` (และสามารถใช้ `double complex` ได้เช่นกันหากนำเข้า `<complex.h>`)
|
||||
+ `long double _Complex` (และสามารถใช้ `long double complex` ได้เช่นกันหากนำเข้า
|
||||
1. `float _Complex` (และสามารถใช้ `float complex` ได้เช่นกันหากนำเข้า `<complex.h>`)
|
||||
2. `double _Complex` (และสามารถใช้ `double complex` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
3. `long double _Complex` (และสามารถใช้ `long double complex` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
|
||||
|
||||
=== ประเภทจำนวนทศนิยมจินตภาพ (Imaginary floating types)
|
||||
|
||||
#i ประเภทข้อมูลจำนวนทศนิยมจินตภาพนั้นเป็นประเภทที่แทนตัวเลขจินตภาพ (imaginary number) นั้นคือ
|
||||
ตัวเลขที่สามารถถูกเขียนแทนเป็นจำนวนจริงที่คูณด้วยจำนวนจินตภาพ: #math.equation(
|
||||
#h(8.85em) ประเภทข้อมูลจำนวนทศนิยมจินตภาพนั้นเป็นประเภทที่แทนตัวเลขจินตภาพ#jb (imaginary
|
||||
number) นั้นคือ ตัวเลขที่สามารถถูกเขียนแทนเป็นจำนวนจริงที่คูณด้วยจำนวนจินตภาพ #math.equation(
|
||||
$b i$,
|
||||
alt: "b i",
|
||||
)
|
||||
) โดยประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่
|
||||
|
||||
ประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่
|
||||
|
||||
+ `float _Imaginary` (และสามารถใช้ `float imaginary` ได้เช่นกันหากนำเข้า
|
||||
1. `float _Imaginary` (และสามารถใช้ `float imaginary` ได้เช่นกันหากนำเข้า#jb
|
||||
`<complex.h>`)
|
||||
+ `double _Imaginary` (และสามารถใช้ `double imaginary` ได้เช่นกันหากนำเข้า
|
||||
2. `double _Imaginary` (และสามารถใช้ `double imaginary` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
+ `long double _Imaginary` (และสามารถใช้ `long double imaginary` ได้เช่นกันหากนำเข้า
|
||||
3. `long double _Imaginary` (และสามารถใช้ `long double imaginary` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
|
||||
|
||||
=== ประเภทตัวอักษร (Character)
|
||||
|
||||
+ `signed char`: ประเภทสำหรับตัวอักษรแบบ signed
|
||||
+ `unsigned char`: ประเภทสำหรับตัวอักษรแบบ unsigned
|
||||
+ `char`: ประเภทสำหรับตัวอักษรแบบไม่ระบุระยะข้อมูล ซึ่งสามารถเท่ากับ `signed char` หรือ
|
||||
1. `signed char` คือประเภทสำหรับตัวอักษรแบบ signed
|
||||
2. `unsigned char` คือประเภทสำหรับตัวอักษรแบบ unsigned
|
||||
3. `char` คือประเภทสำหรับตัวอักษรแบบไม่ระบุระยะข้อมูล ซึ่งสามารถเท่ากับ#jb `signed char` หรือ
|
||||
`unsigned char` ก็ได้ขึ้นอยู่กับแพลตฟอร์มและคอมไพเลอร์ แต่อย่างไรก็ตาม `char`
|
||||
นั้นไม่ใช่เพียงแค่มาโครที่ลิงก์ไปยังประเภทอื่น ๆ แต่ `char` คือประเภทของมันเอง
|
||||
|
||||
=== คีย์เวิร์ด
|
||||
|
||||
+ `bool`, `true`, `false`, `char`, `int`, `short`, `long`, `signed`, `unsigned`,
|
||||
`float`, `double`.
|
||||
+ `_Bool`, `_BitInt`, `_Complex`, `_Imaginary`, `_Decimal32`, `_Decimal64`,
|
||||
`_Decimal128`.
|
||||
1. `bool`, `true`, `false`, `char`, `int`, `short`, `long`, `signed`,
|
||||
`unsigned`, `float`, `double`
|
||||
2. `_Bool`, `_BitInt`, `_Complex`, `_Imaginary`, `_Decimal32`, `_Decimal64`,
|
||||
`_Decimal128`
|
||||
|
||||
=== ระยะค่าที่เก็บได้
|
||||
|
||||
#h(9.75em) ก่อนมาตรฐาน C23 มาตรฐาน C อนุญาตการแทนตัวเลขแบบใดก็ได้ และระยะขั้นต่ำของตัวเลข
|
||||
N บิตคือ #math.equation($-(2^(N-1)-1)$, alt: "ลบ 2 ยกกำลัง N ลบ 1 ทั้งหมดลบ 1") ถึง
|
||||
#math.equation($+2^(N-1)-1$, alt: "บวก 2 ยกกำลัง N ลบ 1 ทั้งหมดลบ 1") (เช่น -127 ถึง
|
||||
127 สำหรับประเภทตัวเลข 8 บิต) ซึ่งตรงกับขอบเขตของส่วนเติมเต็มหนึ่ง (one's complement)
|
||||
หรือการแทนจำนวนมีเครื่องหมาย (sign-and-magnitude)
|
||||
#h(8.85em) ก่อนมาตรฐาน C23 มาตรฐาน C อนุญาตการแทนตัวเลขแบบใดก็ได้ และ#jb
|
||||
ระยะขั้นต่ำของตัวเลข N บิตคือ #math.minus#[(2#super[N-1] #math.minus 1)] ถึง
|
||||
+2#super[N-1] #math.minus 1 (เช่น -127 ถึง 127 สำหรับประเภทตัวเลข 8 บิต)
|
||||
ซึ่งตรงกับขอบเขตของส่วนเติมเต็มหนึ่ง (one's complement) หรือการแทนจำนวนมีเครื่องหมาย
|
||||
(sign-and-magnitude)
|
||||
|
||||
#h(9.75em) อย่างไรก็ตาม รูปแบบข้อมูลที่ใช้กันอย่างแพร่หลายทั้งหมด (รวมถึง ILP32, LP32, LP64,
|
||||
และ LLP64) และคอมไพเลอร์ C เกือบทั้งหมดใช้การแทนตัวเลขแบบส่วนเติมเต็มสอง (two's
|
||||
#h(8.85em) อย่างไรก็ตาม รูปแบบข้อมูลที่ใช้กันอย่างแพร่หลายทั้งหมด (รวมถึง ILP32, LP32, LP64,
|
||||
และ LLP64) และคอมไพเลอร์ C เกือบทั้งหมดใช้การแทนตัวเลขแบบส่วนเติมเต็มสอง#jb (two's
|
||||
complement) (มีข้อยกเว้นที่ทราบแค่บางคอมไพเลอร์สำหรับระบบ UNISYS) และตั้งแต่มาตรฐาน C23
|
||||
มันคือการแทนตัวเลขแบบเดียวที่ถูกอนุญาตให้ใช้โดยมาตรฐาน และมีขอบเขตที่แน่นอนระหว่าง
|
||||
#math.equation($-2^(N-1)$, alt: "ลบ 2 ยกกำลัง N ลบ 1") ถึง #math.equation(
|
||||
$+2^(N-1)-1$,
|
||||
alt: "บวก 2 ยกกำลัง N ลบ 1 ทั้งหมดลบ 1",
|
||||
) (เช่น -128 ถึง 127 สำหรับประเภทตัวเลข 8 บิต)
|
||||
มันคือการแทนตัวเลขแบบเดียวที่ถูกอนุญาตให้ใช้โดยมาตรฐาน
|
||||
และมีขอบเขตที่แน่นอนระหว่าง -2#super[N#math.minus#[1]] ถึง +2#super[N#math.minus#[1]]
|
||||
(เช่น -128 ถึง 127 สำหรับประเภทตัวเลข 8 บิต)
|
||||
|
||||
#h(9.75em) ตารางต่อไปนี้ให้ข้อมูลเกี่ยวกับขอบเขตของประเภทข้อมูลต่าง ๆ (มีการเพิ่มจุลภาคในทศนิยมเพื่อเพิ่มความสะดวกในการอ่าน)
|
||||
#h(8.85em) ตารางต่อไปนี้ให้ข้อมูลเกี่ยวกับขอบเขตของประเภทข้อมูลต่าง ๆ
|
||||
(มีการเพิ่มจุลภาคในทศนิยมเพื่อเพิ่มความสะดวกในการอ่าน)
|
||||
|
||||
#show table.cell.where(x: 0): strong
|
||||
#show math.equation.where(block: true): set block(spacing: 0.6em)
|
||||
#set list(indent: 0em)
|
||||
#set enum(indent: 0em)
|
||||
|
||||
#figure(
|
||||
table(
|
||||
@@ -540,49 +551,49 @@ complement) (มีข้อยกเว้นที่ทราบแค่บ
|
||||
table.cell([8], rowspan: 2),
|
||||
[signed],
|
||||
[],
|
||||
[*-128* ถึง *127*],
|
||||
[-128 ถึง 127],
|
||||
|
||||
[unsigned],
|
||||
[],
|
||||
[*0* ถึง *255*],
|
||||
[0 ถึง 255],
|
||||
|
||||
[16],
|
||||
[UTF-16],
|
||||
[],
|
||||
[*0* ถึง *65535*],
|
||||
[0 ถึง 65535],
|
||||
|
||||
[32],
|
||||
[UTF-32],
|
||||
[],
|
||||
[*0* ถึง *1114111 (0x10ffff)*],
|
||||
[0 ถึง 1114111 (0x10ffff)],
|
||||
|
||||
table.cell([จำนวน\ เต็ม], rowspan: 6),
|
||||
table.cell([16], rowspan: 2),
|
||||
[signed],
|
||||
[*± 3.27 · 104*],
|
||||
[*-32768* ถึง *32767*],
|
||||
[± 3.27 · 104],
|
||||
[-32768 ถึง 32767],
|
||||
|
||||
[unsigned],
|
||||
[*0* ถึง *6.55 · 104*],
|
||||
[*0* ถึง *65535*],
|
||||
[0 ถึง 6.55 · 104],
|
||||
[0 ถึง 65535],
|
||||
|
||||
table.cell([32], rowspan: 2),
|
||||
[signed],
|
||||
[*± 2.14 · 109*],
|
||||
[*-2,147,483,648* ถึง *2,147,483,647*],
|
||||
[± 2.14 · 109],
|
||||
[-2,147,483,648 ถึง 2,147,483,647],
|
||||
|
||||
[unsigned],
|
||||
[*0* ถึง *4.29 · 109*],
|
||||
[*0* ถึง *4,294,967,295*],
|
||||
[0 ถึง 4.29 · 109],
|
||||
[0 ถึง 4,294,967,295],
|
||||
|
||||
table.cell([64], rowspan: 2),
|
||||
[signed],
|
||||
[*± 9.22 · 1018*],
|
||||
[*-9,223,372,036,854,775,808* ถึง *9,223,372,036,854,775,807*],
|
||||
[± 9.22 · 1018],
|
||||
[-9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807],
|
||||
|
||||
[unsigned],
|
||||
[*0* ถึง *1.84 · 1019*],
|
||||
[*0* ถึง *18,446,744,073,709,551,615*],
|
||||
[0 ถึง 1.84 · 1019],
|
||||
[0 ถึง 18,446,744,073,709,551,615],
|
||||
|
||||
table.cell([ทศนิยม\ ไบนารี], rowspan: 2),
|
||||
[32],
|
||||
@@ -811,15 +822,15 @@ complement) (มีข้อยกเว้นที่ทราบแค่บ
|
||||
caption: [ตารางแสดงขอบเขตประเภทข้อมูล (ต่อ)],
|
||||
)
|
||||
|
||||
#set list(indent: 1em)
|
||||
#set enum(indent: 1em)
|
||||
|
||||
== ชุดแปลโปรแกรมของกนู (GNU Compiler Collection; GCC)
|
||||
|
||||
#h(6em) ในกระบวนการการพัฒนาโครงงานนี้
|
||||
#h(5.05em) ในกระบวนการการพัฒนาโครงงานนี้
|
||||
ชุดแปลโปรแกรมของกนูนั้นถูกใช้เป็นหลักเนื่องจากเป็นชุดแปลโปรแกรม (คอมไพเลอร์; Compiler)
|
||||
ที่ใช้เป็นหลักในการพัฒนาโคดที่สร้างบนพื้นฐาน Arduino และบอร์ดต่าง ๆ รวมถึงบอร์ด ESP32
|
||||
|
||||
#h(6em) ชุดคอมไพเลอร์ GNU (GNU Compiler Collection; GCC) (เดิมชื่อ GNU C Compiler)
|
||||
#h(5.05em) ชุดคอมไพเลอร์ GNU (GNU Compiler Collection; GCC) (เดิมชื่อ GNU C Compiler)
|
||||
คือชุดคอมไพเลอร์จากโครงการ GNU ที่รองรับภาษาโปรแกรม สถาปัตยกรรมฮาร์ดแวร์
|
||||
และระบบปฏิบัติการต่าง ๆ มูลนิธิซอฟต์แวร์เสรี (FSF) เผยแพร่ GCC
|
||||
ในฐานะซอฟต์แวร์เสรีภายใต้สัญญาอนุญาตสถูกเรียกาธารณะทั่วไปของ GNU (GNU GPL) GCC
|
||||
@@ -827,13 +838,14 @@ complement) (มีข้อยกเว้นที่ทราบแค่บ
|
||||
Linux ด้วยโคดประมาณ 15 ล้านบรรทัดในปี 2019 GCC จึงเป็นหนึ่งในโปรแกรมฟรีที่ใหญ่ที่สุดเท่าที่เคยมีมา
|
||||
GCC มีบทบาทสำคัญในการเติบโตของซอฟต์แวร์เสรี ทั้งในฐานะเครื่องมือและตัวอย่าง
|
||||
|
||||
#h(6em) นอกจากจะเป็นคอมไพเลอร์อย่างเป็นทางการของระบบปฏิบัติการ GNU แล้ว GCC
|
||||
#h(5.05em) นอกจากจะเป็นคอมไพเลอร์อย่างเป็นทางการของระบบปฏิบัติการ GNU แล้ว GCC
|
||||
ยังได้รับการยอมรับให้เป็นคอมไพเลอร์มาตรฐานโดยระบบปฏิบัติการคอมพิวเตอร์สมัยใหม่ที่คล้ายกับ Unix อื่นๆ
|
||||
อีกมากมาย รวมถึงระบบปฏิบัติการ Linux ส่วนใหญ่ ระบบปฏิบัติการตระกูล BSD ส่วนใหญ่ก็เปลี่ยนมาใช้ GCC
|
||||
ไม่นานหลังจากเปิดตัว แม้ว่าหลังจากนั้น FreeBSD และ Apple macOS ได้เปลี่ยนมาใช้คอมไพเลอร์ Clang
|
||||
ส่วนใหญ่เป็นเพราะเหตุผลด้านลิขสิทธิ์ GCC ยังสามารถคอมไพเลอร์โคดสำหรับระบบปฏิบัติการ Windows,
|
||||
Android, iOS, Solaris, HP-UX, AIX และ MS-DOS ได้อีกด้วย
|
||||
|
||||
#h(6em) GCC ได้รับการพอร์ตไปยังแพลตฟอร์มและสถาปัตยกรรมชุดคำสั่งต่าง ๆ มากกว่าคอมไพเลอร์อื่น ๆ
|
||||
#h(5.05em) GCC ได้รับการพอร์ตไปยังแพลตฟอร์มและสถาปัตยกรรมชุดคำสั่งต่าง ๆ มากกว่าคอมไพเลอร์อื่น
|
||||
ๆ
|
||||
และถูกนำไปใช้งานอย่างกว้างขวางในฐานะเครื่องมือในการพัฒนาซอฟต์แวร์ทั้งแบบฟรีและแบบที่เป็นกรรมสิทธิ์
|
||||
นอกจากนี้ GCC ยังพร้อมใช้งานสำหรับระบบฝังตัวมากมาย รวมถึงชิปที่ใช้ ARM และ Power ISA
|
||||
|
||||
+39
-11
@@ -1,18 +1,46 @@
|
||||
#import "../PageTemplate.typ": page-theme
|
||||
#import "@preview/i-figured:0.2.4"
|
||||
#set enum(numbering: "1)")
|
||||
|
||||
#set heading(numbering: "บทที่ 1")
|
||||
#include "Intro.typ"
|
||||
|
||||
#[
|
||||
#show heading: it => {
|
||||
if it.level > 2 {
|
||||
block(
|
||||
it,
|
||||
inset: (left: 1.7em * (it.level - 2) + (0.9em * (it.level - 3))),
|
||||
)
|
||||
} else {
|
||||
it
|
||||
}
|
||||
}
|
||||
|
||||
#include "Intro.typ"
|
||||
|
||||
#set heading(numbering: "1.1", offset: 1)
|
||||
#include "Microcontroller.typ"
|
||||
#include "Sensors.typ"
|
||||
#include "Buzzer.typ"
|
||||
#include "HTTP.typ"
|
||||
#include "HTTPS.typ"
|
||||
#include "TLS.typ"
|
||||
#include "NFC.typ"
|
||||
#include "Flutter.typ"
|
||||
#include "Git.typ"
|
||||
]
|
||||
|
||||
#show heading.where(level: 3): it => {
|
||||
block(
|
||||
it,
|
||||
inset: (left: 2.1em * (it.level - 2)),
|
||||
)
|
||||
}
|
||||
#show heading.where(level: 4): it => {
|
||||
block(
|
||||
it,
|
||||
inset: (left: 5.1em),
|
||||
)
|
||||
}
|
||||
|
||||
#set heading(numbering: "1.1", offset: 1)
|
||||
#include "Microcontroller.typ"
|
||||
#include "Sensors.typ"
|
||||
#include "Buzzer.typ"
|
||||
#include "HTTP.typ"
|
||||
#include "HTTPS.typ"
|
||||
#include "TLS.typ"
|
||||
#include "NFC.typ"
|
||||
#include "Flutter.typ"
|
||||
#include "Git.typ"
|
||||
#include "CLanguage.typ"
|
||||
|
||||
+47
-48
@@ -6,33 +6,33 @@
|
||||
|
||||
= Flutter <flutter>
|
||||
|
||||
#i Flutter เป็นชุดพัฒนาซอฟต์แวร์ UI แบบโอเพนซอร์สที่สร้างโดย Google
|
||||
#h(1.7em) Flutter เป็นชุดพัฒนาซอฟต์แวร์ UI แบบโอเพนซอร์สที่สร้างโดย Google
|
||||
สามารถใช้พัฒนาแอปพลิเคชันข้ามแพลตฟอร์มจากฐานโคดเดียวสำหรับเว็บ Fuchsia, Android, iOS,
|
||||
Linux, macOS และ Windows โดย Flutter ได้รับการพูดถึงครั้งแรกในปี 2015
|
||||
และเปิดตัวในเดือนพฤษภาคม 2017 และ Flutter ถูกใช้งานภายในโดย Google ในแอปพลิเคชันต่างๆ
|
||||
Linux, macOS และ#jb Windows โดย Flutter ได้รับการพูดถึงครั้งแรกในปี 2015
|
||||
และเปิดตัวในเดือนพฤษภาคม 2017 และ#jb Flutter ถูกใช้งานภายในโดย Google ในแอปพลิเคชันต่างๆ
|
||||
เช่น Google Pay และ Google Earth รวมถึงโดยนักพัฒนาซอฟต์แวร์รายอื่นๆ เช่น ByteDance และ
|
||||
Alibaba
|
||||
|
||||
#i Flutter จะสร้างแอปพลิเคชันที่มีเอ็นจิ้นการเรนเดอร์ของตัวเอง ซึ่งส่งข้อมูลพิกเซลไปยังหน้าจอโดยตรง
|
||||
ซึ่งแตกต่างจากเฟรมเวิร์ก UI อื่น ๆ อีกมากมายที่อาศัยแพลตฟอร์มเป้าหมายเพื่อจัดหาเอ็นจิ้นการเรนเดอร์
|
||||
เช่น แอป Android พื้นฐานที่ใช้ Android SDK ระดับอุปกรณ์ หรือ iOS SDK ที่ใช้ UI stack
|
||||
ในตัวของแพลตฟอร์มเป้าหมาย การควบคุมขั้นตอนการแสดงผลของ Flutter
|
||||
ช่วยลดความยุ่งยากในการรองรับหลายแพลตฟอร์ม เนื่องจากสามารถใช้โคด UI
|
||||
ที่เหมือนกันได้กับทุกแพลตฟอร์มเป้าหมาย
|
||||
#h(1.7em) Flutter จะสร้างแอปพลิเคชันที่มีเอ็นจิ้นการเรนเดอร์ของตัวเอง
|
||||
ซึ่งส่งข้อมูลพิกเซลไปยังหน้าจอโดยตรง ซึ่งแตกต่างจากเฟรมเวิร์ก UI อื่น ๆ
|
||||
อีกมากมายที่อาศัยแพลตฟอร์มเป้าหมายเพื่อจัดหาเอ็นจิ้นการเรนเดอร์ เช่น แอป Android พื้นฐานที่ใช้
|
||||
Android SDK ระดับอุปกรณ์ หรือ iOS SDK ที่ใช้ UI stack ในตัวของแพลตฟอร์มเป้าหมาย
|
||||
การควบคุมขั้นตอนการแสดงผลของ Flutter ช่วยลดความยุ่งยากในการรองรับหลายแพลตฟอร์ม
|
||||
เนื่องจากสามารถใช้โคด UI ที่เหมือนกันได้กับทุกแพลตฟอร์มเป้าหมาย
|
||||
|
||||
== Dart
|
||||
|
||||
#iii Dart เป็นภาษาโปรแกรมที่ออกแบบโดย Lars Bak และ Kasper Lund และพัฒนาโดย Google
|
||||
สามารถใช้พัฒนาแอปพลิเคชันบนเว็บ มือถือ เซิร์ฟเวอร์ และเดสก์ท็อปได้
|
||||
#h(4.2em) Dart เป็นภาษาโปรแกรมที่ออกแบบโดย Lars Bak และ Kasper Lund และพัฒนาโดย#jb
|
||||
Google สามารถใช้พัฒนาแอปพลิเคชันบนเว็บ มือถือ เซิร์ฟเวอร์ และเดสก์ท็อปได้
|
||||
และยังเป็นภาษาหลักที่ใช้ในการพัฒนาแอปพลิเคชัน Flutter
|
||||
|
||||
#iii Dart เป็นภาษาเชิงวัตถุ อิงคลาส และรวบรวมขยะ (garbage-collection) ด้วยไวยากรณ์แบบ C
|
||||
สามารถคอมไพล์เป็นโค้ดเครื่อง JavaScript หรือ WebAssembly ได้ รองรับอินเทอร์เฟซ มิกซ์อิน
|
||||
คลาสนามธรรม เจเนอริกแบบรีไฟด์ และการอนุมานชนิดข้อมูล
|
||||
#h(4.2em) Dart เป็นภาษาเชิงวัตถุ อิงคลาส และรวบรวมขยะ (garbage-collection)
|
||||
ด้วยไวยากรณ์แบบ C สามารถคอมไพล์เป็นโค้ดเครื่อง JavaScript หรือ WebAssembly ได้
|
||||
รองรับอินเทอร์เฟซ มิกซ์อิน คลาสนามธรรม เจเนอริกแบบรีไฟด์ และการอนุมานชนิดข้อมูล
|
||||
|
||||
== สถาปัตยกรรม
|
||||
|
||||
#iii Flutter ถูกออกแบบมาให้เป็นระบบแบบเลเยอร์ที่ต่อขยายได้
|
||||
#h(4.2em) Flutter ถูกออกแบบมาให้เป็นระบบแบบเลเยอร์ที่ต่อขยายได้
|
||||
ประกอบด้วยไลบรารีอิสระหลายชุดที่แต่ละชุดพึ่งพาเลเยอร์ที่อยู่ด้านล่าง
|
||||
ไม่มีเลเยอร์ใดที่มีสิทธิ์พิเศษในการเข้าถึงเลเยอร์ด้านล่าง
|
||||
และทุกส่วนของเฟรมเวิร์กถูกออกแบบมาให้เป็นตัวเลือกและสามารถทดแทนได้
|
||||
@@ -44,15 +44,17 @@ Alibaba
|
||||
caption: [สถาปัตยกรรม Flutter],
|
||||
)
|
||||
|
||||
#v(0.5em)
|
||||
|
||||
#iii สำหรับระบบปฏิบัติการที่อยู่ภายใต้ แอปพลิเคชัน Flutter
|
||||
จะถูกบรรจุในลักษณะเดียวกับแอปพลิเคชันเนทีฟอื่น ๆ โดยตัวฝังตัว (Embedder)
|
||||
เฉพาะแพลตฟอร์มจะทำหน้าที่เป็นจุดเริ่มต้น ประสานงานกับระบบปฏิบัติการที่อยู่ภายใต้เพื่อเข้าถึงบริการต่างๆ
|
||||
เช่น พื้นผิวการแสดงผล การเข้าถึง และการป้อนข้อมูล และจัดการลูปเหตุการณ์ข้อความ
|
||||
ตัวฝังตัวเขียนด้วยภาษาที่เหมาะสมกับแพลตฟอร์ม ปัจจุบันคือ Java และ C++ สำหรับ Android, Swift
|
||||
และ Objective-C/Objective-C++ สำหรับ#jb iOS และ macOS และ C++ สำหรับ Windows และ
|
||||
Linux การใช้ตัวฝังตัว โค้ด Flutter สามารถรวมเข้ากับแอปพลิเคชันที่มีอยู่แล้วในรูปแบบโมดูล
|
||||
หรือโค้ดอาจเป็นเนื้อหาทั้งหมดของแอปพลิเคชันก็ได้ Flutter
|
||||
มีตัวฝังตัวจำนวนมากสำหรับแพลตฟอร์มเป้าหมายทั่วไป แต่ก็ยังมีตัวฝังตัวอื่นๆ อีกด้วย
|
||||
เฉพาะแพลตฟอร์มจะทำหน้าที่เป็นจุดเริ่มต้น#jb
|
||||
ประสานงานกับระบบปฏิบัติการที่อยู่ภายใต้เพื่อเข้าถึงบริการต่างๆ เช่น พื้นผิวการแสดงผล การเข้าถึง
|
||||
และการป้อนข้อมูล และจัดการลูปเหตุการณ์ข้อความ ตัวฝังตัวเขียนด้วยภาษาที่เหมาะสมกับแพลตฟอร์ม#jb
|
||||
ปัจจุบันคือ Java และ C++ สำหรับ Android, Swift และ Objective-C/Objective-C++ สำหรับ#jb
|
||||
iOS และ macOS และ C++ สำหรับ Windows และ Linux การใช้ตัวฝังตัว โค้ด Flutter
|
||||
สามารถรวมเข้ากับแอปพลิเคชันที่มีอยู่แล้วในรูปแบบโมดูล หรือโค้ดอาจเป็นเนื้อหาทั้งหมดของแอปพลิเคชันก็ได้
|
||||
Flutter มีตัวฝังตัวจำนวนมากสำหรับแพลตฟอร์มเป้าหมายทั่วไป แต่ก็ยังมีตัวฝังตัวอื่นๆ อีกด้วย
|
||||
|
||||
#iii หัวใจหลักของ Flutter คือ Flutter engine ซึ่งส่วนใหญ่เขียนด้วยภาษา C++
|
||||
และรองรับฟังก์ชันพื้นฐานที่จำเป็นต่อการทำงานของแอปพลิเคชัน Flutter ทั้งหมด
|
||||
@@ -64,28 +66,26 @@ Linux การใช้ตัวฝังตัว โค้ด Flutter สา
|
||||
ที่อยู่เบื้องหลังด้วยคลาส Dart ไลบรารีนี้เปิดเผยส่วนประกอบพื้นฐานระดับต่ำสุด เช่น
|
||||
คลาสสำหรับควบคุมระบบย่อยการรับข้อมูล กราฟิก และการแสดงผลข้อความ
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#iii โดยทั่วไป นักพัฒนาจะโต้ตอบกับ Flutter ผ่านเฟรมเวิร์ก Flutter
|
||||
ซึ่งเป็นเฟรมเวิร์กที่ทันสมัยและตอบสนองต่อสิ่งรอบข้าง เขียนด้วยภาษา Dart
|
||||
เฟรมเวิร์กนี้ประกอบด้วยชุดไลบรารี แพลตฟอร์ม#jb เลย์เอาต์ และพื้นฐานที่ครบครัน
|
||||
ซึ่งประกอบด้วยเลเยอร์หลายชั้น เริ่มจากล่างขึ้นบน ได้แก่
|
||||
|
||||
#[
|
||||
#set enum(indent: 5.5em)
|
||||
+ คลาสพื้นฐานและบริการส่วนประกอบต่างๆ เช่น แอนิเมชัน การวาดภาพ และท่าทางสัมผัส
|
||||
#set enum(indent: 4.1em)
|
||||
1. คลาสพื้นฐานและบริการส่วนประกอบต่างๆ เช่น แอนิเมชัน การวาดภาพ และท่าทางสัมผัส
|
||||
ซึ่งนำเสนอนามธรรมที่ใช้กันทั่วไปเหนือพื้นฐานที่อยู่เบื้องหลัง
|
||||
|
||||
+ เลเยอร์การเรนเดอร์ให้นามธรรมสำหรับการจัดการเลย์เอาต์ ด้วยเลเยอร์นี้
|
||||
2. เลเยอร์การเรนเดอร์ให้นามธรรมสำหรับการจัดการเลย์เอาต์ ด้วยเลเยอร์นี้
|
||||
คุณสามารถสร้างโครงสร้างแบบต้นไม้ของวัตถุที่เรนเดอร์ได้ คุณสามารถจัดการวัตถุเหล่านี้แบบไดนามิก
|
||||
โดยโครงสร้างแบบต้นไม้จะอัปเดตเลย์เอาต์โดยอัตโนมัติเพื่อสะท้อนการเปลี่ยนแปลงของคุณ
|
||||
|
||||
+ เลเยอร์วิดเจ็ตเป็นนามธรรมของการประกอบ
|
||||
3. เลเยอร์วิดเจ็ตเป็นนามธรรมของการประกอบ
|
||||
วัตถุเรนเดอร์แต่ละชิ้นในเลเยอร์การเรนเดอร์จะมีคลาสที่สอดคล้องกันในเลเยอร์วิดเจ็ต นอกจากนี้
|
||||
เลเยอร์วิดเจ็ตยังช่วยให้คุณกำหนดการรวมกันของคลาสที่คุณสามารถนำกลับมาใช้ใหม่ได้
|
||||
นี่คือเลเยอร์ที่แนะนำโมเดลการเขียนโปรแกรมแบบตอบสนอง
|
||||
|
||||
+ ไลบรารี Material และ Cupertino
|
||||
4. ไลบรารี Material และ Cupertino
|
||||
นำเสนอชุดควบคุมที่ครอบคลุมซึ่งใช้ส่วนประกอบพื้นฐานของเลเยอร์วิดเจ็ตเพื่อนำภาษาการออกแบบ
|
||||
Material หรือ iOS ไปใช้
|
||||
]
|
||||
@@ -112,33 +112,33 @@ Linux การใช้ตัวฝังตัว โค้ด Flutter สา
|
||||
)
|
||||
|
||||
#[
|
||||
#set enum(indent: 9.25em)
|
||||
#set enum(indent: 7.55em)
|
||||
=== แอปพลิเคชัน Dart (Dart app)
|
||||
+ ประกอบวิดเจ็ตเข้าด้วยกันเพื่อสร้าง UI ที่ต้องการ
|
||||
+ ดำเนินการตามตรรกะทางธุรกิจ
|
||||
+ นักพัฒนาแอปเป็นเจ้าของ
|
||||
|
||||
=== เฟรมเวิร์ก (Framework)
|
||||
+ ให้ API ระดับสูงสำหรับการสร้างแอปคุณภาพสูง (ตัวอย่างเช่น วิดเจ็ต การทดสอบการกด
|
||||
1. ให้ API ระดับสูงสำหรับการสร้างแอปคุณภาพสูง (ตัวอย่างเช่น วิดเจ็ต การทดสอบการกด
|
||||
การตรวจจับท่าทาง การเข้าถึงได้ และการอินพุต ข้อความ)
|
||||
+ ประกอบต้นวิดเจ็ตของแอปพลิเคชันเป็นฉาก
|
||||
2. ประกอบต้นวิดเจ็ตของแอปพลิเคชันเป็นฉาก
|
||||
|
||||
=== เอนจิน (Engine)
|
||||
+ มีหน้าที่แปลงฉากเป็นรูปแบบแรสเตอร์
|
||||
+ ให้การทำงานระดับต่ำของแกนกลางของ Flutter API (เช่น กราฟิก การจัดข้อความ และรันไทม์
|
||||
1. มีหน้าที่แปลงฉากเป็นรูปแบบแรสเตอร์
|
||||
2. ให้การทำงานระดับต่ำของแกนกลางของ Flutter API (เช่น กราฟิก การจัดข้อความ และรันไทม์
|
||||
Dart)
|
||||
+ เปิดเผยฟังก์ชันระดับนี้ให้แก่เฟรมเวิร์กผ่าน API `dart:ui`
|
||||
+ บูรณาการกับแพลตฟอร์มต่าง ๆ ด้วย API ตัวฝังตัว
|
||||
3. เปิดเผยฟังก์ชันระดับนี้ให้แก่เฟรมเวิร์กผ่าน API `dart:ui`
|
||||
4. บูรณาการกับแพลตฟอร์มต่าง ๆ ด้วย API ตัวฝังตัว
|
||||
|
||||
=== ตัวฝังตัว (Embedder)
|
||||
+ ประสานงานกับระบบปฏิบัติการภายใต้สำหรับการเข้าถึงบริการต่าง ๆ เช่น พื้นผิวการเรนเดอร์
|
||||
1. ประสานงานกับระบบปฏิบัติการภายใต้สำหรับการเข้าถึงบริการต่าง ๆ เช่น พื้นผิวการเรนเดอร์
|
||||
การเข้าถึง และการป้อนข้อมูล
|
||||
+ จัดการลูปอิเวนต์
|
||||
+ เปิดเผย API เฉพาะแพลตฟอร์มเพื่อบูรณาการตัวฝังตัวเข้าไปยังแอป
|
||||
2. จัดการลูปอิเวนต์
|
||||
3. เปิดเผย API เฉพาะแพลตฟอร์มเพื่อบูรณาการตัวฝังตัวเข้าไปยังแอป
|
||||
|
||||
=== ตัวรัน (Runner)
|
||||
+ ประกอบชิ้นส่วนที่ถูกเปิดเผยโดยตัวฝังตัวเข้าเป็นแพคเกจแอปพลิเคชันที่สามารถใช้งานได้บนแพลตฟอร์มเป้าหมาย
|
||||
+ บางส่วนถูกสร้างขึ้นโดย `flutter create` และมีเจ้าของเป็นผู้พัฒนาแอป
|
||||
1. ประกอบชิ้นส่วนที่ถูกเปิดเผยโดยตัวฝังตัวเข้าเป็นแพคเกจแอปพลิเคชันที่สามารถใช้งานได้บนแพลตฟอร์มเป้าหมาย
|
||||
2. บางส่วนถูกสร้างขึ้นโดย `flutter create` และมีเจ้าของเป็นผู้พัฒนาแอป
|
||||
]
|
||||
|
||||
== ระบบการดีไซน์
|
||||
@@ -146,7 +146,7 @@ Linux การใช้ตัวฝังตัว โค้ด Flutter สา
|
||||
#iii โดยใน Flutter แล้วนั้น ไม่รวมแพคเกจบุคคลที่สาม จะมีระบบการดีไซน์อยู่สองแบบคือ:
|
||||
|
||||
#[
|
||||
#set enum(indent: 5.5em)
|
||||
#set enum(indent: 4.10em)
|
||||
+ Material Design คือการดีไซน์ของ Google สำหรับ Android
|
||||
+ Cupertino Design คือการดีไซน์ของ Apple สำหรับ iOS
|
||||
]
|
||||
@@ -182,7 +182,9 @@ Glass ในแอปพลิเคชัน Flutter จึงจำเป็
|
||||
caption: [หน้าต่างเลือกสี],
|
||||
)
|
||||
|
||||
#iii มีหลายที่ที่สามารถเปลี่ยนสถานะได้: กล่องสี, แถบเลื่อนเฉดสี, ปุ่มตัวเลือก เมื่อผู้ใช้โต้ตอบกับ UI
|
||||
#v(0.5em)
|
||||
|
||||
#iii มีหลายที่ที่สามารถเปลี่ยนสถานะได้ กล่องสี, แถบเลื่อนเฉดสี, ปุ่มตัวเลือก เมื่อผู้ใช้โต้ตอบกับ UI
|
||||
การเปลี่ยนแปลงจะต้องสะท้อนให้เห็นในทุกที่ ที่เลวร้ายยิ่งกว่านั้น เว้นแต่จะได้รับการดูแล
|
||||
การเปลี่ยนแปลงเล็กน้อยในส่วนใดส่วนหนึ่งของอินเทอร์เฟซผู้ใช้อาจทำให้เกิดเอฟเฟกต์คลื่นส่งผลกระทบกับโค้ดที่ดูเหมือนจะไม่เกี่ยวข้องกัน
|
||||
|
||||
@@ -205,10 +207,7 @@ Glass ในแอปพลิเคชัน Flutter จึงจำเป็
|
||||
การแปลงแผนผังหลายแผนผังของวัตถุให้เป็นแผนผังระดับล่างของวัตถุ
|
||||
และการแพร่กระจายการเปลี่ยนแปลงไปยังแผนผังวิดเจ็ตเหล่านี้
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#iii วิดเจ็ตประกาศส่วนติดต่อผู้ใช้โดยการเขียนทับเมธอด `build()` ซึ่งเป็นฟังก์ชันที่แปลงสถานะเป็น
|
||||
UI:
|
||||
#iii วิดเจ็ตประกาศส่วนติดต่อผู้ใช้โดยการเขียนทับเมธอด `build()` ซึ่งเป็นฟังก์ชันที่แปลงสถานะเป็น UI
|
||||
|
||||
#afigure(
|
||||
```
|
||||
@@ -222,7 +221,7 @@ UI:
|
||||
ทำให้เมธอดนั้นสามารถถูกเรียกใช้โดยเฟรมเวิร์กเมื่อไหร่ก็ได้ที่จำเป็น
|
||||
(เป็นไปได้ที่จะบ่อยมากและมีการเรียกใช้หนึ่งครั้งต่อหนึ่งเฟรม)
|
||||
|
||||
#iii วิธีนี้พึ่งพาลักษณะเฉพาะรันไทม์ภาษา (หากเจาะจงคือการสร้างและทำลายวัตถุอย่างรวดเร็ว) ซึ่ง
|
||||
#iii วิธีนี้พึ่งพาลักษณะเฉพาะรันไทม์ภาษา (หากเจาะจงคือการสร้างและทำลายวัตถุอย่างรวดเร็ว)#jb ซึ่ง
|
||||
Dart นั้นเหมาะสำหรับงานนี้เป็นพิเศษ
|
||||
|
||||
== ประวัติ
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
= Git
|
||||
|
||||
#i Git เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย ที่สามารถจัดการเวอร์ชันของซอร์สโคดหรือข้อมูลได้
|
||||
#h(1.7em) Git เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย ที่สามารถจัดการเวอร์ชันของซอร์สโคดหรือข้อมูลได้
|
||||
มักใช้เพื่อควบคุมซอร์สโคดโดยโปรแกรมเมอร์ที่พัฒนาซอฟต์แวร์ร่วมกัน
|
||||
|
||||
== Gitea
|
||||
|
||||
+6
-6
@@ -2,14 +2,14 @@
|
||||
|
||||
= เกณฑ์วิธีขนส่งข้อความหลายมิติ (HyperText Transfer Protocol; HTTP)
|
||||
|
||||
#i HTTP (Hypertext Transfer Protocol) เป็น โปรโตคอลชั้นแอปพลิเคชันในชุดโปรโตคอลอินเทอร์เน็ตสำหรับระบบข้อมูลไฮเปอร์มีเดียแบบกระจายและร่วมมือกัน HTTP เป็นรากฐานของการสื่อสารข้อมูลสำหรับ World Wide Web ซึ่งเอกสารไฮเปอร์เท็กซ์ รวมถึง ไฮเปอร์ลิงก์ไปยังทรัพยากรอื่น ๆ ที่ผู้ใช้สามารถเข้าถึงได้อย่างง่ายดาย เช่น โดยการคลิกเมาส์ หรือโดยการแตะหน้าจอในเว็บเบราว์เซอร์
|
||||
#h(1.7em) HTTP (Hypertext Transfer Protocol) เป็น โปรโตคอลชั้นแอปพลิเคชันในชุดโปรโตคอลอินเทอร์เน็ตสำหรับระบบข้อมูลไฮเปอร์มีเดียแบบกระจายและร่วมมือกัน HTTP เป็นรากฐานของการสื่อสารข้อมูลสำหรับ World Wide Web ซึ่งเอกสารไฮเปอร์เท็กซ์ รวมถึง ไฮเปอร์ลิงก์ไปยังทรัพยากรอื่น ๆ ที่ผู้ใช้สามารถเข้าถึงได้อย่างง่ายดาย เช่น โดยการคลิกเมาส์ หรือโดยการแตะหน้าจอในเว็บเบราว์เซอร์
|
||||
|
||||
#i HTTP เป็น โปรโตคอลแบบคำขอ-การตอบกลับในโมเดลไคลเอนต์-เซิร์ฟเวอร์ ธุรกรรมเริ่มต้นเมื่อไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะพยายามตอบสนองคำขอและส่งการตอบกลับกลับไปยังไคลเอนต์ ซึ่งอธิบายการจัดการคำขอ และอาจมีทรัพยากรที่ร้องขอ เช่น เอกสาร HTML หรือเนื้อหาอื่น ๆ ก็ได้
|
||||
#h(1.7em) HTTP เป็น โปรโตคอลแบบคำขอ-การตอบกลับในโมเดลไคลเอนต์-เซิร์ฟเวอร์ ธุรกรรมเริ่มต้นเมื่อไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะพยายามตอบสนองคำขอและส่งการตอบกลับกลับไปยังไคลเอนต์ ซึ่งอธิบายการจัดการคำขอ และอาจมีทรัพยากรที่ร้องขอ เช่น เอกสาร HTML หรือเนื้อหาอื่น ๆ ก็ได้
|
||||
|
||||
#i ในสถานการณ์ทั่วไปเว็บเบราว์เซอร์ทำหน้าที่เป็นไคลเอนต์และเว็บเซิร์ฟเวอร์ที่โฮสต์เว็บไซต์หนึ่งเว็บไซต์หรือมากกว่านั้นคือ เซิร์ฟเวอร์ เว็บเบราว์เซอร์เป็นตัวอย่างของตัวแทนผู้ใช้ (UA) ตัวแทนผู้ใช้ประเภทอื่น ๆ ได้แก่ ซอฟต์แวร์จัดทำดัชนีที่ใช้โดยผู้ให้บริการค้นหา (เว็บครอว์เลอร์) เบราว์เซอร์เสียง แอปพลิเคชันมือถือ และซอฟต์แวร์อื่น ๆ ที่เข้าถึง ใช้ หรือแสดงเนื้อหาเว็บ
|
||||
#h(1.7em) ในสถานการณ์ทั่วไปเว็บเบราว์เซอร์ทำหน้าที่เป็นไคลเอนต์และเว็บเซิร์ฟเวอร์ที่โฮสต์เว็บไซต์หนึ่งเว็บไซต์หรือมากกว่านั้นคือ เซิร์ฟเวอร์ เว็บเบราว์เซอร์เป็นตัวอย่างของตัวแทนผู้ใช้ (UA) ตัวแทนผู้ใช้ประเภทอื่น ๆ ได้แก่ ซอฟต์แวร์จัดทำดัชนีที่ใช้โดยผู้ให้บริการค้นหา (เว็บครอว์เลอร์) เบราว์เซอร์เสียง แอปพลิเคชันมือถือ และซอฟต์แวร์อื่น ๆ ที่เข้าถึง ใช้ หรือแสดงเนื้อหาเว็บ
|
||||
|
||||
#i HTTP ถูกออกแบบมาเพื่ออนุญาตให้องค์ประกอบเครือข่ายตัวกลางสามารถปรับปรุงหรือเปิดใช้งานการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ เว็บไซต์ที่มีปริมาณการใช้งานสูงมักได้รับประโยชน์จาก เซิร์ฟเวอร์ แคชเว็บที่ส่งเนื้อหาแทนเซิร์ฟเวอร์ต้นทางเพื่อปรับปรุงเวลาตอบสนอง เว็บเบราว์เซอร์จะแคชทรัพยากรเว็บที่เข้าถึงก่อนหน้านี้และนำกลับมาใช้ซ้ำทุกครั้งที่ทำได้เพื่อลดปริมาณการใช้งานเครือข่ายพร็อกซีเซิร์ฟเวอร์ HTTP ที่ ขอบเขต เครือข่ายส่วนตัวสามารถอำนวยความสะดวกในการสื่อสารสำหรับไคลเอนต์ที่ไม่มีที่อยู่ที่กำหนดเส้นทางได้ทั่วโลก โดยการส่งต่อข้อความไปยังเซิร์ฟเวอร์ภายนอก
|
||||
#h(1.7em) HTTP ถูกออกแบบมาเพื่ออนุญาตให้องค์ประกอบเครือข่ายตัวกลางสามารถปรับปรุงหรือเปิดใช้งานการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ เว็บไซต์ที่มีปริมาณการใช้งานสูงมักได้รับประโยชน์จาก เซิร์ฟเวอร์ แคชเว็บที่ส่งเนื้อหาแทนเซิร์ฟเวอร์ต้นทางเพื่อปรับปรุงเวลาตอบสนอง เว็บเบราว์เซอร์จะแคชทรัพยากรเว็บที่เข้าถึงก่อนหน้านี้และนำกลับมาใช้ซ้ำทุกครั้งที่ทำได้เพื่อลดปริมาณการใช้งานเครือข่ายพร็อกซีเซิร์ฟเวอร์ HTTP ที่ ขอบเขต เครือข่ายส่วนตัวสามารถอำนวยความสะดวกในการสื่อสารสำหรับไคลเอนต์ที่ไม่มีที่อยู่ที่กำหนดเส้นทางได้ทั่วโลก โดยการส่งต่อข้อความไปยังเซิร์ฟเวอร์ภายนอก
|
||||
|
||||
#i เพื่ออนุญาตให้โหนด HTTP ตัวกลาง (พร็อกซีเซิร์ฟเวอร์ แคชเว็บ ฯลฯ) ทำหน้าที่ของตนได้ ส่วนหัว HTTP บางส่วน (พบในคำขอ/การตอบสนอง HTTP) จะได้รับการจัดการแบบฮอปต่อฮอปในขณะที่ส่วนหัว HTTP อื่นๆ จะได้รับการจัดการแบบต้นทางถึงปลายทาง (จัดการโดยไคลเอนต์ต้นทางและเว็บเซิร์ฟเวอร์เป้าหมายเท่านั้น)
|
||||
#h(1.7em) เพื่ออนุญาตให้โหนด HTTP ตัวกลาง (พร็อกซีเซิร์ฟเวอร์ แคชเว็บ ฯลฯ) ทำหน้าที่ของตนได้ ส่วนหัว HTTP บางส่วน (พบในคำขอ/การตอบสนอง HTTP) จะได้รับการจัดการแบบฮอปต่อฮอปในขณะที่ส่วนหัว HTTP อื่นๆ จะได้รับการจัดการแบบต้นทางถึงปลายทาง (จัดการโดยไคลเอนต์ต้นทางและเว็บเซิร์ฟเวอร์เป้าหมายเท่านั้น)
|
||||
|
||||
#i ทรัพยากรบนเว็บจะถูกระบุตำแหน่งโดยตัวระบุทรัพยากรแบบสากล (URL) โดยใช้รูปแบบ Uniform Resource Identifier (URI) _http_ และ _https_ โดย URI จะถูกเข้ารหัสเป็นไฮเปอร์ลิงก์ในเอกสาร HTML เพื่อสร้างเอกสารไฮเปอร์เท็กซ์ที่เชื่อมโยงกัน
|
||||
#h(1.7em) ทรัพยากรบนเว็บจะถูกระบุตำแหน่งโดยตัวระบุทรัพยากรแบบสากล (URL) โดยใช้รูปแบบ Uniform Resource Identifier (URI) _http_ และ _https_ โดย URI จะถูกเข้ารหัสเป็นไฮเปอร์ลิงก์ในเอกสาร HTML เพื่อสร้างเอกสารไฮเปอร์เท็กซ์ที่เชื่อมโยงกัน
|
||||
|
||||
+30
-28
@@ -2,14 +2,15 @@
|
||||
|
||||
= เกณฑ์วิธีขนส่งข้อความหลายมิติแบบมั่นคง (Hypertext Transfer Protocol Secure; HTTPS)
|
||||
|
||||
#i เกณฑ์วิธีขนส่งข้อความหลายมิติแบบมั่นคง (Hypertext Transfer Protocol Secure; HTTPS)
|
||||
คือส่วนต่อขยายของโปรโตคอลเกณฑ์วิธีขนส่งข้อความหลายมิติ (Hypertext Transfer Protocol; HTTP)
|
||||
ซึ่งใช้การเข้ารหัสเพื่อการสื่อสารที่ปลอดภัยผ่านเครือข่ายคอมพิวเตอร์ และถูกใช้อย่างแพร่หลายบนอินเทอร์เน็ต
|
||||
โดยโปรโตคอลเครือข่าย HTTPS จะถูกเข้ารหัสด้วยเกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer
|
||||
Security; TLS) หรือก่อนหน้านี้คือเกณฑ์วิธีชั้นซ็อกเก็ตปลอดภัย (Secure Sockets Layer; SSL)
|
||||
ด้วยเหตุนั้น โปรโตคอลนี้สามารถเรียกด้วยชื่อ HTTP over TLS หรือ HTTP over SSL ได้เช่นกัน
|
||||
#h(1.7em) เกณฑ์วิธีขนส่งข้อความหลายมิติแบบมั่นคง (Hypertext Transfer Protocol Secure;
|
||||
HTTPS) คือส่วนต่อขยายของโปรโตคอลเกณฑ์วิธีขนส่งข้อความหลายมิติ (Hypertext Transfer
|
||||
Protocol; HTTP) ซึ่งใช้การเข้ารหัสเพื่อการสื่อสารที่ปลอดภัยผ่านเครือข่ายคอมพิวเตอร์
|
||||
และถูกใช้อย่างแพร่หลายบนอินเทอร์เน็ต โดยโปรโตคอลเครือข่าย HTTPS
|
||||
จะถูกเข้ารหัสด้วยเกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer Security; TLS)
|
||||
หรือก่อนหน้านี้คือเกณฑ์วิธีชั้นซ็อกเก็ตปลอดภัย (Secure Sockets Layer; SSL) ด้วยเหตุนั้น
|
||||
โปรโตคอลนี้สามารถเรียกด้วยชื่อ HTTP over TLS หรือ HTTP over SSL ได้เช่นกัน
|
||||
|
||||
#i แรงจูงใจหลักของ HTTPS คือการยืนยันตัวตนของเว็บไซต์ที่เข้าถึง
|
||||
#h(1.7em) แรงจูงใจหลักของ HTTPS คือการยืนยันตัวตนของเว็บไซต์ที่เข้าถึง
|
||||
และการปกป้องความเป็นส่วนตัวและความสมบูรณ์ของข้อมูลที่แลกเปลี่ยนระหว่างการรับส่งข้อมูล HTTPS
|
||||
ป้องกันการโจมตีแบบ man-in-the-middle
|
||||
และการเข้ารหัสบล็อกไซเฟอร์แบบสองทิศทางในการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์
|
||||
@@ -109,10 +110,9 @@ QUIC) ซึ่งเป็น HTTP เวอร์ชันใหม่ที
|
||||
คุกกี้บนเว็บไซต์ที่รันผ่าน HTTPS จะต้องเปิดใช้งานแอตทริบิวต์ secure ในเว็บไซต์ที่มีข้อมูลละเอียดอ่อน
|
||||
ผู้ใช้และเซสชันจะถูกเปิดเผยทุกครั้งที่เข้าถึงเว็บไซต์นั้นด้วย HTTP แทนที่จะเป็น HTTPS
|
||||
|
||||
#v(1em)
|
||||
#pagebreak()
|
||||
|
||||
== รายละเอียดทางเทคนิค
|
||||
#v(1em)
|
||||
|
||||
=== ความแตกต่างจาก HTTP
|
||||
|
||||
@@ -146,47 +146,49 @@ HTTP เริ่มต้นด้วย "http://" และใช้พอร
|
||||
โดยทั่วไปเว็บเบราว์เซอร์จะเผยแพร่รายชื่อใบรับรองการลงนามของผู้ออกใบรับรองหลักๆ
|
||||
เพื่อให้สามารถตรวจสอบใบรับรองที่ลงนามโดยผู้ออกใบรับรองเหล่านั้นได้
|
||||
|
||||
==== การขอใบรับรอง
|
||||
#iiii 1) การขอใบรับรอง
|
||||
|
||||
#iiiii มีผู้ให้บริการออกใบรับรองเชิงพาณิชย์จำนวนหนึ่งที่เสนอใบรับรอง SSL/TLS
|
||||
#h(8.7em) มีผู้ให้บริการออกใบรับรองเชิงพาณิชย์จำนวนหนึ่งที่เสนอใบรับรอง SSL/TLS
|
||||
แบบชำระเงินหลายประเภท รวมถึงใบรับรองการตรวจสอบขยาย
|
||||
|
||||
#iiiii Let's Encrypt เปิดตัวในเดือนเมษายน 2559 ให้บริการใบรับรอง#jb SSL/TLS
|
||||
#h(8.7em) Let's Encrypt เปิดตัวในเดือนเมษายน 2559 ให้บริการใบรับรอง SSL/TLS
|
||||
พื้นฐานแบบอัตโนมัติฟรีแก่เว็บไซต์ มูลนิธิ Electronic Frontier Foundation ระบุว่า Let's Encrypt
|
||||
จะทำให้การเปลี่ยนจาก HTTP เป็น HTTPS "ง่ายดายเพียงแค่ออกคำสั่งหรือคลิกปุ่ม"
|
||||
ปัจจุบันผู้ให้บริการเว็บโฮสต์และผู้ให้บริการคลาวด์ส่วนใหญ่ใช้ประโยชน์จาก Let's Encrypt
|
||||
เพื่อมอบใบรับรองฟรีให้กับลูกค้า
|
||||
|
||||
==== ใช้เป็นการควบคุมการเข้าถึง
|
||||
#pagebreak()
|
||||
|
||||
#iiiii
|
||||
#iiii 2) ใช้เป็นการควบคุมการเข้าถึง
|
||||
|
||||
#h(8.7em)
|
||||
ระบบนี้ยังสามารถใช้สำหรับการตรวจสอบสิทธิ์ไคลเอ็นต์เพื่อจำกัดการเข้าถึงเว็บเซิร์ฟเวอร์เฉพาะผู้ใช้ที่ได้รับอนุญาตเท่านั้น
|
||||
ในการดำเนินการนี้ ผู้ดูแลระบบเว็บไซต์มักจะสร้างใบรับรองสำหรับผู้ใช้แต่ละราย
|
||||
ซึ่งผู้ใช้จะโหลดใบรับรองลงในเบราว์เซอร์ โดยปกติใบรับรองจะมีชื่อและที่อยู่อีเมลของผู้ใช้ที่ได้รับอนุญาต
|
||||
และจะถูกตรวจสอบโดยเซิร์ฟเวอร์โดยอัตโนมัติในแต่ละการเชื่อมต่อเพื่อยืนยันตัวตนของผู้ใช้
|
||||
ซึ่งอาจไม่จำเป็นต้องใช้รหัสผ่านด้วยซ้ำ
|
||||
|
||||
==== ในกรณีที่คีย์ลับถูกบุกรุก
|
||||
#iiii 3) ในกรณีที่คีย์ลับถูกบุกรุก
|
||||
|
||||
#iiiii คุณสมบัติที่สำคัญในบริบทนี้คือการเข้ารหัสแบบส่งต่อที่สมบูรณ์แบบ (PFS)
|
||||
#h(8.7em) คุณสมบัติที่สำคัญในบริบทนี้คือการเข้ารหัสแบบส่งต่อที่สมบูรณ์แบบ (PFS)
|
||||
การมีคีย์ลับแบบอสมมาตรระยะยาวตัวใดตัวหนึ่งที่ใช้สร้างเซสชัน HTTPS
|
||||
ไม่น่าจะทำให้การได้มาซึ่งคีย์เซสชันระยะสั้นเพื่อถอดรหัสการสนทนาทำได้ง่ายขึ้น แม้ในภายหลังก็ตาม ในปี
|
||||
2013 มีเพียงการแลกเปลี่ยนคีย์ Diffie--Hellman (DHE) และการแลกเปลี่ยนคีย์ Diffie--Hellman
|
||||
แบบเส้นโค้งวงรี (ECDHE) เท่านั้นที่ทราบว่ามีคุณสมบัตินี้ ในปี 2013 มีเพียง 30% ของเซสชัน Firefox,
|
||||
Opera และ Chromium Browser เท่านั้นที่ใช้คุณสมบัตินี้ และเกือบ 0% ของเซสชัน Safari และ
|
||||
Microsoft Internet Explorer ของ Apple ที่ใช้คุณสมบัตินี้ TLS 1.3 ซึ่งเผยแพร่ในเดือนสิงหาคม
|
||||
2018 ได้ยกเลิกการสนับสนุนการเข้ารหัสแบบไม่มีการเข้ารหัสแบบส่งต่อ ณ เดือนกุมภาพันธ์ พ.ศ. 2562
|
||||
เว็บเซิร์ฟเวอร์ที่สำรวจ 96.6% รองรับการรักษาความลับแบบ Forward ในรูปแบบใดรูปแบบหนึ่ง และ
|
||||
52.1% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่ ณ เดือนกรกฎาคม พ.ศ. 2566
|
||||
เว็บเซิร์ฟเวอร์ที่สำรวจ 99.6% รองรับการรักษาความลับแบบ Forward ในรูปแบบใดรูปแบบหนึ่ง และ
|
||||
75.2% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่
|
||||
แบบเส้นโค้งวงรี#jb (ECDHE) เท่านั้นที่ทราบว่ามีคุณสมบัตินี้ ในปี 2013 มีเพียง 30% ของเซสชัน
|
||||
Firefox, Opera และ#jb Chromium Browser เท่านั้นที่ใช้คุณสมบัตินี้ และเกือบ 0% ของเซสชัน
|
||||
Safari และ Microsoft Internet Explorer ของ Apple ที่ใช้คุณสมบัตินี้ TLS 1.3
|
||||
ซึ่งเผยแพร่ในเดือนสิงหาคม 2018 ได้ยกเลิกการสนับสนุนการเข้ารหัสแบบไม่มีการเข้ารหัสแบบส่งต่อ ณ
|
||||
เดือนกุมภาพันธ์ พ.ศ. 2562 เว็บเซิร์ฟเวอร์ที่สำรวจ 96.6% รองรับการรักษาความลับแบบ Forward
|
||||
ในรูปแบบใดรูปแบบหนึ่ง และ 52.1% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่ ณ
|
||||
เดือนกรกฎาคม พ.ศ. 2566 เว็บเซิร์ฟเวอร์ที่สำรวจ 99.6% รองรับการรักษาความลับแบบ Forward
|
||||
ในรูปแบบใดรูปแบบหนึ่ง และ 75.2% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่
|
||||
|
||||
===== การเพิกถอนใบรับรอง
|
||||
#iiii 4) การเพิกถอนใบรับรอง
|
||||
|
||||
#iiiiii ใบรับรองอาจถูกเพิกถอนก่อนหมดอายุได้ เช่น เนื่องจากความลับของคีย์ส่วนตัวถูกละเมิด
|
||||
เบราว์เซอร์ยอดนิยมเวอร์ชันที่ใหม่พอเช่น Firefox Opera และ#jb Internet Explorer บน Windows
|
||||
#h(8.7em) ใบรับรองอาจถูกเพิกถอนก่อนหมดอายุได้ เช่น เนื่องจากความลับของคีย์ส่วนตัวถูกละเมิด
|
||||
เบราว์เซอร์ยอดนิยมเวอร์ชันที่ใหม่พอเช่น Firefox Opera และ Internet Explorer บน Windows
|
||||
Vista จะใช้ Online Certificate Status Protocol (OCSP) เพื่อตรวจสอบว่าไม่เป็นเช่นนั้น
|
||||
เบราว์เซอร์จะส่งหมายเลขซีเรียลของใบรับรองไปยังผู้ออกใบรับรองหรือผู้แทนผ่าน OCSP
|
||||
เบราว์เซอร์จะส่งหมายเลขซีเรียลของใบรับรองไปยังผู้ออกใบรับรองหรือผู้แทนผ่าน#jb OCSP
|
||||
และผู้ออกใบรับรองจะตอบกลับ โดยแจ้งให้เบราว์เซอร์ทราบว่าใบรับรองยังคงใช้ได้อยู่หรือไม่ นอกจากนี้ CA
|
||||
อาจออกรายการเพิกถอนใบรับรอง (Certificate Revocation List; CRL)
|
||||
เพื่อแจ้งให้ผู้ใช้ทราบว่าใบรับรองเหล่านี้ถูกเพิกถอนแล้ว อย่างไรก็ตาม CRL ไม่จำเป็นสำหรับฟอรัม
|
||||
|
||||
+6
-6
@@ -24,25 +24,25 @@
|
||||
|
||||
== ไมโครคอนโทรเลอร์ (Microcontroller)
|
||||
|
||||
#i ไมโครคอนโทรลเลอร์ (Microcontroller, MC, uC, หรือ #(sym.mu)C)
|
||||
#h(1.7em) ไมโครคอนโทรลเลอร์ (Microcontroller, MC, uC, หรือ #(sym.mu)C)
|
||||
หรือหน่วยไมโครคอนโทรลเลอร์ (Microcontroller Unit; MCU)
|
||||
เป็นคอมพิวเตอร์ขนาดเล็กบนวงจรรวมเดียว (Integrated Circuit; IC)
|
||||
โดยไมโครคอนโทรลเลอร์ประกอบด้วยแกนประมวลผลหนึ่งแกนหรือมากกว่า
|
||||
พร้อมด้วยหน่วยความจำและอุปกรณ์ต่อพ่วงอินพุต/เอาต์พุตที่ตั้งโปรแกรมได้
|
||||
หน่วยความจำโปรแกรมในรูปแบบของ NOR flash, OTP ROM, หรือ ferroelectric RAM
|
||||
มักจะถูกรวมไว้ในชิปด้วยเช่นกัน รวมถึง RAM จำนวนเล็กน้อย
|
||||
มักจะถูกรวมไว้ในชิปด้วยเช่นกัน รวมถึง RAM จำนวนเล็กน้อย#jb
|
||||
ไมโครคอนโทรลเลอร์ได้รับการออกแบบมาสำหรับการใช้งานแบบฝังตัว
|
||||
ซึ่งแตกต่างจากไมโครโปรเซสเซอร์ที่ใช้ในคอมพิวเตอร์ส่วนบุคคลหรือแอปพลิเคชันทั่วไปอื่น ๆ
|
||||
ที่ประกอบด้วยชิปแยกชิ้นต่าง ๆ
|
||||
|
||||
#i ในศัพท์สมัยใหม่ ไมโครคอนโทรลเลอร์นั้นคล้ายคลึงกับระบบบนชิป (System on a chip; SoC)
|
||||
แต่มีความซับซ้อนน้อยกว่า SoC อาจมีไมโครคอนโทรลเลอร์เป็นส่วนประกอบหนึ่ง
|
||||
#h(1.7em) ในศัพท์สมัยใหม่ ไมโครคอนโทรลเลอร์นั้นคล้ายคลึงกับระบบบนชิป (System on a chip;
|
||||
SoC) แต่มีความซับซ้อนน้อยกว่า SoC อาจมีไมโครคอนโทรลเลอร์เป็นส่วนประกอบหนึ่ง
|
||||
แต่โดยทั่วไปแล้วจะรวมเข้ากับอุปกรณ์ต่อพ่วงขั้นสูง เช่น หน่วยประมวลผลกราฟิก (GPU) โมดูล Wi-Fi
|
||||
หรือตัวประมวลผลร่วม (coprocessor) อย่างน้อยหนึ่งตัว
|
||||
|
||||
#i ไมโครคอนโทรลเลอร์ถูกนำไปใช้ในผลิตภัณฑ์และอุปกรณ์ควบคุมอัตโนมัติ เช่น
|
||||
#h(1.7em) ไมโครคอนโทรลเลอร์ถูกนำไปใช้ในผลิตภัณฑ์และอุปกรณ์ควบคุมอัตโนมัติ เช่น
|
||||
ระบบควบคุมเครื่องยนต์รถยนต์ อุปกรณ์ทางการแพทย์ที่ฝังในร่างกาย รีโมทคอนโทรล เครื่องใช้สำนักงาน
|
||||
เครื่องใช้ไฟฟ้า เครื่องมือไฟฟ้า ของเล่น และระบบฝังตัวอื่น ๆ
|
||||
เครื่องใช้ไฟฟ้า#jb เครื่องมือไฟฟ้า ของเล่น และระบบฝังตัวอื่น ๆ
|
||||
การลดขนาดและต้นทุนเมื่อเทียบกับการออกแบบที่ใช้ไมโครโปรเซสเซอร์ หน่วยความจำ
|
||||
และอุปกรณ์อินพุต/เอาต์พุตแยกต่างหาก ทำให้การควบคุมแบบดิจิทัลสำหรับอุปกรณ์และกระบวนการต่าง ๆ
|
||||
เป็นไปได้มากขึ้น ไมโครคอนโทรลเลอร์แบบผสมสัญญาณเป็นที่นิยม
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
ในบริบทของ Internet of Things (IoT) ไมโครคอนโทรลเลอร์เป็นวิธีการรวบรวมข้อมูล การตรวจจับ
|
||||
และการกระตุ้นโลกทางกายภาพในฐานะอุปกรณ์ปลายทางที่มีราคาประหยัดและเป็นที่นิยม
|
||||
|
||||
#i ไมโครคอนโทรลเลอร์บางตัวอาจใช้คำแบบสี่บิตและทำงานที่ความถี่ต่ำถึง 4 kHz เพื่อการใช้พลังงานต่ำ
|
||||
(มิลลิวัตต์หรือไมโครวัตต์หลักเดียว) โดยทั่วไปแล้ว
|
||||
#h(1.7em) ไมโครคอนโทรลเลอร์บางตัวอาจใช้คำแบบสี่บิตและทำงานที่ความถี่ต่ำถึง 4 kHz
|
||||
เพื่อการใช้พลังงานต่ำ (มิลลิวัตต์หรือไมโครวัตต์หลักเดียว) โดยทั่วไปแล้ว
|
||||
ไมโครคอนโทรลเลอร์เหล่านี้สามารถคงการทำงานไว้ได้ในขณะที่รอเหตุการณ์ เช่น
|
||||
การกดปุ่มหรือการขัดจังหวะอื่นๆ การใช้พลังงานขณะอยู่ในโหมดสลีป (โดยที่นาฬิกา CPU
|
||||
และอุปกรณ์ต่อพ่วงส่วนใหญ่ปิดอยู่) อาจอยู่ที่ระดับนาโนวัตต์เท่านั้น#jb
|
||||
@@ -164,7 +164,7 @@ IBM อ้างสิทธิ์ก่อนหน้านี้ คอมพ
|
||||
#iii ณ ปี 2008 มีผู้ขายและสถาปัตยกรรมไมโครคอนโทรลเลอร์จำนวนมาก รวมไปถึง:#jb
|
||||
|
||||
#[
|
||||
#set enum(indent: 5.5em)
|
||||
#set enum(indent: 4.1em)
|
||||
1. หน่วยประมวลผล ARM core โดยเฉพาะคอร์ประเภท ARM Cortex-M
|
||||
2. Microchip Technology Atmel AVR (8 บิต), AVR32 (32 บิต), และ AT91SAM (32 บิต)
|
||||
3. คอร์ M8C ของ Cypress Semiconductor's ที่ถูกใช้ใน Cypress PSoC ของพวกเขา
|
||||
@@ -193,7 +193,7 @@ IBM อ้างสิทธิ์ก่อนหน้านี้ คอมพ
|
||||
19. Toshiba TLCS-870 (8 บิต/16 บิต)
|
||||
]
|
||||
|
||||
#iiii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก
|
||||
#iii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก
|
||||
หรือเหมือนกับหน่วยประมวลผลเฉพาะแอปพลิเคชันมากกว่าไมโครคอนโทรลเลอร์
|
||||
ตลาดไมโครคอนโทรลเลอร์นั้นกระจัดกระจายเป็นอย่างมาก และมีผู้ขาย เทคโนโลยี และตลาดมากมาย
|
||||
และผู้ขายจำนวนมากขายหลายสถาปัตยกรรม
|
||||
@@ -207,16 +207,16 @@ dual-core หรือไมโครโปรเซสเซอร์ RISC-V
|
||||
ยังรวมส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF
|
||||
เครื่องขยายกำลัง เครื่องรับสัญญาณรบกวนต่ำ ตัวกรอง และโมดูลการจัดการพลังงาน
|
||||
|
||||
#v(0.5em)
|
||||
|
||||
#afigure(
|
||||
image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 2in),
|
||||
image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 1.5in),
|
||||
alt: "บอร์ดสีดำ มีพิน GPIO ด้านข้างและมีชิพอยู่บริเวณด้านบนบอร์ด",
|
||||
attr: [Popolon, CC BY-SA 4.0,
|
||||
https://commons.wikimedia.org/w/index.php?curid=112634884],
|
||||
caption: [บอร์ด NodeMCU ที่มี ESP32-C3-32S],
|
||||
)
|
||||
|
||||
#v(0.5em)
|
||||
|
||||
#iii โดยทั่วไปแล้ว ESP32
|
||||
จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์หรือนำเสนอเป็นส่วนหนึ่งของชุดการพัฒนาที่มีพินและตัวเชื่อมต่อ GPIO
|
||||
ที่หลากหลาย โดยมีการกำหนดค่าที่แตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ได้รับการออกแบบโดย Espressif
|
||||
@@ -267,7 +267,7 @@ things (IoT)
|
||||
#iiii Type คือ ประเภทของพาร์ทิชัน สามารถเป็น data หรือ app ได้
|
||||
|
||||
#[
|
||||
#set enum(indent: 9.25em)
|
||||
#set enum(indent: 7.55em)
|
||||
+ app คือพาร์ทิชันที่ใช้ในการเก็บแอปพลิเคชัน
|
||||
+ data คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป
|
||||
]
|
||||
@@ -277,10 +277,10 @@ things (IoT)
|
||||
#iiii SubType คือ ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน data และ app
|
||||
|
||||
#[
|
||||
#set enum(indent: 9.25em)
|
||||
#set enum(indent: 7.55em)
|
||||
1. data
|
||||
#listy(
|
||||
indent: 10.75em,
|
||||
indent: 8.8em,
|
||||
numbering: thai-numbering,
|
||||
[ota คือ พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update)
|
||||
โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB
|
||||
@@ -308,7 +308,7 @@ things (IoT)
|
||||
)
|
||||
2. app
|
||||
#listy(
|
||||
indent: 10.75em,
|
||||
indent: 8.8em,
|
||||
numbering: thai-numbering,
|
||||
[factory คือ พาร์ทิชันเก็บแอปพลิเคชันเริ่มต้น
|
||||
โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอปพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน
|
||||
|
||||
+21
-19
@@ -2,7 +2,7 @@
|
||||
|
||||
= การสื่อสารสนามใกล้ (Near-field communication; NFC)
|
||||
|
||||
#i การสื่อสารแบบใกล้สนาม (NFC)
|
||||
#h(1.7em) การสื่อสารแบบใกล้สนาม (NFC)
|
||||
คือชุดโปรโตคอลการสื่อสารที่ทำให้สามารถสื่อสารระหว่างอุปกรณ์อิเล็กทรอนิกส์สองเครื่องในระยะทาง 4 ซม.
|
||||
(#math.equation(alt: "1 เศษ 1 ส่วน 2", $1 1/2$) นิ้ว) หรือน้อยกว่า NFC
|
||||
นำเสนอการเชื่อมต่อความเร็วต่ำผ่านการตั้งค่าที่ง่ายดายซึ่งสามารถใช้สำหรับการบูตสแตรปของการเชื่อมต่อไร้สายที่สามารถใช้งานได้เช่นเดียวกับเทคโนโลยีการ์ดระยะใกล้อื่นๆ
|
||||
@@ -11,12 +11,12 @@ NFC มีพื้นฐานมาจากการเชื่อมต่
|
||||
ISM ที่ไม่มีใบอนุญาต ซึ่งใช้กันทั่วโลก สอดคล้องกับมาตรฐานอินเทอร์เฟซทางอากาศ ISO/IEC 18000-3
|
||||
ที่อัตราข้อมูลตั้งแต่ 106 ถึง 848 กิโลบิต/วินาที
|
||||
|
||||
#i ฟอรัม NFC
|
||||
#h(1.7em) ฟอรัม NFC
|
||||
ได้ช่วยกำหนดและส่งเสริมเทคโนโลยีโดยกำหนดมาตรฐานสำหรับการรับรองการปฏิบัติตามข้อกำหนดของอุปกรณ์การสื่อสารที่ปลอดภัยสามารถทำได้โดยใช้ขั้นตอนวิธีการเข้ารหัสเช่นเดียวกับที่ใช้กับบัตรเครดิตและหากตรงตามเกณฑ์สำหรับการพิจารณาให้เป็นเครือข่ายพื้นที่ส่วนบุคคล
|
||||
|
||||
== มาตราฐาน NFC
|
||||
|
||||
#iii มาตรฐาน NFC ครอบคลุมโปรโตคอลการสื่อสารและรูปแบบการแลกเปลี่ยนข้อมูล
|
||||
#h(4.2em) มาตรฐาน NFC ครอบคลุมโปรโตคอลการสื่อสารและรูปแบบการแลกเปลี่ยนข้อมูล
|
||||
และอิงตามมาตรฐานการระบุด้วยคลื่นความถี่วิทยุ (RFID) ที่มีอยู่ รวมถึง ISO/IEC 14443 และ FeliCa
|
||||
มาตรฐานเหล่านี้รวมถึง ISO/IEC 18092 และมาตรฐานที่กำหนดโดย NFC Forum นอกจาก NFC Forum
|
||||
แล้วกลุ่ม GSMA ยังได้กำหนดแพลตฟอร์มสำหรับการปรับใช้มาตรฐาน NFC ของ GSMA ภายในโทรศัพท์มือถือ
|
||||
@@ -26,19 +26,20 @@ ISM ที่ไม่มีใบอนุญาต ซึ่งใช้กั
|
||||
เพื่ออ่านแท็กอิเล็กทรอนิกส์หรือชำระเงินเมื่อเชื่อมต่อกับระบบที่รองรับ NFC
|
||||
สิ่งเหล่านี้เป็นมาตรฐานของโปรโตคอล NFC แทนที่เทคโนโลยีที่เป็นกรรมสิทธิ์ที่ใช้ในระบบก่อนหน้านี้
|
||||
|
||||
#iii โปรแกรมอนุญาตสิทธิ์สิทธิบัตรสำหรับ NFC กำลังอยู่ระหว่างการใช้งานโดย France Brevets
|
||||
#h(4.2em) โปรแกรมอนุญาตสิทธิ์สิทธิบัตรสำหรับ NFC กำลังอยู่ระหว่างการใช้งานโดย France Brevets
|
||||
ซึ่งเป็นกองทุนสิทธิบัตรที่จัดตั้งขึ้นในปี 2011 โปรแกรมนี้อยู่ระหว่างการพัฒนาโดย Via Licensing
|
||||
Corporation ซึ่งเป็นบริษัทสาขาอิสระของ Dolby Laboratories และยุติลงในเดือน#jb พฤษภาคม
|
||||
2012 ไลบรารี NFC แบบโอเพนซอร์สและอิสระต่อแพลตฟอร์ม libnfc มีให้บริการภายใต้ใบอนุญาต GNU
|
||||
Lesser General Public License (LGPL)
|
||||
|
||||
#iii แอปพลิเคชันปัจจุบันและที่คาดว่าจะมีในอนาคต ได้แก่ ธุรกรรมแบบไร้สัมผัส การแลกเปลี่ยนข้อมูล
|
||||
#h(4.2em) แอปพลิเคชันปัจจุบันและที่คาดว่าจะมีในอนาคต ได้แก่ ธุรกรรมแบบไร้สัมผัส การแลกเปลี่ยนข้อมูล
|
||||
และการตั้งค่าการสื่อสารที่ซับซ้อนมากขึ้น เช่น Wi-Fi ที่ง่าย
|
||||
ขึ้นนอกจากนี้เมื่ออุปกรณ์ที่เชื่อมต่อเครื่องหนึ่งมีการเชื่อมต่ออินเทอร์เน็ตอีกเครื่องหนึ่งก็สามารถแลกเปลี่ยนข้อมูลกับบริการออนไลน์ได้
|
||||
|
||||
== ออกแบบ
|
||||
|
||||
#iii NFC เป็นชุดเทคโนโลยีไร้สายระยะสั้น โดยทั่วไปต้องมีระยะห่าง 10 ซม. (#math.equation(
|
||||
#h(4.2em) NFC เป็นชุดเทคโนโลยีไร้สายระยะสั้น โดยทั่วไปต้องมีระยะห่าง 10 ซม.
|
||||
(#math.equation(
|
||||
alt: "3 เศษ 7 ส่วน 8",
|
||||
$3 7/8$,
|
||||
) นิ้ว) หรือน้อยกว่า NFC ทำงานที่ความถี่ 13.56 MHz บนอินเทอร์เฟซทางอากาศ ISO/IEC 18000-3
|
||||
@@ -47,14 +48,14 @@ Lesser General Public License (LGPL)
|
||||
มีรูปแบบที่เรียบง่ายมาก เช่น แท็ก สติกเกอร์ พวงกุญแจ
|
||||
หรือการ์ดที่ไม่ได้รับพลังงานการสื่อสารแบบเพียร์ทูเพียร์ของ NFC สามารถทำได้หากอุปกรณ์ทั้งสองมีพลังงาน
|
||||
|
||||
#iii แท็ก NFC มีข้อมูลและโดยทั่วไปเป็นแบบอ่านอย่างเดียว แต่อาจเขียนได้
|
||||
#h(4.2em) แท็ก NFC มีข้อมูลและโดยทั่วไปเป็นแบบอ่านอย่างเดียว แต่อาจเขียนได้
|
||||
ผู้ผลิตสามารถกำหนดรหัสเองได้ หรือใช้ข้อกำหนดของ NFC Forum
|
||||
แท็กสามารถจัดเก็บข้อมูลส่วนบุคคลอย่างปลอดภัย เช่น ข้อมูลบัตรเดบิตและบัตรเครดิต
|
||||
ข้อมูลโปรแกรมสะสมคะแนน รหัส PIN และรายชื่อผู้ติดต่อในเครือข่าย รวมถึงข้อมูลอื่นๆ NFC Forum
|
||||
กำหนดแท็กห้าประเภทที่มีความเร็วและความสามารถในการสื่อสารที่แตกต่างกันในแง่ของความสามารถในการกำหนดค่าหน่วยความจำ
|
||||
ความปลอดภัยการเก็บข้อมูลและความทนทานต่อการเขียน
|
||||
|
||||
#iii เช่นเดียวกับ เทคโนโลยี การ์ดแบบ Proximity NFC
|
||||
#h(4.2em) เช่นเดียวกับ เทคโนโลยี การ์ดแบบ Proximity NFC
|
||||
ใช้การเชื่อมต่อแบบเหนี่ยวนำระหว่างเสาอากาศแบบวงสองต้นที่อยู่ใกล้เคียงกัน
|
||||
ซึ่งก่อตัวเป็นหม้อแปลงแกนอากาศได้อย่างมีประสิทธิภาพเนื่องจากระยะทางที่เกี่ยวข้องนั้นน้อยมากเมื่อเทียบกับความยาวคลื่นของรังสีแม่เหล็กไฟฟ้า
|
||||
(คลื่นวิทยุ) ของความถี่นั้น (ประมาณ 22 เมตร) ปฏิสัมพันธ์นี้จึงถูกเรียกว่า สนามแม่เหล็กใกล้ (Near
|
||||
@@ -66,8 +67,9 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็
|
||||
13.56 MHz พลังงาน RF ส่วนใหญ่กระจุกตัวอยู่ในแบนด์วิดท์ ±7 kHz ที่จัดสรรให้กับย่านความถี่นั้น แต่
|
||||
ความกว้างสเปกตรัมของการแผ่รังสีอาจกว้างได้ถึง 1.8 MHz เพื่อรองรับอัตราข้อมูลสูง
|
||||
|
||||
#iii ระยะการทำงานด้วยเสาอากาศมาตรฐานขนาดกะทัดรัดและระดับพลังงานที่สมจริงอาจสูงถึงประมาณ 20
|
||||
ซม. (#math.equation(alt: "7 เศษ 7 ส่วน 8", $7 7/8$) นิ้ว) (แต่ในทางปฏิบัติ
|
||||
#h(4.2em)
|
||||
ระยะการทำงานด้วยเสาอากาศมาตรฐานขนาดกะทัดรัดและระดับพลังงานที่สมจริงอาจสูงถึงประมาณ 20 ซม.
|
||||
(#math.equation(alt: "7 เศษ 7 ส่วน 8", $7 7/8$) นิ้ว) (แต่ในทางปฏิบัติ
|
||||
ระยะการทำงานไม่ควรเกิน 10 ซม. หรือ #math.equation(alt: "3 เศษ 7 ส่วน 8", $3 7/8$)
|
||||
นิ้ว) โปรดทราบว่าเนื่องจากเสาอากาศรับสัญญาณอาจถูกดับในกระแสวนโดยพื้นผิวโลหะที่อยู่ใกล้เคียง
|
||||
แท็กอาจต้องแยกออกจากพื้นผิวดังกล่าวอย่างน้อยที่สุด
|
||||
@@ -77,7 +79,7 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็
|
||||
การสื่อสารเกิดขึ้นระหว่างอุปกรณ์ "ตัวเริ่มต้น" ที่ใช้งานอยู่และอุปกรณ์เป้าหมาย ซึ่งอาจเป็น
|
||||
|
||||
#[
|
||||
#set enum(indent: 5.5em)
|
||||
#set enum(indent: 4.2em)
|
||||
1. พาสซีฟ โดยอุปกรณ์ตัวเริ่มต้นจะทำหน้าที่เป็นสนามแม่เหล็กพาหะ
|
||||
และอุปกรณ์เป้าหมายจะสื่อสารโดยการปรับสนามแม่เหล็กตกกระทบ ในโหมดนี้
|
||||
อุปกรณ์เป้าหมายอาจดึงพลังงานจากสนามแม่เหล็กที่ตัวเริ่มต้นจัดหาให้
|
||||
@@ -97,7 +99,7 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็
|
||||
caption: [การเทียบความเร็วและวิธีการสื่อสารที่ใช้],
|
||||
)
|
||||
|
||||
#iii NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล
|
||||
#h(4.2em) NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล
|
||||
หากอุปกรณ์ที่ใช้งานอยู่ถ่ายโอนข้อมูลที่ความเร็ว 106 กิโลบิต/วินาที
|
||||
จะใช้การเข้ารหัสแบบมิลเลอร์ที่ปรับเปลี่ยนแล้วพร้อมการมอดูเลต 100
|
||||
เปอร์เซ็นต์ในกรณีอื่นๆทั้งหมดจะใช้การเข้ารหัสแบบแมนเชสเตอร์โดยมีอัตราการมอดูเลต 10 เปอร์เซ็นต์
|
||||
@@ -105,18 +107,18 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็
|
||||
#iii อุปกรณ์ NFC ที่ใช้งานอยู่ทุกเครื่องสามารถทำงานในโหมดใดโหมดหนึ่งหรือหลายโหมดได้
|
||||
|
||||
#[
|
||||
#set enum(indent: 5.5em)
|
||||
+ การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด
|
||||
#set enum(indent: 4.1em)
|
||||
1. การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด
|
||||
ช่วยให้ผู้ใช้ทำธุรกรรมต่างๆ เช่น การชำระเงินหรือการออกตั๋วได้ ดูการจำลองการ์ดโฮสต์
|
||||
+ เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC
|
||||
2. เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC
|
||||
ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้
|
||||
+ NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC
|
||||
3. NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC
|
||||
สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ
|
||||
]
|
||||
|
||||
แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb
|
||||
#iii แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb
|
||||
โดยทั่วไปจะมีข้อมูล (ณ ปี 2015 มีขนาดระหว่าง 96 ถึง 8,192 ไบต์)
|
||||
และเป็นแบบอ่านอย่างเดียวในการใช้งานปกติ แต่อาจเขียนซ้ำได้
|
||||
การใช้งานรวมถึงการจัดเก็บข้อมูลส่วนบุคคลที่ปลอดภัย (เช่นข้อมูล บัตร
|
||||
เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)\ แท็ก NFC
|
||||
สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม
|
||||
เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)#jb แท็ก
|
||||
NFC สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม
|
||||
|
||||
+23
-19
@@ -19,6 +19,8 @@ PIR เซ็นเซอร์ PIR มักใช้ในสัญญาณ
|
||||
caption: [เครื่องตรวจจับการเคลื่อนไหวแบบ PIR ทั่วไปสำหรับที่พักอาศัย/เชิงพาณิชย์],
|
||||
)
|
||||
|
||||
#v(0.5em)
|
||||
|
||||
#iii เซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว#jb ดังนั้น
|
||||
จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR"
|
||||
หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสซีฟ" เซ็นเซอร์ PIR
|
||||
@@ -117,7 +119,7 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
== การออกแบบผลิตภัณฑ์
|
||||
|
||||
#afigure(
|
||||
image("PIR/PIR_Motion_Sensor-Sensinova_(SN-PR11).png", height: image-height),
|
||||
image("PIR/PIR_Motion_Sensor-Sensinova_(SN-PR11).png", height: 1.75in),
|
||||
attr: [Versatile Techno -
|
||||
http://www.sensinova.in/pir-motion-sensor/SNPR11.php, CC BY-SA 4.0,
|
||||
https://commons.wikimedia.org/w/index.php?curid=48377787],
|
||||
@@ -125,6 +127,8 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
caption: [การออกแบบเซ็นเซอร์ตรวจจับการเคลื่อนไหว PIR],
|
||||
)
|
||||
|
||||
#v(1em)
|
||||
|
||||
#iiii โดยทั่วไปเซ็นเซอร์ PIR
|
||||
จะติดตั้งอยู่บนแผงวงจรพิมพ์ซึ่งมีอุปกรณ์อิเล็กทรอนิกส์ที่จำเป็นสำหรับการตีความสัญญาณจากตัวเซ็นเซอร์เอง
|
||||
โดยทั่วไปแล้วชุดประกอบทั้งหมดจะบรรจุอยู่ภายในตัวเรือน
|
||||
@@ -146,10 +150,10 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
#iiii ม่านพลาสติกอาจหล่อขึ้นรูปหลายเหลี่ยมเพื่อรวมพลังงานอินฟราเรดไปยังเซ็นเซอร์
|
||||
แต่ละเหลี่ยมคือเลนส์เฟรสเนล
|
||||
|
||||
=== เลนส์มัลติเฟรสเนลของ PIR
|
||||
#h(12em) 1) เลนส์มัลติเฟรสเนลของ PIR
|
||||
|
||||
#afigure(
|
||||
image("PIR/FacetLensOfMotionDetector_animation2.gif", height: 2in),
|
||||
image("PIR/FacetLensOfMotionDetector_animation2.gif", height: 1.75in),
|
||||
attr: [CC BY-SA 3.0, https://en.wikipedia.org/w/index.php?curid=14193664],
|
||||
alt: "เครื่องตรวจจับความเคลื่อนไหวทรงกระบอก",
|
||||
caption: [ตัวเรือนเครื่องตรวจจับความเคลื่อนไหว PIR
|
||||
@@ -184,7 +188,7 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
#iiii บางรุ่นผลิตขึ้นโดยใช้กระจกพาราโบลา แบบแบ่งส่วนภายใน เพื่อรวมพลังงานอินฟราเรด
|
||||
ในกรณีที่ใช้กระจก ฝาครอบกระจกพลาสติกโดยทั่วไปจะไม่มีเลนส์เฟรสเนลหล่อขึ้นรูป
|
||||
|
||||
#h(12em) 1) PIR ชนิดกระจกแบ่งส่วน
|
||||
#iiii 1) PIR ชนิดกระจกแบ่งส่วน
|
||||
|
||||
#afigure(
|
||||
image("PIR/Front-(mirror_type).jpg", height: 2in),
|
||||
@@ -248,23 +252,23 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
|
||||
#v(2em)
|
||||
|
||||
#h(9.75em) จากการโฟกัส ทำให้มุมมองของเครื่องตรวจจับกลายเป็นรูปแบบลำแสง ภายใต้มุมบางมุม
|
||||
(โซน) เซ็นเซอร์ PIR แทบจะไม่ได้รับพลังงานรังสีใด ๆ และภายใต้มุมอื่น ๆ PIR
|
||||
#h(8em) จากการโฟกัส ทำให้มุมมองของเครื่องตรวจจับกลายเป็นรูปแบบลำแสง ภายใต้มุมบางมุม (โซน)
|
||||
เซ็นเซอร์ PIR แทบจะไม่ได้รับพลังงานรังสีใด ๆ และภายใต้มุมอื่น ๆ PIR
|
||||
จะได้รับพลังงานอินฟราเรดในปริมาณที่เข้มข้น
|
||||
การแยกนี้ช่วยให้เครื่องตรวจจับความเคลื่อนไหวสามารถแยกแยะระหว่างแสงสว่างที่กว้างและวัตถุที่กำลังเคลื่อนที่ได้
|
||||
|
||||
#h(9.75em) เมื่อบุคคลเดินจากมุมหนึ่ง (ลำแสง) ไปยังอีกมุมหนึ่ง
|
||||
#h(8em) เมื่อบุคคลเดินจากมุมหนึ่ง (ลำแสง) ไปยังอีกมุมหนึ่ง
|
||||
เครื่องตรวจจับจะมองเห็นบุคคลที่กำลังเคลื่อนไหวเป็นระยะ ๆ เท่านั้น
|
||||
ส่งผลให้สัญญาณเซ็นเซอร์เปลี่ยนแปลงอย่างรวดเร็ว
|
||||
ซึ่งระบบอิเล็กทรอนิกส์จะใช้เพื่อส่งสัญญาณเตือนภัยหรือเปิดไฟ
|
||||
ระบบอิเล็กทรอนิกส์จะไม่สนใจสัญญาณที่เปลี่ยนแปลงช้า ๆ
|
||||
|
||||
#h(9.75em) จำนวน รูปร่าง การกระจาย และความไวของโซนเหล่านี้ถูกกำหนดโดยเลนส์และกระจก
|
||||
#h(8em) จำนวน รูปร่าง การกระจาย และความไวของโซนเหล่านี้ถูกกำหนดโดยเลนส์และกระจก
|
||||
ผู้ผลิตพยายามอย่างเต็มที่เพื่อสร้างรูปแบบลำแสงความไวที่เหมาะสมที่สุดสำหรับการใช้งานแต่ละประเภท
|
||||
|
||||
== การใช้งานระบบไฟอัตโนมัติ
|
||||
|
||||
#h(9.75em) เมื่อใช้เป็นส่วนหนึ่งของระบบไฟส่องสว่าง ระบบอิเล็กทรอนิกส์ใน PIR
|
||||
#h(8em) เมื่อใช้เป็นส่วนหนึ่งของระบบไฟส่องสว่าง ระบบอิเล็กทรอนิกส์ใน PIR
|
||||
มักจะควบคุมรีเลย์ในตัวที่สามารถสลับแรงดันไฟฟ้าหลักได้ ซึ่งหมายความว่า PIR
|
||||
สามารถตั้งค่าให้เปิดไฟที่เชื่อมต่อกับ PIR เมื่อตรวจพบการเคลื่อนไหวได้ วิธีนี้มักใช้ในสถานการณ์กลางแจ้ง
|
||||
ทั้งเพื่อป้องกันอาชญากร (ไฟรักษาความปลอดภัย) หรือเพื่อการใช้งานจริง เช่น
|
||||
@@ -275,18 +279,18 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
|
||||
== แอปพลิเคชั่นด้านความปลอดภัย
|
||||
|
||||
#h(9.75em) เมื่อใช้เป็นส่วนหนึ่งของระบบรักษาความปลอดภัย วงจรอิเล็กทรอนิกส์ใน PIR
|
||||
มักจะควบคุมรีเลย์ ขนาดเล็ก รีเลย์นี้จะทำหน้าที่เชื่อมต่อวงจรไฟฟ้าผ่านหน้า
|
||||
#h(8em) เมื่อใช้เป็นส่วนหนึ่งของระบบรักษาความปลอดภัย วงจรอิเล็กทรอนิกส์ใน PIR มักจะควบคุมรีเลย์
|
||||
ขนาดเล็ก รีเลย์นี้จะทำหน้าที่เชื่อมต่อวงจรไฟฟ้าผ่านหน้า
|
||||
สัมผัสไฟฟ้าคู่หนึ่งที่เชื่อมต่อกับโซนอินพุตตรวจจับของแผงควบคุมสัญญาณกันขโมยโดยทั่วไประบบจะออกแบบให้หากไม่มีการเคลื่อนไหว
|
||||
หน้าสัมผัสรีเลย์จะปิดอยู่ ซึ่งเรียกว่ารีเลย์แบบ 'ปกติปิด' (NC) หากตรวจพบการเคลื่อนไหว
|
||||
รีเลย์จะเปิดวงจรเพื่อส่งสัญญาณเตือนภัย หรือหากสายไฟถูกตัดการเชื่อมต่อ สัญญาณเตือนภัยก็จะทำงานเช่นกัน
|
||||
|
||||
== การจัดวาง
|
||||
|
||||
#h(9.75em) ผู้ผลิตแนะนำให้วางผลิตภัณฑ์อย่างระมัดระวังเพื่อป้องกันการแจ้งเตือนที่ผิดพลาด (เช่น
|
||||
#h(8em) ผู้ผลิตแนะนำให้วางผลิตภัณฑ์อย่างระมัดระวังเพื่อป้องกันการแจ้งเตือนที่ผิดพลาด (เช่น
|
||||
การตรวจจับใดๆ ที่ไม่ได้เกิดจากผู้บุกรุก)
|
||||
|
||||
#h(9.75em) พวกเขาแนะนำให้ติดตั้ง PIR ในลักษณะที่ PIR ไม่สามารถ "มองเห็น" ออกจากหน้าต่างได้
|
||||
#h(8em) พวกเขาแนะนำให้ติดตั้ง PIR ในลักษณะที่ PIR ไม่สามารถ "มองเห็น" ออกจากหน้าต่างได้
|
||||
แม้ว่าความยาวคลื่นของรังสีอินฟราเรดที่ชิปมีความไวต่อแสงจะทะลุผ่านกระจกได้ไม่ดีนัก
|
||||
แต่แหล่งกำเนิดแสงอินฟราเรดที่แรง (เช่น จากไฟหน้ารถยนต์หรือแสงแดด)
|
||||
อาจทำให้เซ็นเซอร์รับภาพเกินพิกัดและทำให้เกิดสัญญาณเตือนภัยผิดพลาดได้
|
||||
@@ -294,15 +298,15 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
ซึ่งอาจเป็นผลดีสำหรับหน้าต่างที่หันหน้าไปทางทางเท้าสาธารณะ
|
||||
หรือเป็นผลเสียสำหรับหน้าต่างในฉากกั้นภายใน
|
||||
|
||||
#h(9.75em) ขอแนะนำว่าไม่ควรติดตั้ง PIR ในตำแหน่งที่ ช่องระบายอากาศ HVAC
|
||||
#h(8em) ขอแนะนำว่าไม่ควรติดตั้ง PIR ในตำแหน่งที่ ช่องระบายอากาศ HVAC
|
||||
จะเป่าลมร้อนหรือเย็นลงบนพื้นผิวพลาสติกที่ปิดหน้าต่างของตัวบ้าน แม้ว่าอากาศจะมีค่าการแผ่รังสี ต่ำมาก#jb
|
||||
(ปล่อยพลังงานอินฟราเรดในปริมาณน้อยมาก)
|
||||
แต่ลมที่พัดผ่านฝาครอบหน้าต่างพลาสติกอาจทำให้อุณหภูมิของพลาสติกเปลี่ยนแปลงจนทำให้เกิดสัญญาณเตือนที่ผิดพลาดได้
|
||||
|
||||
#h(9.75em) เซ็นเซอร์มักได้รับการออกแบบมาให้ "เพิกเฉย" สัตว์เลี้ยงในบ้าน เช่น สุนัขหรือแมว
|
||||
#h(8em) เซ็นเซอร์มักได้รับการออกแบบมาให้ "เพิกเฉย" สัตว์เลี้ยงในบ้าน เช่น สุนัขหรือแมว
|
||||
โดยการตั้งค่าความไวให้สูงขึ้น หรือทำให้แน่ใจว่าพื้นห้องจะไม่อยู่ในโฟกัส
|
||||
|
||||
#h(9.75em) เนื่องจากเซ็นเซอร์ PIR มีระยะการทำงานสูงสุด 10 เมตร (30 ฟุต)
|
||||
#h(8em) เนื่องจากเซ็นเซอร์ PIR มีระยะการทำงานสูงสุด 10 เมตร (30 ฟุต)
|
||||
ดังนั้นการติดตั้งเครื่องตรวจจับเพียงตัวเดียวใกล้ทางเข้าจึงเพียงพอสำหรับห้องที่มีทางเข้าเพียงทางเดียว
|
||||
ระบบรักษาความปลอดภัยที่ใช้ PIR
|
||||
ยังใช้งานได้ดีกับระบบรักษาความปลอดภัยภายนอกอาคารและระบบไฟที่ไวต่อการเคลื่อนไหว
|
||||
@@ -310,9 +314,9 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
|
||||
== เทอร์โมมิเตอร์แบบควบคุมระยะไกลด้วย PIR
|
||||
|
||||
#h(9.75em) มีการออกแบบวงจร PIR ที่ใช้วัดอุณหภูมิของวัตถุที่อยู่ห่างไกลในวงจรดังกล่าว#jb
|
||||
จะใช้เอาต์พุต PIR แบบไม่มีค่าความแตกต่าง สัญญาณเอาต์พุตจะถูกประเมินตามการสอบเทียบ#jb สเปกตรัม
|
||||
IR ของสสารชนิดเฉพาะที่ต้องการตรวจวัด ด้วยวิธีนี้ การวัดอุณหภูมิจากระยะไกลจึงค่อนข้างแม่นยำและแม่นยำ
|
||||
#h(8em) มีการออกแบบวงจร PIR ที่ใช้วัดอุณหภูมิของวัตถุที่อยู่ห่างไกลในวงจรดังกล่าว#jb จะใช้เอาต์พุต
|
||||
PIR แบบไม่มีค่าความแตกต่าง สัญญาณเอาต์พุตจะถูกประเมินตามการสอบเทียบ#jb สเปกตรัม IR
|
||||
ของสสารชนิดเฉพาะที่ต้องการตรวจวัด ด้วยวิธีนี้ การวัดอุณหภูมิจากระยะไกลจึงค่อนข้างแม่นยำและแม่นยำ
|
||||
หากไม่มีการสอบเทียบกับชนิดของวัสดุที่ตรวจวัด อุปกรณ์เทอร์โมมิเตอร์ PIR
|
||||
จะสามารถวัดการเปลี่ยนแปลงของการแผ่รังสี IR ซึ่งสอดคล้องกับการเปลี่ยนแปลงของอุณหภูมิโดยตรง
|
||||
แต่ไม่สามารถคำนวณค่าอุณหภูมิที่แท้จริงได้
|
||||
|
||||
@@ -3,28 +3,28 @@
|
||||
|
||||
= เซนเซอร์ (Sensors)
|
||||
|
||||
#i โดยทั่วไปแล้ว เซนเซอร์จะถูกนิยามว่าเป็นอุปกรณ์ที่รับและตอบสนองต่อสัญญาณหรือสิ่งเร้าสิ่งเร้าคือปริมาณ
|
||||
#h(1.7em) โดยทั่วไปแล้ว เซนเซอร์จะถูกนิยามว่าเป็นอุปกรณ์ที่รับและตอบสนองต่อสัญญาณหรือสิ่งเร้าสิ่งเร้าคือปริมาณ
|
||||
คุณสมบัติ หรือสภาวะที่ถูกตรวจจับและแปลงเป็นสัญญาณไฟฟ้า
|
||||
|
||||
#i ในความหมายกว้างที่สุด เซนเซอร์คืออุปกรณ์ โมดูล เครื่องจักร
|
||||
#h(1.7em) ในความหมายกว้างที่สุด เซนเซอร์คืออุปกรณ์ โมดูล เครื่องจักร
|
||||
หรือระบบย่อยที่ตรวจจับเหตุการณ์หรือการเปลี่ยนแปลงในสภาพแวดล้อม
|
||||
และส่งข้อมูลไปยังอุปกรณ์อิเล็กทรอนิกส์อื่นๆ ซึ่งส่วนใหญ่มักจะเป็นหน่วยประมวลผลของคอมพิวเตอร์
|
||||
|
||||
#i เซ็นเซอร์ถูกนำมาใช้ในสิ่งของในชีวิตประจำวัน เช่น ปุ่มลิฟต์แบบสัมผัส (เซ็นเซอร์สัมผัส)
|
||||
#h(1.7em) เซ็นเซอร์ถูกนำมาใช้ในสิ่งของในชีวิตประจำวัน เช่น ปุ่มลิฟต์แบบสัมผัส (เซ็นเซอร์สัมผัส)
|
||||
และโคมไฟที่หรี่หรือสว่างขึ้นโดยการสัมผัสที่ฐาน
|
||||
และในแอปพลิเคชันมากมายนับไม่ถ้วนซึ่งคนส่วนใหญ่ไม่เคยตระหนักถึง
|
||||
ด้วยความก้าวหน้าในด้านไมโครแมชชีนเนอรี่ และแพลตฟอร์ม
|
||||
ไมโครคอนโทรลเลอร์ที่ใช้งานง่ายการใช้งานเซ็นเซอร์จึงขยายออกไปนอกเหนือจากสาขาแบบดั้งเดิมของการวัดอุณหภูมิ
|
||||
ความดัน และการไหลตัวอย่างเช่น ไปสู่เซ็นเซอร์ MARG
|
||||
|
||||
#i เซ็นเซอร์แบบอนาล็อก เช่นโพเทนชิโอมิเตอร์และตัวต้านทานรับแรงยังคงมีการใช้งานอย่างแพร่หลาย
|
||||
#h(1.7em) เซ็นเซอร์แบบอนาล็อก เช่นโพเทนชิโอมิเตอร์และตัวต้านทานรับแรงยังคงมีการใช้งานอย่างแพร่หลาย
|
||||
การใช้งานของเซ็นเซอร์เหล่านี้รวมถึงการผลิตและเครื่องจักร เครื่องบินและอวกาศ รถยนต์ การแพทย์
|
||||
หุ่นยนต์และอีกหลายแง่มุมในชีวิตประจำวันของเรา นอกจากนี้ยังมีเซ็นเซอร์อื่นๆ
|
||||
อีกมากมายที่ใช้วัดคุณสมบัติทางเคมีและกายภาพของวัสดุ รวมถึงเซ็นเซอร์แบบออปติคอลสำหรับการวัดดัชนีหักเห
|
||||
เซ็นเซอร์แบบสั่นสะเทือนสำหรับการวัดความหนืดของของเหลว
|
||||
และเซ็นเซอร์ทางเคมีไฟฟ้าสำหรับการตรวจสอบค่า pH ของของเหลว
|
||||
|
||||
#i ความไวของเซนเซอร์บ่งชี้ว่าเอาต์พุตเปลี่ยนแปลงไปมากน้อยเพียงใดเมื่อปริมาณอินพุตที่วัดเปลี่ยนแปลง
|
||||
#h(1.7em) ความไวของเซนเซอร์บ่งชี้ว่าเอาต์พุตเปลี่ยนแปลงไปมากน้อยเพียงใดเมื่อปริมาณอินพุตที่วัดเปลี่ยนแปลง
|
||||
ตัวอย่างเช่น หากปรอทในเทอร์โมมิเตอร์เคลื่อนที่ 1 ซม. เมื่ออุณหภูมิเปลี่ยนแปลง#jb 1 °C
|
||||
ความไวของมันคือ 1 ซม./°C (โดยพื้นฐานแล้วคือความชัน dy/dx โดยสมมติว่ามีลักษณะเชิงเส้น)#jb
|
||||
เซนเซอร์บางชนิดอาจส่งผลต่อสิ่งที่วัดได้เช่นกัน ตัวอย่างเช่น
|
||||
@@ -32,7 +32,7 @@
|
||||
โดยทั่วไปเซนเซอร์ได้รับการออกแบบให้มีผลกระทบต่อสิ่งที่วัดน้อยที่สุด
|
||||
การทำให้เซนเซอร์มีขนาดเล็กลงมักจะช่วยปรับปรุงสิ่งนี้และอาจนำมาซึ่งข้อดีอื่นๆ
|
||||
|
||||
#i ความก้าวหน้าทางเทคโนโลยีทำให้สามารถผลิตเซ็นเซอร์ได้มากขึ้นเรื่อย ๆ ในระดับจุลภาคเช่น
|
||||
#h(1.7em) ความก้าวหน้าทางเทคโนโลยีทำให้สามารถผลิตเซ็นเซอร์ได้มากขึ้นเรื่อย ๆ ในระดับจุลภาคเช่น
|
||||
ไมโครเซ็นเซอร์โดยใช้เทคโนโลยี MEMS ในกรณีส่วนใหญ่
|
||||
ไมโครเซ็นเซอร์สามารถวัดได้เร็วกว่าและมีความไวสูงกว่าเมื่อเทียบกับวิธีการแบบมหภาคเนื่องจากความต้องการข้อมูลที่รวดเร็ว
|
||||
ราคาไม่แพง#jb และเชื่อถือได้เพิ่มมากขึ้นในโลกปัจจุบัน เซ็นเซอร์แบบใช้แล้วทิ้ง
|
||||
|
||||
+22
-15
@@ -3,22 +3,22 @@
|
||||
|
||||
= เกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer Security; TLS)
|
||||
|
||||
#i
|
||||
#h(1.7em)
|
||||
เกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer Security; TLS)
|
||||
เป็นโปรโตคอลการเข้ารหัสที่ออกแบบมาเพื่อรักษาความปลอดภัยการสื่อสารบนเครือข่ายคอมพิวเตอร์เช่นอินเทอร์เน็ตโปรโตคอลนี้ถูกใช้อย่างแพร่หลายในแอปพลิเคชันต่างๆเช่นอีเมลการส่งข้อความโต้ตอบแบบทันทีและบริการเสียงผ่าน
|
||||
IP แต่การใช้งานเพื่อรักษาความปลอดภัย HTTPS ยังคงเป็นที่เปิดเผยต่อสาธารณะมากที่สุด
|
||||
|
||||
#i โปรโตคอล TLS มีวัตถุประสงค์หลักเพื่อรักษาความปลอดภัย รวมถึงความเป็นส่วนตัว (ความลับ)
|
||||
#h(1.7em) โปรโตคอล TLS มีวัตถุประสงค์หลักเพื่อรักษาความปลอดภัย รวมถึงความเป็นส่วนตัว (ความลับ)
|
||||
ความสมบูรณ์ และความถูกต้อง ผ่านการใช้การเข้ารหัสเช่น
|
||||
การใช้ใบรับรองระหว่างแอปพลิเคชันคอมพิวเตอร์ที่สื่อสารกันตั้งแต่สองแอปพลิเคชันขึ้นไป
|
||||
โปรโตคอลนี้ทำงานในเลเยอร์การนำเสนอและประกอบด้วยสองชั้น ได้แก่ ระเบียน TLS และโปรโตคอล TLS
|
||||
handshake
|
||||
|
||||
#i Datagram Transport Layer Security (DTLS)
|
||||
#h(1.7em) Datagram Transport Layer Security (DTLS)
|
||||
ซึ่งเป็นโปรโตคอลการสื่อสารที่เกี่ยวข้องอย่างใกล้ชิดมอบความปลอดภัยให้กับ แอปพลิเคชันที่ใช้
|
||||
ดาต้าแกรมในงานเขียนทางเทคนิค มักพบการอ้างอิงถึง "(D)TLS" เมื่อใช้กับทั้งสองเวอร์ชัน
|
||||
|
||||
#i TLS เป็นมาตรฐานที่ได้รับการเสนอโดย Internet Engineering Task Force (IETF)
|
||||
#h(1.7em) TLS เป็นมาตรฐานที่ได้รับการเสนอโดย Internet Engineering Task Force (IETF)
|
||||
ซึ่งกำหนดขึ้นครั้งแรกในปี 1999 และเวอร์ชันปัจจุบันคือ TLS 1.3 ซึ่งกำหนดขึ้นในเดือนสิงหาคม 2018 TLS
|
||||
สร้างขึ้นจาก ข้อกำหนด SSL (Secure Sockets Layer) ที่ไม่รองรับอีกต่อไป (1994, 1995, 1996)
|
||||
ซึ่งพัฒนาโดย Netscape Communications เพื่อเพิ่มโปรโตคอล HTTPS ลงในเว็บเบราว์เซอร์ Netscape
|
||||
@@ -41,23 +41,30 @@ Navigator
|
||||
ซึ่งการสื่อสารต่อไปจะถูกเข้ารหัสโดยใช้รหัสแบบสมมาตรในระหว่างการจับมือนี้
|
||||
ไคลเอนต์และเซิร์ฟเวอร์จะตกลงกันเกี่ยวกับพารามิเตอร์ต่างๆ ที่ใช้สร้างความปลอดภัยของการเชื่อมต่อ
|
||||
|
||||
#block(inset: (left: 6em))[
|
||||
+ การจับมือเริ่มต้นเมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS
|
||||
#[
|
||||
#set enum(indent: 4.1em)
|
||||
1. การจับมือเริ่มต้นเมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS
|
||||
เพื่อขอการเชื่อมต่อที่ปลอดภัยและไคลเอนต์แสดงรายการชุดรหัสที่รองรับ (รหัสและฟังก์ชันแฮช)
|
||||
+ จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ
|
||||
+ โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง
|
||||
2. จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ
|
||||
และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ
|
||||
3. โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง
|
||||
(CA) ที่เชื่อถือได้ซึ่งรับรองความถูกต้องของใบรับรอง และคีย์การเข้ารหัสสาธารณะของเซิร์ฟเวอร์
|
||||
+ ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ
|
||||
+ ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้
|
||||
+ เข้ารหัสตัวเลขสุ่ม (PreMasterSecret)
|
||||
4. ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ
|
||||
5. ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้
|
||||
|
||||
#listy(
|
||||
indent: 5.4em,
|
||||
numbering: thai-numbering,
|
||||
[เข้ารหัสตัวเลขสุ่ม (PreMasterSecret)
|
||||
ด้วยคีย์สาธารณะของเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังเซิร์ฟเวอร์
|
||||
(ซึ่งเฉพาะเซิร์ฟเวอร์เท่านั้นที่จะสามารถถอดรหัสด้วยคีย์ส่วนตัว)
|
||||
จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ
|
||||
+ ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี)
|
||||
จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ],
|
||||
[ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี)
|
||||
เพื่อสร้างคีย์เซสชันแบบสุ่มและไม่ซ้ำกันอย่างปลอดภัยสำหรับการเข้ารหัสและถอดรหัส
|
||||
ซึ่งมีคุณสมบัติเพิ่มเติมของการปกปิดแบบส่งต่อ โดยหากคีย์ส่วนตัวของเซิร์ฟเวอร์ถูกเปิดเผยในอนาคต
|
||||
จะไม่สามารถใช้คีย์นั้นเพื่อถอดรหัสเซสชันปัจจุบันได้
|
||||
แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม
|
||||
แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม],
|
||||
)
|
||||
]
|
||||
|
||||
#iii
|
||||
@@ -75,7 +82,7 @@ TLS จะล้มเหลวและการเชื่อมต่อจ
|
||||
และเซิร์ฟเวอร์ (เช่น wikipedia.org) จะมีคุณสมบัติทั้งหมดดังต่อไปนี้
|
||||
|
||||
#[
|
||||
#set enum(indent: 6em)
|
||||
#set enum(indent: 4.1em)
|
||||
1. การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้
|
||||
อัลกอริทึมคีย์แบบสมมาตรในการเข้ารหัสข้อมูลที่ส่ง
|
||||
คีย์สำหรับการเข้ารหัสแบบสมมาตรนี้จะถูกสร้างขึ้นอย่างเฉพาะเจาะจงสำหรับแต่ละการเชื่อมต่อ
|
||||
|
||||
+18
-13
@@ -28,19 +28,24 @@ Notation One (ASN.1)
|
||||
|
||||
#iiii โครงสร้างของใบรับรองดิจิทัล X.509 v3 มีดังนี้
|
||||
|
||||
#block(inset: (left: 9.25em))[
|
||||
+ ใบรับรอง
|
||||
+ หมายเลขเวอร์ชัน
|
||||
+ หมายเลขซีเรียล
|
||||
+ รหัสอัลกอริทึมลายเซ็น
|
||||
+ ชื่อผู้ออก
|
||||
+ ระยะเวลาใช้งาน โดยระบุเวลาไม่ก่อนและไม่หลังจากนั้น
|
||||
+ ชื่อเรื่อง
|
||||
+ ข้อมูลคีย์สาธารณะของเรื่อง ได้แก่ อัลกอริทึมคีย์สาธารณะ
|
||||
#[
|
||||
#set enum(indent: 7.55em)
|
||||
1. ใบรับรอง
|
||||
#listy(
|
||||
indent: 8.9em,
|
||||
numbering: thai-numbering,
|
||||
[หมายเลขเวอร์ชัน],
|
||||
[หมายเลขซีเรียล],
|
||||
[รหัสอัลกอริทึมลายเซ็น],
|
||||
[ชื่อผู้ออก],
|
||||
[ระยะเวลาใช้งาน โดยระบุเวลาไม่ก่อนและไม่หลังจากนั้น],
|
||||
[ชื่อเรื่อง],
|
||||
[ข้อมูลคีย์สาธารณะของเรื่อง ได้แก่ อัลกอริทึมคีย์สาธารณะ
|
||||
คีย์สาธารณะของเรื่องเช่นรหัสประจำตัวผู้ออก (ไม่จำเป็น) รหัสประจำตัวเฉพาะเรื่อง (ไม่จำเป็น)
|
||||
ส่วนขยาย (ไม่จำเป็น)
|
||||
+ อัลกอริทึมลายเซ็นใบรับรอง
|
||||
+ ลายเซ็นใบรับรอง
|
||||
ส่วนขยาย (ไม่จำเป็น)],
|
||||
)
|
||||
2. อัลกอริทึมลายเซ็นใบรับรอง
|
||||
3. ลายเซ็นใบรับรอง
|
||||
]
|
||||
|
||||
#iiii ฟิลด์ส่วนขยาย (ถ้ามี) จะเป็นลำดับของส่วนขยายใบรับรองอย่างน้อยหนึ่งรายการ
|
||||
@@ -73,7 +78,7 @@ Notation One (ASN.1)
|
||||
มีหลายประเภทนามสกุลไฟล์เหล่านี้ยังใช้สำหรับข้อมูลอื่น ๆ เช่น คีย์ส่วนตัวด้วย
|
||||
|
||||
#[
|
||||
#set enum(indent: 9.25em)
|
||||
#set enum(indent: 7.55em)
|
||||
1. `.pem` -- (อีเมลอิเล็กทรอนิกส์ที่เพิ่มความเป็นส่วนตัว) ใบรับรอง DER ที่เข้ารหัส Base64
|
||||
แนบระหว่าง `-----BEGIN CERTIFICATE-----` และ `-----END CERTIFICATE-----`
|
||||
2. `.cer`, `.crt`, `.der` -- โดยปกติจะอยู่ในรูปแบบไบนารี DER แต่ใบรับรองที่เข้ารหัส
|
||||
|
||||
Reference in New Issue
Block a user