| 패러다임 | 다중 패러다임: 절차적, 함수형, 객체 지향, 제네릭 |
|---|---|
| 설계자 | PascalABC.NET 컴파일러 팀 |
| 발표일 | 2007년 |
| 최근 버전 | 3.11.0 |
| 최근 버전 출시일 | 2025년 2월 29일 |
| 자료형 체계 | 정적, 부분적 추론 |
| 구현 언어 | PascalABC.NET |
| 운영 체제 | 크로스 플랫폼 |
| 라이선스 | LGPLv3 |
| 파일 확장자 | .pas |
| 웹사이트 | pascalabc |
| 영향을 받은 언어 | |
| 델파이, 파스칼, 옥시즌, C 샤프, 파이썬, 코틀린, 하스켈 | |
PascalABC.NET은 다중 패러다임을 지원하는 고급 범용 프로그래밍 언어이다. PascalABC.NET은 델파이의 오브젝트 파스칼을 기반으로 하지만, C 샤프, 파이썬, 코틀린, 하스켈의 영향도 받았다. 윈도우(닷넷 프레임워크), 리눅스 및 MacOS(모노)용 명령 줄 도구로 배포되며, 윈도우와 리눅스용 통합 개발 환경을 포함한다. 이 환경은 대화형 디버거, 코드 자동 완성 시스템, 폼 디자이너, 코드 템플릿 및 코드 자동 서식 기능을 제공한다.
PascalABC.NET은 닷넷 프레임워크 플랫폼용으로 구현되어 모든 닷넷 라이브러리와 호환되며, 쓰레기 수집, 예외 처리, 제네릭과 같은 공통 언어 런타임의 모든 기능을 활용한다. 튜플, 시퀀스, 람다와 같은 일부 언어 구조는 일반적인 닷넷 자료형을 기반으로 한다. PascalABC.NET은 이념적으로 옥시즌과 가깝지만, 이와 달리 델파이와의 높은 호환성을 제공한다.
PascalABC.NET은 러시아 로스토프나도누의 남부 연방 대학교 수학·역학·컴퓨터과학 연구소의 열성적인 그룹에 의해 개발되었다. 2003년, 현대 PascalABC.NET의 전신인 Pascal ABC가 부교수 스타니슬라프 미할코비치에 의해 구현되었다. 이는 구식이 되어 현대 운영체제와 호환되지 않으나 교육용으로 여전히 사용되던 터보 파스칼을 대신하여 학생들을 교육하기 위한 목적이었다. Pascal ABC는 인터프리터 방식으로 구현되어 성능이 크게 떨어졌다. 4년 후, 이 언어는 학생들인 이반 본다레프, 알렉산더 트카추크, 세르게이 이바노프에 의해 닷넷 플랫폼용 컴파일 언어로 완전히 재작성되었다. 2009년부터 PascalABC.NET은 고등학생 교육에 활발히 사용되기 시작했다. 2015년까지 사용자 수는 크게 증가하여 러시아 전역의 학교와 프로그래밍 대회에서 프리 파스칼을 제치고 활발히 사용되기 시작했다. 그 이후로 PascalABC.NET 개발자들은 현대적인 기능을 언어에 적극적으로 통합하는 것을 목표로 삼았다. 같은 해, PascalABC.NET은 GNU 약소 일반 공중 사용 허가서(LGPLv3)로 배포되는 오픈 소스 프로젝트가 되었다.
2017년과 2022년에는 PascalABC.NET 공개 저장소에 대한 독립적인 감사가 수행되었다. 정적 분석 결과에 따라 개발자가 추가로 검토해야 할 잠재적으로 위험한 코드 조각들이 나열되었다. 또한 코드의 전반적인 품질을 개선할 수 있다는 점이 지적되었다. 이를 위해 코드 중복 및 불필요한 검사를 제거하고 리팩토링을 더 신중하게 수행해야 한다고 권고되었다.
교육용으로 설계된 PascalABC.NET은 러시아 학교에서 가장 일반적인 프로그래밍 언어로 남아 있으며, 정보학 통합 국가 시험을 통과하기 위해 권장되는 언어 중 하나이다. 남부 연방 대학교에서는 컴퓨터 과학 전공 학생들의 첫 프로그래밍 언어로 사용되며, 러시아 최대 컴퓨터 학교 중 한 곳에서 아동 교육용으로도 사용된다. PascalABC.NET은 사범대학에서 컴퓨터 과학 교사 양성을 위한 기초 프로그래밍 언어로 널리 사용된다. 또한 과학적 계산 도구로도 활용된다. PascalABC.NET은 여러 프로그래밍 대회용 검증 시스템에도 통합되어 있다.
2020년 코로나19 봉쇄 및 재택 학습 기간 동안, PascalABC.NET 웹사이트는 얀덱스(Yandex) 트래픽 순위 "프로그래밍" 카테고리에서 3위를 차지했으며, 설치 키트 다운로드 횟수는 하루 10,000건을 넘어섰다.
PascalABC.NET 커뮤니티의 핵심은 러시아에 있지만, 이 언어는 벨라루스, 루마니아, 인도네시아, 알제리와 같은 다른 국가에서도 알려져 있다.
• loop 문
loop 10 do
Write('*');
• 단계(step)가 있는 for 루프
for var i:=1 to 20 step 2 do
Print(i);
• 인덱스가 있는 foreach 루프
foreach var c in Arr('a'..'z') index i do
if i mod 2 = 0 then
Print(c);
• a..b 범위
(1..10).Printlines
• 짧은 함수 정의 구문
function Sum(a,b: real) := a + b;
• 클래스 정의 내부에 메서드 구현 배치 가능
type Point = class
x,y: real;
procedure Output;
begin
Print(x,y);
end;
end;
• 배열, 리스트, 집합의 추상화로서의 sequence of T 자료형
var seq: sequence of integer := Arr(1..10);
seq.Println;
seq := Lst(11..100); seq.Println;
seq := HSet(1..20); seq.Println;
• 람다 함수
var a := ArrGen(10,i -> i*i);
• 자동 클래스(auto classes) - 자동으로 생성자가 생성되는 클래스
type Point = auto class
x,y: real;
end;
var p := new Point(2,5);
• 1차원 및 다차원 배열 슬라이스
var m: array [,] of integer := MatrGen(3,4, (i,j) -> i+j+1);
Println(m); // [[1,2,3,4],[2,3,4,5],[3,4,5,6]]
Println(m[:2,1:3]); // [[2,3],[3,4]]
인라인 변수 선언, 자료형 추론, 변수 선언이 포함된 for 문과 같은 다른 기능들은 현재 버전의 델파이에서는 표준 기능이다. 그러나 PascalABC.NET은 2007년에 이러한 기능들을 선도적으로 도입했으며, 델파이에서는 2018년에 구현되었다.
case 문에서의 문자열 지원set of stringnew T(...) 구문으로 생성자 호출 가능interface 및 implementation 섹션 없이)로 정의 가능PascalABC.NET에서 함수는 일급 객체이다. 함수는 변수에 할당되거나, 매개변수로 전달되거나, 다른 함수에서 반환될 수 있다. 함수형 자료형은 T -> Res 형태로 설정된다. 익명 함수는 이 자료형의 변수에 할당할 수 있다:
## // ##은 메인 프로그램을 begin-end 없이 작성함을 나타냄
var f: real -> real := x -> x*x;
다음은 두 함수의 합성 예제이다:
##
function Super<T,T1,T2>(f: T1 -> T2; g: T -> T1): T -> T2 := x -> f(g(x));
var f: real -> real := x -> x*x;
var fg := Super(f,Sin);
var gf := Super(Sin,f);
Print(fg(2));
Print(gf(2));
합성 연산은 표준 라이브러리에 정의되어 있다:
##
var f: real -> real := x -> x*x;
Print((f*Cos)(2));
Print((Cos*f)(2));
"How To Program Effectively In Delphi"라는 책과 관련 비디오 튜토리얼에서, 프로그래머이자 컴퓨터 과학 교육 전문가인 케빈 본드 박사는 PascalABC.NET이 델파이에는 없는 강력한 함수형 프로그래밍 기능을 갖추고 있다고 언급한다. 그 예로 함수 부분 적용이 다음과 같이 시연된다:
begin
var f: integer -> integer -> integer := x -> y -> x + y;
Writeln(f(2)(6));
end.
PascalABC.NET은 다중 패러다임 프로그래밍 언어이다. 고전적인 파스칼부터 함수형 및 객체 지향 프로그래밍에 이르기까지 다양한 코딩 스타일을 사용할 수 있다. 동일한 작업을 다음과 같이 다양한 스타일로 해결할 수 있다:
begin
var (a,b) := ReadInteger2; // 입력을 두 변수의 튜플로 읽음
var sum := 0; // 자료형 자동 추론
for var i:=a to b do
sum += i*i;
Print($'Sum = {sum}') // 문자열 보간
end.
function SumSquares(a,b: integer): integer;
begin
Result := 0;
for var i := a to b do
Result += i * i
end;
begin
var (a,b) := ReadInteger2;
Print($'Sum = {SumSquares(a,b)}')
end.
이 솔루션은 시퀀스에 대한 닷넷 확장 메서드와 PascalABC.NET 고유의 (a..b) 범위를 사용한다.
begin
var (a,b) := ReadInteger2;
(a..b).Sum(x -> x*x).Print // 람다 표현식을 사용한 메서드 체이닝
end.
이 솔루션은 PascalABC.NET 고유의 짧은 함수 정의 스타일을 보여준다.
type Algorithms = class
static function SumSquares(a,b: integer) := (a..b).Sum(x -> x*x);
static function SumCubes(a,b: integer) := (a..b).Sum(x -> x*x*x);
end;
begin
var (a,b) := ReadInteger2;
Println($'Squares sum = {Algorithms.SumSquares(a,b)}');
Println($'Cubes sum = {Algorithms.SumCubes(a,b)}')
end.
PascalABC.NET 표준 라이브러리를 사용하지 않고 프로그램을 작성할 수도 있다. 모든 표준 닷넷 프레임워크 클래스와 메서드를 직접 사용할 수 있다.
uses System; // 닷넷 System 네임스페이스 사용
begin
var arr := Console.ReadLine.Split(
new char[](' '),
StringSplitOptions.RemoveEmptyEntries
);
var (a,b) := (integer.Parse(arr[0]),integer.Parse(arr[1]));
var sum := 0;
for var i:=a to b do
sum += i*i;
Console.WriteLine($'Sum = {sum}')
end.
PascalABC.NET이 교사 교육에 활발히 사용되고 있음에도 불구하고, 일부 교육계 구성원들은 역사적으로 사용되어 온 터보 파스칼과 PascalABC.NET의 차이를 무시한 채, 특정되지 않은 "파스칼" 언어가 현대 프로그래밍과 거리가 멀고, 장황하며 첫 프로그래밍 언어로 사용하기에는 충분히 간단하지 않다고 비판한다. 그들은 파이썬이 더 간결하고 실무적이기 때문에 가장 좋은 출발점이라고 생각한다. 이에 대해 PascalABC.NET 개발자들을 포함한 반대자들은 고전 파스칼과 PascalABC.NET을 동일시하는 것은 잘못된 것이라고 주장한다. 왜냐하면 후자는 파이썬의 기능을 포함한 수많은 현대적 다중 패러다임 기능을 가지고 있기 때문이다. PascalABC.NET은 학생들이 파이썬만큼 간결하고 표현력이 풍부한 프로그램을 작성할 수 있게 하며, 정적 자료형 개념을 적용함으로써 "실무 프로그래밍으로 가는 가교" 역할을 한다. PascalABC.NET은 또한 컴파일 가능한 언어로서, 모든 의미론적 오류를 런타임이 아닌 컴파일 타임에 포착하므로 프로그래밍 학습을 더 쉽게 만든다. 파스칼은 엄격하게 구조화된 프로그래밍 언어로 간주되는 경우가 많아 입문 프로그래밍 교육을 위한 인기 있는 선택지이다. 그러나 일부 저자들은 파이썬을 초보자 친화적인 언어로 홍보하는 것이 부분적으로는 상업적 이해관계에 의한 것이라고 주장한다.