- Lone Lisp คือ Lisp ที่รันโดยตรงบน Linux system calls โดยไม่ใช้
libcซึ่ง Matheus Moreira เริ่มทำขึ้นเพื่อพิสูจน์ว่าสามารถสร้างภาษาเต็มรูปแบบและโปรแกรม user space ด้วย freestanding C เพียงอย่างเดียวได้หรือไม่ - ใช้ Linux user space ABI ที่เสถียรโดยตรง เพื่อตัด global state และ API เก่าของไลบรารี C เช่น
errno, locale, implicit file buffering ออกไป และลงมือสร้าง runtime, memory allocator, เครื่องมือทดสอบเอง - รองรับ generator, delimited continuation, resumable error handling รวมถึง FEXPR และ proper tail call optimization และปฏิบัติต่อ vector, table, continuation ด้วยรูปแบบการเรียกฟังก์ชันแบบเดียวกัน
- เริ่มทำงานได้เร็ว แต่ในการ benchmark แบบชั่วคราวยังเป็น interpreter ระดับ list ที่ ช้ากว่า Python 10–100 เท่า โดยจะคง C interpreter ไว้เป็นเกณฑ์ bootstrap และมีแผนระยะยาวที่จะทำ JIT compiler ในตัว Lone เอง
- Moreira ใช้ Claude ช่วยรีวิวโค้ดและจัดการโปรเจกต์ แต่โค้ด Lone เขียนและตรวจเองทั้งหมด พร้อมตั้งใจสร้าง static site generator, shell และ utility ต่าง ๆ เพื่อ สร้าง Linux user space แบบดั้งเดิมขึ้นใหม่
จากเกม สู่ C++·Ruby·Lisp
- จุดเริ่มต้นที่ทำให้สนใจการเขียนโปรแกรมคือ Mega Man Battle Network เขาฝึกภาษาอังกฤษเพื่อพูดคุยในฟอรัมที่เกี่ยวข้อง และเรียนภาษาแรกคือ C++ ด้วย
- เริ่มเรียนหลักสูตรสารสนเทศในโรงเรียนมัธยมสายเทคนิคที่บราซิล ตอนอายุราว 13–14 ปี
- ใช้ Dev-C++ และ tutorial จาก cplusplus.com
- ภายใน 6 เดือนก็เรียนหลักสูตรของโรงเรียนครบทั้งหมด แล้วถูกจ้างเป็นผู้ช่วยสอนเพื่อช่วยนักเรียนคนอื่น
- เคยพยายามทำเกมด้วย แต่ไม่สำเร็จเพราะขาดความรู้ฟิสิกส์ที่จำเป็น
- หลัง C++ เขาผ่าน Java, Ruby, Python ก่อนจะรู้จัก Lisp และ Scheme และถูกดึงดูดด้วย ความงดงามทางภาษา ของ Scheme
- เรียน object-oriented programming จากการอ่าน tutorial ของ Java จาก Sun เกือบทั้งหมด
- ชอบ Java Swing และดีไซน์ Nimbus จนทำแอปวาดวงกลมและส่วนโค้งให้ศาสตราจารย์คณิตศาสตร์
- ใน Ruby เคยเขียน gem หลายตัว รวมถึง parser สำหรับ argument แบบ command-based คล้าย Git ชื่อ Acclaim
- แรงผลักดันในการสำรวจหลายภาษาเริ่มจากโปรเจกต์ของโรงเรียน แต่ต่อมาขับเคลื่อนด้วยความอยากรู้อยากเห็นและความต้องการหา ภาษาที่ถูกต้อง สำหรับตัวเอง
ความสามารถในการสื่อความของ Ruby และความโปร่งใสของ C
- Ruby มักเดาชื่อ method ได้ถูก และรองรับรูปเอกพจน์/พหูพจน์กับคำพ้องความหมาย ทำให้เข้ากับวิธีคิดของเขา
- สามารถทำงานจำนวนมากด้วยโค้ดน้อย ผ่านการประกอบแบบใกล้เคียง shell pipeline เช่น
items.each.with_index.map - จนถึงตอนนี้ก็ยังติดตั้ง Ruby ไว้เสมอ และล่าสุดเริ่มทำโปรเจกต์ Rails ด้วย
- สามารถทำงานจำนวนมากด้วยโค้ดน้อย ผ่านการประกอบแบบใกล้เคียง shell pipeline เช่น
- C ทำให้เข้าใจผลลัพธ์จากการ compile ได้ง่าย เพราะฟังก์ชัน สอดคล้องโดยตรงกับ ELF symbol และ assembly code
- มองว่า C++ สมัยใหม่แทบกลายเป็นคนละภาษากับอดีตแล้ว และไม่พูดอีกว่าตัวเองรู้ C++
- เคยพยายามย้ายไป Rust แต่ไม่ลงหลักปักฐาน และสนใจ Zig กับผู้สร้าง Zig ที่มองเหตุผลในการเขียนใหม่ด้วย C ว่าอยู่ที่ความเร็วและ ABI
- สมัยวัยรุ่น เขาอ่าน source ของ CRuby VM เพื่อหาคำตอบจาก implementation ให้กับคำถามใน Stack Overflow ว่า “ทำไม Ruby ถึงทำงานแบบนี้”
- ต่อมาได้สำรวจโค้ดของ CRuby, CPython, JVM, Guile, V8 และประเมินว่า source ของ Linux kernel เป็นมาตรฐานของการเขียนโปรแกรม C ระดับมืออาชีพ
วิธีอ่านโค้ดของคนอื่น
- ไม่หยุดแค่ใช้ไลบรารี แต่คอยอ่าน source เพื่อเข้าใจ implementation ภายใน การสื่อสารระหว่าง driver กับ hardware และ layer ที่ซ่อนอยู่
- แม้กำลังสร้างแอปจริง ก็มักหลุดไปสำรวจเทคโนโลยีพื้นฐาน และเกิดแนวโน้มที่จะสร้างปัญหาที่มีคนแก้แล้วขึ้นใหม่ให้ดีกว่าเดิม
- เขามองว่านิสัยนี้ไม่เข้ากับเส้นทางอาชีพ software development ทั่วไป จึงไม่เลือก programming เป็นอาชีพ แต่ เก็บไว้เป็นงานอดิเรก
- ไม่ได้เข้าใจโค้ด driver ตั้งแต่แรก แต่ยังอ่านต่อไปแม้จะท้อ จนเริ่มเข้าใจการทำงานบางส่วนได้
วิศวกรรมย้อนกลับคีย์บอร์ด RGB
- แอป Windows สำหรับควบคุมคีย์บอร์ด RGB ของโน้ตบุ๊ก barebone จาก Clevo ช้ามากจนใช้เวลากว่า 1 นาทีในการเปิดหน้าต่าง เขาจึงทำตัวแทนขึ้นเอง
- ใช้ Wireshark capture USB packet ที่แอปส่งไปยังคีย์บอร์ด แล้ววิเคราะห์โครงสร้างเพื่อเขียน driver ภาษา C ใน Linux user space
- หลังนำขึ้น GitHub ก็ลืมไปแล้ว แต่ต่อมามีผู้ใช้จริง และผู้ใช้คนหนึ่งทำ GUI ให้ด้วย
- จากนั้นยัง reverse engineer ฟีเจอร์อื่นของโน้ตบุ๊ก เช่น ACPI power management แต่ไม่ได้ค้นพบครบทุกฟีเจอร์
liblinux ที่ข้าม libc
- Linux system call มีโค้ดเรียบง่ายจนคล้ายการเรียกฟังก์ชันทั่วไป และสามารถ เล็งเป้าหมายไปที่ Linux โดยตรง โดยไม่ผ่าน
libcได้ - Linux ขึ้นชื่อเรื่องความเสถียรของ user space ABI แต่เขามองว่าองค์ประกอบใน user space ไม่ได้เสถียรแบบนั้น
- เคยเห็นข้อความใน manual ว่า system call บางตัว glibc ไม่รองรับ
- กรณีของ LWN ที่
getrandomใช้เวลาราว 2 ปีกว่าจะเข้า glibc ก็มีอิทธิพลต่อความคิดนี้
- เขาพัฒนา liblinux จากแนวคิดที่จะทำ
liblinux.aที่มีเฉพาะ system call แล้ว link ด้วย-llinux- เป็นชุด Linux system call wrapper สำหรับ freestanding C
- C runtime (CRT) หมายถึงไลบรารีมาตรฐาน C เช่น glibc, musl, uclibc
ปัญหาที่หายไปใน Freestanding C
- Linux คืนค่าความผิดพลาดเป็น return value ปกติ แต่ไลบรารี C เก็บไว้ใน global variable ชื่อ
errno - เมื่อตัด
libcออก ก็หลีกเลี่ยง global state หลายอย่างและ API เก่าไปพร้อมกันได้errno,rand/srand, สถานะ localestrtokที่ไม่ reentrant- implicit file buffering ที่อาจก่อปัญหาไม่คาดคิด
gets,atexit,signal,mallocmath.hที่ซับซ้อนขึ้นเมื่อผูกกับ NaN และerrno
- ในทางกลับกัน กฎ integer promotion และการไม่มี overflow check เป็นปัญหาของตัวภาษา C เอง จึงยังคงอยู่
- ใช้ compiler built-in สำหรับ overflow
- เขาระวังด้วยว่าตัวเองก็อาจสร้างข้อบกพร่องใหม่ขึ้นมา
- แม้ต้องเขียนเองตั้งแต่การ copy byte ไปจนถึงการแปลง integer → string โดยไม่มี standard library แต่งานก็ไม่ได้เป็นไปไม่ได้อย่างที่คิด
- repository ของ glibc ตีความยาก แต่ source ของ
musl libcสะอาดและสำรวจง่าย จึงช่วยได้มาก - ใน Lone เขายังทำ automated test suite ที่ใช้แต่ static memory โดยไม่พึ่ง C library และ dynamic memory allocation
- repository ของ glibc ตีความยาก แต่ source ของ
การพบ nolibc และจุดเริ่มต้นของ Lone Lisp
- เขาถาม Greg Kroah-Hartman ว่าทำไม Linux ไม่มี C library อย่างเป็นทางการ และได้รับคำตอบว่าเคยมีโปรเจกต์ klibc มาก่อน
- ภายหลังพบว่านักพัฒนา Linux kernel ทำ nolibc.h สำหรับเครื่องมือภายใน
- เขามองว่ามันสมบูรณ์และใช้งานดีกว่า liblinux ของตัวเอง จึง archive โปรเจกต์ไว้
- ปัจจุบัน
nolibc.hเติบโตเป็นไดเรกทอรีใน kernel tree ที่ใกล้เคียงlibcชั่วคราว แต่ยังไม่แน่ชัดว่ารับประกันความเสถียรภายนอกหรือไม่
- โปรเจกต์ถัดมาคือ Lone Lisp
- เขามองว่าถ้าสร้าง freestanding Lisp ที่รันโดยตรงบน Linux ได้ ก็สามารถเขียนโปรแกรมใด ๆ ด้วยวิธีเดียวกันได้
- เป็นการทดลองปัด user space ของ Linux สมัยใหม่ที่ซับซ้อนออกไป แล้วเริ่มใหม่บน binary interface ของ system call ที่เสถียร
- เขายังส่ง patch ให้ Cosmopolitan เช่น implementation สำหรับ floating-point parsing
- ชื่นชมรูปแบบ APE ที่ถูกตีความเป็น executable format ของหลายแพลตฟอร์มได้พร้อมกัน และฟีเจอร์ embedded archive ใน executable
Error handling และ delimited continuation
- เส้นทาง error ทั้งหมดของ Lone ช่วงแรกจบด้วย
exit(255)ใน interpreter แต่ต่อมา implement ระบบ condition ที่ resume ได้ในสาย Common Lisp - พื้นฐานของ error handling คือ delimited continuation
- เขาเข้าใจ continuation ว่าเป็นการ copy stack frame แล้ว replay ที่ตำแหน่งอื่น
- มอง exception ก็เป็น continuation รูปแบบหนึ่งที่ไม่ capture ค่า
- map ชนิด error จาก symbol เช่น
'not-foundไปยัง lambda(lambda (error) ...)ที่มี argument หนึ่งตัวทำงานเหมือน exception handler ทั่วไป(lambda (error continuation) ...)ที่มี argument สองตัวสามารถเรียก continuation เพื่อ resume โค้ดที่เกิด error พร้อมค่าได้
- ตั้งใจไม่รับ restart API ที่โค้ดซึ่ง signal error แจกแจงตัวเลือก restart เหมือน
use-valueของ Common Lisp- วางเป็นกลไกพื้นฐานภายใน evaluator เพื่อให้
signal,throw,transferทำงานเหมือนเพียง return ค่า
- วางเป็นกลไกพื้นฐานภายใน evaluator เพื่อให้
FEXPR และองค์ประกอบภาษาที่เรียกได้
- เขายังหลีกเลี่ยงวิธีที่ evaluator แบบ Lisp ดั้งเดิมจัดการ special form อย่าง
ifโดยตรง - Lone รองรับ FEXPR ซึ่งเทียบได้กับ plugin ของ evaluator เพื่อแยก special form ออกจาก evaluator
- ดีไซน์นี้ทำให้ tail call optimization สำหรับฟังก์ชัน Lisp ล้วนทำได้ก่อน แต่ primitive มี bug อยู่ระยะหนึ่ง
- แก้ด้วยการเพิ่มกลไกแยกต่างหากให้ primitive return จาก tail position ได้
- vector และ table ก็ callable เช่นกัน
([1 2 3] 0)คืนค่า1([1 2 3] 0 4)เปลี่ยน vector เป็น[4 2 3]
- continuation และ generator ก็ใช้ calling convention เดียวกัน
controlคล้ายbeginที่รองรับ continuationtransferออกจาก blockcontrolที่ใกล้ที่สุด และคืน callable continuation ที่แสดงจุดที่ถูก suspend- เมื่อเรียก continuation นั้นพร้อมค่า ก็สามารถ resume การคำนวณที่ถูก suspend ด้วย return value อื่นได้
System call และโครงสร้างการรัน
- ก่อน Lone เริ่มทำงาน parent process จะเรียก
execveและ Lone จะทำmmapประมาณ 12 ครั้งเพื่อจัดการ memory ภายใน - อ่าน script จาก standard input แล้วรันก่อนจบการทำงาน ระหว่างรันอาจเกิด
mmap,munmap,mremapเพิ่มเติม - ระบบ module ใช้
openatและclose - ใน system call กว่า 300 ตัวของ Linux มีเพียงบางส่วนที่ใช้เอง แต่มี system-call primitive ในระดับ Lisp เพื่อให้โปรแกรมเรียกตัวอื่น ๆ ได้ด้วย
- สำหรับ call ที่ต้องการ C struct ของ kernel เช่น
ioctlจำเป็นต้องเพิ่มความสามารถในการสร้างและจัดการ struct- การดูขนาด terminal ก็เป็นตัวอย่างที่ต้องการการรองรับแบบนี้
User space ที่ตั้งใจสร้างด้วย Lone
- ในระดับภาษา เขา implement error handling, proper tail call optimization, generator, delimited continuation แล้ว และระยะยาวอยากนำแนวคิดของ Erlang/BEAM เข้ามาด้วย
- เตรียมโครงสร้างให้ interpreter หลายตัวรันโค้ด Lisp แบบ parallel ได้
- โปรแกรมแรกที่จะทำด้วย Lone คือสิ่งทดแทน static site generator ที่ใช้ fork ของ PugJS ซึ่งเขาใช้อยู่ตอนนี้
- หลังจากนั้นวางแผนเขียน shell และ utility เอง เพื่อสร้าง Linux user space แบบดั้งเดิมขึ้นใหม่ในแบบของตัวเอง
- เคยทำ implementation ที่ export
envเป็น table ของ Lone Lisp ด้วย ตอนนั้นยังไม่มีความสามารถในการ traverse แต่ตอนนี้รองรับ generator แล้ว - interpreter ยังมีความสามารถอ่านและรันโค้ด Lisp จาก ELF segment พิเศษ
- ถ้า copy binary ของ interpreter แล้วแทรกโค้ด Lisp ก็สร้างโปรแกรม executable แบบ standalone ได้
การรีวิวและจัดการโปรเจกต์ด้วย Claude
- แม้ปริมาณงานทั้งหมดไม่มีขีดจำกัด แต่เขามองว่า feature set ของตัวภาษาใกล้สมบูรณ์แล้ว
- ใช้ Claude เหมือนผู้จัดการประเภทหนึ่ง และได้รับประโยชน์มากที่สุดจาก code review และ project management
- ขอให้ตรวจหา issue, ส่วนที่ยังไม่พัฒนา และทิศทางในอนาคตอย่างเข้มงวดจาก codebase ทั้งหมด
- จัดการแนวทางที่ปฏิเสธแล้วและ feature ที่จะทำภายหลังด้วยเอกสารและ project memory
- garbage collector และ memory allocator ดีขึ้นมากเพราะ Claude แนะนำ algorithm ที่ดีกว่า
- เขาตรวจทุกบรรทัดที่เข้า Lone เอง และมองว่าการเขียนโค้ดเองเป็นการเรียนรู้ จึงไม่ไว้ใจให้ AI เขียนโค้ด Lone แทน
- แต่ใน static site generator ภาษา JavaScript เขาเคยให้ Claude เขียน feature ทั้งหมดให้
- feature ที่วางแผนไว้รวมถึง GCC/Clang compiler API และการรองรับ stack protection function
ไวยากรณ์ที่นำมาจาก Ruby และ Scheme
- เขาพยายามรวมความสามารถในการสื่อความของ Ruby กับความกระชับของ Scheme และเพราะ parser ของ Lisp เรียบง่าย จึงเขียนเองแล้วจัดการ nested list ได้ทันที
- จุดที่ทำให้เข้าใจ Lisp อย่างแท้จริงคือเมื่อ implement FEXPR ซึ่งฟังก์ชันรับ list เอง ไม่ใช่ค่าที่ถูก evaluate แล้ว
- array ใช้ syntax
[1 2 3]และ dictionary ใช้{k v}- ลดกำแพงเริ่มต้นที่ไม่จำเป็น เพราะคุ้นเคยกับผู้ใช้ Ruby, Python, JavaScript รวมถึง Clojure และ newLisp
- style การเขียน C ดัดแปลงจาก Linux kernel style แต่ชอบการจัดแนวและการตกแต่งมากกว่า
- ใน Ruby เขาชอบลดเครื่องหมายวรรคตอนให้ใกล้ประโยคภาษาอังกฤษ เช่น
method 'arg'มากกว่าmethod('arg') - ใน Lisp ก็ลดการซ้อนของ syntax เช่นกัน
letของ Lone อยู่ในรูป(let (a b c d ...) body...)- มองว่ารูปที่ชื่อและค่าออกมาตามลำดับเป็นธรรมชาติกับรูปแบบ function application มากกว่าแบบดั้งเดิม
(let ((a b) (c d) ...) body...)
ประสิทธิภาพและแผน bootstrap
- benchmark ที่ Lone เหนือกว่าคือ startup speed โดยสามารถเริ่มและจบโปรแกรมได้เร็วกว่าระยะเวลาที่ Ruby อ่าน Rubygems
- การวัดแบบชั่วคราวพบว่าช้ากว่า Python ราว 10–100 เท่า
- Lone เป็น interpreter ระดับ list คล้ายรูปแบบใน SICP บท 5.4
- Python และ Ruby เป็น bytecode interpreter จึงอยู่คนละกลุ่มประสิทธิภาพ
- เขาหลีกเลี่ยง bytecode compilation เพราะรู้สึกว่าการเปลี่ยน list เป็น bytecode ทำให้สูญเสียแก่นของ Lisp
- ระยะยาวจะคง C interpreter ไว้เป็นเกณฑ์ bootstrap สุดท้าย และเขียน JIT compiler ภายใน Lone
- ใช้วิธีจอง executable page ด้วย
mmapแล้วสร้าง instruction ลงไป
- ใช้วิธีจอง executable page ด้วย
- ในการเทียบ recursive Fibonacci แบบชั่วคราวกับ Bash นั้น Lone เร็วกว่ามาก แต่ยอมรับว่าอาจมีความคลาดเคลื่อนในการวัด เช่น Bash อาจสร้าง process ทุก iteration
- สำหรับ script เวลาเริ่มต้นสำคัญ เขาจึงมองว่า bootstrap ที่เร็วของ Lone มีประโยชน์
- หากคำนวณ hash table ไว้ล่วงหน้าในขั้น build แล้วทำเป็น C initialization data ก็จะลดค่าใช้จ่าย initialization ตอนรันได้อีก
หน่วยความจำและสภาพแวดล้อมขั้นต่ำ
mmapขอ memory page จาก kernel และขนาด page ทั่วไปคือ 4,096 ไบต์- สามารถกำหนดสิทธิ์ read/write/execute ได้ และ JIT ใช้ page ที่ executable
- แม้ต้องการแค่ 16 ไบต์ แต่ถ้าขอ 4KiB ก็เปลืองมาก allocator ทั่วไปจึงขอพื้นที่ใหญ่ เช่น 128MB แล้วแบ่งเป็นชิ้นเล็ก
- top-level environment ของ Lone มีเพียงสอง symbol คือ
importและexport- นอกเหนือจาก list, literal และกลไก function call แล้ว แม้แต่
if,quoteก็ต้อง import เข้ามา - เป็นดีไซน์ที่ให้ผู้ใช้ควบคุมชื่อทั้งหมดใน environment เอง
- นอกเหนือจาก list, literal และกลไก function call แล้ว แม้แต่
- ปัจจุบันมีฟังก์ชันราว 50 ตัว โดยแกนหลักคือ
if,let,begin,control/transfer,intercept/signal,flattenเป็นต้น
Standard library และเอกสาร
- เอกสารภาษายังไม่สมบูรณ์ แต่กำลังเข้าใกล้งานด้าน standard library มากกว่าฟีเจอร์ภาษา
- วางแผนอ้างอิง standard library ของ Ruby และวิธีตั้งชื่อของ Scheme
- งานถัดไปคือ traversal protocol
- กำลังพิจารณารูปแบบ
(for (each collection) (lambda (item) ...)) - จะออกแบบฟังก์ชัน
eachเดิมทั้งหมดใหม่ให้ return generator
- กำลังพิจารณารูปแบบ
- หลังจากนั้นตั้งใจทำ string builder สำหรับ string manipulation และการ concatenate อย่างมีประสิทธิภาพ
- เมื่อ traversal และฟีเจอร์ string เสร็จ เขามองว่าจะเขียน web framework แบบ Hiccup ได้
- กังวลว่าเมื่อฟีเจอร์ low-level เสร็จและเข้าสู่งาน standard library ที่ซ้ำ ๆ อาจเสียสมาธิ จึงวางแผนใช้ความช่วยเหลือจาก Claude ในการจัดการ
เป้าหมายของการเป็นเจ้าของทั้ง stack ด้วยตัวเอง
- ฟีเจอร์ที่ดูน่าลึกลับอย่าง continuation ก็กลายเป็นปัญหา implementation ธรรมดาเมื่อเข้าใจว่าเป็นการ copy stack frame และ Lone มีเป้าหมายกระตุ้นให้คนอื่นสร้างและสำรวจระบบของตัวเอง
- ไม่อยากเป็นแค่ผู้บริโภคไลบรารี แต่จะเป็น คนสร้างไลบรารี และต้องการใช้ system call โดยตรง แม้สิ่งนี้มักถูกปฏิบัติราวกับเป็นของต้องห้ามสำหรับนักพัฒนาทั่วไป
- การมีระบบของตัวเองหมายความว่าต้องซ่อมเองเมื่อพัง แต่เขาหวังว่าคนจำนวนมากขึ้นจะเลือกทั้งความรับผิดชอบและผลตอบแทนนั้น
- เขามองว่าไม่ควรกลัวโค้ดเก่าที่สะสมในวงการ computing และสามารถตัด layer ที่ไม่จำเป็นออกได้
- ผู้ที่จะสร้าง Linux user space ขึ้นใหม่อาจไม่ใช่เขา แต่อาจเป็นนักพัฒนา Rust หรือ Zig ก็ได้
- แม้ Lone ไม่สำเร็จ แต่ถ้าช่วยสร้างแรงบันดาลใจให้ความพยายามแบบนี้ เขาก็พอใจ
Free software และ Android
- ให้ความสำคัญกับ การเสริมอำนาจผู้ใช้ ซึ่ง free software มุ่งหมาย และกังวลว่าสถานะของคอมพิวเตอร์อเนกประสงค์จะถูกลดทอนจนเหมือนเครื่องใช้ไฟฟ้าที่บริษัทหรือรัฐบาลควบคุม
- ประเมินว่า systemd เป็นกรณีความสำเร็จของการจินตนาการและสร้าง Linux user space แบบดั้งเดิมขึ้นใหม่ แม้อาจมีแนวทางที่หนักไปบ้าง
- มองว่าต้องเลือกสนามรบ แทนที่จะสร้างทุก layer เอง
- หากทำ Lone เป็น bare-metal Lisp อาจยังไปไม่ถึงขั้น boot ด้วยซ้ำ
- ยกตัวอย่าง Sector Lisp ของ jart ซึ่งเป็น Lisp ใน boot sector ขนาดต่ำกว่า 512 ไบต์
- Lone เริ่มต้นใน Termux และส่วนใหญ่ถูกเขียนบนโทรศัพท์มือถือ
- แม้ Android จะ block system call บางตัวรวมถึง
statxแต่ Lone รันบน Android ได้ และ test suite ผ่าน 100%
แพทย์และโปรแกรมเมอร์ที่ไม่ใช่มืออาชีพ
- Moreira เป็น แพทย์ ที่จบแพทยศาสตร์ในปี 2019
- ตอนมัธยมเขาอ่านเรื่อง programming neural network แล้วสนใจชีววิทยา
- จัดเวลาการเขียนโปรแกรมได้ด้วยตารางที่บางวันตรวจคนไข้ 10–14 ชั่วโมง และบางวันพัก
- ในโรงพยาบาลที่ใช้ electronic medical record เขาลดเวลางานลงได้มากด้วย template และความสามารถในการพิมพ์
- สามารถบันทึกไปพร้อมกับสบตาผู้ป่วยได้
- โปรเจกต์ Rails ที่เพิ่งเริ่มคือระบบ electronic patient record เพื่อแก้ปัญหาของตัวเอง
- เขามองว่าสาเหตุหนึ่งที่นักพัฒนามืออาชีพไม่แก้ปัญหาส่วนตัวด้วยตัวเอง คือขาดความสนใจในตัวคอมพิวเตอร์เอง
- ต้องมี ความอยากรู้อยากเห็น มากกว่าทัศนคติที่อยากได้แค่ผลลัพธ์ จึงจะขุดลึกเข้าไปใน implementation ได้ และเขายังไม่รู้ว่าจะปลุกความอยากรู้นั้นในผู้คนได้อย่างไร
1 ความคิดเห็น
ความเห็นจาก Lobste.rs
ชอบซีรีส์สัมภาษณ์นี้มากถึงขั้นอ่านแทบไม่พลาด เพราะการได้เห็น ความสัมพันธ์ส่วนตัว ที่แต่ละคนมีต่อโลกคอมพิวติ้งนั้นน่าสนุกมาก
Shonumi ผู้เขียน GBE+ GBA emulator ก็ได้รับอิทธิพลจากเกม Mega Man Battle Network เหมือนฉัน และสักวันก็อยากอ่านบทสัมภาษณ์ของเขาเหมือนกัน
ข้อยกเว้นที่รีสตาร์ตได้ ไม่ได้จำเป็นต้องใช้ first-class continuation เสมอไป
Common Lisp มีข้อยกเว้นที่รีสตาร์ตได้โดยไม่ต้องมี continuation และหัวใจสำคัญคือไม่กรอสแตกสแตกกลับก่อนเรียก handler
ดังนั้นสแตกและสถานะตอนที่เกิดข้อยกเว้นจะยังคงอยู่เหมือนเดิม ทำให้ handler จะคืนค่าตามปกติก็ได้ หรือจะกระโดดไปยัง restart handler ที่อยู่สักแห่งในสแตกแบบ Common Lisp ก็ได้
แต่ใน Lone Lisp มันจำเป็นจริง เพราะ continuation ที่ถูกคืนมาสามารถถูกเรียกได้หลายครั้ง และสามารถหลุดออกไปนอก signal handler ได้ เนื่องจาก generator เป็นพื้นฐานของการประมวลผลแบบวนซ้ำและประสิทธิภาพสำคัญกว่า จึงใช้ สแตกแยกต่างหาก แทน continuation แบบจำกัดเพื่อไม่ต้องคัดลอก
ส่วนการจัดการข้อผิดพลาดเป็นเส้นทางที่เกิดไม่บ่อยนัก เลยเลือกคงความสามารถไว้ให้ครบถ้วน
สำหรับหลายคน งานหรือโปรเจ็กต์ที่สำคัญที่สุดอาจเป็นสิ่งที่ทำในเวลาว่าง โดยไม่รับค่าตอบแทนและทำเพราะสนุก ก็ได้
ทำให้นึกภาพว่าหมอของฉันเองก็อาจแอบใช้ชีวิตสองด้าน สร้างภาษา Lisp ของตัวเองอยู่เงียบ ๆ ก็ได้
Dr. Cameron Kaiser ก็ทำโปรเจ็กต์ใหญ่ ๆ หลายอย่าง ทั้งยังมีปรัชญาเรื่องความเป็นเจ้าของเครื่องจักรแบบเดียวกัน และใช้งาน POWER9 workstation แบบเปิดเต็มรูปแบบในชีวิตประจำวันด้วย
เพิ่งรู้จัก Lone Lisp เป็นครั้งแรกจากครั้งนี้ และดูเป็นโปรเจ็กต์ที่ยอดเยี่ยม
ตอนอายุราว 13~14 ปี ฉันก็เริ่มเรียน C++ ด้วย Dev-C++ เวอร์ชันเก่าในคาบคอมพิวเตอร์เหมือนกัน ทำให้นึกถึงอดีตขึ้นมาจนรู้สึกคิดถึงมาก
ไม่คิดมาก่อนเลยว่าเขาจะเป็นหมอ ทำให้นึกถึง Con Kolivas
ดูเหมือนจะมีนักพัฒนาที่เป็นหมออยู่มากกว่าที่คิด
https://en.wikipedia.org/wiki/Con_Kolivas