Вопрос для обсуждения: Почему языки визуального программирования никогда не снимались?

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

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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

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 или просто статической модификации кода.

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

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

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

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

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

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

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

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

Другие вопросы по тегам