{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보
|이름 = 파스칼
|그림 = LagrangePAS.png
|로고 = 
|패러다임 = [[다중 패러다임 프로그래밍 언어|다중 패러다임]] ([[명령형 프로그래밍|명령형]] [[절차적 프로그래밍|절차적]] [[구조적 프로그래밍|구조적]])
| released = {{시작 날짜와 나이|1970}}
|설계자 = [[니클라우스 비르트]]
|개발자 = [[니클라우스 비르트]]
|최근 버전 = 
|최근 버전 출시일 = 
|미리보기 버전 = 
|미리보기 버전 출시일 = 
|형 체계 = 
|구현체 = [[UCSD 파스칼|UCSD]], [[터보 파스칼|터보]]
|방언 = [[오브젝트 파스칼]]
|영향을 받은 언어 = [[알골 (프로그래밍 언어)|알골]]
|영향을 준 언어 = [[델파이]], [[크롬 프로그래밍 언어|크롬]]
|운영 체제 =
|라이선스 =
|웹사이트 =
}}

'''파스칼'''(Pascal)은 1969년에 [[스위스]] [[취리히 연방 공과대학교|ETH 취리히]]의 [[컴퓨터 과학|컴퓨터 과학자]] [[니클라우스 비르트]]가 개발한 [[프로그래밍 언어]]로, 당대의 가장 인기있는 교육용 언어 중 하나였으며, 1980년대와 1990년대 초반에 걸쳐 널리 사용되었다.

파스칼은 발표 당시에는 아주 기본적인 컴퓨터 언어의 요소만을 가지고 있었으므로 시스템을 직접 다루기에는 부족하였다. 파스칼이라는 이름은 [[프랑스]]의 수학자이자 철학자 [[블레즈 파스칼]]의 이름을 딴 것이다. [[포인터 (프로그래밍)|포인터]]를 사용한 [[구조적 프로그래밍]]과 [[자료 구조|데이터 구조화]](data structuring)를 그 특징으로 한다.

과학 연구를 목적으로 만들어진 [[고급언어]]인 [[알골 60]]의 영향을 받은 까닭에, 같은 시기에 마찬가지 영향을 받아 제작된 [[C (프로그래밍 언어)|C]]와 여러 가지 면에서 유사한 점을 갖는다. 그러나 코드를 간결하게 하고 버그를 더 쉽게 잡아내기 위한 목적으로 몇 가지 기능을 제한함으로써 결과적으로 C 언어에 비해 활용도가 떨어지는 언어가 되었다. 그러나 완전히 비실용적인 언어라는 뜻은 아니며, 실제로 [[TeX]]나 초기 [[매킨토시]] [[운영 체제]] 제작에 사용됐다. 최근{{언제|날짜=2012-12-1}}에는 파스칼 컴파일러 자체가 크게 개선되고 소프트웨어 개발 기술의 발전으로 이런 사소한 차이점은 거의 무시할 수 있는 단점이 되었다. 어셈블리를 직접 사용한다.

현재는 초기의 파스칼에 비해 많은 부분이 추가, 개선되고 다른 언어의 장점들을 따와 상용 파스칼 컴파일러인 [[델파이]]는 C++과 거의 기능 차이가 없다.

== 컴파일러 ==
많은 변종들이 존재하며, [[객체 지향 프로그래밍]]을 위해 기능을 추가한 변종들도 다수 존재한다. [[엠바카데로]] 사의 [[델파이]]와 [[카일릭스]]는 파스칼의 직계 후손이라 할 수 있는 [[오브젝트 파스칼]]을 사용한다. [[델파이]] 7 버전부터는 델파이라는 말을 사용하기도 한다.

오픈 소스로 제작된 [[프리 파스칼]]이나 [[GNU 파스칼]]도 있다.

== 개발도구 ==
델파이 언어로 불리는 변종 오브젝트 파스칼은 델파이, 프리 파스칼 IDE, [[라자루스]] 등에서 개발할 수 있다. 볼랜드 파스칼이라 불리는 델파이 이전의 오브젝트 파스칼은 [[터보 파스칼]], [[프리 파스칼]] IDE에서 개발할 수 있다.

== 언어 구성 ==
=== Hello world ===
<syntaxhighlight lang="pascal">
program HelloWorld(output);
begin
  writeln('Hello, World!')
end.
</syntaxhighlight>

=== 콘솔 입출력 ===
<syntaxhighlight lang="Pascal">
program WriteName;

VAR
  Name:string; { This declares the variable Name as a string }

BEGIN
  Write('Please give your name: ');
  Readln(Name); { Readln reads the string printed on the screen }
  WriteLn('Hello ', Name);
END.
</syntaxhighlight>

=== 자료 구조 ===
<syntaxhighlight lang="pascal">
var
  r: Real;
  i: Integer;
  c: Char;
  b: Boolean;
  e: (apple, pear, banana, orange, lemon);
</syntaxhighlight>

일반 유형의 하부 범위는 다음과 같이 짤 수 있다:

<syntaxhighlight lang="pascal">
type
  fruit=(apple, pear, banana, orange, lemon);

var
  x: 1..10;
  y: 'a'..'z';
  z: pear..orange;
</syntaxhighlight>

다른 프로그래밍 언어와 달리, 파스칼은 집합 유형을 지원한다:

<syntaxhighlight lang="pascal">
var
  set1: set of 1..10;
  set2: set of 'a'..'z';
  set3: set of pear..orange;
</syntaxhighlight>

집합은 현대 수학에 있어 기본적인 개념이며 수많은 알고리즘이 집합을 사용하여 정의된다. 그러므로 이러한 알고리즘을 추가하는 것은 파스칼에 매우 알맞다고 볼 수 있다. 집합형 연산은 효율적이기도 하다.

많은 파스칼 컴파일러가

<syntaxhighlight lang="pascal">
if i in [5..10] then
  ...
</syntaxhighlight>

을

<syntaxhighlight lang="pascal">
if (i>4) and (i<11) then
  ...
</syntaxhighlight>

보다 더 빠르게 수행한다.

형(type)은 선언을 통해 다른 형으로부터 정의될 수 있다:

<syntaxhighlight lang="pascal">
type
  x = Integer;
  y = x;
 ...
</syntaxhighlight>

또한, 복잡한 형은 단순한 형으로 구성할 수 있다:

<syntaxhighlight lang="pascal">
type
  a = Array [1..10] of Integer;
  b = record
        x: Integer;
        y: Char
      end;
  c = File of a;
</syntaxhighlight>

==== 포인터 ====
파스칼은 [[포인터 (프로그래밍)|포인터]] 사용을 지원한다:
<syntaxhighlight lang="pascal">
 type
   a = ^b;
   b = record
         x: Integer;
         y: Char;
         z: a
       end;
 var
   pointer_to_b: a;
</syntaxhighlight>

가변 <code>''pointer_to_b''</code>가 자료형 <code>''b''</code> 레코드의 포인터이다. 포인터들은 선언 전에 사용할 수 있다. 새로운 레코드를 만들어 값<code>''10''</code>과 <code>''A''</code>를 레코드 안의 필드 <code>''a'', ''b''</code>로 할당하려면, 다음과 같은 명령어를 사용하면 된다:

<syntaxhighlight lang="pascal">
   new(pointer_to_b);
   pointer_to_b^.x := 10;
   pointer_to_b^.y := 'A';
   pointer_to_b^.z := nil;
 ...
</syntaxhighlight>

한정자를 보다 효과적으로 통제하기 위해서는 <code>''with''</code> 문을 써서 다음과 같은 방식을 사용할 수도 있다.
<syntaxhighlight lang="pascal">
   new(pointer_to_b);
   with pointer_to_b^ do
     begin
         x := 10;
         y := 'A';
         z := nil
     end;
 ...
</syntaxhighlight>

=== 제어 구조 ===
파스칼은 [[구조 프로그래밍]] 언어이며, 제어 흐름을 goto 문 없이 표준화할 수 있다.

<syntaxhighlight lang="pascal">
 while a <> b do writeln('Waiting');

 if a > b then
   writeln('Condition met')
 else
   writeln('Condition false');

 for i := 1 to 10 do writeln('Iteration: ', i:1);

 repeat a := a + 1 until a = 10;
</syntaxhighlight>

=== 절차 및 함수 ===
파스칼 구조는 절차와 함수로 짜여진다.

<syntaxhighlight lang="pascal">
 program mine(output);
   var i : integer;

   procedure print(var j: integer);

     function next(k: integer): integer;
     begin
       next := k + 1
     end;

   begin
     writeln('The total is: ', j);
     j := next(j)
   end;

 begin
   i := 1;
   while i <= 10 do print(i)
 end.
</syntaxhighlight>

절차와 함수는 어느 깊이로든 놓일 수 있으며, 프로그램 구조는 논리 외부 블록이다.

== 같이 보기 ==
{{위키공용분류}}
{{위키책|프로그래밍/파스칼}}
* [[알골 (프로그래밍 언어)|알골]]
* [[에이다 (프로그래밍 언어)|에이다]]
* [[오브젝트 파스칼]]
* [[델파이]]
* [[IP 파스칼]]
* [[C (프로그래밍 언어)|C]]

== 외부 링크 ==
* {{언어링크|en}} [http://www.allegro.com/papers/htpp.html 코드 짜는 법:파스칼]
* {{언어링크|en}} [http://www.taoyue.com/tutorials/pascal/ 파스칼 배우기 강좌]

{{주요 프로그래밍 언어}}
{{ISO 표준}}
{{전거 통제}}

[[분류:파스칼 (프로그래밍 언어)| ]]
[[분류:1970년 개발된 프로그래밍 언어]]
[[분류:교육용 프로그래밍 언어]]
[[분류:파스칼 프로그래밍 언어 계열]]
[[분류:ISO 표준 프로그래밍 언어]]
[[분류:고급 프로그래밍 언어]]