언어를 배우고 있다면 아마도 "구문"이라는 단어를 들어본 적이 있을 것이고, 이를 항상 다루었을 것입니다. (빌어먹을 구문 오류).
나는 프로그래밍 패러다임과 기술을 진지하게 따르지 않았으며 오늘은 (이미 기억하더라도) 항상 듣는 가장 작은 주제부터 배우기 시작했다고 혼자 생각했던 며칠 밤이었습니다. 이 저장소를 만들었습니다. 제가 택한 학습 경로는 특징적입니다(LEARNING_LIST.md 파일에 있음). 우리의 생각과 감정을 전달하는 자연어와 달리, 프로그래밍 언어는 처음에는 컴퓨터와 의사소통할 목적으로 남성과 여성이 정의한 인공 언어로 볼 수 있지만, 중요한 것은 사람들 사이의 알고리즘 의사소통을 위해 정의된 언어입니다. .
예를 들어, 언어 정의는 다음 세 가지 구성 요소로 구성됩니다.
구문: 프로그래밍 언어의 구문은 해당 언어에서 올바르게 구조화된 프로그램으로 간주되는 기호 조합을 정의하는 규칙 집합입니다. 언어의 구문은 언어의 표면 형태를 정의합니다. 텍스트 기반 프로그래밍 언어는 문자 시퀀스를 기반으로 합니다. 텍스트 언어의 어휘 문법은 문자를 토큰으로 묶는 방법을 지정합니다. 구문은 언어에서 올바른 형식의 문장(또는 프로그램)을 만들기 위해 기호를 결합할 수 있는 방법을 나타냅니다. 구문은 언어 구성 요소 간의 형식적 관계를 정의하여 언어의 법적 문자열을 구성하는 다양한 표현에 대한 구조적 설명을 제공합니다. 구문은 의미를 전혀 고려하지 않고 언어에서 기호의 형식과 구조만을 다루고, 구문은 문장이 언어의 문법에 유효한지 여부에만 관련되는 개념입니다.
의미: 의미는 문장이 유효한 의미를 가지고 있는지 여부에 관한 것입니다. 의미론은 언어에서 구문적으로 유효한 문자열의 의미를 드러냅니다. 자연어의 경우 이는 문장과 구를 우리 경험의 대상, 생각 및 감정과 연관시키는 것을 의미합니다. 프로그래밍 언어의 경우 의미론은 해당 언어로 프로그램을 실행할 때 컴퓨터가 따르는 동작을 설명합니다. 우리는 프로그램의 입력과 출력 사이의 관계를 설명하거나 프로그램이 실제 또는 추상 기계에서 어떻게 실행되는지에 대한 단계별 설명을 통해 이러한 동작을 공개할 수 있습니다. 의미론은 의미 연구에 대한 일반적인 용어입니다. 컴퓨터 과학에서 프로그래밍 언어 의미론이라는 주제는 프로그램에 정확한 수학적 의미를 부여하는 것을 추구합니다.
자연어에서 문장은 문법적으로는 정확하지만 의미적으로는 의미가 없을 수 있습니다. 예를 들어 다음 문장은 다음과 같습니다.
"그 남자는 인피니티를 가게에서 샀어요."
이것은 문법적으로는 정확하지만 실제 세계에서는 의미가 없습니다. 마찬가지로, 프로그래밍 언어에서 명령문은 언어의 규칙이나 의도된 의미를 위반하기 때문에 구문론적으로는 정확하지만 의미론적으로는 올바르지 않을 수 있습니다.
프로그래밍의 낮은 수준 의미론에서 우리는 올바른 구문을 가진 명령문이 언어의 유형 시스템이나 다른 규칙에 따라 의미가 있는지 여부에 관심이 있습니다. 구문이 유효하더라도 작업의 의미론적 의미가 유효하지 않을 수 있습니다. Java와 같은 정적 유형 언어의 유형 시스템은 런타임 전에 이러한 규칙을 적용하는 데 도움이 되지만 JavaScript와 같은 동적 유형 언어는 런타임까지 이러한 규칙을 항상 적용하지는 않습니다.
느슨하게 형식화된 JavaScript에서는 더 엄격한 형식 시스템과 함께 제공되는 보호 기능이 없을 수 있으며 언어는 의미상 의미 있는 방식으로 이해되지 않는 특정 작업을 허용합니다. 다음 JavaScript 코드를 고려하십시오.
let name = "Alice"; name = 42; // No error, but semantically this doesn't make sense.
여기서 구문은 완벽하게 유효하며 JavaScript는 할당을 허용하지만 의미상 이상합니다. 문자열(이름)을 보유할 것으로 추정되는 변수에 숫자(42)를 할당하려고 합니다. JavaScript에는 이러한 실수를 방지하는 유형 검사가 없지만 개발자의 의도와 일치하지 않기 때문에 낮은 수준의 의미 오류입니다.
우리가 그것을 구현한다면. 실행됩니다. 오류 없이!
TypeScript나 Java와 같은 더 엄격한 언어에서는 컴파일 중에 즉시 유형 오류가 발생합니다.
JavaScript의 상위 집합인 TypeScript는 이러한 낮은 수준의 의미 문제를 방지하기 위해 유형 검사를 도입합니다.
let name: string = "Alice"; name = 42; // Error: Type 'number' is not assignable to type 'string'.
TypeScript에서 42는 숫자이고 문자열로 선언된 변수에 할당될 수 없기 때문에 컴파일러는 의미 오류를 감지합니다. 이러한 유형 적용은 의도하지 않은 실수로부터 개발자를 보호합니다.
JavaScript에서는 이러한 낮은 수준의 의미 문제를 피하기 위해 개발자가 런타임 검사를 사용하는 경우가 많습니다.
let name = "Alice"; if (typeof name !== "string") { throw new Error("Expected a string!"); }
자바스크립트가 유형을 강제하지 않더라도 수동 검사를 추가하면 잘못된 유형으로 인해 프로그램에 문제가 발생하는 오류를 방지하는 데 도움이 될 수 있습니다.
더 높은 수준에서 의미론은 프로그램이 달성해야 하는 것과 관련이 있습니다. 이는 프로그램에 유효한 구문이 있는지 또는 유형이 올바르게 정렬되어 있는지 여부만이 아니라 프로그램이 개발자가 의도한 대로 작동하는지 또는 해결하도록 설계된 문제를 해결하는지 여부에 관한 것입니다.
예를 들어 간단한 주식 거래 시스템을 구축한다고 가정해 보겠습니다. 코드의 상위 수준 의미는 시스템이 올바른 비즈니스 로직을 사용하여 올바른 방식으로 주식을 거래하는지 확인하는 것입니다. 코드에서 유형 오류나 구문 오류가 발생하지 않더라도 의도한 기능을 충족하지 못할 수 있습니다.
간단한 주식 거래 시나리오를 사용하여 상위 수준 의미 체계의 JavaScript 예를 살펴보겠습니다.
let openTrade = { symbol: "EURUSD", direction: "buy", profit: 100 }; function closeTrade(trade) { if (trade.profit >= 50) { console.log(`Closing trade for ${trade.symbol} with profit of ${trade.profit}`); } else { console.log(`Trade for ${trade.symbol} is not ready to close.`); } } // Check if a trade is open for EURUSD and close it if the profit target is reached. closeTrade(openTrade);
구문이 정확하며 프로그램이 오류 없이 실행됩니다. 그러나 시스템의 비즈니스 규칙을 위반하는 동일한 기호에 대해 실수로 두 번의 거래를 입력하는 등 더 높은 수준의 실수가 발생한다고 상상해 보십시오.
let openTrades = [ { symbol: "EURUSD", direction: "buy", profit: 100 }, { symbol: "EURUSD", direction: "sell", profit: 20 } ]; // Check all trades and close any that hit their profit target. openTrades.forEach(trade => closeTrade(trade));
여기에서 두 거래는 모두 독립적으로 처리되지만 시스템은 동일한 기호에 대해 매수 방향과 매도 방향으로 각각 두 개의 거래로 끝납니다. 이는 주어진 시간에 기호당 하나의 공개 거래만 이루어져야 한다는 높은 수준의 비즈니스 규칙을 위반하는 것입니다.
코드가 구문이나 유형 오류 없이 실행되지만 상위 수준에서는 의미상 올바르지 않습니다. 시스템 로직은 한 번에 기호당 하나의 거래만 활성화될 수 있도록 보장해야 합니다. 이 오류는 실제 거래 시스템에서 재정적 손실과 같은 의도하지 않은 결과를 초래할 수 있습니다.
이 높은 수준의 의미 문제를 해결하려면 특정 기호에 대해 하나의 거래만 열리도록 논리를 조정해야 합니다.
let openTrades = [ { symbol: "EURUSD", direction: "buy", profit: 100 } ]; function openNewTrade(newTrade) { // Ensure no other trades are open for the same symbol. const existingTrade = openTrades.find(trade => trade.symbol === newTrade.symbol); if (!existingTrade) { openTrades.push(newTrade); console.log(`Opened new trade for ${newTrade.symbol}`); } else { console.log(`Cannot open a new trade for ${newTrade.symbol}, trade already exists.`); } } openNewTrade({ symbol: "EURUSD", direction: "sell", profit: 0 });
여기서 논리는 동일한 기호에 대해 이미 활성 거래가 있는 경우 새 거래를 열 수 없도록 보장합니다. 이는 구문이나 유형 문제가 아니라 프로그램이 따라야 하는 핵심 비즈니스 논리를 다루기 때문에 고수준 의미 체계 수정입니다.
이것은 각각에 대한 기본 정보일 뿐입니다. 자세한 내용은 다음 항목을 참조하세요.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3