Learning
레슨 5 / 8·20분

코드 생성과 실행

Blockly 코드 생성 원리

Blockly의 핵심 기능 중 하나는 블록을 실제 프로그래밍 언어 코드로 변환하는 것입니다. 각 블록에는 코드 생성기(generator)가 연결되어 있어, 워크스페이스의 블록 구조를 JavaScript, Python, Dart 등의 코드로 변환합니다.

JavaScript 코드 생성

javascript
// Blockly 워크스페이스에서 JavaScript 코드 생성
// javascript 생성기 import
// import {javascriptGenerator} from "blockly/javascript";

// 워크스페이스의 모든 블록을 JavaScript로 변환
// var code = javascriptGenerator.workspaceToCode(workspace);

// 예시: 아래 블록 구성이 생성하는 코드
// [변수 설정: count = 0]
// [반복 10번]
//   [변수 변경: count + 1]
//   [출력: count]

// 생성된 JavaScript 코드:
var count = 0;
for (var loop_count = 0; loop_count < 10; loop_count++) {
  count = count + 1;
  window.alert(count);
}

Python 코드 생성

javascript
// Python 생성기 사용 예시
// import {pythonGenerator} from "blockly/python";
// var pythonCode = pythonGenerator.workspaceToCode(workspace);

// 같은 블록에서 생성된 Python 코드:
// count = 0
// for loop_count in range(10):
//   count = count + 1
//   print(count)

코드 실행 방법

javascript
// 방법 1: eval()로 직접 실행 (간단하지만 보안 주의)
// var code = javascriptGenerator.workspaceToCode(workspace);
// eval(code);

// 방법 2: Function 생성자 사용 (더 안전)
// var code = javascriptGenerator.workspaceToCode(workspace);
// var runCode = new Function(code);
// runCode();

// 방법 3: JS-Interpreter 사용 (가장 안전, 샌드박스)
// 무한 루프 방지, 실행 제어 가능
// var interpreter = new Interpreter(code);
// interpreter.run();

// 실제 활용 예시
function executeBlocklyCode(workspace) {
  // 생성기에서 코드 가져오기
  // var code = javascriptGenerator.workspaceToCode(workspace);
  var code = "window.alert(" + String.fromCharCode(39) + "Hello from Blockly!" + String.fromCharCode(39) + ");";

  try {
    // Function으로 감싸서 실행
    var runner = new Function(code);
    runner();
  } catch (error) {
    window.alert("오류 발생: " + error.message);
  }
}

코드 하이라이팅과 디버깅

javascript
// 블록 실행 시 해당 블록을 하이라이트
// workspace에서 블록 ID로 하이라이트
function highlightBlock(blockId) {
  // workspace.highlightBlock(blockId);
  window.alert("실행 중인 블록: " + blockId);
}

// 단계별 실행 (Step-by-step)
var stepDelay = 500; // 0.5초 간격

function runStep(steps, index) {
  if (index < steps.length) {
    highlightBlock(steps[index].blockId);
    // 블록의 코드 실행
    steps[index].execute();

    // 다음 단계 예약
    setTimeout(function() {
      runStep(steps, index + 1);
    }, stepDelay);
  } else {
    window.alert("실행 완료!");
  }
}
  • javascriptGenerator — JavaScript 코드 생성기
  • pythonGenerator — Python 코드 생성기
  • workspaceToCode() — 워크스페이스 전체를 코드로 변환
  • blockToCode() — 특정 블록만 코드로 변환
  • JS-Interpreter — 안전한 코드 실행 샌드박스
  • highlightBlock() — 실행 중인 블록 시각적 표시
💡

사용자가 만든 블록 코드를 실행할 때는 반드시 샌드박스를 사용하세요. eval()은 보안 위험이 있으므로 JS-Interpreter 또는 iframe 샌드박스를 권장합니다. 무한 루프 방지를 위해 실행 시간 제한도 설정하세요.