การพอร์ต
ในการพัฒนาซอฟต์แวร์การพอร์ตคือกระบวนการปรับซอฟต์แวร์ให้ทำงานในบริบทที่แตกต่างกัน บ่อยครั้งเกี่ยวข้องกับการแก้ไขซอร์สโค้ดเพื่อให้โปรแกรมสามารถทำงานบนแพลตฟอร์ม ที่แตกต่างกัน (เช่น บนCPUหรือระบบปฏิบัติการ ที่แตกต่างกัน ) หรือในสภาพแวดล้อมที่แตกต่างกัน (เช่น ด้วยไลบรารีหรือเฟรมเวิร์ก ที่แตกต่างกัน ) นอกจากนี้ยังอธิบายถึงการปรับเปลี่ยนหรือคุณสมบัติจากโค้ดเบส หนึ่ง ไปยังอีก โค้ดเบสหนึ่ง แม้กระทั่งระหว่างเวอร์ชันที่แตกต่างกันของซอฟต์แวร์เดียวกัน[ 1 ]
ซอฟต์แวร์จะถูกจัดว่าเป็นซอฟต์แวร์พกพาได้ หากสามารถนำไปใช้งานในบริบทที่แตกต่างกันได้โดยไม่ต้องเปลี่ยนแปลงซอร์สโค้ด อาจถือได้ว่าเป็นซอฟต์แวร์พกพาได้หากต้นทุนในการปรับให้เข้ากับบริบทใหม่นั้นต่ำกว่าต้นทุนในการเขียนใหม่ทั้งหมดอย่างมีนัยสำคัญ ยิ่งต้นทุนในการพอร์ตต่ำกว่าต้นทุนในการเขียนใหม่มากเท่าใด ก็ยิ่งกล่าวได้ว่าซอฟต์แวร์นั้นพกพาได้มากขึ้นเท่านั้น ความพยายามในการพอร์ตขึ้นอยู่กับหลายปัจจัย รวมถึงขอบเขตที่บริบทเดิมแตกต่างจากบริบทใหม่ ทักษะของโปรแกรมเมอร์ และความสามารถในการพอร์ตของโค้ดเบส
นิรุกติศาสตร์
คำว่า "พอร์ต" มาจากภาษาละตินportāreซึ่งหมายถึง "การพกพา" [ 2 ]เมื่อโค้ดไม่เข้ากันกับระบบปฏิบัติการหรือสถาปัตยกรรม เฉพาะ โค้ดจะต้อง "ถูกพกพา" ไปยังระบบใหม่
ประวัติศาสตร์
จำนวนซีพียูและระบบปฏิบัติการที่แตกต่างกันอย่างมีนัยสำคัญที่ใช้ในคอมพิวเตอร์เดสก์ท็อปในปัจจุบันนั้นน้อยกว่าในอดีตมาก การครองตลาดของสถาปัตยกรรมx86 หมายความว่าซอฟต์แวร์เดสก์ท็อปส่วนใหญ่ไม่เคยถูกพอร์ตไปยังซีพียูอื่น ในตลาดเดียวกันนี้ ตัวเลือกของระบบปฏิบัติการจึงลดลงเหลือเพียงสามระบบ ได้แก่Microsoft Windows , macOSและLinuxอย่างไรก็ตามใน ตลาด ระบบฝังตัวและอุปกรณ์พกพา ความสามารถในการพอร์ตยังคงเป็นประเด็นสำคัญ โดยARMเป็นทางเลือกที่ใช้กันอย่างแพร่หลาย
มาตรฐานสากล เช่น มาตรฐานที่ประกาศใช้โดยISOช่วยอำนวยความสะดวกในการพอร์ตซอฟต์แวร์อย่างมาก โดยระบุรายละเอียดของสภาพแวดล้อมการประมวลผลในลักษณะที่ช่วยลดความแตกต่างระหว่างแพลตฟอร์ม ที่สอดคล้องกับมาตรฐานต่างๆ การเขียนซอฟต์แวร์ที่อยู่ภายในขอบเขตที่กำหนดโดยมาตรฐานเหล่านี้เป็นความพยายามที่ต้องใช้ความพยายามในทางปฏิบัติ แม้ว่าจะไม่ใช่เรื่องง่ายก็ตาม การพอร์ตโปรแกรมดังกล่าวระหว่างสองแพลตฟอร์มที่สอดคล้องกับมาตรฐาน (เช่นPOSIX.1 ) อาจเป็นเพียงการโหลดซอร์สโค้ดและคอมไพล์ใหม่บนแพลตฟอร์มใหม่ แต่ผู้ปฏิบัติงานมักพบว่าจำเป็นต้องมีการแก้ไขเล็กน้อยต่างๆ เนื่องจากความแตกต่างเล็กน้อยระหว่างแพลตฟอร์ม มาตรฐานส่วนใหญ่มี "พื้นที่สีเทา" ที่ความแตกต่างในการตีความมาตรฐานนำไปสู่ความแตกต่างเล็กน้อยจากแพลตฟอร์มหนึ่งไปยังอีกแพลตฟอร์มหนึ่ง
นอกจากนี้ยังมีเครื่องมืออำนวยความสะดวกในการพอร์ตซอฟต์แวร์เพิ่มมากขึ้นเรื่อยๆ เช่นGNU Compiler Collectionซึ่งให้ภาษาโปรแกรมที่สอดคล้องกันบนแพลตฟอร์มต่างๆ และAutotoolsซึ่งตรวจจับความแตกต่างเล็กน้อยในสภาพแวดล้อมโดยอัตโนมัติและปรับซอฟต์แวร์ให้เหมาะสมก่อนการคอมไพล์
คอมไพเลอร์สำหรับภาษาโปรแกรมระดับสูง บางภาษา (เช่นEiffel , Esterel ) ได้รับประโยชน์จากความสามารถในการพกพาได้โดยการสร้างซอร์สโค้ดในภาษาโปรแกรมระดับสูงระดับกลาง อื่น (เช่นC ) ซึ่งโดยทั่วไปแล้วจะมีคอมไพเลอร์สำหรับหลายแพลตฟอร์มให้ใช้งานได้
คอมไพเลอร์พอร์ต
แทนที่จะแปลโดยตรงเป็นรหัสเครื่องคอมไพเลอร์สมัยใหม่ จะแปลเป็น รหัสระดับกลางที่ไม่ขึ้นกับเครื่องเพื่อเพิ่มความสามารถในการพกพาของคอมไพเลอร์และลดความพยายามในการออกแบบ ภาษาระดับกลางจะกำหนดเครื่องเสมือนที่สามารถเรียกใช้โปรแกรมทั้งหมดที่เขียนในภาษาระดับกลางได้ (เครื่องถูกกำหนดโดยภาษาของมันและในทางกลับกัน) [ 3 ]คำสั่งรหัสระดับกลางจะถูกแปลเป็นลำดับรหัสเครื่องที่เทียบเท่ากันโดยตัวสร้างรหัสเพื่อสร้างรหัสที่สามารถเรียกใช้งานได้นอกจากนี้ยังสามารถข้ามการสร้างรหัสเครื่องได้โดยการใช้งานตัวแปลภาษาหรือJITสำหรับเครื่องเสมือน[ 4 ]
การใช้โค้ดระดับกลางช่วยเพิ่มความสามารถในการพกพาของคอมไพเลอร์ เนื่องจากมีเพียงโค้ดที่ขึ้นอยู่กับเครื่อง (ตัวแปลภาษาหรือตัวสร้างโค้ด) ของคอมไพเลอร์เองเท่านั้นที่ต้องถูกพอร์ตไปยังเครื่องเป้าหมาย ส่วนที่เหลือของคอมไพเลอร์สามารถนำเข้าเป็นโค้ดระดับกลางแล้วประมวลผลเพิ่มเติมโดยตัวสร้างโค้ดหรือตัวแปลภาษาที่พอร์ตมา ซึ่งจะทำให้ได้ซอฟต์แวร์คอมไพเลอร์หรือเรียกใช้โค้ดระดับกลางบนตัวแปลภาษาโดยตรง ส่วนที่ไม่ขึ้นกับเครื่องสามารถพัฒนาและทดสอบบนเครื่องอื่น ( เครื่องโฮสต์ ) ได้ ซึ่งช่วยลดความพยายามในการออกแบบลงอย่างมาก เนื่องจากส่วนที่ไม่ขึ้นกับเครื่องจำเป็นต้องพัฒนาเพียงครั้งเดียวเพื่อสร้างโค้ดระดับกลางที่พกพาได้[ 5 ]
ตัวแปลภาษามีความซับซ้อนน้อยกว่าและจึงง่ายต่อการพอร์ตมากกว่าตัวสร้างโค้ด เนื่องจากไม่สามารถทำการปรับแต่งโค้ดได้เนื่องจากมุมมองที่จำกัดของโค้ดโปรแกรม (เห็นคำสั่งทีละคำสั่งเท่านั้น และผู้ใช้ต้องการลำดับเพื่อทำการปรับแต่ง) ตัวแปลภาษาบางตัวง่ายต่อการพอร์ตอย่างมาก เพราะตั้งสมมติฐานเพียงเล็กน้อยเกี่ยวกับชุดคำสั่งของฮาร์ดแวร์พื้นฐาน ส่งผลให้เครื่องเสมือนนั้นง่ายกว่า CPU เป้าหมายเสียอีก[ 6 ]
การเขียนซอร์สโค้ดของคอมไพเลอร์ทั้งหมดด้วยภาษาโปรแกรมที่คอมไพเลอร์ควรจะแปล ทำให้วิธีการต่อไปนี้ ซึ่งเป็นที่รู้จักกันดีในชื่อการบูตสแตรปคอมไพเลอร์สามารถทำได้บนเครื่องเป้าหมาย:
- ย้ายตัวแปลภาษา ส่วนนี้ต้องเขียนด้วยภาษาแอสเซมบลี โดยใช้แอสเซมเบลอร์ ที่มีอยู่แล้ว ในระบบเป้าหมาย
- ปรับโค้ดต้นฉบับของโปรแกรมสร้างโค้ดให้เข้ากับเครื่องใหม่
- เรียกใช้โค้ดต้นฉบับที่ดัดแปลงแล้วโดยใช้ตัวแปลภาษา โดยใช้โค้ดต้นฉบับจากตัวสร้างโค้ดเป็นอินพุต ขั้นตอนนี้จะสร้างโค้ดเครื่องสำหรับตัวสร้างโค้ด
ส่วนที่ยากที่สุดของการเขียนโค้ดรูทีนการเพิ่มประสิทธิภาพคือการใช้ภาษาโปรแกรมระดับสูงแทนที่จะใช้ภาษาแอสเซมบลีของเป้าหมาย
ตามที่นักออกแบบ ภาษา BCPLระบุ โค้ดที่ถูกตีความ (ในกรณีของ BCPL) จะกระชับกว่าโค้ดเครื่อง โดยทั่วไปแล้วจะกระชับกว่าถึงสองเท่า อย่างไรก็ตาม โค้ดที่ถูกตีความจะทำงานช้ากว่าโค้ดที่คอมไพล์ประมาณสิบเท่าบนเครื่องเดียวกัน[ 7 ]
ผู้พัฒนาภาษาโปรแกรม Javaพยายามใช้ประโยชน์จากความกระชับของโค้ดแบบตีความ เนื่องจากโปรแกรม Java อาจจำเป็นต้องส่งผ่านทางอินเทอร์เน็ตก่อนที่จะสามารถเริ่มการประมวลผลบนเครื่องเสมือน Java (JVM) ของเป้าหมายได้
การพอร์ตวิดีโอเกม
การพอร์ตยังเป็นคำที่ใช้เมื่อวิดีโอเกมที่ออกแบบมาให้ทำงานบนแพลตฟอร์มหนึ่ง ไม่ว่าจะเป็นเกมตู้เกมคอนโซลหรือคอมพิวเตอร์ส่วนบุคคลถูกแปลงให้ทำงานบนแพลตฟอร์มอื่น อาจมีความแตกต่างเล็กน้อย[ 9 ]ตั้งแต่เริ่มต้นของวิดีโอเกมจนถึงทศวรรษ 1990 "พอร์ต" ซึ่งในขณะนั้นมักเรียกว่า " การแปลง " มักไม่ใช่พอร์ตที่แท้จริง แต่เป็นเวอร์ชันที่ปรับปรุงใหม่ของเกมเนื่องจากข้อจำกัดของระบบต่างๆ ตัวอย่างเช่น เกมThe Hobbit ในปี 1982 ซึ่งเป็นเกมผจญภัยแบบข้อความที่เสริมด้วยภาพกราฟิก มีรูปแบบกราฟิกที่แตกต่างกันอย่างมากในคอมพิวเตอร์ส่วนบุคคลต่างๆ ที่พอร์ตเกมนี้ได้รับการพัฒนาขึ้น[ 10 ]อย่างไรก็ตาม วิดีโอเกมในศตวรรษที่ 21 จำนวนมากได้รับการพัฒนาโดยใช้ซอฟต์แวร์ (มักเขียนด้วยภาษาC++ ) ที่สามารถสร้างโค้ดสำหรับคอนโซลหนึ่งเครื่องหรือมากกว่านั้น รวมถึงสำหรับพีซีโดยไม่จำเป็นต้องทำการพอร์ตจริง (แต่ใช้การพอร์ตทั่วไปของไลบรารี ส่วนประกอบแต่ละรายการแทน ) [ 10 ]
การพอร์ตเกมอาร์เคดไปยังระบบบ้านที่มีฮาร์ดแวร์ด้อยกว่านั้นเป็นเรื่องยาก เวอร์ชันที่พอร์ตของPac-ManสำหรับAtari 2600 ได้ละเว้นคุณสมบัติภาพหลายอย่างของเกมต้นฉบับเพื่อชดเชยการขาด พื้นที่ ROMและฮาร์ดแวร์ก็ทำงานหนักเมื่อมีผีหลายตัวปรากฏบนหน้าจอ ทำให้เกิดเอฟเฟกต์การกระพริบ ประสิทธิภาพที่ย่ำแย่ของPac-Manบน Atari 2600ถูกนักวิชาการบางคนอ้างว่าเป็นสาเหตุของวิกฤตการณ์วิดีโอเกมในปี 1983 [ 11 ]
พอร์ตเกมรุ่นแรกๆ หลายพอร์ตประสบปัญหาคุณภาพการเล่นเกมอย่างมากเนื่องจากคอมพิวเตอร์มีความแตกต่างกันมาก[ 12 ] Richard Garriottกล่าวในงาน Origins Game Fair ปี 1984 ว่าOrigin SystemsพัฒนาวิดีโอเกมสำหรับApple IIก่อน จากนั้นจึงพอร์ตไปยัง คอมพิวเตอร์ Commodore 64และAtari 8 บิต เนื่องจาก สไปรต์ และคุณสมบัติที่ซับซ้อนอื่นๆ ของเครื่องหลังทำให้การพอร์ตจากเครื่องเหล่านั้นไปยัง Apple "ยากขึ้นมาก อาจเป็นไปไม่ได้เลยด้วยซ้ำ" [ 13 ]บทวิจารณ์บ่นเกี่ยวกับพอร์ตที่ประสบปัญหา "Apple conversionitis" [ 14 ]ซึ่งยังคง "เสียงที่แย่และกราฟิกขาวดำเขียวม่วง" ของ Apple ไว้[ 15 ] [ 16 ]หลังจากคำกล่าวของ Garriott เมื่อDan Buntenถามว่า "คนของ Atari และ Commodore ในผู้ชม คุณพอใจกับการเขียนใหม่สำหรับ Apple หรือไม่?" ผู้ชมตะโกนว่า "ไม่!" Garriott ตอบว่า "[มิฉะนั้น] เวอร์ชัน Apple จะไม่มีวันเสร็จ จากมุมมองของผู้จัดจำหน่าย นั่นไม่ใช่เรื่องที่คุ้มค่า" [ 13 ]
บริษัทอื่นๆ ทำงานแตกต่างออกไป ตัวอย่างเช่น Ozark Softscape เขียนMULEสำหรับ Atari ก่อน เพราะต้องการพัฒนาสำหรับคอมพิวเตอร์ที่ทันสมัยที่สุด โดยลบหรือเปลี่ยนแปลงคุณสมบัติตามความจำเป็นระหว่างการพอร์ต นโยบายดังกล่าวไม่ได้เป็นไปได้เสมอไป Bunten กล่าวว่า "MULE ไม่สามารถทำสำหรับ Apple ได้" [ 12 ]และเวอร์ชันที่ไม่ใช่ Atari ของThe Seven Cities of Goldนั้นด้อยกว่า[ 17 ] Compute!'s Gazetteเขียนในปี 1986 ว่าเมื่อพอร์ตจาก Atari ไปยัง Commodore เวอร์ชันดั้งเดิมมักจะดีกว่า คุณภาพของเกมบน Commodore ดีขึ้นเมื่อนักพัฒนาเริ่มสร้างซอฟต์แวร์ใหม่สำหรับเครื่องนี้ในช่วงปลายปี 1983 [ 18 ]
ในการพอร์ตเกมอาร์เคดคำว่า "สมบูรณ์แบบเหมือนอาร์เคด" หรือ "แม่นยำเหมือนอาร์เคด" มักถูกใช้เพื่ออธิบายว่ารูปแบบการเล่น กราฟิก และองค์ประกอบอื่นๆ ในเวอร์ชันที่พอร์ตมานั้นตรงกับเวอร์ชันอาร์เคดมากน้อยเพียงใด เกมอาร์เคดที่พอร์ตมาหลายเกมในช่วงต้นทศวรรษ 1980 นั้นห่างไกลจากความสมบูรณ์แบบเหมือนอาร์เคด เนื่องจากเครื่องเล่นเกมคอนโซลและคอมพิวเตอร์ที่บ้านขาดฮาร์ดแวร์ที่ซับซ้อนเหมือนในเกมอาร์เคด แต่เกมก็ยังสามารถจำลองรูปแบบการเล่นได้ ที่น่าสังเกตคือSpace Invadersบน Atari VCS กลายเป็นเกมยอดนิยม ของเครื่องเล่นเกมคอนโซลนี้ แม้ว่าจะมีความแตกต่าง จากเวอร์ชันอาร์เคดก็ตาม [ 19 ] ในขณะที่ Pac-Manเวอร์ชันพอร์ตในภายหลังนั้น มีชื่อเสียงในด้านความเบี่ยงเบนจากเวอร์ชันอาร์เคด [ 20 ]เกมที่แม่นยำเหมือนอาร์เคดเริ่มแพร่หลายมากขึ้นตั้งแต่ทศวรรษ 1990 เมื่อเครื่องเล่นเกมคอนโซลที่บ้านมีประสิทธิภาพเทียบเท่ากับระบบอาร์เคด ที่น่าสังเกตคือ ระบบ Neo GeoจากSNKซึ่งเปิดตัวในฐานะระบบอาร์เคดแบบหลายเกม จะถูกนำเสนอเป็นเครื่องเล่นเกมคอนโซลที่บ้านด้วยคุณสมบัติเดียวกัน ทำให้สามารถเล่นเกมที่สมบูรณ์แบบเหมือนอาร์เคดได้ที่บ้าน[ 10 ]
"เกมที่พอร์ตลงคอนโซล" คือเกมที่ถูกสร้างขึ้นมาสำหรับคอนโซลเป็นหลักก่อนที่จะมีการสร้างเวอร์ชันที่สามารถเล่นได้บนคอมพิวเตอร์ส่วนบุคคล กระบวนการพอร์ตเกมจากคอนโซลไปยังพีซีมักถูกมองในแง่ลบมากกว่าการพอร์ตประเภทอื่นๆ ความคิดนี้เกิดจากข้อเท็จจริงที่ว่าเกมที่พอร์ตลงพีซีบางเกมไม่ได้ใช้ประโยชน์จากฮาร์ดแวร์ที่ทรงพลังกว่าที่มีอยู่ในพีซีหลายเครื่องอย่างเต็มที่ แม้กระทั่งในขณะที่คอนโซลเปิดตัวก็ตาม เนื่องจากฮาร์ดแวร์ของคอนโซลยังคงที่ตลอดทั้งเจเนอเรชั่นในขณะที่ฮาร์ดแวร์ของพีซีมีการพัฒนาอย่างต่อเนื่อง เกมที่ออกแบบโดยคำนึงถึงข้อจำกัดของคอนโซลจึงอาจดูเหมือนไม่ได้รับการปรับแต่งอย่างเหมาะสมเมื่อวางจำหน่ายบนพีซี แม้ว่าโดยทั่วไปแล้วจะคล้ายคลึงกันในปัจจุบัน แต่ความแตกต่างทางสถาปัตยกรรมบางอย่างยังคงอยู่ เช่น การใช้หน่วยความจำแบบรวมและระบบปฏิบัติการ ที่มีขนาดเล็กกว่า ในคอนโซล ข้อโต้แย้งอื่นๆ เกิดขึ้นจาก ความแตกต่าง ของอินเทอร์เฟซผู้ใช้ที่เป็นเรื่องปกติในคอนโซล เช่นเกมแพด TFUI ที่มาพร้อมกับFoV ที่แคบ จุดตรวจสอบคงที่ การ เล่นออนไลน์ที่จำกัดเฉพาะเซิร์ฟเวอร์ ทางการ หรือP2P การสนับสนุน การดัดแปลงที่ไม่ดีหรือไม่รองรับเลยรวมถึงการที่นักพัฒนาคอนโซลพึ่งพาการเขียนโค้ด ภายใน และการตั้งค่า เริ่มต้น มากกว่าการใช้ API ภายนอก และการกำหนดค่าซึ่งทั้งหมดนี้อาจต้องใช้การออกแบบใหม่ที่ลึกซึ้งและมีราคาแพงเพื่อหลีกเลี่ยงการพอร์ตไปยังพีซีที่ให้ความรู้สึก "ขี้เกียจ" [ 21 ]
การพอร์ตที่เป็นไปไม่ได้คือการพอร์ตวิดีโอเกมลงบนฮาร์ดแวร์ที่อ่อนแอกว่าเวอร์ชันเป้าหมายอย่างมาก[ 22 ]ตัวอย่างเช่น การพอร์ต เกม PlayStation 4และXbox Oneเช่นNier: AutomataและThe Witcher 3: Wild HuntไปยังNintendo Switch [ 23 ] [ 24 ]
ดูเพิ่มเติม
- การย้อนกลับการพัฒนา (Backporting) – การพัฒนาการอัปเดตสำหรับซอฟต์แวร์รุ่นเก่าโดยอิงจากการอัปเดตในเวอร์ชันใหม่กว่า
- โปรแกรมจำลองเครื่องเล่นเกมคอนโซล– โปรแกรมที่จำลองพฤติกรรมของเครื่องเล่นเกมคอนโซล
- คอมไพเลอร์ข้ามแพลตฟอร์ม – คอมไพเลอร์รหัสเครื่องที่ใช้งานได้บนหลายแพลตฟอร์ม
- ซอฟต์แวร์ข้ามแพลตฟอร์ม– ซอฟต์แวร์คอมพิวเตอร์ที่ติดตั้งบนแพลตฟอร์มการประมวลผลหลายประเภท
- อีมูเลเตอร์– ระบบที่ช่วยให้อุปกรณ์หนึ่งเลียนแบบการทำงานของอุปกรณ์อื่นได้
- การผูกภาษา– ไลบรารีซอฟต์แวร์ที่อนุญาตให้ใช้งานไลบรารีอื่นที่เขียนด้วยภาษาโปรแกรมอื่น
- รายการคุณลักษณะคุณภาพของระบบ– ข้อกำหนดที่ไม่เกี่ยวข้องกับการทำงานสำหรับการประเมินระบบ
- Poshlib – เฟรมเวิร์กซอฟต์แวร์ที่ใช้ในการพัฒนาซอฟต์แวร์ข้ามแพลตฟอร์ม
- การแปลงโปรแกรม– การสร้างโปรแกรมคอมพิวเตอร์โดยอัตโนมัติ
- ความสามารถในการพกพาของซอฟต์แวร์– ความสามารถของโปรแกรมในการทำงานบนแพลตฟอร์มต่างๆ โดยมีการเปลี่ยนแปลงเพียงเล็กน้อย
- พอร์ตต้นทาง– จุดสิ้นสุดการสื่อสารในระบบปฏิบัติการ
- คอมไพเลอร์แบบซอร์สโค้ดต่อซอร์สโค้ด– ตัวแปลรหัสต้นฉบับของคอมพิวเตอร์
- เขียนครั้งเดียว คอมไพล์ได้ทุกที่– เป้าหมายการออกแบบเพื่อให้ซอร์สโค้ดสามารถคอมไพล์ได้ทั่วโลก