프로그래밍언어론

이름(Name)이란? 이름(Name) 이름은 단지 다른 객체를 대표(represent)하는(또는 의미(denote)하는) 일련의 문자일 뿐이다. 대부분의 프로그래밍 언어에서 이름은 식별자 형식을 갖는다. 예) 영숫자 토큰(v1, v2, func 등) 또는 기타 기호(_, $). 이름(Names) ≠ 개체(object) 이름과 그 이름으로 표시되는 대상은 동일한 것이 아니다. 하나의 이름은 여러 가지 다른 개체를 나타낼 수 있다. 또한 하나의 개체가 여러 가지 다른 이름을 가질 수 있다. 표시 가능한 객체(Denotable Objects) 표시 가능한 개체는 이름을 지정할 수 있는 개체이다. 사용자가 이름을 부여한 객체: 변수(variables), 매개변수(parameters), 함수(functions),..
구문을 파이썬으로 추상 구문 트리(Abstract Syntax Tree; AST)로 분석하고 EBNF로 구현해본다. 'a = 3 + b' 구문을 분석해보자. 파이썬에서는 ast 모듈을 사용하여 코드를 구문 분석할 수 있다. ast 모듈의 사용법은 다음과 같다. import ast t = ast.parse('a = 3 + b') s = ast.dump(t, annotate_fields=False, indent=4) print(s) 코드 결과 Module([ Assign([ Name('a', Store())], BinOp( Constant(3), Add(), Name('b', Load()) ) ) ],[]) 결과 각 노드에 대해 노드 유형(Module, Assign, Name)으로 시작하고 해당 하위 노드를..
변환 방법 BNF EBNF ::= A | AB ::= A [B] ::= '-' | ::= ['-'] ::= {X} A | A ::= A {A} ::= {X} A | ε ::= {A} ::= '+' | '-' ::= ('+' | '-') ::= '+' | '-' | ::= [('+' | '-')] EBNF로 변환할 때 주의점 대부분의 |는 제거된다. 중복되는 요소가 하는 일이 오직 조건을 구체화하는 것이라면, 그것들은 제거된다. 대부분의 재귀적 요소는 제거되고 { } 루프로 대체된다. null을 뜻하는 입실론(ε)이 없어진다. 변환 예시 BNF 표현 ::= int ; ::= | , EBNF 표현 ::= int { , } ; 참고 https://en.wikipedia.org/wiki/Syntax_diagra..
우리가 어떻게 프로그램언어(PL)에 대한 옳고 그름을 판단할 수 있을까? 또한 코드가 올바르게 작성되었는지 판단할 수 있는 기준은 뭘까? 우리는 주어진 코드에 구문 오류가 있는지 확인하면 된다. 형식 언어(Formal Language) 프로그래밍 언어의 일반적인 특성을 추상화 일련의 기호, 일부 형성 규칙(기호를 결합)으로 구성 언어 문법 E → E + E | E * E | N, N → 0N | 1N | λ 배커스-나우르 표기법(BNF) 원래는 John Backus가 개발한 Backus Normal Form Peter Naur가 확장하여 사용한 후 Donald Knuth의 제안으로 Backus-Naur Form(BNF)으로 이름 변경 문맥 자유 문법(context-free grammars)을 위한 표기법..
언어의 구문을 정의하는 방법에 들어가기에 앞서 구문, 의미론, 화용론의 정의를 반드시 알아야한다. 구문(Syntax), 의미론(Semantics), 화용론(Pragmatics) 구문(Syntax) : 프로그램의 형태 의미론(Semantics) : 프로그램의 의미 화용론(Pragmatics) : 특정 상황에서 프로그램의 의미 다음 예시를 보자 A mouse is kicking a cat. 해당 문장은 문법적으로 전혀 문제가 없다. 정상적인 구문이라고 할 수 있다. mouse a cat is a kicking. 그러나 이 문장은 문법으로 옳지 않다. 올바르지 않은 구문이다. 이렇듯 구문(Syntax)은 프로그램의 형태가 올바른 문법으로 작성되어 타당성의 여부가 판단된다. A mouse is kicking a..
컴파일러와 인터프리터는 모두 사람이 작성한 코드를 기계가 실행할 수 있는 하위 수준 코드로 변환한다. 컴파일러 vs 인터프리터 컴파일러 인터프리터 완전한 코드 → 실행 가능한 프로그램 생성된 실행 프로그램의 실행 성능과 효율성에 중점 코드와 실행을 연결하는 것이 상대적으로 어렵다. 컴파일 시간에 오류를 찾는다. C++ 표현식 읽고 평가 → 명령 실행 구현하기는 쉽지만 속도가 느리다. 런타임 오류 → 코드에 직접 연결 부분 코드를 실행 가능(일부 표현식) Python 컴파일러 고급 언어 코드 → 컴퓨터에서 실행 가능한 기계 명령어 인간과 기계 사이의 번역기 object file : 컴파일러는 객체(대상) 언어로 코드를 생성 그런 다음 이러한 개체 파일은 하나의 실행 가능한 프로그램으로 결합 컴파일 단계 어..
새로운 PL을 설계하려면 먼저 새로운 프로그래밍 언어의 목적을 알아야한다. 예) 수치계산, 웹 프로그래밍, 시스템 프로그래밍 등 그리고 새로운 프로그래밍 언어의 목적에 유용한 공통 개념을 구현하고 목적을 달성하기 위해 이러한 개념으로 인해 발생하는 단점을 최소화시킨다. 예) Null Safety 언어 설계 기준 좋은 프로그래밍 언어 디자인은 다양한 기준을 고려한다. 이러한 기준은 언어의 다양한 특성에 영향을 받는다. Readability(가독성) : 언어를 읽고 이해하는 것이 얼마나 쉬운가? Writability(작성가능성) : 우리가 원하는 프로그램을 작성하는 데 언어가 얼마나 쉬운가? 예) 어셈블리 언어 vs. C/C++ vs. Python. Reliability(신뢰성) : 언어가 항상 예상대로 작..
튜링 머신 1936년 앨런 튜링(Alan Turing)이 고안하였다. 원래는 자동 기계를 의미하는 "a-machine" 이라 불렀다. 계산 전반의 특성을 증명하기 위해 발명된 이론적이고 상상적인 기계 현대 컴퓨터의 기초 테이프(Tape) : 일정한 크기의 셀(Cell)로 나뉘어 있는 종이 테이프. 각 셀에는 기호가 기록, 길이는 무한 헤드(Head) : 종이 테이프의 특정 한 셀을 읽을 수 있는 헤드 행동표 : 특정 상태에서 특정 기호를 읽었을 때 해야 할 행동을 지시 기호 삭제나 수정, 헤드를 오른쪽/왼쪽 한 칸 이동, 상태를 변경 테이프에 기록될 수 있는 기호 및 튜링 머신의 상태와 행동표의 개수는 모두 유한해야 하며 서로 구분된다. '현재 상태가 1인데 기호 'A'를 읽었다면 'B'를 기록하고 정지..
프로그래밍 언어는 결국 컴퓨터에서 실행된다. 따라서 프로그래밍 언어를 설계하거나 이를 사용하여 프로그램을 개발하려면 컴퓨터가 어떻게 작동하는지 이해가 필요하다. 우리는 무엇을 고려해야 할까? = 컴퓨터에서 PL을 실행할 때 무엇을 고려하는가? 따라서 우리는 컴퓨터가 PL에 제공하는 것이 무엇인지 알아야 한다. PL이 제공받는 것은 다음과 같다. 데이터 유형(Data types) 연산자(Operators) 실행 통제(Control of Execution) 데이터 통제(Control of Data) 메모리 관리(Memory Management) 입력과 출력(Input and Output) 데이터 유형(Data types) 컴퓨터가 계산을 수행할 때 데이터에 대한 계산이 수행되는 경우가 많다. 다양한 데이터 ..
여러 언어를 작성하기 위해 컴파일러와 인터프리터를 설치해야한다. 따라서 자신만의 소프트웨어 개발환경을 구축해야한다. 본 강좌에서는 VSCode를 중심으로 실습을 진행한다. 그러나 다른 툴을 사용해도 무관하다. 통합개발환경(IDE) 다양한 소프트웨어 개발 작업을 지원하는 프로그램이다. 예: VSCode, Eclipse, IntelliJ, PyCharm 등 IDE의 주요기능은 다음과 같다. 구문 강조(Syntax Highlight) • 다양한 구문 위치에 있는 단어를 강조 표시 • 코드의 가독성 크게 향상되어 생산성 향상 • 코드 편집기에서 사전 컴파일 시간에 구문 오류를 확인 자동 완성(Auto Completion) • 몇 글자만 입력하면 자동으로 코드를 추천하거나 완성 • IDE의 가장 뛰어난 기능 중 ..
파스텔코랄
'프로그래밍언어론' 카테고리의 글 목록 (3 Page)