Parallel Perl – trình thông dịch tự động song song với JIT
Parallel Perl – autoparallelizing interpreter with JIT
Một trình thông dịch Perl mới có tên "Parallel Perl" vừa được ra mắt. Điểm nổi bật của nó là tích hợp JIT compiler với mục tiêu tự động hóa việc xử lý song song (parallelization). Dự án này còn nhắm đến việc ứng dụng AI để nâng cao hiệu suất và khả năng thực thi của Perl, đặc biệt hữu ích cho các tác vụ liên quan đến AI. Các Perl developer nên chú ý đến bước tiến này, bởi nó có thể tăng đáng kể hiệu quả cho code Perl, biến nó trở thành một lựa chọn cạnh tranh hơn cho các ứng dụng đòi hỏi cao. Mục tiêu dài hạn của Parallel Perl là cho phép AI "làm thay việc viết Perl", mở ra một tương lai nơi AI tham gia tích cực vào việc phát triển và tối ưu hóa code Perl.
Tôi đã làm AI với Perl được vài thập kỷ. Bây giờ - sau 3 thập kỷ sử dụng Perl - tôi nghĩ đã đến lúc thay đổi vị ngữ và để AI làm...
Tôi đã làm AI với Perl được vài thập kỷ.
Bây giờ — sau 3 thập kỷ sử dụng Perl — tôi nghĩ đã đến lúc
để xoay vị ngữ
và để AI làm Perl.
→ vòng cung chính ↓ lặn sâu
Mở đầu Kể từ lần trước...
GPW 2016 · Nuremberg · "KI: Wie testet man ein Hirn?"
Đó là chuyện của 10 năm trước. Rất nhiều điều đã xảy ra.
"Bạn phải có sự kiên nhẫn, Padawan trẻ tuổi của tôi"
Phần mở đầu này không phải về Perl — nhưng nó là bối cảnh cần thiết.
Nội dung được phân loại
Có một số điều tốt hơn hết là không nên nói ra.
Những gì tôi có thể cho bạn xem hôm nay gần bằng một nửa những gì đã xảy ra.
→ tiếp tục
Hệ thống quang điện và năng lượng
Được thiết kế, xây dựng, tự động hóa
Hệ sinh thái Victron · Giám sát và kiểm soát Perl
Hệ thống quang điện và năng lượng

Tham khảo S1 · Nuremberg
~24 kWp · 45 kWh · 80+% ngoài lưới · cấp điện

Tham khảo J2 · Praha
40 kWp · 120 kWh · 100% không nối lưới
Biệt thự-A
Ngôi nhà của một nhà kỹ trị — tiêu chuẩn của những năm 2050
1400m³
Khối lượng gia nhiệt
700t
Nhiệt khối (bê tông)
Bê tông cốt sợi Địa nhiệt (Erdwärmekörbe) Thảm trần mao mạch Tự động hóa toàn bộ ngôi nhà Năng lượng ngoài lưới 40kWp năng lượng mặt trời Ắc quy 120kWh
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Xây dựng
Biệt thự-A — Hệ thống
- Erdwärmekörbe, WP — heizen, kühlen (passiv)
- "Klimamatten" — Deckenheizung, Kühlung (BEKA → Berlin)
- Luftbrunnen, KWL
- Privatkraftwerk (Offgrid)
- Wasserwerk / Wasseraufbereitung
- Digital Lichtsteuerung, DALI "Full-Stack DC" (DALI-SELV)
- ... và đừng vội vàng
...và tất cả đều cần được kiểm soát.
Một ngôi nhà phức hợp này cần một hệ thống tự động hóa
điều đó vẫn chưa tồn tại
→
02 roi
Bộ xử lý cơ sở hạ tầng Witty House
PV — Tích hợp Perl
Các công cụ đầu tiên: Victron Modbus + ECS BMS — tất cả đều có trong Perl
$ ecs_bms_tool -range 1-16 # truy vấn tất cả các mô-đun pin
$ ecs_bms_tool -nhận điện áp di động -nhận nhiệt độ di động
$ ecs_bms_tool -otype json # JSON để tích hợp đường ống
$ Wmodbus khám phá 192.168.2.0/24 # tìm thiết bị Modbus trên mạng
$ Wmodbus --host 192.168.2.201 --unit 2 đọc giữ 0-10
$ Wmodbus --host 192.168.2.201 --profile vents-dbe900l màn hình
ecs_bms_tool — Quản lý ECS LiPro BMS (SoC, điện áp di động, cân bằng)
Wmodbus — Modbus TCP/RTU: khám phá, đọc/ghi, cấu hình thiết bị, giám sát
Wcli — tính toán bức xạ mặt trời và năng lượng quang điện
Wthermal — mô hình nhiệt trong nhà dựa trên vật lý
Kịch bản hoạt động. Nhưng một ngôi nhà không chỉ là những tấm pin mặt trời.
Đang tìm Smarthome
Rõ ràng là tốt nhất trong Perl.

FHEM — Perl. Tích cực. Đã thử rồi. Đau khổ.

WHIP — "Tôi sẽ tự xây dựng."
Trải nghiệm FHEM
svn.fhem.de/trac/browser/trunk/fhem
(Người của FHEM: không có ý xúc phạm. Chà, có lẽ một chút.)
Ý tưởng hay đấy. Thực thi sai.
✓ Mã nguồn mở, tự làm, hướng đến cộng đồng
✓ Cấu trúc liên kết cây với tính năng tự động định tuyến và tự phục hồi
✓ Lên tới 254 nút × 254 cảm biến — quy mô khá
✗ Arduino — ATmega328? Vì một ngôi nhà? Vào năm 2020?
✗ Mô hình phần mềm Arduino — Vòng lặp vô tận với nhiều thứ bên trong.
✗ RS485 / nRF24L01+ — Kiến trúc Master-Slave
✗ Giao thức văn bản — ASCII được phân cách bằng dấu chấm phẩy qua chuỗi. Vào năm 2020.
✗ Không có hoạt động tự chủ — các nút phụ thuộc vào cổng/bộ điều khiển
Tôi cảm thấy phải có điều gì đó tốt hơn.
Sự ra đời của một nút
BUS CAN thay vì RS485
Multi-master · Giải quyết va chạm vốn có · Đàn hồi
Đủ tốt cho ô tô trong nhiều thập kỷ. Tiêu chuẩn công nghiệp.
1 MBit thay vì EIB/KNX 9600 baud
Tốt cho các lần chạy 20–30m. Rất nhiều cho một ngôi nhà.
STM32F103 thay vì ATmega328
72 MHz ARM Cortex-M3 · Nhanh hơn 7 lần so với Arduino
Tích hợp ngoại vi CAN · $1,50 vào năm 2020
FreeRTOS + libopencm3 thay vì các vòng lặp vô tận
Nhiệm vụ thực tế · Ưu tiên · Ưu tiên · Trừu tượng hóa phần cứng

RobotDyn Black Pill · STM32F103C8T6
Sự ra đời của một nút
BUS CAN thay vì RS485
Multi-master · Giải quyết va chạm vốn có · Đàn hồi
Đủ tốt cho ô tô trong nhiều thập kỷ. Tiêu chuẩn công nghiệp.
1 MBit thay vì EIB/KNX 9600 baud
Tốt cho các lần chạy 20–30m. Rất nhiều cho một ngôi nhà.
STM32F103 thay vì ATmega328
72 MHz ARM Cortex-M3 · Nhanh hơn 7 lần so với Arduino
Tích hợp ngoại vi CAN · $15 vào năm 2020 (Covid!)
FreeRTOS + libopencm3 thay vì các vòng lặp vô tận
Nhiệm vụ thực tế · Ưu tiên · Ưu tiên · Trừu tượng hóa phần cứng

Blue Pill · STM32F103C8T6
Sự ra đời của một nút
BUS CAN thay vì RS485
Multi-master · Giải quyết va chạm vốn có · Đàn hồi
Đủ tốt cho ô tô trong nhiều thập kỷ. Tiêu chuẩn công nghiệp.
1 MBit thay vì EIB/KNX 9600 baud
Tốt cho các lần chạy 20–30m. Rất nhiều cho một ngôi nhà.
STM32F103 thay vì ATmega328
72 MHz ARM Cortex-M3 · Nhanh hơn 7 lần so với Arduino
CAN tích hợp sẵn thiết bị ngoại vi · không có hàng! → DIY
FreeRTOS + libopencm3 thay vì các vòng lặp vô tận
Nhiệm vụ thực tế · Ưu tiên · Ưu tiên · Trừu tượng hóa phần cứng

Viên thuốc xanh · STM32F103C8T6 · Tự làm
Tại sao CÓ THỂ?
Tại sao CÓ THỂ? Trọng tài phần cứng (CSMA/CR) · đa chủ thực sự · 1 Mbit/s · vi phân · cấp công nghiệp
Tại sao không phải là WiFi/Zigbee? Không có pin để chết. Không có lưới để sụp đổ. Xây dựng 50 năm chứ không phải 5.
Tại sao không phải là RS485? Không có trọng tài. Chỉ có chủ-nô. Hai nút truyền = rác.
Tại sao không phải là KNX? 9600 baud (thiết kế những năm 1990). Đắt. Hệ sinh thái khép kín.
Sự ra đời của một Hub
Vậy là bạn có 20 nút — bây giờ thì sao?

Lắp ráp trung tâm · Gắn ray DIN

Waveshare 2-CH CAN HAT
RasPi 4B/5 · 2-ch CAN HAT · Bảng chuyển tiếp · Giá đỡ DIN Rail · Cổng CAN/IP & CAN/CAN
Kiến trúc WHIP
Nút — MCU STM32 · FreeRTOS · Xe buýt CAN 1MBit · Tự trị C / Được nhúng
Trung tâm — RasPi · Cổng CAN/IP · Tập hợp trung tâm · Cầu nối giao thức · Mojolicious Perl
Máy chủ — Điều phối · Kết nối bên ngoài Perl
Các lớp cao hơn luôn là một phần bổ sung, không bao giờ là một yêu cầu.
Nút — STM32 + FreeRTOS
Phần cứng
STM32F103 (Cortex-M3, 72 MHz)
STM32F303 (Cortex-M4F, FPU)
Bộ điều khiển bxCAN gốc
Phần mềm
FreeRTOS · libopencm3
Không có khóa HAL của nhà cung cấp
Một YAML = một phần sụn
115+
mô-đun cảm biến/thiết bị truyền động
🌡️ BME280 · DS18x20 · SHT3x · NTC
⚡ INA219 · INA226 · ACS712 · ADC
💡 DALI · WS281x · Bộ điều chỉnh độ sáng RGB · SSR
🔌 PCF857x · MCP23017 · tiếp sức · GPIO
📡 LoRa · Modbus RTU · 1 dây · SPI
🖥️ SSD1306 · ST7735 · đèn LED trạng thái
🍃 SCD4x · SGP4x · PMS5003 · SEN5x
🛸 AS3935 (franklin) · MLX90614 · VL53L0x · HX711
Trình phân giải phụ thuộc được lấy cảm hứng từ Linux Kconfig
~5 mô-đun trên mỗi nút → 153.476.148 kết hợp
Hạch
Hạch = GANG của các nút I/O nhẹ — mô hình não côn trùng.
Quy tắc IF-THEN, bộ tính giờ, biến cục bộ — được biên dịch thành mã byte trên MCU.
Hạch — Đang hoạt động
Chuỗi công cụ:
Wgc — Trình biên dịch (Perl)
Nguồn .tgc → mã byte .bgc (10–50 byte)
Wgi — Phiên dịch
Tháo gỡ + theo dõi thực thi
Cùng nguồn C như trên STM32
Wgs — Trình mô phỏng
Impl tham chiếu Perl · mô hình bộ nhớ đầy đủ
Cảm biến giả · mô phỏng bộ đếm thời gian · 170 bài kiểm tra
Trung tâm — một Pantheon
Các trung tâm RasPi chuyên dụng. Đặt tên theo chức năng chứ không phải ngẫu nhiên.
Raijin
⚡ Thần sấm — năng lượng: Victron, BMS, MPPT, pin 120 kWh
Lucifer
💡 Người mang ánh sáng — Ánh sáng DALI: 4 xe buýt, cảnh, mô phỏng hiện diện
Bragi
🎵Thần thơ Bắc Âu — âm thanh đa phòng, giọng nói, hỗ trợ AI
Gaia
🌿 Nữ thần đất — nhà kính, vườn, ao, thủy lợi
Tyr
⚔️ Thần chiến tranh — ...bạn có thể đoán được.
Không có trung tâm nào là một điểm thất bại duy nhất. Mỗi miền chạy độc lập.
SELV-DALI — Chiếu sáng không cần nguồn điện
SELV = Điện áp cực thấp an toàn. Dưới 60V DC. An toàn khi chạm vào.
Thủ thuật: Toàn bộ chuỗi đèn chạy từ bộ lưu trữ pin. 48V → 24V DC/DC → LED. Không có nguồn điện xoay chiều 230V ở bất cứ đâu.
DALI điều khiển ở điện áp 16V. Công tắc, cảm biến, bộ điều chỉnh độ sáng — tất cả SELV.
Biến tần thất bại? Đèn vẫn sáng - chúng hoàn toàn bỏ qua AC.
Chuyển đổi bên cạnh bồn tắm? Không có gì. Không cần thợ điện.

🇬🇧 Tiếng Anh

🇩🇪 Deutsch
WHIP — Giao thức & tích hợp
Giao thức
CAN bus 1Mbit Modbus TCP/RTU DALI MQTT SNMP I2C 1 dây
Modbus
17 trên 21 mã chức năng · 869 bài kiểm tra · Độ phủ 91%
Hơn 30 tích hợp bên ngoài
Victron VRM · MasterTherm · PVGIS · Discord · Nextcloud · Proxmox · UniFi · ...
Tất cả các trình xử lý giao thức trong Perl · I/O không đồng bộ vui nhộn
WHIP — Đang sản xuất
Villa-A (Prague) — hoàn toàn không có lưới điện
- 40 kWp năng lượng mặt trời · 120 kWh LiFePO4 · 3× Multiplus-II 10kVA
- Bơm nhiệt MasterTherm · sưởi ấm/làm mát trần mao dẫn
- Chiếu sáng DALI trên 4 xe buýt · các nút CAN được phân phối
Villa-B (Đức) — cùng một ý tưởng, cấu hình khác nhau
Hai lần triển khai = khái quát hóa thực sự, không "hoạt động trên máy của tôi"
Vô hình khi nó hoạt động. Có năng lực khi nó quan trọng. Được xây dựng trong nhiều thập kỷ, không bảo hành.
03 AI làm Perl
Sử dụng AI để viết Perl — thực tế thực tế
AI đã đóng góp...
Rất nhiều nguyên mẫu Perl — một số đã trở thành công cụ tiêu chuẩn
- Một PVGIS của riêng mình — nhưng tốt hơn (nhiều mái nhà)
- Modbus, CANbus CLI lệnh và xem xét nội tâm
- Mô phỏng tổn thất nhiệt/sự xâm nhập (tốt hơn "chuyên gia năng lượng")
Nguồn FreeRTOS / libopencm3
- Phần sụn được mô-đun hóa cho các nút STM32
- Hơn 100 mô-đun (tổ hợp!)
- Thử nghiệm, xây dựng hệ thống
Rất nhiều mã Perl
- Điểm cuối API tới ... mọi thứ
- Bất hòa, Reddit, Twitter, Kraken, Ollama, Proxmox
- AWS, Azure, Anthropic, Kodi, Nextcloud, ... bạn đặt tên cho nó!
Dự án phụ "nhỏ"
Trình phân tích cú pháp MIB
SNMP::MIB::Compiler — trình phân tích cú pháp MIB tốt nhất. Giai đoạn. nguồn mở
Grpc::FFI
gRPC cho Perl — vì mọi thứ khác đều đã chết nguồn mở
Tình hình CPAN
2025-09-28
→ Đã nói chuyện với module@perl.org. Không có câu trả lời.
2025-10-01
→ Một Andy Koenig. Không có câu trả lời.
2025-10-06
→ An Sören Laird, LinkedIn. Không có câu trả lời.
SNMP & MIB — mồi nhanh
SNMP
Giao thức quản lý mạng đơn giản — cách bạn giám sát và quản lý các thiết bị mạng. Bộ định tuyến, bộ chuyển mạch, tường lửa, UPS, máy in — mọi thứ có IP.
MIB
Cơ sở thông tin quản lý — lược đồ. Xác định những gì mỗi thiết bị có thể báo cáo: tải CPU, bộ đếm giao diện, nhiệt độ, tỷ lệ lỗi, ...
Vấn đề
Hàng nghìn MIB của nhà cung cấp. Được viết bằng ASN.1. Rắc rối với sự sai lệch của nhà cung cấp so với tiêu chuẩn. Mọi hệ thống giám sát đều cần một trình phân tích cú pháp — và mọi trình phân tích cú pháp đều gặp khó khăn.
SNMP::MIB::Trình biên dịch
2 ngày với AI · Mô-đun CPAN hoạt động 93% · sửa lỗi có mục tiêu, không cần viết lại
<đầu>4740 MIB · 301 bản sửa lỗi · Ít hơn 52 lỗi so với Go
Grpc::FFI
Cần có gRPC trong Perl. Mọi thứ trên CPAN: không hoạt động, đã chết hoặc bị hỏng.
Vì vậy chúng tôi đã xây dựng nó. Từ đầu. FFI::Platypus liên kết với API gRPC C.
Con đường học tập: UUID::FFI → SQLite::FFI → Grpc::FFI
326 bài kiểm tra đã vượt qua · không rò rỉ bộ nhớ · không gặp sự cố
Ngôn ngữ chéo: Máy khách Perl ↔ Máy chủ Java/Go — đang hoạt động
Truyền trực tuyến: đơn nhất, máy khách, máy chủ, hai chiều
85% đã sẵn sàng sản xuất · ~43 tệp triển khai
Chưa hết - đây chỉ là khúc dạo đầu
cho một cái gì đó lớn hơn.
Điều gì sẽ xảy ra nếu FFI không chỉ là một trình kết nối thư viện được thiết kế riêng...
...nhưng được tích hợp và tự động hơn?
Người điều hướng/Người điều phối
AI không tự mình làm việc này.
Con người: chiến lược, kiến trúc, lộ trình học tập, các ưu tiên
AI: thực thi, tài liệu, học mẫu, lặp lại
Ví dụ về gRPC: Tôi quyết định "bắt đầu với UUID, sau đó là SQLite, rồi gRPC"
Nếu không có bộ điều hướng — AI sẽ tạo ra những thứ ấn tượng không thể đi đến đâu.
Không có AI – người điều hướng sẽ không có đủ thời gian trong ngày.
Vậy... AI khá giỏi về Coding.
Nhưng điều này thực sự có thể đi bao xa?
04 AI thực hiện Perl
Xoay vị ngữ xung quanh.
hạt tiêu
PetaPerl / ParallelPerl
Trình thông dịch Perl 5 — do con người thiết kế.
Viết bằng Rust — bởi nhiều tác nhân AI.
Nghiêm túc — không có đồ chơi hoặc bài tập học tập.
hạt tiêu
PetaPerl / ParallelPerl
Trình thông dịch Perl 5 Nền tảng — do con người thiết kế.
Viết bằng Rust — bởi nhiều tác nhân AI.
Nghiêm túc — không có đồ chơi hoặc bài tập học tập.
pperl — Không phải lần thử đầu tiên
Topaz
1999 · Viết lại C++ · Chip Salzenberg · bị bỏ rơi
B::C / perlcc
1996–2016 · Trình biên dịch Perl-to-C · đã chết
cperl
2015–2020 · Perl 5 fork · Reini Urban · không hoạt động
RPerl
Perl bị hạn chế → C++ · Will Braswell · không hoạt động
WebPerl
Perl 5 → WebAssembly · chạy trên trình duyệt · bán hoạt động
PerlOnJava
Perl 5 trên JVM · Flavio Glock · hoạt động — trò chuyện tại GPW này!
Kiểu lỗi thường gặp: đánh giá thấp độ phức tạp của Perl 5
ngọc — Phạm vi
Perl 5.42 — ish
Khả năng tương thích: cố gắng tuân thủ Perl 5 tối đa, hiện tại là 5,42
Hiệu suất: phấn đấu đạt mức V8
XS: không, nhưng có
Triển khai Native Rust, không thể thiếu đối với trình thông dịch
Chỉ Linux — tất cả kiến trúc
Chúng tôi thực sự không quan tâm đến việc sử dụng v5.xx
pperl — Trạng thái
22.000+
tổng số bài kiểm tra
~61–400 thất bại — cho hay nhận
Hiệu suất: tốt, xấu và xấu xí
Trích dẫn từ AI
13095 vượt qua (+25 so với 13070 trước đó), 31 thất bại (giảm từ 46!). Việc triển khai gốc File::Path không chỉ hoạt động mà còn bỏ chặn 15 thử nghiệm thất bại trước đó phụ thuộc vào File::Path. Hồi quy bằng không.
pperl — Điểm chuẩn
<đầu>list_util::sumlist_util::minlist_util::maxlist_util::sản phẩmTriển khai Rust gốc - không phải XS, không phải C
pperl — Ngoài Perl5
Khả năng tương thích tối đa. Nhưng còn hơn thế nữa.
✓ Tự động song song hóa — for/map/grep qua Rayon · minh bạch · không có chủ đề pragma
✓ Biên soạn JIT — Cranelift · phát hiện đường dẫn mã nóng · mã gốc khi chạy
✓ Auto-FFI — gọi bất kỳ thư viện C nào · không có XS · không biên dịch · Không gian tên Peta::FFI
✓ Biên dịch trước — các đốm màu .plc · bỏ qua phân tích cú pháp · khởi động gần như ngay lập tức
✓ Daemonize — daemon/client kiểu emacs · bộ nhớ dùng chung · không khởi động nguội
Tự động song song hóa
Được cung cấp bởi Rayon — Thư viện song song dữ liệu của Rust
Trình lập lịch đánh cắp công việc
Chia công việc thành các tác vụ, các luồng nhàn rỗi lấy cắp các luồng bận rộn — tự động cân bằng tải
Thay đổi một dòng trong Rust
.iter() → .par_iter() — cùng một mã, thực thi song song
Đảm bảo quyền tự do trong cuộc đua dữ liệu
Nếu nó biên dịch thì nó an toàn. Hệ thống kiểu của Rust thực thi điều này tại thời điểm biên dịch.
# Điều này chỉ hoạt động. Song song.
@results của tôi = bản đồ { cost_computation($_) } @large_list;
# Không có chủ đề. Không có MCE. Không có nĩa.
# perl phát hiện các vòng lặp an toàn → Rayon xử lý phần còn lại.
Cờ --song song · danh sách ≥ 1000 mục · không có đột biến chung
Biên dịch JIT
Đúng lúc — biên dịch thành mã máy trong khi chạy
Cách thức hoạt động trong Perl:
- Trình thông dịch chạy bình thường — định hình các đường dẫn nóng
- Đã phát hiện vòng lặp nóng → hạ xuống IR nâng cần cẩu
- Cranelift biên dịch IR → mã máy gốc
- Lần lặp tiếp theo chạy dưới dạng mã gốc — không có chi phí điều phối
Cranelift — phần phụ trợ của trình biên dịch đằng sau bộ mã hóa thay thế của Wasmtime và Rust.
Sản xuất đã được chứng minh. Mục tiêu: x86-64 · AArch64 · s390x · RISC-V
# perl phát hiện đây là mẫu vòng lặp nóng
tổng $ của tôi = 0;
cho $i của tôi (1 .. 1_000_000) {
$tổng += $i;
}
# → Cranelift biên dịch thành mã máy gốc
JIT — Chiến thắng đầu tiên
JIT vòng lặp bên trong — vòng lặp nóng đơn được biên dịch thành mã gốc
<đầu>JIT đã kích hoạt và bài kiểm tra đã thành công! Câu trả lời là đúng (500000500000).
Tốt. Nhưng chỉ có vòng lặp trong cùng được biên dịch. Thế còn các vòng lặp lồng nhau thì sao?
$py = 0; while ($py < $height) { $y0 = $y_min + $py * $y_step; $row_off = $py * $width; $px = 0; trong khi ( $px < $width) { $x0 = $x_min + $px * $x_step; $zr = 0,0; $zi = 0,0; $iter = 0; while ($iter < $max_iter) { $r2 = $zr * $zr; $i2 = $zi * $zi; cuối cùng if ($r2 + $i2 > 4.0); $zi = 2.0 * $zr * $zi + $y0; $zr = $r2 - $i2 + $x0; $iter++; } $frame[$row_off + $px ] = $color_lut[$iter]; $px++; } $py++;
JIT — Mã
Bộ Mandelbrot
Vòng lặp while lồng ba
19 biến · số học float
Perl thuần túy.
Không có XS. Không có nội tuyến::C.
Không có thủ thuật.
JIT — Lồng nhau hoàn toàn
Tất cả 3 cấp độ vòng lặp được biên dịch thành một hàm gốc
<đầu>
200 triệu lần lặp thoát của số học float.
19 biến, 3 cấp độ vòng lặp - Đăng ký Cranelift phân bổ trên tất cả chúng.
Perl. Với JIT. Đó là một câu nói không ai mong đợi.
JIT tự động song song — Thắng hoàn toàn
JIT + Rayon: biên dịch thành bản địa, sau đó chia thành các lõi
<đầu>
Riêng JIT: 76×. Thêm 8 chủ đề: thêm ~7× ở trên cùng.
người dùng 2,6 giây so với 0,34 giây thực — mở rộng gần như tuyến tính trên các lõi.
Thời gian thử nghiệm!
✓ Tự động FFI
Không có XS. Không có nội tuyến::C. Không biên soạn. Chỉ cần gọi C.
# Lớp 0 — Nguyên: bất kỳ thư viện nào, bạn cung cấp chữ ký kiểu
sử dụng Peta::FFI qw(dlopen call);
$lib = dlopen("libz.so.1"); của tôi
$ver = call($lib, "zlibVersion", "()p");
nói "zlib: $ver"; #1.3.1
Mã loại kiểu gói: (p)L = strlen(const char*) → size_t
Hơn 50 mô-đun Rust gốc đã được tích hợp sẵn — Auto-FFI mở rộng sang mọi thứ khác
FFI tự động — Chi tiết
Được cung cấp bởi libffi — mọi chữ ký đều hoạt động, không có sơ khai được tạo trước
<đầu>libc::* cuộc gọi — không tốn chi phíscan() → hàm băm của { soname => đường dẫn # Lớp 2 — Có gì trên hệ thống này?
sử dụng Peta::FFI qw(quét cuộc gọi dlopen);
$libs = scan() của tôi;
nói vô hướng(keys %$libs), " đã tìm thấy thư viện";
if (tồn tại $libs->{"libz.so.1"}) {
$z = dlopen("libz.so.1"); của tôi
nói "zlib: ", call($z, "zlibVersion", "()p");
Libc: ~30 hàm (tiến trình, chuỗi, env, toán, tệp, thời gian)
UUID: 6 chức năng thông qua dlopen - chết kèm theo gợi ý cài đặt nếu thiếu
✓ Bộ nhớ đệm mã byte (.plc)
Giống như .pyc của Python — nhưng dành cho Perl. Chọn tham gia.
# Mặc định: không có bộ nhớ đệm (an toàn cho quá trình phát triển)
$ perl script.pl
# Kích hoạt: biên dịch một lần, tải từ bộ đệm trong các lần chạy tiếp theo
$ perl --cache script.pl
# Vô hiệu hóa tất cả bộ đệm
$ perl --flush
Lần chạy đầu tiên: phân tích cú pháp → codegen → thực thi → lưu .plc
Lần thứ hai: tải .plc → thực thi (không phân tích cú pháp, không codegen)
Bộ nhớ đệm mã byte — Chi tiết
Storable-model: bincode giải tuần tự hóa trực tiếp thành các loại thời gian chạy cuối cùng. Không cần chuyển đổi trung gian.
<đầu>ba_modulesmixed_native_fallbackdeep_depsChi phí tải mô-đun ròng: nhanh hơn 33–37% khi sử dụng bộ nhớ đệm. Chiến thắng lớn nhất trên các mô-đun dự phòng. Các mô-đun Native Rust đã có chi phí gần như bằng 0.
Khóa SHA-256 · xác thực mtime + phiên bản · tạo phiên bản định dạng linh hoạt
✓ Daemon hóa
Mô hình daemon/máy khách kiểu Emacs
Lần chạy đầu tiên: phân tích → codegen → thực thi (khởi động) → lắng nghe
Yêu cầu của khách hàng: kết nối → fork() → con kế thừa đấu trường → thực thi → phản hồi
fork() cung cấp cho mỗi khách hàng một không gian địa chỉ mới
với tất cả các đấu trường đã được ánh xạ — không có I/O, không phân tích cú pháp, không khử lưu lượng
Daemonize — Chi tiết
<đầu>
Loại bỏ cả hai chi phí khởi động: tạo quy trình (~3-4 mili giây) + biên dịch mô-đun (0-15 mili giây)
Nhanh hơn bộ nhớ đệm bytecode — không giải tuần tự hóa, các đấu trường đã có sẵn trong bộ nhớ
Ổ cắm tên miền Unix · Giao thức dây JSON · sao chép khi ghi trang qua fork()
Daemonize — Nghệ thuật trước
<đầu>
Tất cả các giải pháp trước đó: cùng một trình thông dịch cho các yêu cầu — rò rỉ trạng thái theo thiết kế
perl: con mới theo yêu cầu qua fork() — đấu trường được biên dịch qua COW, trạng thái thời gian chạy sạch
Tương lai
⏳ GPU liền mạch — Perl bị hạn chế → hạt nhân OpenCL/HIP/Vulkan/CUDA · cùng mã, thực thi GPU
⏳ pperl-mini — phiên bản được điều chỉnh và thu nhỏ. Có lẽ trên Raspberry Pico một ngày nào đó?
⏳ pperl-compiler — Có thể một ngày nào đó mã sẽ chạy trên STM32?
Khi nào nên sử dụng hạt trân châu
Vừa vặn:
- Khối lượng công việc được hưởng lợi từ JIT và/hoặc tự động song song
- Tập lệnh sử dụng nội dung gốc (hơn 50 mô-đun Rust, nhanh)
- Khởi động nhanh — vốn đã nhanh hơn ~2× so với Perl5, cộng thêm --cache
- Các tính năng dành riêng cho Perl: Tự động FFI, Daemonize, Bộ đệm bytecode
- Bảo mật: cơ sở mã khác nhau — không thể chia sẻ CVE với Perl5
- Kịch bản nhỏ hơn, ít phức tạp hơn
Chưa:
- Cơ sở mã lớn, phức tạp — các trường hợp biên trong đó perl khác với Perl5
- Chúng tôi cố gắng đạt được khả năng tương thích tối đa nhưng vẫn chưa đạt được 100%
Nguyên tắc chung: kịch bản càng dài và phức tạp,
bạn càng có nhiều khả năng gặp trường hợp góc. Nếu bạn không muốn chạm vào mã - hãy sử dụng Perl5.
Nghiên cứu điển hình về tính đúng đắn
"Khả năng tương thích tối đa" nghiêm trọng đến mức nào?
Lỗi: $, (OFS) so với $\ (ORS) trong print
Perl đã kiểm tra cả hai với cùng một mặt nạ cờ. Perl5 thì không.
perl5 — $, (OFS)
if (SvGMAGICAL(ofs) || SvOK(ofs))
Kiểm tra get-magic VÀ cờ ok
perl5 — $\ (ORS)
if (PL_ors_sv && SvOK(PL_ors_sv))
Chỉ kiểm tra cờ ok. Không có phép thuật.
pperl đã có:
// Cùng một mặt nạ cho cả hai — Đã bao gồm SVS_GMG cho ORS. Sai.
nếu cờ & (SVF_IOK | SVF_NOK | SVF_POK | SVF_ROK | SVS_GMG) != 0
Tác động thực tế: gần bằng 0.
Để kích hoạt điều này, bạn cần có một tie trên $\ có FETCH trả về undef, trong khi SV cơ bản có bộ get-magic nhưng không có IOK/NOK/POK/ROK — rồi gọi print. Không ai viết điều này. Chưa có ai từng viết bài này.
Dù sao thì chúng tôi cũng đã sửa nó.
Mức độ tương thích cao là sự đảm bảo cho sản phẩm.
Tôi đã và đang làm
AI với Perl
trong vài thập kỷ. Bây giờ là lúc để
AI làm Perl.
trong vài thập kỷ. Bây giờ là lúc để
AI làm Perl.
Tải tại đây:
perl.petamem.com
Danke.
Richard Jelinek · rj@petamem.com
PetaMem s.r.o. · petamem.com
Còn một điều nữa.
psh
Vỏ Perl tương tác
Ống đối tượng - truyền cấu trúc dữ liệu, không phải văn bản:
ps() | grep { $_->{mem} > 100_000 }
| sắp xếp { $b->{cpu} <=> $a->{cpu} };
Triết lý của PowerShell · Sức mạnh văn bản của Perl · Tốc độ JIT của Perl
Tác giả: bmn__
