Tin tức chung·Hacker News·2 lượt xem

Parallel Perl – trình thông dịch tự động song song với JIT

Parallel Perl – autoparallelizing interpreter with JIT

AI Summary

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

Cài đặt tham khảo S1 Nuremberg

Tham khảo S1 · Nuremberg

~24 kWp · 45 kWh · 80+% ngoài lưới · cấp điện

Cài đặt tham khảo J2 Praha

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

1400

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

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

WHIP

WHIP "Tôi sẽ tự xây dựng."

Trải nghiệm FHEM

"Chúng tôi không thích CPAN" — sự phụ thuộc tạo ra vấn đề. Vì vậy, chúng tôi tự mình thực hiện lại mọi thứ. Nhưng tệ hơn. "Chúng tôi không thích PBP" — đóng góp được thực hiện bởi những người nghiệp dư. Kỳ vọng quá cao sẽ giết chết sự đóng góp. "Các thuật toán hiệu quả được đánh giá quá cao" — "Vậy thì sao? Nhanh hơn 0,1 giây?" "Kiểm tra? TDD? Đó là công việc thừa thãi!" "Tôi không thích bạn, bạn không thể sử dụng mã GPL của tôi"

QR FHEM SVN 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.)

MySensors

Ý 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

Nút tự làm của MySensors

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

STM32 Black Pill

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

STM32 Blue Pill

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

STM32 Viên thuốc xanh

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?

WHIP Hub Assembly

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

Waveshare 2-CH CAN HAT

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.
Các nút hoạt động tự động ngay cả khi trung tâm/máy chủ ngừng hoạt động.

Hạch — Đang hoạt động

DEF LightTimeout = 300#5 phút # Phát hiện chuyển động: bật đèn, bắt đầu hẹn giờ NẾU chuyển động:được phát hiện THÌ đèn:bật; ĐẶT $T_0 = Thời gian chờ # Hết giờ: tắt đèn NẾU !$T_0 THÌ đèn:tắt # Nút chéo: khói bếp → báo động khắp nơi Bếp DEF = 42 NẾU Nhà bếp:khói:được phát hiện THÌ còi:báo động(1)

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.

QR EN

🇬🇧 Tiếng Anh

QR DE

🇩🇪 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

"Người dùng 'PETAMEM' được đặt thành nologin. Tài khoản của bạn có thể đã được đưa vào quá trình đặt lại mật khẩu đề phòng sau khi xảy ra sự cố vi phạm dữ liệu tại một số trang web khác. Vui lòng liên hệ với module@perl.org để tìm hiểu cách tiếp tục."

→ Đã nói chuyện với module@perl.org. Không có câu trả lời.

2025-10-01

"Ich leite das mal auf Steffen Winklers Empfehlung hier weiter an Dich, weil von module@perl.org bislang keine Reaktion kam. Würde jetzt mal wieder gerne ein paar Module auf CPAN schmeissen. :-)"

→ Một Andy Koenig. Không có câu trả lời.

2025-10-06

"Chào Soren. Bạn có muốn làm gì với Andy König hoặc dừng lại việc dừng lại với PAUSE/CPAN bạn có thể làm điều đó với bạn không? Wir würden mal gerne unsere Module auf Vordermann mangen, aber [...] và bei module@perl.org oder andyk@cpan.org rührt sich keiner."

→ 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> Trình phân tích cú pháp Ngôn ngữ Thất bại Tỷ lệ đậu pysmi Python 296 93,8% gosmi Đi 91 98,1% Của chúng tôi Perl 39 99,2%

4740 MIB · 301 bản sửa lỗi · Ít hơn 52 lỗi so với Go

QR GitHub github.com/petajoulecorp/SNMP-MIB-Compiler

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"
AI thực hiện từng giai đoạn, ghi lại các bài học, chuyển sang giai đoạn tiếp theo

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.

pperl huy hiệu

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 huy hiệu

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ấuxấ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> Điểm chuẩn perl5 hạt tiêu tỷ lệ list_util::sum 191,8K 372,8K 1,9x list_util::min 199,8K 772,9K 3,9x list_util::max 201,3K 673,7K 3,3x list_util::sản phẩm 2,7 triệu 4,0 triệu 1,5x

Triể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:

  1. Trình thông dịch chạy bình thường — định hình các đường dẫn nóng
  2. Đã phát hiện vòng lặp nóng → hạ xuống IR nâng cần cẩu
  3. Cranelift biên dịch IR → mã máy gốc
  4. 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> Điểm chuẩnperl5pperl được diễn giảipperl JIT so với Perl5 Mandelbrot 133 mili giây 1493 mili giây 41 mili giây Nhanh hơn 3,2 lần Ackermann 13 mili giây 630 mili giây 12 mili giây Nhanh hơn 1,1 lần

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> Mandelbrot 1000×1000perl5pperl diễn giảipperl JITso với perl5 Giờ treo tường 12.514 mili giây — 163 mili giây Nhanh hơn 76 lần

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> Mandelbrotperl5pperl JITpperl JIT + 8 chủ đềso với Perl5 1000×1000 12.514 mili giây 163 mili giây 29 mili giây Nhanh hơn 431× 4000×4000 ~200 giây 2.304 mili giây 342 mili giây nhanh hơn ~580×

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
# Lớp 1 — Nướng sẵn: chữ ký được tuyển chọn, không có lễ nghi sử dụng Peta::FFI::Libc qw(getpid strlen strerror uname); nói strlen("xin chào"); # 5 @info = uname() của tôi; nói "$info[0] $info[2]"; # Linux 6.18.6-arch1-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> LớpPhạm viCơ chế Raw (Lớp 0)Bất kỳ tệp .so nào trên hệ thốngdlopen + dlsym + libffi khung cuộc gọi Được nướng sẵn (Lớp 1)libc, libuuid, ...Direct Rust libc::* cuộc gọi — không tốn chi phí Khám phá (Lớp 2)Quét toàn hệ thốngscan() → 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> Điểm chuẩn perl5 hạt tiêu pperl --cache ba_modules 22,3 mili giây 12,6 mili giây 9,9 mili giây mixed_native_fallback 26,3 mili giây 13,0 mili giây 10,0 mili giây deep_deps 18,1 mili giây 13,1 mili giây 9,9 mili giây

Chi 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

$ perl --daemon script.pl # biên dịch, khởi động, lắng nghe $ perl --client script.pl # kết nối → rẽ nhánh → chạy → phản hồi $ perl --stop script.pl # tắt máy sạch

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> Điểm chuẩn perl5pperl--cache--daemon 5 mô-đun gốc 15,0 mili giây4,3 mili giây4,3 mili giây4,6 mili giây dự phòng + kết hợp gốc 23,5 mili giây15,8 mili giây~10 mili giây 5,0 mili giây (3,2×)

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> Giải phápPhạm viCách lyRò rỉ trạng tháiTrạng thái PPerlCLI chungKhông cóCóĐã chết (2004) CGI tốc độCGIKhông cóCóĐã chết (2003) mod_perlApache Theo từng trẻTheo yêu cầuĐược duy trì StarmanPSGIMỗi công nhânTheo yêu cầuĐược duy trì FastCGIWebMỗi quy trìnhTheo yêu cầuĐược duy trì pperl daemonCLI chungTheo yêu cầu (ngã ba)Không cóHoạt động

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 $\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.

Tải tại đây:

QR perl.petamem.com 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

ls "-la"; # đó chỉ là một cuộc gọi phụ cd "/tmp"; # trình bao bọc chdir ps "phụ trợ"; #lệnh hệ thống # Nhưng bạn đã sử dụng ngôn ngữ kịch bản rồi: cho $f (glob("*.log")) { của tôi nếu (-M $f > 7) { rm $f; nói "đã làm sạch $f"; }

Ố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__

#discussion