1 คะแนน โดย GN⁺ 1 일 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ด้วย
  • 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, สถานะ locale
    • strtok ที่ไม่ reentrant
    • implicit file buffering ที่อาจก่อปัญหาไม่คาดคิด
    • gets, atexit, signal, malloc
    • math.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

การพบ 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 ค่า

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 ที่รองรับ continuation
    • transfer ออกจาก block control ที่ใกล้ที่สุด และคืน 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 ลงไป
  • ในการเทียบ 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 เอง
  • ปัจจุบันมีฟังก์ชันราว 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 ความคิดเห็น

 
GN⁺ 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 ได้
      (import (lone print set quote lambda intercept signal))
      
      (set continuation  
        (intercept  
          (('return (lambda (value continuation) continuation)))  
          (signal 'return 'value)))
      
      (print (continuation 1)); 1  
      (print (continuation 2)); 2  
      (print (continuation 3)); 3  
      
      เนื่องจาก generator เป็นพื้นฐานของการประมวลผลแบบวนซ้ำและประสิทธิภาพสำคัญกว่า จึงใช้ สแตกแยกต่างหาก แทน continuation แบบจำกัดเพื่อไม่ต้องคัดลอก
      ส่วนการจัดการข้อผิดพลาดเป็นเส้นทางที่เกิดไม่บ่อยนัก เลยเลือกคงความสามารถไว้ให้ครบถ้วน
  • สำหรับหลายคน งานหรือโปรเจ็กต์ที่สำคัญที่สุดอาจเป็นสิ่งที่ทำในเวลาว่าง โดยไม่รับค่าตอบแทนและทำเพราะสนุก ก็ได้
    ทำให้นึกภาพว่าหมอของฉันเองก็อาจแอบใช้ชีวิตสองด้าน สร้างภาษา Lisp ของตัวเองอยู่เงียบ ๆ ก็ได้

    • ปรากฏว่า ไม่ได้มีแค่ฉันคนเดียวที่คิดแบบนั้น
      Dr. Cameron Kaiser ก็ทำโปรเจ็กต์ใหญ่ ๆ หลายอย่าง ทั้งยังมีปรัชญาเรื่องความเป็นเจ้าของเครื่องจักรแบบเดียวกัน และใช้งาน POWER9 workstation แบบเปิดเต็มรูปแบบในชีวิตประจำวันด้วย
  • เพิ่งรู้จัก Lone Lisp เป็นครั้งแรกจากครั้งนี้ และดูเป็นโปรเจ็กต์ที่ยอดเยี่ยม
    ตอนอายุราว 13~14 ปี ฉันก็เริ่มเรียน C++ ด้วย Dev-C++ เวอร์ชันเก่าในคาบคอมพิวเตอร์เหมือนกัน ทำให้นึกถึงอดีตขึ้นมาจนรู้สึกคิดถึงมาก

    • น่าประหลาดใจที่ Dev-C++ ยังอยู่ต่อมาได้ และถึงขั้นมี ออกรีลีสในปี 2021 ด้วย
  • ไม่คิดมาก่อนเลยว่าเขาจะเป็นหมอ ทำให้นึกถึง Con Kolivas
    ดูเหมือนจะมีนักพัฒนาที่เป็นหมออยู่มากกว่าที่คิด
    https://en.wikipedia.org/wiki/Con_Kolivas