Вопрос для обсуждения: почему языки визуального программирования никогда не снимались? - PullRequest
7 голосов
/ 16 марта 2010

Примечание: помечено как вики сообщества.

Есть ли хороший анализ того, почему языки визуального программирования еще не взлетели? Мы все еще кодируем эти дни «линейно» в текстовом окне 80x25; в то время как концепции, которые мы представляем (структуры данных, алгоритмы), представляются более интуитивно понятными визуально.

Ответы [ 6 ]

2 голосов
/ 16 марта 2010

На ум приходят два подхода к программированию, которые не являются простым текстом:

Я думаю, что структурированное редактирование довольно интересно, потому что оно берет соглашение «фигурные скобки с идентификацией», которое оказалось действительно полезным для поддержания организованного кода, до логического предела. Я думаю, что это действительно может быть что-то, если кто-то сделает блестящую (с точки зрения юзабилити) реализацию этого.

Подход LabView, с другой стороны, не сильно меня волнует. Визуальные идиомы не кажутся мощными и достаточно очевидными по сравнению с текстом. Хотя я почти не пользовался LabView, так что, вероятно, он лучше, чем я думаю.

1 голос
/ 16 марта 2010

Не забывайте о VS 2010 (.NET 4), который теперь поддерживает несколько мониторов, что означает, что теперь вы можете позволить редакторам, дизайнерам и окнам инструментов перемещаться за пределы окна верхнего уровня и располагаться в любом месте, где вам удобно. монитор в вашей системе.

0 голосов
/ 14 июля 2016

Языки визуального программирования никогда не развивались, потому что никто еще не сделал это правильно. Точно так же, как C ++ / visual studio были подходящей технологией для людей во время их появления.

Однако, эра общения с нашими компьютерами (голосовая служба Alex) и программирование с использованием более приятных инструментов, чем текстовые редакторы, настали.

Вот начало того, над чем я работаю. Я пытаюсь запустить мой проект, так как, если вы создаете крутой инструмент программирования , почему бы сам инструмент не был в конечном итоге написан на языке ввода инструмента. Сначала я начал с рендеринга своих собственных графиков с помощью PyQt5 / QGraphicsScene, но отладка 2D-сцены на самом деле чрезвычайно сложна - если только у вас нет визуального графика для программирования! Таким образом, рендеринг моего собственного графика и написание редактора графиков наступают после того, как я смогу запустить базовые графики. Мой любимый редактор графиков общего назначения - YEd. Он выводит .graphml, что хорошо, потому что библиотека networkx для python уже может читать в .graphml (единственная проблема - загрузка в цветах графика + другие свойства, кроме позиции; так что функция будет ждать, пока мы будем делать наши собственные рисунки графика).

Вот пример входного графика: enter image description here

Вот базовый код для его запуска:

import networkx as nx
from PyQt5.QtCore import QThread, QObject, pyqtSignal
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import re
import sys

EDAT = 2
NDAT = 1

class CodeGraphThread(QThread):
    ifRgx = r'^if\s+(.+)\s*$'
    elseRgx = r'\s+|^$'

def __init__(self, graph, parent=None):
    super(CodeGraphThread, self).__init__(parent)
    self._nodes = {}
    self.setGraph(graph)
    self._retVal = None
    self._locals = []

def setGraph(self, graph):
    self._graph = graph
    G = graph.G()
    nodes = [x for x in G.nodes(data=True) if x[NDAT]['label'] == 'start']
    if nodes:   self._setStart(nodes[0][0])

def _setStart(self, nstr):
    self._nodes['start'] = nstr

def start(self):
    self._running = True
    self._nodes['current'] = self._nodes['start']
    QThread.start(self)

def _exec(self, codeText):
    try:
        exec('self._retVal=' + codeText)
    except:
        try: 
            exec(codeText)
        except:
            self.codeGraph().errorMessage.emit('Coudln\'t execute code: "' + codeText + '"')

def returnVal(self):
    return self._retVal

def run(self):
    while self._running:
        cg = self.codeGraph()
        G = cg.G()
        current = self._nodes['current']
        #TODO transfer over to regex system
        data = [d for x,d in G.nodes(data=True) if x == current and 'label' in d and d['label'] not in ['start']]
        if data:  
            codeText = data[0]['label']
            self._exec(codeText)
        rgx = self.ifRgx
        edges = cg.edgesFr(current, rgx)
        if edges:
            e= edges[0]
            ifArg = cg.matches(rgx).group(1)
            self._exec(ifArg)
            if self.returnVal():
                self._nodes['current'] = e[1]
                continue
        rgx = self.elseRgx
        edges = cg.edgesFr(current, rgx)
        edges += cg.edgesFr(current, None)
        if edges:
            e = edges[0]
            self._nodes['current'] = e[1]
            continue
        break

def codeGraph(self):
    return self._graph


class CodeGraph(QObject):
    errorMessage = pyqtSignal(str)
    statusMessage = pyqtSignal(str)
    _rgxMemo = {}

def __init__(self, gmlpath=None):
    QObject.__init__(self)
    if gmlpath != None:
        self.loadGraphML(gmlpath)
    else:
        self._gmlpath = None
        self._G = nx.MultiDiGraph()
    self._thread = CodeGraphThread(self) 

def G(self):
    return self._G

def loadGraphML(self, gmlpath):
    self._gmlpath = gmlpath
    self._G = nx.read_graphml(gmlpath)

def saveGraphML(self, gmlpath):
    self._gmlpath = gmlpath
    nx.write_graphml(self._G, gmlpath)

def debugPrintNodes(self):
    print(self._G.nodes(data=True))

def debugPrintEdges(self):
    print(self._G.edges(data=True))

def matches(self, rgx):
    if rgx in self._rgxMemo:
        return self._rgxMemo[rgx][1]
    return None

def rgx(self, rgx):
    if rgx not in self._rgxMemo:
        self._rgxMemo[rgx] = [re.compile(rgx), None]
    return self._rgxMemo[rgx][0]

def rgxMatch(self, rgx, string):
    if rgx not in self._rgxMemo:
        rgx_ = self.rgx(rgx)
    else:
        rgx_ = self._rgxMemo[rgx][0]
    match = self._rgxMemo[rgx][1] = rgx_.match(string)
    return match       

def edgesFr(self, n0, rgx):     
    if rgx != None:  
        return [(u,v,d) for u,v,d in self.G().edges(data=True) if u == n0 and 'label' in d and self.rgxMatch(rgx, d['label'])]
    else:
        return [(u,v,d) for u,v,d in self.G().edges(data=True) if u == n0 and 'label' not in d]

if __name__ == '__main__':
cg = CodeGraph('unnamed0.graphml')
cgthread = CodeGraphThread(cg)
def printError(errorMsg):
    print(errorMsg)
cg.errorMessage.connect(printError)    
# Qt application reqd for QThread testing
app = QApplication(sys.argv)
win = QMainWindow()
win.setWindowTitle('PyGraphML Practice 0')
button0 = QPushButton('Start thread running')
button0.clicked.connect(cgthread.start)
win.setCentralWidget(button0)
win.show()
sys.exit(app.exec_())

Текущие проблемы: Python 3 плохо обрабатывает exec / locals () (следовательно, использует self.x вместо просто x), поэтому подумайте об использовании стороннего интерпретатора python или просто статической модификации кода.

Не говорю, что мой инструмент еще что-то делает правильно. Для того, чтобы все было сделано правильно, также должны быть инструменты автоматического рефакторинга, отладки и т. Д.

0 голосов
/ 01 марта 2012

Simulink является частью Matlab и прекрасно работает для инженерных задач

0 голосов
/ 16 марта 2010

Существует довольно много смешивания и сопоставления.

Например, люди используют графические редакторы, такие как NetBeans Matisse или VS.Net, потому что некоторые вещи легче рисовать, чем кодировать.Некоторые люди используют графические редакторы моделей данных: это намного проще, быстрее и (я бы сказал, что) дает лучший результат, чем написание DDL.Даже когда вы пишете код, у вас есть все виды графических инструментов, которые помогут вам понять, что вы делаете (например, представление иерархии затмений).

С другой стороны, мы все еще используем подобные текстовые редакторыте, которые люди использовали 30 лет назад для нашей работы.:) Очевидно, что есть ценность, которую нужно иметь от обоих.

0 голосов
/ 16 марта 2010

Текстовое окно 80x25? В самом деле? Не сравнить размеры, но мое текстовое окно немного больше, чем это. Но независимо от этого, я лично не могу представить себе язык визуального программирования, который бы меня удовлетворил. Для технической информации текст гораздо более насыщен информацией, чем видео. Я бы предпочел пролистать статью о технической теме, чем смотреть видео на эту тему в пять раз больше времени (если серьезно, ребята, снимите это уже с видео).

Аналогичным образом, я бы предпочел потратить несколько секунд, набрав несколько строк кода, а не несколько минут перетаскивая объекты, чтобы выполнить то же самое. Речь идет о краткости и выразительности. У языков визуального программирования просто нет этого, по моему опыту. Хорошо для обучения основам программирования? Конечно. Алиса довольно опрятна. Но не для повседневной работы.

В некоторой заметке Code Bubbles - интересный пример улучшения "текстового окна 80x25".

...