Free Pascal compiler now supports dynamic packages
Free Pascal 컴파일러에 동적 패키지 지원 추가
Free Pascal Compiler와 Lazarus IDE에 동적 패키지 기능이 처음으로 완전히 구현됐습니다. IDE 전체를 다시 빌드하지 않고 컴포넌트를 설치하거나 제거할 수 있으며, 프로그램에서는 Pascal 클래스와 타입을 노출하는 플러그인을 만들 수 있습니다. 패키지별 유닛 이름 충돌과 추가 메타데이터에 따른 파일 크기 증가는 제약으로 남습니다.
- 주제
에디터 노트
이번 구현의 가장 직접적인 이점은 Lazarus 확장 개발의 반복 시간을 줄이는 데 있습니다. 패키지를 수정할 때 IDE 전체를 재빌드하지 않고 컴포넌트를 갱신하며, 애플리케이션도 실행 중 교체 가능한 패키지로 나눌 수 있습니다. 댓글의 Delphi 패키지와 비슷하냐는 질문에는 원문이 비교 설명을 제공하지 않아 구현상 동등성을 판단할 근거가 없습니다. 이 기능은 별도 포크 브랜치에 먼저 공개됐고, 메인라인 병합은 피드백 이후의 단계로 남아 있습니다. 따라서 FPC와 Lazarus 사용자 전체가 기본 배포판에서 바로 쓸 수 있는 기능으로 소개하기보다 현재 이용 경로와 통합 상태를 구분해야 합니다. 유닛 이름의 전역 충돌과 메타데이터 제거 시 패키지 기능이 깨지는 제약도 실제 패키지 배포와 생태계 확장에 영향을 줍니다. 접근성 문제를 제기한 댓글은 IDE 패키징 개선과 별개의 사용자 제약을 짚지만, 토론에는 구체적인 재현이나 해결책이 없습니다.
AI 요약
Free Pascal Compiler(FPC)와 Lazarus IDE에 동적 패키지(dynamic package) 지원이 처음으로 완전히 구현됐습니다. Lazarus 컴포넌트와 확장 기능을 설치할 때 IDE 전체를 다시 빌드하지 않아도 됩니다. 애플리케이션을 여러 패키지로 나누면 실행 중 교체할 수 있는 플러그인 시스템으로도 활용할 수 있습니다. 기능은 Linux, Windows, macOS용 공유 라이브러리 형태로 제공되며, 컴파일러와 런타임 라이브러리(RTL), IDE가 함께 변경됐습니다.
패키지와 런타임
동적 패키지 파일에는 컴파일러가 생성한 메타데이터가 들어갑니다. 새 RTL 유닛인 DynPkgTypes.pas를 사용하면 패키지에 포함된 타입의 이름과 종류, RTTI(Runtime Type Information), 클래스 정보를 읽을 수 있습니다. 런타임은 프로그램과 패키지 사이에서 스레드 변수와 문자열, 동적 배열 같은 동적 타입을 관리하는 기능도 제공합니다. RTL에는 패키지를 로드하고 내용을 열거하거나 검색하고 언로드하는 함수가 포함됩니다.
배포할 때는 프로그램 전체를 단일 실행 파일로 묶어도 되고, 여러 동적 패키지로 나눠 실행 중 교체하도록 구성해도 됩니다. 다만 패키지에 들어가는 유닛 이름은 다른 패키지의 유닛 이름과 겹치면 안 됩니다. 패키지 이름과 같은 유닛 이름도 사용할 수 없습니다. 패키지 파일에는 내부 정보를 담는 메타데이터가 들어가므로 일반 공유 라이브러리보다 크며, strip으로 메타데이터를 제거하면 동적 패키지로 작동하지 않습니다.
Lazarus IDE 변경 사항
IDE에 등록된 패키지의 소스가 바뀌면 Lazarus가 변경을 감지해 IDE를 시작하기 전에 패키지를 다시 빌드합니다. 패키지를 여러 개 추가하거나 제거할 때도 진행 상황을 보여주는 창이 나타나며, 전체 IDE 재빌드 작업과 예상 남은 시간도 표시합니다. 최근 열었던 패키지를 보여주는 창은 세션 사이에도 목록을 유지하고, 패키지 안의 파일을 열 수 있습니다.
패키지 창에서 Compile을 누르면 관련 컴포넌트와 확장 기능을 갱신할 수 있습니다. 패키지를 추가하거나 제거해도 IDE 전체를 다시 빌드하지 않습니다. 패키지 설정에서는 지원 플랫폼과 위젯셋을 제한할 수 있어 조건에 맞지 않는 패키지를 목록과 변경 감지 대상에서 제외합니다. 폼이나 프레임을 설치 가능한 컨트롤로 변환하는 기능도 추가됐습니다. 이때 컨트롤과 이벤트, 메서드, 속성을 새 컨트롤로 복사합니다.
공개 상태와 제약
변경 사항은 dynamic packages라는 이름의 별도 GitLab 포크 브랜치에 커밋됐습니다. 게시자는 충분한 피드백을 받은 뒤 변경 사항을 메인라인으로 보내는 과정이 남아 있다고 설명했습니다. 따라서 이번 발표는 공식 기본 배포판에 이미 통합됐다는 뜻은 아닙니다. macOS와 M1 아키텍처용 빌드 및 컴파일러 지원을 만드는 데 어려움이 있다는 점도 밝혔습니다.
Hacker News 반응
- @andsoitis — 축하합니다. Pascal, Lazarus, Delphi는 개발 과정에서 반응성이 균형 있게 잘 잡혀 있습니다.
- @sysrpl — 감사합니다. 오래 기다린 기능이며, 어쩌면 20년 동안 만들어졌습니다. 사람들은 새로운 언어와 프레임워크로 옮겨가지만, 오래된 Delphi와 이제는 Lazarus로 데스크톱 소프트웨어를 만드는 과정에는 대부분의 프레임워크보다 편한 점이 있습니다. 폼 디자이너에 컴포넌트를 놓고 실행하면 몇 초 만에 프로그램이 나옵니다. 동적 패키지 지원으로 네이티브 코드 설치나 제거 때 IDE를 다시 빌드할 필요가 없어져 컴포넌트를 더 빠르게 만들거나 사용할 수 있습니다.
- @pjmlp — 성과를 축하합니다. Delphi 패키지와 비슷하다고 보면 되나요?
- @kristianp — Lazarus 포크로 보입니다. 공식 Lazarus는 lazarus-ide.org에 있습니다.
- @sysrpl — getlazarus.org는 13년 동안 정식 릴리스보다 앞선 기능을 FPC와 Lazarus에 추가하려고 운영해 왔습니다. 동적 패키지도 오랫동안 작업했으며, 지금부터 메인라인에 병합 요청을 보내기까지 시간이 걸릴 예정입니다. 충분한 시간과 피드백이 쌓이면 보통 정식 릴리스에 들어갑니다.
- @HexDecOctBin — 예전에 Lazarus를 써봤을 때 FPC에 Delphi와 달리 블록 어디서나 변수를 선언하는 기능이 없는 점이 가장 이상했습니다. 생태계가 정체되면 이런 일이 생기는 걸까요?
- @wk_end — 질문은 함수 맨 위가 아니라 처음 사용하는 위치에서 변수를 선언하는 기능입니다. C99도 지원하는 기능이라 클로저나 C 호환성을 제한하는 기능이 필요하지 않습니다.
- @sizzzzlerz — 요즘 Pascal을 많이 쓰나요? 선택할 수 있는 언어가 많고 더는 자주 가르치지 않는데, 프로젝트에서 Pascal을 택할 이유가 있나요?
- @djriley — Object Pascal은 잘 드러나지 않는 언어라고 생각합니다. 대형 오픈소스 프로젝트나 상용 제품은 많지 않지만, 업무 부서나 기술 조직의 사내 소프트웨어에는 꽤 쓰입니다. 소규모 팀이 GUI와 성능을 갖춘 프로그램을 빠르게 만들 수 있습니다. Lazarus의 크로스 플랫폼 GUI 지원도 장점입니다.
- @ethin — Lazarus가 쓰는 UI 툴킷에는 스크린 리더로 사용하기 어렵게 만드는 접근성 문제가 있습니다.
- @yonisto — 축하합니다. Windows에서는 기본 주소 배정을 어떻게 처리하나요?
원문: getlazarus.org / 번역·요약: Trawling