TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 22 READS

현대 Object Pascal 다시 보기: Turbo Pascal을 넘어선 실용 언어

현대 Object Pascal 다시 보기: Turbo Pascal을 넘어선 실용 언어
SOURCE IMAGE · HACKER NEWS

많은 개발자에게 파스칼은 학창 시절 Turbo Pascal로 배우고 잊은 언어로 남아 있다. 그러나 Castle Game Engine 제작자가 정리한 이 소개 글은 현대 Object Pascal이 클래스, 유닛, 인터페이스, 제네릭 같은 기능을 모두 갖춘, C++·Java·C#과 기능적으로 견줄 만한 언어로 진화했다는 점을 강조한다. 고수준 추상화를 제공하면서도 필요하면 저수준 제어까지 내려갈 수 있다는 것이 저자가 내세우는 핵심이다. 이미 프로그래밍 경험이 있는 독자를 대상으로, 변수가 무엇인지 같은 기초 설명은 생략하고 언어 기능들이 어떻게 하나의 일관된 체계로 맞물리는지를 보여주려는 것이 이 글의 의도다.

생태계와 컴파일러 선택

실무자가 먼저 확인할 부분은 도구 생태계다. 파스칼에는 이식성 높은 오픈소스 컴파일러인 Free Pascal Compiler(FPC)가 있고, 이를 사용하는 Lazarus IDE는 편집기, 디버거, 비주얼 컴포넌트 라이브러리, 폼 디자이너를 함께 제공한다. 상용 진영에는 Embarcadero의 Delphi가 있다. FPC와 Delphi 모두 네트워킹, GUI, 데이터베이스, XML·JSON·이미지 같은 파일 포맷, 스레딩 등 폭넓은 표준 유닛을 기본 제공하므로, 언어 자체가 오래되었다는 인상과 달리 실제 애플리케이션 개발에 필요한 기반은 갖춰져 있다. Lazarus나 Delphi에서 GUI 프로젝트를 새로 만들면 각 플랫폼의 네이티브 룩을 갖춘 크로스플랫폼 애플리케이션이 곧바로 만들어진다는 점도 언급된다.

다만 여기에는 실무적으로 유념할 함정이 하나 있다. FPC는 여러 '문법 모드'를 지원하는데, 이 글은 FPC 개발자가 권장하고 Lazarus·Castle Game Engine의 기본값인 ObjFpc 모드를 기준으로 삼는다. 이는 Delphi 문법 모드와 미묘하게 다르다. 두 컴파일러, 그리고 두 모드 사이의 차이는 크지 않지만, 양쪽에서 모두 컴파일되도록 예제 코드에 {$ifdef FPC} ... {$endif} 같은 조건부 컴파일 지시자가 끼어들 수 있다. 프로젝트가 한쪽 컴파일러만 대상으로 한다면 해당 분기만 남기고 정리해 코드를 단순화하는 편이 낫다.

함수와 제어 흐름의 파스칼식 관습

언어 세부로 들어가면 C 계열과 구별되는 관습이 눈에 띈다. 함수의 반환값은 특수 변수 Result에 대입하며, 이 변수는 지역 변수처럼 자유롭게 읽고 쓸 수 있다. 함수 이름 자체를 대입 대상으로 쓸 수도 있으나 저자는 신규 코드에서 이를 권하지 않는다. 실행을 중간에 끝내려면 Exit를, 값을 지정하며 즉시 반환하려면 C의 return과 동일한 Exit(X)를 쓴다. 함수 결과는 버릴 수 있어서, 부수 효과가 목적인 함수는 프로시저처럼 호출해도 된다. 매개변수 없는 함수를 재귀 호출할 때는 괄호 ()를 반드시 붙여, 현재 결과값 접근과 구분해야 한다는 점도 실수하기 쉬운 대목이다.

조건문에서는 조건을 괄호로 감쌀 필요가 없고, else는 가장 가까운 if와 짝지어진다. 저자는 중첩 if를 begin ... end 블록으로 감싸 들여쓰기가 흐트러져도 어느 조건에 붙는지 분명하게 하라고 권한다. 연산자 우선순위도 주의가 필요하다. and·or·not·xor는 논리 연산이자 정수에 대한 비트 연산으로 쓰이는데, 이들이 관계 연산자보다 우선순위가 높다. 그래서 A = 0 and B 같은 식은 먼저 0 and B가 비트 연산으로 계산되어 정수를 내고, 이를 불리언과 비교하려다 타입 불일치 오류가 난다. 원하는 순서를 얻으려면 괄호가 필요하다.

단축 평가(short-circuit)가 적용된다는 점은 실용적으로 중요하다. MyFunction(X) and MyOtherFunction(Y)에서 첫 항이 false면 둘째 항은 아예 실행되지 않는다. 덕분에 포인터가 nil인지 먼저 검사한 뒤 그 값을 참조하는 식의 방어적 코드를 안전하게 쓸 수 있다. nil은 다른 언어의 널 포인터에 해당한다.

열거형과 반복

파스칼의 열거형은 불투명(opaque) 타입이라 정수와 자유롭게 오가지 않는다. 필요할 때만 Ord로 정수화하거나 타입캐스트로 되돌리되, 정수를 열거형으로 변환할 때는 값이 유효 범위(0부터 Ord(High(...))까지)에 있는지 먼저 확인해야 한다. 열거형 이름은 전역 네임스페이스에 놓이므로, 타입 이름의 두 글자 약어를 접두사로 붙여(예: 'ak') 이름 충돌을 줄이는 관습이 쓰인다. 이 열거형과 서수형은 배열 인덱스나 집합(내부적으로 비트필드)의 요소로도 활용된다.

case 문에는 C의 switch와 달리 자동 폴스루가 없어 break를 기억할 필요가 없고, 매 실행마다 최대 한 분기만 실행된다. 반복문에서는 while이 '계속할 조건'을 말하는 반면 repeat..until은 '멈출 조건'을 말하며 조건을 끝에서 검사해 최소 한 번은 실행된다. for 루프는 연속된 값 순회에 특화되어 있어 유연성은 낮지만 상·하한이 시작 전 한 번만 계산되는 등 최적화 여지가 크다. 이 때문에 루프 종료 후 카운터 변수의 값은 정의되지 않은 것으로 간주해야 하며, Break나 Exit로 조기 종료한 경우에만 마지막 값이 보장된다. 한편 for..in 구문은 다른 언어의 foreach처럼 배열, 열거형의 모든 값, 집합의 원소, 그리고 TObjectList 같은 커스텀 리스트 타입까지 순회한다.

이 소개 글이 다루는 범위는 명령줄 수준의 언어 기능에 한정되며, 3D·2D 게임 엔진이나 GUI 애플리케이션 같은 화려한 결과물은 별도의 도구를 통해서만 확인할 수 있다. 그럼에도 현대 파스칼을 '학교에서 배운 옛 언어'로만 기억하는 실무자에게는, 폴스루 없는 case나 불투명 열거형처럼 오류를 줄이도록 설계된 언어 관습들이 여전히 검토해 볼 만한 선택지임을 보여준다는 점에서 참고 가치가 있다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://castle-engine.io/modern_pascal
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...