레슨 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 샌드박스를 권장합니다. 무한 루프 방지를 위해 실행 시간 제한도 설정하세요.